rtext 0.9.2 → 0.9.3

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.
@@ -1,1773 +0,0 @@
1
- # coding: binary
2
- $:.unshift File.join(File.dirname(__FILE__),"..","lib")
3
-
4
- require 'minitest/autorun'
5
- require 'bigdecimal'
6
- require 'rgen/environment'
7
- require 'rgen/metamodel_builder'
8
- require 'rtext/instantiator'
9
- require 'rtext/language'
10
-
11
- class InstantiatorTest < MiniTest::Test
12
-
13
- module TestMM
14
- extend RGen::MetamodelBuilder::ModuleExtension
15
- class TestNode < RGen::MetamodelBuilder::MMBase
16
- SomeEnum = RGen::MetamodelBuilder::DataTypes::Enum.new([:A, :B, :'non-word*chars', :'2you'])
17
- has_attr 'text', String
18
- has_attr 'integer', Integer
19
- has_attr 'boolean', Boolean
20
- has_attr 'enum', SomeEnum
21
- has_many_attr 'nums', Integer
22
- has_attr 'float', Float
23
- has_one 'related', TestNode
24
- has_many 'others', TestNode
25
- contains_many 'childs', TestNode, 'parent'
26
- end
27
- class SubNode < TestNode
28
- end
29
- end
30
-
31
- module TestMM2
32
- extend RGen::MetamodelBuilder::ModuleExtension
33
- class TestNode < RGen::MetamodelBuilder::MMBase
34
- contains_one 'singleChild', TestNode, 'parent'
35
- end
36
- class TestNode2 < RGen::MetamodelBuilder::MMBase
37
- end
38
- class TestNode3 < RGen::MetamodelBuilder::MMBase
39
- end
40
- class TestNode4 < TestNode
41
- end
42
- TestNode.contains_one 'singleChild2a', TestNode2, 'parentA'
43
- TestNode.contains_one 'singleChild2b', TestNode2, 'parentB'
44
- end
45
-
46
- module TestMMLinenoFilenameFragment
47
- extend RGen::MetamodelBuilder::ModuleExtension
48
- class TestNode < RGen::MetamodelBuilder::MMBase
49
- has_attr 'text', String
50
- has_attr 'lineno', Integer
51
- has_attr 'filename', String
52
- has_attr 'fragmentr', String
53
- contains_many 'childs', TestNode, 'parent'
54
- end
55
- end
56
-
57
- module TestMMAbstract
58
- extend RGen::MetamodelBuilder::ModuleExtension
59
- class TestNode < RGen::MetamodelBuilder::MMBase
60
- abstract
61
- end
62
- end
63
-
64
- module TestMMData
65
- extend RGen::MetamodelBuilder::ModuleExtension
66
- # class "Data" exists in the standard Ruby namespace
67
- class Data < RGen::MetamodelBuilder::MMBase
68
- has_attr 'notTheBuiltin', String
69
- end
70
- end
71
-
72
- module TestMMSubpackage
73
- extend RGen::MetamodelBuilder::ModuleExtension
74
- module SubPackage
75
- extend RGen::MetamodelBuilder::ModuleExtension
76
- class TestNodeSub < RGen::MetamodelBuilder::MMBase
77
- has_attr 'text', String
78
- end
79
- class Data < RGen::MetamodelBuilder::MMBase
80
- has_attr 'notTheBuiltin', String
81
- end
82
- end
83
- end
84
-
85
- module TestMMNonRootClass
86
- extend RGen::MetamodelBuilder::ModuleExtension
87
- class NonRootClass < RGen::MetamodelBuilder::MMBase
88
- end
89
- end
90
-
91
- module TestMMContextSensitiveCommands
92
- extend RGen::MetamodelBuilder::ModuleExtension
93
- module SubPackage2
94
- extend RGen::MetamodelBuilder::ModuleExtension
95
- class Command < RGen::MetamodelBuilder::MMBase
96
- end
97
- end
98
- module SubPackage1
99
- extend RGen::MetamodelBuilder::ModuleExtension
100
- class Command < RGen::MetamodelBuilder::MMBase
101
- contains_one 'command', SubPackage2::Command, 'super'
102
- end
103
- end
104
- class TestNode < RGen::MetamodelBuilder::MMBase
105
- contains_one 'command', SubPackage1::Command, 'testNode'
106
- end
107
- end
108
-
109
- def test_int_float_string
110
- root_elements = []
111
- _, problems = instantiate(%Q(
112
- TestNode text: 10
113
- TestNode text: -14.55
114
- ), TestMM, :root_elements => root_elements)
115
- assert_no_problems(problems)
116
- assert(root_elements.first.text.is_a?(String))
117
- assert_equal('10', root_elements.first.text)
118
- assert(root_elements[1].text.is_a?(String))
119
- assert_equal('-14.55', root_elements[1].text)
120
- end
121
-
122
- def test_int_float
123
- env, problems = instantiate(%Q(
124
- TestNode float: "abc"
125
- ), TestMM)
126
- assert_equal(1, problems.length)
127
-
128
- root_elements = []
129
- env, problems = instantiate(%Q(
130
- TestNode text: "some text", float: -25 {
131
- TestNode text: "child"
132
- TestNode text: "child2"
133
- }
134
- ), TestMM, :root_elements => root_elements)
135
- assert_no_problems(problems)
136
- assert_model_simple(env)
137
- assert(root_elements.first.float.is_a?(Float))
138
- assert_equal(-25.0, root_elements.first.float)
139
-
140
- root_elements = []
141
- env, problems = instantiate(%Q(
142
- TestNode text: "some text", float: -72.001 {
143
- TestNode text: "child"
144
- TestNode text: "child2"
145
- }
146
- ), TestMM, :root_elements => root_elements)
147
- assert_no_problems(problems)
148
- assert_model_simple(env)
149
- assert(root_elements.first.float.is_a?(Float))
150
- assert_equal(-72.001, root_elements.first.float)
151
- end
152
-
153
- def test_simple
154
- env, problems = instantiate(%Q(
155
- TestNode text: "some text", nums: [1,2] {
156
- TestNode text: "child"
157
- TestNode text: "child2"
158
- }
159
- ), TestMM)
160
- assert_no_problems(problems)
161
- assert_model_simple(env, :with_nums)
162
- end
163
-
164
- def test_multiple_roots
165
- env, problems = instantiate(%Q(
166
- TestNode
167
- TestNode
168
- ), TestMM)
169
- assert_no_problems(problems)
170
- assert_equal 2, env.elements.size
171
- end
172
-
173
- def test_comment
174
- env, problems = instantiate(%Q(
175
- # comment 1
176
- TestNode text: "some text" {# comment 1.1
177
- childs: [ # comment 1.2
178
- # comment 2
179
- TestNode text: "child" # comment 2.1
180
- # comment 3
181
- TestNode text: "child2" #comment 3.1
182
- # unassociated
183
- ] # comment 1.3
184
- # unassociated
185
- } # comment 1.4
186
- #comment 1
187
- TestNode { #comment 1.1
188
- childs: # comment 1.2
189
- TestNode text: "child" #comment2
190
- # unassociated
191
- }# comment 1.3
192
- # unassociated
193
- ), TestMM)
194
- assert_no_problems(problems)
195
- assert_model_simple(env)
196
- end
197
-
198
- def test_comment_only
199
- env, problems = instantiate(%Q(
200
- # comment 1
201
- ), TestMM)
202
- assert_no_problems(problems)
203
- end
204
-
205
- def test_empty
206
- env, problems = instantiate("", TestMM)
207
- assert_no_problems(problems)
208
- end
209
-
210
- #
211
- # options
212
- #
213
-
214
- def test_line_number_setter
215
- env, problems = instantiate(%q(
216
- TestNode text: "node1" {
217
- TestNode text: "node2"
218
-
219
- #some comment
220
- TestNode text: "node3"
221
- }
222
- TestNode text: "node4"
223
- ), TestMMLinenoFilenameFragment, :line_number_attribute => "lineno")
224
- assert_no_problems(problems)
225
- assert_equal 2, env.find(:text => "node1").first.lineno
226
- assert_equal 3, env.find(:text => "node2").first.lineno
227
- assert_equal 6, env.find(:text => "node3").first.lineno
228
- assert_equal 8, env.find(:text => "node4").first.lineno
229
- end
230
-
231
- def test_missing_line_number_setter
232
- env, problems = instantiate(%Q(
233
- TestNode text: A
234
- ), TestMMLinenoFilenameFragment, :line_number_attribute => "wrong_attribute_name")
235
- assert_no_problems(problems)
236
- assert_nil env.elements.first.lineno
237
- end
238
-
239
- def test_root_elements
240
- root_elements = []
241
- env, problems = instantiate(%Q(
242
- TestNode text: A
243
- TestNode text: B
244
- TestNode text: C
245
- ), TestMM, :root_elements => root_elements)
246
- assert_no_problems(problems)
247
- assert_equal ["A", "B", "C"], root_elements.text
248
- end
249
-
250
- def test_file_name_option
251
- env, problems = instantiate(%Q(
252
- TestNode text: A
253
- TestNode text: B
254
- TestNode a problem here
255
- ), TestMM, :file_name => "some_file")
256
- assert_equal "some_file", problems.first.file
257
- end
258
-
259
- def test_file_name_setter
260
- env, problems = instantiate(%Q(
261
- TestNode text: A
262
- ), TestMMLinenoFilenameFragment, :file_name => "some_file", :file_name_attribute => "filename")
263
- assert_equal "some_file", env.elements.first.filename
264
- end
265
-
266
- def test_missing_file_name_setter
267
- env, problems = instantiate(%Q(
268
- TestNode text: A
269
- ), TestMMLinenoFilenameFragment, :file_name => "some_file", :file_name_attribute => "wrong_attribute_name")
270
- assert_nil env.elements.first.filename
271
- end
272
-
273
- def test_fragment_ref_setter
274
- the_ref = "is a string here but would normally be an RGen fragment"
275
- env, problems = instantiate(%Q(
276
- TestNode text: A
277
- ), TestMMLinenoFilenameFragment, :fragment_ref => the_ref, :fragment_ref_attribute => "fragmentr")
278
- assert_equal the_ref.object_id, env.elements.first.fragmentr.object_id
279
- end
280
-
281
- def test_missing_fragment_ref_setter
282
- the_ref = "is a string here but would normally be an RGen fragment"
283
- env, problems = instantiate(%Q(
284
- TestNode text: A
285
- ), TestMMLinenoFilenameFragment, :fragment_ref => the_ref, :fragment_ref_attribute => "wrong_attribute_name")
286
- assert_nil env.elements.first.fragmentr
287
- end
288
-
289
- #
290
- # children with role
291
- #
292
-
293
- def test_child_role
294
- env, problems = instantiate(%Q(
295
- TestNode text: "some text" {
296
- TestNode text: "child"
297
- childs:
298
- TestNode text: "child2"
299
- }
300
- ), TestMM)
301
- assert_no_problems(problems)
302
- assert_model_simple(env)
303
- end
304
-
305
- def test_child_role2
306
- env, problems = instantiate(%Q(
307
- TestNode text: "some text" {
308
- childs: [
309
- TestNode text: "child"
310
- TestNode text: "child2"
311
- ]
312
- }
313
- ), TestMM)
314
- assert_no_problems(problems)
315
- assert_model_simple(env)
316
- end
317
-
318
- def test_child_role3
319
- env, problems = instantiate(%Q(
320
- TestNode text: "some text" {
321
- childs:
322
- TestNode text: "child"
323
- childs:
324
- TestNode text: "child2"
325
- }
326
- ), TestMM)
327
- assert_no_problems(problems)
328
- assert_model_simple(env)
329
- end
330
-
331
- def test_child_role4
332
- env, problems = instantiate(%Q(
333
- TestNode text: "some text" {
334
- childs: [
335
- TestNode text: "child"
336
- ]
337
- childs: [
338
- TestNode text: "child2"
339
- ]
340
- }
341
- ), TestMM)
342
- assert_no_problems(problems)
343
- assert_model_simple(env)
344
- end
345
-
346
- def test_child_role_empty
347
- env, problems = instantiate(%Q(
348
- TestNode {
349
- childs: [
350
- ]
351
- }
352
- ), TestMM)
353
- assert_no_problems(problems)
354
- end
355
-
356
-
357
- #
358
- # whitespace
359
- #
360
-
361
- def test_whitespace1
362
- env, problems = instantiate(%Q(
363
- TestNode text: "some text" , nums: [ 1 , 2 ] {
364
-
365
- # comment
366
-
367
- TestNode text: "child"
368
-
369
- TestNode text: "child2"
370
-
371
- }
372
- ), TestMM)
373
- assert_no_problems(problems)
374
- assert_model_simple(env, :with_nums)
375
- end
376
-
377
- def test_whitespace2
378
- env, problems = instantiate(%Q(
379
- # comment1
380
-
381
- # comment2
382
-
383
- TestNode text: "some text" {
384
-
385
- childs:
386
-
387
- # comment
388
-
389
- TestNode text: "child"
390
-
391
- childs: [
392
-
393
- TestNode text: "child2"
394
-
395
- ]
396
-
397
- }
398
- ), TestMM)
399
- assert_no_problems(problems)
400
- assert_model_simple(env)
401
- end
402
-
403
- def test_no_newline_at_eof
404
- env, problems = instantiate(%Q(
405
- TestNode), TestMM)
406
- assert_no_problems(problems)
407
- end
408
-
409
- def test_no_newline_at_eof2
410
- env, problems = instantiate(%Q(
411
- TestNode {
412
- }), TestMM)
413
- assert_no_problems(problems)
414
- end
415
-
416
- #
417
- # references
418
- #
419
-
420
- def test_references
421
- unresolved_refs = []
422
- env, problems = instantiate(%Q(
423
- TestNode text: "root" {
424
- TestNode related: /
425
- TestNode related: //
426
- TestNode related: /some
427
- TestNode related: //some
428
- TestNode related: /some/
429
- TestNode related: some/
430
- TestNode related: some//
431
- TestNode related: some
432
- TestNode related: /some/reference
433
- TestNode related: /some/reference/
434
- TestNode related: some/reference/
435
- TestNode related: some/reference
436
- }
437
- ), TestMM, :unresolved_refs => unresolved_refs)
438
- assert_no_problems(problems)
439
- ref_targets = [
440
- "/",
441
- "//",
442
- "/some",
443
- "//some",
444
- "/some/",
445
- "some/",
446
- "some//",
447
- "some",
448
- "/some/reference",
449
- "/some/reference/",
450
- "some/reference/",
451
- "some/reference"
452
- ]
453
- assert_equal ref_targets, env.find(:text => "root").first.childs.collect{|c| c.related.targetIdentifier}
454
- assert_equal ref_targets, unresolved_refs.collect{|ur| ur.proxy.targetIdentifier}
455
- assert unresolved_refs.all?{|ur| ur.feature_name == "related"}
456
- end
457
-
458
- def test_references_many
459
- env, problems = instantiate(%Q(
460
- TestNode text: "root" {
461
- TestNode others: /other
462
- TestNode others: [ /other ]
463
- TestNode others: [ /other1, /other2 ]
464
- }
465
- ), TestMM)
466
- assert_no_problems(problems)
467
- assert_equal [
468
- [ "/other" ],
469
- [ "/other" ],
470
- [ "/other1", "/other2" ],
471
- ], env.find(:text => "root").first.childs.collect{|c| c.others.collect{|p| p.targetIdentifier}}
472
- end
473
-
474
- def test_reference_regexp
475
- env, problems = instantiate(%Q(
476
- TestNode text: "root" {
477
- TestNode related: some
478
- TestNode related: ::some
479
- TestNode related: some::reference
480
- TestNode related: ::some::reference
481
- }
482
- ), TestMM, :reference_regexp => /\A\w*(::\w*)+/)
483
- assert_no_problems(problems)
484
- assert_equal [
485
- "some",
486
- "::some",
487
- "some::reference",
488
- "::some::reference"
489
- ], env.find(:text => "root").first.childs.collect{|c| c.related.targetIdentifier}
490
- end
491
-
492
- #
493
- # unlabled arguments
494
- #
495
-
496
- def test_unlabled_arguments
497
- env, problems = instantiate(%Q(
498
- TestNode "some text", [1,2] {
499
- TestNode "child"
500
- TestNode "child2"
501
- }
502
- ), TestMM, :unlabled_arguments => proc {|clazz| ["text", "nums"]})
503
- assert_no_problems(problems)
504
- assert_model_simple(env, :with_nums)
505
- end
506
-
507
- def test_unlabled_arguments_not_in_front
508
- env, problems = instantiate(%Q(
509
- TestNode nums: [1,2], "some text" {
510
- TestNode "child"
511
- TestNode "child2"
512
- }
513
- ), TestMM, :unlabled_arguments => proc {|clazz| ["text", "nums"]})
514
- assert_no_problems(problems)
515
- assert_model_simple(env, :with_nums)
516
- end
517
-
518
- def test_unlabled_arguments_using_labled
519
- env, problems = instantiate(%Q(
520
- TestNode text: "some text", nums: [1,2] {
521
- TestNode text: "child"
522
- TestNode text: "child2"
523
- }
524
- ), TestMM, :unlabled_arguments => proc {|clazz| ["text", "nums"]})
525
- assert_no_problems(problems)
526
- assert_model_simple(env, :with_nums)
527
- end
528
-
529
- def test_unlabled_arguments_subclass
530
- env, problems = instantiate(%Q(
531
- SubNode "some text", [1, 2] {
532
- TestNode text: "child"
533
- TestNode text: "child2"
534
- }
535
- ), TestMM, :unlabled_arguments => proc {|clazz| ["text", "nums"]})
536
- assert_no_problems(problems)
537
- assert_model_simple(env, :with_nums)
538
- end
539
-
540
- #
541
- # context sensitive commands
542
- #
543
-
544
- def test_context_sensitive
545
- env, problems = instantiate(%Q(
546
- TestNode {
547
- Command {
548
- Command
549
- }
550
- }
551
- ), TestMMContextSensitiveCommands)
552
- assert_no_problems(problems)
553
- root = env.find(:class => TestMMContextSensitiveCommands::TestNode).first
554
- assert root != nil
555
- assert(root.command.is_a?(TestMMContextSensitiveCommands::SubPackage1::Command))
556
- assert(root.command.command.is_a?(TestMMContextSensitiveCommands::SubPackage2::Command))
557
- end
558
-
559
- def test_context_sensitive_command_name_mapping
560
- env, problems = instantiate(%Q(
561
- Command {
562
- Command {
563
- Command
564
- }
565
- }
566
- ), TestMMContextSensitiveCommands, :command_name_provider => lambda do |c|
567
- "Command" end)
568
- assert_no_problems(problems)
569
- root = env.find(:class => TestMMContextSensitiveCommands::TestNode).first
570
- assert root != nil
571
- assert(root.command.is_a?(TestMMContextSensitiveCommands::SubPackage1::Command))
572
- assert(root.command.command.is_a?(TestMMContextSensitiveCommands::SubPackage2::Command))
573
- end
574
-
575
- #
576
- # problems
577
- #
578
-
579
- def test_unexpected_end_of_file
580
- env, problems = instantiate(%Q(
581
- TestNode text: "some text" {
582
- ), TestMM)
583
- assert_problems([[/unexpected end of file, expected \}/i, 2]], problems)
584
- end
585
-
586
- def test_unknown_command
587
- env, problems = instantiate(%Q(
588
- NotDefined
589
- ), TestMM)
590
- assert_problems([[/unknown command 'NotDefined'/i, 2]], problems)
591
- end
592
-
593
- def test_unknown_command_abstract
594
- env, problems = instantiate(%Q(
595
- TestNode
596
- ), TestMMAbstract)
597
- assert_problems([[/unknown command 'TestNode'/i, 2]], problems)
598
- end
599
-
600
- def test_unexpected_unlabled_argument
601
- env, problems = instantiate(%Q(
602
- TestNode "more text"
603
- ), TestMM)
604
- assert_problems([[/unexpected unlabled argument, 0 unlabled arguments expected/i, 2]], problems)
605
- end
606
-
607
- def test_unknown_child_role
608
- env, problems = instantiate(%Q(
609
- TestNode {
610
- notdefined:
611
- TestNode
612
- }
613
- ), TestMM)
614
- assert_problems([[/unknown child role 'notdefined'/i, 3]], problems)
615
- end
616
-
617
- def test_not_a_child_role
618
- env, problems = instantiate(%Q(
619
- TestNode {
620
- text:
621
- TestNode
622
- others:
623
- TestNode
624
- }
625
- ), TestMM)
626
- assert_problems([
627
- [/role 'text' can not take child elements/i, 3],
628
- [/role 'others' can not take child elements/i, 5]
629
- ], problems)
630
- end
631
-
632
- def test_not_a_single_child
633
- env, problems = instantiate(%Q(
634
- TestNode {
635
- singleChild: [
636
- TestNode
637
- TestNode
638
- ]
639
- }
640
- ), TestMM2)
641
- assert_problems([
642
- [/only one child allowed in role 'singleChild'/i, 5]
643
- ], problems)
644
- end
645
-
646
- def test_not_a_single_child2
647
- env, problems = instantiate(%Q(
648
- TestNode {
649
- singleChild:
650
- TestNode
651
- singleChild: [
652
- ]
653
- singleChild:
654
- TestNode
655
- }
656
- ), TestMM2)
657
- assert_problems([
658
- [/only one child allowed in role 'singleChild'/i, 8]
659
- ], problems)
660
- end
661
-
662
- def test_wrong_child_role
663
- env, problems = instantiate(%Q(
664
- TestNode {
665
- singleChild:
666
- TestNode2
667
- }
668
- ), TestMM2)
669
- assert_problems([
670
- [/role 'singleChild' can not take a TestNode2, expected TestNode/i, 4]
671
- ], problems)
672
- end
673
-
674
- def test_child_role_without_child
675
- env, problems = instantiate(%Q(
676
- TestNode {
677
- singleChild:
678
- }
679
- ), TestMM2)
680
- assert_problems([
681
- [/unexpected \}, expected identifier/i, 4]
682
- ], problems)
683
- end
684
-
685
- def test_wrong_child
686
- env, problems = instantiate(%Q(
687
- TestNode {
688
- TestNode3
689
- }
690
- ), TestMM2)
691
- assert_problems([
692
- [/command 'TestNode3' can not be used in this context/i, 3]
693
- ], problems)
694
- end
695
-
696
- def test_ambiguous_child_role
697
- env, problems = instantiate(%Q(
698
- TestNode {
699
- TestNode2
700
- }
701
- ), TestMM2)
702
- assert_problems([
703
- [/role of element is ambiguous, use a role label/i, 3]
704
- ], problems)
705
- end
706
-
707
- def test_non_ambiguous_child_role_subclass
708
- env, problems = instantiate(%Q(
709
- TestNode {
710
- TestNode4
711
- }
712
- ), TestMM2)
713
- assert_no_problems(problems)
714
- end
715
-
716
- def test_not_a_single_child3
717
- env, problems = instantiate(%Q(
718
- TestNode {
719
- TestNode
720
- TestNode
721
- }
722
- ), TestMM2)
723
- assert_problems([
724
- [/only one child allowed in role 'singleChild'/i, 4]
725
- ], problems)
726
- end
727
-
728
- def test_unknown_argument
729
- env, problems = instantiate(%Q(
730
- TestNode unknown: "some text"
731
- ), TestMM)
732
- assert_problems([[/unknown argument 'unknown'/i, 2]], problems)
733
- end
734
-
735
- def test_attribute_in_child_reference
736
- env, problems = instantiate(%Q(
737
- TestNode singleChild: "some text"
738
- ), TestMM2)
739
- assert_problems([[/argument 'singleChild' can only take child elements/i, 2]], problems)
740
- end
741
-
742
- def test_arguments_duplicate
743
- env, problems = instantiate(%Q(
744
- TestNode text: "some text", text: "more text"
745
- ), TestMM)
746
- assert_problems([[/argument 'text' already defined/i, 2]], problems)
747
- end
748
-
749
- def test_unlabled_arguments_duplicate
750
- env, problems = instantiate(%Q(
751
- TestNode text: "some text", "more text"
752
- ), TestMM, :unlabled_arguments => proc {|c| ["text"]})
753
- assert_problems([[/argument 'text' already defined/i, 2]], problems)
754
- end
755
-
756
- def test_multiple_arguments_in_non_many_attribute
757
- env, problems = instantiate(%Q(
758
- TestNode text: ["text1", "text2"]
759
- ), TestMM)
760
- assert_problems([[/argument 'text' can take only one value/i, 2]], problems)
761
- end
762
-
763
- def test_wrong_argument_type
764
- env, problems = instantiate(%Q(
765
- TestNode text: 1
766
- TestNode integer: "text"
767
- TestNode integer: true
768
- TestNode integer: 1.2
769
- TestNode integer: a
770
- TestNode integer: /a
771
- TestNode enum: 1
772
- TestNode enum: x
773
- TestNode related: 1
774
- ), TestMM)
775
- assert_problems([
776
- [/argument 'integer' can not take a string, expected integer/i, 3],
777
- [/argument 'integer' can not take a boolean, expected integer/i, 4],
778
- [/argument 'integer' can not take a float, expected integer/i, 5],
779
- [/argument 'integer' can not take a identifier, expected integer/i, 6],
780
- [/argument 'integer' can not take a reference, expected integer/i, 7],
781
- [/argument 'enum' can not take a integer, expected identifier/i, 8],
782
- [/argument 'enum' can not take value x, expected A, B/i, 9],
783
- [/argument 'related' can not take a integer, expected reference, identifier/i, 10]
784
- ], problems)
785
- end
786
-
787
- def test_missing_opening_brace
788
- env, problems = instantiate(%Q(
789
- TestNode
790
- }
791
- ), TestMM)
792
- assert_problems([[/unexpected \}, expected identifier/i, 3]], problems)
793
- end
794
-
795
- def test_invalid_root
796
- env, problems = instantiate(%Q(
797
- NonRootClass
798
- ), TestMMNonRootClass)
799
- assert_problems([[/command 'NonRootClass' can not be used on root level/i, 2]], problems)
800
- end
801
-
802
- def test_invalid_root_label
803
- root_elements = []
804
- env, problems = instantiate(%Q(
805
- TestNode text : A
806
- ), TestMM, :root_elements => root_elements)
807
- assert_problems([
808
- [/Unexpected unlabled argument, 0 unlabled arguments expected/i, 2],
809
- [/Unexpected :, expected newline/i, 2]
810
- ], problems)
811
- end
812
-
813
- #
814
- # problem recovery
815
- #
816
-
817
- def test_missing_value
818
- root_elements = []
819
- env, problems = instantiate(%Q(
820
- TestNode nums: 1, text:
821
- TestNode nums: 2, text: {
822
- SubNode
823
- }
824
- TestNode text: ,nums: 3 {
825
- SubNode
826
- }
827
- TestNode nums: , text: , bla:
828
- ), TestMM, :root_elements => root_elements)
829
- assert_equal 4, root_elements.size
830
- assert_equal [1], root_elements[0].nums
831
- assert_nil root_elements[0].text
832
- assert_equal [2], root_elements[1].nums
833
- assert_equal 1, root_elements[1].childs.size
834
- assert_equal [3], root_elements[2].nums
835
- assert_equal 1, root_elements[2].childs.size
836
- assert_problems([
837
- [/unexpected newline, expected.*integer/i, 2],
838
- [/unexpected \{, expected.*integer/i, 3],
839
- [/unexpected ,, expected.*integer/i, 6],
840
- [/unexpected ,, expected.*integer/i, 9],
841
- [/unexpected ,, expected.*integer/i, 9],
842
- [/unexpected newline, expected.*integer/i, 9],
843
- [/unknown argument 'bla'/i, 9],
844
- ], problems)
845
- end
846
-
847
- def test_missing_comma
848
- root_elements = []
849
- env, problems = instantiate(%Q(
850
- TestNode nums: 1 text: "bla"
851
- ), TestMM, :root_elements => root_elements)
852
- assert_equal 1, root_elements.size
853
- assert_equal [1], root_elements[0].nums
854
- assert_equal "bla", root_elements[0].text
855
- assert_problems([
856
- [/unexpected label .*, expected ,/i, 2],
857
- ], problems)
858
- end
859
-
860
- def test_missing_label
861
- root_elements = []
862
- env, problems = instantiate(%Q(
863
- TestNode nums: 1 "bla"
864
- ), TestMM, :root_elements => root_elements)
865
- assert_equal 1, root_elements.size
866
- assert_equal [1], root_elements[0].nums
867
- assert_problems([
868
- [/unexpected string 'bla', expected ,/i, 2],
869
- [/unexpected unlabled argument/i, 2]
870
- ], problems)
871
- end
872
-
873
- def test_unclosed_bracket1
874
- root_elements = []
875
- env, problems = instantiate(%Q(
876
- TestNode nums: [1, "bla"
877
- ), TestMM, :root_elements => root_elements)
878
- assert_equal 1, root_elements.size
879
- assert_equal [1], root_elements[0].nums
880
- assert_nil root_elements[0].text
881
- assert_problems([
882
- [/unexpected newline, expected \]/i, 2],
883
- [/argument 'nums' can not take a string, expected integer/i, 2],
884
- ], problems)
885
- end
886
-
887
- def test_unclosed_bracket2
888
- root_elements = []
889
- env, problems = instantiate(%Q(
890
- TestNode nums: [1, text: "bla"
891
- ), TestMM, :root_elements => root_elements)
892
- assert_equal 1, root_elements.size
893
- assert_equal [1], root_elements[0].nums
894
- assert_equal "bla", root_elements[0].text
895
- assert_problems([
896
- [/unexpected label 'text', expected identifier/i, 2],
897
- ], problems)
898
- end
899
-
900
- def test_unclosed_bracket3
901
- root_elements = []
902
- env, problems = instantiate(%Q(
903
- TestNode nums: [1 text: "bla"
904
- ), TestMM, :root_elements => root_elements)
905
- assert_equal 1, root_elements.size
906
- assert_equal [1], root_elements[0].nums
907
- assert_equal "bla", root_elements[0].text
908
- assert_problems([
909
- [/unexpected label 'text', expected \]/i, 2],
910
- ], problems)
911
- end
912
-
913
- def test_unclosed_bracket4
914
- root_elements = []
915
- env, problems = instantiate(%Q(
916
- TestNode nums: [1 "bla"
917
- ), TestMM, :root_elements => root_elements)
918
- assert_equal 1, root_elements.size
919
- assert_equal [1], root_elements[0].nums
920
- assert_nil root_elements[0].text
921
- assert_problems([
922
- [/unexpected string 'bla', expected ,/i, 2],
923
- [/argument 'nums' can not take a string, expected integer/i, 2],
924
- [/unexpected newline, expected \]/i, 2],
925
- ], problems)
926
- end
927
-
928
- def test_unclosed_bracket5
929
- root_elements = []
930
- env, problems = instantiate(%Q(
931
- TestNode [1, "bla"
932
- ), TestMM, :root_elements => root_elements)
933
- assert_equal 1, root_elements.size
934
- assert_equal [], root_elements[0].nums
935
- assert_nil root_elements[0].text
936
- assert_problems([
937
- [/unexpected newline, expected \]/i, 2],
938
- [/unexpected unlabled argument/i, 2],
939
- ], problems)
940
- end
941
-
942
- def test_unclosed_bracket6
943
- root_elements = []
944
- env, problems = instantiate(%Q(
945
- TestNode [1, "bla" [
946
- ), TestMM, :root_elements => root_elements)
947
- assert_equal 1, root_elements.size
948
- assert_problems([
949
- [/unexpected \[, expected \]/i, 2],
950
- [/unexpected end of file, expected \]/i, 2],
951
- [/unexpected unlabled argument/i, 2],
952
- [/unexpected unlabled argument/i, 2],
953
- ], problems)
954
- end
955
-
956
- def test_unclosed_bracket7
957
- root_elements = []
958
- env, problems = instantiate(%Q(
959
- TestNode [1, "bla", [
960
- ), TestMM, :root_elements => root_elements)
961
- assert_equal 1, root_elements.size
962
- assert_problems([
963
- [/unexpected \[, expected identifier/i, 2],
964
- [/unexpected unlabled argument/i, 2],
965
- [/unexpected unlabled argument/i, 2],
966
- [/unexpected end of file, expected \]/i, 2],
967
- ], problems)
968
- end
969
-
970
- def test_closing_bracket
971
- root_elements = []
972
- env, problems = instantiate(%Q(
973
- TestNode ]
974
- TestNode 1 ]
975
- TestNode 1, ]
976
- TestNode nums: ]1, "bla"
977
- TestNode text: "bla" ]
978
- ), TestMM, :root_elements => root_elements)
979
- assert_equal 5, root_elements.size
980
- assert_equal [], root_elements[3].nums
981
- assert_equal "bla", root_elements[4].text
982
- assert_problems([
983
- [/unexpected \], expected newline/i, 2],
984
- [/unexpected \], expected newline/i, 3],
985
- [/unexpected unlabled argument/i, 3],
986
- [/unexpected \], expected identifier/i, 4],
987
- [/unexpected unlabled argument/i, 4],
988
- [/unexpected \], expected identifier/i, 5],
989
- [/unexpected \], expected newline/i, 6],
990
- ], problems)
991
- end
992
-
993
- def test_closing_brace
994
- root_elements = []
995
- env, problems = instantiate(%Q(
996
- TestNode }
997
- TestNode 1 }
998
- TestNode 1, }
999
- TestNode nums: }1, "bla"
1000
- TestNode text: "bla" }
1001
- ), TestMM, :root_elements => root_elements)
1002
- assert_equal 5, root_elements.size
1003
- assert_equal [], root_elements[3].nums
1004
- assert_equal "bla", root_elements[4].text
1005
- assert_problems([
1006
- [/unexpected \}, expected newline/i, 2],
1007
- [/unexpected \}, expected newline/i, 3],
1008
- [/unexpected unlabled argument/i, 3],
1009
- [/unexpected \}, expected identifier/i, 4],
1010
- [/unexpected unlabled argument/i, 4],
1011
- [/unexpected \}, expected identifier/i, 5],
1012
- [/unexpected \}, expected newline/i, 6],
1013
- ], problems)
1014
- end
1015
-
1016
- def test_starting_non_command
1017
- root_elements = []
1018
- env, problems = instantiate(%Q(
1019
- \)
1020
- TestNode
1021
- *
1022
- TestNode
1023
- $
1024
- TestNode
1025
- ,
1026
- TestNode
1027
- [
1028
- TestNode
1029
- {
1030
- TestNode
1031
- ]
1032
- TestNode
1033
- }
1034
- TestNode
1035
- }}
1036
- ), TestMM, :root_elements => root_elements)
1037
- assert_equal 8, root_elements.size
1038
- assert_problems([
1039
- [/parse error on token '\)'/i, 2],
1040
- [/parse error on token '\*'/i, 4],
1041
- [/parse error on token '\$'/i, 6],
1042
- [/unexpected ,, expected identifier/i, 8],
1043
- [/unexpected \[, expected identifier/i, 10],
1044
- [/unexpected \{, expected identifier/i, 12],
1045
- [/unexpected \], expected identifier/i, 14],
1046
- [/unexpected \}, expected identifier/i, 16],
1047
- [/unexpected \}, expected identifier/i, 18],
1048
- ], problems)
1049
- end
1050
-
1051
- def test_parse_error_in_argument_list
1052
- root_elements = []
1053
- env, problems = instantiate(%Q(
1054
- TestNode text: "bla", * nums: 1
1055
- TestNode text: "bla" * , nums: 1
1056
- TestNode ?text: "bla"
1057
- TestNode nums: [1, * 3]
1058
- ), TestMM, :root_elements => root_elements)
1059
- assert_equal 4, root_elements.size
1060
- assert_equal "bla", root_elements[0].text
1061
- assert_equal [1], root_elements[0].nums
1062
- assert_equal "bla", root_elements[1].text
1063
- assert_equal [1], root_elements[1].nums
1064
- assert_equal "bla", root_elements[2].text
1065
- assert_equal [1, 3], root_elements[3].nums
1066
- assert_problems([
1067
- [/parse error on token '\*'/i, 2],
1068
- [/parse error on token '\*'/i, 3],
1069
- [/parse error on token '\?'/i, 4],
1070
- [/parse error on token '\*'/i, 5],
1071
- ], problems)
1072
- end
1073
-
1074
- def test_unclosed_brace
1075
- root_elements = []
1076
- env, problems = instantiate(%Q(
1077
- TestNode {
1078
- ), TestMM, :root_elements => root_elements)
1079
- assert_equal 1, root_elements.size
1080
- assert_problems([
1081
- [/unexpected end of file, expected \}/i, 2]
1082
- ], problems)
1083
- end
1084
-
1085
- def test_unclosed_brace2
1086
- root_elements = []
1087
- env, problems = instantiate(%Q(
1088
- TestNode {
1089
- *
1090
- ), TestMM, :root_elements => root_elements)
1091
- assert_equal 1, root_elements.size
1092
- assert_problems([
1093
- [/parse error on token '\*'/i, 3]
1094
- ], problems)
1095
- end
1096
-
1097
- def test_unclosed_brace3
1098
- root_elements = []
1099
- env, problems = instantiate(%Q(
1100
- TestNode {
1101
- childs:
1102
- ), TestMM, :root_elements => root_elements)
1103
- assert_equal 1, root_elements.size
1104
- assert_problems([
1105
- [/unexpected end of file, expected identifier/i, 3]
1106
- ], problems)
1107
- end
1108
-
1109
- def test_label_without_child
1110
- root_elements = []
1111
- env, problems = instantiate(%Q(
1112
- TestNode {
1113
- childs:
1114
- }
1115
- ), TestMM, :root_elements => root_elements)
1116
- assert_equal 1, root_elements.size
1117
- assert_problems([
1118
- [/unexpected \}, expected identifier/i, 4]
1119
- ], problems)
1120
- end
1121
-
1122
- def test_unclosed_child_bracket
1123
- root_elements = []
1124
- env, problems = instantiate(%Q(
1125
- TestNode {
1126
- childs: [
1127
- ), TestMM, :root_elements => root_elements)
1128
- assert_equal 1, root_elements.size
1129
- assert_problems([
1130
- [/unexpected end of file, expected \]/i, 3]
1131
- ], problems)
1132
- end
1133
-
1134
- def test_child_label_problems
1135
- root_elements = []
1136
- env, problems = instantiate(%Q(
1137
- TestNode {
1138
- childs: x
1139
- SubNode
1140
- childs: *
1141
- SubNode
1142
- childs: &
1143
- }
1144
- ), TestMM, :root_elements => root_elements)
1145
- assert_equal 1, root_elements.size
1146
- assert_equal 2, root_elements[0].childs.size
1147
- assert_problems([
1148
- [/unexpected identifier 'x', expected newline/i, 3],
1149
- [/parse error on token '\*'/i, 5],
1150
- [/parse error on token '&'/i, 7]
1151
- ], problems)
1152
- end
1153
-
1154
- def test_child_label_problems_with_bracket
1155
- root_elements = []
1156
- env, problems = instantiate(%Q(
1157
- TestNode {
1158
- childs: [ x
1159
- SubNode
1160
- ]
1161
- childs: [ *
1162
- SubNode
1163
- ]
1164
- childs: [&
1165
- ]
1166
- }
1167
- ), TestMM, :root_elements => root_elements)
1168
- assert_equal 1, root_elements.size
1169
- assert_equal 2, root_elements[0].childs.size
1170
- assert_problems([
1171
- [/unexpected identifier 'x', expected newline/i, 3],
1172
- [/parse error on token '\*'/i, 6],
1173
- [/parse error on token '&'/i, 9]
1174
- ], problems)
1175
- end
1176
-
1177
- def test_missing_closing_bracket
1178
- root_elements = []
1179
- env, problems = instantiate(%Q(
1180
- TestNode {
1181
- childs: [
1182
- SubNode
1183
- childs: [
1184
- SubNode
1185
- SubNode
1186
- }
1187
- ), TestMM, :root_elements => root_elements)
1188
- assert_equal 1, root_elements.size
1189
- assert_equal 3, root_elements[0].childs.size
1190
- assert_problems([
1191
- [/unexpected label 'childs', expected identifier/i, 5],
1192
- [/unexpected \}, expected identifier/i, 8],
1193
- ], problems)
1194
- end
1195
-
1196
- def test_missing_closing_brace
1197
- root_elements = []
1198
- env, problems = instantiate(%Q(
1199
- TestNode {
1200
- TestNode {
1201
- TestNode
1202
- }
1203
- ), TestMM, :root_elements => root_elements)
1204
- assert_equal 1, root_elements.size
1205
- assert_equal 1, root_elements[0].childs.size
1206
- assert_equal 1, root_elements[0].childs[0].childs.size
1207
- assert_problems([
1208
- [/unexpected end of file, expected \}/i, 5],
1209
- ], problems)
1210
- end
1211
-
1212
- #
1213
- # command name provider
1214
- #
1215
-
1216
- def test_command_name_provider
1217
- env, problems = instantiate(%Q(
1218
- TestNodeX text: "some text", nums: [1,2] {
1219
- TestNodeX text: "child"
1220
- TestNodeX text: "child2"
1221
- }
1222
- ), TestMM, :command_name_provider => proc do |c|
1223
- c.name + "X"
1224
- end)
1225
- assert_no_problems(problems)
1226
- assert_model_simple(env, :with_nums)
1227
- end
1228
-
1229
- def test_command_name_provider_ambiguous
1230
- begin
1231
- env, problems = instantiate(%Q(
1232
- TestNode
1233
- ), TestMM, :command_name_provider => proc do |c|
1234
- "Fixed"
1235
- end)
1236
- assert false
1237
- rescue RuntimeError => e
1238
- assert e.message =~ /ambiguous command name/
1239
- end
1240
- end
1241
-
1242
- #
1243
- # comment handler
1244
- #
1245
-
1246
- def test_comment_handler
1247
- proc_calls = 0
1248
- env, problems = instantiate(%Q(
1249
- #comment
1250
- TestNode text: "node1"
1251
- #comment
1252
- # multiline
1253
- TestNode text: "node2"
1254
- TestNode text: "node3" #comment
1255
- #above
1256
- TestNode text: "node4" {#right1
1257
- childs: [ #right2
1258
- #unassociated1
1259
- ] #right3
1260
- #unassociated2
1261
- } #below
1262
- #above1
1263
- #above2
1264
- TestNode text: "node5" { #right1
1265
- childs: #right2
1266
- TestNode
1267
- }#below
1268
- #comment without
1269
- #an element following
1270
- ), TestMM, :comment_handler => proc {|c,k,e,env|
1271
- proc_calls += 1
1272
- if e.nil?
1273
- case proc_calls
1274
- when 4
1275
- assert_equal "unassociated1", c
1276
- assert_equal :unassociated, k
1277
- when 5
1278
- assert_equal "unassociated2", c
1279
- assert_equal :unassociated, k
1280
- when 15
1281
- assert_equal "comment without\nan element following", c
1282
- assert_equal :unassociated, k
1283
- end
1284
- elsif e.text == "node1"
1285
- assert_equal "comment", c
1286
- assert_equal :above, k
1287
- elsif e.text == "node2"
1288
- assert_equal "comment\n multiline", c
1289
- assert_equal :above, k
1290
- elsif e.text == "node3"
1291
- assert_equal "comment", c
1292
- assert_equal :eol, k
1293
- elsif e.text == "node4"
1294
- case proc_calls
1295
- when 6
1296
- assert_equal "above", c
1297
- assert_equal :above, k
1298
- when 7
1299
- assert_equal "right1", c
1300
- assert_equal :eol, k
1301
- when 8
1302
- assert_equal "right2", c
1303
- assert_equal :eol, k
1304
- when 9
1305
- assert_equal "right3", c
1306
- assert_equal :eol, k
1307
- when 10
1308
- assert_equal "below", c
1309
- assert_equal :eol, k
1310
- end
1311
- elsif e.text == "node5"
1312
- case proc_calls
1313
- when 11
1314
- assert_equal "above1\nabove2", c
1315
- assert_equal :above, k
1316
- when 12
1317
- assert_equal "right1", c
1318
- assert_equal :eol, k
1319
- when 13
1320
- assert_equal "right2", c
1321
- assert_equal :eol, k
1322
- when 14
1323
- assert_equal "below", c
1324
- assert_equal :eol, k
1325
- end
1326
- else
1327
- assert false, "unexpected element in comment handler"
1328
- end
1329
- true
1330
- })
1331
- assert_no_problems(problems)
1332
- assert_equal 15, proc_calls
1333
- end
1334
-
1335
- def test_comment_handler_comment_not_allowed
1336
- env, problems = instantiate(%Q(
1337
- #comment
1338
- TestNode
1339
- ), TestMM, :comment_handler => proc {|c,k,e,env|
1340
- false
1341
- })
1342
- assert_problems([[/element can not take this comment/, 3]], problems)
1343
- end
1344
-
1345
- def test_comment_handler_comment_not_allowed_unassociated
1346
- env, problems = instantiate(%Q(
1347
- #comment
1348
- ), TestMM, :comment_handler => proc {|c,k,e,env|
1349
- false
1350
- })
1351
- assert_problems([[/Unassociated comment not allowed/, 2]], problems)
1352
- end
1353
-
1354
- #
1355
- # annotations
1356
- #
1357
-
1358
- def test_annotation_not_supported
1359
- env, problems = instantiate(%Q(
1360
- @annotation
1361
- TestNode
1362
- ), TestMM)
1363
- assert_problems([[/annotation not allowed/i, 3]], problems)
1364
- end
1365
-
1366
- def test_annotation_not_allowed
1367
- env, problems = instantiate(%Q(
1368
- @annotation
1369
- TestNode
1370
- ), TestMM, :annotation_handler => proc {|a,e,env|
1371
- false
1372
- })
1373
- assert_problems([[/annotation not allowed/i, 3]], problems)
1374
- end
1375
-
1376
- def test_annotation_in_wrong_places
1377
- env, problems = instantiate(%Q(
1378
- @annotation
1379
- #comment
1380
- TestNode {
1381
- @annotation
1382
- childs:
1383
- TestNode
1384
- @annotation
1385
- }
1386
- @annotation
1387
- ), TestMM)
1388
- assert_problems([
1389
- [/unexpected comment 'comment', expected identifier/i, 3],
1390
- [/unexpected label 'childs', expected identifier/i, 6],
1391
- [/unexpected \}, expected identifier/i, 9],
1392
- [/unexpected end of file, expected identifier/i, 10]
1393
- ], problems)
1394
- end
1395
-
1396
- def test_annotation_handler
1397
- annotations = []
1398
- elements = []
1399
- env, problems = instantiate(%Q(
1400
- @annotation
1401
- TestNode text: "aa"
1402
- @annotation
1403
- @ in a new line
1404
-
1405
- @ even with space in between
1406
-
1407
- TestNode text: "bb" {
1408
- @at child
1409
- TestNode text: "cc"
1410
- childs:
1411
- @after label
1412
- TestNode text: "dd"
1413
- @another child
1414
- TestNode text: "ee"
1415
- childs: [
1416
- @in brackets
1417
- TestNode text: "ff"
1418
- ]
1419
- }
1420
- ), TestMM, :annotation_handler => proc {|a,e,env|
1421
- annotations << a
1422
- elements << e
1423
- true
1424
- })
1425
- assert_equal "aa", elements[0].text
1426
- assert_equal "annotation", annotations[0]
1427
- assert_equal "cc", elements[1].text
1428
- assert_equal "at child", annotations[1]
1429
- assert_equal "dd", elements[2].text
1430
- assert_equal "after label", annotations[2]
1431
- assert_equal "ee", elements[3].text
1432
- assert_equal "another child", annotations[3]
1433
- assert_equal "ff", elements[4].text
1434
- assert_equal "in brackets", annotations[4]
1435
- assert_equal "bb", elements[5].text
1436
- assert_equal "annotation\n in a new line\n even with space in between", annotations[5]
1437
- assert_no_problems(problems)
1438
- end
1439
-
1440
- #
1441
- # generics
1442
- #
1443
-
1444
- def test_generics_parse_error
1445
- env, problems = instantiate(%Q(
1446
- TestNode text: <bla
1447
- TestNode text: bla>
1448
- TestNode text: <a<b>
1449
- TestNode text: <a>b>
1450
- TestNode text: <%a
1451
- TestNode text: <%a%
1452
- TestNode text: <%a%>b%>
1453
- ), TestMM, :enable_generics => true)
1454
- assert_problems([
1455
- [/parse error on token '<'/i, 2],
1456
- [/unexpected unlabled argument/i, 2],
1457
- [/parse error on token '>'/i, 3],
1458
- [/unexpected identifier 'b'/i, 5],
1459
- [/parse error on token '>'/i, 5],
1460
- [/unexpected unlabled argument/i, 5],
1461
- [/parse error on token '<'/i, 6],
1462
- [/unexpected unlabled argument/i, 6],
1463
- [/parse error on token '<'/i, 7],
1464
- [/unexpected unlabled argument/i, 7],
1465
- [/parse error on token '%'/i, 7],
1466
- [/unexpected identifier 'b'/i, 8],
1467
- [/unexpected unlabled argument/i, 8],
1468
- [/parse error on token '%'/i, 8],
1469
- ], problems)
1470
- end
1471
-
1472
- def test_generics
1473
- root_elements = []
1474
- env, problems = instantiate(%q(
1475
- TestNode text: <bla>, nums: [<1>, <%2%>], boolean: <truthy>, enum: <%option%>, float: <precise>, related: <%noderef%>, others: [<other1>, <%other2%>]
1476
- ), TestMM, :root_elements => root_elements, :enable_generics => true)
1477
- assert_no_problems(problems)
1478
- assert root_elements[0].text.is_a?(RText::Generic)
1479
- assert_equal "bla", root_elements[0].text.string
1480
- assert_equal ["1", "2"], root_elements[0].nums.collect{|n| n.string}
1481
- assert_equal "truthy", root_elements[0].boolean.string
1482
- assert_equal "option", root_elements[0].enum.string
1483
- assert_equal "precise", root_elements[0].float.string
1484
- assert_equal "noderef", root_elements[0].related.string
1485
- assert_equal ["other1", "other2"], root_elements[0].others.collect{|n| n.string}
1486
- end
1487
-
1488
- def test_generics_forbidden
1489
- env, problems = instantiate(%Q(\
1490
- TestNode text: <bla>
1491
- ), TestMM)
1492
- assert_problems([
1493
- [/generic value not allowed/i, 1],
1494
- ], problems)
1495
- end
1496
-
1497
- #
1498
- # subpackages
1499
- #
1500
-
1501
- def test_subpackage
1502
- env, problems = instantiate(%q(
1503
- TestNodeSub text: "something"
1504
- ), TestMMSubpackage)
1505
- assert_no_problems(problems)
1506
- assert_equal "something", env.elements.first.text
1507
- end
1508
-
1509
- #
1510
- # values
1511
- #
1512
-
1513
- def test_escapes
1514
- env, problems = instantiate(%q(
1515
- TestNode text: "some \" \\\\ \\\\\" text \r xx \n xx \r\n xx \t xx \b xx \f"
1516
- ), TestMM)
1517
- assert_no_problems(problems)
1518
- assert_equal %Q(some " \\ \\" text \r xx \n xx \r\n xx \t xx \b xx \f), env.elements.first.text
1519
- end
1520
-
1521
- def test_escape_single_backslash
1522
- env, problems = instantiate(%q(
1523
- TestNode text: "a single \\ will be just itself"
1524
- ), TestMM)
1525
- assert_no_problems(problems)
1526
- assert_equal %q(a single \\ will be just itself), env.elements.first.text
1527
- end
1528
-
1529
- def test_string_umlauts
1530
- env, problems = instantiate(%q(
1531
- TestNode text: "ä, ö, ü"
1532
- ), TestMM)
1533
- assert_no_problems(problems)
1534
- assert_equal %q(ä, ö, ü), env.elements.first.text
1535
- end
1536
-
1537
- def test_integer
1538
- env, problems = instantiate(%q(
1539
- TestNode integer: 7
1540
- TestNode integer: 4294967296
1541
- TestNode integer: 12345678901234567890
1542
- ), TestMM)
1543
- assert_no_problems(problems)
1544
- assert_equal 7, env.elements[0].integer
1545
- assert_equal 4294967296, env.elements[1].integer
1546
- assert_equal 12345678901234567890, env.elements[2].integer
1547
- end
1548
-
1549
- def test_integer_hex
1550
- env, problems = instantiate(%q(
1551
- TestNode text: root {
1552
- TestNode integer: 0x7
1553
- TestNode integer: 0X7
1554
- TestNode integer: 0x007
1555
- TestNode integer: 0x77
1556
- TestNode integer: 0xabCDEF
1557
- TestNode integer: 0xabcdefabcdefabcdef
1558
- }
1559
- ), TestMM)
1560
- assert_no_problems(problems)
1561
- assert_equal [7, 7, 7, 0x77, 0xABCDEF, 0xabcdefabcdefabcdef], env.find(:text => "root").first.childs.collect{|c| c.integer}
1562
- end
1563
-
1564
- def test_float
1565
- env, problems = instantiate(%q(
1566
- TestNode float: 1.23
1567
- TestNode float: 1.23e-08
1568
- TestNode float: 1.23e+10
1569
- TestNode float: 1234567890.123456789
1570
- ), TestMM)
1571
- assert_no_problems(problems)
1572
- assert_equal 1.23, env.elements[0].float
1573
- assert_equal 1.23e-08, env.elements[1].float
1574
- assert_equal 1.23e+10, env.elements[2].float
1575
- if rgen_with_bigdecimal?
1576
- assert env.elements[3].float.is_a?(BigDecimal)
1577
- assert_equal "1234567890.123456789", env.elements[3].float.to_s("F")
1578
- else
1579
- assert env.elements[3].float.is_a?(Float)
1580
- assert_equal "1234567890.1234567", env.elements[3].float.to_s
1581
- end
1582
- end
1583
-
1584
- def test_boolean
1585
- env, problems = instantiate(%q(
1586
- TestNode text: root {
1587
- TestNode boolean: true
1588
- TestNode boolean: false
1589
- }
1590
- ), TestMM)
1591
- assert_no_problems(problems)
1592
- assert_equal [true, false], env.find(:text => "root").first.childs.collect{|c| c.boolean}
1593
- end
1594
-
1595
- def test_enum
1596
- env, problems = instantiate(%q(
1597
- TestNode text: root {
1598
- TestNode enum: A
1599
- TestNode enum: B
1600
- TestNode enum: "non-word*chars"
1601
- TestNode enum: "2you"
1602
- }
1603
- ), TestMM)
1604
- assert_no_problems(problems)
1605
- assert_equal [:A, :B, :'non-word*chars', :'2you'], env.find(:text => "root").first.childs.collect{|c| c.enum}
1606
- end
1607
-
1608
- def test_with_bom
1609
- env, problems = instantiate(%Q(\xEF\xBB\xBF
1610
- TestNode text: "some text", nums: [1,2] {
1611
- TestNode text: "child"
1612
- TestNode text: "child2"
1613
- }
1614
- ), TestMM)
1615
- assert_no_problems(problems)
1616
- assert_model_simple(env, :with_nums)
1617
- end
1618
-
1619
- #
1620
- # conflicts with builtins
1621
- #
1622
-
1623
- def test_conflict_builtin
1624
- env, problems = instantiate(%q(
1625
- Data notTheBuiltin: "for sure"
1626
- ), TestMMData)
1627
- assert_no_problems(problems)
1628
- assert_equal "for sure", env.elements.first.notTheBuiltin
1629
- end
1630
-
1631
- def test_builtin_in_subpackage
1632
- env, problems = instantiate(%q(
1633
- Data notTheBuiltin: "for sure"
1634
- ), TestMMSubpackage)
1635
- assert_no_problems(problems)
1636
- assert_equal "for sure", env.elements.first.notTheBuiltin
1637
- end
1638
-
1639
- #
1640
- # encoding
1641
- #
1642
-
1643
- def test_encodings
1644
- input = %Q(TestNode text: "iso-8859-1 AE Umlaut: \xc4")
1645
- # force encoding to binary in order to prevent exceptions on invalid byte sequences
1646
- # if the encoding would be utf-8, there would be an exception with the string above
1647
- input.force_encoding("binary")
1648
- env, problems = instantiate(input, TestMM)
1649
- assert_no_problems(problems)
1650
- assert_match /AE Umlaut: /, env.elements.first.text
1651
- end
1652
-
1653
- #
1654
- # line breaks
1655
- #
1656
-
1657
- def test_linebreak
1658
- roots = []
1659
- env, problems = instantiate(%Q(
1660
- TestNode sometext,
1661
- integer: 1,
1662
- nums: [
1663
- 1,
1664
- 2
1665
- ]
1666
- ), TestMM, :root_elements => roots, :unlabled_arguments => proc {|clazz| ["text"]})
1667
- assert_no_problems(problems)
1668
- node = roots.first
1669
- assert_equal "sometext", node.text
1670
- assert_equal 1, node.integer
1671
- assert_equal [1,2], node.nums
1672
- end
1673
-
1674
- def test_linebreak_backslash
1675
- roots = []
1676
- env, problems = instantiate(%Q(
1677
- TestNode \\
1678
- sometext
1679
- ), TestMM, :root_elements => roots, :unlabled_arguments => proc {|clazz| ["text"]})
1680
- assert_no_problems(problems)
1681
- node = roots.first
1682
- assert_equal "sometext", node.text
1683
- end
1684
-
1685
- def test_linebreak_backslash_problems
1686
- roots = []
1687
- env, problems = instantiate(%Q(
1688
- TostNode \\
1689
- sometext
1690
- TostNode
1691
- ), TestMM, :root_elements => roots, :unlabled_arguments => proc {|clazz| ["text"]})
1692
- assert_problems([
1693
- [/unknown command/i, 2],
1694
- [/unknown command/i, 4],
1695
- ], problems)
1696
- end
1697
-
1698
- module TestMMObjectAttribute
1699
- extend RGen::MetamodelBuilder::ModuleExtension
1700
- class TestNode < RGen::MetamodelBuilder::MMBase
1701
- has_many_attr 'objs', Object
1702
- end
1703
- end
1704
-
1705
- def test_object_attribute
1706
- roots = []
1707
- env, problems = instantiate(%Q(
1708
- TestNode objs: ["some text", -123, someSymbol, true, false, -0.097]
1709
- ), TestMMObjectAttribute, :root_elements => roots)
1710
- assert_no_problems(problems)
1711
- node = roots.first
1712
- assert_equal ['some text', -123, 'someSymbol', true, false, -0.097], node.objs
1713
- end
1714
-
1715
- private
1716
-
1717
- def instantiate(text, mm, options={})
1718
- env = RGen::Environment.new
1719
- lang = RText::Language.new(mm.ecore, options.merge(
1720
- :root_classes => mm.ecore.eAllClasses.select{|c|
1721
- c.name == "TestNode" || c.name == "Data" || c.name == "TestNodeSub" || c.name == "SubNode"}))
1722
- inst = RText::Instantiator.new(lang)
1723
- problems = []
1724
- inst.instantiate(text, options.merge({:env => env, :problems => problems, :root_elements => options[:root_elements]}))
1725
- return env, problems
1726
- end
1727
-
1728
- def assert_no_problems(problems)
1729
- assert problems.empty?, problems.collect{|p| "#{p.message}, line: #{p.line}"}.join("\n")
1730
- end
1731
-
1732
- def assert_problems(expected, problems)
1733
- remaining = problems.dup
1734
- probs = []
1735
- expected.each do |e|
1736
- if e.is_a?(Array)
1737
- p = remaining.find{|p| p.message =~ e[0] && p.line == e[1]}
1738
- else
1739
- p = remaining.find{|p| p.message =~ e}
1740
- end
1741
- probs << "expected problem not present: #{e}" if !p
1742
- # make sure to not delete duplicate problems at once
1743
- idx = remaining.index(p)
1744
- remaining.delete_at(idx) if idx
1745
- end
1746
- remaining.each do |p|
1747
- probs << "unexpected problem: #{p.message}, line: #{p.line}"
1748
- end
1749
- assert probs.empty?, probs.join("\n")
1750
- end
1751
-
1752
- def assert_model_simple(env, *opts)
1753
- raise "unknown options" unless (opts - [:with_nums]).empty?
1754
- root = env.find(:class => TestMM::TestNode, :text => "some text").first
1755
- assert root != nil
1756
- assert_equal 2, root.childs.size
1757
- assert_equal [TestMM::TestNode, TestMM::TestNode], root.childs.collect{|c| c.class}
1758
- assert_equal ["child", "child2"], root.childs.text
1759
- if opts.include?(:with_nums)
1760
- assert_equal [1, 2], root.nums
1761
- end
1762
- end
1763
-
1764
- def rgen_with_bigdecimal?
1765
- begin
1766
- TestMM::TestNode.new.float = BigDecimal.new("0.0")
1767
- rescue StandardError
1768
- return false
1769
- end
1770
- true
1771
- end
1772
-
1773
- end