cddl 0.1.0 → 0.8.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/bin/cddl +80 -23
- data/cddl.gemspec +4 -2
- data/data/cddl.abnf +50 -20
- data/data/prelude.cddl +9 -3
- data/lib/cbor-pp-play.rb +13 -0
- data/lib/cbor-pp.rb +213 -0
- data/lib/cddl.rb +1001 -163
- data/test/test-cddl.rb +1620 -93
- data/test-data/7071-concise-cut.cddl +48 -0
- data/test-data/7071-concise.cddl +1 -1
- data/test-data/7071-verbose.cddl +1 -1
- data/test-data/a.cddl +9 -0
- data/test-data/ambig.cddl +2 -0
- data/test-data/b.cddl +3 -0
- data/test-data/badaddr.cddl +1 -0
- data/test-data/basic_syntax_example.cddl +7 -0
- data/test-data/cdni-ct.cddl +72 -0
- data/test-data/cose.cddl +68 -0
- data/test-data/dcaf.cddl +58 -0
- data/test-data/dcaf1.cddl +48 -0
- data/test-data/dotsize.cddl +7 -0
- data/test-data/extractor-demo.cddl +14 -0
- data/test-data/grasp-01-extract.cddl +91 -0
- data/test-data/grasp-01-test.cddl +90 -0
- data/test-data/grasp-01.cddl +90 -0
- data/test-data/grasp-09.cddl +108 -0
- data/test-data/grasp-v1.cddl +97 -0
- data/test-data/grasp-v2X.cddl +89 -0
- data/test-data/ifmap-base-2.0v17.cddl +392 -0
- data/test-data/ifmap-base-2.2v9_fh-cabo.cddl +149 -0
- data/test-data/ifmap-metadata-2.2v9_fh-cabo.cddl +239 -0
- data/test-data/ifmap2.cddl +21 -0
- data/test-data/jcr-ex.cddl +42 -0
- data/test-data/kevin5.cddl +5 -0
- data/test-data/map-group.cddl +13 -0
- data/test-data/mapkey.cddl +2 -0
- data/test-data/minimal.cddl +1 -0
- data/test-data/patch1.cddl +13 -0
- data/test-data/reused_named_group.cddl +14 -0
- data/test-data/structure.cddl +9 -0
- data/test-data/toerless0.cddl +14 -0
- data/test-data/toerless1.cddl +11 -0
- data/test-data/two_anonymous_groups.cddl +13 -0
- data/test-data/wrong1.cddl +17 -0
- data/test-data/wrong1a.cddl +23 -0
- data/test-data/wrong2.cddl +17 -0
- data/test-data/wrong2a.cddl +17 -0
- data/test-data/xmlmig.cddl +15 -0
- metadata +72 -5
data/test/test-cddl.rb
CHANGED
|
@@ -5,7 +5,15 @@ require 'cbor-pretty.rb'
|
|
|
5
5
|
require 'cbor-diagnostic.rb'
|
|
6
6
|
|
|
7
7
|
require_relative '../lib/cddl'
|
|
8
|
+
require_relative '../lib/cbor-pp'
|
|
8
9
|
|
|
10
|
+
module CDDL
|
|
11
|
+
class Parser
|
|
12
|
+
def validate_for_test(d, warn = true)
|
|
13
|
+
validate(d, warn) && validate(d.cbor_clone, warn)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
9
17
|
|
|
10
18
|
class TestABNF < Test::Unit::TestCase
|
|
11
19
|
|
|
@@ -13,27 +21,27 @@ class TestABNF < Test::Unit::TestCase
|
|
|
13
21
|
|
|
14
22
|
EXPECTED_RULES = [:type1,
|
|
15
23
|
[:map,
|
|
16
|
-
[:member, 1, 1, [:
|
|
24
|
+
[:member, 1, 1, [:text, "application"], [:prim, 3]],
|
|
17
25
|
[:member,
|
|
18
26
|
1,
|
|
19
27
|
1,
|
|
20
|
-
[:
|
|
28
|
+
[:text, "reputons"],
|
|
21
29
|
[:array,
|
|
22
30
|
[:member,
|
|
23
31
|
0,
|
|
24
|
-
|
|
32
|
+
CDDL::MANY,
|
|
25
33
|
nil,
|
|
26
34
|
[:map,
|
|
27
|
-
[:member, 1, 1, [:
|
|
28
|
-
[:member, 1, 1, [:
|
|
29
|
-
[:member, 1, 1, [:
|
|
30
|
-
[:member, 1, 1, [:
|
|
31
|
-
[:member, 0, 1, [:
|
|
32
|
-
[:member, 0, 1, [:
|
|
33
|
-
[:member, 0, 1, [:
|
|
34
|
-
[:member, 0, 1, [:
|
|
35
|
-
[:member, 0, 1, [:
|
|
36
|
-
[:member, 0,
|
|
35
|
+
[:member, 1, 1, [:text, "rater"], [:prim, 3]],
|
|
36
|
+
[:member, 1, 1, [:text, "assertion"], [:prim, 3]],
|
|
37
|
+
[:member, 1, 1, [:text, "rated"], [:prim, 3]],
|
|
38
|
+
[:member, 1, 1, [:text, "rating"], [:prim, 7, 25]],
|
|
39
|
+
[:member, 0, 1, [:text, "confidence"], [:prim, 7, 25]],
|
|
40
|
+
[:member, 0, 1, [:text, "normal-rating"], [:prim, 7, 25]],
|
|
41
|
+
[:member, 0, 1, [:text, "sample-size"], [:prim, 0]],
|
|
42
|
+
[:member, 0, 1, [:text, "generated"], [:prim, 0]],
|
|
43
|
+
[:member, 0, 1, [:text, "expires"], [:prim, 0]],
|
|
44
|
+
[:member, 0, CDDL::MANY, [:prim, 3], [:prim]]]]]]]]
|
|
37
45
|
|
|
38
46
|
def test_aa_rfc7071_concise
|
|
39
47
|
parser1 = CDDL::Parser.new(File.read("#{TEST_DATA_DIR}/7071-concise.cddl"))
|
|
@@ -49,16 +57,103 @@ class TestABNF < Test::Unit::TestCase
|
|
|
49
57
|
end
|
|
50
58
|
end
|
|
51
59
|
|
|
60
|
+
def test_generate_hex_bin
|
|
61
|
+
parser = CDDL::Parser.new <<HERE
|
|
62
|
+
test = [0x4711, 0xabcDEF, 0b1011001110001111000]
|
|
63
|
+
HERE
|
|
64
|
+
assert_equal [0x4711, 0xabcDEF, 0b1011001110001111000], parser.generate
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_generate_le
|
|
68
|
+
parser = CDDL::Parser.new <<HERE
|
|
69
|
+
test = uint .le 10
|
|
70
|
+
HERE
|
|
71
|
+
g = parser.generate
|
|
72
|
+
p [:GLE, g]
|
|
73
|
+
assert((0..10) === g)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_generate_ne
|
|
77
|
+
parser = CDDL::Parser.new <<HERE
|
|
78
|
+
test = uint .ne 10
|
|
79
|
+
HERE
|
|
80
|
+
g = parser.generate
|
|
81
|
+
p [:GNE, g]
|
|
82
|
+
assert_not_equal 10, g
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_validate_person_occurs
|
|
86
|
+
person = <<HERE
|
|
87
|
+
person = (
|
|
88
|
+
name: tstr,
|
|
89
|
+
age: uint,
|
|
90
|
+
)
|
|
91
|
+
HERE
|
|
92
|
+
parser1 = CDDL::Parser.new "unlimitedpersons = [* person ]" + person
|
|
93
|
+
parser2 = CDDL::Parser.new "oneortwoPerson = [1*2 person ]" + person
|
|
94
|
+
parser3 = CDDL::Parser.new "min2Person = [2* person ]" + person
|
|
95
|
+
|
|
96
|
+
assert parser1.validate_for_test([])
|
|
97
|
+
refute parser2.validate_for_test([], false)
|
|
98
|
+
refute parser3.validate_for_test([], false)
|
|
99
|
+
assert parser1.validate_for_test(["Methuselah", 969])
|
|
100
|
+
assert parser2.validate_for_test(["Methuselah", 969])
|
|
101
|
+
refute parser3.validate_for_test(["Methuselah", 969], false)
|
|
102
|
+
assert parser1.validate_for_test(["Methuselah", 969, "Methuselah", 969])
|
|
103
|
+
assert parser2.validate_for_test(["Methuselah", 969, "Methuselah", 969])
|
|
104
|
+
assert parser3.validate_for_test(["Methuselah", 969, "Methuselah", 969])
|
|
105
|
+
assert parser1.validate_for_test(["Methuselah", 969, "Methuselah", 969, "Methuselah", 969])
|
|
106
|
+
refute parser2.validate_for_test(["Methuselah", 969, "Methuselah", 969, "Methuselah", 969], false)
|
|
107
|
+
assert parser3.validate_for_test(["Methuselah", 969, "Methuselah", 969, "Methuselah", 969])
|
|
108
|
+
refute parser1.validate_for_test(["Methuselah", "Methuselah", 969, 969], false)
|
|
109
|
+
refute parser2.validate_for_test(["Methuselah", "Methuselah", 969, 969], false)
|
|
110
|
+
refute parser3.validate_for_test(["Methuselah", "Methuselah", 969, 969], false)
|
|
111
|
+
refute parser1.validate_for_test(["Methuselah", "Methuselah", "Methuselah", 969, 969], false)
|
|
112
|
+
refute parser2.validate_for_test(["Methuselah", "Methuselah", "Methuselah", 969, 969], false)
|
|
113
|
+
refute parser3.validate_for_test(["Methuselah", "Methuselah", "Methuselah", 969, 969], false)
|
|
114
|
+
end
|
|
115
|
+
|
|
52
116
|
def test_validate
|
|
53
117
|
parser1 = CDDL::Parser.new(File.read("test-data/7071-concise.cddl"))
|
|
54
118
|
g = parser1.generate
|
|
55
119
|
pp g
|
|
56
|
-
assert parser1.
|
|
120
|
+
assert parser1.validate_for_test(g)
|
|
57
121
|
old = g["application"]
|
|
58
122
|
g["application"] = 4711
|
|
59
|
-
refute parser1.
|
|
123
|
+
refute parser1.validate_for_test(g, false)
|
|
60
124
|
g["application"] = old
|
|
61
125
|
g["reputons"] << 5712
|
|
126
|
+
refute parser1.validate_for_test(g, false)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_aaaaaaa_cbor_clone_hash
|
|
130
|
+
a = "x".cbor_clone
|
|
131
|
+
b = {a => 1}
|
|
132
|
+
assert_equal 1, b[a]
|
|
133
|
+
assert_equal 1, b["x".cbor_clone]
|
|
134
|
+
assert_equal 1, b["x"]
|
|
135
|
+
assert_equal 1, b.fetch("x".cbor_clone, :not_found)
|
|
136
|
+
assert_equal 1, b.fetch("x", :not_found)
|
|
137
|
+
b = {"x" => 1}.cbor_clone
|
|
138
|
+
assert_equal 1, b["x"]
|
|
139
|
+
assert_equal 1, b["x".cbor_clone]
|
|
140
|
+
assert_equal 1, b[a]
|
|
141
|
+
assert_equal 1, b.fetch("x".cbor_clone, :not_found)
|
|
142
|
+
assert_equal 1, b.fetch("x", :not_found)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def test_aaaaa_validate_clone
|
|
146
|
+
parser1 = CDDL::Parser.new(File.read("test-data/7071-concise.cddl"))
|
|
147
|
+
g = parser1.generate
|
|
148
|
+
pp g
|
|
149
|
+
g = g.cbor_clone
|
|
150
|
+
|
|
151
|
+
assert parser1.validate(g)
|
|
152
|
+
old = g["application"]
|
|
153
|
+
g["application"] = 4711.cbor_clone
|
|
154
|
+
refute parser1.validate(g, false)
|
|
155
|
+
g["application"] = old
|
|
156
|
+
g["reputons"] << 5712.cbor_clone
|
|
62
157
|
refute parser1.validate(g, false)
|
|
63
158
|
end
|
|
64
159
|
|
|
@@ -66,43 +161,118 @@ class TestABNF < Test::Unit::TestCase
|
|
|
66
161
|
parser = CDDL::Parser.new <<HERE
|
|
67
162
|
test = 1
|
|
68
163
|
HERE
|
|
69
|
-
assert parser.
|
|
164
|
+
assert parser.validate_for_test(1)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_aaaaaa_validate_true
|
|
168
|
+
parser = CDDL::Parser.new <<HERE
|
|
169
|
+
test = true
|
|
170
|
+
HERE
|
|
171
|
+
assert parser.validate_for_test(true)
|
|
70
172
|
end
|
|
71
173
|
|
|
72
174
|
def test_validate_a
|
|
73
175
|
parser = CDDL::Parser.new <<HERE
|
|
74
176
|
test = [* one: 1]
|
|
75
177
|
HERE
|
|
76
|
-
assert parser.
|
|
77
|
-
assert parser.
|
|
78
|
-
assert parser.
|
|
79
|
-
refute parser.
|
|
80
|
-
refute parser.
|
|
178
|
+
assert parser.validate_for_test([])
|
|
179
|
+
assert parser.validate_for_test([1])
|
|
180
|
+
assert parser.validate_for_test([1, 1])
|
|
181
|
+
refute parser.validate_for_test([1, 2], false)
|
|
182
|
+
refute parser.validate_for_test([2, 1], false)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def test_validate_a_map
|
|
186
|
+
parser = CDDL::Parser.new <<HERE
|
|
187
|
+
test = {* one: 1}
|
|
188
|
+
HERE
|
|
189
|
+
assert parser.validate_for_test({})
|
|
190
|
+
assert parser.validate_for_test({"one" => 1})
|
|
191
|
+
refute parser.validate_for_test({"one" => 2}, false)
|
|
192
|
+
refute parser.validate_for_test({"two" => 1}, false)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_validate_a_group_map
|
|
196
|
+
parser = CDDL::Parser.new <<HERE
|
|
197
|
+
test = {* (text => 1)}
|
|
198
|
+
HERE
|
|
199
|
+
assert parser.validate_for_test({})
|
|
200
|
+
assert parser.validate_for_test({"one" => 1})
|
|
201
|
+
refute parser.validate_for_test({"one" => 2}, false)
|
|
202
|
+
assert parser.validate_for_test({"one" => 1, "two" => 1}, false)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def test_validate_a_nontrivial_group_map
|
|
206
|
+
parser = CDDL::Parser.new <<HERE
|
|
207
|
+
test = {* (text => 1, text => 2)}
|
|
208
|
+
HERE
|
|
209
|
+
assert parser.validate_for_test({})
|
|
210
|
+
assert parser.validate_for_test({"one" => 2, "two" => 1})
|
|
211
|
+
assert parser.validate_for_test({"one" => 1, "two" => 2})
|
|
212
|
+
refute parser.validate_for_test({"one" => 1}, false)
|
|
213
|
+
assert parser.validate_for_test({"one" => 1, "two" => 2, "uno" => 1, "due" => 2})
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def test_murray
|
|
218
|
+
parser = CDDL::Parser.new <<HERE
|
|
219
|
+
a = {
|
|
220
|
+
b
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
b = (
|
|
224
|
+
(x: int // y: int), z: int
|
|
225
|
+
)
|
|
226
|
+
HERE
|
|
227
|
+
assert parser.validate_for_test({})
|
|
228
|
+
assert parser.validate_for_test({"x" => 2, "z" => 1})
|
|
229
|
+
assert parser.validate_for_test({"y" => 1, "z" => 2})
|
|
230
|
+
refute parser.validate_for_test({"z" => 1}, false)
|
|
231
|
+
assert parser.validate_for_test({"one" => 1, "two" => 2, "uno" => 1, "due" => 2})
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def test_murray_workaround
|
|
236
|
+
parser = CDDL::Parser.new <<HERE
|
|
237
|
+
a = {
|
|
238
|
+
b
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
b = ( z: int
|
|
242
|
+
(x: int // y: int)
|
|
243
|
+
)
|
|
244
|
+
HERE
|
|
245
|
+
assert parser.validate_for_test({})
|
|
246
|
+
assert parser.validate_for_test({"x" => 2, "z" => 1})
|
|
247
|
+
assert parser.validate_for_test({"y" => 1, "z" => 2})
|
|
248
|
+
refute parser.validate_for_test({"z" => 1}, false)
|
|
249
|
+
assert parser.validate_for_test({"one" => 1, "two" => 2, "uno" => 1, "due" => 2})
|
|
81
250
|
end
|
|
82
251
|
|
|
252
|
+
|
|
83
253
|
def test_validate_a_string
|
|
84
254
|
parser = CDDL::Parser.new <<HERE
|
|
85
255
|
test = [* one: "one"]
|
|
86
256
|
HERE
|
|
87
|
-
assert parser.
|
|
88
|
-
assert parser.
|
|
89
|
-
assert parser.
|
|
90
|
-
refute parser.
|
|
91
|
-
refute parser.
|
|
92
|
-
refute parser.
|
|
257
|
+
assert parser.validate_for_test([])
|
|
258
|
+
assert parser.validate_for_test(["one"])
|
|
259
|
+
assert parser.validate_for_test(["one", "one"])
|
|
260
|
+
refute parser.validate_for_test([1], false)
|
|
261
|
+
refute parser.validate_for_test(['two'], false)
|
|
262
|
+
refute parser.validate_for_test(["one", "two"], false)
|
|
93
263
|
end
|
|
94
264
|
|
|
95
265
|
|
|
96
266
|
def test_validate_a_string_string
|
|
97
267
|
parser = CDDL::Parser.new <<HERE
|
|
98
|
-
test = [* "two"
|
|
268
|
+
test = [* "two" => "one"]
|
|
99
269
|
HERE
|
|
100
|
-
assert parser.
|
|
101
|
-
assert parser.
|
|
102
|
-
assert parser.
|
|
103
|
-
refute parser.
|
|
104
|
-
refute parser.
|
|
105
|
-
refute parser.
|
|
270
|
+
assert parser.validate_for_test([])
|
|
271
|
+
assert parser.validate_for_test(["one"])
|
|
272
|
+
assert parser.validate_for_test(["one", "one"])
|
|
273
|
+
refute parser.validate_for_test([1], false)
|
|
274
|
+
refute parser.validate_for_test(['two'], false)
|
|
275
|
+
refute parser.validate_for_test(["one", "two"], false)
|
|
106
276
|
end
|
|
107
277
|
|
|
108
278
|
def test_validate_a_once
|
|
@@ -114,11 +284,11 @@ HERE
|
|
|
114
284
|
# pp parser.rules
|
|
115
285
|
# puts "APR:"
|
|
116
286
|
# pp parser.apr
|
|
117
|
-
refute parser.
|
|
118
|
-
assert parser.
|
|
119
|
-
refute parser.
|
|
120
|
-
refute parser.
|
|
121
|
-
refute parser.
|
|
287
|
+
refute parser.validate_for_test([], false)
|
|
288
|
+
assert parser.validate_for_test([1])
|
|
289
|
+
refute parser.validate_for_test([1, 1], false)
|
|
290
|
+
refute parser.validate_for_test([1, 2], false)
|
|
291
|
+
refute parser.validate_for_test([2, 1], false)
|
|
122
292
|
end
|
|
123
293
|
|
|
124
294
|
def test_validate_unknown_key
|
|
@@ -146,13 +316,13 @@ HERE
|
|
|
146
316
|
# puts "APR:"
|
|
147
317
|
# pp parser.apr
|
|
148
318
|
assert_equal [1, 2], parser.generate()
|
|
149
|
-
refute parser.
|
|
150
|
-
refute parser.
|
|
151
|
-
refute parser.
|
|
152
|
-
assert parser.
|
|
319
|
+
refute parser.validate_for_test({}, false)
|
|
320
|
+
refute parser.validate_for_test([], false)
|
|
321
|
+
refute parser.validate_for_test([1], false)
|
|
322
|
+
assert parser.validate_for_test([1, 2])
|
|
153
323
|
end
|
|
154
324
|
|
|
155
|
-
|
|
325
|
+
|
|
156
326
|
def test_validate_not_unknown_key_paren
|
|
157
327
|
# $debug_ast = true
|
|
158
328
|
parser = CDDL::Parser.new <<HERE
|
|
@@ -163,10 +333,10 @@ HERE
|
|
|
163
333
|
# puts "APR:"
|
|
164
334
|
# pp parser.apr
|
|
165
335
|
assert_equal [1, 2], parser.generate()
|
|
166
|
-
refute parser.
|
|
167
|
-
refute parser.
|
|
168
|
-
refute parser.
|
|
169
|
-
assert parser.
|
|
336
|
+
refute parser.validate_for_test({}, false)
|
|
337
|
+
refute parser.validate_for_test([], false)
|
|
338
|
+
refute parser.validate_for_test([1], false)
|
|
339
|
+
assert parser.validate_for_test([1, 2])
|
|
170
340
|
end
|
|
171
341
|
|
|
172
342
|
|
|
@@ -180,12 +350,12 @@ HERE
|
|
|
180
350
|
# pp parser.rules
|
|
181
351
|
# puts "APR:"
|
|
182
352
|
# pp parser.apr
|
|
183
|
-
assert parser.
|
|
184
|
-
assert parser.
|
|
185
|
-
assert parser.
|
|
186
|
-
refute parser.
|
|
187
|
-
|
|
188
|
-
refute parser.
|
|
353
|
+
assert parser.validate_for_test([])
|
|
354
|
+
assert parser.validate_for_test([1, 2])
|
|
355
|
+
assert parser.validate_for_test([1, 2, 1, 2])
|
|
356
|
+
refute parser.validate_for_test([1, 1, 2, 2], false)
|
|
357
|
+
refute parser.validate_for_test([1], false)
|
|
358
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
189
359
|
end
|
|
190
360
|
|
|
191
361
|
def test_validate_occur1 # XXX need indirection for now
|
|
@@ -198,13 +368,13 @@ HERE
|
|
|
198
368
|
# pp parser.rules
|
|
199
369
|
# puts "APR:"
|
|
200
370
|
# pp parser.apr
|
|
201
|
-
refute parser.
|
|
202
|
-
refute parser.
|
|
203
|
-
assert parser.
|
|
204
|
-
refute parser.
|
|
205
|
-
refute parser.
|
|
206
|
-
refute parser.
|
|
207
|
-
refute parser.
|
|
371
|
+
refute parser.validate_for_test([], false)
|
|
372
|
+
refute parser.validate_for_test([1], false)
|
|
373
|
+
assert parser.validate_for_test([1, 2])
|
|
374
|
+
refute parser.validate_for_test([2, 1], false)
|
|
375
|
+
refute parser.validate_for_test([1, 1, 2, 2], false)
|
|
376
|
+
refute parser.validate_for_test([1, 2, 1, 2], false)
|
|
377
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
208
378
|
end
|
|
209
379
|
|
|
210
380
|
def test_validate_occur01 # XXX need indirection for now
|
|
@@ -217,13 +387,13 @@ HERE
|
|
|
217
387
|
# pp parser.rules
|
|
218
388
|
# puts "APR:"
|
|
219
389
|
# pp parser.apr
|
|
220
|
-
assert parser.
|
|
221
|
-
|
|
222
|
-
assert parser.
|
|
223
|
-
refute parser.
|
|
224
|
-
refute parser.
|
|
225
|
-
refute parser.
|
|
226
|
-
refute parser.
|
|
390
|
+
assert parser.validate_for_test([])
|
|
391
|
+
refute parser.validate_for_test([1], false)
|
|
392
|
+
assert parser.validate_for_test([1, 2])
|
|
393
|
+
refute parser.validate_for_test([2, 1], false)
|
|
394
|
+
refute parser.validate_for_test([1, 1, 2, 2], false)
|
|
395
|
+
refute parser.validate_for_test([1, 2, 1, 2], false)
|
|
396
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
227
397
|
end
|
|
228
398
|
|
|
229
399
|
def test_validate_occur1n # XXX need indirection for now
|
|
@@ -236,13 +406,13 @@ HERE
|
|
|
236
406
|
# pp parser.rules
|
|
237
407
|
# puts "APR:"
|
|
238
408
|
# pp parser.apr
|
|
239
|
-
refute parser.
|
|
240
|
-
refute parser.
|
|
241
|
-
assert parser.
|
|
242
|
-
refute parser.
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
refute parser.
|
|
409
|
+
refute parser.validate_for_test([], false)
|
|
410
|
+
refute parser.validate_for_test([1], false)
|
|
411
|
+
assert parser.validate_for_test([1, 2])
|
|
412
|
+
refute parser.validate_for_test([2, 1], false)
|
|
413
|
+
refute parser.validate_for_test([1, 1, 2, 2], false)
|
|
414
|
+
assert parser.validate_for_test([1, 2, 1, 2])
|
|
415
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
246
416
|
end
|
|
247
417
|
|
|
248
418
|
def test_validate_occur0n # XXX need indirection for now
|
|
@@ -255,16 +425,16 @@ HERE
|
|
|
255
425
|
# pp parser.rules
|
|
256
426
|
# puts "APR:"
|
|
257
427
|
# pp parser.apr
|
|
258
|
-
assert parser.
|
|
259
|
-
|
|
260
|
-
assert parser.
|
|
261
|
-
refute parser.
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
refute parser.
|
|
428
|
+
assert parser.validate_for_test([])
|
|
429
|
+
refute parser.validate_for_test([1], false)
|
|
430
|
+
assert parser.validate_for_test([1, 2])
|
|
431
|
+
refute parser.validate_for_test([2, 1], false)
|
|
432
|
+
refute parser.validate_for_test([1, 1, 2, 2], false)
|
|
433
|
+
assert parser.validate_for_test([1, 2, 1, 2])
|
|
434
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
265
435
|
end
|
|
266
436
|
|
|
267
|
-
|
|
437
|
+
|
|
268
438
|
def test_validate_occur23 # XXX need indirection for now
|
|
269
439
|
# $debug_ast = true
|
|
270
440
|
parser = CDDL::Parser.new <<HERE
|
|
@@ -275,17 +445,1374 @@ HERE
|
|
|
275
445
|
# pp parser.rules
|
|
276
446
|
# puts "APR:"
|
|
277
447
|
# pp parser.apr
|
|
448
|
+
assert_includes [[1, 2, 1, 2], [1, 2, 1, 2, 1, 2]], parser.generate
|
|
449
|
+
refute parser.validate_for_test([], false)
|
|
450
|
+
refute parser.validate_for_test([1], false)
|
|
451
|
+
refute parser.validate_for_test([1, 2], false)
|
|
452
|
+
refute parser.validate_for_test([2, 1], false)
|
|
453
|
+
assert parser.validate_for_test([1, 2, 1, 2])
|
|
454
|
+
assert parser.validate_for_test([1, 2, 1, 2, 1, 2])
|
|
455
|
+
refute parser.validate_for_test([1, 2, 1, 2, 1, 2, 1, 2], false)
|
|
456
|
+
refute parser.validate_for_test([1, 1, 2, 2, 2], false)
|
|
457
|
+
refute parser.validate_for_test([1, 1, 1, 2, 2, 2], false)
|
|
458
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def test_validate_occur12plus1 # XXX need indirection for now
|
|
463
|
+
# $debug_ast = true
|
|
464
|
+
parser = CDDL::Parser.new <<HERE
|
|
465
|
+
test = [1*2 test1 1*1 test1]
|
|
466
|
+
test1 = (one: 1, two: 2)
|
|
467
|
+
HERE
|
|
468
|
+
# puts "RULES:"
|
|
469
|
+
# pp parser.rules
|
|
470
|
+
# puts "APR:"
|
|
471
|
+
# pp parser.apr
|
|
472
|
+
assert_includes [[1, 2, 1, 2], [1, 2, 1, 2, 1, 2]], parser.generate
|
|
473
|
+
refute parser.validate_for_test([], false)
|
|
474
|
+
refute parser.validate_for_test([1], false)
|
|
475
|
+
refute parser.validate_for_test([1, 2], false)
|
|
476
|
+
refute parser.validate_for_test([2, 1], false)
|
|
477
|
+
refute parser.validate_for_test([1, 2, 1, 2], false) # !!! PEG semantics gets us here
|
|
478
|
+
assert parser.validate_for_test([1, 2, 1, 2, 1, 2])
|
|
479
|
+
refute parser.validate_for_test([1, 2, 1, 2, 1, 2, 1, 2], false)
|
|
480
|
+
refute parser.validate_for_test([1, 1, 2, 2, 2], false)
|
|
481
|
+
refute parser.validate_for_test([1, 1, 1, 2, 2, 2], false)
|
|
482
|
+
refute parser.validate_for_test([1, 2, 1], false)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def test_generate_occur2 # XXX need indirection for now
|
|
487
|
+
parser = CDDL::Parser.new <<HERE
|
|
488
|
+
test = [2*2 test1 1*1 test1]
|
|
489
|
+
test1 = (one: 1, two: 2)
|
|
490
|
+
HERE
|
|
491
|
+
assert_equal [1, 2, 1, 2, 1, 2], parser.generate
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def test_generate_occur3 # XXX need indirection for now
|
|
495
|
+
parser = CDDL::Parser.new <<HERE
|
|
496
|
+
test = [5*5 "foo"]
|
|
497
|
+
HERE
|
|
498
|
+
assert_equal Array.new(5, "foo"), parser.generate
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
def test_basic_string # XXX need indirection for now
|
|
502
|
+
parser = CDDL::Parser.new <<HERE
|
|
503
|
+
test = "foo"
|
|
504
|
+
HERE
|
|
505
|
+
assert_equal "foo", parser.generate
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
def test_simple_alternative
|
|
510
|
+
parser = CDDL::Parser.new <<HERE
|
|
511
|
+
test = {
|
|
512
|
+
foo: 1
|
|
513
|
+
bar: 1 / 2
|
|
514
|
+
baz: 3
|
|
515
|
+
bee: 4
|
|
516
|
+
}
|
|
517
|
+
HERE
|
|
518
|
+
# pp parser.rules
|
|
519
|
+
expected1 = {'foo' => 1, 'bar' => 1, 'baz' => 3, 'bee' => 4}
|
|
520
|
+
expected2 = {'foo' => 1, 'bar' => 2, 'baz' => 3, 'bee' => 4}
|
|
521
|
+
10.times {
|
|
522
|
+
g = parser.generate
|
|
523
|
+
# pp g
|
|
524
|
+
assert expected1 == g || expected2 == g
|
|
525
|
+
assert parser.validate_for_test(g)
|
|
526
|
+
}
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
def test_another_simple_alternative
|
|
530
|
+
parser = CDDL::Parser.new <<HERE
|
|
531
|
+
test = {
|
|
532
|
+
bar: int / true
|
|
533
|
+
}
|
|
534
|
+
HERE
|
|
535
|
+
# pp parser.rules
|
|
536
|
+
10.times {
|
|
537
|
+
g = parser.generate
|
|
538
|
+
# pp ["tasa", g]
|
|
539
|
+
bar = g['bar']
|
|
540
|
+
assert bar == true || Integer(bar)
|
|
541
|
+
assert parser.validate_for_test(g)
|
|
542
|
+
}
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
def test_another_simple_alternative_group
|
|
546
|
+
parser = CDDL::Parser.new <<HERE
|
|
547
|
+
test = {
|
|
548
|
+
bar: int // bar: true
|
|
549
|
+
}
|
|
550
|
+
HERE
|
|
551
|
+
# pp parser.rules
|
|
552
|
+
10.times {
|
|
553
|
+
g = parser.generate
|
|
554
|
+
# pp ["tasag", g]
|
|
555
|
+
bar = g['bar']
|
|
556
|
+
assert bar == true || Integer(bar)
|
|
557
|
+
assert parser.validate_for_test(g)
|
|
558
|
+
refute parser.validate_for_test(g.merge(foo: 3), false)
|
|
559
|
+
refute parser.validate_for_test(g.merge(bar: "baz"), false)
|
|
560
|
+
}
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
def test_another_simple_alternative_group_occur
|
|
564
|
+
parser = CDDL::Parser.new <<HERE
|
|
565
|
+
test = {
|
|
566
|
+
?(bar: int // bar: true)
|
|
567
|
+
}
|
|
568
|
+
HERE
|
|
569
|
+
# pp parser.rules
|
|
570
|
+
parser.validate_for_test({})
|
|
571
|
+
10.times {
|
|
572
|
+
g = parser.generate
|
|
573
|
+
# pp ["tasag", g]
|
|
574
|
+
if g != {}
|
|
575
|
+
bar = g['bar']
|
|
576
|
+
fail "GGG #{g.inspect}" unless bar
|
|
577
|
+
assert bar == true || Integer(bar)
|
|
578
|
+
assert parser.validate_for_test(g)
|
|
579
|
+
refute parser.validate_for_test(g.merge(foo: 3), false)
|
|
580
|
+
refute parser.validate_for_test(g.merge(bar: "baz"), false)
|
|
581
|
+
end
|
|
582
|
+
}
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
def test_bad_simple_alternative_group
|
|
586
|
+
parser = CDDL::Parser.new <<HERE
|
|
587
|
+
test = {
|
|
588
|
+
bar: int // true ; no member key in second choice
|
|
589
|
+
}
|
|
590
|
+
HERE
|
|
591
|
+
assert_raise { parser.rules }
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
def test_simple_alternative_in_array
|
|
596
|
+
parser = CDDL::Parser.new <<HERE
|
|
597
|
+
test = [
|
|
598
|
+
1 / 2
|
|
599
|
+
3 / 4
|
|
600
|
+
]
|
|
601
|
+
HERE
|
|
602
|
+
# pp parser.rules
|
|
603
|
+
10.times {
|
|
604
|
+
g = parser.generate
|
|
605
|
+
#pp ["saia", g]
|
|
606
|
+
assert_equal g.size, 2
|
|
607
|
+
assert [1, 2].include? g[0]
|
|
608
|
+
assert [3, 4].include? g[1]
|
|
609
|
+
assert parser.validate_for_test(g)
|
|
610
|
+
}
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
def test_simple_alternative_in_array2
|
|
614
|
+
parser = CDDL::Parser.new <<HERE
|
|
615
|
+
test = [
|
|
616
|
+
1 / 2
|
|
617
|
+
bar
|
|
618
|
+
foob: 3 / 4
|
|
619
|
+
]
|
|
620
|
+
bar = 5 / 6
|
|
621
|
+
HERE
|
|
622
|
+
# pp parser.rules
|
|
623
|
+
10.times {
|
|
624
|
+
g = parser.generate
|
|
625
|
+
# pp ["saia", g]
|
|
626
|
+
assert_equal g.size, 3
|
|
627
|
+
assert [1, 2].include? g[0]
|
|
628
|
+
assert [5, 6].include? g[1]
|
|
629
|
+
assert [3, 4].include? g[2]
|
|
630
|
+
assert parser.validate_for_test(g)
|
|
631
|
+
}
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
def test_group_choice_in_array2
|
|
636
|
+
parser = CDDL::Parser.new <<HERE
|
|
637
|
+
test = [
|
|
638
|
+
(1 // 2)
|
|
639
|
+
bar
|
|
640
|
+
(foob: 3 // boof: 4)
|
|
641
|
+
(bar // zab: 9, baz: 10)
|
|
642
|
+
]
|
|
643
|
+
bar = (5 // 6)
|
|
644
|
+
HERE
|
|
645
|
+
# puts parser.ast_debug
|
|
646
|
+
# pp parser.rules
|
|
647
|
+
10.times {
|
|
648
|
+
g = parser.generate
|
|
649
|
+
pp ["gcia", g]
|
|
650
|
+
assert_equal g.size, (g[3] == 9 ? 5 : 4)
|
|
651
|
+
assert [1, 2].include? g[0]
|
|
652
|
+
assert [5, 6].include? g[1]
|
|
653
|
+
assert [3, 4].include? g[2]
|
|
654
|
+
assert [5, 6, 9].include? g[3]
|
|
655
|
+
assert_equal g[4], 10 if g[3] == 9
|
|
656
|
+
assert parser.validate_for_test(g)
|
|
657
|
+
}
|
|
658
|
+
refute parser.validate_for_test([1, 5, 8, 9], false)
|
|
659
|
+
refute parser.validate_for_test([1, 5, 3], false)
|
|
660
|
+
assert parser.validate_for_test([1, 5, 4, 5])
|
|
661
|
+
refute parser.validate_for_test([1, 5, 4, 9], false)
|
|
662
|
+
assert parser.validate_for_test([1, 5, 4, 9, 10])
|
|
663
|
+
refute parser.validate_for_test([1, 5, 4, 3], false)
|
|
664
|
+
refute parser.validate_for_test([1, 5, 4, 9, 10, 3], false)
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
def test_aaaa_validate_number
|
|
668
|
+
parser = CDDL::Parser.new <<HERE
|
|
669
|
+
test = number
|
|
670
|
+
HERE
|
|
671
|
+
# pp parser.rules
|
|
672
|
+
assert parser.validate_for_test(1)
|
|
673
|
+
assert parser.validate_for_test(1.2)
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
def test_aaaa_validate_number_le
|
|
677
|
+
parser = CDDL::Parser.new <<HERE
|
|
678
|
+
test = number .le 2
|
|
679
|
+
HERE
|
|
680
|
+
# pp parser.rules
|
|
681
|
+
assert parser.validate_for_test(1)
|
|
682
|
+
assert parser.validate_for_test(1.2)
|
|
683
|
+
assert parser.validate_for_test(2)
|
|
684
|
+
assert parser.validate_for_test(2.0)
|
|
685
|
+
refute parser.validate_for_test(2.1, false)
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
def test_aaaa_validate_number_lt
|
|
689
|
+
parser = CDDL::Parser.new <<HERE
|
|
690
|
+
test = number .lt 2
|
|
691
|
+
HERE
|
|
692
|
+
# pp parser.rules
|
|
693
|
+
assert parser.validate_for_test(1)
|
|
694
|
+
assert parser.validate_for_test(1.2)
|
|
695
|
+
refute parser.validate_for_test(2, false)
|
|
696
|
+
refute parser.validate_for_test(2.0, false)
|
|
697
|
+
refute parser.validate_for_test(2.1, false)
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
def test_aaaa_validate_number_ne
|
|
701
|
+
parser = CDDL::Parser.new <<HERE
|
|
702
|
+
test = number .ne 2
|
|
703
|
+
HERE
|
|
704
|
+
# pp parser.rules
|
|
705
|
+
assert parser.validate_for_test(1)
|
|
706
|
+
assert parser.validate_for_test(1.2)
|
|
707
|
+
refute parser.validate_for_test(2, false)
|
|
708
|
+
refute parser.validate_for_test(2.0, false)
|
|
709
|
+
assert parser.validate_for_test(2.1)
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
def test_aaaa_validate_number_default
|
|
713
|
+
parser = CDDL::Parser.new <<HERE
|
|
714
|
+
test = number .default 2
|
|
715
|
+
HERE
|
|
716
|
+
# pp parser.rules
|
|
717
|
+
assert parser.validate_for_test(1)
|
|
718
|
+
assert parser.validate_for_test(1.2)
|
|
719
|
+
assert parser.validate_for_test(2)
|
|
720
|
+
assert parser.validate_for_test(2.0)
|
|
721
|
+
assert parser.validate_for_test(2.1)
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
def test_aaaa_validate_number_eq
|
|
725
|
+
parser = CDDL::Parser.new <<HERE
|
|
726
|
+
test = number .eq 2
|
|
727
|
+
HERE
|
|
728
|
+
# pp parser.rules
|
|
729
|
+
refute parser.validate_for_test(1, false)
|
|
730
|
+
refute parser.validate_for_test(1.2, false)
|
|
731
|
+
assert parser.validate_for_test(2)
|
|
732
|
+
assert parser.validate_for_test(2.0)
|
|
733
|
+
refute parser.validate_for_test(2.1, false)
|
|
734
|
+
end
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
def test_aaaa_validate_string_eq
|
|
738
|
+
parser = CDDL::Parser.new <<HERE
|
|
739
|
+
test = (text/bytes) .eq "foo"
|
|
740
|
+
HERE
|
|
741
|
+
# pp parser.rules
|
|
742
|
+
refute parser.validate_for_test(1, false)
|
|
743
|
+
assert parser.validate_for_test("foo")
|
|
744
|
+
assert parser.validate_for_test("foo".b) # XXX Feature!
|
|
745
|
+
refute parser.validate_for_test("bar", false)
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
def test_validate_number_key
|
|
749
|
+
parser = CDDL::Parser.new <<HERE
|
|
750
|
+
test = [test1, test2, test3]
|
|
751
|
+
test1 = {1: 2}
|
|
752
|
+
test2 = {3.0 => "a"}
|
|
753
|
+
test3 = {foo: "bar"}
|
|
754
|
+
HERE
|
|
755
|
+
# pp parser.rules
|
|
756
|
+
expected = [{1 => 2}, {3.0 => "a"}, {'foo' => "bar"}]
|
|
757
|
+
assert_equal expected, parser.generate
|
|
758
|
+
assert parser.validate_for_test(expected)
|
|
759
|
+
end
|
|
760
|
+
|
|
761
|
+
def test_validate_json_float
|
|
762
|
+
parser = CDDL::Parser.new <<HERE
|
|
763
|
+
test = {
|
|
764
|
+
foo: int
|
|
765
|
+
? bar: beer
|
|
766
|
+
f16: float16
|
|
767
|
+
? "f32": float32
|
|
768
|
+
? 1: float32
|
|
769
|
+
"f64" => float64
|
|
770
|
+
}
|
|
771
|
+
beer = 3.14 / 6.28
|
|
772
|
+
HERE
|
|
773
|
+
# pp parser.rules
|
|
774
|
+
# pp parser.generate
|
|
775
|
+
refute parser.validate_for_test({}, false)
|
|
776
|
+
assert parser.validate_for_test({"f16" => 1.5, "foo" => 1, "f64" => 1.1, "bar" => 3.14})
|
|
777
|
+
assert parser.validate_for_test({"f16" => 1.5, "foo" => 1, "f64" => 1.1, "bar" => 6.28})
|
|
778
|
+
refute parser.validate_for_test({"f16" => 1.5, "foo" => 1, "f64" => 1.1, "bar" => 3.15}, false)
|
|
779
|
+
assert parser.validate_for_test({"f16" => 1.5, "foo" => 1, "f64" => 1.1})
|
|
780
|
+
refute parser.validate_for_test({"f16" => 1, "foo" => 1, "f64" => 1.1}, false)
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
def test_validate_tags
|
|
784
|
+
parser = CDDL::Parser.new <<HERE
|
|
785
|
+
my_breakfast = #6.55799(breakfast) ; cbor-any is too general!
|
|
786
|
+
breakfast = cereal / porridge
|
|
787
|
+
cereal = #6.998(tstr)
|
|
788
|
+
porridge = #6.999([liquid, solid])
|
|
789
|
+
liquid = milk / water
|
|
790
|
+
milk = 0
|
|
791
|
+
water = 1
|
|
792
|
+
solid = tstr
|
|
793
|
+
HERE
|
|
794
|
+
# pp parser.rules
|
|
795
|
+
# pp parser.generate
|
|
796
|
+
refute parser.validate_for_test({}, false)
|
|
797
|
+
refute parser.validate_for_test(CBOR::Tagged.new(55799, CBOR::Tagged.new(997, 1)), false)
|
|
798
|
+
refute parser.validate_for_test(CBOR::Tagged.new(55799, CBOR::Tagged.new(998, 1)), false)
|
|
799
|
+
assert parser.validate_for_test(CBOR::Tagged.new(55799, CBOR::Tagged.new(998, "cornflakes")))
|
|
800
|
+
assert parser.validate_for_test(CBOR::Tagged.new(55799, CBOR::Tagged.new(999, [0, "barley"])))
|
|
801
|
+
refute parser.validate_for_test(CBOR::Tagged.new(55799, CBOR::Tagged.new(999, [0, 1])), false)
|
|
802
|
+
refute parser.validate_for_test(CBOR::Tagged.new(55799, CBOR::Tagged.new(999, [0, "barley", 1])), false)
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
def test_nested_group_many1
|
|
806
|
+
parser = CDDL::Parser.new <<HERE
|
|
807
|
+
foo = {* bar}
|
|
808
|
+
bar = (* b: 1)
|
|
809
|
+
HERE
|
|
810
|
+
assert_equal [:type1, [:map, [:member, 0, CDDL::MANY, [:text, "b"], [:int, 1]]]], parser.rules
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
def test_nested_group_many2
|
|
814
|
+
parser = CDDL::Parser.new <<HERE
|
|
815
|
+
foo = {* bar}
|
|
816
|
+
bar = (b: 1)
|
|
817
|
+
HERE
|
|
818
|
+
assert_equal [:type1, [:map, [:member, 0, CDDL::MANY, [:text, "b"], [:int, 1]]]], parser.rules
|
|
819
|
+
end
|
|
820
|
+
|
|
821
|
+
def test_nested_group_many3
|
|
822
|
+
parser = CDDL::Parser.new <<HERE
|
|
823
|
+
foo = {* bar}
|
|
824
|
+
bar = (4*6 b: 1)
|
|
825
|
+
HERE
|
|
826
|
+
assert_equal [:type1, [:map, [:member, 0, CDDL::MANY, [:text, "b"], [:int, 1]]]], parser.rules
|
|
827
|
+
end
|
|
828
|
+
|
|
829
|
+
def test_range_integer
|
|
830
|
+
parser = CDDL::Parser.new <<HERE
|
|
831
|
+
color = 0..12
|
|
832
|
+
HERE
|
|
278
833
|
pp parser.generate
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
assert parser.
|
|
284
|
-
assert parser.
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
834
|
+
10.times {
|
|
835
|
+
assert parser.generate.between?(0, 12)
|
|
836
|
+
}
|
|
837
|
+
assert parser.validate_for_test(0)
|
|
838
|
+
assert parser.validate_for_test(7)
|
|
839
|
+
assert parser.validate_for_test(12)
|
|
840
|
+
refute parser.validate_for_test(-1, false)
|
|
841
|
+
refute parser.validate_for_test(13, false)
|
|
842
|
+
end
|
|
843
|
+
|
|
844
|
+
def test_range_integer_excl
|
|
845
|
+
parser = CDDL::Parser.new <<HERE
|
|
846
|
+
color = 0...13
|
|
847
|
+
HERE
|
|
848
|
+
10.times {
|
|
849
|
+
assert parser.generate.between?(0, 12)
|
|
850
|
+
}
|
|
851
|
+
assert parser.validate_for_test(0)
|
|
852
|
+
assert parser.validate_for_test(7)
|
|
853
|
+
refute parser.validate_for_test(7.0, false)
|
|
854
|
+
assert parser.validate_for_test(12)
|
|
855
|
+
refute parser.validate_for_test(-1, false)
|
|
856
|
+
refute parser.validate_for_test(13, false)
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
def test_range_float
|
|
860
|
+
parser = CDDL::Parser.new <<HERE
|
|
861
|
+
color = 0.5..max
|
|
862
|
+
max = 12.5
|
|
863
|
+
HERE
|
|
864
|
+
# pp parser.rules
|
|
865
|
+
10.times {
|
|
866
|
+
assert parser.generate.between?(0.5, 12.5)
|
|
867
|
+
}
|
|
868
|
+
refute parser.validate_for_test(0.0, false)
|
|
869
|
+
assert parser.validate_for_test(0.5)
|
|
870
|
+
assert parser.validate_for_test(7.0)
|
|
871
|
+
refute parser.validate_for_test(7, false)
|
|
872
|
+
assert parser.validate_for_test(12.0)
|
|
873
|
+
assert parser.validate_for_test(12.5)
|
|
874
|
+
refute parser.validate_for_test(-1.0, false)
|
|
875
|
+
refute parser.validate_for_test(13.0, false)
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
def test_enum
|
|
879
|
+
parser = CDDL::Parser.new <<HERE
|
|
880
|
+
color = &(
|
|
881
|
+
black: 0,
|
|
882
|
+
red: 1,
|
|
883
|
+
green: 2,
|
|
884
|
+
yellow: 3,
|
|
885
|
+
blue: 4,
|
|
886
|
+
magenta: 5,
|
|
887
|
+
cyan: 6,
|
|
888
|
+
white: 7,
|
|
889
|
+
orange: 8,
|
|
890
|
+
pink: 9,
|
|
891
|
+
purple: 10,
|
|
892
|
+
brown: 11,
|
|
893
|
+
grey: 12,
|
|
894
|
+
)
|
|
895
|
+
HERE
|
|
896
|
+
# brittle on type1 nesting optimization
|
|
897
|
+
assert_equal [:type1,
|
|
898
|
+
[:type1,
|
|
899
|
+
[:int, 0],
|
|
900
|
+
[:int, 1],
|
|
901
|
+
[:int, 2],
|
|
902
|
+
[:int, 3],
|
|
903
|
+
[:int, 4],
|
|
904
|
+
[:int, 5],
|
|
905
|
+
[:int, 6],
|
|
906
|
+
[:int, 7],
|
|
907
|
+
[:int, 8],
|
|
908
|
+
[:int, 9],
|
|
909
|
+
[:int, 10],
|
|
910
|
+
[:int, 11],
|
|
911
|
+
[:int, 12]]], parser.rules
|
|
912
|
+
10.times {
|
|
913
|
+
assert parser.generate.between?(0, 12)
|
|
914
|
+
}
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
def test_enum_indirect
|
|
918
|
+
parser = CDDL::Parser.new <<HERE
|
|
919
|
+
color = &colors
|
|
920
|
+
basecolors = (
|
|
921
|
+
red: 1,
|
|
922
|
+
green: 2,
|
|
923
|
+
blue: 4,
|
|
924
|
+
lila,
|
|
925
|
+
)
|
|
926
|
+
lila = (
|
|
927
|
+
magenta: 5,
|
|
928
|
+
pink: 9,
|
|
929
|
+
purple: 10,
|
|
930
|
+
)
|
|
931
|
+
colors = (
|
|
932
|
+
black: 0,
|
|
933
|
+
basecolors,
|
|
934
|
+
yellow: 3,
|
|
935
|
+
cyan: 6,
|
|
936
|
+
white: 7,
|
|
937
|
+
orange: 8,
|
|
938
|
+
brown: 11,
|
|
939
|
+
grey: 12,
|
|
940
|
+
)
|
|
941
|
+
HERE
|
|
942
|
+
# brittle on type1 nesting optimization
|
|
943
|
+
assert_equal [:type1,
|
|
944
|
+
[:type1,
|
|
945
|
+
[:int, 0],
|
|
946
|
+
[:int, 1],
|
|
947
|
+
[:int, 2],
|
|
948
|
+
[:int, 4],
|
|
949
|
+
[:int, 5],
|
|
950
|
+
[:int, 9],
|
|
951
|
+
[:int, 10],
|
|
952
|
+
[:int, 3],
|
|
953
|
+
[:int, 6],
|
|
954
|
+
[:int, 7],
|
|
955
|
+
[:int, 8],
|
|
956
|
+
[:int, 11],
|
|
957
|
+
[:int, 12]]], parser.rules
|
|
958
|
+
10.times {
|
|
959
|
+
assert parser.generate.between?(0, 12)
|
|
960
|
+
}
|
|
961
|
+
end
|
|
962
|
+
|
|
963
|
+
def test_invalidate_unequal_range
|
|
964
|
+
# $debug_ast = true
|
|
965
|
+
parser = CDDL::Parser.new <<HERE
|
|
966
|
+
test = 1..2.5
|
|
967
|
+
HERE
|
|
968
|
+
# puts "RULES:"
|
|
969
|
+
assert_raise { # TODO: This really should be checked at parse time
|
|
970
|
+
pp parser.rules
|
|
971
|
+
}
|
|
972
|
+
# puts "APR:"
|
|
973
|
+
# pp parser.apr
|
|
974
|
+
assert_raise { puts parser.generate() }
|
|
975
|
+
assert_raise { parser.validate({}) }
|
|
976
|
+
end
|
|
977
|
+
|
|
978
|
+
def test_invalidate_boolean_range
|
|
979
|
+
# $debug_ast = true
|
|
980
|
+
parser = CDDL::Parser.new <<HERE
|
|
981
|
+
test = false..true
|
|
982
|
+
HERE
|
|
983
|
+
# puts "RULES:"
|
|
984
|
+
assert_raise { # TODO: This really should be checked at parse time
|
|
985
|
+
pp parser.rules
|
|
986
|
+
}
|
|
987
|
+
# puts "APR:"
|
|
988
|
+
# pp parser.apr
|
|
989
|
+
assert_raise { puts parser.generate() }
|
|
990
|
+
assert_raise { parser.validate({}) }
|
|
991
|
+
end
|
|
992
|
+
|
|
993
|
+
def test_identical_redefinition
|
|
994
|
+
parser = CDDL::Parser.new <<HERE
|
|
995
|
+
test =
|
|
996
|
+
"Cephalotaxus Germanism dovekey Istiophorus" / foo
|
|
997
|
+
test = "Cephalotaxus Germanism dovekey Istiophorus"
|
|
998
|
+
/ foo
|
|
999
|
+
foo = 1
|
|
1000
|
+
HERE
|
|
1001
|
+
pp parser.rules
|
|
1002
|
+
end
|
|
1003
|
+
|
|
1004
|
+
def test_bad_redefinition
|
|
1005
|
+
parser = CDDL::Parser.new <<HERE
|
|
1006
|
+
test =
|
|
1007
|
+
"Cephalotaxus Germanism dovekey Istiophorus" / foo
|
|
1008
|
+
test = "Cephalotaxus Germanism dovekey Istiophorus"
|
|
1009
|
+
/ fob
|
|
1010
|
+
foo = 1
|
|
1011
|
+
fob = 1
|
|
1012
|
+
HERE
|
|
1013
|
+
assert_raise {
|
|
1014
|
+
pp parser.rules
|
|
1015
|
+
}
|
|
1016
|
+
end
|
|
1017
|
+
|
|
1018
|
+
def test_bad_annotation
|
|
1019
|
+
parser = CDDL::Parser.new <<HERE
|
|
1020
|
+
test = int .foo 3
|
|
1021
|
+
HERE
|
|
1022
|
+
assert_raise {
|
|
1023
|
+
pp parser.rules
|
|
1024
|
+
}
|
|
1025
|
+
end
|
|
1026
|
+
|
|
1027
|
+
def test_size_annotation
|
|
1028
|
+
parser = CDDL::Parser.new <<HERE
|
|
1029
|
+
test = bstr .size 3
|
|
1030
|
+
HERE
|
|
1031
|
+
pp parser.rules
|
|
1032
|
+
gen = parser.generate
|
|
1033
|
+
assert String === gen
|
|
1034
|
+
assert gen.bytesize == 3
|
|
1035
|
+
pp gen
|
|
1036
|
+
assert parser.validate_for_test(gen)
|
|
1037
|
+
end
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
def test_uint_size_annotation
|
|
1041
|
+
parser = CDDL::Parser.new <<HERE
|
|
1042
|
+
test = uint .size 3
|
|
1043
|
+
HERE
|
|
1044
|
+
pp parser.rules
|
|
1045
|
+
10.times do
|
|
1046
|
+
gen = parser.generate
|
|
1047
|
+
assert Integer === gen
|
|
1048
|
+
assert gen < 2**24
|
|
1049
|
+
assert gen >= 0
|
|
1050
|
+
assert parser.validate_for_test(gen)
|
|
1051
|
+
end
|
|
1052
|
+
refute parser.validate_for_test(-1, false)
|
|
1053
|
+
refute parser.validate_for_test(2**24, false)
|
|
1054
|
+
refute parser.validate_for_test(2**218, false)
|
|
1055
|
+
end
|
|
1056
|
+
|
|
1057
|
+
def test_bits_annotation
|
|
1058
|
+
parser = CDDL::Parser.new <<HERE
|
|
1059
|
+
test = bstr .bits (1 / 3 / 5)
|
|
1060
|
+
HERE
|
|
1061
|
+
# pp parser.rules
|
|
1062
|
+
gen = parser.generate
|
|
1063
|
+
assert String === gen
|
|
1064
|
+
pp gen # should mostly be "*"
|
|
1065
|
+
assert parser.validate_for_test(gen)
|
|
1066
|
+
assert parser.validate_for_test("\x08".b)
|
|
1067
|
+
refute parser.validate_for_test("\x01".b, false)
|
|
1068
|
+
refute parser.validate_for_test("\x10".b, false)
|
|
1069
|
+
refute parser.validate_for_test("\x40".b, false)
|
|
1070
|
+
end
|
|
1071
|
+
|
|
1072
|
+
def test_bits_annotation_on_uint
|
|
1073
|
+
parser = CDDL::Parser.new <<HERE
|
|
1074
|
+
test = uint .bits (1 / 3 / 5)
|
|
1075
|
+
HERE
|
|
1076
|
+
# pp parser.rules
|
|
1077
|
+
gen = parser.generate
|
|
1078
|
+
assert Integer === gen
|
|
1079
|
+
pp gen # should mostly be 42
|
|
1080
|
+
assert parser.validate_for_test(gen)
|
|
1081
|
+
assert parser.validate_for_test(1 << 3)
|
|
1082
|
+
refute parser.validate_for_test(1 << 0, false)
|
|
1083
|
+
refute parser.validate_for_test(1 << 4, false)
|
|
1084
|
+
refute parser.validate_for_test(1 << 6, false)
|
|
1085
|
+
end
|
|
1086
|
+
|
|
1087
|
+
def test_regexp_annotation
|
|
1088
|
+
parser = CDDL::Parser.new <<HERE
|
|
1089
|
+
test = tstr .regexp "reg.*"
|
|
1090
|
+
HERE
|
|
1091
|
+
pp parser.rules
|
|
1092
|
+
5.times do
|
|
1093
|
+
gen = parser.generate
|
|
1094
|
+
assert String === gen
|
|
1095
|
+
pp gen
|
|
1096
|
+
assert parser.validate_for_test(gen)
|
|
1097
|
+
end
|
|
1098
|
+
assert parser.validate_for_test("reg")
|
|
1099
|
+
assert parser.validate_for_test("regfoo")
|
|
1100
|
+
refute parser.validate_for_test("foo", false)
|
|
1101
|
+
refute parser.validate_for_test("re", false)
|
|
1102
|
+
end
|
|
1103
|
+
|
|
1104
|
+
def test_cbor_annotation1
|
|
1105
|
+
parser = CDDL::Parser.new <<HERE
|
|
1106
|
+
test = bytes .cbor 1
|
|
1107
|
+
HERE
|
|
1108
|
+
pp parser.rules
|
|
1109
|
+
5.times do
|
|
1110
|
+
gen = parser.generate
|
|
1111
|
+
assert_equal "\x01", gen
|
|
1112
|
+
pp gen
|
|
1113
|
+
assert parser.validate_for_test(gen)
|
|
1114
|
+
end
|
|
1115
|
+
assert parser.validate_for_test("\x01".b)
|
|
1116
|
+
assert parser.validate_for_test("\x18\x01".b)
|
|
1117
|
+
refute parser.validate_for_test("1", false)
|
|
1118
|
+
refute parser.validate_for_test("\x00".b, false)
|
|
1119
|
+
end
|
|
1120
|
+
|
|
1121
|
+
def test_cbor_annotation_uint
|
|
1122
|
+
parser = CDDL::Parser.new <<HERE
|
|
1123
|
+
test = bytes .cbor uint
|
|
1124
|
+
HERE
|
|
1125
|
+
pp parser.rules
|
|
1126
|
+
5.times do
|
|
1127
|
+
gen = parser.generate
|
|
1128
|
+
assert String === gen
|
|
1129
|
+
assert_equal 0, gen.getbyte(0) >> 5
|
|
1130
|
+
pp ["CAU", gen]
|
|
1131
|
+
assert parser.validate_for_test(gen)
|
|
1132
|
+
end
|
|
1133
|
+
assert parser.validate_for_test("\x01".b)
|
|
1134
|
+
assert parser.validate_for_test("\x00".b)
|
|
1135
|
+
assert parser.validate_for_test("\x18\x01".b)
|
|
1136
|
+
refute parser.validate_for_test("1", false)
|
|
1137
|
+
refute parser.validate_for_test("\x00\x00".b, false)
|
|
1138
|
+
end
|
|
1139
|
+
|
|
1140
|
+
def test_cborseq_annotation_uint
|
|
1141
|
+
parser = CDDL::Parser.new <<HERE
|
|
1142
|
+
test = bytes .cborseq uint
|
|
1143
|
+
HERE
|
|
1144
|
+
assert_raise {
|
|
1145
|
+
parser.generate
|
|
1146
|
+
}
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1149
|
+
def test_cbor_annotation_uint_array
|
|
1150
|
+
parser = CDDL::Parser.new <<HERE
|
|
1151
|
+
test = bytes .cborseq myarray
|
|
1152
|
+
myarray = [1*4uint]
|
|
1153
|
+
HERE
|
|
1154
|
+
pp parser.rules
|
|
1155
|
+
5.times do
|
|
1156
|
+
gen = parser.generate
|
|
1157
|
+
assert String === gen
|
|
1158
|
+
pp ["CAUA", gen]
|
|
1159
|
+
assert_equal 0, gen.getbyte(0) >> 5 unless gen == ''
|
|
1160
|
+
assert parser.validate_for_test(gen)
|
|
1161
|
+
end
|
|
1162
|
+
assert parser.validate_for_test("\x01".b)
|
|
1163
|
+
assert parser.validate_for_test("\x18\x01".b)
|
|
1164
|
+
refute parser.validate_for_test("1", false)
|
|
1165
|
+
refute parser.validate_for_test("\x00\x00\x00\x00\x00".b, false)
|
|
1166
|
+
end
|
|
1167
|
+
|
|
1168
|
+
def test_and_annotation
|
|
1169
|
+
parser = CDDL::Parser.new <<HERE
|
|
1170
|
+
test = mtype .and uint
|
|
1171
|
+
mtype = 1/2/3/4/-1
|
|
1172
|
+
HERE
|
|
1173
|
+
pp parser.rules
|
|
1174
|
+
5.times do
|
|
1175
|
+
gen = parser.generate
|
|
1176
|
+
assert Integer === gen
|
|
1177
|
+
pp ["CAA", gen]
|
|
1178
|
+
assert parser.validate_for_test(gen)
|
|
1179
|
+
end
|
|
1180
|
+
assert parser.validate_for_test(1)
|
|
1181
|
+
refute parser.validate_for_test(-1, false)
|
|
1182
|
+
refute parser.validate_for_test(0, false)
|
|
1183
|
+
end
|
|
1184
|
+
|
|
1185
|
+
def test_within_annotation
|
|
1186
|
+
parser = CDDL::Parser.new <<HERE
|
|
1187
|
+
test = mtype .within uint
|
|
1188
|
+
mtype = 1/2/3/4/-1
|
|
1189
|
+
HERE
|
|
1190
|
+
pp parser.rules
|
|
1191
|
+
20.times do
|
|
1192
|
+
gen = parser.generate
|
|
1193
|
+
assert Integer === gen
|
|
1194
|
+
pp ["CWA", gen] # should also generate some warnings
|
|
1195
|
+
assert parser.validate_for_test(gen)
|
|
1196
|
+
end
|
|
1197
|
+
assert parser.validate_for_test(1)
|
|
1198
|
+
refute parser.validate_for_test(-1, false)
|
|
1199
|
+
refute parser.validate_for_test(0, false)
|
|
1200
|
+
end
|
|
1201
|
+
|
|
1202
|
+
def test_dcaf
|
|
1203
|
+
parser1 = CDDL::Parser.new(File.read("#{TEST_DATA_DIR}/dcaf1.cddl"))
|
|
1204
|
+
# assert_equal EXPECTED_RULES, parser1.rules
|
|
1205
|
+
pp parser1.generate
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
def test_generic1
|
|
1210
|
+
parser = CDDL::Parser.new <<HERE
|
|
1211
|
+
d = a<1>
|
|
1212
|
+
a<b> = b
|
|
1213
|
+
HERE
|
|
1214
|
+
assert_equal 1, parser.generate
|
|
1215
|
+
end
|
|
1216
|
+
|
|
1217
|
+
def test_generic_group
|
|
1218
|
+
parser = CDDL::Parser.new <<HERE
|
|
1219
|
+
d = a<mygr>
|
|
1220
|
+
a<gr> = { gr }
|
|
1221
|
+
mygr = (
|
|
1222
|
+
1 => 2
|
|
1223
|
+
)
|
|
1224
|
+
HERE
|
|
1225
|
+
assert_equal({1 => 2}, parser.generate)
|
|
1226
|
+
end
|
|
1227
|
+
|
|
1228
|
+
def test_generic_transitive
|
|
1229
|
+
parser = CDDL::Parser.new <<HERE
|
|
1230
|
+
d = a<mygr>
|
|
1231
|
+
a<gr> = { b<gr> }
|
|
1232
|
+
b<foo> = foo
|
|
1233
|
+
mygr = (
|
|
1234
|
+
1 => 2
|
|
1235
|
+
)
|
|
1236
|
+
HERE
|
|
1237
|
+
assert_equal({1 => 2}, parser.generate)
|
|
1238
|
+
end
|
|
1239
|
+
|
|
1240
|
+
def test_generic_realistic
|
|
1241
|
+
parser = CDDL::Parser.new <<HERE
|
|
1242
|
+
start = [request, response]
|
|
1243
|
+
request = message<0>
|
|
1244
|
+
response = message<1>
|
|
1245
|
+
message<code> = {
|
|
1246
|
+
code: code
|
|
1247
|
+
data: "hallo data"
|
|
1248
|
+
}
|
|
1249
|
+
HERE
|
|
1250
|
+
assert_equal([{"code"=>0, "data"=>"hallo data"},
|
|
1251
|
+
{"code"=>1, "data"=>"hallo data"}], parser.generate)
|
|
1252
|
+
end
|
|
1253
|
+
|
|
1254
|
+
def test_generic_enum
|
|
1255
|
+
parser = CDDL::Parser.new <<HERE
|
|
1256
|
+
color<foo> = &foo
|
|
1257
|
+
color = color<colors>
|
|
1258
|
+
basecolors = (
|
|
1259
|
+
red: 1,
|
|
1260
|
+
green: 2,
|
|
1261
|
+
blue: 4,
|
|
1262
|
+
lila,
|
|
1263
|
+
)
|
|
1264
|
+
lila = (
|
|
1265
|
+
magenta: 5,
|
|
1266
|
+
pink: 9,
|
|
1267
|
+
purple: 10,
|
|
1268
|
+
)
|
|
1269
|
+
colors = (
|
|
1270
|
+
black: 0,
|
|
1271
|
+
basecolors,
|
|
1272
|
+
yellow: 3,
|
|
1273
|
+
cyan: 6,
|
|
1274
|
+
white: 7,
|
|
1275
|
+
orange: 8,
|
|
1276
|
+
brown: 11,
|
|
1277
|
+
grey: 12,
|
|
1278
|
+
)
|
|
1279
|
+
HERE
|
|
1280
|
+
# brittle on type1 nesting optimization
|
|
1281
|
+
assert_equal [:type1,
|
|
1282
|
+
[:type1,
|
|
1283
|
+
[:int, 0],
|
|
1284
|
+
[:int, 1],
|
|
1285
|
+
[:int, 2],
|
|
1286
|
+
[:int, 4],
|
|
1287
|
+
[:int, 5],
|
|
1288
|
+
[:int, 9],
|
|
1289
|
+
[:int, 10],
|
|
1290
|
+
[:int, 3],
|
|
1291
|
+
[:int, 6],
|
|
1292
|
+
[:int, 7],
|
|
1293
|
+
[:int, 8],
|
|
1294
|
+
[:int, 11],
|
|
1295
|
+
[:int, 12]]], parser.rules
|
|
1296
|
+
10.times {
|
|
1297
|
+
assert parser.generate.between?(0, 12)
|
|
1298
|
+
}
|
|
1299
|
+
end
|
|
1300
|
+
|
|
1301
|
+
def test_endless_recursion
|
|
1302
|
+
parser = CDDL::Parser.new <<HERE
|
|
1303
|
+
a = a
|
|
1304
|
+
HERE
|
|
1305
|
+
assert_raise { parser.validate(1) }
|
|
1306
|
+
assert_raise { parser.generate }
|
|
1307
|
+
end
|
|
1308
|
+
|
|
1309
|
+
def test_recursion
|
|
1310
|
+
parser = CDDL::Parser.new <<HERE
|
|
1311
|
+
a = [a] / 1
|
|
1312
|
+
HERE
|
|
1313
|
+
10.times {
|
|
1314
|
+
g = parser.generate
|
|
1315
|
+
# pp ["recurse-test1", g]
|
|
1316
|
+
assert parser.validate_for_test(g)
|
|
1317
|
+
}
|
|
1318
|
+
end
|
|
1319
|
+
|
|
1320
|
+
def test_endless_group_recursion
|
|
1321
|
+
parser = CDDL::Parser.new <<HERE
|
|
1322
|
+
b = {a}
|
|
1323
|
+
a = (
|
|
1324
|
+
foo: int
|
|
1325
|
+
a
|
|
1326
|
+
)
|
|
1327
|
+
HERE
|
|
1328
|
+
assert_raise { parser.validate(1) }
|
|
1329
|
+
assert_raise { parser.generate }
|
|
1330
|
+
end
|
|
1331
|
+
|
|
1332
|
+
def test_non_group_recursion
|
|
1333
|
+
parser = CDDL::Parser.new <<HERE
|
|
1334
|
+
a = {
|
|
1335
|
+
foo: int
|
|
1336
|
+
bar: ([a] / 1)
|
|
1337
|
+
}
|
|
1338
|
+
HERE
|
|
1339
|
+
10.times {
|
|
1340
|
+
g = parser.generate
|
|
1341
|
+
# pp ["non-recurse-test", g]
|
|
1342
|
+
assert parser.validate_for_test(g)
|
|
1343
|
+
}
|
|
1344
|
+
end
|
|
1345
|
+
|
|
1346
|
+
def test_group_recursion
|
|
1347
|
+
parser = CDDL::Parser.new <<HERE
|
|
1348
|
+
b = {a}
|
|
1349
|
+
a = (
|
|
1350
|
+
foo: int
|
|
1351
|
+
bar: ([a] / 1)
|
|
1352
|
+
)
|
|
1353
|
+
HERE
|
|
1354
|
+
p parser.rules
|
|
1355
|
+
10.times {
|
|
1356
|
+
g = parser.generate
|
|
1357
|
+
pp ["recurse-group-test", g]
|
|
1358
|
+
assert parser.validate_for_test(g)
|
|
1359
|
+
}
|
|
1360
|
+
end
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
def test_group_recursion2
|
|
1364
|
+
parser = CDDL::Parser.new <<HERE
|
|
1365
|
+
b = {1: 2, a}
|
|
1366
|
+
a = (
|
|
1367
|
+
foo: int
|
|
1368
|
+
bar: ([+aa] / 1 / 2)
|
|
1369
|
+
)
|
|
1370
|
+
aa = {a}
|
|
1371
|
+
HERE
|
|
1372
|
+
p parser.rules
|
|
1373
|
+
10.times {
|
|
1374
|
+
g = parser.generate
|
|
1375
|
+
# pp ["recurse-group-test2", g]
|
|
1376
|
+
assert parser.validate_for_test(g)
|
|
1377
|
+
refute parser.validate_for_test(g.merge(baz: 3), false)
|
|
1378
|
+
}
|
|
1379
|
+
end
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
def test_group_recursion_fail1
|
|
1383
|
+
parser = CDDL::Parser.new <<HERE
|
|
1384
|
+
b = {a}
|
|
1385
|
+
a = (
|
|
1386
|
+
foo: int
|
|
1387
|
+
bar: ([a: a] / 1)
|
|
1388
|
+
)
|
|
1389
|
+
HERE
|
|
1390
|
+
assert_raise { p parser.rules }
|
|
1391
|
+
end
|
|
1392
|
+
|
|
1393
|
+
def test_empty_group
|
|
1394
|
+
parser = CDDL::Parser.new <<HERE
|
|
1395
|
+
a = {b}
|
|
1396
|
+
b = ()
|
|
1397
|
+
HERE
|
|
1398
|
+
# puts "empty_group AST:"
|
|
1399
|
+
# puts parser.ast_debug
|
|
1400
|
+
# puts "empty_group RULES:"
|
|
1401
|
+
# pp parser.rules
|
|
1402
|
+
assert_equal({}, parser.generate)
|
|
1403
|
+
assert parser.validate_for_test({})
|
|
1404
|
+
end
|
|
1405
|
+
|
|
1406
|
+
|
|
1407
|
+
def test_empty_group_sp
|
|
1408
|
+
parser = CDDL::Parser.new <<HERE
|
|
1409
|
+
a = {b}
|
|
1410
|
+
b = (
|
|
1411
|
+
)
|
|
1412
|
+
HERE
|
|
1413
|
+
# puts "empty_group_sp AST:"
|
|
1414
|
+
# puts parser.ast_debug
|
|
1415
|
+
# puts "empty_group_sp RULES:"
|
|
1416
|
+
# pp parser.rules
|
|
1417
|
+
assert_equal({}, parser.generate)
|
|
1418
|
+
assert parser.validate_for_test({})
|
|
1419
|
+
end
|
|
1420
|
+
|
|
1421
|
+
|
|
1422
|
+
def test_empty_group_augmented
|
|
1423
|
+
parser = CDDL::Parser.new <<HERE
|
|
1424
|
+
a = {b}
|
|
1425
|
+
b = (
|
|
1426
|
+
)
|
|
1427
|
+
; b //= (3) PENDING: need to recognize this as group
|
|
1428
|
+
b //= ()
|
|
1429
|
+
HERE
|
|
1430
|
+
# puts "empty_group_sp AST:"
|
|
1431
|
+
# puts parser.ast_debug
|
|
1432
|
+
# puts "empty_group_sp RULES:"
|
|
1433
|
+
# pp parser.rules
|
|
1434
|
+
assert_equal({}, parser.generate)
|
|
1435
|
+
assert parser.validate_for_test({})
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
def test_simple_group_augmented
|
|
1439
|
+
parser = CDDL::Parser.new <<HERE
|
|
1440
|
+
a = {b}
|
|
1441
|
+
b = ( "abs": 3 )
|
|
1442
|
+
; b //= (3) PENDING: need to recognize this as group
|
|
1443
|
+
b //= ( "abs": -3 )
|
|
1444
|
+
b //= ( "abs": 5 )
|
|
1445
|
+
HERE
|
|
1446
|
+
# puts "empty_group_sp AST:"
|
|
1447
|
+
# puts parser.ast_debug
|
|
1448
|
+
# puts "simple_group_augmented RULES:"
|
|
1449
|
+
# pp parser.rules
|
|
1450
|
+
assert_equal(["abs"], parser.generate.keys)
|
|
1451
|
+
v = {}
|
|
1452
|
+
20.times do
|
|
1453
|
+
v[parser.generate["abs"]] = true
|
|
1454
|
+
end
|
|
1455
|
+
assert_equal({3 => true, -3 => true, 5 => true}, v)
|
|
1456
|
+
assert parser.validate_for_test({"abs" => 3})
|
|
1457
|
+
assert parser.validate_for_test({"abs" => 5})
|
|
1458
|
+
assert parser.validate_for_test({"abs" => -3})
|
|
1459
|
+
end
|
|
1460
|
+
|
|
1461
|
+
def test_simple_group_augmented_uninitialized
|
|
1462
|
+
parser = CDDL::Parser.new <<HERE
|
|
1463
|
+
a = {b}
|
|
1464
|
+
b //= ( "abs": 3 )
|
|
1465
|
+
; b //= (3) PENDING: need to recognize this as group
|
|
1466
|
+
b //= ( "abs": -3 )
|
|
1467
|
+
HERE
|
|
1468
|
+
# puts "empty_group_sp AST:"
|
|
1469
|
+
# puts parser.ast_debug
|
|
1470
|
+
# puts "simple_group_augmented_uninitialized RULES:"
|
|
1471
|
+
# pp parser.rules
|
|
1472
|
+
assert_equal(["abs"], parser.generate.keys)
|
|
1473
|
+
v = {}
|
|
1474
|
+
10.times do
|
|
1475
|
+
v[parser.generate["abs"]] = true
|
|
1476
|
+
end
|
|
1477
|
+
assert_equal({3 => true, -3 => true}, v)
|
|
1478
|
+
assert parser.validate_for_test({"abs" => 3})
|
|
1479
|
+
assert parser.validate_for_test({"abs" => -3})
|
|
1480
|
+
end
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
def test_simple_type_augmented
|
|
1484
|
+
parser = CDDL::Parser.new <<HERE
|
|
1485
|
+
a = {b}
|
|
1486
|
+
b = ( "abs": t1 )
|
|
1487
|
+
t1 = 3
|
|
1488
|
+
t1 /= -3
|
|
1489
|
+
HERE
|
|
1490
|
+
# puts "empty_group_sp AST:"
|
|
1491
|
+
# puts parser.ast_debug
|
|
1492
|
+
# puts "simple_type_augmented RULES:"
|
|
1493
|
+
# pp parser.rules
|
|
1494
|
+
assert_equal(["abs"], parser.generate.keys)
|
|
1495
|
+
v = {}
|
|
1496
|
+
20.times do # OK, this is probabilistic...
|
|
1497
|
+
v[parser.generate["abs"]] = true
|
|
1498
|
+
end
|
|
1499
|
+
assert_equal({3 => true, -3 => true}, v)
|
|
1500
|
+
assert parser.validate_for_test({"abs" => 3})
|
|
1501
|
+
assert parser.validate_for_test({"abs" => -3})
|
|
1502
|
+
end
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
def test_empty_type_socket
|
|
1506
|
+
parser = CDDL::Parser.new <<HERE
|
|
1507
|
+
a = {b}
|
|
1508
|
+
b = ( "abs": $t1 )
|
|
1509
|
+
HERE
|
|
1510
|
+
# puts "empty_group_sp AST:"
|
|
1511
|
+
# puts parser.ast_debug
|
|
1512
|
+
# puts "simple_type_augmented RULES:"
|
|
1513
|
+
# pp parser.rules
|
|
1514
|
+
assert_raise { parser.generate }
|
|
1515
|
+
end
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
def test_empty_group_socket
|
|
1519
|
+
parser = CDDL::Parser.new <<HERE
|
|
1520
|
+
a = {$$t2}
|
|
1521
|
+
HERE
|
|
1522
|
+
# puts "empty_group_sp AST:"
|
|
1523
|
+
# puts parser.ast_debug
|
|
1524
|
+
# puts "simple_type_augmented RULES:"
|
|
1525
|
+
# pp parser.rules
|
|
1526
|
+
assert_raise { parser.generate }
|
|
1527
|
+
end
|
|
1528
|
+
|
|
1529
|
+
|
|
1530
|
+
def test_validate_empty_type_socket
|
|
1531
|
+
parser = CDDL::Parser.new <<HERE
|
|
1532
|
+
a = {b}
|
|
1533
|
+
b = ( "abs": $t1 / 17 )
|
|
1534
|
+
HERE
|
|
1535
|
+
# puts "empty_group_sp AST:"
|
|
1536
|
+
# puts parser.ast_debug
|
|
1537
|
+
# puts "simple_type_augmented RULES:"
|
|
1538
|
+
# pp parser.rules
|
|
1539
|
+
assert_equal parser.generate, {"abs" => 17}
|
|
1540
|
+
assert parser.validate_for_test({"abs" => 17})
|
|
1541
|
+
end
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
def test_validate_empty_group_socket
|
|
1545
|
+
parser = CDDL::Parser.new <<HERE
|
|
1546
|
+
a = {$$t2 // a: 1}
|
|
1547
|
+
HERE
|
|
1548
|
+
# puts "empty_group_sp AST:"
|
|
1549
|
+
# puts parser.ast_debug
|
|
1550
|
+
# puts "simple_type_augmented RULES:"
|
|
1551
|
+
# pp parser.rules
|
|
1552
|
+
assert_equal parser.generate, {"a" => 1}
|
|
1553
|
+
assert parser.validate_for_test({"a" => 1})
|
|
1554
|
+
end
|
|
1555
|
+
|
|
1556
|
+
|
|
1557
|
+
def test_validate_empty_group_socket_in_star
|
|
1558
|
+
parser = CDDL::Parser.new <<HERE
|
|
1559
|
+
a = {* $$t2}
|
|
1560
|
+
HERE
|
|
1561
|
+
# puts "empty_group_sp AST:"
|
|
1562
|
+
# puts parser.ast_debug
|
|
1563
|
+
# puts "simple_type_augmented RULES:"
|
|
1564
|
+
# pp parser.rules
|
|
1565
|
+
assert_equal parser.generate, {}
|
|
1566
|
+
assert parser.validate_for_test({})
|
|
1567
|
+
end
|
|
1568
|
+
|
|
1569
|
+
def test_aaa_validate_more_socket_in_star
|
|
1570
|
+
parser = CDDL::Parser.new <<HERE
|
|
1571
|
+
tcp-header = {seq: uint, ack: uint, * $$tcp-option}
|
|
1572
|
+
|
|
1573
|
+
; later, in a different file
|
|
1574
|
+
|
|
1575
|
+
$$tcp-option //= (
|
|
1576
|
+
sack: [+(left: uint, right: uint)]
|
|
1577
|
+
)
|
|
1578
|
+
|
|
1579
|
+
; and, maybe in another file
|
|
1580
|
+
|
|
1581
|
+
$$tcp-option //= (
|
|
1582
|
+
sack-permitted: true
|
|
1583
|
+
)
|
|
1584
|
+
HERE
|
|
1585
|
+
# puts "empty_group_sp AST:"
|
|
1586
|
+
# puts parser.ast_debug
|
|
1587
|
+
# puts "simple_type_augmented RULES:"
|
|
1588
|
+
# pp parser.rules
|
|
1589
|
+
10.times do
|
|
1590
|
+
g = parser.generate
|
|
1591
|
+
pp g
|
|
1592
|
+
assert parser.validate_for_test(g)
|
|
1593
|
+
end
|
|
1594
|
+
assert parser.validate_for_test({"seq" => 1, "ack" => 2})
|
|
1595
|
+
end
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
def test_simple_type_augmented_uninitialized
|
|
1599
|
+
parser = CDDL::Parser.new <<HERE
|
|
1600
|
+
a = {b}
|
|
1601
|
+
b = ( "abs": t1 )
|
|
1602
|
+
t1 /= 3
|
|
1603
|
+
t1 /= -3
|
|
1604
|
+
HERE
|
|
1605
|
+
# puts "empty_group_sp AST:"
|
|
1606
|
+
# puts parser.ast_debug
|
|
1607
|
+
# puts "simple_type_augmented_uninitialized RULES:"
|
|
1608
|
+
# pp parser.rules
|
|
1609
|
+
assert_equal(["abs"], parser.generate.keys)
|
|
1610
|
+
v = {}
|
|
1611
|
+
10.times do
|
|
1612
|
+
v[parser.generate["abs"]] = true
|
|
1613
|
+
end
|
|
1614
|
+
assert_equal({3 => true, -3 => true}, v)
|
|
1615
|
+
assert parser.validate_for_test({"abs" => 3})
|
|
1616
|
+
assert parser.validate_for_test({"abs" => -3})
|
|
1617
|
+
end
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
def test_empty_group_indirect
|
|
1621
|
+
parser = CDDL::Parser.new <<HERE
|
|
1622
|
+
a = {b}
|
|
1623
|
+
b = (c)
|
|
1624
|
+
c = ()
|
|
1625
|
+
HERE
|
|
1626
|
+
# XXX: Pending
|
|
1627
|
+
# assert_equal({}, parser.generate)
|
|
1628
|
+
# assert parser.validate_for_test({})
|
|
1629
|
+
end
|
|
1630
|
+
|
|
1631
|
+
def test_group_occur
|
|
1632
|
+
parser = CDDL::Parser.new <<HERE
|
|
1633
|
+
a = [1*3 b]
|
|
1634
|
+
b = (
|
|
1635
|
+
1, 2
|
|
1636
|
+
)
|
|
1637
|
+
HERE
|
|
1638
|
+
parser2 = CDDL::Parser.new <<HERE
|
|
1639
|
+
a = [1*3 (1, 2)]
|
|
1640
|
+
HERE
|
|
1641
|
+
# puts "empty_group_sp AST:"
|
|
1642
|
+
# puts parser.ast_debug
|
|
1643
|
+
# puts "empty_group_sp RULES:"
|
|
1644
|
+
pp parser.rules
|
|
1645
|
+
assert_equal parser.rules, parser2.rules
|
|
1646
|
+
# assert parser.validate_for_test({})
|
|
1647
|
+
10.times {
|
|
1648
|
+
g = parser2.generate
|
|
1649
|
+
# pp ["group-occur", g]
|
|
1650
|
+
assert [2, 4, 6].include? g.size
|
|
1651
|
+
g.each_slice(2) do |sl|
|
|
1652
|
+
assert_equal sl, [1, 2]
|
|
1653
|
+
end
|
|
1654
|
+
assert parser2.validate_for_test(g)
|
|
1655
|
+
refute parser2.validate_for_test(g << 1, false)
|
|
1656
|
+
}
|
|
1657
|
+
end
|
|
1658
|
+
|
|
1659
|
+
def test_aaa_grpchoice
|
|
1660
|
+
parser = CDDL::Parser.new <<HERE
|
|
1661
|
+
result = [2*2 identifier]
|
|
1662
|
+
identifier //= ( "ifmap" // "ifmap")
|
|
1663
|
+
;identifier = ( "ifmap" // "ifmap" )
|
|
1664
|
+
HERE
|
|
1665
|
+
p parser.rules
|
|
1666
|
+
# - [:type1, [:array, [:member, 2, 2, nil, [:grpchoice, [[:member, 1, 1, nil, [:text, "ifmap"]]]]]]]
|
|
1667
|
+
# - [:type1, [:array, [:member, 2, 2, nil, [:grpchoice, [[:grpchoice, [[:member, 1, 1, nil, [:text, "ifmap"]]], [[:member, 1, 1, nil, [:text, "ifmap"]]]]]]]]]
|
|
1668
|
+
# + [:type1, [:array, [:member, 2, 2, nil, [:grpent, [:grpchoice, [[:member, 1, 1, nil, [:text, "ifmap"]]], [[:member, 1, 1, nil, [:text, "ifmap"]]]]]]]]
|
|
1669
|
+
g = parser.generate
|
|
1670
|
+
assert_equal g, ["ifmap", "ifmap"]
|
|
1671
|
+
end
|
|
1672
|
+
|
|
1673
|
+
def test_aaaa_plus_with_choice
|
|
1674
|
+
parser = CDDL::Parser.new <<HERE
|
|
1675
|
+
response = [*locator / divert]
|
|
1676
|
+
locator = 3
|
|
1677
|
+
divert = 4
|
|
1678
|
+
HERE
|
|
1679
|
+
assert_equal [:type1, [:array, [:member, 0, CDDL::MANY, nil, [:type1, [:int, 3], [:int, 4]]]]], parser.rules
|
|
1680
|
+
parser = CDDL::Parser.new <<HERE
|
|
1681
|
+
response = [*(locator / divert)]
|
|
1682
|
+
locator = 3
|
|
1683
|
+
divert = 4
|
|
1684
|
+
HERE
|
|
1685
|
+
assert_equal [:type1, [:array, [:member, 0, CDDL::MANY, nil, [:type1, [:int, 3], [:int, 4]]]]], parser.rules
|
|
1686
|
+
parser = CDDL::Parser.new <<HERE
|
|
1687
|
+
response = [*locator // divert // objective]
|
|
1688
|
+
locator = 3
|
|
1689
|
+
divert = 4
|
|
1690
|
+
objective = 5
|
|
1691
|
+
HERE
|
|
1692
|
+
assert_equal [:type1, [:array, [:grpchoice, [[:member, 0, CDDL::MANY, nil, [:int, 3]]], [[:member, 1, 1, nil, [:int, 4]]], [[:member, 1, 1, nil, [:int, 5]]]]]], parser.rules
|
|
1693
|
+
# 10.times do
|
|
1694
|
+
# p parser.generate
|
|
1695
|
+
# end
|
|
1696
|
+
parser = CDDL::Parser.new <<HERE
|
|
1697
|
+
response = [*locator // divert / objective]
|
|
1698
|
+
locator = 3
|
|
1699
|
+
divert = 4
|
|
1700
|
+
objective = 5
|
|
1701
|
+
HERE
|
|
1702
|
+
assert_equal [:type1, [:array, [:grpchoice, [[:member, 0, CDDL::MANY, nil, [:int, 3]]], [[:member, 1, 1, nil, [:type1, [:int, 4], [:int, 5]]]]]]], parser.rules
|
|
1703
|
+
# 10.times do
|
|
1704
|
+
# p parser.generate
|
|
1705
|
+
# end
|
|
1706
|
+
end
|
|
1707
|
+
|
|
1708
|
+
def test_false_map_values
|
|
1709
|
+
parser = CDDL::Parser.new <<HERE
|
|
1710
|
+
a = {a: nil}
|
|
1711
|
+
HERE
|
|
1712
|
+
g = parser.generate
|
|
1713
|
+
assert parser.validate_for_test(g)
|
|
1714
|
+
assert_equal g, {"a" => nil}
|
|
1715
|
+
assert_equal g.cbor_clone, {"a" => nil}
|
|
1716
|
+
end
|
|
1717
|
+
|
|
1718
|
+
def test_extractor_ignores_map
|
|
1719
|
+
parser = CDDL::Parser.new <<HERE
|
|
1720
|
+
a = {a: nil,
|
|
1721
|
+
beer: mtype, wine: bytes, ? optional: text, cantindex: int}
|
|
1722
|
+
mtype = 1/2/3 ; can't generate anything meaningful here.
|
|
1723
|
+
HERE
|
|
1724
|
+
d = parser.defines("FOO")
|
|
1725
|
+
assert_equal "", d
|
|
1726
|
+
end
|
|
1727
|
+
|
|
1728
|
+
def test_extractor_type1
|
|
1729
|
+
parser = CDDL::Parser.new <<HERE
|
|
1730
|
+
BAR = a/b/c
|
|
1731
|
+
a = 1
|
|
1732
|
+
b = 2
|
|
1733
|
+
c = 3
|
|
1734
|
+
d = 4
|
|
1735
|
+
HERE
|
|
1736
|
+
expected = <<HERE
|
|
1737
|
+
#define FOO_a 1
|
|
1738
|
+
#define FOO_b 2
|
|
1739
|
+
#define FOO_c 3
|
|
1740
|
+
#define FOO_d 4
|
|
1741
|
+
#define FOO_BAR_a 1
|
|
1742
|
+
#define FOO_BAR_b 2
|
|
1743
|
+
#define FOO_BAR_c 3
|
|
1744
|
+
HERE
|
|
1745
|
+
d = parser.defines("FOO")
|
|
1746
|
+
assert_equal expected, d
|
|
1747
|
+
end
|
|
1748
|
+
|
|
1749
|
+
def test_extractor_type1_format_string
|
|
1750
|
+
parser = CDDL::Parser.new <<HERE
|
|
1751
|
+
BAR = a/b/c
|
|
1752
|
+
a = 1
|
|
1753
|
+
b = 2
|
|
1754
|
+
c = 3
|
|
1755
|
+
d = 4
|
|
1756
|
+
HERE
|
|
1757
|
+
expected = <<HERE
|
|
1758
|
+
C_a = 1
|
|
1759
|
+
C_b = 2
|
|
1760
|
+
C_c = 3
|
|
1761
|
+
C_d = 4
|
|
1762
|
+
C_BAR_a = 1
|
|
1763
|
+
C_BAR_b = 2
|
|
1764
|
+
C_BAR_c = 3
|
|
1765
|
+
HERE
|
|
1766
|
+
d = parser.defines("C_%s = %s")
|
|
1767
|
+
assert_equal expected, d
|
|
1768
|
+
end
|
|
1769
|
+
|
|
1770
|
+
def test_extractor_enum
|
|
1771
|
+
parser = CDDL::Parser.new <<HERE
|
|
1772
|
+
|
|
1773
|
+
foo = enum1; why exactly do we need this one?
|
|
1774
|
+
|
|
1775
|
+
enum1 = &(
|
|
1776
|
+
one: 1
|
|
1777
|
+
two: 2
|
|
1778
|
+
three: 3
|
|
1779
|
+
enum2
|
|
1780
|
+
)
|
|
1781
|
+
|
|
1782
|
+
enum2 = (
|
|
1783
|
+
four: 4
|
|
1784
|
+
five: 5
|
|
1785
|
+
)
|
|
1786
|
+
|
|
1787
|
+
HERE
|
|
1788
|
+
expected = <<HERE
|
|
1789
|
+
#define FOO_enum1_one 1
|
|
1790
|
+
#define FOO_enum1_two 2
|
|
1791
|
+
#define FOO_enum1_three 3
|
|
1792
|
+
#define FOO_enum1_four 4
|
|
1793
|
+
#define FOO_enum1_five 5
|
|
1794
|
+
HERE
|
|
1795
|
+
d = parser.defines("FOO")
|
|
1796
|
+
assert_equal expected, d
|
|
1797
|
+
end
|
|
1798
|
+
|
|
1799
|
+
def test_extractor_array
|
|
1800
|
+
parser = CDDL::Parser.new <<HERE
|
|
1801
|
+
message = [mtype,
|
|
1802
|
+
beer: enum1, wine: bytes, ? optional: text, cantindex: int]
|
|
1803
|
+
enum1 = &( one: 1, two: 2)
|
|
1804
|
+
mtype = 1/2/3 ; can't generate anything meaningful here.
|
|
1805
|
+
HERE
|
|
1806
|
+
expected = <<HERE
|
|
1807
|
+
#define FOO_message_mtype_index 0
|
|
1808
|
+
#define FOO_message_beer_index 1
|
|
1809
|
+
#define FOO_message_wine_index 2
|
|
1810
|
+
#define FOO_message_optional_index 3
|
|
1811
|
+
#define FOO_enum1_one 1
|
|
1812
|
+
#define FOO_enum1_two 2
|
|
1813
|
+
HERE
|
|
1814
|
+
d = parser.defines("FOO")
|
|
1815
|
+
assert_equal expected, d
|
|
289
1816
|
end
|
|
290
1817
|
|
|
291
1818
|
|