func testType(t *testing.T, up unpacker.Interface) { ctx := initialise() data := `{ "description": "This is the most basic type.", "type": "type", "id": "type", "fields": { "native": { "description": "This is the native json type that represents this type. If omitted, default is object.", "type": "@string", "enum": ["string", "number", "bool", "array", "object", "map"], "default": "object", "optional": true }, "interface": { "description": "Is this type an interface?", "type": "@bool", "default": false, "optional": true }, "fields": { "description": "Each field is listed with it's type", "type": "@map", "items": { "type": "@rule" }, "optional": true }, "rule": { "description": "Embedded type that defines restriction rules for this type. By convention, the ID should be this type prefixed with the @ character.", "type": "@type", "optional": true } }, "rule": { "description": "Restriction rules for types", "type": "type", "embed": ["rule"] } }` var i interface{} err := up.Process(ctx, []byte(data), &i) require.NoError(t, err) f, ok := i.(*system.Type) assert.True(t, ok, "Type %T not correct", i) assert.NotNil(t, f) assert.Equal(t, "This is the most basic type.", f.Description) assert.NotNil(t, f.Native) assert.Equal(t, "object", f.Native.Value()) assert.Equal(t, "Is this type an interface?", f.Fields["interface"].(system.ObjectInterface).GetObject(nil).Description) assert.Equal(t, true, f.Fields["interface"].GetRule(nil).Optional) r, ok := f.Fields["interface"].(*system.BoolRule) assert.True(t, ok, "Wrong type %T\n", f.Fields["interface"]) assert.NotNil(t, r.Default) assert.Equal(t, false, r.Default.Value()) }
func TestStringUnmarshalJSON(t *testing.T) { var s *String err := s.Unpack(envctx.Empty, Pack(nil), false) require.NoError(t, err) assert.Nil(t, s) s = NewString("") err = s.Unpack(envctx.Empty, Pack(`foo "bar"`), false) require.NoError(t, err) assert.NotNil(t, s) assert.Equal(t, `foo "bar"`, s.Value()) s = NewString("") err = s.Unpack(envctx.Empty, Pack(map[string]interface{}{ "type": "system:string", "value": `foo "bar"`, }), false) require.NoError(t, err) assert.NotNil(t, s) assert.Equal(t, `foo "bar"`, s.Value()) s = NewString("") err = s.Unpack(envctx.Empty, Pack(1.0), false) assert.Error(t, err) }
func TestBoolUnmarshalJSON(t *testing.T) { var b *Bool err := b.Unpack(envctx.Empty, Pack(nil), false) require.NoError(t, err) assert.Nil(t, b) b = NewBool(false) err = b.Unpack(envctx.Empty, Pack(true), false) require.NoError(t, err) assert.NotNil(t, b) assert.True(t, b.Value()) b = NewBool(false) err = b.Unpack(envctx.Empty, Pack(map[string]interface{}{ "type": "system:bool", "value": true, }), false) require.NoError(t, err) assert.NotNil(t, b) assert.True(t, b.Value()) b = NewBool(true) err = b.Unpack(envctx.Empty, Pack(false), false) require.NoError(t, err) assert.NotNil(t, b) assert.False(t, b.Value()) b = NewBool(false) err = b.Unpack(envctx.Empty, Pack("foo"), false) assert.Error(t, err) }
func TestNode_SetValueZero2(t *testing.T) { cb, n := data.Empty(t) test := func(t *testing.T, n *node.Node, m *data.Multi) { sstring, ok := system.GetTypeFromCache(cb.Ctx(), "kego.io/system", "string") assert.True(t, ok) snumber, ok := system.GetTypeFromCache(cb.Ctx(), "kego.io/system", "number") assert.True(t, ok) require.NoError(t, n.Map["ss"].SetValueZero(cb.Ctx(), true, sstring)) assert.Nil(t, m.Ss) require.NoError(t, n.Map["sn"].SetValueZero(cb.Ctx(), false, snumber)) assert.NotNil(t, m.Sn) require.NoError(t, n.Map["mnri"].SetValueZero(cb.Ctx(), true, nil)) assert.Nil(t, m.Mnri) require.NoError(t, n.Map["mi"].SetValueZero(cb.Ctx(), false, nil)) assert.NotNil(t, m.Mi) assert.Equal(t, 0, len(m.Mi)) require.NoError(t, n.Map["anri"].SetValueZero(cb.Ctx(), true, nil)) assert.Nil(t, m.Anri) require.NoError(t, n.Map["ai"].SetValueZero(cb.Ctx(), false, nil)) assert.NotNil(t, m.Ai) assert.Equal(t, 0, len(m.Ai)) } data.Run(t, n, n.Value.(*data.Multi), test) }
func TestNumberUnmarshalJSON(t *testing.T) { var n *Number err := n.Unpack(envctx.Empty, Pack(nil), false) require.NoError(t, err) assert.Nil(t, n) n = NewNumber(0.0) err = n.Unpack(envctx.Empty, Pack(1.2), false) require.NoError(t, err) assert.NotNil(t, n) assert.Equal(t, 1.2, n.Value()) n = NewNumber(0.0) err = n.Unpack(envctx.Empty, Pack(map[string]interface{}{ "type": "system:number", "value": 1.2, }), false) require.NoError(t, err) assert.NotNil(t, n) assert.Equal(t, 1.2, n.Value()) n = NewNumber(0.0) err = n.Unpack(envctx.Empty, Pack("foo"), false) assert.Error(t, err) }
func TestRuleWrapper_ZeroValue(t *testing.T) { cb := tests.Context("kego.io/system").Jauto().Sauto(parser.Parse) r := system.WrapRule(cb.Ctx(), &system.MapRule{ Object: &system.Object{Type: system.NewReference("kego.io/system", "@map")}, Rule: &system.Rule{}, Items: &system.StringRule{ Object: &system.Object{Type: system.NewReference("kego.io/system", "@string")}, Rule: &system.Rule{}, }, }) v, err := r.ZeroValue(true) require.NoError(t, err) assert.IsType(t, map[string]*system.String{}, v.Interface()) assert.Nil(t, v.Interface()) v, err = r.ZeroValue(false) require.NoError(t, err) assert.IsType(t, map[string]*system.String{}, v.Interface()) assert.NotNil(t, v.Interface()) vv := v.Interface().(map[string]*system.String) vv["a"] = system.NewString("") r = system.WrapRule(cb.Ctx(), &system.MapRule{ Object: &system.Object{Type: system.NewReference("kego.io/system", "@array")}, Rule: &system.Rule{}, Items: &system.StringRule{ Object: &system.Object{Type: system.NewReference("kego.io/system", "@string")}, Rule: &system.Rule{}, }, }) v, err = r.ZeroValue(true) require.NoError(t, err) assert.IsType(t, []*system.String{}, v.Interface()) assert.Nil(t, v.Interface()) v, err = r.ZeroValue(false) require.NoError(t, err) assert.IsType(t, []*system.String{}, v.Interface()) assert.NotNil(t, v.Interface()) va := v.Interface().([]*system.String) va = append(va, system.NewString("")) }
func TestAls(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "als": {"type": "als", "js": "a"} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Als) assert.Equal(t, "a", v.(*data.Multi).Als.Js) }), ) }
func TestI(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "i": {"type": "facea", "a": "b"} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).I) assert.Equal(t, "b", v.(*data.Multi).I.Face()) }), ) }
func TestAljn(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "aljn": 1.1 }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Aljn) assert.Equal(t, 1.1, v.(*data.Multi).Aljn.Value()) }), ) }
func TestSri2(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "sri": {"type": "aljs2", "value": "a"} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Sri) assert.Equal(t, "a", v.(*data.Multi).Sri.GetString(ctx).Value()) }), ) }
func TestNri2(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "nri": {"type": "aljn2", "value": 1.1} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Nri) assert.Equal(t, 1.1, v.(*data.Multi).Nri.GetNumber(ctx).Value()) }), ) }
func TestBri2(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "bri": {"type": "aljb2", "value": true} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Bri) assert.Equal(t, true, v.(*data.Multi).Bri.GetBool(ctx).Value()) }), ) }
func TestAljbi(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) Run(t, ctx, `{ "type": "multi", "aljbi": true }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Aljbi.GetAljb(ctx)) assert.IsType(t, new(data.Aljb), v.(*data.Multi).Aljbi) assert.Equal(t, true, v.(*data.Multi).Aljbi.GetAljb(ctx).Value()) }), ) }
func TestIntUnmarshalJSON(t *testing.T) { var i *Int err := i.Unpack(envctx.Empty, Pack(nil), false) require.NoError(t, err) assert.Nil(t, i) i = NewInt(0) err = i.Unpack(envctx.Empty, Pack(2.0), false) require.NoError(t, err) assert.NotNil(t, i) assert.Equal(t, 2, i.Value()) i = NewInt(0) err = i.Unpack(envctx.Empty, Pack(map[string]interface{}{ "type": "system:int", "value": 2.0, }), false) require.NoError(t, err) assert.NotNil(t, i) assert.Equal(t, 2, i.Value()) i = NewInt(0) err = i.Unpack(envctx.Empty, Pack(-12.0), false) require.NoError(t, err) assert.NotNil(t, i) assert.Equal(t, -12, i.Value()) i = NewInt(0) err = i.Unpack(envctx.Empty, Pack("foo"), false) assert.IsError(t, err, "UJUBDGVYGF") i = NewInt(0) err = i.Unpack(envctx.Empty, Pack(1.2), false) assert.HasError(t, err, "KVEOETSIJY") }
func TestAljni2(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) // Aljn2 is another alias number type that implements the Aljn default // interface. Run(t, ctx, `{ "type": "multi", "aljni": {"type": "aljn2", "value": 1.1} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Aljni.GetAljn(ctx)) assert.IsType(t, new(data.Aljn2), v.(*data.Multi).Aljni) assert.Equal(t, 1.1, v.(*data.Multi).Aljni.GetAljn(ctx).Value()) }), ) }
func TestAljbi2(t *testing.T) { ctx := ke.NewContext(context.Background(), "kego.io/tests/data", nil) // aljb2 is another alias bool type that implements the aljb default // interface. Run(t, ctx, `{ "type": "multi", "aljbi": {"type": "aljb2", "value": true} }`, TestValue(func(t *testing.T, v interface{}) { assert.NotNil(t, v.(*data.Multi).Aljbi.GetAljb(ctx)) assert.IsType(t, new(data.Aljb2), v.(*data.Multi).Aljbi) assert.Equal(t, true, v.(*data.Multi).Aljbi.GetAljb(ctx).Value()) }), ) }
func testBool(t *testing.T, up unpacker.Interface) { ctx := initialise() data := `{ "description": "This is the native json bool data type", "type": "type", "id": "bool", "native": "bool", "alias": { "type": "json:@bool" }, "rule": { "description": "Restriction rules for bools", "type": "type", "embed": ["rule"], "fields": { "default": { "description": "Default value of this is missing or null", "type": "@bool", "optional": true } } } }` var i interface{} err := up.Process(ctx, []byte(data), &i) require.NoError(t, err) f, ok := i.(*system.Type) assert.True(t, ok, "Type %T not correct", i) assert.NotNil(t, f) assert.Equal(t, "This is the native json bool data type", f.Description) assert.NotNil(t, f.Native) assert.Equal(t, "bool", f.Native.Value()) }
func TestNewNumber(t *testing.T) { n := NewNumber(1.2) assert.NotNil(t, n) assert.Equal(t, 1.2, n.Value()) }
func TestNewString(t *testing.T) { s := NewString("a") assert.NotNil(t, s) assert.Equal(t, "a", s.Value()) assert.Equal(t, "a", s.NativeString()) }
func TestStore_Init(t *testing.T) { s := &st{Store: &Store{}} s.Init(s) assert.NotNil(t, s.self) assert.Equal(t, s.self, s) }
func TestNewInt(t *testing.T) { n := NewInt(2) assert.NotNil(t, n) assert.Equal(t, 2, n.Value()) }
func TestNode_SetValueZero(t *testing.T) { cb, n := data.Setup(t) test := func(t *testing.T, n *node.Node, m *data.Multi) { sstring, ok := system.GetTypeFromCache(cb.Ctx(), "kego.io/system", "string") assert.True(t, ok) facea, ok := system.GetTypeFromCache(cb.Ctx(), "kego.io/tests/data", "facea") assert.True(t, ok) faceb, ok := system.GetTypeFromCache(cb.Ctx(), "kego.io/tests/data", "faceb") assert.True(t, ok) c1 := node.NewNode() require.NoError(t, c1.InitialiseMapItem(cb.Ctx(), n.Map["mss"], "c")) require.NoError(t, c1.AddToMap(cb.Ctx(), n.Map["mss"], "c", true)) require.NoError(t, c1.SetValueZero(cb.Ctx(), true, nil)) assert.False(t, n.Map["mss"].Map["c"].Missing) assert.True(t, n.Map["mss"].Map["c"].Null) assert.Nil(t, m.Mss["c"]) c1a := node.NewNode() require.NoError(t, c1a.InitialiseMapItem(cb.Ctx(), n.Map["mss"], "d")) require.NoError(t, c1a.AddToMap(cb.Ctx(), n.Map["mss"], "d", true)) require.NoError(t, c1a.SetValueZero(cb.Ctx(), false, nil)) assert.False(t, n.Map["mss"].Map["d"].Missing) assert.False(t, n.Map["mss"].Map["d"].Null) assert.NotNil(t, m.Mss["d"]) assert.Equal(t, "", m.Mss["d"].Value()) c2 := node.NewNode() require.NoError(t, c2.InitialiseMapItem(cb.Ctx(), n.Map["mm"], "c")) require.NoError(t, c2.AddToMap(cb.Ctx(), n.Map["mm"], "c", true)) require.NoError(t, c2.SetValueZero(cb.Ctx(), true, nil)) assert.Nil(t, m.Mm["c"]) c2a := node.NewNode() require.NoError(t, c2a.InitialiseMapItem(cb.Ctx(), n.Map["mm"], "d")) require.NoError(t, c2a.AddToMap(cb.Ctx(), n.Map["mm"], "d", true)) require.NoError(t, c2a.SetValueZero(cb.Ctx(), false, nil)) assert.NotNil(t, m.Mm["d"]) assert.Equal(t, "", m.Mm["d"].Js) require.NoError(t, n.Map["i"].SetValueZero(cb.Ctx(), true, faceb)) assert.Nil(t, m.I) assert.IsType(t, &data.Faceb{}, m.I) require.NoError(t, n.Map["sri"].SetValueZero(cb.Ctx(), false, facea)) assert.NotNil(t, m.Sri) assert.IsType(t, &data.Facea{}, m.Sri) c3 := node.NewNode() require.NoError(t, c3.InitialiseArrayItem(cb.Ctx(), n.Map["ass"], 4)) require.NoError(t, c3.AddToArray(cb.Ctx(), n.Map["ass"], 4, true)) require.NoError(t, c3.SetValueZero(cb.Ctx(), true, nil)) assert.Nil(t, m.Ass[4]) c3a := node.NewNode() require.NoError(t, c3a.InitialiseArrayItem(cb.Ctx(), n.Map["ass"], 5)) require.NoError(t, c3a.AddToArray(cb.Ctx(), n.Map["ass"], 5, true)) require.NoError(t, c3a.SetValueZero(cb.Ctx(), false, nil)) assert.NotNil(t, m.Ass[5]) c4 := node.NewNode() require.NoError(t, c4.InitialiseArrayItem(cb.Ctx(), n.Map["am"], 2)) require.NoError(t, c4.AddToArray(cb.Ctx(), n.Map["am"], 2, true)) require.NoError(t, c4.SetValueZero(cb.Ctx(), true, nil)) assert.Nil(t, m.Am[2]) c4a := node.NewNode() require.NoError(t, c4a.InitialiseArrayItem(cb.Ctx(), n.Map["am"], 3)) require.NoError(t, c4a.AddToArray(cb.Ctx(), n.Map["am"], 3, true)) require.NoError(t, c4a.SetValueZero(cb.Ctx(), false, nil)) assert.NotNil(t, m.Am[3]) c5 := node.NewNode() require.NoError(t, c5.InitialiseArrayItem(cb.Ctx(), n.Map["anri"], 3)) require.NoError(t, c5.AddToArray(cb.Ctx(), n.Map["anri"], 3, true)) require.NoError(t, c5.SetValueZero(cb.Ctx(), true, sstring)) assert.Nil(t, m.Anri[3]) assert.IsType(t, system.NewString(""), m.Anri[3]) c5a := node.NewNode() require.NoError(t, c5a.InitialiseArrayItem(cb.Ctx(), n.Map["anri"], 4)) require.NoError(t, c5a.AddToArray(cb.Ctx(), n.Map["anri"], 4, true)) require.NoError(t, c5a.SetValueZero(cb.Ctx(), false, sstring)) assert.NotNil(t, m.Anri[4]) assert.IsType(t, system.NewString(""), m.Anri[4]) c6 := node.NewNode() require.NoError(t, c6.InitialiseArrayItem(cb.Ctx(), n.Map["anri"], 5)) require.NoError(t, c6.AddToArray(cb.Ctx(), n.Map["anri"], 5, true)) require.NoError(t, c6.SetValueZero(cb.Ctx(), true, facea)) assert.Nil(t, m.Anri[5]) assert.IsType(t, &data.Facea{}, m.Anri[5]) c6a := node.NewNode() require.NoError(t, c6a.InitialiseArrayItem(cb.Ctx(), n.Map["anri"], 6)) require.NoError(t, c6a.AddToArray(cb.Ctx(), n.Map["anri"], 6, true)) require.NoError(t, c6a.SetValueZero(cb.Ctx(), false, facea)) assert.NotNil(t, m.Anri[6]) assert.IsType(t, &data.Facea{}, m.Anri[6]) c7 := node.NewNode() require.NoError(t, c7.InitialiseMapItem(cb.Ctx(), n.Map["mnri"], "d")) require.NoError(t, c7.AddToMap(cb.Ctx(), n.Map["mnri"], "d", true)) require.NoError(t, c7.SetValueZero(cb.Ctx(), true, sstring)) assert.Nil(t, m.Mnri["d"]) assert.IsType(t, system.NewString(""), m.Mnri["d"]) c7a := node.NewNode() require.NoError(t, c7a.InitialiseMapItem(cb.Ctx(), n.Map["mnri"], "e")) require.NoError(t, c7a.AddToMap(cb.Ctx(), n.Map["mnri"], "e", true)) require.NoError(t, c7a.SetValueZero(cb.Ctx(), false, sstring)) assert.NotNil(t, m.Mnri["e"]) assert.IsType(t, system.NewString(""), m.Mnri["e"]) c8 := node.NewNode() require.NoError(t, c8.InitialiseMapItem(cb.Ctx(), n.Map["mnri"], "f")) require.NoError(t, c8.AddToMap(cb.Ctx(), n.Map["mnri"], "f", true)) require.NoError(t, c8.SetValueZero(cb.Ctx(), true, facea)) assert.Nil(t, m.Mnri["f"]) assert.IsType(t, &data.Facea{}, m.Mnri["f"]) c8a := node.NewNode() require.NoError(t, c8a.InitialiseMapItem(cb.Ctx(), n.Map["mnri"], "g")) require.NoError(t, c8a.AddToMap(cb.Ctx(), n.Map["mnri"], "g", true)) require.NoError(t, c8a.SetValueZero(cb.Ctx(), false, facea)) assert.NotNil(t, m.Mnri["g"]) assert.IsType(t, &data.Facea{}, m.Mnri["g"]) } data.Run(t, n, n.Value.(*data.Multi), test) }
func TestReferenceUnmarshal(t *testing.T) { reset := func() *Reference { // Let's pre-load with some values so we check that when we // load a null value, we clear all the fields r := NewReference("a.b/c", "d") return r } r := reset() err := r.Unpack(envctx.Empty, Pack(nil), false) assert.IsError(t, err, "MOQVSKJXRB") r = reset() err = r.Unpack(envctx.Empty, Pack(1.0), false) assert.IsError(t, err, "RFLQSBPMYM") r = reset() err = r.Unpack(envctx.Empty, Pack("a.b/c:d"), false) assert.IsError(t, err, "MSXBLEIGVJ") assert.HasError(t, err, "KJSOXDESFD") p, ok := kerr.Source(err).(UnknownPackageError) assert.True(t, ok) assert.Equal(t, "a.b/c", p.UnknownPackage) ctx := tests.Context("").Alias("c", "a.b/c").Ctx() r = reset() err = r.Unpack(ctx, Pack("a.b/c:d"), false) require.NoError(t, err) assert.NotNil(t, r) assert.Equal(t, "a.b/c", r.Package) assert.Equal(t, "d", r.Name) assert.Equal(t, "a.b/c:d", r.Value()) r = reset() err = r.Unpack(ctx, Pack(map[string]interface{}{ "type": "system:reference", "value": "a.b/c:d", }), false) require.NoError(t, err) assert.NotNil(t, r) assert.Equal(t, "a.b/c", r.Package) assert.Equal(t, "d", r.Name) assert.Equal(t, "a.b/c:d", r.Value()) r = reset() err = r.Unpack(ctx, Pack("a.b/c:@d"), false) require.NoError(t, err) assert.NotNil(t, r) assert.Equal(t, "a.b/c", r.Package) assert.Equal(t, "@d", r.Name) assert.Equal(t, "a.b/c:@d", r.Value()) r = reset() err = r.Unpack(envctx.Empty, Pack("a:b"), false) assert.IsError(t, err, "MSXBLEIGVJ") assert.HasError(t, err, "DKKFLKDKYI") p, ok = kerr.Source(err).(UnknownPackageError) assert.True(t, ok) assert.Equal(t, "a", p.UnknownPackage) r = reset() err = r.UnmarshalInterface(envctx.Empty, 1) require.NoError(t, err) assert.Equal(t, *NewReference("", ""), *r) r = reset() err = r.UnmarshalInterface(envctx.Empty, "") require.NoError(t, err) assert.Equal(t, *NewReference("", ""), *r) r = reset() err = r.UnmarshalInterface(envctx.Empty, "a.b/c:d") assert.IsError(t, err, "ETLPLMMWCC") r = reset() err = r.UnmarshalInterface(tests.Context("a.b/c").Ctx(), "a.b/c:d") require.NoError(t, err) assert.Equal(t, *NewReference("a.b/c", "d"), *r) }