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.
@@ -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,2 @@
1
+ RECURSIVE op4( _, _ )
2
+ op4( A, B ) == A \/ B
@@ -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]]
@@ -0,0 +1,3 @@
1
+ var_rec_expr_add = var4.a[1+op2]
2
+
3
+
@@ -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( Sexp::VariableDef ) }
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( Sexp::Macro ) }
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( Sexp::OperatorDef ) }
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( Sexp::Procedure ) }
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 )
@@ -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 |identfier|
110
- attribute = identfier.traverse { |m, node_type, enode, node_val| m.concat( expression_value(node_type, enode, node_val )) }
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
- ret = "[#{node_val}]"
119
- # puts "FieldByValue=>#{ret}"
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 "phases" do
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 = described_class.new.initSnippets( entries )
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 successfull" do
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( resolver )
446
+ expect( resolver.initSnippets( nil ) ).to eql( [] )
370
447
  end
371
448
 
372
449
  it "[] input" do
373
- expect( resolver.initSnippets( [] ) ).to eql( resolver )
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 }).initSnippets( uentries )
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