tp_plus 0.0.87 → 0.0.88

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +87 -87
  3. data/Rakefile +35 -35
  4. data/bin/tpp +92 -92
  5. data/lib/tp_plus/interpreter.rb +153 -152
  6. data/lib/tp_plus/namespace.rb +66 -66
  7. data/lib/tp_plus/nodes/abort_node.rb +9 -9
  8. data/lib/tp_plus/nodes/acc_node.rb +24 -19
  9. data/lib/tp_plus/nodes/address_node.rb +22 -22
  10. data/lib/tp_plus/nodes/argument_node.rb +20 -20
  11. data/lib/tp_plus/nodes/assignment_node.rb +52 -52
  12. data/lib/tp_plus/nodes/base_node.rb +9 -9
  13. data/lib/tp_plus/nodes/call_node.rb +34 -34
  14. data/lib/tp_plus/nodes/case_condition_node.rb +26 -26
  15. data/lib/tp_plus/nodes/case_node.rb +33 -33
  16. data/lib/tp_plus/nodes/comment_node.rb +18 -18
  17. data/lib/tp_plus/nodes/conditional_node.rb +60 -60
  18. data/lib/tp_plus/nodes/definition_node.rb +22 -22
  19. data/lib/tp_plus/nodes/digit_node.rb +22 -22
  20. data/lib/tp_plus/nodes/empty_stmt_node.rb +9 -9
  21. data/lib/tp_plus/nodes/eval_node.rb +13 -13
  22. data/lib/tp_plus/nodes/expression_node.rb +71 -68
  23. data/lib/tp_plus/nodes/for_node.rb +20 -20
  24. data/lib/tp_plus/nodes/header_node.rb +27 -27
  25. data/lib/tp_plus/nodes/indirect_node.rb +27 -27
  26. data/lib/tp_plus/nodes/inline_conditional_node.rb +36 -36
  27. data/lib/tp_plus/nodes/io_method_node.rb +55 -55
  28. data/lib/tp_plus/nodes/io_node.rb +31 -31
  29. data/lib/tp_plus/nodes/jpos_node.rb +13 -13
  30. data/lib/tp_plus/nodes/jump_node.rb +23 -23
  31. data/lib/tp_plus/nodes/label_definition_node.rb +21 -21
  32. data/lib/tp_plus/nodes/lpos_node.rb +13 -13
  33. data/lib/tp_plus/nodes/motion_node.rb +62 -62
  34. data/lib/tp_plus/nodes/namespace_node.rb +16 -16
  35. data/lib/tp_plus/nodes/namespaced_var_node.rb +38 -38
  36. data/lib/tp_plus/nodes/numreg_node.rb +26 -26
  37. data/lib/tp_plus/nodes/offset_node.rb +27 -27
  38. data/lib/tp_plus/nodes/operator_node.rb +78 -80
  39. data/lib/tp_plus/nodes/paren_expression_node.rb +17 -17
  40. data/lib/tp_plus/nodes/pause_node.rb +9 -9
  41. data/lib/tp_plus/nodes/position_data_node.rb +66 -66
  42. data/lib/tp_plus/nodes/position_node.rb +26 -26
  43. data/lib/tp_plus/nodes/posreg_node.rb +64 -64
  44. data/lib/tp_plus/nodes/raise_node.rb +13 -13
  45. data/lib/tp_plus/nodes/real_node.rb +27 -27
  46. data/lib/tp_plus/nodes/return_node.rb +9 -9
  47. data/lib/tp_plus/nodes/set_skip_node.rb +14 -14
  48. data/lib/tp_plus/nodes/skip_node.rb +22 -22
  49. data/lib/tp_plus/nodes/speed_node.rb +29 -29
  50. data/lib/tp_plus/nodes/string_node.rb +13 -13
  51. data/lib/tp_plus/nodes/string_register_node.rb +26 -26
  52. data/lib/tp_plus/nodes/termination_node.rb +29 -23
  53. data/lib/tp_plus/nodes/terminator_node.rb +16 -16
  54. data/lib/tp_plus/nodes/time_node.rb +24 -24
  55. data/lib/tp_plus/nodes/timer_method_node.rb +33 -33
  56. data/lib/tp_plus/nodes/timer_node.rb +16 -16
  57. data/lib/tp_plus/nodes/unary_expression_node.rb +40 -39
  58. data/lib/tp_plus/nodes/units_node.rb +20 -20
  59. data/lib/tp_plus/nodes/use_node.rb +21 -21
  60. data/lib/tp_plus/nodes/user_alarm_node.rb +16 -16
  61. data/lib/tp_plus/nodes/var_method_node.rb +23 -23
  62. data/lib/tp_plus/nodes/var_node.rb +39 -39
  63. data/lib/tp_plus/nodes/vision_register_node.rb +22 -22
  64. data/lib/tp_plus/nodes/wait_for_node.rb +57 -50
  65. data/lib/tp_plus/nodes/wait_until_node.rb +61 -61
  66. data/lib/tp_plus/nodes/while_node.rb +40 -40
  67. data/lib/tp_plus/parser.rb +1749 -1749
  68. data/lib/tp_plus/scanner.rb +295 -295
  69. data/lib/tp_plus/token.rb +101 -101
  70. data/lib/tp_plus/version.rb +3 -3
  71. data/lib/tp_plus.rb +72 -72
  72. data/test/test_helper.rb +5 -5
  73. data/test/tp_plus/test_interpreter.rb +1378 -1372
  74. data/test/tp_plus/test_parser.rb +502 -502
  75. data/test/tp_plus/test_scanner.rb +591 -591
  76. data/tp_plus.gemspec +31 -31
  77. metadata +4 -3
@@ -1,502 +1,502 @@
1
- require_relative '../test_helper'
2
-
3
- class TestParser < Test::Unit::TestCase
4
- include TPPlus::Nodes
5
-
6
- def setup
7
- @scanner = TPPlus::Scanner.new
8
- @parser = TPPlus::Parser.new @scanner
9
- @interpreter = @parser.interpreter
10
- end
11
-
12
- def parse(s)
13
- @scanner.scan_setup(s)
14
- @parser.parse
15
- end
16
-
17
- def last_node
18
- @last_node ||= @interpreter.nodes.last
19
- end
20
-
21
- def assert_node_type(t, n)
22
- assert_equal t, n.class
23
- end
24
-
25
- def test_minimum_prog
26
- parse("")
27
- end
28
-
29
- def blank_prog
30
- parse("\n\n\n\n\n")
31
- end
32
-
33
- def test_comment
34
- parse("# foo")
35
- assert_node_type CommentNode, last_node
36
- end
37
-
38
- def test_numreg_definition
39
- parse("foo := R[1]")
40
- assert_node_type DefinitionNode, last_node
41
- end
42
-
43
- def test_assignment
44
- parse("foo = 1")
45
- assert_node_type AssignmentNode, last_node
46
- end
47
-
48
- def test_label_definition
49
- parse("@foo")
50
- assert_node_type LabelDefinitionNode, last_node
51
- end
52
-
53
- def test_jump_to
54
- parse("@foo\njump_to @foo")
55
- assert_node_type JumpNode, last_node
56
- end
57
-
58
- def test_plus_equal
59
- parse("foo += 1")
60
- l = last_node
61
- assert_node_type AssignmentNode, l
62
- assert_node_type VarNode, l.identifier
63
- assert_node_type ExpressionNode, l.assignable
64
- assert_node_type VarNode, l.assignable.left_op
65
- end
66
-
67
- def test_minus_equal
68
- parse("foo -= 1")
69
- l = last_node
70
- assert_node_type AssignmentNode, l
71
- assert_node_type VarNode, l.identifier
72
- assert_node_type ExpressionNode, l.assignable
73
- assert_node_type VarNode, l.assignable.left_op
74
- end
75
-
76
- def test_turn_on
77
- parse("turn_on foo")
78
- assert_node_type IOMethodNode, last_node
79
- end
80
-
81
- def test_turn_off
82
- parse("turn_off foo")
83
- assert_node_type IOMethodNode, last_node
84
- end
85
-
86
- def test_toggle
87
- parse("toggle foo")
88
- assert_node_type IOMethodNode, last_node
89
- end
90
-
91
- def test_motion
92
- parse("linear_move.to(home).at(2000, 'mm/s').term(0)")
93
- assert_node_type MotionNode, last_node
94
- end
95
-
96
- def test_simple_if
97
- parse("if 1==1 \n\n\njump_to @foo\nend")
98
- assert_node_type ConditionalNode, last_node
99
- end
100
-
101
- def test_if_with_else
102
- parse("if 1==1 \n\n\njump_to @foo\n else \n# something\nend")
103
- assert_node_type ConditionalNode, last_node
104
- end
105
-
106
- def test_simple_unless
107
- parse("unless 1==1\njump_to @foo\nend")
108
- assert_node_type ConditionalNode, last_node
109
- end
110
-
111
- def test_inline_if
112
- parse("jump_to @foo if foo < 10")
113
- assert_node_type InlineConditionalNode, last_node
114
- end
115
-
116
- def test_inline_if_assignment
117
- parse("foo = 1 if foo < 10")
118
- assert_node_type InlineConditionalNode, last_node
119
- end
120
-
121
- def test_inline_io_method
122
- parse("turn_on foo if bar < 10")
123
- assert_node_type InlineConditionalNode, last_node
124
- end
125
-
126
- def test_prog_call
127
- parse("foo()")
128
- assert_node_type CallNode, last_node
129
- end
130
-
131
- def test_prog_call_with_an_arg
132
- parse("foo(1)")
133
- l = last_node
134
- assert_node_type CallNode, l
135
- assert_equal 1, l.args.length
136
- end
137
-
138
- def test_prog_call_with_multiple_args
139
- parse("foo(1,2,3)")
140
- l = last_node
141
- assert_equal 3, l.args.length
142
- end
143
-
144
- def test_prog_call_with_variable_arg
145
- parse("foo(bar)")
146
- assert_node_type CallNode, last_node
147
- end
148
-
149
- def test_position_definition
150
- parse("foo := P[1]")
151
- assert_node_type DefinitionNode, last_node
152
- end
153
-
154
- def test_uframe_assignment
155
- parse("uframe_num = 5")
156
- assert_node_type AssignmentNode, last_node
157
- end
158
-
159
- def test_utool_assignment
160
- parse("utool_num = 5")
161
- assert_node_type AssignmentNode, last_node
162
- end
163
-
164
- def test_offset
165
- parse("foo := P[1]\nbar := PR[1]\nlinear_move.to(foo).at(2000, 'mm/s').term(0).offset(bar)")
166
- assert_node_type MotionNode, last_node
167
- end
168
-
169
- def test_vr_offset
170
- parse("foo := P[1]\nbar := VR[1]\nlinear_move.to(foo).at(2000, 'mm/s').term(0).offset(bar)")
171
- assert_node_type MotionNode, last_node
172
- end
173
-
174
- def test_time_before
175
- parse("p := P[1]\nlinear_move.to(p).at(2000, 'mm/s').term(0).time_before(0.1, foo())")
176
- assert_node_type MotionNode, last_node
177
- end
178
-
179
- def test_use_uframe
180
- parse("use_uframe 5")
181
- assert_node_type UseNode, last_node
182
- end
183
-
184
- def test_indirect_uframe
185
- parse("foo := R[1]\nuse_uframe foo")
186
- assert_node_type UseNode, last_node
187
- end
188
-
189
- def test_use_utool
190
- parse("use_utool 5")
191
- assert_node_type UseNode, last_node
192
- end
193
-
194
- def test_indirect_utool
195
- parse("foo := R[1]\nuse_utool foo")
196
- assert_node_type UseNode, last_node
197
- end
198
-
199
- def test_use_payload
200
- parse("use_payload 1")
201
- assert_node_type UseNode, last_node
202
- end
203
-
204
- def test_indirect_payload
205
- parse("foo := R[1]\nuse_payload foo")
206
- assert_node_type UseNode, last_node
207
- end
208
-
209
- def test_can_name_a_label_end
210
- parse("@end")
211
- assert_node_type LabelDefinitionNode, last_node
212
- end
213
-
214
- def test_wait_for_with_units
215
- parse("wait_for(5,'s')")
216
- assert_node_type WaitForNode, last_node
217
- end
218
-
219
- def test_scan_wait_until
220
- parse("wait_until(1==0)")
221
- assert_node_type WaitUntilNode, last_node
222
- end
223
-
224
- def test_scans_assignment_with_negative_number
225
- parse("foo := R[1]\nfoo = -1")
226
- assert_node_type AssignmentNode, last_node
227
- end
228
-
229
- def test_scans_simplest_case_statement
230
- parse("foo := R[1]\ncase foo\nwhen 1\njump_to @asdf\nend\n@asdf")
231
- assert_node_type CaseNode, @interpreter.nodes[2]
232
- end
233
-
234
- def test_scans_case_with_else
235
- parse("foo := R[1]\ncase foo\nwhen 1\njump_to @asdf\nelse\njump_to @ghjk\nend\n@asdf\n@ghjk")
236
- assert_node_type CaseNode, @interpreter.nodes[2]
237
- end
238
-
239
- def test_scans_two_cases
240
- parse("foo := R[1]\ncase foo\nwhen 1\njump_to @asdf\nwhen 2\njump_to @ghjk\nend\n@asdf\n@ghjk")
241
- assert_node_type CaseNode, @interpreter.nodes[2]
242
- end
243
-
244
- def test_case_can_use_a_var_as_a_condition
245
- parse("foo := R[1]\nbar := R[2]\ncase foo\nwhen bar\njump_to @asdf\nend\n@asdf")
246
- assert_node_type CaseNode, @interpreter.nodes[4]
247
- end
248
-
249
- def test_case_can_call_a_prog_as_an_action
250
- parse("foo := R[1]\ncase foo\nwhen 1\nmy_program()\nend\n@asdf")
251
- assert_node_type CaseNode, @interpreter.nodes[2]
252
- end
253
-
254
- def test_can_define_input
255
- parse("foo := UI[1]")
256
- assert_node_type DefinitionNode, last_node
257
- end
258
-
259
- def test_can_inline_conditional_just_io_value
260
- parse("foo := UI[5]\n@top\njump_to @top if foo")
261
- assert_node_type InlineConditionalNode, last_node
262
- end
263
-
264
- def test_inline_program_call
265
- parse("foo := UI[5]\nbar() unless foo")
266
- assert_node_type InlineConditionalNode, last_node
267
- end
268
-
269
- def test_constant_definition
270
- parse("FOO := 5\nfoo := R[1]\nfoo = FOO")
271
- assert_node_type DefinitionNode, @interpreter.nodes.first
272
- end
273
-
274
- def test_defining_arg_as_var
275
- parse("arg_1 := AR[1]")
276
- assert_node_type DefinitionNode, last_node
277
- end
278
-
279
- def test_set_skip_condition
280
- parse("foo := RI[1]\nset_skip_condition foo.on?")
281
- assert_node_type SetSkipNode, last_node
282
- end
283
-
284
- def test_skip_to
285
- parse("p := P[1]\n@somewhere\nlinear_move.to(p).at(2000, 'mm/s').term(0).skip_to(@somewhere)")
286
- assert_node_type MotionNode, last_node
287
- end
288
-
289
- def test_skip_to_with_pr
290
- parse("p := P[1]\nlpos := PR[1]\n@somewhere\nlinear_move.to(p).at(2000, 'mm/s').term(0).skip_to(@somewhere, lpos)")
291
- assert_node_type MotionNode, last_node
292
- end
293
-
294
- def test_simple_math
295
- parse("foo := R[1]\nfoo=1+1")
296
- assert_node_type AssignmentNode, last_node
297
- end
298
-
299
- def test_more_complicated_expression
300
- parse("foo := R[1]\nfoo=1+2+3+4+5")
301
- assert_node_type AssignmentNode, last_node
302
- end
303
-
304
- def test_operator_precedence
305
- parse("foo := R[1]\nfoo=1+2*3")
306
- n = last_node
307
- assert_node_type AssignmentNode, n
308
- e = n.assignable
309
- assert_node_type DigitNode, e.left_op
310
- assert_node_type ExpressionNode, e.right_op
311
- end
312
-
313
- def test_expression_grouping
314
- parse("foo := R[1]\nfoo=(1+2)*3")
315
- n = last_node
316
- assert_node_type AssignmentNode, n
317
- e = n.assignable
318
- assert_node_type ParenExpressionNode, e.left_op
319
- assert_node_type DigitNode, e.right_op
320
- end
321
-
322
- def test_boolean_expressions
323
- parse("foo := F[1]\nfoo=1 || 1 && 0")
324
- assert_node_type AssignmentNode, last_node
325
- end
326
-
327
- def test_bang
328
- parse "foo := F[1]\nbar := F[2]\nfoo = !bar"
329
- n = last_node
330
- assert_node_type AssignmentNode, n
331
- assert_node_type UnaryExpressionNode, n.assignable
332
- end
333
-
334
- def test_indirect_position_assignment
335
- parse "foo := PR[1]\nfoo = indirect('position',5)"
336
- assert_node_type AssignmentNode, last_node
337
- end
338
-
339
- def test_namespace_definition
340
- parse %(namespace Foo\nbar := R[1]\nend)
341
- assert_node_type NamespaceNode, last_node
342
- end
343
-
344
- def test_scans_eval_with_string
345
- parse %(eval "R[1]=5")
346
- assert_node_type EvalNode, last_node
347
- end
348
-
349
- def test_for_loop
350
- parse %(foo := R[1]\nfor foo in (1 to 10)\n# bar\nend)
351
- assert_node_type ForNode, last_node
352
- end
353
-
354
- def test_while
355
- parse %(foo := R[1]\nwhile foo < 10\n# bar\nend)
356
- assert_node_type WhileNode, last_node
357
- end
358
-
359
- def test_start_timer
360
- parse %(t := TIMER[1]\nstart t)
361
- assert_node_type TimerMethodNode, last_node
362
- end
363
-
364
- def test_position_data_block
365
- parse "position_data\n{}\nend"
366
- assert_node_type PositionDataNode, last_node
367
- end
368
-
369
- def test_position_data_block_with_a_position
370
- parse %(position_data
371
- {
372
- 'positions': [
373
- {
374
- 'id': 1,
375
- 'comment': "test",
376
- 'group': 1,
377
- 'uframe': 1,
378
- 'utool': 1,
379
- 'config': {
380
- 'flip': true,
381
- 'up': true,
382
- 'top': false,
383
- 'turn_counts': [0,0,0]
384
- },
385
- 'components': {
386
- 'x': 0.0,
387
- 'y': 0.0,
388
- 'z': 0.0,
389
- 'w': 0.0,
390
- 'p': 0.0,
391
- 'r': 0.0
392
- }
393
- }
394
- ]
395
- }
396
- end)
397
- assert_node_type PositionDataNode, last_node
398
- end
399
-
400
- def test_position_data_block_with_two_positions
401
- parse %(position_data
402
- {
403
- 'positions': [
404
- {
405
- 'id': 1,
406
- 'comment': "test",
407
- 'group': 1,
408
- 'uframe': 1,
409
- 'utool': 1,
410
- 'config': {
411
- 'flip': true,
412
- 'up': true,
413
- 'top': false,
414
- 'turn_counts': [0,0,0]
415
- },
416
- 'components': {
417
- 'x': 0.0,
418
- 'y': 0.0,
419
- 'z': 0.0,
420
- 'w': 0.0,
421
- 'p': 0.0,
422
- 'r': 0.0
423
- }
424
- },
425
- {
426
- 'id': 2,
427
- 'comment': "test",
428
- 'group': 1,
429
- 'uframe': 1,
430
- 'utool': 1,
431
- 'config': {
432
- 'flip': true,
433
- 'up': true,
434
- 'top': false,
435
- 'turn_counts': [0,0,0]
436
- },
437
- 'components': {
438
- 'x': 0.0,
439
- 'y': 0.0,
440
- 'z': 0.0,
441
- 'w': 0.0,
442
- 'p': 0.0,
443
- 'r': 0.0
444
- }
445
- }
446
- ]
447
- }
448
- end)
449
- assert_node_type PositionDataNode, last_node
450
- end
451
-
452
- def test_simple_pulse
453
- parse "foo := DO[1]\npulse(foo)"
454
- assert_node_type IOMethodNode, last_node
455
- end
456
-
457
- def test_pulse_with_options
458
- parse "foo := DO[1]\npulse(foo,5,'s')"
459
- assert_node_type IOMethodNode, last_node
460
- end
461
-
462
- def test_ualm_definition
463
- parse "foo := UALM[1]"
464
- n = last_node
465
- assert_node_type DefinitionNode, n
466
- assert_node_type UserAlarmNode, n.assignable
467
- end
468
-
469
- def test_raise
470
- parse "my_alarm := UALM[1]\nraise my_alarm"
471
- assert_node_type RaiseNode, last_node
472
- end
473
-
474
- def test_run
475
- parse "run FOO()"
476
- assert_node_type CallNode, last_node
477
- assert last_node.async?
478
- end
479
-
480
- def test_tool_offset
481
- parse "p := P[1]\nbar := PR[1]\nlinear_move.to(p).at(1000,'mm/s').term(0).tool_offset(bar)"
482
- assert_node_type MotionNode, last_node
483
- end
484
-
485
- def test_parse_address
486
- parse("foo := R[1]\n &foo")
487
- assert_node_type AddressNode, last_node
488
- end
489
-
490
- def test_parse_address_as_argument
491
- parse("foo := R[1]\n foo2 := R[5]\n foo3 := R[10]\n Func(&foo, &foo2, &foo3)")
492
- l = last_node
493
- assert_equal 3, l.args.length
494
- end
495
-
496
- def test_parse_error_reporting
497
- e = assert_raise(TPPlus::Parser::ParseError) do
498
- parse("foo bar")
499
- end
500
- assert_equal "Parse error on line 1 column 5: \"bar\" (WORD)", e.message
501
- end
502
- end
1
+ require_relative '../test_helper'
2
+
3
+ class TestParser < Test::Unit::TestCase
4
+ include TPPlus::Nodes
5
+
6
+ def setup
7
+ @scanner = TPPlus::Scanner.new
8
+ @parser = TPPlus::Parser.new @scanner
9
+ @interpreter = @parser.interpreter
10
+ end
11
+
12
+ def parse(s)
13
+ @scanner.scan_setup(s)
14
+ @parser.parse
15
+ end
16
+
17
+ def last_node
18
+ @last_node ||= @interpreter.nodes.last
19
+ end
20
+
21
+ def assert_node_type(t, n)
22
+ assert_equal t, n.class
23
+ end
24
+
25
+ def test_minimum_prog
26
+ parse("")
27
+ end
28
+
29
+ def blank_prog
30
+ parse("\n\n\n\n\n")
31
+ end
32
+
33
+ def test_comment
34
+ parse("# foo")
35
+ assert_node_type CommentNode, last_node
36
+ end
37
+
38
+ def test_numreg_definition
39
+ parse("foo := R[1]")
40
+ assert_node_type DefinitionNode, last_node
41
+ end
42
+
43
+ def test_assignment
44
+ parse("foo = 1")
45
+ assert_node_type AssignmentNode, last_node
46
+ end
47
+
48
+ def test_label_definition
49
+ parse("@foo")
50
+ assert_node_type LabelDefinitionNode, last_node
51
+ end
52
+
53
+ def test_jump_to
54
+ parse("@foo\njump_to @foo")
55
+ assert_node_type JumpNode, last_node
56
+ end
57
+
58
+ def test_plus_equal
59
+ parse("foo += 1")
60
+ l = last_node
61
+ assert_node_type AssignmentNode, l
62
+ assert_node_type VarNode, l.identifier
63
+ assert_node_type ExpressionNode, l.assignable
64
+ assert_node_type VarNode, l.assignable.left_op
65
+ end
66
+
67
+ def test_minus_equal
68
+ parse("foo -= 1")
69
+ l = last_node
70
+ assert_node_type AssignmentNode, l
71
+ assert_node_type VarNode, l.identifier
72
+ assert_node_type ExpressionNode, l.assignable
73
+ assert_node_type VarNode, l.assignable.left_op
74
+ end
75
+
76
+ def test_turn_on
77
+ parse("turn_on foo")
78
+ assert_node_type IOMethodNode, last_node
79
+ end
80
+
81
+ def test_turn_off
82
+ parse("turn_off foo")
83
+ assert_node_type IOMethodNode, last_node
84
+ end
85
+
86
+ def test_toggle
87
+ parse("toggle foo")
88
+ assert_node_type IOMethodNode, last_node
89
+ end
90
+
91
+ def test_motion
92
+ parse("linear_move.to(home).at(2000, 'mm/s').term(0)")
93
+ assert_node_type MotionNode, last_node
94
+ end
95
+
96
+ def test_simple_if
97
+ parse("if 1==1 \n\n\njump_to @foo\nend")
98
+ assert_node_type ConditionalNode, last_node
99
+ end
100
+
101
+ def test_if_with_else
102
+ parse("if 1==1 \n\n\njump_to @foo\n else \n# something\nend")
103
+ assert_node_type ConditionalNode, last_node
104
+ end
105
+
106
+ def test_simple_unless
107
+ parse("unless 1==1\njump_to @foo\nend")
108
+ assert_node_type ConditionalNode, last_node
109
+ end
110
+
111
+ def test_inline_if
112
+ parse("jump_to @foo if foo < 10")
113
+ assert_node_type InlineConditionalNode, last_node
114
+ end
115
+
116
+ def test_inline_if_assignment
117
+ parse("foo = 1 if foo < 10")
118
+ assert_node_type InlineConditionalNode, last_node
119
+ end
120
+
121
+ def test_inline_io_method
122
+ parse("turn_on foo if bar < 10")
123
+ assert_node_type InlineConditionalNode, last_node
124
+ end
125
+
126
+ def test_prog_call
127
+ parse("foo()")
128
+ assert_node_type CallNode, last_node
129
+ end
130
+
131
+ def test_prog_call_with_an_arg
132
+ parse("foo(1)")
133
+ l = last_node
134
+ assert_node_type CallNode, l
135
+ assert_equal 1, l.args.length
136
+ end
137
+
138
+ def test_prog_call_with_multiple_args
139
+ parse("foo(1,2,3)")
140
+ l = last_node
141
+ assert_equal 3, l.args.length
142
+ end
143
+
144
+ def test_prog_call_with_variable_arg
145
+ parse("foo(bar)")
146
+ assert_node_type CallNode, last_node
147
+ end
148
+
149
+ def test_position_definition
150
+ parse("foo := P[1]")
151
+ assert_node_type DefinitionNode, last_node
152
+ end
153
+
154
+ def test_uframe_assignment
155
+ parse("uframe_num = 5")
156
+ assert_node_type AssignmentNode, last_node
157
+ end
158
+
159
+ def test_utool_assignment
160
+ parse("utool_num = 5")
161
+ assert_node_type AssignmentNode, last_node
162
+ end
163
+
164
+ def test_offset
165
+ parse("foo := P[1]\nbar := PR[1]\nlinear_move.to(foo).at(2000, 'mm/s').term(0).offset(bar)")
166
+ assert_node_type MotionNode, last_node
167
+ end
168
+
169
+ def test_vr_offset
170
+ parse("foo := P[1]\nbar := VR[1]\nlinear_move.to(foo).at(2000, 'mm/s').term(0).offset(bar)")
171
+ assert_node_type MotionNode, last_node
172
+ end
173
+
174
+ def test_time_before
175
+ parse("p := P[1]\nlinear_move.to(p).at(2000, 'mm/s').term(0).time_before(0.1, foo())")
176
+ assert_node_type MotionNode, last_node
177
+ end
178
+
179
+ def test_use_uframe
180
+ parse("use_uframe 5")
181
+ assert_node_type UseNode, last_node
182
+ end
183
+
184
+ def test_indirect_uframe
185
+ parse("foo := R[1]\nuse_uframe foo")
186
+ assert_node_type UseNode, last_node
187
+ end
188
+
189
+ def test_use_utool
190
+ parse("use_utool 5")
191
+ assert_node_type UseNode, last_node
192
+ end
193
+
194
+ def test_indirect_utool
195
+ parse("foo := R[1]\nuse_utool foo")
196
+ assert_node_type UseNode, last_node
197
+ end
198
+
199
+ def test_use_payload
200
+ parse("use_payload 1")
201
+ assert_node_type UseNode, last_node
202
+ end
203
+
204
+ def test_indirect_payload
205
+ parse("foo := R[1]\nuse_payload foo")
206
+ assert_node_type UseNode, last_node
207
+ end
208
+
209
+ def test_can_name_a_label_end
210
+ parse("@end")
211
+ assert_node_type LabelDefinitionNode, last_node
212
+ end
213
+
214
+ def test_wait_for_with_units
215
+ parse("wait_for(5,'s')")
216
+ assert_node_type WaitForNode, last_node
217
+ end
218
+
219
+ def test_scan_wait_until
220
+ parse("wait_until(1==0)")
221
+ assert_node_type WaitUntilNode, last_node
222
+ end
223
+
224
+ def test_scans_assignment_with_negative_number
225
+ parse("foo := R[1]\nfoo = -1")
226
+ assert_node_type AssignmentNode, last_node
227
+ end
228
+
229
+ def test_scans_simplest_case_statement
230
+ parse("foo := R[1]\ncase foo\nwhen 1\njump_to @asdf\nend\n@asdf")
231
+ assert_node_type CaseNode, @interpreter.nodes[2]
232
+ end
233
+
234
+ def test_scans_case_with_else
235
+ parse("foo := R[1]\ncase foo\nwhen 1\njump_to @asdf\nelse\njump_to @ghjk\nend\n@asdf\n@ghjk")
236
+ assert_node_type CaseNode, @interpreter.nodes[2]
237
+ end
238
+
239
+ def test_scans_two_cases
240
+ parse("foo := R[1]\ncase foo\nwhen 1\njump_to @asdf\nwhen 2\njump_to @ghjk\nend\n@asdf\n@ghjk")
241
+ assert_node_type CaseNode, @interpreter.nodes[2]
242
+ end
243
+
244
+ def test_case_can_use_a_var_as_a_condition
245
+ parse("foo := R[1]\nbar := R[2]\ncase foo\nwhen bar\njump_to @asdf\nend\n@asdf")
246
+ assert_node_type CaseNode, @interpreter.nodes[4]
247
+ end
248
+
249
+ def test_case_can_call_a_prog_as_an_action
250
+ parse("foo := R[1]\ncase foo\nwhen 1\nmy_program()\nend\n@asdf")
251
+ assert_node_type CaseNode, @interpreter.nodes[2]
252
+ end
253
+
254
+ def test_can_define_input
255
+ parse("foo := UI[1]")
256
+ assert_node_type DefinitionNode, last_node
257
+ end
258
+
259
+ def test_can_inline_conditional_just_io_value
260
+ parse("foo := UI[5]\n@top\njump_to @top if foo")
261
+ assert_node_type InlineConditionalNode, last_node
262
+ end
263
+
264
+ def test_inline_program_call
265
+ parse("foo := UI[5]\nbar() unless foo")
266
+ assert_node_type InlineConditionalNode, last_node
267
+ end
268
+
269
+ def test_constant_definition
270
+ parse("FOO := 5\nfoo := R[1]\nfoo = FOO")
271
+ assert_node_type DefinitionNode, @interpreter.nodes.first
272
+ end
273
+
274
+ def test_defining_arg_as_var
275
+ parse("arg_1 := AR[1]")
276
+ assert_node_type DefinitionNode, last_node
277
+ end
278
+
279
+ def test_set_skip_condition
280
+ parse("foo := RI[1]\nset_skip_condition foo.on?")
281
+ assert_node_type SetSkipNode, last_node
282
+ end
283
+
284
+ def test_skip_to
285
+ parse("p := P[1]\n@somewhere\nlinear_move.to(p).at(2000, 'mm/s').term(0).skip_to(@somewhere)")
286
+ assert_node_type MotionNode, last_node
287
+ end
288
+
289
+ def test_skip_to_with_pr
290
+ parse("p := P[1]\nlpos := PR[1]\n@somewhere\nlinear_move.to(p).at(2000, 'mm/s').term(0).skip_to(@somewhere, lpos)")
291
+ assert_node_type MotionNode, last_node
292
+ end
293
+
294
+ def test_simple_math
295
+ parse("foo := R[1]\nfoo=1+1")
296
+ assert_node_type AssignmentNode, last_node
297
+ end
298
+
299
+ def test_more_complicated_expression
300
+ parse("foo := R[1]\nfoo=1+2+3+4+5")
301
+ assert_node_type AssignmentNode, last_node
302
+ end
303
+
304
+ def test_operator_precedence
305
+ parse("foo := R[1]\nfoo=1+2*3")
306
+ n = last_node
307
+ assert_node_type AssignmentNode, n
308
+ e = n.assignable
309
+ assert_node_type DigitNode, e.left_op
310
+ assert_node_type ExpressionNode, e.right_op
311
+ end
312
+
313
+ def test_expression_grouping
314
+ parse("foo := R[1]\nfoo=(1+2)*3")
315
+ n = last_node
316
+ assert_node_type AssignmentNode, n
317
+ e = n.assignable
318
+ assert_node_type ParenExpressionNode, e.left_op
319
+ assert_node_type DigitNode, e.right_op
320
+ end
321
+
322
+ def test_boolean_expressions
323
+ parse("foo := F[1]\nfoo=1 || 1 && 0")
324
+ assert_node_type AssignmentNode, last_node
325
+ end
326
+
327
+ def test_bang
328
+ parse "foo := F[1]\nbar := F[2]\nfoo = !bar"
329
+ n = last_node
330
+ assert_node_type AssignmentNode, n
331
+ assert_node_type UnaryExpressionNode, n.assignable
332
+ end
333
+
334
+ def test_indirect_position_assignment
335
+ parse "foo := PR[1]\nfoo = indirect('position',5)"
336
+ assert_node_type AssignmentNode, last_node
337
+ end
338
+
339
+ def test_namespace_definition
340
+ parse %(namespace Foo\nbar := R[1]\nend)
341
+ assert_node_type NamespaceNode, last_node
342
+ end
343
+
344
+ def test_scans_eval_with_string
345
+ parse %(eval "R[1]=5")
346
+ assert_node_type EvalNode, last_node
347
+ end
348
+
349
+ def test_for_loop
350
+ parse %(foo := R[1]\nfor foo in (1 to 10)\n# bar\nend)
351
+ assert_node_type ForNode, last_node
352
+ end
353
+
354
+ def test_while
355
+ parse %(foo := R[1]\nwhile foo < 10\n# bar\nend)
356
+ assert_node_type WhileNode, last_node
357
+ end
358
+
359
+ def test_start_timer
360
+ parse %(t := TIMER[1]\nstart t)
361
+ assert_node_type TimerMethodNode, last_node
362
+ end
363
+
364
+ def test_position_data_block
365
+ parse "position_data\n{}\nend"
366
+ assert_node_type PositionDataNode, last_node
367
+ end
368
+
369
+ def test_position_data_block_with_a_position
370
+ parse %(position_data
371
+ {
372
+ 'positions': [
373
+ {
374
+ 'id': 1,
375
+ 'comment': "test",
376
+ 'group': 1,
377
+ 'uframe': 1,
378
+ 'utool': 1,
379
+ 'config': {
380
+ 'flip': true,
381
+ 'up': true,
382
+ 'top': false,
383
+ 'turn_counts': [0,0,0]
384
+ },
385
+ 'components': {
386
+ 'x': 0.0,
387
+ 'y': 0.0,
388
+ 'z': 0.0,
389
+ 'w': 0.0,
390
+ 'p': 0.0,
391
+ 'r': 0.0
392
+ }
393
+ }
394
+ ]
395
+ }
396
+ end)
397
+ assert_node_type PositionDataNode, last_node
398
+ end
399
+
400
+ def test_position_data_block_with_two_positions
401
+ parse %(position_data
402
+ {
403
+ 'positions': [
404
+ {
405
+ 'id': 1,
406
+ 'comment': "test",
407
+ 'group': 1,
408
+ 'uframe': 1,
409
+ 'utool': 1,
410
+ 'config': {
411
+ 'flip': true,
412
+ 'up': true,
413
+ 'top': false,
414
+ 'turn_counts': [0,0,0]
415
+ },
416
+ 'components': {
417
+ 'x': 0.0,
418
+ 'y': 0.0,
419
+ 'z': 0.0,
420
+ 'w': 0.0,
421
+ 'p': 0.0,
422
+ 'r': 0.0
423
+ }
424
+ },
425
+ {
426
+ 'id': 2,
427
+ 'comment': "test",
428
+ 'group': 1,
429
+ 'uframe': 1,
430
+ 'utool': 1,
431
+ 'config': {
432
+ 'flip': true,
433
+ 'up': true,
434
+ 'top': false,
435
+ 'turn_counts': [0,0,0]
436
+ },
437
+ 'components': {
438
+ 'x': 0.0,
439
+ 'y': 0.0,
440
+ 'z': 0.0,
441
+ 'w': 0.0,
442
+ 'p': 0.0,
443
+ 'r': 0.0
444
+ }
445
+ }
446
+ ]
447
+ }
448
+ end)
449
+ assert_node_type PositionDataNode, last_node
450
+ end
451
+
452
+ def test_simple_pulse
453
+ parse "foo := DO[1]\npulse(foo)"
454
+ assert_node_type IOMethodNode, last_node
455
+ end
456
+
457
+ def test_pulse_with_options
458
+ parse "foo := DO[1]\npulse(foo,5,'s')"
459
+ assert_node_type IOMethodNode, last_node
460
+ end
461
+
462
+ def test_ualm_definition
463
+ parse "foo := UALM[1]"
464
+ n = last_node
465
+ assert_node_type DefinitionNode, n
466
+ assert_node_type UserAlarmNode, n.assignable
467
+ end
468
+
469
+ def test_raise
470
+ parse "my_alarm := UALM[1]\nraise my_alarm"
471
+ assert_node_type RaiseNode, last_node
472
+ end
473
+
474
+ def test_run
475
+ parse "run FOO()"
476
+ assert_node_type CallNode, last_node
477
+ assert last_node.async?
478
+ end
479
+
480
+ def test_tool_offset
481
+ parse "p := P[1]\nbar := PR[1]\nlinear_move.to(p).at(1000,'mm/s').term(0).tool_offset(bar)"
482
+ assert_node_type MotionNode, last_node
483
+ end
484
+
485
+ def test_parse_address
486
+ parse("foo := R[1]\n &foo")
487
+ assert_node_type AddressNode, last_node
488
+ end
489
+
490
+ def test_parse_address_as_argument
491
+ parse("foo := R[1]\n foo2 := R[5]\n foo3 := R[10]\n Func(&foo, &foo2, &foo3)")
492
+ l = last_node
493
+ assert_equal 3, l.args.length
494
+ end
495
+
496
+ def test_parse_error_reporting
497
+ e = assert_raise(TPPlus::Parser::ParseError) do
498
+ parse("foo bar")
499
+ end
500
+ assert_equal "Parse error on line 1 column 5: \"bar\" (WORD)", e.message
501
+ end
502
+ end