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 }