github.com/ipld/go-ipld-prime@v0.21.0/node/tests/schemaStructReprStringjoin.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  // TestStructReprStringjoin exercises... well, what it says on the tin.
    15  //
    16  // These should pass even if the natural map representation doesn't.
    17  // No maybes are exercised.
    18  func SchemaTestStructReprStringjoin(t *testing.T, engine Engine) {
    19  	ts := schema.TypeSystem{}
    20  	ts.Init()
    21  	ts.Accumulate(schema.SpawnString("String"))
    22  	ts.Accumulate(schema.SpawnStruct("StringyStruct",
    23  		[]schema.StructField{
    24  			schema.SpawnStructField("field", "String", false, false),
    25  		},
    26  		schema.SpawnStructRepresentationStringjoin(":"),
    27  	))
    28  	ts.Accumulate(schema.SpawnStruct("ManystringStruct",
    29  		[]schema.StructField{
    30  			schema.SpawnStructField("foo", "String", false, false),
    31  			schema.SpawnStructField("bar", "String", false, false),
    32  		},
    33  		schema.SpawnStructRepresentationStringjoin(":"),
    34  	))
    35  	ts.Accumulate(schema.SpawnStruct("Recurzorator",
    36  		[]schema.StructField{
    37  			schema.SpawnStructField("foo", "String", false, false),
    38  			schema.SpawnStructField("zap", "ManystringStruct", false, false),
    39  			schema.SpawnStructField("bar", "String", false, false),
    40  		},
    41  		schema.SpawnStructRepresentationStringjoin("-"),
    42  	))
    43  	engine.Init(t, ts)
    44  
    45  	t.Run("single field works", func(t *testing.T) {
    46  		np := engine.PrototypeByName("StringyStruct")
    47  		nrp := engine.PrototypeByName("StringyStruct.Repr")
    48  		var n schema.TypedNode
    49  		t.Run("typed-create", func(t *testing.T) {
    50  			n = fluent.MustBuildMap(np, 1, func(ma fluent.MapAssembler) {
    51  				ma.AssembleEntry("field").AssignString("valoo")
    52  			}).(schema.TypedNode)
    53  			t.Run("typed-read", func(t *testing.T) {
    54  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
    55  				qt.Check(t, n.Length(), qt.Equals, int64(1))
    56  				qt.Check(t, must.String(must.Node(n.LookupByString("field"))), qt.Equals, "valoo")
    57  			})
    58  			t.Run("repr-read", func(t *testing.T) {
    59  				nr := n.Representation()
    60  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_String)
    61  				qt.Check(t, must.String(nr), qt.Equals, "valoo")
    62  			})
    63  		})
    64  		t.Run("repr-create", func(t *testing.T) {
    65  			nr := fluent.MustBuild(nrp, func(na fluent.NodeAssembler) {
    66  				na.AssignString("valoo")
    67  			})
    68  			qt.Check(t, n, NodeContentEquals, nr)
    69  		})
    70  	})
    71  
    72  	t.Run("several fields work", func(t *testing.T) {
    73  		np := engine.PrototypeByName("ManystringStruct")
    74  		nrp := engine.PrototypeByName("ManystringStruct.Repr")
    75  		var n schema.TypedNode
    76  		t.Run("typed-create", func(t *testing.T) {
    77  			n = fluent.MustBuildMap(np, 2, func(ma fluent.MapAssembler) {
    78  				ma.AssembleEntry("foo").AssignString("v1")
    79  				ma.AssembleEntry("bar").AssignString("v2")
    80  			}).(schema.TypedNode)
    81  			t.Run("typed-read", func(t *testing.T) {
    82  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
    83  				qt.Check(t, n.Length(), qt.Equals, int64(2))
    84  				qt.Check(t, must.String(must.Node(n.LookupByString("foo"))), qt.Equals, "v1")
    85  				qt.Check(t, must.String(must.Node(n.LookupByString("bar"))), qt.Equals, "v2")
    86  			})
    87  			t.Run("repr-read", func(t *testing.T) {
    88  				nr := n.Representation()
    89  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_String)
    90  				qt.Check(t, must.String(nr), qt.Equals, "v1:v2")
    91  			})
    92  		})
    93  		t.Run("repr-create", func(t *testing.T) {
    94  			nr := fluent.MustBuild(nrp, func(na fluent.NodeAssembler) {
    95  				na.AssignString("v1:v2")
    96  			})
    97  			qt.Check(t, n, NodeContentEquals, nr)
    98  		})
    99  	})
   100  
   101  	t.Run("first field empty string works", func(t *testing.T) {
   102  		np := engine.PrototypeByName("ManystringStruct")
   103  		nrp := engine.PrototypeByName("ManystringStruct.Repr")
   104  		var n schema.TypedNode
   105  		t.Run("typed-create", func(t *testing.T) {
   106  			n = fluent.MustBuildMap(np, 2, func(ma fluent.MapAssembler) {
   107  				ma.AssembleEntry("foo").AssignString("")
   108  				ma.AssembleEntry("bar").AssignString("v2")
   109  			}).(schema.TypedNode)
   110  			t.Run("typed-read", func(t *testing.T) {
   111  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
   112  				qt.Check(t, n.Length(), qt.Equals, int64(2))
   113  				qt.Check(t, must.String(must.Node(n.LookupByString("foo"))), qt.Equals, "")
   114  				qt.Check(t, must.String(must.Node(n.LookupByString("bar"))), qt.Equals, "v2")
   115  			})
   116  			t.Run("repr-read", func(t *testing.T) {
   117  				nr := n.Representation()
   118  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_String)
   119  				qt.Check(t, must.String(nr), qt.Equals, ":v2") // Note the leading colon is still present.
   120  			})
   121  		})
   122  		t.Run("repr-create", func(t *testing.T) {
   123  			nr := fluent.MustBuild(nrp, func(na fluent.NodeAssembler) {
   124  				na.AssignString(":v2")
   125  			})
   126  			qt.Check(t, n, NodeContentEquals, nr)
   127  		})
   128  	})
   129  
   130  	t.Run("nested stringjoin structs work", func(t *testing.T) {
   131  		np := engine.PrototypeByName("Recurzorator")
   132  		nrp := engine.PrototypeByName("Recurzorator.Repr")
   133  		var n schema.TypedNode
   134  		t.Run("typed-create", func(t *testing.T) {
   135  			n = fluent.MustBuildMap(np, 3, func(ma fluent.MapAssembler) {
   136  				ma.AssembleEntry("foo").AssignString("v1")
   137  				ma.AssembleEntry("zap").CreateMap(2, func(ma fluent.MapAssembler) {
   138  					ma.AssembleEntry("foo").AssignString("v2")
   139  					ma.AssembleEntry("bar").AssignString("v3")
   140  				})
   141  				ma.AssembleEntry("bar").AssignString("v4")
   142  			}).(schema.TypedNode)
   143  			t.Run("typed-read", func(t *testing.T) {
   144  				qt.Assert(t, n.Kind(), qt.Equals, datamodel.Kind_Map)
   145  				qt.Check(t, n.Length(), qt.Equals, int64(3))
   146  				qt.Check(t, must.String(must.Node(n.LookupByString("foo"))), qt.Equals, "v1")
   147  				qt.Check(t, must.String(must.Node(n.LookupByString("bar"))), qt.Equals, "v4")
   148  				n2 := must.Node(n.LookupByString("zap"))
   149  				qt.Check(t, n2.Length(), qt.Equals, int64(2))
   150  				qt.Check(t, must.String(must.Node(n2.LookupByString("foo"))), qt.Equals, "v2")
   151  				qt.Check(t, must.String(must.Node(n2.LookupByString("bar"))), qt.Equals, "v3")
   152  			})
   153  			t.Run("repr-read", func(t *testing.T) {
   154  				nr := n.Representation()
   155  				qt.Assert(t, nr.Kind(), qt.Equals, datamodel.Kind_String)
   156  				qt.Check(t, must.String(nr), qt.Equals, "v1-v2:v3-v4")
   157  			})
   158  		})
   159  		t.Run("repr-create", func(t *testing.T) {
   160  			nr := fluent.MustBuild(nrp, func(na fluent.NodeAssembler) {
   161  				na.AssignString("v1-v2:v3-v4")
   162  			})
   163  			qt.Check(t, n, NodeContentEquals, nr)
   164  		})
   165  	})
   166  }