| package misc_tests |
| |
| import ( |
| "bytes" |
| "testing" |
| |
| "github.com/json-iterator/go" |
| "github.com/stretchr/testify/require" |
| "strings" |
| "time" |
| ) |
| |
| func Test_empty_object(t *testing.T) { |
| should := require.New(t) |
| iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{}`) |
| field := iter.ReadObject() |
| should.Equal("", field) |
| iter = jsoniter.ParseString(jsoniter.ConfigDefault, `{}`) |
| iter.ReadObjectCB(func(iter *jsoniter.Iterator, field string) bool { |
| should.FailNow("should not call") |
| return true |
| }) |
| } |
| |
| func Test_one_field(t *testing.T) { |
| should := require.New(t) |
| iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{"a": "stream"}`) |
| field := iter.ReadObject() |
| should.Equal("a", field) |
| value := iter.ReadString() |
| should.Equal("stream", value) |
| field = iter.ReadObject() |
| should.Equal("", field) |
| iter = jsoniter.ParseString(jsoniter.ConfigDefault, `{"a": "stream"}`) |
| should.True(iter.ReadObjectCB(func(iter *jsoniter.Iterator, field string) bool { |
| should.Equal("a", field) |
| iter.Skip() |
| return true |
| })) |
| |
| } |
| |
| func Test_two_field(t *testing.T) { |
| should := require.New(t) |
| iter := jsoniter.ParseString(jsoniter.ConfigDefault, `{ "a": "stream" , "c": "d" }`) |
| field := iter.ReadObject() |
| should.Equal("a", field) |
| value := iter.ReadString() |
| should.Equal("stream", value) |
| field = iter.ReadObject() |
| should.Equal("c", field) |
| value = iter.ReadString() |
| should.Equal("d", value) |
| field = iter.ReadObject() |
| should.Equal("", field) |
| iter = jsoniter.ParseString(jsoniter.ConfigDefault, `{"field1": "1", "field2": 2}`) |
| for field := iter.ReadObject(); field != ""; field = iter.ReadObject() { |
| switch field { |
| case "field1": |
| iter.ReadString() |
| case "field2": |
| iter.ReadInt64() |
| default: |
| iter.ReportError("bind object", "unexpected field") |
| } |
| } |
| } |
| |
| func Test_write_object(t *testing.T) { |
| should := require.New(t) |
| buf := &bytes.Buffer{} |
| stream := jsoniter.NewStream(jsoniter.Config{IndentionStep: 2}.Froze(), buf, 4096) |
| stream.WriteObjectStart() |
| stream.WriteObjectField("hello") |
| stream.WriteInt(1) |
| stream.WriteMore() |
| stream.WriteObjectField("world") |
| stream.WriteInt(2) |
| stream.WriteObjectEnd() |
| stream.Flush() |
| should.Nil(stream.Error) |
| should.Equal("{\n \"hello\": 1,\n \"world\": 2\n}", buf.String()) |
| } |
| |
| func Test_reader_and_load_more(t *testing.T) { |
| should := require.New(t) |
| type TestObject struct { |
| CreatedAt time.Time |
| } |
| reader := strings.NewReader(` |
| { |
| "agency": null, |
| "candidateId": 0, |
| "candidate": "Blah Blah", |
| "bookingId": 0, |
| "shiftId": 1, |
| "shiftTypeId": 0, |
| "shift": "Standard", |
| "bonus": 0, |
| "bonusNI": 0, |
| "days": [], |
| "totalHours": 27, |
| "expenses": [], |
| "weekEndingDateSystem": "2016-10-09", |
| "weekEndingDateClient": "2016-10-09", |
| "submittedAt": null, |
| "submittedById": null, |
| "approvedAt": "2016-10-10T18:38:04Z", |
| "approvedById": 0, |
| "authorisedAt": "2016-10-10T18:38:04Z", |
| "authorisedById": 0, |
| "invoicedAt": "2016-10-10T20:00:00Z", |
| "revokedAt": null, |
| "revokedById": null, |
| "revokeReason": null, |
| "rejectedAt": null, |
| "rejectedById": null, |
| "rejectReasonCode": null, |
| "rejectReason": null, |
| "createdAt": "2016-10-03T00:00:00Z", |
| "updatedAt": "2016-11-09T10:26:13Z", |
| "updatedById": null, |
| "overrides": [], |
| "bookingApproverId": null, |
| "bookingApprover": null, |
| "status": "approved" |
| } |
| `) |
| decoder := jsoniter.ConfigCompatibleWithStandardLibrary.NewDecoder(reader) |
| obj := TestObject{} |
| should.Nil(decoder.Decode(&obj)) |
| } |
| |
| func Test_unmarshal_into_existing_value(t *testing.T) { |
| should := require.New(t) |
| type TestObject struct { |
| Field1 int |
| Field2 interface{} |
| } |
| var obj TestObject |
| m := map[string]interface{}{} |
| obj.Field2 = &m |
| cfg := jsoniter.Config{UseNumber: true}.Froze() |
| err := cfg.Unmarshal([]byte(`{"Field1":1,"Field2":{"k":"v"}}`), &obj) |
| should.NoError(err) |
| should.Equal(map[string]interface{}{ |
| "k": "v", |
| }, m) |
| } |