github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istructsmem/internal/dynobuf/impl_test.go (about) 1 /* 2 * Copyright (c) 2021-present Sigma-Soft, Ltd. 3 * @author: Nikolay Nikitin 4 */ 5 6 package dynobuf 7 8 import ( 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 "github.com/untillpro/dynobuffers" 13 "github.com/voedger/voedger/pkg/appdef" 14 ) 15 16 func TestDynoBufSchemes(t *testing.T) { 17 require := require.New(t) 18 19 var appDef appdef.IAppDef 20 21 t.Run("must ok to build application", func(t *testing.T) { 22 adb := appdef.New() 23 adb.AddPackage("test", "test.com/test") 24 25 root := adb.AddObject(appdef.NewQName("test", "root")) 26 root. 27 AddField("int32Field", appdef.DataKind_int32, true). 28 AddField("int64Field", appdef.DataKind_int64, false). 29 AddField("float32Field", appdef.DataKind_float32, false). 30 AddField("float64Field", appdef.DataKind_float64, false). 31 AddField("bytesField", appdef.DataKind_bytes, false). 32 AddField("strField", appdef.DataKind_string, false). 33 AddField("qnameField", appdef.DataKind_QName, false). 34 AddField("recIDField", appdef.DataKind_RecordID, false) 35 root. 36 AddContainer("child", appdef.NewQName("test", "child"), 1, appdef.Occurs_Unbounded) 37 38 child := adb.AddObject(appdef.NewQName("test", "child")) 39 child. 40 AddField("int32Field", appdef.DataKind_int32, true). 41 AddField("int64Field", appdef.DataKind_int64, false). 42 AddField("float32Field", appdef.DataKind_float32, false). 43 AddField("float64Field", appdef.DataKind_float64, false). 44 AddField("bytesField", appdef.DataKind_bytes, false). 45 AddField("strField", appdef.DataKind_string, false). 46 AddField("qnameField", appdef.DataKind_QName, false). 47 AddField("boolField", appdef.DataKind_bool, false). 48 AddField("recIDField", appdef.DataKind_RecordID, false) 49 child. 50 AddContainer("grandChild", appdef.NewQName("test", "grandChild"), 0, 1) 51 52 grandChild := adb.AddObject(appdef.NewQName("test", "grandChild")) 53 grandChild. 54 AddField("recIDField", appdef.DataKind_RecordID, false) 55 56 view := adb.AddView(appdef.NewQName("test", "view")) 57 view.Key().PartKey().AddField("pk1", appdef.DataKind_int64) 58 view.Key().ClustCols().AddField("cc1", appdef.DataKind_string, appdef.MaxLen(100)) 59 view.Value().AddRefField("val1", true) 60 61 sch, err := adb.Build() 62 require.NoError(err) 63 64 appDef = sch 65 }) 66 67 schemes := newSchemes() 68 require.NotNil(schemes) 69 70 schemes.Prepare(appDef) 71 72 checkScheme := func(name appdef.QName, fields appdef.IFields, dynoScheme *dynobuffers.Scheme) { 73 require.NotNil(dynoScheme, "dynobuffer scheme for «%v» not found", name) 74 75 require.EqualValues(len(dynoScheme.FieldsMap), fields.UserFieldCount()) 76 77 for _, f := range dynoScheme.Fields { 78 fld := fields.Field(f.Name) 79 require.NotNil(fld) 80 require.Equal(DataKindToFieldType(fld.DataKind()), f.Ft) 81 } 82 83 for _, fld := range fields.Fields() { 84 if !fld.IsSys() { 85 f, ok := dynoScheme.FieldsMap[fld.Name()] 86 require.True(ok) 87 require.Equal(DataKindToFieldType(fld.DataKind()), f.Ft) 88 } 89 } 90 } 91 92 appDef.Types( 93 func(typ appdef.IType) { 94 name := typ.QName() 95 if view, ok := typ.(appdef.IView); ok { 96 checkScheme(name, view.Key().PartKey(), schemes.ViewPartKeyScheme(name)) 97 checkScheme(name, view.Key().ClustCols(), schemes.ViewClustColsScheme(name)) 98 checkScheme(name, view.Value(), schemes.Scheme(name)) 99 return 100 } 101 if fld, ok := typ.(appdef.IFields); ok { 102 checkScheme(name, fld, schemes.Scheme(name)) 103 } 104 }) 105 }