simplejson_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package simplejson
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. )
  7. func TestSimplejson(t *testing.T) {
  8. var ok bool
  9. var err error
  10. js, err := NewJson([]byte(`{
  11. "test": {
  12. "string_array": ["asdf", "ghjk", "zxcv"],
  13. "string_array_null": ["abc", null, "efg"],
  14. "array": [1, "2", 3],
  15. "arraywithsubs": [{"subkeyone": 1},
  16. {"subkeytwo": 2, "subkeythree": 3}],
  17. "int": 10,
  18. "float": 5.150,
  19. "string": "simplejson",
  20. "bool": true,
  21. "sub_obj": {"a": 1}
  22. }
  23. }`))
  24. assert.NotEqual(t, nil, js)
  25. assert.Equal(t, nil, err)
  26. _, ok = js.CheckGet("test")
  27. assert.Equal(t, true, ok)
  28. _, ok = js.CheckGet("missing_key")
  29. assert.Equal(t, false, ok)
  30. aws := js.Get("test").Get("arraywithsubs")
  31. assert.NotEqual(t, nil, aws)
  32. var awsval int
  33. awsval, _ = aws.GetIndex(0).Get("subkeyone").Int()
  34. assert.Equal(t, 1, awsval)
  35. awsval, _ = aws.GetIndex(1).Get("subkeytwo").Int()
  36. assert.Equal(t, 2, awsval)
  37. awsval, _ = aws.GetIndex(1).Get("subkeythree").Int()
  38. assert.Equal(t, 3, awsval)
  39. i, _ := js.Get("test").Get("int").Int()
  40. assert.Equal(t, 10, i)
  41. f, _ := js.Get("test").Get("float").Float64()
  42. assert.Equal(t, 5.150, f)
  43. s, _ := js.Get("test").Get("string").String()
  44. assert.Equal(t, "simplejson", s)
  45. b, _ := js.Get("test").Get("bool").Bool()
  46. assert.Equal(t, true, b)
  47. mi := js.Get("test").Get("int").MustInt()
  48. assert.Equal(t, 10, mi)
  49. mi2 := js.Get("test").Get("missing_int").MustInt(5150)
  50. assert.Equal(t, 5150, mi2)
  51. ms := js.Get("test").Get("string").MustString()
  52. assert.Equal(t, "simplejson", ms)
  53. ms2 := js.Get("test").Get("missing_string").MustString("fyea")
  54. assert.Equal(t, "fyea", ms2)
  55. ma2 := js.Get("test").Get("missing_array").MustArray([]interface{}{"1", 2, "3"})
  56. assert.Equal(t, ma2, []interface{}{"1", 2, "3"})
  57. msa := js.Get("test").Get("string_array").MustStringArray()
  58. assert.Equal(t, msa[0], "asdf")
  59. assert.Equal(t, msa[1], "ghjk")
  60. assert.Equal(t, msa[2], "zxcv")
  61. msa2 := js.Get("test").Get("string_array").MustStringArray([]string{"1", "2", "3"})
  62. assert.Equal(t, msa2[0], "asdf")
  63. assert.Equal(t, msa2[1], "ghjk")
  64. assert.Equal(t, msa2[2], "zxcv")
  65. msa3 := js.Get("test").Get("missing_array").MustStringArray([]string{"1", "2", "3"})
  66. assert.Equal(t, msa3, []string{"1", "2", "3"})
  67. mm2 := js.Get("test").Get("missing_map").MustMap(map[string]interface{}{"found": false})
  68. assert.Equal(t, mm2, map[string]interface{}{"found": false})
  69. strs, err := js.Get("test").Get("string_array").StringArray()
  70. assert.Equal(t, err, nil)
  71. assert.Equal(t, strs[0], "asdf")
  72. assert.Equal(t, strs[1], "ghjk")
  73. assert.Equal(t, strs[2], "zxcv")
  74. strs2, err := js.Get("test").Get("string_array_null").StringArray()
  75. assert.Equal(t, err, nil)
  76. assert.Equal(t, strs2[0], "abc")
  77. assert.Equal(t, strs2[1], "")
  78. assert.Equal(t, strs2[2], "efg")
  79. gp, _ := js.GetPath("test", "string").String()
  80. assert.Equal(t, "simplejson", gp)
  81. gp2, _ := js.GetPath("test", "int").Int()
  82. assert.Equal(t, 10, gp2)
  83. assert.Equal(t, js.Get("test").Get("bool").MustBool(), true)
  84. js.Set("float2", 300.0)
  85. assert.Equal(t, js.Get("float2").MustFloat64(), 300.0)
  86. js.Set("test2", "setTest")
  87. assert.Equal(t, "setTest", js.Get("test2").MustString())
  88. js.Del("test2")
  89. assert.NotEqual(t, "setTest", js.Get("test2").MustString())
  90. js.Get("test").Get("sub_obj").Set("a", 2)
  91. assert.Equal(t, 2, js.Get("test").Get("sub_obj").Get("a").MustInt())
  92. js.GetPath("test", "sub_obj").Set("a", 3)
  93. assert.Equal(t, 3, js.GetPath("test", "sub_obj", "a").MustInt())
  94. }
  95. func TestStdlibInterfaces(t *testing.T) {
  96. val := new(struct {
  97. Name string `json:"name"`
  98. Params *Json `json:"params"`
  99. })
  100. val2 := new(struct {
  101. Name string `json:"name"`
  102. Params *Json `json:"params"`
  103. })
  104. raw := `{"name":"myobject","params":{"string":"simplejson"}}`
  105. assert.Equal(t, nil, json.Unmarshal([]byte(raw), val))
  106. assert.Equal(t, "myobject", val.Name)
  107. assert.NotEqual(t, nil, val.Params.data)
  108. s, _ := val.Params.Get("string").String()
  109. assert.Equal(t, "simplejson", s)
  110. p, err := json.Marshal(val)
  111. assert.Equal(t, nil, err)
  112. assert.Equal(t, nil, json.Unmarshal(p, val2))
  113. assert.Equal(t, val, val2) // stable
  114. }
  115. func TestSet(t *testing.T) {
  116. js, err := NewJson([]byte(`{}`))
  117. assert.Equal(t, nil, err)
  118. js.Set("baz", "bing")
  119. s, err := js.GetPath("baz").String()
  120. assert.Equal(t, nil, err)
  121. assert.Equal(t, "bing", s)
  122. }
  123. func TestReplace(t *testing.T) {
  124. js, err := NewJson([]byte(`{}`))
  125. assert.Equal(t, nil, err)
  126. err = js.UnmarshalJSON([]byte(`{"baz":"bing"}`))
  127. assert.Equal(t, nil, err)
  128. s, err := js.GetPath("baz").String()
  129. assert.Equal(t, nil, err)
  130. assert.Equal(t, "bing", s)
  131. }
  132. func TestSetPath(t *testing.T) {
  133. js, err := NewJson([]byte(`{}`))
  134. assert.Equal(t, nil, err)
  135. js.SetPath([]string{"foo", "bar"}, "baz")
  136. s, err := js.GetPath("foo", "bar").String()
  137. assert.Equal(t, nil, err)
  138. assert.Equal(t, "baz", s)
  139. }
  140. func TestSetPathNoPath(t *testing.T) {
  141. js, err := NewJson([]byte(`{"some":"data","some_number":1.0,"some_bool":false}`))
  142. assert.Equal(t, nil, err)
  143. f := js.GetPath("some_number").MustFloat64(99.0)
  144. assert.Equal(t, f, 1.0)
  145. js.SetPath([]string{}, map[string]interface{}{"foo": "bar"})
  146. s, err := js.GetPath("foo").String()
  147. assert.Equal(t, nil, err)
  148. assert.Equal(t, "bar", s)
  149. f = js.GetPath("some_number").MustFloat64(99.0)
  150. assert.Equal(t, f, 99.0)
  151. }
  152. func TestPathWillAugmentExisting(t *testing.T) {
  153. js, err := NewJson([]byte(`{"this":{"a":"aa","b":"bb","c":"cc"}}`))
  154. assert.Equal(t, nil, err)
  155. js.SetPath([]string{"this", "d"}, "dd")
  156. cases := []struct {
  157. path []string
  158. outcome string
  159. }{
  160. {
  161. path: []string{"this", "a"},
  162. outcome: "aa",
  163. },
  164. {
  165. path: []string{"this", "b"},
  166. outcome: "bb",
  167. },
  168. {
  169. path: []string{"this", "c"},
  170. outcome: "cc",
  171. },
  172. {
  173. path: []string{"this", "d"},
  174. outcome: "dd",
  175. },
  176. }
  177. for _, tc := range cases {
  178. s, err := js.GetPath(tc.path...).String()
  179. assert.Equal(t, nil, err)
  180. assert.Equal(t, tc.outcome, s)
  181. }
  182. }
  183. func TestPathWillOverwriteExisting(t *testing.T) {
  184. // notice how "a" is 0.1 - but then we'll try to set at path a, foo
  185. js, err := NewJson([]byte(`{"this":{"a":0.1,"b":"bb","c":"cc"}}`))
  186. assert.Equal(t, nil, err)
  187. js.SetPath([]string{"this", "a", "foo"}, "bar")
  188. s, err := js.GetPath("this", "a", "foo").String()
  189. assert.Equal(t, nil, err)
  190. assert.Equal(t, "bar", s)
  191. }