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.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/bin/cddl +80 -23
  3. data/cddl.gemspec +4 -2
  4. data/data/cddl.abnf +50 -20
  5. data/data/prelude.cddl +9 -3
  6. data/lib/cbor-pp-play.rb +13 -0
  7. data/lib/cbor-pp.rb +213 -0
  8. data/lib/cddl.rb +1001 -163
  9. data/test/test-cddl.rb +1620 -93
  10. data/test-data/7071-concise-cut.cddl +48 -0
  11. data/test-data/7071-concise.cddl +1 -1
  12. data/test-data/7071-verbose.cddl +1 -1
  13. data/test-data/a.cddl +9 -0
  14. data/test-data/ambig.cddl +2 -0
  15. data/test-data/b.cddl +3 -0
  16. data/test-data/badaddr.cddl +1 -0
  17. data/test-data/basic_syntax_example.cddl +7 -0
  18. data/test-data/cdni-ct.cddl +72 -0
  19. data/test-data/cose.cddl +68 -0
  20. data/test-data/dcaf.cddl +58 -0
  21. data/test-data/dcaf1.cddl +48 -0
  22. data/test-data/dotsize.cddl +7 -0
  23. data/test-data/extractor-demo.cddl +14 -0
  24. data/test-data/grasp-01-extract.cddl +91 -0
  25. data/test-data/grasp-01-test.cddl +90 -0
  26. data/test-data/grasp-01.cddl +90 -0
  27. data/test-data/grasp-09.cddl +108 -0
  28. data/test-data/grasp-v1.cddl +97 -0
  29. data/test-data/grasp-v2X.cddl +89 -0
  30. data/test-data/ifmap-base-2.0v17.cddl +392 -0
  31. data/test-data/ifmap-base-2.2v9_fh-cabo.cddl +149 -0
  32. data/test-data/ifmap-metadata-2.2v9_fh-cabo.cddl +239 -0
  33. data/test-data/ifmap2.cddl +21 -0
  34. data/test-data/jcr-ex.cddl +42 -0
  35. data/test-data/kevin5.cddl +5 -0
  36. data/test-data/map-group.cddl +13 -0
  37. data/test-data/mapkey.cddl +2 -0
  38. data/test-data/minimal.cddl +1 -0
  39. data/test-data/patch1.cddl +13 -0
  40. data/test-data/reused_named_group.cddl +14 -0
  41. data/test-data/structure.cddl +9 -0
  42. data/test-data/toerless0.cddl +14 -0
  43. data/test-data/toerless1.cddl +11 -0
  44. data/test-data/two_anonymous_groups.cddl +13 -0
  45. data/test-data/wrong1.cddl +17 -0
  46. data/test-data/wrong1a.cddl +23 -0
  47. data/test-data/wrong2.cddl +17 -0
  48. data/test-data/wrong2a.cddl +17 -0
  49. data/test-data/xmlmig.cddl +15 -0
  50. 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, [:string, "application"], [:prim, 3]],
24
+ [:member, 1, 1, [:text, "application"], [:prim, 3]],
17
25
  [:member,
18
26
  1,
19
27
  1,
20
- [:string, "reputons"],
28
+ [:text, "reputons"],
21
29
  [:array,
22
30
  [:member,
23
31
  0,
24
- -1,
32
+ CDDL::MANY,
25
33
  nil,
26
34
  [:map,
27
- [:member, 1, 1, [:string, "rater"], [:prim, 3]],
28
- [:member, 1, 1, [:string, "assertion"], [:prim, 3]],
29
- [:member, 1, 1, [:string, "rated"], [:prim, 3]],
30
- [:member, 1, 1, [:string, "rating"], [:prim, 7, 25]],
31
- [:member, 0, 1, [:string, "confidence"], [:prim, 7, 25]],
32
- [:member, 0, 1, [:string, "normal-rating"], [:prim, 7, 25]],
33
- [:member, 0, 1, [:string, "sample-size"], [:prim, 0]],
34
- [:member, 0, 1, [:string, "generated"], [:prim, 0]],
35
- [:member, 0, 1, [:string, "expires"], [:prim, 0]],
36
- [:member, 0, -1, [:type1, [:prim]], [:prim]]]]]]]]
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.validate(g)
120
+ assert parser1.validate_for_test(g)
57
121
  old = g["application"]
58
122
  g["application"] = 4711
59
- refute parser1.validate(g, false)
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.validate(1)
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.validate([])
77
- assert parser.validate([1])
78
- assert parser.validate([1, 1])
79
- refute parser.validate([1, 2], false)
80
- refute parser.validate([2, 1], false)
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.validate([])
88
- assert parser.validate(["one"])
89
- assert parser.validate(["one", "one"])
90
- refute parser.validate([1], false)
91
- refute parser.validate(['two'], false)
92
- refute parser.validate(["one", "two"], false)
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": "one"]
268
+ test = [* "two" => "one"]
99
269
  HERE
100
- assert parser.validate([])
101
- assert parser.validate(["one"])
102
- assert parser.validate(["one", "one"])
103
- refute parser.validate([1], false)
104
- refute parser.validate(['two'], false)
105
- refute parser.validate(["one", "two"], false)
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.validate([], false)
118
- assert parser.validate([1])
119
- refute parser.validate([1, 1], false)
120
- refute parser.validate([1, 2], false)
121
- refute parser.validate([2, 1], false)
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.validate({}, false)
150
- refute parser.validate([], false)
151
- refute parser.validate([1], false)
152
- assert parser.validate([1, 2])
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.validate({}, false)
167
- refute parser.validate([], false)
168
- refute parser.validate([1], false)
169
- assert parser.validate([1, 2])
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.validate([])
184
- assert parser.validate([1, 2])
185
- assert parser.validate([1, 1, 2, 2]) # XXX: This is probably a BUG
186
- refute parser.validate([1, 2, 1, 2], false) # XXX->assert: major surgery required
187
- assert parser.validate([1]) # XXX -> refute (rules left)
188
- refute parser.validate([1, 2, 1], false)
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.validate([], false)
202
- refute parser.validate([1], false)
203
- assert parser.validate([1, 2])
204
- refute parser.validate([2, 1], false)
205
- refute parser.validate([1, 1, 2, 2], false)
206
- refute parser.validate([1, 2, 1, 2], false)
207
- refute parser.validate([1, 2, 1], false)
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.validate([])
221
- assert parser.validate([1])
222
- assert parser.validate([1, 2])
223
- refute parser.validate([2, 1], false)
224
- refute parser.validate([1, 1, 2, 2], false)
225
- refute parser.validate([1, 2, 1, 2], false)
226
- refute parser.validate([1, 2, 1], false)
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.validate([], false)
240
- refute parser.validate([1], false)
241
- assert parser.validate([1, 2])
242
- refute parser.validate([2, 1], false)
243
- assert parser.validate([1, 1, 2, 2]) # XXX not sequence preserving
244
- refute parser.validate([1, 2, 1, 2], false)
245
- refute parser.validate([1, 2, 1], false)
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.validate([])
259
- assert parser.validate([1])
260
- assert parser.validate([1, 2])
261
- refute parser.validate([2, 1], false)
262
- assert parser.validate([1, 1, 2, 2]) # XXX not sequence preserving
263
- refute parser.validate([1, 2, 1, 2], false)
264
- refute parser.validate([1, 2, 1], false)
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
- refute parser.validate([], false)
280
- refute parser.validate([1], false)
281
- refute parser.validate([1, 2], false)
282
- refute parser.validate([2, 1], false)
283
- assert parser.validate([1, 1, 2, 2]) # XXX not sequence preserving
284
- assert parser.validate([1, 1, 1, 2, 2]) # XXX not sequence preserving
285
- assert parser.validate([1, 1, 2, 2, 2]) # XXX not sequence preserving
286
- assert parser.validate([1, 1, 1, 2, 2, 2]) # XXX not sequence preserving
287
- refute parser.validate([1, 2, 1, 2], false)
288
- refute parser.validate([1, 2, 1], false)
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