github.com/ipld/go-ipld-prime@v0.21.0/node/tests/schemaStructReprTuple.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/schema"
    12  )
    13  
    14  func SchemaTestStructReprTuple(t *testing.T, engine Engine) {
    15  	ts := schema.TypeSystem{}
    16  	ts.Init()
    17  	ts.Accumulate(schema.SpawnString("String"))
    18  	ts.Accumulate(schema.SpawnStruct("OneTuple",
    19  		[]schema.StructField{
    20  			schema.SpawnStructField("field", "String", false, false),
    21  		},
    22  		schema.SpawnStructRepresentationTuple(),
    23  	))
    24  	ts.Accumulate(schema.SpawnStruct("FourTuple",
    25  		[]schema.StructField{
    26  			schema.SpawnStructField("foo", "String", false, false),
    27  			schema.SpawnStructField("bar", "String", false, true),
    28  			schema.SpawnStructField("baz", "String", true, true),
    29  			schema.SpawnStructField("qux", "String", true, false),
    30  		},
    31  		schema.SpawnStructRepresentationTuple(),
    32  	))
    33  	engine.Init(t, ts)
    34  
    35  	t.Run("onetuple works", func(t *testing.T) {
    36  		np := engine.PrototypeByName("OneTuple")
    37  		nrp := engine.PrototypeByName("OneTuple.Repr")
    38  		var n schema.TypedNode
    39  		t.Run("typed-create", func(t *testing.T) {
    40  			n = fluent.MustBuildMap(np, 1, func(ma fluent.MapAssembler) {
    41  				ma.AssembleEntry("field").AssignString("valoo")
    42  			}).(schema.TypedNode)
    43  			t.Run("typed-read", func(t *testing.T) {
    44  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
    45  				qt.Check(t, n.Length(), qt.Equals, int64(1))
    46  				qt.Check(t, must.String(must.Node(n.LookupByString("field"))), qt.Equals, "valoo")
    47  			})
    48  			t.Run("repr-read", func(t *testing.T) {
    49  				nr := n.Representation()
    50  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
    51  				qt.Check(t, nr.Length(), qt.Equals, int64(1))
    52  				qt.Check(t, must.String(must.Node(nr.LookupByIndex(0))), qt.Equals, "valoo")
    53  			})
    54  		})
    55  		t.Run("repr-create", func(t *testing.T) {
    56  			nr := fluent.MustBuildList(nrp, 1, func(la fluent.ListAssembler) {
    57  				la.AssembleValue().AssignString("valoo")
    58  			})
    59  			qt.Check(t, n, NodeContentEquals, nr)
    60  		})
    61  	})
    62  
    63  	t.Run("fourtuple works", func(t *testing.T) {
    64  		np := engine.PrototypeByName("FourTuple")
    65  		nrp := engine.PrototypeByName("FourTuple.Repr")
    66  		var n schema.TypedNode
    67  		t.Run("typed-create", func(t *testing.T) {
    68  			n = fluent.MustBuildMap(np, 4, func(ma fluent.MapAssembler) {
    69  				ma.AssembleEntry("foo").AssignString("0")
    70  				ma.AssembleEntry("bar").AssignString("1")
    71  				ma.AssembleEntry("baz").AssignString("2")
    72  				ma.AssembleEntry("qux").AssignString("3")
    73  			}).(schema.TypedNode)
    74  			t.Run("typed-read", func(t *testing.T) {
    75  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
    76  				qt.Check(t, n.Length(), qt.Equals, int64(4))
    77  				qt.Check(t, must.String(must.Node(n.LookupByString("foo"))), qt.Equals, "0")
    78  				qt.Check(t, must.String(must.Node(n.LookupByString("bar"))), qt.Equals, "1")
    79  				qt.Check(t, must.String(must.Node(n.LookupByString("baz"))), qt.Equals, "2")
    80  				qt.Check(t, must.String(must.Node(n.LookupByString("qux"))), qt.Equals, "3")
    81  			})
    82  			t.Run("repr-read", func(t *testing.T) {
    83  				nr := n.Representation()
    84  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
    85  				qt.Check(t, nr.Length(), qt.Equals, int64(4))
    86  				qt.Check(t, must.String(must.Node(nr.LookupByIndex(0))), qt.Equals, "0")
    87  				qt.Check(t, must.String(must.Node(nr.LookupByIndex(1))), qt.Equals, "1")
    88  				qt.Check(t, must.String(must.Node(nr.LookupByIndex(2))), qt.Equals, "2")
    89  				qt.Check(t, must.String(must.Node(nr.LookupByIndex(3))), qt.Equals, "3")
    90  			})
    91  		})
    92  		t.Run("repr-create", func(t *testing.T) {
    93  			nr := fluent.MustBuildList(nrp, 4, func(la fluent.ListAssembler) {
    94  				la.AssembleValue().AssignString("0")
    95  				la.AssembleValue().AssignString("1")
    96  				la.AssembleValue().AssignString("2")
    97  				la.AssembleValue().AssignString("3")
    98  			})
    99  			qt.Check(t, n, NodeContentEquals, nr)
   100  		})
   101  	})
   102  
   103  	t.Run("fourtuple with absents", func(t *testing.T) {
   104  		np := engine.PrototypeByName("FourTuple")
   105  		nrp := engine.PrototypeByName("FourTuple.Repr")
   106  		var n schema.TypedNode
   107  		t.Run("typed-create", func(t *testing.T) {
   108  			n = fluent.MustBuildMap(np, 2, func(ma fluent.MapAssembler) {
   109  				ma.AssembleEntry("foo").AssignString("0")
   110  				ma.AssembleEntry("bar").AssignNull()
   111  			}).(schema.TypedNode)
   112  			t.Run("typed-read", func(t *testing.T) {
   113  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
   114  				qt.Check(t, n.Length(), qt.Equals, int64(4))
   115  				qt.Check(t, must.String(must.Node(n.LookupByString("foo"))), qt.Equals, "0")
   116  				qt.Check(t, must.Node(n.LookupByString("bar")), qt.Equals, datamodel.Null)
   117  				qt.Check(t, must.Node(n.LookupByString("baz")), qt.Equals, datamodel.Absent)
   118  				qt.Check(t, must.Node(n.LookupByString("qux")), qt.Equals, datamodel.Absent)
   119  			})
   120  			t.Run("repr-read", func(t *testing.T) {
   121  				nr := n.Representation()
   122  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_List)
   123  				qt.Check(t, nr.Length(), qt.Equals, int64(2))
   124  				qt.Check(t, must.String(must.Node(nr.LookupByIndex(0))), qt.Equals, "0")
   125  				qt.Check(t, must.Node(nr.LookupByIndex(1)), qt.Equals, datamodel.Null)
   126  			})
   127  		})
   128  		t.Run("repr-create", func(t *testing.T) {
   129  			nr := fluent.MustBuildList(nrp, 4, func(la fluent.ListAssembler) {
   130  				la.AssembleValue().AssignString("0")
   131  				la.AssembleValue().AssignNull()
   132  			})
   133  			qt.Check(t, n, NodeContentEquals, nr)
   134  		})
   135  	})
   136  }