// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: Apache-2.0

package arvados

import (
	"encoding/json"
	"time"

	check "gopkg.in/check.v1"
)

var _ = check.Suite(&filterEncodingSuite{})

type filterEncodingSuite struct{}

func (s *filterEncodingSuite) TestMarshalNanoseconds(c *check.C) {
	t0 := time.Now()
	t0str := t0.Format(time.RFC3339Nano)
	buf, err := json.Marshal([]Filter{
		{Attr: "modified_at", Operator: "=", Operand: t0}})
	c.Assert(err, check.IsNil)
	c.Check(string(buf), check.Equals, `[["modified_at","=","`+t0str+`"]]`)
}

func (s *filterEncodingSuite) TestMarshalNil(c *check.C) {
	buf, err := json.Marshal([]Filter{
		{Attr: "modified_at", Operator: "=", Operand: nil}})
	c.Assert(err, check.IsNil)
	c.Check(string(buf), check.Equals, `[["modified_at","=",null]]`)
}

func (s *filterEncodingSuite) TestUnmarshalNil(c *check.C) {
	buf := []byte(`["modified_at","=",null]`)
	var f Filter
	err := f.UnmarshalJSON(buf)
	c.Assert(err, check.IsNil)
	c.Check(f, check.DeepEquals, Filter{Attr: "modified_at", Operator: "=", Operand: nil})
}

func (s *filterEncodingSuite) TestMarshalBoolean(c *check.C) {
	buf, err := json.Marshal([]Filter{
		{Attr: "is_active", Operator: "=", Operand: true}})
	c.Assert(err, check.IsNil)
	c.Check(string(buf), check.Equals, `[["is_active","=",true]]`)
}

func (s *filterEncodingSuite) TestUnmarshalBoolean(c *check.C) {
	buf := []byte(`["is_active","=",true]`)
	var f Filter
	err := f.UnmarshalJSON(buf)
	c.Assert(err, check.IsNil)
	c.Check(f, check.DeepEquals, Filter{Attr: "is_active", Operator: "=", Operand: true})
}

func (s *filterEncodingSuite) TestUnmarshalBooleanExpression(c *check.C) {
	buf := []byte(`"(foo < bar)"`)
	var f Filter
	err := f.UnmarshalJSON(buf)
	c.Assert(err, check.IsNil)
	c.Check(f, check.DeepEquals, Filter{Attr: "(foo < bar)", Operator: "=", Operand: true})
}