cddl 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|