rtext 0.7.0 → 0.8.0.pre1

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,10 +1,16 @@
1
1
  EPackage StatemachineMM {
2
2
  EClass State, abstract: true {
3
3
  EAttribute name, eType: /StatemachineMM/StringType
4
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
4
+ EReference parent,
5
+ eType: /StatemachineMM/CompositeState,
6
+ eOpposite: /StatemachineMM/CompositeState/substates
5
7
  }
6
8
  EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
7
- EClass CompositeState, eSuperTypes: [/StatemachineMM/State] {
9
+ EClass CompositeState,
10
+ eSuperTypes: [
11
+ /StatemachineMM/State
12
+ ],
13
+ abstract: false {
8
14
  EReference substates, upperBound: -1, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
9
15
  }
10
16
  EClass Transition {
@@ -350,6 +350,160 @@ EPackage StatemachineMM {
350
350
  ]
351
351
  end
352
352
 
353
+ def test_complete_feature_after_linebreak
354
+ setup_connector(ModelFile)
355
+ load_model
356
+ context = build_context <<-END
357
+ EPackage StatemachineMM {
358
+ EClass State, abstract: true {
359
+ EAttribute name, eType: /StatemachineMM/StringType
360
+ EReference parent,
361
+ |eType: /StatemachineMM/CompositeState,
362
+ END
363
+ assert_completions context, [
364
+ "containment:",
365
+ "resolveProxies:",
366
+ "eOpposite:",
367
+ "changeable:",
368
+ "defaultValueLiteral:",
369
+ "derived:",
370
+ "transient:",
371
+ "unsettable:",
372
+ "volatile:",
373
+ "lowerBound:",
374
+ "ordered:",
375
+ "unique:",
376
+ "upperBound:",
377
+ "eType:"
378
+ ]
379
+ end
380
+
381
+ def test_complete_reference_after_linebreak
382
+ setup_connector(ModelFile)
383
+ load_model
384
+ context = build_context <<-END
385
+ EPackage StatemachineMM {
386
+ EClass State, abstract: true {
387
+ EAttribute name, eType: /StatemachineMM/StringType
388
+ EReference parent,
389
+ eType: |/StatemachineMM/CompositeState,
390
+ END
391
+ assert_completions context, [
392
+ "/StatemachineMM/CompositeState",
393
+ "/StatemachineMM/SimpleState",
394
+ "/StatemachineMM/State",
395
+ "/StatemachineMM/StringType",
396
+ "/StatemachineMM/Transition",
397
+ "/StatemachineMM2/SimpleState",
398
+ "/StatemachineMM2/State"
399
+ ]
400
+ end
401
+
402
+ def test_complete_command_after_linebreak
403
+ setup_connector(ModelFile)
404
+ load_model
405
+ context = build_context <<-END
406
+ EPackage StatemachineMM {
407
+ EClass State, abstract: true {
408
+ EAttribute name, eType: /StatemachineMM/StringType
409
+ EReference parent,
410
+ eType: /StatemachineMM/CompositeState,
411
+ eOpposite: /StatemachineMM/CompositeState/substates
412
+ }
413
+ EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
414
+ EClass CompositeState,
415
+ eSuperTypes: [
416
+ /StatemachineMM/State
417
+ ],
418
+ abstract: false {
419
+ |EReference substates, upperBound: -1, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
420
+ END
421
+ assert_completions context, [
422
+ "EAnnotation",
423
+ "EAttribute",
424
+ "EOperation",
425
+ "EReference",
426
+ "EStructuralFeature"
427
+ ]
428
+ end
429
+
430
+ def test_complete_value_after_linebreak
431
+ setup_connector(ModelFile)
432
+ load_model
433
+ context = build_context <<-END
434
+ EPackage StatemachineMM {
435
+ EClass State, abstract: true {
436
+ EAttribute name, eType: /StatemachineMM/StringType
437
+ EReference parent,
438
+ eType: /StatemachineMM/CompositeState,
439
+ eOpposite: /StatemachineMM/CompositeState/substates
440
+ }
441
+ EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
442
+ EClass CompositeState,
443
+ eSuperTypes: [
444
+ /StatemachineMM/State
445
+ ],
446
+ abstract: |false {
447
+ END
448
+ assert_completions context, [
449
+ "true",
450
+ "false"
451
+ ]
452
+ end
453
+
454
+ def test_complete_in_array_after_linebreak
455
+ setup_connector(ModelFile)
456
+ load_model
457
+ context = build_context <<-END
458
+ EPackage StatemachineMM {
459
+ EClass State, abstract: true {
460
+ EAttribute name, eType: /StatemachineMM/StringType
461
+ EReference parent,
462
+ eType: /StatemachineMM/CompositeState,
463
+ eOpposite: /StatemachineMM/CompositeState/substates
464
+ }
465
+ EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
466
+ EClass CompositeState,
467
+ eSuperTypes: [
468
+ |/StatemachineMM/State
469
+ END
470
+ assert_completions context, [
471
+ "/StatemachineMM/CompositeState",
472
+ "/StatemachineMM/SimpleState",
473
+ "/StatemachineMM/State",
474
+ "/StatemachineMM/Transition",
475
+ "/StatemachineMM2/SimpleState",
476
+ "/StatemachineMM2/State"
477
+ ]
478
+ end
479
+
480
+ def test_complete_in_array_after_linebreak2
481
+ setup_connector(ModelFile)
482
+ load_model
483
+ context = build_context <<-END
484
+ EPackage StatemachineMM {
485
+ EClass State, abstract: true {
486
+ EAttribute name, eType: /StatemachineMM/StringType
487
+ EReference parent,
488
+ eType: /StatemachineMM/CompositeState,
489
+ eOpposite: /StatemachineMM/CompositeState/substates
490
+ }
491
+ EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
492
+ EClass CompositeState,
493
+ eSuperTypes: [
494
+ /StatemachineMM/State
495
+ |],
496
+ END
497
+ assert_completions context, [
498
+ "/StatemachineMM/CompositeState",
499
+ "/StatemachineMM/SimpleState",
500
+ "/StatemachineMM/State",
501
+ "/StatemachineMM/Transition",
502
+ "/StatemachineMM2/SimpleState",
503
+ "/StatemachineMM2/State"
504
+ ]
505
+ end
506
+
353
507
  def test_reference_completion
354
508
  setup_connector(ModelFile)
355
509
  load_model
@@ -418,7 +572,9 @@ def test_reference_completion_in_array
418
572
  EPackage StatemachineMM {
419
573
  EClass State, abstract: true {
420
574
  EAttribute name, eType: /StatemachineMM/StringType
421
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
575
+ EReference parent,
576
+ eType: /StatemachineMM/CompositeState,
577
+ eOpposite: /StatemachineMM/CompositeState/substates
422
578
  }
423
579
  EClass SimpleState, eSuperTypes: [|/StatemachineMM/State]
424
580
  END
@@ -434,7 +590,9 @@ EPackage StatemachineMM {
434
590
  EPackage StatemachineMM {
435
591
  EClass State, abstract: true {
436
592
  EAttribute name, eType: /StatemachineMM/StringType
437
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
593
+ EReference parent,
594
+ eType: /StatemachineMM/CompositeState,
595
+ eOpposite: /StatemachineMM/CompositeState/substates
438
596
  }
439
597
  EClass SimpleState, eSuperTypes: [/StatemachineMM/S|tate]
440
598
  END
@@ -450,7 +608,9 @@ EPackage StatemachineMM {
450
608
  EPackage StatemachineMM {
451
609
  EClass State, abstract: true {
452
610
  EAttribute name, eType: /StatemachineMM/StringType
453
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
611
+ EReference parent,
612
+ eType: /StatemachineMM/CompositeState,
613
+ eOpposite: /StatemachineMM/CompositeState/substates
454
614
  }
455
615
  EClass SimpleState, eSuperTypes: [/StatemachineMM/State|]
456
616
  END
@@ -466,7 +626,9 @@ EPackage StatemachineMM {
466
626
  EPackage StatemachineMM {
467
627
  EClass State, abstract: true {
468
628
  EAttribute name, eType: /StatemachineMM/StringType
469
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
629
+ EReference parent,
630
+ eType: /StatemachineMM/CompositeState,
631
+ eOpposite: /StatemachineMM/CompositeState/substates
470
632
  }
471
633
  EClass SimpleState, eSuperTypes: [/StatemachineMM/State]|
472
634
  END
@@ -481,10 +643,16 @@ def test_integer_completion
481
643
  EPackage StatemachineMM {
482
644
  EClass State, abstract: true {
483
645
  EAttribute name, eType: /StatemachineMM/StringType
484
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
646
+ EReference parent,
647
+ eType: /StatemachineMM/CompositeState,
648
+ eOpposite: /StatemachineMM/CompositeState/substates
485
649
  }
486
650
  EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
487
- EClass CompositeState, eSuperTypes: [/StatemachineMM/State] {
651
+ EClass CompositeState,
652
+ eSuperTypes: [
653
+ /StatemachineMM/State
654
+ ],
655
+ abstract: false {
488
656
  EReference substates, upperBound: |-1, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
489
657
  END
490
658
  assert_completions context, [
@@ -494,10 +662,16 @@ EPackage StatemachineMM {
494
662
  EPackage StatemachineMM {
495
663
  EClass State, abstract: true {
496
664
  EAttribute name, eType: /StatemachineMM/StringType
497
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
665
+ EReference parent,
666
+ eType: /StatemachineMM/CompositeState,
667
+ eOpposite: /StatemachineMM/CompositeState/substates
498
668
  }
499
669
  EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
500
- EClass CompositeState, eSuperTypes: [/StatemachineMM/State] {
670
+ EClass CompositeState,
671
+ eSuperTypes: [
672
+ /StatemachineMM/State
673
+ ],
674
+ abstract: false {
501
675
  EReference substates, upperBound: -1|, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
502
676
  END
503
677
  assert_completions context, [
@@ -515,7 +689,7 @@ EPackage StatemachineMM {
515
689
  END
516
690
  assert_link_targets context, :begin => 29, :end => 54, :targets => [
517
691
  {"file"=> File.expand_path(@infile),
518
- "line"=>14,
692
+ "line"=>20,
519
693
  "display"=>"/StatemachineMM/StringType [EDataType]"}
520
694
  ]
521
695
  context = build_context <<-END
@@ -525,7 +699,7 @@ EPackage StatemachineMM {
525
699
  END
526
700
  assert_link_targets context, :begin => 29, :end => 54, :targets => [
527
701
  {"file"=> File.expand_path(@infile),
528
- "line"=>14,
702
+ "line"=>20,
529
703
  "display"=>"/StatemachineMM/StringType [EDataType]"}
530
704
  ]
531
705
  context = build_context <<-END
@@ -535,7 +709,7 @@ EPackage StatemachineMM {
535
709
  END
536
710
  assert_link_targets context, :begin => 29, :end => 54, :targets => [
537
711
  {"file"=> File.expand_path(@infile),
538
- "line"=>14,
712
+ "line"=>20,
539
713
  "display"=>"/StatemachineMM/StringType [EDataType]"}
540
714
  ]
541
715
  context = build_context <<-END
@@ -557,17 +731,19 @@ EPackage StatemachineMM {
557
731
  END
558
732
  assert_link_targets context, :begin => 3, :end => 8, :targets => [
559
733
  {"file"=> File.expand_path(@infile),
560
- "line"=>6,
734
+ "line"=>8,
561
735
  "display"=>"/StatemachineMM/SimpleState [EClass]"},
562
736
  {"file"=> File.expand_path(@infile),
563
- "line"=>7,
737
+ "line"=>9,
564
738
  "display"=>"/StatemachineMM/CompositeState [EClass]"}
565
739
  ]
566
740
  context = build_context <<-END
567
741
  EPackage StatemachineMM {
568
742
  EClass State, abstract: true {
569
743
  EAttribute name, eType: /StatemachineMM/StringType
570
- EReference parent, eType: /StatemachineMM/CompositeState, eOpposite: /StatemachineMM/CompositeState/substates
744
+ EReference parent,
745
+ eType: /StatemachineMM/CompositeState,
746
+ eOpposite: /StatemachineMM/CompositeState/substates
571
747
  }
572
748
  |EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
573
749
  END
@@ -594,6 +770,58 @@ EPackage StatemachineMM2 {
594
770
  ]
595
771
  end
596
772
 
773
+ def test_link_targets_after_linebreak
774
+ setup_connector(ModelFile)
775
+ load_model
776
+ context = build_context <<-END
777
+ EPackage StatemachineMM {
778
+ EClass State, abstract: true {
779
+ EAttribute name, eType: /StatemachineMM/StringType
780
+ EReference parent,
781
+ eType: /St|atemachineMM/CompositeState,
782
+ END
783
+ # in case of linebreaks, the begin and end column refer to the string which
784
+ # was passed to the backend as the context; in this case the context extractor
785
+ # appends each broken line to the previous line with all the leading whitespace removed
786
+ assert_link_targets context, :begin => 30, :end => 59, :targets => [
787
+ {"file"=> File.expand_path(@infile),
788
+ "line"=>9,
789
+ "display"=>"/StatemachineMM/CompositeState [EClass]"}
790
+ ]
791
+ context = build_context <<-END
792
+ EPackage StatemachineMM {
793
+ EClass State, abstract: true {
794
+ EAttribute name, eType: /StatemachineMM/StringType
795
+ EReference parent,
796
+ eType: |/StatemachineMM/CompositeState,
797
+ END
798
+ assert_link_targets context, :begin => 30, :end => 59, :targets => [
799
+ {"file"=> File.expand_path(@infile),
800
+ "line"=>9,
801
+ "display"=>"/StatemachineMM/CompositeState [EClass]"}
802
+ ]
803
+ context = build_context <<-END
804
+ EPackage StatemachineMM {
805
+ EClass State, abstract: true {
806
+ EAttribute name, eType: /StatemachineMM/StringType
807
+ EReference parent,
808
+ eType: /StatemachineMM/CompositeStat|e,
809
+ END
810
+ assert_link_targets context, :begin => 30, :end => 59, :targets => [
811
+ {"file"=> File.expand_path(@infile),
812
+ "line"=>9,
813
+ "display"=>"/StatemachineMM/CompositeState [EClass]"}
814
+ ]
815
+ context = build_context <<-END
816
+ EPackage StatemachineMM {
817
+ EClass State, abstract: true {
818
+ EAttribute name, eType: /StatemachineMM/StringType
819
+ EReference parent,
820
+ eType: /StatemachineMM/CompositeState|,
821
+ END
822
+ assert_link_targets context, :begin => nil, :end => nil, :targets => []
823
+ end
824
+
597
825
  def test_find_elements
598
826
  setup_connector(ModelFile)
599
827
  load_model
@@ -617,7 +845,7 @@ def test_find_elements
617
845
  assert_equal \
618
846
  [{"display"=>"target [EReference] - /StatemachineMM/Transition",
619
847
  "file"=> File.expand_path(@infile),
620
- "line"=>11}], response["elements"]
848
+ "line"=>17}], response["elements"]
621
849
  response = @con.execute_command(
622
850
  {"command" => "find_elements", "search_pattern" => ""})
623
851
  assert_equal [], response["elements"]
@@ -654,9 +882,9 @@ def assert_link_targets(context, options)
654
882
  infile = options[:file] || @infile
655
883
  content = File.open(infile, "rb") {|f| f.read}
656
884
  lines = content.split(/\r?\n/)[0..context.line-1]
657
- lines = RText::Frontend::Context.extract(lines)
885
+ lines, col = RText::Frontend::Context.new.extract(lines, context.col)
658
886
  response = @con.execute_command(
659
- {"command" => "link_targets", "context" => lines, "column" => context.col})
887
+ {"command" => "link_targets", "context" => lines, "column" => col})
660
888
  assert_equal "response", response["type"]
661
889
  assert_equal options[:targets], response["targets"]
662
890
  assert_equal options[:begin], response["begin_column"]
@@ -666,9 +894,9 @@ end
666
894
  def assert_completions(context, expected)
667
895
  content = File.open(@infile, "rb"){|f| f.read}
668
896
  lines = content.split(/\r?\n/)[0..context.line-1]
669
- lines = RText::Frontend::Context.extract(lines)
897
+ lines, col = RText::Frontend::Context.new.extract(lines, context.col)
670
898
  response = @con.execute_command(
671
- {"command" => "content_complete", "context" => lines, "column" => context.col})
899
+ {"command" => "content_complete", "context" => lines, "column" => col})
672
900
  assert_equal expected, response["options"].collect{|o| o["insert"]}
673
901
  end
674
902
 
@@ -189,6 +189,14 @@ TestNode |SomeNode
189
189
  assert_link_desc ld, :element => "TestNode", :feature => "name", :index => 0, :backward => true, :value => "SomeNode", :scol => 10, :ecol => 17
190
190
  end
191
191
 
192
+ def test_command_and_name_curly_no_ws
193
+ ld = build_link_desc(TestMM, {:backward_ref => "name"}, <<-END
194
+ TestNode Some|Node{
195
+ END
196
+ )
197
+ assert_link_desc ld, :element => "TestNode", :element_name => "SomeNode", :feature => "name", :index => 0, :backward => true, :value => "SomeNode", :scol => 10, :ecol => 17
198
+ end
199
+
192
200
  def test_child_within_command
193
201
  ld = build_link_desc(TestMM, {:backward_ref => "name"}, <<-END
194
202
  TestNode SomeNode {
@@ -256,6 +264,9 @@ def assert_link_desc(ld, options)
256
264
  else
257
265
  assert_nil ld.element
258
266
  end
267
+ if options[:element_name]
268
+ assert_equal options[:element_name], ld.element.name
269
+ end
259
270
  if options[:feature]
260
271
  assert_equal options[:feature], ld.feature.name
261
272
  else
@@ -8,3 +8,4 @@ require 'tokenizer_test'
8
8
  require 'link_detector_test'
9
9
  require 'integration/test'
10
10
  require 'message_helper_test'
11
+ require 'frontend/context_test'
@@ -27,6 +27,12 @@ class SerializerTest < Test::Unit::TestCase
27
27
  class TestNode < RGen::MetamodelBuilder::MMBase
28
28
  has_attr 'text', String
29
29
  has_many_attr 'texts', String
30
+ has_many_attr 'more_texts', String
31
+ has_attr 'unlabled', String
32
+ has_attr 'unquoted', String
33
+ has_attr 'both', String
34
+ has_attr 'none', String
35
+ has_attr 'comment', String
30
36
  has_attr 'integer', Integer
31
37
  has_attr 'float', Float
32
38
  has_attr 'enum', SomeEnum
@@ -297,6 +303,25 @@ TestNode name: "Target2"
297
303
  ),output
298
304
  end
299
305
 
306
+ def test_identifier_provider_nil
307
+ testModel = [
308
+ TestMMRef::TestNode.new(:name => "Source"),
309
+ TestMMRef::TestNode.new(:name => "Target")]
310
+ testModel[0].refOne = testModel[1]
311
+
312
+ output = StringWriter.new
313
+ serialize(testModel, TestMMRef, output,
314
+ :identifier_provider => proc{|e, context, feature, index|
315
+ nil
316
+ }
317
+ )
318
+
319
+ assert_equal %Q(\
320
+ TestNode name: "Source"
321
+ TestNode name: "Target"
322
+ ),output
323
+ end
324
+
300
325
  def test_references
301
326
  testModel = [
302
327
  TestMMRef::TestNode.new(:name => "Source"),
@@ -349,6 +374,7 @@ TestNode name: "Target" {
349
374
  end
350
375
  class TestNode < RGen::MetamodelBuilder::MMBase
351
376
  has_attr 'text', String
377
+ has_many_attr 'texts', String
352
378
  contains_one 'child1', TestNode, 'parent1'
353
379
  contains_many 'childs2', TestNode, 'parent2'
354
380
  contains_one 'child3', TestNodeA, 'parent3'
@@ -450,6 +476,13 @@ TestNode1 text: "some text" {
450
476
  assert_equal %q(TestNode integer: 7)+"\n", output
451
477
  end
452
478
 
479
+ def test_integer_big
480
+ testModel = TestMM::TestNode.new(:integer => 12345678901234567890)
481
+ output = StringWriter.new
482
+ serialize(testModel, TestMM, output)
483
+ assert_equal %q(TestNode integer: 12345678901234567890)+"\n", output
484
+ end
485
+
453
486
  def test_integer_format_spec
454
487
  testModel = TestMM::TestNode.new(:integer => 10)
455
488
  output = StringWriter.new
@@ -462,6 +495,18 @@ TestNode1 text: "some text" {
462
495
  assert_equal %q(TestNode integer: 0x0A)+"\n", output
463
496
  end
464
497
 
498
+ def test_integer_format_spec_big
499
+ testModel = TestMM::TestNode.new(:integer => 0xabcdefabcdefabcdef)
500
+ output = StringWriter.new
501
+ serialize(testModel, TestMM, output, :argument_format_provider => proc {|a|
502
+ if a.name == "integer"
503
+ "0x%x"
504
+ else
505
+ nil
506
+ end})
507
+ assert_equal %q(TestNode integer: 0xabcdefabcdefabcdef)+"\n", output
508
+ end
509
+
465
510
  def test_float
466
511
  testModel = TestMM::TestNode.new(:float => 1.23)
467
512
  output = StringWriter.new
@@ -606,6 +651,349 @@ TestNode text: "some text"
606
651
  ), output.string
607
652
  end
608
653
 
654
+ #
655
+ # line breaks
656
+ #
657
+ All_features = proc {|clazz|
658
+ res = []
659
+ clazz.eAllStructuralFeatures.reject{|f| f.name =~ /parent|2$/}.each{|f| res << f.name}
660
+ res
661
+ }
662
+
663
+ def test_linebreak
664
+ testModel = TestMM::TestNode.new(
665
+ :text => "some text",
666
+ :texts => ["some more text", "some more text", "some more text"])
667
+
668
+ output = StringWriter.new
669
+ serialize(testModel, TestMM, output,
670
+ :newline_arguments => All_features,
671
+ :newline_arrays => All_features)
672
+
673
+ assert_equal %Q(\
674
+ TestNode \\
675
+ text: "some text",
676
+ texts: [
677
+ "some more text",
678
+ "some more text",
679
+ "some more text"
680
+ ]
681
+ ), output
682
+ end
683
+
684
+ def test_linebreak_child
685
+ testModel1 = TestMM::TestNode.new(
686
+ :text => "some text1",
687
+ :texts => ["some more text", "some more text", "some more text"])
688
+ testModel0 = TestMM::TestNode.new(
689
+ :text => "some text0",
690
+ :integer => 10,
691
+ :childs => [testModel1])
692
+
693
+ output = StringWriter.new
694
+ serialize(testModel0, TestMM, output,
695
+ :newline_arguments => All_features,
696
+ :newline_arrays => All_features)
697
+
698
+ assert_equal %Q(\
699
+ TestNode \\
700
+ text: "some text0",
701
+ integer: 10 {
702
+ TestNode \\
703
+ text: "some text1",
704
+ texts: [
705
+ "some more text",
706
+ "some more text",
707
+ "some more text"
708
+ ]
709
+ }
710
+ ), output
711
+ end
712
+
713
+ def test_linebreak_child_no_arguments
714
+ testModel1 = TestMM::TestNode.new(
715
+ :text => "some text1",
716
+ :texts => ["some more text", "some more text", "some more text"])
717
+ testModel0 = TestMM::TestNode.new(:childs => [testModel1])
718
+
719
+ output = StringWriter.new
720
+ serialize(testModel0, TestMM, output,
721
+ :newline_arguments => All_features,
722
+ :newline_arrays => All_features)
723
+
724
+ assert_equal %Q(\
725
+ TestNode {
726
+ TestNode \\
727
+ text: "some text1",
728
+ texts: [
729
+ "some more text",
730
+ "some more text",
731
+ "some more text"
732
+ ]
733
+ }
734
+ ), output
735
+ end
736
+
737
+ def test_linebreak_unlabled_array_arguments
738
+ testModel = TestMM::TestNode.new(
739
+ :none => "some text",
740
+ :texts => ["some more text", "some more text", "some more text"])
741
+
742
+ output = StringWriter.new
743
+ serialize(testModel, TestMM, output,
744
+ :unlabled_arguments => proc {|clazz| ["texts"]},
745
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["texts"]},
746
+ :newline_arrays => All_features)
747
+
748
+ assert_equal %Q(\
749
+ TestNode [
750
+ "some more text",
751
+ "some more text",
752
+ "some more text"
753
+ ],
754
+ none: "some text"
755
+ ), output
756
+ end
757
+
758
+ def test_linebreak_unlabled_array_arguments_sameline
759
+ testModel = TestMM::TestNode.new(
760
+ :none => "some text",
761
+ :texts => ["some more text", "some more text", "some more text"])
762
+
763
+ output = StringWriter.new
764
+ serialize(testModel, TestMM, output,
765
+ :unlabled_arguments => proc {|clazz| ["texts"]},
766
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["texts"]},
767
+ :newline_arrays => proc {|clazz| All_features.call(clazz) - ["texts"]})
768
+
769
+ assert_equal %Q(\
770
+ TestNode ["some more text", "some more text", "some more text"],
771
+ none: "some text"
772
+ ), output
773
+ end
774
+
775
+ def test_linebreak_unlabled_both_arguments_and_child
776
+ testModel1 = TestMM::TestNode.new(
777
+ :texts => ["some more text", "some more text", "some more text"])
778
+ testModel0 = TestMM::TestNode.new(
779
+ :unlabled => "unlabled",
780
+ :both => "both",
781
+ :childs => [testModel1])
782
+
783
+ output = StringWriter.new
784
+ serialize(testModel0, TestMM, output,
785
+ :unlabled_arguments => proc {|clazz| ["unlabled", "both"]},
786
+ :unquoted_arguments => proc {|clazz| ["both"]},
787
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["unlabled"]},
788
+ :newline_arrays => All_features)
789
+
790
+ assert_equal %Q(\
791
+ TestNode "unlabled",
792
+ both {
793
+ TestNode \\
794
+ texts: [
795
+ "some more text",
796
+ "some more text",
797
+ "some more text"
798
+ ]
799
+ }
800
+ ), output
801
+ end
802
+
803
+ def test_linebreak_child_two_attributes
804
+ testModel1 = TestMM::TestNode.new(
805
+ :text => "some text1",
806
+ :texts => ["some more text", "some more text", "some more text"],
807
+ :more_texts => ["even more text", "even more text"])
808
+ testModel0 = TestMM::TestNode.new(:text => "some text0", :childs => [testModel1])
809
+
810
+ output = StringWriter.new
811
+ serialize(testModel0, TestMM, output,
812
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["text"]},
813
+ :newline_arrays => proc {|clazz| All_features.call(clazz) - ["text"]})
814
+
815
+ assert_equal %Q(\
816
+ TestNode text: "some text0" {
817
+ TestNode text: "some text1",
818
+ texts: [
819
+ "some more text",
820
+ "some more text",
821
+ "some more text"
822
+ ],
823
+ more_texts: [
824
+ "even more text",
825
+ "even more text"
826
+ ]
827
+ }
828
+ ), output
829
+ end
830
+
831
+ def test_linebreak_child_two_attributes_one_sameline
832
+ testModel1 = TestMM::TestNode.new(
833
+ :text => "some text1",
834
+ :texts => ["some more text", "some more text", "some more text"],
835
+ :more_texts => ["even more text", "even more text"])
836
+ testModel0 = TestMM::TestNode.new(:text => "some text0", :childs => [testModel1])
837
+
838
+ output = StringWriter.new
839
+ serialize(testModel0, TestMM, output,
840
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["more_texts"]},
841
+ :newline_arrays => proc {|clazz| All_features.call(clazz) - ["more_texts"]})
842
+
843
+ assert_equal %Q(\
844
+ TestNode \\
845
+ text: "some text0" {
846
+ TestNode \\
847
+ text: "some text1",
848
+ texts: [
849
+ "some more text",
850
+ "some more text",
851
+ "some more text"
852
+ ], more_texts: ["even more text", "even more text"]
853
+ }
854
+ ), output
855
+ end
856
+
857
+ def test_linebreak_two_children
858
+ testModel2 = TestMM::TestNode.new(:text => "some text2", :texts => ["some more text"])
859
+ testModel1 = TestMM::TestNode.new(:text => "some text1", :texts => ["some more text", "some more text", "some more text"])
860
+ testModel0 = TestMM::TestNode.new(:text => "some text0", :childs => [testModel1, testModel2])
861
+
862
+ output = StringWriter.new
863
+ serialize(testModel0, TestMM, output,
864
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["text"]},
865
+ :newline_arrays => All_features)
866
+
867
+ assert_equal %Q(\
868
+ TestNode text: "some text0" {
869
+ TestNode text: "some text1",
870
+ texts: [
871
+ "some more text",
872
+ "some more text",
873
+ "some more text"
874
+ ]
875
+ TestNode text: "some text2",
876
+ texts: "some more text"
877
+ }
878
+ ), output
879
+ end
880
+
881
+ def test_linebreak_nested_children
882
+ testModel2 = TestMM::TestNode.new(
883
+ :text => "some text2",
884
+ :texts => ["some more text", "some more text", "some more text"])
885
+ testModel1 = TestMM::TestNode.new(
886
+ :text => "some text1",
887
+ :childs => [testModel2])
888
+ testModel0 = TestMM::TestNode.new(
889
+ :text => "some text0",
890
+ :integer => 10,
891
+ :childs => [testModel1])
892
+
893
+ output = StringWriter.new
894
+ serialize(testModel0, TestMM, output,
895
+ :newline_arguments => All_features,
896
+ :newline_arrays => All_features)
897
+
898
+ assert_equal %Q(\
899
+ TestNode \\
900
+ text: "some text0",
901
+ integer: 10 {
902
+ TestNode \\
903
+ text: "some text1" {
904
+ TestNode \\
905
+ text: "some text2",
906
+ texts: [
907
+ "some more text",
908
+ "some more text",
909
+ "some more text"
910
+ ]
911
+ }
912
+ }
913
+ ), output
914
+ end
915
+
916
+ def test_linebreak_no_break
917
+ testModel = TestMM::TestNode.new(:text => "some text", :texts => ["some more text", "some more text", "some more text"])
918
+
919
+ output = StringWriter.new
920
+ serialize(testModel, TestMM, output)
921
+
922
+ assert_equal %Q(\
923
+ TestNode text: "some text", texts: ["some more text", "some more text", "some more text"]
924
+ ), output
925
+ end
926
+
927
+ def test_linebreak_child_role
928
+ testModel = TestMMChildRole::TestNode.new(
929
+ :child1 => TestMMChildRole::TestNode.new(:text => "child1"),
930
+ :childs2 => [
931
+ TestMMChildRole::TestNode.new(
932
+ :text => "child2a",
933
+ :texts => ["some more text", "some more text"]),
934
+ TestMMChildRole::TestNode.new(
935
+ :text => "child2b",
936
+ :texts => ["some more text", "some more text"])
937
+ ])
938
+
939
+ output = StringWriter.new
940
+ serialize(testModel, TestMMChildRole, output,
941
+ :newline_arguments => proc {|clazz| All_features.call(clazz) - ["text"]},
942
+ :newline_arrays => proc {|clazz| All_features.call(clazz) - ["text"]})
943
+
944
+ assert_equal %Q(\
945
+ TestNode {
946
+ child1:
947
+ TestNode text: "child1"
948
+ childs2: [
949
+ TestNode text: "child2a",
950
+ texts: [
951
+ "some more text",
952
+ "some more text"
953
+ ]
954
+ TestNode text: "child2b",
955
+ texts: [
956
+ "some more text",
957
+ "some more text"
958
+ ]
959
+ ]
960
+ }
961
+ ), output
962
+ end
963
+
964
+ def test_linebreak_comment
965
+ testModel = TestMM::TestNode.new(
966
+ :text => "some text",
967
+ :comment => "this is a comment",
968
+ :childs => [
969
+ TestMM::TestNode.new(:comment => "\n\ncomment of a child node\n multiline\n\n\nanother\n\n\n")
970
+ ])
971
+
972
+ output = StringWriter.new
973
+ serialize(testModel, TestMM, output,
974
+ :newline_arguments => All_features,
975
+ :comment_provider => proc { |e|
976
+ c = e.comment
977
+ e.comment = nil
978
+ c
979
+ })
980
+
981
+ assert_equal %Q(\
982
+ #this is a comment
983
+ TestNode \\
984
+ text: "some text" {
985
+ #
986
+ #
987
+ #comment of a child node
988
+ # multiline
989
+ #
990
+ #
991
+ #another
992
+ TestNode
993
+ }
994
+ ), output
995
+ end
996
+
609
997
  def serialize(model, mm, output, options={})
610
998
  lang = RText::Language.new(mm.ecore, options)
611
999
  ser = RText::Serializer.new(lang)