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 }