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  }