rtext 0.7.0 → 0.8.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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)