| // Copyright 2015 Google LLC | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //      http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | package bigquery | 
 |  | 
 | import ( | 
 | 	"encoding/json" | 
 | 	"reflect" | 
 | 	"testing" | 
 |  | 
 | 	"cloud.google.com/go/civil" | 
 | 	"cloud.google.com/go/internal/testutil" | 
 | ) | 
 |  | 
 | var ( | 
 | 	nullsTestTime     = civil.Time{Hour: 7, Minute: 50, Second: 22, Nanosecond: 1000} | 
 | 	nullsTestDateTime = civil.DateTime{Date: civil.Date{Year: 2016, Month: 11, Day: 5}, Time: nullsTestTime} | 
 | ) | 
 |  | 
 | func TestNullsJSON(t *testing.T) { | 
 | 	for _, test := range []struct { | 
 | 		in   interface{} | 
 | 		want string | 
 | 	}{ | 
 | 		{&NullInt64{Valid: true, Int64: 3}, `3`}, | 
 | 		{&NullFloat64{Valid: true, Float64: 3.14}, `3.14`}, | 
 | 		{&NullBool{Valid: true, Bool: true}, `true`}, | 
 | 		{&NullString{Valid: true, StringVal: "foo"}, `"foo"`}, | 
 | 		{&NullTimestamp{Valid: true, Timestamp: testTimestamp}, `"2016-11-05T07:50:22.000000008Z"`}, | 
 | 		{&NullDate{Valid: true, Date: testDate}, `"2016-11-05"`}, | 
 | 		{&NullTime{Valid: true, Time: nullsTestTime}, `"07:50:22.000001"`}, | 
 | 		{&NullDateTime{Valid: true, DateTime: nullsTestDateTime}, `"2016-11-05 07:50:22.000001"`}, | 
 |  | 
 | 		{&NullInt64{}, `null`}, | 
 | 		{&NullFloat64{}, `null`}, | 
 | 		{&NullBool{}, `null`}, | 
 | 		{&NullString{}, `null`}, | 
 | 		{&NullTimestamp{}, `null`}, | 
 | 		{&NullDate{}, `null`}, | 
 | 		{&NullTime{}, `null`}, | 
 | 		{&NullDateTime{}, `null`}, | 
 | 	} { | 
 | 		bytes, err := json.Marshal(test.in) | 
 | 		if err != nil { | 
 | 			t.Fatal(err) | 
 | 		} | 
 | 		if got, want := string(bytes), test.want; got != want { | 
 | 			t.Errorf("%#v: got %s, want %s", test.in, got, want) | 
 | 		} | 
 |  | 
 | 		typ := reflect.Indirect(reflect.ValueOf(test.in)).Type() | 
 | 		value := reflect.New(typ).Interface() | 
 | 		err = json.Unmarshal(bytes, value) | 
 | 		if err != nil { | 
 | 			t.Fatal(err) | 
 | 		} | 
 |  | 
 | 		if !testutil.Equal(value, test.in) { | 
 | 			t.Errorf("%#v: got %#v, want %#v", test.in, value, test.in) | 
 | 		} | 
 | 	} | 
 | } |