github.com/gogf/gf/v2@v2.7.4/encoding/gjson/gjson_z_unit_feature_set_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package gjson_test
     8  
     9  import (
    10  	"bytes"
    11  	"testing"
    12  
    13  	"github.com/gogf/gf/v2/container/garray"
    14  	"github.com/gogf/gf/v2/encoding/gjson"
    15  	"github.com/gogf/gf/v2/frame/g"
    16  	"github.com/gogf/gf/v2/test/gtest"
    17  	"github.com/gogf/gf/v2/text/gstr"
    18  )
    19  
    20  func Test_Set1(t *testing.T) {
    21  	e := []byte(`{"k1":{"k11":[1,2,3]},"k2":"v2"}`)
    22  	p := gjson.New(map[string]string{
    23  		"k1": "v1",
    24  		"k2": "v2",
    25  	})
    26  	p.Set("k1.k11", []int{1, 2, 3})
    27  	if c, err := p.ToJson(); err == nil {
    28  
    29  		if !bytes.Equal(c, []byte(`{"k1":{"k11":[1,2,3]},"k2":"v2"}`)) {
    30  			t.Error("expect:", string(e))
    31  		}
    32  	} else {
    33  		t.Error(err)
    34  	}
    35  }
    36  
    37  func Test_Set2(t *testing.T) {
    38  	gtest.C(t, func(t *gtest.T) {
    39  		e := `[[null,1]]`
    40  		p := gjson.New([]string{"a"})
    41  		p.Set("0.1", 1)
    42  		s := p.MustToJsonString()
    43  		t.Assert(s, e)
    44  	})
    45  }
    46  
    47  func Test_Set3(t *testing.T) {
    48  	e := []byte(`{"kv":{"k1":"v1"}}`)
    49  	p := gjson.New([]string{"a"})
    50  	p.Set("kv", map[string]string{
    51  		"k1": "v1",
    52  	})
    53  	if c, err := p.ToJson(); err == nil {
    54  		if !bytes.Equal(c, e) {
    55  			t.Error("expect:", string(e))
    56  		}
    57  	} else {
    58  		t.Error(err)
    59  	}
    60  }
    61  
    62  func Test_Set4(t *testing.T) {
    63  	e := []byte(`["a",[{"k1":"v1"}]]`)
    64  	p := gjson.New([]string{"a"})
    65  	p.Set("1.0", map[string]string{
    66  		"k1": "v1",
    67  	})
    68  	if c, err := p.ToJson(); err == nil {
    69  
    70  		if !bytes.Equal(c, e) {
    71  			t.Error("expect:", string(e))
    72  		}
    73  	} else {
    74  		t.Error(err)
    75  	}
    76  }
    77  
    78  func Test_Set5(t *testing.T) {
    79  	e := []byte(`[[[[[[[[[[[[[[[[[[[[[1,2,3]]]]]]]]]]]]]]]]]]]]]`)
    80  	p := gjson.New([]string{"a"})
    81  	p.Set("0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0", []int{1, 2, 3})
    82  	if c, err := p.ToJson(); err == nil {
    83  
    84  		if !bytes.Equal(c, e) {
    85  			t.Error("expect:", string(e))
    86  		}
    87  	} else {
    88  		t.Error(err)
    89  	}
    90  }
    91  
    92  func Test_Set6(t *testing.T) {
    93  	e := []byte(`["a",[1,2,3]]`)
    94  	p := gjson.New([]string{"a"})
    95  	p.Set("1", []int{1, 2, 3})
    96  	if c, err := p.ToJson(); err == nil {
    97  
    98  		if !bytes.Equal(c, e) {
    99  			t.Error("expect:", string(e))
   100  		}
   101  	} else {
   102  		t.Error(err)
   103  	}
   104  }
   105  
   106  func Test_Set7(t *testing.T) {
   107  	e := []byte(`{"0":[null,[1,2,3]],"k1":"v1","k2":"v2"}`)
   108  	p := gjson.New(map[string]string{
   109  		"k1": "v1",
   110  		"k2": "v2",
   111  	})
   112  	p.Set("0.1", []int{1, 2, 3})
   113  	if c, err := p.ToJson(); err == nil {
   114  
   115  		if !bytes.Equal(c, e) {
   116  			t.Error("expect:", string(e))
   117  		}
   118  	} else {
   119  		t.Error(err)
   120  	}
   121  }
   122  
   123  func Test_Set8(t *testing.T) {
   124  	e := []byte(`{"0":[[[[[[null,[1,2,3]]]]]]],"k1":"v1","k2":"v2"}`)
   125  	p := gjson.New(map[string]string{
   126  		"k1": "v1",
   127  		"k2": "v2",
   128  	})
   129  	p.Set("0.0.0.0.0.0.1", []int{1, 2, 3})
   130  	if c, err := p.ToJson(); err == nil {
   131  
   132  		if !bytes.Equal(c, e) {
   133  			t.Error("expect:", string(e))
   134  		}
   135  	} else {
   136  		t.Error(err)
   137  	}
   138  }
   139  
   140  func Test_Set9(t *testing.T) {
   141  	e := []byte(`{"k1":[null,[1,2,3]],"k2":"v2"}`)
   142  	p := gjson.New(map[string]string{
   143  		"k1": "v1",
   144  		"k2": "v2",
   145  	})
   146  	p.Set("k1.1", []int{1, 2, 3})
   147  	if c, err := p.ToJson(); err == nil {
   148  
   149  		if !bytes.Equal(c, e) {
   150  			t.Error("expect:", string(e))
   151  		}
   152  	} else {
   153  		t.Error(err)
   154  	}
   155  }
   156  
   157  func Test_Set10(t *testing.T) {
   158  	e := []byte(`{"a":{"b":{"c":1}}}`)
   159  	p := gjson.New(nil)
   160  	p.Set("a.b.c", 1)
   161  	if c, err := p.ToJson(); err == nil {
   162  
   163  		if !bytes.Equal(c, e) {
   164  			t.Error("expect:", string(e))
   165  		}
   166  	} else {
   167  		t.Error(err)
   168  	}
   169  }
   170  
   171  func Test_Set11(t *testing.T) {
   172  	e := []byte(`{"a":{"b":{}}}`)
   173  	p, _ := gjson.LoadContent([]byte(`{"a":{"b":{"c":1}}}`))
   174  	p.Remove("a.b.c")
   175  	if c, err := p.ToJson(); err == nil {
   176  
   177  		if !bytes.Equal(c, e) {
   178  			t.Error("expect:", string(e))
   179  		}
   180  	} else {
   181  		t.Error(err)
   182  	}
   183  }
   184  
   185  func Test_Set12(t *testing.T) {
   186  	e := []byte(`[0,1]`)
   187  	p := gjson.New(nil)
   188  	p.Set("0", 0)
   189  	p.Set("1", 1)
   190  	if c, err := p.ToJson(); err == nil {
   191  
   192  		if !bytes.Equal(c, e) {
   193  			t.Error("expect:", string(e))
   194  		}
   195  	} else {
   196  		t.Error(err)
   197  	}
   198  }
   199  
   200  func Test_Set13(t *testing.T) {
   201  	e := []byte(`{"array":[0,1]}`)
   202  	p := gjson.New(nil)
   203  	p.Set("array.0", 0)
   204  	p.Set("array.1", 1)
   205  	if c, err := p.ToJson(); err == nil {
   206  
   207  		if !bytes.Equal(c, e) {
   208  			t.Error("expect:", string(e))
   209  		}
   210  	} else {
   211  		t.Error(err)
   212  	}
   213  }
   214  
   215  func Test_Set14(t *testing.T) {
   216  	e := []byte(`{"f":{"a":1}}`)
   217  	p := gjson.New(nil)
   218  	p.Set("f", "m")
   219  	p.Set("f.a", 1)
   220  	if c, err := p.ToJson(); err == nil {
   221  
   222  		if !bytes.Equal(c, e) {
   223  			t.Error("expect:", string(e))
   224  		}
   225  	} else {
   226  		t.Error(err)
   227  	}
   228  }
   229  
   230  func Test_Set15(t *testing.T) {
   231  	gtest.C(t, func(t *gtest.T) {
   232  		j := gjson.New(nil)
   233  
   234  		t.Assert(j.Set("root.0.k1", "v1"), nil)
   235  		t.Assert(j.Set("root.1.k2", "v2"), nil)
   236  		t.Assert(j.Set("k", "v"), nil)
   237  
   238  		s, err := j.ToJsonString()
   239  		t.AssertNil(err)
   240  		t.Assert(
   241  			gstr.Contains(s, `"root":[{"k1":"v1"},{"k2":"v2"}`) ||
   242  				gstr.Contains(s, `"root":[{"k2":"v2"},{"k1":"v1"}`),
   243  			true,
   244  		)
   245  		t.Assert(
   246  			gstr.Contains(s, `{"k":"v"`) ||
   247  				gstr.Contains(s, `"k":"v"}`),
   248  			true,
   249  		)
   250  	})
   251  }
   252  
   253  func Test_Set16(t *testing.T) {
   254  	gtest.C(t, func(t *gtest.T) {
   255  		j := gjson.New(nil)
   256  
   257  		t.Assert(j.Set("processors.0.set.0value", "1"), nil)
   258  		t.Assert(j.Set("processors.0.set.0field", "2"), nil)
   259  		t.Assert(j.Set("description", "3"), nil)
   260  
   261  		s, err := j.ToJsonString()
   262  		t.AssertNil(err)
   263  		t.Assert(
   264  			gstr.Contains(s, `"processors":[{"set":{"0field":"2","0value":"1"}}]`) ||
   265  				gstr.Contains(s, `"processors":[{"set":{"0value":"1","0field":"2"}}]`),
   266  			true,
   267  		)
   268  		t.Assert(
   269  			gstr.Contains(s, `{"description":"3"`) || gstr.Contains(s, `"description":"3"}`),
   270  			true,
   271  		)
   272  	})
   273  }
   274  
   275  func Test_Set17(t *testing.T) {
   276  	gtest.C(t, func(t *gtest.T) {
   277  		j := gjson.New(nil)
   278  
   279  		t.Assert(j.Set("0.k1", "v1"), nil)
   280  		t.Assert(j.Set("1.k2", "v2"), nil)
   281  		// overwrite the previous slice.
   282  		t.Assert(j.Set("k", "v"), nil)
   283  
   284  		s, err := j.ToJsonString()
   285  		t.AssertNil(err)
   286  		t.Assert(s, `{"k":"v"}`)
   287  	})
   288  }
   289  
   290  func Test_Set18(t *testing.T) {
   291  	gtest.C(t, func(t *gtest.T) {
   292  		j := gjson.New(nil)
   293  
   294  		t.Assert(j.Set("0.1.k1", "v1"), nil)
   295  		t.Assert(j.Set("0.2.k2", "v2"), nil)
   296  		s, err := j.ToJsonString()
   297  		t.AssertNil(err)
   298  		t.Assert(s, `[[null,{"k1":"v1"},{"k2":"v2"}]]`)
   299  	})
   300  }
   301  
   302  func Test_Set19(t *testing.T) {
   303  	gtest.C(t, func(t *gtest.T) {
   304  		j := gjson.New(nil)
   305  
   306  		t.Assert(j.Set("0.1.1.k1", "v1"), nil)
   307  		t.Assert(j.Set("0.2.1.k2", "v2"), nil)
   308  		s, err := j.ToJsonString()
   309  		t.AssertNil(err)
   310  		t.Assert(s, `[[null,[null,{"k1":"v1"}],[null,{"k2":"v2"}]]]`)
   311  	})
   312  }
   313  
   314  func Test_Set20(t *testing.T) {
   315  	gtest.C(t, func(t *gtest.T) {
   316  		j := gjson.New(nil)
   317  
   318  		t.Assert(j.Set("k1", "v1"), nil)
   319  		t.Assert(j.Set("k2", g.Slice{1, 2, 3}), nil)
   320  		t.Assert(j.Set("k2.1", 20), nil)
   321  		t.Assert(j.Set("k2.2", g.Map{"k3": "v3"}), nil)
   322  		s, err := j.ToJsonString()
   323  		t.AssertNil(err)
   324  		t.Assert(gstr.InArray(
   325  			g.SliceStr{
   326  				`{"k1":"v1","k2":[1,20,{"k3":"v3"}]}`,
   327  				`{"k2":[1,20,{"k3":"v3"}],"k1":"v1"}`,
   328  			},
   329  			s,
   330  		), true)
   331  	})
   332  }
   333  
   334  func Test_Set_GArray(t *testing.T) {
   335  	gtest.C(t, func(t *gtest.T) {
   336  		j := gjson.New(nil)
   337  		arr := garray.New().Append("test")
   338  		t.AssertNil(j.Set("arr", arr))
   339  		t.Assert(j.Get("arr").Array(), g.Slice{"test"})
   340  	})
   341  }
   342  
   343  func Test_Set_WithEmptyStruct(t *testing.T) {
   344  	gtest.C(t, func(t *gtest.T) {
   345  		j := gjson.New(&struct{}{})
   346  		t.AssertNil(j.Set("aa", "123"))
   347  		t.Assert(j.MustToJsonString(), `{"aa":"123"}`)
   348  	})
   349  }