...

Source file src/github.com/launchdarkly/go-sdk-common/v3/ldvalue/value_json_easyjson_conversion_test.go

Documentation: github.com/launchdarkly/go-sdk-common/v3/ldvalue

     1  //go:build launchdarkly_easyjson
     2  
     3  package ldvalue
     4  
     5  import (
     6  	"encoding/json"
     7  	"fmt"
     8  	"testing"
     9  
    10  	"github.com/mailru/easyjson"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  func TestValueEasyJsonMarshalUnmarshal(t *testing.T) {
    15  	items := []struct {
    16  		value Value
    17  		json  string
    18  	}{
    19  		{Null(), nullAsJSON},
    20  		{Bool(true), "true"},
    21  		{Bool(false), "false"},
    22  		{Int(1), "1"},
    23  		{Float64(1), "1"},
    24  		{Float64(2.5), "2.5"},
    25  		{String("x"), `"x"`},
    26  		{ArrayOf(), `[]`},
    27  		{ArrayBuild().Add(Bool(true)).Add(String("x")).Build(), `[true,"x"]`},
    28  		{ObjectBuild().Build(), `{}`},
    29  		{ObjectBuild().Set("a", Bool(true)).Build(), `{"a":true}`},
    30  	}
    31  	for _, item := range items {
    32  		t.Run(fmt.Sprintf("type %s, json %v", item.value.Type(), item.json), func(t *testing.T) {
    33  			j, err := easyjson.Marshal(item.value)
    34  			assert.NoError(t, err)
    35  			assert.Equal(t, item.json, string(j))
    36  
    37  			assert.Equal(t, item.json, item.value.String())
    38  			assert.Equal(t, item.json, item.value.JSONString())
    39  			assert.Equal(t, json.RawMessage(item.json), item.value.AsRaw())
    40  
    41  			var v Value
    42  			err = easyjson.Unmarshal([]byte(item.json), &v)
    43  			assert.NoError(t, err)
    44  			assert.Equal(t, item.value, v)
    45  		})
    46  	}
    47  }
    48  
    49  func TestEasyJsonUnmarshalErrorConditions(t *testing.T) {
    50  	var v Value
    51  	for _, data := range [][]byte{
    52  		nil,
    53  		{},
    54  		[]byte("what"),
    55  		[]byte("["),
    56  		[]byte("[what"),
    57  		[]byte("{"),
    58  		[]byte("{what"),
    59  		[]byte(`{"no":what`),
    60  	} {
    61  		t.Run(string(data), func(t *testing.T) {
    62  			assert.Error(t, easyjson.Unmarshal(data, &v))
    63  		})
    64  	}
    65  }
    66  
    67  func TestEasyJsonMarshalRaw(t *testing.T) {
    68  	// This is separate from the MarshalUnmarshal test because you never get a Raw when you unmarshal.
    69  	for _, params := range []struct {
    70  		desc   string
    71  		input  json.RawMessage
    72  		output string
    73  	}{
    74  		{"valid JSON", json.RawMessage(`{"a":1}`), `{"a":1}`},
    75  		{"zero-length", json.RawMessage{}, `null`},
    76  		{"nil", json.RawMessage(nil), `null`},
    77  	} {
    78  		t.Run(params.desc, func(t *testing.T) {
    79  			value := Raw(params.input)
    80  
    81  			j, err := easyjson.Marshal(value)
    82  			assert.NoError(t, err)
    83  			assert.Equal(t, params.output, string(j))
    84  		})
    85  	}
    86  }
    87  
    88  func TestValueArrayEasyJsonMarshalUnmarshal(t *testing.T) {
    89  	items := []struct {
    90  		valueArray ValueArray
    91  		json       string
    92  	}{
    93  		{ValueArray{}, nullAsJSON},
    94  		{ValueArrayOf(), `[]`},
    95  		{ValueArrayOf(String("a"), String("b")), `["a", "b"]`},
    96  	}
    97  	for _, item := range items {
    98  		t.Run(fmt.Sprintf("json %v", item.json), func(t *testing.T) {
    99  			j, err := easyjson.Marshal(item.valueArray)
   100  			assert.NoError(t, err)
   101  			assert.JSONEq(t, item.json, string(j))
   102  
   103  			assert.JSONEq(t, item.json, item.valueArray.String())
   104  			assert.JSONEq(t, item.json, item.valueArray.JSONString())
   105  
   106  			var a ValueArray
   107  			err = easyjson.Unmarshal([]byte(item.json), &a)
   108  			assert.NoError(t, err)
   109  			assert.Equal(t, item.valueArray, a)
   110  		})
   111  	}
   112  }
   113  
   114  func TestValueMapEasyJsonMarshalUnmarshal(t *testing.T) {
   115  	items := []struct {
   116  		valueMap ValueMap
   117  		json     string
   118  	}{
   119  		{ValueMap{}, nullAsJSON},
   120  		{ValueMapBuild().Build(), `{}`},
   121  		{ValueMapBuild().Set("a", Int(1)).Set("b", Int(2)).Build(), `{"a": 1, "b": 2}`},
   122  	}
   123  	for _, item := range items {
   124  		t.Run(fmt.Sprintf("json %v", item.json), func(t *testing.T) {
   125  			j, err := easyjson.Marshal(item.valueMap)
   126  			assert.NoError(t, err)
   127  			assert.JSONEq(t, item.json, string(j))
   128  
   129  			assert.JSONEq(t, item.json, item.valueMap.String())
   130  			assert.JSONEq(t, item.json, item.valueMap.JSONString())
   131  
   132  			var m ValueMap
   133  			err = easyjson.Unmarshal([]byte(item.json), &m)
   134  			assert.NoError(t, err)
   135  			assert.Equal(t, item.valueMap, m)
   136  		})
   137  	}
   138  }
   139  

View as plain text