tla-parser-s 0.1.2 → 0.2.2
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/README.md +1 -1
- data/VERSION +1 -1
- data/lib/parser/lvalue.rb +2 -2
- data/lib/parser/parser.rb +1 -1
- data/lib/parser/parser_nodes.rb +200 -85
- data/lib/parser/parser_sexp.treetop +39 -7
- data/lib/semantics/context.rb +113 -55
- data/lib/semantics/resolver.rb +206 -58
- data/lib/semantics/symbol_table.rb +45 -11
- data/lib/utils/logger.rb +2 -1
- data/spec/fixtures/resolver1/op4.tla +2 -0
- data/spec/fixtures/resolver1/op_let.tla +1 -0
- data/spec/fixtures/resolver1/op_tail_chg.tla +1 -0
- data/spec/fixtures/resolver1/var_rec_expr_add.tla +3 -0
- data/spec/parser/parser_fixtures_spec.rb +4 -4
- data/spec/parser/parser_spec.rb +177 -12
- data/spec/semantics/context_spec.rb +52 -0
- data/spec/semantics/resolver_spec.rb +106 -11
- data/spec/semantics/symbol_table_spec.rb +6 -4
- metadata +6 -2
data/lib/utils/logger.rb
CHANGED
@@ -30,8 +30,9 @@ module TlaParserS
|
|
30
30
|
@@logfile = options[:logfile] || File.join( Dir.getwd, LOGFILE )
|
31
31
|
end
|
32
32
|
|
33
|
-
def getLogger( progname, options={} )
|
33
|
+
def getLogger( progname=nil, options={} )
|
34
34
|
|
35
|
+
progname = self.class.name.split('::').last if progname.nil?
|
35
36
|
level = get_level( options )
|
36
37
|
|
37
38
|
if level.nil?
|
@@ -0,0 +1 @@
|
|
1
|
+
op_let == LET x == 3 IN x > var4
|
@@ -0,0 +1 @@
|
|
1
|
+
Tail_changed(s) == [i \in 1..(Len(s)-1) |-> s[i+var4]]
|
@@ -25,7 +25,7 @@ describe TlaParserS::Parser do
|
|
25
25
|
end # it
|
26
26
|
|
27
27
|
context "variables" do
|
28
|
-
let (:variable_nodes) { tree.recursive_select(
|
28
|
+
let (:variable_nodes) { tree.recursive_select( SbuilderSexp::VariableDef ) }
|
29
29
|
|
30
30
|
it "#number of variable definitions" do
|
31
31
|
expect( variable_nodes.length ).to eql( 3 )
|
@@ -40,7 +40,7 @@ describe TlaParserS::Parser do
|
|
40
40
|
|
41
41
|
context "macros" do
|
42
42
|
|
43
|
-
let (:macro_nodes) { tree.recursive_select(
|
43
|
+
let (:macro_nodes) { tree.recursive_select( SbuilderSexp::Macro ) }
|
44
44
|
|
45
45
|
it "#number of macro definitions" do
|
46
46
|
expect( macro_nodes.length ).to eql( 2 )
|
@@ -65,7 +65,7 @@ describe TlaParserS::Parser do
|
|
65
65
|
|
66
66
|
context "operators" do
|
67
67
|
|
68
|
-
let (:operator_nodes) { tree.recursive_select(
|
68
|
+
let (:operator_nodes) { tree.recursive_select( SbuilderSexp::OperatorDef ) }
|
69
69
|
|
70
70
|
it "#number of operator definitions" do
|
71
71
|
expect( operator_nodes.length ).to eql( 2 )
|
@@ -78,7 +78,7 @@ describe TlaParserS::Parser do
|
|
78
78
|
|
79
79
|
context "procedures" do
|
80
80
|
|
81
|
-
let (:procedure_nodes) { tree.recursive_select(
|
81
|
+
let (:procedure_nodes) { tree.recursive_select( SbuilderSexp::Procedure ) }
|
82
82
|
|
83
83
|
it "#number of operator definitions" do
|
84
84
|
expect( procedure_nodes.length ).to eql( 3 )
|
data/spec/parser/parser_spec.rb
CHANGED
@@ -30,6 +30,14 @@ describe TlaParserS::Parser do
|
|
30
30
|
when "Goto"
|
31
31
|
"goto #{node.goto_label}"
|
32
32
|
|
33
|
+
when "WithStatement"
|
34
|
+
expression = node.with_expression.traverse { |m, node_type, enode, node_val | m.concat( expression_value(node_type, enode, node_val)) }
|
35
|
+
statement = node.with_statement.traverse(""){ |memo,node_type, node|
|
36
|
+
memo.concat( statement_value( node_type, node ))
|
37
|
+
}
|
38
|
+
|
39
|
+
"with ( #{expression} ) #{statement}"
|
40
|
+
|
33
41
|
when "Conditional"
|
34
42
|
# eval confition
|
35
43
|
condition = node.condition.traverse { |m, node_type, enode, node_val | m.concat( expression_value(node_type, enode, node_val)) }
|
@@ -105,22 +113,31 @@ describe TlaParserS::Parser do
|
|
105
113
|
"Identifier", "RecordField", "StringValue", "OriginalValue"
|
106
114
|
node_val
|
107
115
|
when "PrimaryExpression"
|
116
|
+
# puts "PrimaryExpression: node: #{node}, elements #{node.elements.join(',')}"
|
108
117
|
accessors=[]
|
109
|
-
node.attribute_accessors && node.attribute_accessors.each do |
|
110
|
-
|
118
|
+
node.attribute_accessors && node.attribute_accessors.each do |accessor|
|
119
|
+
# puts "PrimaryExpression: accessor=#{accessor}, #{accessor.expression_val}"
|
120
|
+
attribute = accessor.traverse { |m, node_type, enode, node_val|
|
121
|
+
# puts "PrimaryExpression: node_type=#{node_type}"
|
122
|
+
m.concat( expression_value(node_type, enode, node_val ))
|
123
|
+
}
|
124
|
+
# puts "PrimaryExpression: accessor=#{accessor} -> attribute=#{attribute}"
|
111
125
|
accessors << attribute
|
112
126
|
end
|
113
127
|
ret = accessors.join('')
|
114
128
|
ret
|
115
129
|
when "FieldByName"
|
116
130
|
".#{node_val}"
|
117
|
-
when "FieldByValue"
|
118
|
-
|
119
|
-
|
120
|
-
ret
|
131
|
+
when "FieldByValue"
|
132
|
+
# puts "FieldByValue: here node: #{node}"
|
133
|
+
expr = node.field_value_expression.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
134
|
+
ret = "[#{expr}]"
|
135
|
+
# puts "FieldByValue: node: #{node}, ret=#{ret}"
|
136
|
+
ret
|
121
137
|
when "RecordExcept"
|
122
138
|
elements=[]
|
123
139
|
node.record_field_definitions && node.record_field_definitions.each_with_index do |field_node,i|
|
140
|
+
# puts "RecordExcept: lvalue_expression= #{field_node.lvalue_expression}=#{field_node.lvalue_expression.text_value}"
|
124
141
|
lvalue_expression = field_node.lvalue_expression.recurse_lvalue
|
125
142
|
rvalue_expression = field_node.rvalue_expression.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
126
143
|
elements << "#{lvalue_expression}=#{rvalue_expression}"
|
@@ -158,6 +175,25 @@ describe TlaParserS::Parser do
|
|
158
175
|
end
|
159
176
|
# puts "SetConstructor: set_elements=#{set_elements}"
|
160
177
|
"{#{ set_elements.join(',')}}"
|
178
|
+
|
179
|
+
when "FunctionExpression"
|
180
|
+
bind_var = nil
|
181
|
+
bind_set = nil
|
182
|
+
expr = nil
|
183
|
+
|
184
|
+
# puts "node.binds_node='#{node.binds_node}'"
|
185
|
+
if node.binds_node then
|
186
|
+
bind_set = node.binds_node.bind_set.traverse { |m, node_type, enode, node_val | m.concat( expression_value(node_type, enode, node_val)) }
|
187
|
+
# puts "SetExpression: bind_set=#{bind_set}"
|
188
|
+
bind_var = node.binds_node.bind_var.node_value
|
189
|
+
# puts "SetExpression: bind_var=#{bind_var}"
|
190
|
+
end
|
191
|
+
|
192
|
+
# puts "function: node.function_expression=#{node.function_expression}"
|
193
|
+
expr = node.function_expression && node.function_expression.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
194
|
+
# puts "function: expression=#{expr}"
|
195
|
+
|
196
|
+
"[#{bind_var} \\in #{bind_set}|->#{expr}]"
|
161
197
|
when "SetExpression"
|
162
198
|
set_expression = nil
|
163
199
|
bind_var = nil
|
@@ -199,6 +235,17 @@ describe TlaParserS::Parser do
|
|
199
235
|
|
200
236
|
"#{node_val}(#{arguments.join(',')})#{ record_field ? "." + record_field : ''}"
|
201
237
|
|
238
|
+
when "LetExpression"
|
239
|
+
# operator in LET
|
240
|
+
operatorDef = node.operatorDef
|
241
|
+
operatorName = operatorDef.name
|
242
|
+
operatorExpr = []
|
243
|
+
operatorExpr << operatorDef.body_node.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
244
|
+
# expression in LET
|
245
|
+
letExpr = []
|
246
|
+
letExpr << node.letExpression.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
247
|
+
# rersult
|
248
|
+
"LET #{operatorName} == #{operatorExpr.join(',') } IN #{letExpr.join(',')}"
|
202
249
|
when "IfExpression"
|
203
250
|
condition_expression = node.condition_node.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
204
251
|
then_expression = node.then_expression_node.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
|
@@ -465,6 +512,14 @@ describe TlaParserS::Parser do
|
|
465
512
|
:expect => "call proc(1)",
|
466
513
|
},
|
467
514
|
|
515
|
+
{
|
516
|
+
:str => 'with ( id \in Set ) skip',
|
517
|
+
:desc => "with Id",
|
518
|
+
:debug => false,
|
519
|
+
:start => :statement,
|
520
|
+
:exception => nil,
|
521
|
+
:expect => 'with ( id\inSet ) skip',
|
522
|
+
},
|
468
523
|
|
469
524
|
{
|
470
525
|
:str => "call proc( 2 , 3 )",
|
@@ -602,6 +657,10 @@ describe TlaParserS::Parser do
|
|
602
657
|
},
|
603
658
|
|
604
659
|
|
660
|
+
|
661
|
+
|
662
|
+
|
663
|
+
|
605
664
|
{
|
606
665
|
:str => "either skip or goto l1",
|
607
666
|
:desc => "Either or (simple)",
|
@@ -989,7 +1048,7 @@ describe TlaParserS::Parser do
|
|
989
1048
|
:debug => false,
|
990
1049
|
:expect => "A",
|
991
1050
|
},
|
992
|
-
|
1051
|
+
|
993
1052
|
{
|
994
1053
|
:str => "1 + 3 ",
|
995
1054
|
:desc => "Addition",
|
@@ -997,6 +1056,29 @@ describe TlaParserS::Parser do
|
|
997
1056
|
:debug => false,
|
998
1057
|
:expect => "1+3",
|
999
1058
|
},
|
1059
|
+
{
|
1060
|
+
:str => "1 ..3 ",
|
1061
|
+
:desc => "Integer range",
|
1062
|
+
:start => :expression,
|
1063
|
+
:debug => false,
|
1064
|
+
:expect => "1..3",
|
1065
|
+
},
|
1066
|
+
|
1067
|
+
{
|
1068
|
+
:str => "Len( s) ",
|
1069
|
+
:desc => "Sequence length",
|
1070
|
+
:start => :expression,
|
1071
|
+
:debug => false,
|
1072
|
+
:expect => "Len(s)",
|
1073
|
+
},
|
1074
|
+
|
1075
|
+
{
|
1076
|
+
:str => "1 .. Len( d) ",
|
1077
|
+
:desc => "Integer range to Len",
|
1078
|
+
:start => :expression,
|
1079
|
+
:debug => false,
|
1080
|
+
:expect => "1..Len(d)",
|
1081
|
+
},
|
1000
1082
|
|
1001
1083
|
{
|
1002
1084
|
:str => "1 \\/ 3 ",
|
@@ -1119,7 +1201,14 @@ describe TlaParserS::Parser do
|
|
1119
1201
|
:expect => '<<1,2+A>>',
|
1120
1202
|
},
|
1121
1203
|
|
1122
|
-
|
1204
|
+
{
|
1205
|
+
:str => '<< 1>> \o <<2>>',
|
1206
|
+
:desc => "Concatenate sequences",
|
1207
|
+
:start => :expression,
|
1208
|
+
:debug => false,
|
1209
|
+
:expect => '<<1>>\o<<2>>',
|
1210
|
+
},
|
1211
|
+
|
1123
1212
|
{
|
1124
1213
|
:str => '{ }',
|
1125
1214
|
:desc => "Empty set expression",
|
@@ -1160,6 +1249,30 @@ describe TlaParserS::Parser do
|
|
1160
1249
|
:expect => '{ x \in Set : TRUE }',
|
1161
1250
|
},
|
1162
1251
|
|
1252
|
+
{
|
1253
|
+
:str => '{ x \in 1..Len(x ): TRUE }',
|
1254
|
+
:desc => "Set contruction using interger range",
|
1255
|
+
:start => :expression,
|
1256
|
+
:debug => false,
|
1257
|
+
:expect => '{ x \in 1..Len(x) : TRUE }',
|
1258
|
+
},
|
1259
|
+
|
1260
|
+
{
|
1261
|
+
:str => 'Cardinality( { } )',
|
1262
|
+
:desc => "Cardinality of set",
|
1263
|
+
:start => :expression,
|
1264
|
+
:debug => false,
|
1265
|
+
:expect => 'Cardinality({})',
|
1266
|
+
},
|
1267
|
+
|
1268
|
+
{
|
1269
|
+
:str => 'Cardinality({ p \in 1 ..Len(steps) : \A s \in steps[p]: s.ctx = Nil } )',
|
1270
|
+
:desc => "Comple cardinality expression",
|
1271
|
+
:start => :expression,
|
1272
|
+
:debug => false,
|
1273
|
+
:expect => 'Cardinality({ p \\in 1..Len(steps) : \\A s \\in steps[p] : s.ctx=Nil })',
|
1274
|
+
},
|
1275
|
+
|
1163
1276
|
{
|
1164
1277
|
:str => '{ x.id : x \in Set }',
|
1165
1278
|
:desc => "Set contruction using element mapper",
|
@@ -1307,16 +1420,23 @@ describe TlaParserS::Parser do
|
|
1307
1420
|
:debug => false,
|
1308
1421
|
:expect => "A.id1.id2.id3",
|
1309
1422
|
},
|
1310
|
-
|
1311
1423
|
|
1312
1424
|
{
|
1313
|
-
:str => 'rec[key] ',
|
1425
|
+
:str => 'rec[key] ',
|
1314
1426
|
:desc => "Record access by value",
|
1315
1427
|
:start => :expression,
|
1316
1428
|
:debug => false,
|
1317
1429
|
:expect => 'rec[key]',
|
1318
1430
|
},
|
1319
1431
|
|
1432
|
+
{
|
1433
|
+
:str => 'rec[key +1] ',
|
1434
|
+
:desc => "Record access by value",
|
1435
|
+
:start => :expression,
|
1436
|
+
:debug => false,
|
1437
|
+
:expect => 'rec[key+1]',
|
1438
|
+
},
|
1439
|
+
|
1320
1440
|
{
|
1321
1441
|
:str => '[ name |-> name, address |-> address ]',
|
1322
1442
|
:desc => "Record as an expression",
|
@@ -1328,13 +1448,21 @@ describe TlaParserS::Parser do
|
|
1328
1448
|
# v_ids := [ v_ids EXCEPT ![id_type] = @ \ { Next_id( id_type ) } ] ;
|
1329
1449
|
|
1330
1450
|
{
|
1331
|
-
:str => '[ v_ids EXCEPT ![id] = a ] ',
|
1451
|
+
:str => '[ v_ids EXCEPT ![id] = a ] ',
|
1332
1452
|
:desc => "Record except, one field using a (indetifier)",
|
1333
1453
|
:start => :expression,
|
1334
1454
|
:debug => false,
|
1335
1455
|
:expect => '[v_ids EXCEPT ![id]=a]',
|
1336
1456
|
},
|
1337
1457
|
|
1458
|
+
{
|
1459
|
+
:str => '[ i \in 1..(Len(s)-1) |-> s[i] ]',
|
1460
|
+
:desc => "Function defines sequence - Tail definition",
|
1461
|
+
:start => :expression,
|
1462
|
+
:debug => false,
|
1463
|
+
:expect => '[i \in 1..(Len(s)-1)|->s[i]]',
|
1464
|
+
},
|
1465
|
+
|
1338
1466
|
{
|
1339
1467
|
:str => '[ op(TRUE) EXCEPT ![id] = a ] ',
|
1340
1468
|
:desc => "Record except using operator",
|
@@ -1393,6 +1521,15 @@ describe TlaParserS::Parser do
|
|
1393
1521
|
:expect => 'CHOOSE x \in t_Owner: 1+2',
|
1394
1522
|
},
|
1395
1523
|
|
1524
|
+
{
|
1525
|
+
:str => 'LET x == 3 IN 1',
|
1526
|
+
:desc => "LET expression",
|
1527
|
+
:start => :expression,
|
1528
|
+
:debug => false,
|
1529
|
+
:expect => 'LET x == 3 IN 1',
|
1530
|
+
},
|
1531
|
+
|
1532
|
+
|
1396
1533
|
{
|
1397
1534
|
:str => 'IF 1=2 THEN FALSE ELSE TRUE',
|
1398
1535
|
:desc => "IF expression",
|
@@ -1421,6 +1558,8 @@ describe TlaParserS::Parser do
|
|
1421
1558
|
|
1422
1559
|
].each_with_index do |testCase,i|
|
1423
1560
|
|
1561
|
+
# next unless testCase[:choose]
|
1562
|
+
|
1424
1563
|
it "#Case #{i}: #{testCase[:desc]} - parse '#{testCase[:str]}' starting '#{testCase[:start]}'" do
|
1425
1564
|
|
1426
1565
|
tree = parser.parse( testCase[:str], testCase[:start] )
|
@@ -1480,7 +1619,33 @@ describe TlaParserS::Parser do
|
|
1480
1619
|
:debug => false,
|
1481
1620
|
:expect => [ "i2", "i3" ],
|
1482
1621
|
},
|
1483
|
-
|
1622
|
+
|
1623
|
+
{
|
1624
|
+
:str => "RECURSIVE f1(_)",
|
1625
|
+
:desc => "Recursive 1 ",
|
1626
|
+
:start => :directive,
|
1627
|
+
:exception => nil,
|
1628
|
+
:debug => false,
|
1629
|
+
:expect => [],
|
1630
|
+
},
|
1631
|
+
|
1632
|
+
{
|
1633
|
+
:str => "RECURSIVE f2(_ ,_ )",
|
1634
|
+
:desc => "Recursive 2 ",
|
1635
|
+
:start => :directive,
|
1636
|
+
:exception => nil,
|
1637
|
+
:debug => false,
|
1638
|
+
:expect => [],
|
1639
|
+
},
|
1640
|
+
|
1641
|
+
{
|
1642
|
+
:str => "RECURSIVE f3(_,_, _)",
|
1643
|
+
:desc => "Recursive 3 ",
|
1644
|
+
:start => :directive,
|
1645
|
+
:exception => nil,
|
1646
|
+
:debug => false,
|
1647
|
+
:expect => [],
|
1648
|
+
},
|
1484
1649
|
|
1485
1650
|
].each_with_index do |testCase,i|
|
1486
1651
|
|
@@ -233,6 +233,55 @@ describe TlaParserS::Context do
|
|
233
233
|
:expect => [{"proc1" => "Procedure:Snippets" }, { "macro1" => "Macro:Snippets" } ],
|
234
234
|
},
|
235
235
|
|
236
|
+
{
|
237
|
+
:initialContext => [
|
238
|
+
<<-EOS,
|
239
|
+
RECURSIVE op(_)
|
240
|
+
op == TRUE
|
241
|
+
EOS
|
242
|
+
],
|
243
|
+
|
244
|
+
:callable => "op2 == op",
|
245
|
+
:start => :callable,
|
246
|
+
:desc => "Recursive directive with plac-holder",
|
247
|
+
:debug => false,
|
248
|
+
:expect_synopsis =>"No Resolved in base context definitions ",
|
249
|
+
:expect => [{"op" => "OperatorDef:Snippets" }],
|
250
|
+
},
|
251
|
+
|
252
|
+
|
253
|
+
{
|
254
|
+
:initialContext => [
|
255
|
+
<<-EOS,
|
256
|
+
var = 1
|
257
|
+
EOS
|
258
|
+
],
|
259
|
+
:callable => 'Tail(s) == [i \in 1..(Len(s)-1) |-> s[i+var]]',
|
260
|
+
:start => :callable,
|
261
|
+
:desc => "Function definition",
|
262
|
+
:debug => false,
|
263
|
+
:expect_synopsis =>"No Resolved in base context definitions ",
|
264
|
+
:expect => [{"s"=>"Identifier:Tail"},
|
265
|
+
{"i"=>"FunctionExpression:Func-1..(Len(s)-1) "},
|
266
|
+
{"var"=>"VariableDef:Snippets"}],
|
267
|
+
},
|
268
|
+
|
269
|
+
{
|
270
|
+
:initialContext => [
|
271
|
+
<<-EOS,
|
272
|
+
op == TRUE
|
273
|
+
var = 1
|
274
|
+
EOS
|
275
|
+
],
|
276
|
+
|
277
|
+
:callable => "op2 == var[op]",
|
278
|
+
:start => :callable,
|
279
|
+
:desc => "Record access by name",
|
280
|
+
:debug => false,
|
281
|
+
:expect_synopsis =>"op and var resolved in initialContext ",
|
282
|
+
:expect => [ {"var"=>"VariableDef:Snippets"}, {"op"=>"OperatorDef:Snippets"}],
|
283
|
+
},
|
284
|
+
|
236
285
|
{
|
237
286
|
:initialContext => [
|
238
287
|
<<-EOS,
|
@@ -401,6 +450,9 @@ describe TlaParserS::Context do
|
|
401
450
|
|
402
451
|
].each_with_index do |testCase,i|
|
403
452
|
|
453
|
+
# next unless testCase[:choose]
|
454
|
+
|
455
|
+
|
404
456
|
describe "#Case #{i+1}: #{testCase[:desc]}'" do
|
405
457
|
|
406
458
|
it "##{testCase[:expect_synopsis]}" do
|
@@ -26,7 +26,7 @@ describe TlaParserS::Resolver do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
|
29
|
-
describe "
|
29
|
+
describe "Initialize context & parse snippets" do
|
30
30
|
|
31
31
|
it "#initContext" do
|
32
32
|
expect( resolver ).to respond_to( :initContext )
|
@@ -37,9 +37,17 @@ describe TlaParserS::Resolver do
|
|
37
37
|
expect( resolver ).to respond_to( :initSnippets )
|
38
38
|
end
|
39
39
|
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "Services to use after init & parse" do
|
43
|
+
|
40
44
|
it "#resolveModules" do
|
41
45
|
expect( resolver ).to respond_to( :resolveModules )
|
42
46
|
end
|
47
|
+
|
48
|
+
it "#sortModules" do
|
49
|
+
expect( resolver ).to respond_to( :sortModules )
|
50
|
+
end
|
43
51
|
|
44
52
|
end
|
45
53
|
|
@@ -53,7 +61,8 @@ describe TlaParserS::Resolver do
|
|
53
61
|
|
54
62
|
|
55
63
|
before :all do
|
56
|
-
@resolver =
|
64
|
+
@resolver = described_class.new
|
65
|
+
@resolver.initSnippets( entries )
|
57
66
|
end
|
58
67
|
|
59
68
|
it "#fixture include some files" do
|
@@ -63,9 +72,7 @@ describe TlaParserS::Resolver do
|
|
63
72
|
# ------------------------------------------------------------------
|
64
73
|
# resolveModules (after initSnippets)
|
65
74
|
|
66
|
-
context "resolveModules
|
67
|
-
|
68
|
-
|
75
|
+
context "resolveModules successfully" do
|
69
76
|
|
70
77
|
%w( proc1 proc2 proc3 proc4 proc5 var1 var2 var4 var5 op1 macro1 macro2 ).each do |entry|
|
71
78
|
it "#defines #{entry} -entry" do
|
@@ -79,7 +86,6 @@ describe TlaParserS::Resolver do
|
|
79
86
|
:entrypoints => ["proc1"],
|
80
87
|
:expect => [ "proc1.tla", "macro1.tla", "directives.tla", "directives.cfg" ]
|
81
88
|
},
|
82
|
-
|
83
89
|
{
|
84
90
|
:desc => "Proc2 calls macro1, macro2",
|
85
91
|
:entrypoints => ["proc2"],
|
@@ -164,6 +170,7 @@ describe TlaParserS::Resolver do
|
|
164
170
|
:expect => [ "stmt_assign.tla", "variables.tla", "var4.tla", "directives.tla" , "op1.tla", "directives.cfg"]
|
165
171
|
},
|
166
172
|
|
173
|
+
|
167
174
|
{
|
168
175
|
:desc => "Assignment statement to record",
|
169
176
|
:entrypoints => ["assignit2"],
|
@@ -188,6 +195,12 @@ describe TlaParserS::Resolver do
|
|
188
195
|
:expect => [ "var_choose_except.tla", "op1.tla", "var4.tla", "directives.tla", "directives.cfg" ]
|
189
196
|
},
|
190
197
|
|
198
|
+
{
|
199
|
+
:desc => "Tail seq-function, ref var4:",
|
200
|
+
:entrypoints => ["Tail_changed"],
|
201
|
+
:expect => [ "op_tail_chg.tla", "var4.tla", "directives.tla", "directives.cfg" ]
|
202
|
+
},
|
203
|
+
|
191
204
|
{
|
192
205
|
:desc => "var = IF THEN ELSE :",
|
193
206
|
:entrypoints => ["var_if"],
|
@@ -212,6 +225,12 @@ describe TlaParserS::Resolver do
|
|
212
225
|
:expect => [ "var_rec_expr.tla", "var4.tla", "op1.tla", "directives.tla", "directives.cfg" ]
|
213
226
|
},
|
214
227
|
|
228
|
+
{
|
229
|
+
:desc => "Record addition exression ",
|
230
|
+
:entrypoints => ["var_rec_expr_add"],
|
231
|
+
:expect => [ "var_rec_expr_add.tla", "var4.tla", "op2.tla", "directives.tla", "directives.cfg" ]
|
232
|
+
},
|
233
|
+
|
215
234
|
{
|
216
235
|
:desc => "Variable definition with set map expression",
|
217
236
|
:entrypoints => ["var_set_expr_map"],
|
@@ -230,7 +249,6 @@ describe TlaParserS::Resolver do
|
|
230
249
|
:expect => [ "stmt_cond.tla", "var4.tla", "var_x.tla", "var5.tla", "directives.tla", "op1.tla", "directives.cfg" ]
|
231
250
|
},
|
232
251
|
|
233
|
-
|
234
252
|
{
|
235
253
|
:desc => "Assert statemtn ",
|
236
254
|
:entrypoints => ["stmt_assert"],
|
@@ -249,6 +267,19 @@ describe TlaParserS::Resolver do
|
|
249
267
|
:entrypoints => ["var_quantify"],
|
250
268
|
:expect => [ "var_quantify.tla", "op1.tla", "var4.tla", "directives.tla", "directives.cfg" ]
|
251
269
|
},
|
270
|
+
|
271
|
+
{
|
272
|
+
:desc => "Let expression",
|
273
|
+
:entrypoints => ["op_let"],
|
274
|
+
:expect => [ "op_let.tla", "var4.tla", "directives.tla", "directives.cfg" ]
|
275
|
+
},
|
276
|
+
|
277
|
+
|
278
|
+
{
|
279
|
+
:desc => "RECURSIVE directive",
|
280
|
+
:entrypoints => ["op4"],
|
281
|
+
:expect => [ "op4.tla", "directives.tla", "directives.cfg" ]
|
282
|
+
},
|
252
283
|
|
253
284
|
].each_with_index do |testCase,i|
|
254
285
|
it "Case #{i+1}: #{testCase[:desc]}" do
|
@@ -261,6 +292,50 @@ describe TlaParserS::Resolver do
|
|
261
292
|
end # each
|
262
293
|
|
263
294
|
end # resoveModule success
|
295
|
+
|
296
|
+
context "sortsModules successfully" do
|
297
|
+
[
|
298
|
+
{
|
299
|
+
:desc => "Empty array sorted",
|
300
|
+
:unsorted => [ ],
|
301
|
+
:expect => [ ]
|
302
|
+
},
|
303
|
+
{
|
304
|
+
:desc => "One module sorted",
|
305
|
+
:unsorted => [ "proc1.tla" ],
|
306
|
+
:expect => [ "proc1.tla" ]
|
307
|
+
},
|
308
|
+
{
|
309
|
+
:desc => "Two modules in correct order",
|
310
|
+
:unsorted => [ "macro1.tla", "proc1.tla" ],
|
311
|
+
:expect => [ "macro1.tla", "proc1.tla" ]
|
312
|
+
},
|
313
|
+
{
|
314
|
+
:desc => "Two modules in correct out of order",
|
315
|
+
:unsorted => [ "proc1.tla", "macro1.tla" ],
|
316
|
+
:expect => [ "macro1.tla", "proc1.tla" ]
|
317
|
+
},
|
318
|
+
{
|
319
|
+
:desc => "Duplicate modules in correct out of order",
|
320
|
+
:unsorted => [ "proc1.tla", "macro1.tla", "proc1.tla" ],
|
321
|
+
:expect => [ "macro1.tla", "proc1.tla" ]
|
322
|
+
},
|
323
|
+
{
|
324
|
+
:desc => "Unresolved module dropped",
|
325
|
+
:unsorted => [ "macro1.tla", "xproc1.tla", "proc1.tla" ],
|
326
|
+
:expect => [ "macro1.tla", "proc1.tla", ]
|
327
|
+
},
|
328
|
+
].each_with_index do |testCase,i|
|
329
|
+
|
330
|
+
it "Sort-case #{i+1}: #{testCase[:desc]}" do
|
331
|
+
sortedModules = @resolver.sortModules( testCase[:unsorted] )
|
332
|
+
expect( sortedModules ).to eql( testCase[:expect] )
|
333
|
+
end
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
end
|
338
|
+
|
264
339
|
|
265
340
|
end # fixture - success
|
266
341
|
|
@@ -270,6 +345,8 @@ describe TlaParserS::Resolver do
|
|
270
345
|
|
271
346
|
describe "resoveModule errors" do
|
272
347
|
|
348
|
+
|
349
|
+
|
273
350
|
[
|
274
351
|
{
|
275
352
|
:desc => "Succesfull case",
|
@@ -292,7 +369,6 @@ describe TlaParserS::Resolver do
|
|
292
369
|
:exception => /Parse error/,
|
293
370
|
:expect => nil,
|
294
371
|
},
|
295
|
-
|
296
372
|
{
|
297
373
|
:desc => "Parse error includes module name",
|
298
374
|
:snippets => [
|
@@ -334,6 +410,7 @@ describe TlaParserS::Resolver do
|
|
334
410
|
].each_with_index do |testCase,i|
|
335
411
|
|
336
412
|
it "Case #{i+1}: #{testCase[:desc]}" do
|
413
|
+
|
337
414
|
resolver = described_class.new
|
338
415
|
|
339
416
|
if ( testCase[:exception] )
|
@@ -366,11 +443,11 @@ describe TlaParserS::Resolver do
|
|
366
443
|
describe "initSnippets" do
|
367
444
|
|
368
445
|
it "#nil input" do
|
369
|
-
expect( resolver.initSnippets( nil ) ).to eql(
|
446
|
+
expect( resolver.initSnippets( nil ) ).to eql( [] )
|
370
447
|
end
|
371
448
|
|
372
449
|
it "[] input" do
|
373
|
-
expect( resolver.initSnippets( [] ) ).to eql(
|
450
|
+
expect( resolver.initSnippets( [] ) ).to eql( [] )
|
374
451
|
end
|
375
452
|
|
376
453
|
it "#unknown file exception" do
|
@@ -394,12 +471,30 @@ describe TlaParserS::Resolver do
|
|
394
471
|
let( :entryPoints ) { ["proc6"] }
|
395
472
|
|
396
473
|
it "outputs to stderr unresolved" do
|
397
|
-
uresolver = described_class.new( {:report_unresolved => true })
|
474
|
+
uresolver = described_class.new( {:report_unresolved => true })
|
475
|
+
uresolver.initSnippets( uentries )
|
398
476
|
expect( uresolver.resolveModules( entryPoints )).to eql( [ "entries[0]"] )
|
399
477
|
expect { uresolver.resolveModules( entryPoints ) }.to output( /Symbol 'unknown' in entry 'proc6'/ ).to_stderr
|
400
478
|
end
|
401
479
|
|
402
480
|
end # reports unresolver
|
481
|
+
|
482
|
+
# ------------------------------------------------------------------
|
483
|
+
#
|
484
|
+
|
485
|
+
# describe "Sort modules" do
|
486
|
+
|
487
|
+
# unsortedModules = [ 1,2 ]
|
488
|
+
|
489
|
+
# it "#returns array" do
|
490
|
+
# expect( resolver.sortModules( unsortedModules ) ).to be_an( Array )
|
491
|
+
# end
|
492
|
+
|
493
|
+
# it "#does not change length of sorted modules" do
|
494
|
+
# expect( resolver.sortModules( unsortedModules ).length ).to eql( unsortedModules.length )
|
495
|
+
# end
|
496
|
+
|
497
|
+
# end
|
403
498
|
|
404
499
|
|
405
500
|
end
|