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