github.com/ipld/go-ipld-prime@v0.21.0/node/tests/schemaStructReprListpairs.go (about)

     1  package tests
     2  
     3  import (
     4  	"testing"
     5  
     6  	qt "github.com/frankban/quicktest"
     7  
     8  	"github.com/ipld/go-ipld-prime/datamodel"
     9  	"github.com/ipld/go-ipld-prime/fluent"
    10  	"github.com/ipld/go-ipld-prime/must"
    11  	"github.com/ipld/go-ipld-prime/node/basicnode"
    12  	"github.com/ipld/go-ipld-prime/schema"
    13  )
    14  
    15  func SchemaTestStructReprListPairs(t *testing.T, engine Engine) {
    16  	ts := schema.TypeSystem{}
    17  	ts.Init()
    18  	ts.Accumulate(schema.SpawnString("String"))
    19  	ts.Accumulate(schema.SpawnList("List__String", "String", false))
    20  	ts.Accumulate(schema.SpawnStruct("OneListPair",
    21  		[]schema.StructField{
    22  			schema.SpawnStructField("field", "String", false, false),
    23  		},
    24  		schema.SpawnStructRepresentationListPairs(),
    25  	))
    26  	ts.Accumulate(schema.SpawnStruct("FourListPairs",
    27  		[]schema.StructField{
    28  			schema.SpawnStructField("foo", "String", false, true),
    29  			schema.SpawnStructField("bar", "String", true, true),
    30  			schema.SpawnStructField("baz", "String", true, false),
    31  			schema.SpawnStructField("qux", "List__String", false, false),
    32  		},
    33  		schema.SpawnStructRepresentationListPairs(),
    34  	))
    35  	ts.Accumulate(schema.SpawnStruct("NestedListPairs",
    36  		[]schema.StructField{
    37  			schema.SpawnStructField("str", "String", false, false),
    38  			schema.SpawnStructField("lp", "OneListPair", false, false),
    39  		},
    40  		schema.SpawnStructRepresentationListPairs(),
    41  	))
    42  	engine.Init(t, ts)
    43  
    44  	t.Run("onelistpair works", func(t *testing.T) {
    45  		np := engine.PrototypeByName("OneListPair")
    46  		nrp := engine.PrototypeByName("OneListPair.Repr")
    47  		var n schema.TypedNode
    48  		t.Run("typed-create", func(t *testing.T) {
    49  			n = fluent.MustBuildMap(np, 1, func(ma fluent.MapAssembler) {
    50  				ma.AssembleEntry("field").AssignString("valoo")
    51  			}).(schema.TypedNode)
    52  			t.Run("typed-read", func(t *testing.T) {
    53  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
    54  				qt.Check(t, n.Length(), qt.Equals, int64(1))
    55  				qt.Check(t, must.String(must.Node(n.LookupByString("field"))), qt.Equals, "valoo")
    56  			})
    57  			t.Run("repr-read", func(t *testing.T) {
    58  				nr := n.Representation()
    59  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
    60  				qt.Check(t, nr.Length(), qt.Equals, int64(1))
    61  				kv := must.Node(nr.LookupByIndex(0))
    62  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
    63  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
    64  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "field")
    65  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(1))), qt.Equals, "valoo")
    66  			})
    67  		})
    68  		t.Run("repr-create", func(t *testing.T) {
    69  			nr := fluent.MustBuildList(nrp, 1, func(la fluent.ListAssembler) {
    70  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
    71  					la.AssembleValue().AssignString("field")
    72  					la.AssembleValue().AssignString("valoo")
    73  				})
    74  			})
    75  			qt.Check(t, n, NodeContentEquals, nr)
    76  		})
    77  	})
    78  
    79  	t.Run("fourlistpairs works", func(t *testing.T) {
    80  		np := engine.PrototypeByName("FourListPairs")
    81  		nrp := engine.PrototypeByName("FourListPairs.Repr")
    82  		var n schema.TypedNode
    83  		t.Run("typed-create", func(t *testing.T) {
    84  			n = fluent.MustBuildMap(np, 4, func(ma fluent.MapAssembler) {
    85  				ma.AssembleEntry("foo").AssignString("0")
    86  				ma.AssembleEntry("bar").AssignString("1")
    87  				ma.AssembleEntry("baz").AssignString("2")
    88  				ma.AssembleEntry("qux").CreateList(2, func(la fluent.ListAssembler) {
    89  					la.AssembleValue().AssignString("3")
    90  					la.AssembleValue().AssignString("4")
    91  				})
    92  			}).(schema.TypedNode)
    93  
    94  			t.Run("typed-read", func(t *testing.T) {
    95  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
    96  				qt.Check(t, n.Length(), qt.Equals, int64(4))
    97  				qt.Check(t, must.String(must.Node(n.LookupByString("foo"))), qt.Equals, "0")
    98  				qt.Check(t, must.String(must.Node(n.LookupByString("bar"))), qt.Equals, "1")
    99  				qt.Check(t, must.String(must.Node(n.LookupByString("baz"))), qt.Equals, "2")
   100  				qux := must.Node(n.LookupByString("qux"))
   101  				qt.Assert(t, qux.Kind(), qt.Equals, datamodel.Kind_List)
   102  				qt.Check(t, qux.Length(), qt.Equals, int64(2))
   103  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(0))), qt.Equals, "3")
   104  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(1))), qt.Equals, "4")
   105  			})
   106  			t.Run("repr-read", func(t *testing.T) {
   107  				nr := n.Representation()
   108  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   109  				qt.Check(t, nr.Length(), qt.Equals, int64(4))
   110  				kv := must.Node(nr.LookupByIndex(0))
   111  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   112  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   113  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "foo")
   114  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(1))), qt.Equals, "0")
   115  				kv = must.Node(nr.LookupByIndex(1))
   116  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   117  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   118  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "bar")
   119  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(1))), qt.Equals, "1")
   120  				kv = must.Node(nr.LookupByIndex(2))
   121  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   122  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   123  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "baz")
   124  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(1))), qt.Equals, "2")
   125  				kv = must.Node(nr.LookupByIndex(3))
   126  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   127  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   128  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "qux")
   129  				qux := must.Node(kv.LookupByIndex(1))
   130  				qt.Assert(t, qux.Kind(), qt.Equals, datamodel.Kind_List)
   131  				qt.Check(t, qux.Length(), qt.Equals, int64(2))
   132  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(0))), qt.Equals, "3")
   133  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(1))), qt.Equals, "4")
   134  			})
   135  		})
   136  		t.Run("repr-create", func(t *testing.T) {
   137  			nr := fluent.MustBuildList(nrp, 4, func(la fluent.ListAssembler) {
   138  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   139  					la.AssembleValue().AssignString("foo")
   140  					la.AssembleValue().AssignString("0")
   141  				})
   142  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   143  					la.AssembleValue().AssignString("bar")
   144  					la.AssembleValue().AssignString("1")
   145  				})
   146  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   147  					la.AssembleValue().AssignString("baz")
   148  					la.AssembleValue().AssignString("2")
   149  				})
   150  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   151  					la.AssembleValue().AssignString("qux")
   152  					la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   153  						la.AssembleValue().AssignString("3")
   154  						la.AssembleValue().AssignString("4")
   155  					})
   156  				})
   157  			})
   158  			qt.Check(t, n, NodeContentEquals, nr)
   159  		})
   160  		t.Run("repr-create out-of-order", func(t *testing.T) {
   161  			nr := fluent.MustBuildList(nrp, 4, func(la fluent.ListAssembler) {
   162  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   163  					la.AssembleValue().AssignString("bar")
   164  					la.AssembleValue().AssignString("1")
   165  				})
   166  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   167  					la.AssembleValue().AssignString("foo")
   168  					la.AssembleValue().AssignString("0")
   169  				})
   170  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   171  					la.AssembleValue().AssignString("qux")
   172  					la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   173  						la.AssembleValue().AssignString("3")
   174  						la.AssembleValue().AssignString("4")
   175  					})
   176  				})
   177  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   178  					la.AssembleValue().AssignString("baz")
   179  					la.AssembleValue().AssignString("2")
   180  				})
   181  			})
   182  			qt.Check(t, n, NodeContentEquals, nr)
   183  		})
   184  	})
   185  
   186  	t.Run("fourlistpairs with absents", func(t *testing.T) {
   187  		np := engine.PrototypeByName("FourListPairs")
   188  		nrp := engine.PrototypeByName("FourListPairs.Repr")
   189  		var n schema.TypedNode
   190  		t.Run("typed-create", func(t *testing.T) {
   191  			n = fluent.MustBuildMap(np, 2, func(ma fluent.MapAssembler) {
   192  				ma.AssembleEntry("foo").AssignNull()
   193  				ma.AssembleEntry("qux").CreateList(2, func(la fluent.ListAssembler) {
   194  					la.AssembleValue().AssignString("1")
   195  					la.AssembleValue().AssignString("2")
   196  				})
   197  			}).(schema.TypedNode)
   198  			t.Run("typed-read", func(t *testing.T) {
   199  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
   200  				qt.Check(t, n.Length(), qt.Equals, int64(4))
   201  				qt.Check(t, must.Node(n.LookupByString("foo")), qt.Equals, datamodel.Null)
   202  				qt.Check(t, must.Node(n.LookupByString("bar")), qt.Equals, datamodel.Absent)
   203  				qt.Check(t, must.Node(n.LookupByString("baz")), qt.Equals, datamodel.Absent)
   204  				qux := must.Node(n.LookupByString("qux"))
   205  				qt.Assert(t, qux.Kind(), qt.Equals, datamodel.Kind_List)
   206  				qt.Check(t, qux.Length(), qt.Equals, int64(2))
   207  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(0))), qt.Equals, "1")
   208  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(1))), qt.Equals, "2")
   209  			})
   210  			t.Run("repr-read", func(t *testing.T) {
   211  				nr := n.Representation()
   212  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   213  				qt.Check(t, nr.Length(), qt.Equals, int64(2))
   214  				kv := must.Node(nr.LookupByIndex(0))
   215  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   216  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   217  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "foo")
   218  				qt.Check(t, must.Node(kv.LookupByIndex(1)), qt.Equals, datamodel.Null)
   219  				kv = must.Node(nr.LookupByIndex(1))
   220  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   221  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   222  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "qux")
   223  				qux := must.Node(kv.LookupByIndex(1))
   224  				qt.Assert(t, qux.Kind(), qt.Equals, datamodel.Kind_List)
   225  				qt.Check(t, qux.Length(), qt.Equals, int64(2))
   226  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(0))), qt.Equals, "1")
   227  				qt.Check(t, must.String(must.Node(qux.LookupByIndex(1))), qt.Equals, "2")
   228  			})
   229  		})
   230  		t.Run("repr-create", func(t *testing.T) {
   231  			nr := fluent.MustBuildList(nrp, 2, func(la fluent.ListAssembler) {
   232  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   233  					la.AssembleValue().AssignString("foo")
   234  					la.AssembleValue().AssignNull()
   235  				})
   236  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   237  					la.AssembleValue().AssignString("qux")
   238  					la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   239  						la.AssembleValue().AssignString("1")
   240  						la.AssembleValue().AssignString("2")
   241  					})
   242  				})
   243  			})
   244  			qt.Check(t, n, NodeContentEquals, nr)
   245  		})
   246  		t.Run("repr-create with AssignNode", func(t *testing.T) {
   247  			nr := fluent.MustBuildList(basicnode.Prototype.Any, 2, func(la fluent.ListAssembler) {
   248  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   249  					la.AssembleValue().AssignString("foo")
   250  					la.AssembleValue().AssignNull()
   251  				})
   252  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   253  					la.AssembleValue().AssignString("qux")
   254  					la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   255  						la.AssembleValue().AssignString("1")
   256  						la.AssembleValue().AssignString("2")
   257  					})
   258  				})
   259  			})
   260  			builder := nrp.NewBuilder()
   261  			err := builder.AssignNode(nr)
   262  			qt.Assert(t, err, qt.IsNil)
   263  			anr := builder.Build()
   264  			qt.Check(t, n, NodeContentEquals, anr)
   265  		})
   266  	})
   267  
   268  	t.Run("nestedlistpairs works", func(t *testing.T) {
   269  		np := engine.PrototypeByName("NestedListPairs")
   270  		nrp := engine.PrototypeByName("NestedListPairs.Repr")
   271  		var n schema.TypedNode
   272  		t.Run("typed-create", func(t *testing.T) {
   273  			n = fluent.MustBuildMap(np, 1, func(ma fluent.MapAssembler) {
   274  				ma.AssembleEntry("str").AssignString("boop")
   275  				ma.AssembleEntry("lp").CreateMap(1, func(ma fluent.MapAssembler) {
   276  					ma.AssembleEntry("field").AssignString("valoo")
   277  				})
   278  			}).(schema.TypedNode)
   279  			t.Run("typed-read", func(t *testing.T) {
   280  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
   281  				qt.Check(t, n.Length(), qt.Equals, int64(2))
   282  				qt.Check(t, must.String(must.Node(n.LookupByString("str"))), qt.Equals, "boop")
   283  				lp := must.Node(n.LookupByString("lp"))
   284  				qt.Check(t, lp.Kind(), qt.Equals, datamodel.Kind_Map)
   285  				qt.Check(t, must.String(must.Node(lp.LookupByString("field"))), qt.Equals, "valoo")
   286  			})
   287  			t.Run("repr-read", func(t *testing.T) {
   288  				nr := n.Representation()
   289  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   290  				qt.Check(t, nr.Length(), qt.Equals, int64(2))
   291  				kv := must.Node(nr.LookupByIndex(0))
   292  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   293  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   294  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "str")
   295  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(1))), qt.Equals, "boop")
   296  				kv = must.Node(nr.LookupByIndex(1))
   297  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   298  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   299  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "lp")
   300  				lp := must.Node(kv.LookupByIndex(1))
   301  				qt.Check(t, lp.Kind(), qt.Equals, datamodel.Kind_List)
   302  				kv = must.Node(lp.LookupByIndex(0))
   303  				qt.Check(t, kv.Length(), qt.Equals, int64(2))
   304  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(0))), qt.Equals, "field")
   305  				qt.Check(t, must.String(must.Node(kv.LookupByIndex(1))), qt.Equals, "valoo")
   306  			})
   307  		})
   308  		t.Run("repr-create", func(t *testing.T) {
   309  			nr := fluent.MustBuildList(nrp, 1, func(la fluent.ListAssembler) {
   310  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   311  					la.AssembleValue().AssignString("str")
   312  					la.AssembleValue().AssignString("boop")
   313  				})
   314  				la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   315  					la.AssembleValue().AssignString("lp")
   316  					la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   317  						la.AssembleValue().CreateList(2, func(la fluent.ListAssembler) {
   318  							la.AssembleValue().AssignString("field")
   319  							la.AssembleValue().AssignString("valoo")
   320  						})
   321  					})
   322  				})
   323  			})
   324  			qt.Check(t, n, NodeContentEquals, nr)
   325  		})
   326  	})
   327  }