cddl 0.5.0 → 0.6.0
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 +4 -4
- data/cddl.gemspec +1 -1
- data/data/cddl.abnf +5 -3
- data/data/prelude.cddl +4 -1
- data/lib/cddl.rb +132 -30
- data/test-data/ifmap2.cddl +21 -0
- data/test/test-cddl.rb +193 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 393b811831045b4c855ad1f27ba0fa410c6e5278
|
4
|
+
data.tar.gz: 8f28e4e50d8a408b1ef43c13b90c6c8c00c6d99c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73d8c3fb4b67680d74eeb9ea2b91dc84e9b23410a5ee4f8fb253dddfccbf3531114fece3c2d4008e36cd171c7f833567141690a856f3a41684dfb14f0d227cdf
|
7
|
+
data.tar.gz: 1402b3fd3b79bc6f1c69627125886ef9d59a1693d1c65c76883d79f982551f94af2332cc35eec9f8141100bb8e086a079542677551d2c209ff704b405dc9469a
|
data/cddl.gemspec
CHANGED
data/data/cddl.abnf
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
cddl = S 1*rule
|
2
|
-
rule = typename [genericparm] S
|
3
|
-
/ groupname [genericparm] S
|
2
|
+
rule = typename [genericparm] S assign S type S
|
3
|
+
/ groupname [genericparm] S assign S grpent S
|
4
4
|
|
5
5
|
typename = id
|
6
6
|
groupname = id
|
7
7
|
|
8
|
+
assign = "=" / "/=" / "//="
|
9
|
+
|
8
10
|
genericparm = "<" S id S *("," S id S ) ">"
|
9
11
|
genericarg = "<" S type1 S *("," S type1 S ) ">"
|
10
12
|
|
@@ -66,7 +68,7 @@ SESC = "\" %x20-7E
|
|
66
68
|
|
67
69
|
id = EALPHA *(*("-" / ".") (EALPHA / DIGIT))
|
68
70
|
ALPHA = %x41-5A / %x61-7A
|
69
|
-
EALPHA = %x41-5A / %x61-7A / "@" / "_"
|
71
|
+
EALPHA = %x41-5A / %x61-7A / "@" / "_" / "$"
|
70
72
|
DIGIT = %x30-39
|
71
73
|
DIGIT1 = %x31-39
|
72
74
|
S = *WS
|
data/data/prelude.cddl
CHANGED
@@ -7,7 +7,9 @@ nint = #1
|
|
7
7
|
int = uint / nint
|
8
8
|
|
9
9
|
bstr = #2
|
10
|
+
bytes = bstr
|
10
11
|
tstr = #3
|
12
|
+
text = tstr
|
11
13
|
|
12
14
|
tdate = #6.0(tstr)
|
13
15
|
time = #6.1(number)
|
@@ -40,6 +42,7 @@ false = #7.20
|
|
40
42
|
true = #7.21
|
41
43
|
bool = false / true
|
42
44
|
nil = #7.22
|
45
|
+
null = nil
|
43
46
|
undefined = #7.23
|
44
47
|
|
45
|
-
used_in_cddl_prelude = any /
|
48
|
+
used_in_cddl_prelude = any / bytes / tdate / time / number / biguint / bignint / bigint / integer / decfrac / bigfloat / eb64url / eb64legacy / eb16 / encoded-cbor / uri / b64url / b64legacy / regexp / mime-message / cbor-any / float16 / float32 / float64 / float16-32 / float32-64 / float / false / true / bool / null / undefined / uint / nint / int / text
|
data/lib/cddl.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'abnc'
|
2
2
|
require 'pp'
|
3
3
|
require 'pathname'
|
4
|
-
require 'cbor-pure'
|
4
|
+
require 'cbor-pure' unless defined?(CBOR::Tagged)
|
5
5
|
require 'regexp-examples'
|
6
6
|
require 'colorize'
|
7
7
|
|
@@ -19,6 +19,9 @@ module CDDL
|
|
19
19
|
class ParseError < ArgumentError; end
|
20
20
|
|
21
21
|
class Parser
|
22
|
+
|
23
|
+
class BackTrack < Exception; end
|
24
|
+
|
22
25
|
def initialize(source_text)
|
23
26
|
@abnf = Peggy::ABNF.new
|
24
27
|
_cresult = @abnf.compile! ABNF_SPEC, ignore: :s
|
@@ -81,7 +84,11 @@ module CDDL
|
|
81
84
|
fail "Huh?"
|
82
85
|
end
|
83
86
|
n = rulename.to_s
|
87
|
+
asg = rule.assign.to_s
|
84
88
|
if g = rule.genericparm
|
89
|
+
if asg != "="
|
90
|
+
fail "Augment #{asg.inspect} not implemented for generics"
|
91
|
+
end
|
85
92
|
ids = g.children(:id).map(&:to_s)
|
86
93
|
# puts ["ids", ids].inspect
|
87
94
|
if b = @generics[n]
|
@@ -89,16 +96,36 @@ module CDDL
|
|
89
96
|
end
|
90
97
|
@generics[n] = [rule_ast, ids]
|
91
98
|
else
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
+
case asg
|
100
|
+
when "="
|
101
|
+
if @rules[n]
|
102
|
+
a = strip_nodes(rule_ast).inspect
|
103
|
+
b = strip_nodes(@rules[n]).inspect
|
104
|
+
if a == b
|
105
|
+
warn "*** Warning: Identical redefinition of #{n} as #{a}"
|
106
|
+
else
|
107
|
+
fail "Duplicate rule definition #{n} as #{b} (was #{a})"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
@rules[n] = rule_ast
|
111
|
+
when "/="
|
112
|
+
@rules[n] ||= [:type1]
|
113
|
+
fail "Can't add #{rule_ast} to #{n}" unless rule_ast[0] == :type1
|
114
|
+
# XXX need to check existing rule as well
|
115
|
+
@rules[n].concat rule_ast[1..-1]
|
116
|
+
# puts "#{@rules[n].inspect} /="
|
117
|
+
when "//="
|
118
|
+
@rules[n] ||= [:grpchoice]
|
119
|
+
fail "Can't add #{rule_ast} to #{n}" unless rule_ast[0] == :grpent
|
120
|
+
# XXX need to check existing rule as well
|
121
|
+
if @rules[n][0] == :grpent # widen
|
122
|
+
@rules[n] = [:grpchoice, @rules[n]]
|
99
123
|
end
|
124
|
+
@rules[n] << rule_ast
|
125
|
+
# puts "#{@rules[n].inspect} //="
|
126
|
+
else
|
127
|
+
fail "Unknown assign #{asg.inspect}"
|
100
128
|
end
|
101
|
-
@rules[n] = rule_ast
|
102
129
|
end
|
103
130
|
end
|
104
131
|
# pp @generics
|
@@ -140,13 +167,43 @@ module CDDL
|
|
140
167
|
def generate1(where, inmap = false)
|
141
168
|
case where[0]
|
142
169
|
when :type1
|
143
|
-
|
170
|
+
fail BackTrack.new("Can't generate from empty type choice socket yet") unless where.size > 1
|
171
|
+
begin
|
172
|
+
chosen = where[rand(where.size-1)+1]
|
173
|
+
generate1(chosen)
|
174
|
+
rescue BackTrack
|
175
|
+
tries = where[1..-1].sample(where.size) - [chosen]
|
176
|
+
r = begin
|
177
|
+
if tries.empty?
|
178
|
+
BackTrack.new("No suitable alternative in type choice")
|
179
|
+
else
|
180
|
+
generate1(tries.pop)
|
181
|
+
end
|
182
|
+
rescue BackTrack
|
183
|
+
retry
|
184
|
+
end
|
185
|
+
fail r if BackTrack === r
|
186
|
+
r
|
187
|
+
end
|
144
188
|
when :grpchoice
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
189
|
+
fail BackTrack.new("Can't generate from empty group choice socket yet") unless where.size > 1
|
190
|
+
begin
|
191
|
+
chosen = where[rand(where.size-1)+1]
|
192
|
+
chosen.flat_map {|m| generate1(m, inmap)}
|
193
|
+
rescue BackTrack
|
194
|
+
tries = where[1..-1].sample(where.size) - [chosen]
|
195
|
+
r = begin
|
196
|
+
if tries.empty?
|
197
|
+
BackTrack.new("No suitable alternative in group choice")
|
198
|
+
else
|
199
|
+
tries.pop.flat_map {|m| generate1(m, inmap)}
|
200
|
+
end
|
201
|
+
rescue BackTrack
|
202
|
+
retry
|
203
|
+
end
|
204
|
+
fail r if BackTrack === r
|
205
|
+
r
|
206
|
+
end
|
150
207
|
when :map
|
151
208
|
Hash[where[1..-1].flat_map {|m| generate1(m, true)}]
|
152
209
|
when :recurse_grpent
|
@@ -177,10 +234,26 @@ module CDDL
|
|
177
234
|
st += rand(en + 1 - st) if en != st
|
178
235
|
kr = where[3]
|
179
236
|
vr = where[4]
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
237
|
+
if inmap
|
238
|
+
unless kr
|
239
|
+
if vr[0] == :grpent
|
240
|
+
fail "grpent in map #{vr.inspect}" unless vr.size == 2
|
241
|
+
g = generate1(vr[1], true)
|
242
|
+
# warn "GGG #{g.inspect}"
|
243
|
+
return g
|
244
|
+
else
|
245
|
+
fail "member key not given in map for #{where}" # || vr == [:grpchoice]
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
begin
|
250
|
+
Array.new(st) { [ (generate1(kr) if kr), # XXX: need error in map context
|
251
|
+
generate1(vr)
|
252
|
+
]}
|
253
|
+
rescue BackTrack
|
254
|
+
fail BackTrack("Need #{where[1]}..#{where[2]} of these: #{[kr, vr].inspect}") unless where[1] == 0
|
255
|
+
[]
|
256
|
+
end
|
184
257
|
when :string, :int, :float
|
185
258
|
where[1]
|
186
259
|
when :range
|
@@ -374,8 +447,13 @@ module CDDL
|
|
374
447
|
end
|
375
448
|
}
|
376
449
|
when :member
|
450
|
+
unless k
|
451
|
+
fail "member name not known for group entry #{r} in map" unless v[0] == :grpent
|
452
|
+
d_check1 = d_check.dup
|
453
|
+
# XXX this is ignoring occur = [s, _e]
|
454
|
+
return map_check(d, d_check1, v[1..-1]) && d_check.replace(d_check1)
|
455
|
+
end
|
377
456
|
# this is mostly quadratic; let's do the linear thing if possible
|
378
|
-
fail "member name not known for group entry #{r} in map" unless k
|
379
457
|
simple, simpleval = extract_value(k)
|
380
458
|
if simple
|
381
459
|
# puts "SIMPLE: #{d_check.inspect} #{simpleval}"
|
@@ -417,8 +495,8 @@ module CDDL
|
|
417
495
|
when :array
|
418
496
|
if Array === d
|
419
497
|
# validate1 against the record
|
420
|
-
|
421
|
-
validate_result(
|
498
|
+
idx = validate_forward(d, 0, where)
|
499
|
+
validate_result(idx == d.size) { "cannot complete array #{d} for #{where}" }
|
422
500
|
end
|
423
501
|
when :string, :int, :float
|
424
502
|
_, v = extract_value(where)
|
@@ -534,17 +612,27 @@ module CDDL
|
|
534
612
|
b
|
535
613
|
else
|
536
614
|
r = @rules[name]
|
615
|
+
unless r
|
616
|
+
if name[0] == "$"
|
617
|
+
r = @rules[name] = if name[1] == "$"
|
618
|
+
[:grpchoice]
|
619
|
+
else
|
620
|
+
[:type1]
|
621
|
+
end
|
622
|
+
end
|
623
|
+
end
|
537
624
|
if r
|
538
625
|
t = r_process(name, r)
|
539
626
|
unless t[0] == :type1
|
540
|
-
fail "#{name} not a type #{t}" unless canbegroup && t[0] == :grpent
|
627
|
+
fail "#{name} not a type #{t}" unless canbegroup && (t[0] == :grpent || t[0] == :grpchoice)
|
541
628
|
end
|
542
629
|
t
|
543
630
|
end
|
544
631
|
end
|
545
632
|
end
|
546
633
|
|
547
|
-
RECURSE_TYPE = {grpent: :recurse_grpent,
|
634
|
+
RECURSE_TYPE = {grpent: :recurse_grpent, grpchoice: :recurse_grpent,
|
635
|
+
type1: :recurse} # MMM
|
548
636
|
RECURSE_TYPE.default_proc = proc do |a|
|
549
637
|
fail a.inspect
|
550
638
|
end
|
@@ -557,6 +645,12 @@ module CDDL
|
|
557
645
|
@bindings.push(bindings)
|
558
646
|
r = [t, *r[1..-1].map {|e|
|
559
647
|
case t
|
648
|
+
when :grpchoice
|
649
|
+
fail e[0].inspect unless e[0] == :grpent
|
650
|
+
fail e unless e.size == 2
|
651
|
+
res = grpent(e[1])
|
652
|
+
# warn "RES #{res.inspect}"
|
653
|
+
res
|
560
654
|
when :grpent
|
561
655
|
grpent(e)
|
562
656
|
when :type1
|
@@ -652,10 +746,18 @@ module CDDL
|
|
652
746
|
}
|
653
747
|
end
|
654
748
|
else
|
655
|
-
if t[0] == :
|
656
|
-
|
749
|
+
if t[0] == :grpchoice && occ == [1, 1]
|
750
|
+
[t]
|
751
|
+
else
|
752
|
+
if t[0] == :grpent
|
753
|
+
t = [t[0], *t[1..-1].flatten(1)]
|
754
|
+
end
|
755
|
+
if occ[0] == 0 && t == [:grpchoice]
|
756
|
+
[] # we won't be able to generate any of those
|
757
|
+
else
|
758
|
+
[[:member, *occ, nil, t]]
|
759
|
+
end
|
657
760
|
end
|
658
|
-
[[:member, *occ, nil, t]]
|
659
761
|
end
|
660
762
|
end
|
661
763
|
end
|
@@ -730,7 +832,7 @@ module CDDL
|
|
730
832
|
end
|
731
833
|
when :recurse_grpent # XXX we don't have the entry yet
|
732
834
|
when :member
|
733
|
-
fail "map entry without member key given: #{member}" unless member[3]
|
835
|
+
fail "map entry without member key given: #{member}" unless member[3] || member[4][0] == :grpent # || member[4] == [:grpchoice]
|
734
836
|
else
|
735
837
|
fail ["type1 member", member].inspect unless member[0] == :member
|
736
838
|
end
|
@@ -778,7 +880,7 @@ module CDDL
|
|
778
880
|
when /\A[\[{]/
|
779
881
|
type = BRACE[str[0]]
|
780
882
|
@insides << type
|
781
|
-
s = n.children(:group).flat_map {|
|
883
|
+
s = n.children(:group).flat_map {|g| group(g)}
|
782
884
|
@insides.pop
|
783
885
|
if type == :map
|
784
886
|
memberkey_check(s)
|
@@ -791,7 +893,7 @@ module CDDL
|
|
791
893
|
s = group_recall(gn.to_s, n.genericarg).flatten(1)
|
792
894
|
else
|
793
895
|
@insides << :enum
|
794
|
-
s = n.children(:group).flat_map {|
|
896
|
+
s = n.children(:group).flat_map {|g| group(g)}
|
795
897
|
@insides.pop
|
796
898
|
end
|
797
899
|
[:type1, *s.map {|mem|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
response =
|
2
|
+
["ifmap", "response",
|
3
|
+
[ ? validation-attributes ],
|
4
|
+
[ response-choice ]]
|
5
|
+
|
6
|
+
response-choice = (
|
7
|
+
error-result // poll-result // search-result // subscribe-received //
|
8
|
+
publish-received // purge-publisher-received // new-session-result //
|
9
|
+
renew-session-result // end-session-result
|
10
|
+
)
|
11
|
+
|
12
|
+
error-result = 1
|
13
|
+
poll-result = 2
|
14
|
+
search-result = 3
|
15
|
+
subscribe-received = 4
|
16
|
+
publish-received = 5
|
17
|
+
purge-publisher-received = 6
|
18
|
+
new-session-result = 7
|
19
|
+
renew-session-result = 8
|
20
|
+
end-session-result = 9
|
21
|
+
validation-attributes = (10, 11)
|
data/test/test-cddl.rb
CHANGED
@@ -428,7 +428,28 @@ HERE
|
|
428
428
|
}
|
429
429
|
end
|
430
430
|
|
431
|
-
|
431
|
+
def test_another_simple_alternative_group_occur
|
432
|
+
parser = CDDL::Parser.new <<HERE
|
433
|
+
test = {
|
434
|
+
?(bar: int // bar: true)
|
435
|
+
}
|
436
|
+
HERE
|
437
|
+
pp parser.rules
|
438
|
+
parser.validate({})
|
439
|
+
10.times {
|
440
|
+
g = parser.generate
|
441
|
+
# pp ["tasag", g]
|
442
|
+
if g != {}
|
443
|
+
bar = g['bar']
|
444
|
+
fail "GGG #{g.inspect}" unless bar
|
445
|
+
assert bar == true || Integer(bar)
|
446
|
+
assert parser.validate(g)
|
447
|
+
refute parser.validate(g.merge(foo: 3), false)
|
448
|
+
refute parser.validate(g.merge(bar: "baz"), false)
|
449
|
+
end
|
450
|
+
}
|
451
|
+
end
|
452
|
+
|
432
453
|
def test_bad_simple_alternative_group
|
433
454
|
parser = CDDL::Parser.new <<HERE
|
434
455
|
test = {
|
@@ -1068,6 +1089,176 @@ HERE
|
|
1068
1089
|
assert parser.validate({})
|
1069
1090
|
end
|
1070
1091
|
|
1092
|
+
|
1093
|
+
def test_empty_group_augmented
|
1094
|
+
parser = CDDL::Parser.new <<HERE
|
1095
|
+
a = {b}
|
1096
|
+
b = (
|
1097
|
+
)
|
1098
|
+
; b //= (3) PENDING: need to recognize this as group
|
1099
|
+
b //= ()
|
1100
|
+
HERE
|
1101
|
+
# puts "empty_group_sp AST:"
|
1102
|
+
# puts parser.ast_debug
|
1103
|
+
# puts "empty_group_sp RULES:"
|
1104
|
+
# pp parser.rules
|
1105
|
+
assert_equal({}, parser.generate)
|
1106
|
+
assert parser.validate({})
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
def test_simple_group_augmented
|
1110
|
+
parser = CDDL::Parser.new <<HERE
|
1111
|
+
a = {b}
|
1112
|
+
b = ( "abs": 3 )
|
1113
|
+
; b //= (3) PENDING: need to recognize this as group
|
1114
|
+
b //= ( "abs": -3 )
|
1115
|
+
b //= ( "abs": 5 )
|
1116
|
+
HERE
|
1117
|
+
# puts "empty_group_sp AST:"
|
1118
|
+
# puts parser.ast_debug
|
1119
|
+
# puts "simple_group_augmented RULES:"
|
1120
|
+
# pp parser.rules
|
1121
|
+
assert_equal(["abs"], parser.generate.keys)
|
1122
|
+
v = {}
|
1123
|
+
20.times do
|
1124
|
+
v[parser.generate["abs"]] = true
|
1125
|
+
end
|
1126
|
+
assert_equal({3 => true, -3 => true, 5 => true}, v)
|
1127
|
+
assert parser.validate({"abs" => 3})
|
1128
|
+
assert parser.validate({"abs" => 5})
|
1129
|
+
assert parser.validate({"abs" => -3})
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
def test_simple_group_augmented_uninitialized
|
1133
|
+
parser = CDDL::Parser.new <<HERE
|
1134
|
+
a = {b}
|
1135
|
+
b //= ( "abs": 3 )
|
1136
|
+
; b //= (3) PENDING: need to recognize this as group
|
1137
|
+
b //= ( "abs": -3 )
|
1138
|
+
HERE
|
1139
|
+
# puts "empty_group_sp AST:"
|
1140
|
+
# puts parser.ast_debug
|
1141
|
+
# puts "simple_group_augmented_uninitialized RULES:"
|
1142
|
+
# pp parser.rules
|
1143
|
+
assert_equal(["abs"], parser.generate.keys)
|
1144
|
+
v = {}
|
1145
|
+
10.times do
|
1146
|
+
v[parser.generate["abs"]] = true
|
1147
|
+
end
|
1148
|
+
assert_equal({3 => true, -3 => true}, v)
|
1149
|
+
assert parser.validate({"abs" => 3})
|
1150
|
+
assert parser.validate({"abs" => -3})
|
1151
|
+
end
|
1152
|
+
|
1153
|
+
|
1154
|
+
def test_simple_type_augmented
|
1155
|
+
parser = CDDL::Parser.new <<HERE
|
1156
|
+
a = {b}
|
1157
|
+
b = ( "abs": t1 )
|
1158
|
+
t1 = 3
|
1159
|
+
t1 /= -3
|
1160
|
+
HERE
|
1161
|
+
# puts "empty_group_sp AST:"
|
1162
|
+
# puts parser.ast_debug
|
1163
|
+
# puts "simple_type_augmented RULES:"
|
1164
|
+
# pp parser.rules
|
1165
|
+
assert_equal(["abs"], parser.generate.keys)
|
1166
|
+
v = {}
|
1167
|
+
10.times do
|
1168
|
+
v[parser.generate["abs"]] = true
|
1169
|
+
end
|
1170
|
+
assert_equal({3 => true, -3 => true}, v)
|
1171
|
+
assert parser.validate({"abs" => 3})
|
1172
|
+
assert parser.validate({"abs" => -3})
|
1173
|
+
end
|
1174
|
+
|
1175
|
+
|
1176
|
+
def test_empty_type_socket
|
1177
|
+
parser = CDDL::Parser.new <<HERE
|
1178
|
+
a = {b}
|
1179
|
+
b = ( "abs": $t1 )
|
1180
|
+
HERE
|
1181
|
+
# puts "empty_group_sp AST:"
|
1182
|
+
# puts parser.ast_debug
|
1183
|
+
# puts "simple_type_augmented RULES:"
|
1184
|
+
# pp parser.rules
|
1185
|
+
assert_raise { parser.generate }
|
1186
|
+
end
|
1187
|
+
|
1188
|
+
|
1189
|
+
def test_empty_group_socket
|
1190
|
+
parser = CDDL::Parser.new <<HERE
|
1191
|
+
a = {$$t2}
|
1192
|
+
HERE
|
1193
|
+
# puts "empty_group_sp AST:"
|
1194
|
+
# puts parser.ast_debug
|
1195
|
+
# puts "simple_type_augmented RULES:"
|
1196
|
+
# pp parser.rules
|
1197
|
+
assert_raise { parser.generate }
|
1198
|
+
end
|
1199
|
+
|
1200
|
+
|
1201
|
+
def test_validate_empty_type_socket
|
1202
|
+
parser = CDDL::Parser.new <<HERE
|
1203
|
+
a = {b}
|
1204
|
+
b = ( "abs": $t1 / 17 )
|
1205
|
+
HERE
|
1206
|
+
# puts "empty_group_sp AST:"
|
1207
|
+
# puts parser.ast_debug
|
1208
|
+
# puts "simple_type_augmented RULES:"
|
1209
|
+
# pp parser.rules
|
1210
|
+
assert_equal parser.generate, {"abs" => 17}
|
1211
|
+
assert parser.validate({"abs" => 17})
|
1212
|
+
end
|
1213
|
+
|
1214
|
+
|
1215
|
+
def test_validate_empty_group_socket
|
1216
|
+
parser = CDDL::Parser.new <<HERE
|
1217
|
+
a = {$$t2 // a: 1}
|
1218
|
+
HERE
|
1219
|
+
# puts "empty_group_sp AST:"
|
1220
|
+
# puts parser.ast_debug
|
1221
|
+
# puts "simple_type_augmented RULES:"
|
1222
|
+
# pp parser.rules
|
1223
|
+
assert_equal parser.generate, {"a" => 1}
|
1224
|
+
assert parser.validate({"a" => 1})
|
1225
|
+
end
|
1226
|
+
|
1227
|
+
|
1228
|
+
def test_validate_empty_group_socket_in_star
|
1229
|
+
parser = CDDL::Parser.new <<HERE
|
1230
|
+
a = {* $$t2}
|
1231
|
+
HERE
|
1232
|
+
# puts "empty_group_sp AST:"
|
1233
|
+
# puts parser.ast_debug
|
1234
|
+
# puts "simple_type_augmented RULES:"
|
1235
|
+
# pp parser.rules
|
1236
|
+
assert_equal parser.generate, {}
|
1237
|
+
assert parser.validate({})
|
1238
|
+
end
|
1239
|
+
|
1240
|
+
|
1241
|
+
def test_simple_type_augmented_uninitialized
|
1242
|
+
parser = CDDL::Parser.new <<HERE
|
1243
|
+
a = {b}
|
1244
|
+
b = ( "abs": t1 )
|
1245
|
+
t1 /= 3
|
1246
|
+
t1 /= -3
|
1247
|
+
HERE
|
1248
|
+
# puts "empty_group_sp AST:"
|
1249
|
+
# puts parser.ast_debug
|
1250
|
+
# puts "simple_type_augmented_uninitialized RULES:"
|
1251
|
+
# pp parser.rules
|
1252
|
+
assert_equal(["abs"], parser.generate.keys)
|
1253
|
+
v = {}
|
1254
|
+
10.times do
|
1255
|
+
v[parser.generate["abs"]] = true
|
1256
|
+
end
|
1257
|
+
assert_equal({3 => true, -3 => true}, v)
|
1258
|
+
assert parser.validate({"abs" => 3})
|
1259
|
+
assert parser.validate({"abs" => -3})
|
1260
|
+
end
|
1261
|
+
|
1071
1262
|
|
1072
1263
|
def test_empty_group_indirect
|
1073
1264
|
parser = CDDL::Parser.new <<HERE
|
@@ -1075,7 +1266,7 @@ a = {b}
|
|
1075
1266
|
b = (c)
|
1076
1267
|
c = ()
|
1077
1268
|
HERE
|
1078
|
-
# XXX
|
1269
|
+
# XXX: Pending
|
1079
1270
|
# assert_equal({}, parser.generate)
|
1080
1271
|
# assert parser.validate({})
|
1081
1272
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cddl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carsten Bormann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cbor-diag
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- test-data/cdni-ct.cddl
|
107
107
|
- test-data/dcaf1.cddl
|
108
108
|
- test-data/ifmap-base-2.0v17.cddl
|
109
|
+
- test-data/ifmap2.cddl
|
109
110
|
- test-data/jcr-ex.cddl
|
110
111
|
- test-data/minimal.cddl
|
111
112
|
- test-data/reused_named_group.cddl
|
@@ -136,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
137
|
version: '0'
|
137
138
|
requirements: []
|
138
139
|
rubyforge_project:
|
139
|
-
rubygems_version: 2.4.
|
140
|
+
rubygems_version: 2.4.8
|
140
141
|
signing_key:
|
141
142
|
specification_version: 4
|
142
143
|
summary: CDDL generator and validator.
|