rgen 0.3.0 → 0.4.0
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.
- data/CHANGELOG +20 -1
- data/MIT-LICENSE +1 -1
- data/README +12 -9
- data/lib/instantiators/ea_instantiator.rb +36 -0
- data/lib/metamodels/uml13_metamodel.rb +559 -0
- data/lib/metamodels/uml13_metamodel_ext.rb +26 -0
- data/lib/mmgen/metamodel_generator.rb +5 -5
- data/lib/mmgen/mm_ext/ecore_ext.rb +95 -0
- data/lib/mmgen/mmgen.rb +6 -4
- data/lib/mmgen/templates/annotations.tpl +37 -0
- data/lib/mmgen/templates/metamodel_generator.tpl +171 -0
- data/lib/rgen/ecore/ecore.rb +190 -0
- data/lib/rgen/ecore/ecore_instantiator.rb +25 -0
- data/lib/rgen/ecore/ecore_transformer.rb +85 -0
- data/lib/rgen/environment.rb +9 -24
- data/lib/rgen/find_helper.rb +68 -0
- data/lib/rgen/{instantiator.rb → instantiator/abstract_instantiator.rb} +6 -2
- data/lib/rgen/instantiator/abstract_xml_instantiator.rb +59 -0
- data/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
- data/lib/rgen/instantiator/ecore_xml_instantiator.rb +144 -0
- data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +157 -0
- data/lib/rgen/instantiator/xmi11_instantiator.rb +164 -0
- data/lib/rgen/metamodel_builder.rb +103 -9
- data/lib/rgen/metamodel_builder/build_helper.rb +26 -4
- data/lib/rgen/metamodel_builder/builder_extensions.rb +285 -88
- data/lib/rgen/metamodel_builder/builder_runtime.rb +7 -1
- data/lib/rgen/metamodel_builder/data_types.rb +67 -0
- data/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
- data/lib/rgen/metamodel_builder/metamodel_description.rb +232 -0
- data/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
- data/lib/rgen/metamodel_builder/module_extension.rb +33 -0
- data/lib/rgen/model_comparator.rb +56 -0
- data/lib/rgen/model_dumper.rb +5 -5
- data/lib/rgen/name_helper.rb +17 -1
- data/lib/rgen/template_language.rb +148 -28
- data/lib/rgen/template_language/directory_template_container.rb +56 -38
- data/lib/rgen/template_language/output_handler.rb +93 -77
- data/lib/rgen/template_language/template_container.rb +186 -143
- data/lib/rgen/transformer.rb +19 -14
- data/lib/transformers/uml13_to_ecore.rb +75 -0
- data/redist/xmlscan/ChangeLog +1301 -0
- data/redist/xmlscan/README +34 -0
- data/redist/xmlscan/THANKS +11 -0
- data/redist/xmlscan/doc/changes.html +74 -0
- data/redist/xmlscan/doc/changes.rd +80 -0
- data/redist/xmlscan/doc/en/conformance.html +136 -0
- data/redist/xmlscan/doc/en/conformance.rd +152 -0
- data/redist/xmlscan/doc/en/manual.html +356 -0
- data/redist/xmlscan/doc/en/manual.rd +402 -0
- data/redist/xmlscan/doc/ja/conformance.ja.html +118 -0
- data/redist/xmlscan/doc/ja/conformance.ja.rd +134 -0
- data/redist/xmlscan/doc/ja/manual.ja.html +325 -0
- data/redist/xmlscan/doc/ja/manual.ja.rd +370 -0
- data/redist/xmlscan/doc/src/Makefile +41 -0
- data/redist/xmlscan/doc/src/conformance.rd.src +256 -0
- data/redist/xmlscan/doc/src/langsplit.rb +110 -0
- data/redist/xmlscan/doc/src/manual.rd.src +614 -0
- data/redist/xmlscan/install.rb +41 -0
- data/redist/xmlscan/lib/xmlscan/encoding.rb +311 -0
- data/redist/xmlscan/lib/xmlscan/htmlscan.rb +289 -0
- data/redist/xmlscan/lib/xmlscan/namespace.rb +352 -0
- data/redist/xmlscan/lib/xmlscan/parser.rb +299 -0
- data/redist/xmlscan/lib/xmlscan/scanner.rb +1109 -0
- data/redist/xmlscan/lib/xmlscan/version.rb +22 -0
- data/redist/xmlscan/lib/xmlscan/visitor.rb +158 -0
- data/redist/xmlscan/lib/xmlscan/xmlchar.rb +441 -0
- data/redist/xmlscan/memo/CONFORMANCE +1249 -0
- data/redist/xmlscan/memo/PRODUCTIONS +195 -0
- data/redist/xmlscan/memo/contentspec.ry +335 -0
- data/redist/xmlscan/samples/chibixml.rb +105 -0
- data/redist/xmlscan/samples/getxmlchar.rb +122 -0
- data/redist/xmlscan/samples/rexml.rb +159 -0
- data/redist/xmlscan/samples/xmlbench.rb +88 -0
- data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +29 -0
- data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +62 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +62 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +99 -0
- data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +116 -0
- data/redist/xmlscan/samples/xmlconftest.rb +200 -0
- data/redist/xmlscan/test.rb +7 -0
- data/redist/xmlscan/tests/deftestcase.rb +73 -0
- data/redist/xmlscan/tests/runtest.rb +47 -0
- data/redist/xmlscan/tests/testall.rb +14 -0
- data/redist/xmlscan/tests/testencoding.rb +438 -0
- data/redist/xmlscan/tests/testhtmlscan.rb +752 -0
- data/redist/xmlscan/tests/testnamespace.rb +457 -0
- data/redist/xmlscan/tests/testparser.rb +591 -0
- data/redist/xmlscan/tests/testscanner.rb +1749 -0
- data/redist/xmlscan/tests/testxmlchar.rb +143 -0
- data/redist/xmlscan/tests/visitor.rb +34 -0
- data/test/array_extensions_test.rb +2 -2
- data/test/ea_instantiator_test.rb +41 -0
- data/test/ecore_self_test.rb +53 -0
- data/test/environment_test.rb +11 -6
- data/test/metamodel_builder_test.rb +404 -245
- data/test/metamodel_roundtrip_test.rb +52 -0
- data/test/metamodel_roundtrip_test/TestModel.rb +65 -0
- data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +64 -0
- data/test/metamodel_roundtrip_test/houseMetamodel.ecore +32 -0
- data/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +39 -0
- data/test/rgen_test.rb +3 -3
- data/test/template_language_test.rb +65 -39
- data/test/template_language_test/expected_result.txt +24 -3
- data/test/template_language_test/templates/code/array.tpl +11 -0
- data/test/template_language_test/templates/content/author.tpl +7 -0
- data/test/template_language_test/templates/content/chapter.tpl +1 -1
- data/test/template_language_test/templates/root.tpl +17 -8
- data/test/template_language_test/testout.txt +24 -3
- data/test/testmodel/class_model_checker.rb +119 -0
- data/test/{xmi_instantiator_test/testmodel.eap → testmodel/ea_testmodel.eap} +0 -0
- data/test/{xmi_instantiator_test/testmodel.xml → testmodel/ea_testmodel.xml} +81 -14
- data/test/testmodel/ea_testmodel_partial.xml +317 -0
- data/test/testmodel/ecore_model_checker.rb +101 -0
- data/test/testmodel/manual_testmodel.xml +22 -0
- data/test/testmodel/object_model_checker.rb +67 -0
- data/test/transformer_test.rb +18 -10
- data/test/xml_instantiator_test.rb +81 -8
- data/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
- data/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
- data/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
- data/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
- metadata +126 -28
- data/lib/ea/xmi_class_instantiator.rb +0 -46
- data/lib/ea/xmi_helper.rb +0 -26
- data/lib/ea/xmi_metamodel.rb +0 -34
- data/lib/ea/xmi_object_instantiator.rb +0 -46
- data/lib/ea/xmi_to_classmodel.rb +0 -78
- data/lib/ea/xmi_to_objectmodel.rb +0 -92
- data/lib/mmgen/mm_ext/uml_classmodel_ext.rb +0 -71
- data/lib/mmgen/templates/uml_classmodel.tpl +0 -63
- data/lib/rgen/xml_instantiator.rb +0 -132
- data/lib/uml/objectmodel_instantiator.rb +0 -53
- data/lib/uml/uml_classmodel.rb +0 -92
- data/lib/uml/uml_objectmodel.rb +0 -65
- data/test/metamodel_generator_test.rb +0 -44
- data/test/metamodel_generator_test/TestModel.rb +0 -40
- data/test/metamodel_generator_test/expected_result.txt +0 -40
- data/test/xmi_class_instantiator_test.rb +0 -24
- data/test/xmi_instantiator_test/class_model_checker.rb +0 -97
- data/test/xmi_object_instantiator_test.rb +0 -65
- data/test/xml_instantiator_test/testmodel.xml +0 -7
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
require 'rgen/ecore/ecore'
|
|
2
|
+
|
|
3
|
+
module Testmodel
|
|
4
|
+
|
|
5
|
+
# Checks the ECore model elements created by transformation from the
|
|
6
|
+
# UML Class model elements from the example model
|
|
7
|
+
#
|
|
8
|
+
module ECoreModelChecker
|
|
9
|
+
include RGen::ECore
|
|
10
|
+
|
|
11
|
+
def checkECoreModel(env)
|
|
12
|
+
|
|
13
|
+
# check main package
|
|
14
|
+
mainPackage = env.elements.select {|e| e.is_a? EPackage and e.name == "HouseMetamodel"}.first
|
|
15
|
+
assert_not_nil mainPackage
|
|
16
|
+
|
|
17
|
+
# check Rooms package
|
|
18
|
+
assert mainPackage.eSubpackages.is_a?(Array)
|
|
19
|
+
assert_equal 1, mainPackage.eSubpackages.size
|
|
20
|
+
assert mainPackage.eSubpackages[0].is_a?(EPackage)
|
|
21
|
+
roomsPackage = mainPackage.eSubpackages[0]
|
|
22
|
+
assert_equal "Rooms", roomsPackage.name
|
|
23
|
+
|
|
24
|
+
# check main package classes
|
|
25
|
+
assert mainPackage.eClassifiers.is_a?(Array)
|
|
26
|
+
assert_equal 4, mainPackage.eClassifiers.size
|
|
27
|
+
assert mainPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
|
|
28
|
+
houseClass = mainPackage.eClassifiers.select{|c| c.name == "House"}.first
|
|
29
|
+
personClass = mainPackage.eClassifiers.select{|c| c.name == "Person"}.first
|
|
30
|
+
meetingPlaceClass = mainPackage.eClassifiers.select{|c| c.name == "MeetingPlace"}.first
|
|
31
|
+
cookingPlaceInterface = mainPackage.eClassifiers.select{|c| c.name == "CookingPlace"}.first
|
|
32
|
+
assert_not_nil houseClass
|
|
33
|
+
assert_not_nil personClass
|
|
34
|
+
assert_not_nil meetingPlaceClass
|
|
35
|
+
assert_not_nil cookingPlaceInterface
|
|
36
|
+
|
|
37
|
+
# check Rooms package classes
|
|
38
|
+
assert roomsPackage.eClassifiers.is_a?(Array)
|
|
39
|
+
assert_equal 3, roomsPackage.eClassifiers.size
|
|
40
|
+
assert roomsPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
|
|
41
|
+
roomClass = roomsPackage.eClassifiers.select{|c| c.name == "Room"}.first
|
|
42
|
+
kitchenClass = roomsPackage.eClassifiers.select{|c| c.name == "Kitchen"}.first
|
|
43
|
+
bathroomClass = roomsPackage.eClassifiers.select{|c| c.name == "Bathroom"}.first
|
|
44
|
+
assert_not_nil roomClass
|
|
45
|
+
assert_not_nil kitchenClass
|
|
46
|
+
assert_not_nil bathroomClass
|
|
47
|
+
|
|
48
|
+
# check Room inheritance
|
|
49
|
+
assert kitchenClass.eSuperTypes.is_a?(Array)
|
|
50
|
+
assert_equal 3, kitchenClass.eSuperTypes.size
|
|
51
|
+
assert_equal roomClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "Room"}.first.object_id
|
|
52
|
+
assert_equal meetingPlaceClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "MeetingPlace"}.first.object_id
|
|
53
|
+
assert_equal cookingPlaceInterface.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "CookingPlace"}.first.object_id
|
|
54
|
+
assert bathroomClass.eSuperTypes.is_a?(Array)
|
|
55
|
+
assert_equal 1, bathroomClass.eSuperTypes.size
|
|
56
|
+
assert_equal roomClass.object_id, bathroomClass.eSuperTypes[0].object_id
|
|
57
|
+
|
|
58
|
+
# check House-Room "part of" association
|
|
59
|
+
assert houseClass.eAllContainments.eType.is_a?(Array)
|
|
60
|
+
assert_equal 1, houseClass.eAllContainments.eType.size
|
|
61
|
+
roomRef = houseClass.eAllContainments.first
|
|
62
|
+
assert_equal roomClass.object_id, roomRef.eType.object_id
|
|
63
|
+
assert_equal "room", roomRef.name
|
|
64
|
+
assert_equal 1, roomRef.lowerBound
|
|
65
|
+
assert_equal(-1, roomRef.upperBound)
|
|
66
|
+
assert_not_nil roomRef.eOpposite
|
|
67
|
+
assert_equal houseClass.object_id, roomRef.eOpposite.eType.object_id
|
|
68
|
+
|
|
69
|
+
partOfRefs = roomClass.eReferences.select{|r| r.eOpposite && r.eOpposite.containment}
|
|
70
|
+
assert_equal 1, partOfRefs.size
|
|
71
|
+
assert_equal houseClass.object_id, partOfRefs.first.eType.object_id
|
|
72
|
+
assert_equal "house", partOfRefs.first.name
|
|
73
|
+
assert_equal roomRef.object_id, partOfRefs.first.eOpposite.object_id
|
|
74
|
+
|
|
75
|
+
# check House OUT associations
|
|
76
|
+
assert houseClass.eReferences.is_a?(Array)
|
|
77
|
+
assert_equal 3, houseClass.eReferences.size
|
|
78
|
+
bathRef = houseClass.eReferences.find {|e| e.name == "bathroom"}
|
|
79
|
+
kitchenRef = houseClass.eReferences.find {|e| e.name == "kitchen"}
|
|
80
|
+
roomRef = houseClass.eReferences.find {|e| e.name == "room"}
|
|
81
|
+
assert_not_nil bathRef
|
|
82
|
+
assert_nil bathRef.eOpposite
|
|
83
|
+
assert_not_nil kitchenRef
|
|
84
|
+
assert_not_nil roomRef
|
|
85
|
+
assert_equal 1, kitchenRef.lowerBound
|
|
86
|
+
assert_equal 1, kitchenRef.upperBound
|
|
87
|
+
assert_equal 1, roomRef.lowerBound
|
|
88
|
+
assert_equal(-1, roomRef.upperBound)
|
|
89
|
+
|
|
90
|
+
# check House IN associations
|
|
91
|
+
houseInRefs = env.find(:class => EReference, :eType => houseClass)
|
|
92
|
+
assert_equal 3, houseInRefs.size
|
|
93
|
+
homeEnd = houseInRefs.find{|e| e.name == "home"}
|
|
94
|
+
assert_not_nil homeEnd
|
|
95
|
+
assert_equal 0, homeEnd.lowerBound
|
|
96
|
+
assert_equal(-1, homeEnd.upperBound)
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<TestModel xmlns:MNS="testmodel.org/myNamespace" >
|
|
2
|
+
<MNS:House>
|
|
3
|
+
before kitchen
|
|
4
|
+
<MNS:Room id="1" name="Kitchen" />
|
|
5
|
+
after kitchen
|
|
6
|
+
<MNS:Room id="2" name="TomsRoom">within toms room</MNS:Room>
|
|
7
|
+
after toms room
|
|
8
|
+
</MNS:House>
|
|
9
|
+
<Person name="Tom" room="2">
|
|
10
|
+
<Parents>
|
|
11
|
+
<Person name="Kate">
|
|
12
|
+
<Parents>
|
|
13
|
+
<Person name="Maria" />
|
|
14
|
+
<Person name="Will" />
|
|
15
|
+
</Parents>
|
|
16
|
+
</Person>
|
|
17
|
+
</Parents>
|
|
18
|
+
</Person>
|
|
19
|
+
<MULTI-PART-NAME>
|
|
20
|
+
<INSIDE_MULTI_PART/>
|
|
21
|
+
</MULTI-PART-NAME>
|
|
22
|
+
</TestModel>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'metamodels/uml13_metamodel'
|
|
2
|
+
require 'metamodels/uml13_metamodel_ext'
|
|
3
|
+
|
|
4
|
+
module Testmodel
|
|
5
|
+
|
|
6
|
+
# Checks the UML Object model elements from the example model
|
|
7
|
+
#
|
|
8
|
+
module ObjectModelChecker
|
|
9
|
+
|
|
10
|
+
# convenient extension for this test only
|
|
11
|
+
module UML13::ClassifierRole::ClassModule
|
|
12
|
+
def classname
|
|
13
|
+
taggedValue.find{|tv| tv.tag == "classname"}.value
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def checkObjectModel(envUML)
|
|
18
|
+
|
|
19
|
+
# check main package
|
|
20
|
+
mainPackage = envUML.find(:class => UML13::Package, :name => "HouseExampleModel").first
|
|
21
|
+
assert_not_nil mainPackage
|
|
22
|
+
|
|
23
|
+
eaRootCollaboration = mainPackage.ownedElement.find{|e| e.is_a?(UML13::Collaboration) && e.name == "Collaborations"}
|
|
24
|
+
assert_not_nil eaRootCollaboration
|
|
25
|
+
|
|
26
|
+
# check main package objects
|
|
27
|
+
objects = eaRootCollaboration.ownedElement.select{|e| e.is_a?(UML13::ClassifierRole)}
|
|
28
|
+
assert_equal 6, objects.size
|
|
29
|
+
|
|
30
|
+
someone = objects.find{|o| o.name == "Someone"}
|
|
31
|
+
assert_equal "Person", someone.classname
|
|
32
|
+
|
|
33
|
+
someonesHouse = objects.find{|o| o.name == "SomeonesHouse"}
|
|
34
|
+
assert_equal "House", someonesHouse.classname
|
|
35
|
+
|
|
36
|
+
greenRoom = objects.find{|o| o.name == "GreenRoom"}
|
|
37
|
+
assert_equal "Room", greenRoom.classname
|
|
38
|
+
|
|
39
|
+
yellowRoom = objects.find{|o| o.name == "YellowRoom"}
|
|
40
|
+
assert_equal "Room", yellowRoom.classname
|
|
41
|
+
|
|
42
|
+
hotRoom = objects.find{|o| o.name == "HotRoom"}
|
|
43
|
+
assert_equal "Kitchen", hotRoom.classname
|
|
44
|
+
|
|
45
|
+
wetRoom = objects.find{|o| o.name == "WetRoom"}
|
|
46
|
+
assert_equal "Bathroom", wetRoom.classname
|
|
47
|
+
|
|
48
|
+
# Someone to SomeonesHouse
|
|
49
|
+
assert someone.associationEnd.otherEnd.getType.is_a?(Array)
|
|
50
|
+
assert_equal 1, someone.associationEnd.otherEnd.getType.size
|
|
51
|
+
houseEnd = someone.associationEnd.otherEnd[0]
|
|
52
|
+
assert_equal someonesHouse.object_id, houseEnd.getType.object_id
|
|
53
|
+
assert_equal "home", houseEnd.name
|
|
54
|
+
|
|
55
|
+
# Someone to SomeonesHouse
|
|
56
|
+
assert someonesHouse.localCompositeEnd.otherEnd.is_a?(Array)
|
|
57
|
+
assert_equal 4, someonesHouse.localCompositeEnd.otherEnd.size
|
|
58
|
+
assert someonesHouse.localCompositeEnd.otherEnd.all?{|e| e.name == "room"}
|
|
59
|
+
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == yellowRoom}
|
|
60
|
+
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == greenRoom}
|
|
61
|
+
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == hotRoom}
|
|
62
|
+
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == wetRoom}
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
data/test/transformer_test.rb
CHANGED
|
@@ -4,9 +4,10 @@ $:.unshift File.join(File.dirname(__FILE__),"..","test")
|
|
|
4
4
|
require 'test/unit'
|
|
5
5
|
require 'rgen/transformer'
|
|
6
6
|
require 'rgen/environment'
|
|
7
|
-
require '
|
|
8
|
-
require '
|
|
9
|
-
require '
|
|
7
|
+
require 'rgen/model_comparator'
|
|
8
|
+
require 'metamodels/uml13_metamodel'
|
|
9
|
+
require 'instantiators/ea_instantiator'
|
|
10
|
+
require 'testmodel/class_model_checker'
|
|
10
11
|
|
|
11
12
|
class TransformerTest < Test::Unit::TestCase
|
|
12
13
|
|
|
@@ -179,25 +180,32 @@ class TransformerTest < Test::Unit::TestCase
|
|
|
179
180
|
end
|
|
180
181
|
|
|
181
182
|
class CopyTransformer < RGen::Transformer
|
|
182
|
-
include
|
|
183
|
+
include UML13
|
|
183
184
|
def transform
|
|
184
|
-
trans(:class =>
|
|
185
|
+
trans(:class => UML13::Package)
|
|
185
186
|
end
|
|
186
|
-
|
|
187
|
+
UML13.ecore.eClassifiers.each do |c|
|
|
188
|
+
copy c.instanceClass
|
|
189
|
+
end
|
|
187
190
|
end
|
|
188
191
|
|
|
189
|
-
MODEL_DIR = File.join(File.dirname(__FILE__),"
|
|
192
|
+
MODEL_DIR = File.join(File.dirname(__FILE__),"testmodel")
|
|
190
193
|
|
|
191
|
-
include ClassModelChecker
|
|
194
|
+
include Testmodel::ClassModelChecker
|
|
195
|
+
include RGen::ModelComparator
|
|
192
196
|
|
|
193
197
|
def test_copyTransformer
|
|
194
198
|
envIn = RGen::Environment.new
|
|
195
199
|
envOut = RGen::Environment.new
|
|
196
|
-
File.open(MODEL_DIR+"/
|
|
197
|
-
|
|
200
|
+
File.open(MODEL_DIR+"/ea_testmodel.xml") { |f|
|
|
201
|
+
inst = EAInstantiator.new(envIn, EAInstantiator::ERROR)
|
|
202
|
+
inst.instantiate(f.read)
|
|
198
203
|
}
|
|
199
204
|
CopyTransformer.new(envIn, envOut).transform
|
|
200
205
|
checkClassModel(envOut)
|
|
206
|
+
assert modelEqual?(
|
|
207
|
+
envIn.find(:class => UML13::Model).first,
|
|
208
|
+
envOut.find(:class => UML13::Model).first)
|
|
201
209
|
end
|
|
202
210
|
|
|
203
211
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
|
2
2
|
|
|
3
3
|
require 'test/unit'
|
|
4
|
-
require 'rgen/
|
|
4
|
+
require 'rgen/instantiator/default_xml_instantiator'
|
|
5
5
|
require 'rgen/environment'
|
|
6
6
|
require 'rgen/model_dumper'
|
|
7
|
+
require 'xml_instantiator_test/simple_xmi_ecore_instantiator'
|
|
8
|
+
require 'xml_instantiator_test/simple_ecore_model_checker'
|
|
7
9
|
|
|
8
10
|
module EmptyMM
|
|
9
11
|
end
|
|
@@ -18,14 +20,18 @@ end
|
|
|
18
20
|
|
|
19
21
|
class XMLInstantiatorTest < Test::Unit::TestCase
|
|
20
22
|
|
|
21
|
-
XML_DIR = File.join(File.dirname(__FILE__),"
|
|
23
|
+
XML_DIR = File.join(File.dirname(__FILE__),"testmodel")
|
|
22
24
|
|
|
23
25
|
include RGen::ModelDumper
|
|
24
26
|
|
|
25
|
-
class MyInstantiator < RGen::
|
|
27
|
+
class MyInstantiator < RGen::Instantiator::DefaultXMLInstantiator
|
|
26
28
|
|
|
27
29
|
map_tag_ns "testmodel.org/myNamespace", DefaultMM::MNS
|
|
28
30
|
|
|
31
|
+
def class_name(str)
|
|
32
|
+
camelize(str)
|
|
33
|
+
end
|
|
34
|
+
|
|
29
35
|
# resolve :type do
|
|
30
36
|
# @env.find(:xmi_id => getType).first
|
|
31
37
|
# end
|
|
@@ -34,10 +40,60 @@ class XMLInstantiatorTest < Test::Unit::TestCase
|
|
|
34
40
|
|
|
35
41
|
end
|
|
36
42
|
|
|
43
|
+
class PruneTestInstantiator < RGen::Instantiator::NodebasedXMLInstantiator
|
|
44
|
+
attr_reader :max_depth
|
|
45
|
+
|
|
46
|
+
set_prune_level 2
|
|
47
|
+
|
|
48
|
+
def initialize(env)
|
|
49
|
+
super(env)
|
|
50
|
+
@max_depth = 0
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def on_descent(node)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def on_ascent(node)
|
|
57
|
+
calc_max_depth(node, 0)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def calc_max_depth(node, offset)
|
|
61
|
+
if node.children.nil? || node.children.size == 0
|
|
62
|
+
@max_depth = offset if offset > @max_depth
|
|
63
|
+
else
|
|
64
|
+
node.children.each do |c|
|
|
65
|
+
calc_max_depth(c, offset+1)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
module PruneTestMM
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_pruning
|
|
75
|
+
env = RGen::Environment.new
|
|
76
|
+
|
|
77
|
+
# prune level 2 is set in the class body
|
|
78
|
+
inst = PruneTestInstantiator.new(env)
|
|
79
|
+
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
|
|
80
|
+
assert_equal 2, inst.max_depth
|
|
81
|
+
|
|
82
|
+
PruneTestInstantiator.set_prune_level(0)
|
|
83
|
+
inst = PruneTestInstantiator.new(env)
|
|
84
|
+
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
|
|
85
|
+
assert_equal 5, inst.max_depth
|
|
86
|
+
|
|
87
|
+
PruneTestInstantiator.set_prune_level(1)
|
|
88
|
+
inst = PruneTestInstantiator.new(env)
|
|
89
|
+
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
|
|
90
|
+
assert_equal 1, inst.max_depth
|
|
91
|
+
end
|
|
92
|
+
|
|
37
93
|
def test_custom
|
|
38
94
|
env = RGen::Environment.new
|
|
39
95
|
inst = MyInstantiator.new(env, DefaultMM, true)
|
|
40
|
-
inst.instantiate_file(File.join(XML_DIR,"
|
|
96
|
+
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
|
|
41
97
|
|
|
42
98
|
house = env.find(:class => DefaultMM::MNS::House).first
|
|
43
99
|
assert_not_nil house
|
|
@@ -51,21 +107,27 @@ class XMLInstantiatorTest < Test::Unit::TestCase
|
|
|
51
107
|
assert_not_nil tomsRoom
|
|
52
108
|
|
|
53
109
|
persons = env.find(:class => DefaultMM::Person)
|
|
54
|
-
assert_equal
|
|
110
|
+
assert_equal 4, persons.size
|
|
55
111
|
tom = persons.select{|p| p.name == "Tom"}.first
|
|
56
112
|
assert_not_nil tom
|
|
57
113
|
|
|
58
114
|
assert tom.personalRoom == tomsRoom
|
|
115
|
+
|
|
116
|
+
mpns = env.find(:class => DefaultMM::MultiPartName)
|
|
117
|
+
assert mpns.first.respond_to?("insideMultiPart")
|
|
59
118
|
end
|
|
60
119
|
|
|
61
120
|
def test_default
|
|
62
121
|
env = RGen::Environment.new
|
|
63
|
-
inst = RGen::
|
|
64
|
-
inst.instantiate_file(File.join(XML_DIR,"
|
|
122
|
+
inst = RGen::Instantiator::DefaultXMLInstantiator.new(env, EmptyMM, true)
|
|
123
|
+
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
|
|
65
124
|
|
|
66
125
|
house = env.find(:class => EmptyMM::MNS_House).first
|
|
67
126
|
assert_not_nil house
|
|
68
127
|
assert_equal 2, house.mNS_Room.size
|
|
128
|
+
assert_equal "before kitchen", house.chardata[0].strip
|
|
129
|
+
assert_equal "after kitchen", house.chardata[1].strip
|
|
130
|
+
assert_equal "after toms room", house.chardata[2].strip
|
|
69
131
|
|
|
70
132
|
rooms = env.find(:class => EmptyMM::MNS_Room)
|
|
71
133
|
assert_equal 2, rooms.size
|
|
@@ -73,11 +135,22 @@ class XMLInstantiatorTest < Test::Unit::TestCase
|
|
|
73
135
|
rooms.each {|r| assert r.parent == house}
|
|
74
136
|
tomsRoom = rooms.select{|r| r.name == "TomsRoom"}.first
|
|
75
137
|
assert_not_nil tomsRoom
|
|
138
|
+
assert_equal "within toms room", tomsRoom.chardata[0]
|
|
76
139
|
|
|
77
140
|
persons = env.find(:class => EmptyMM::Person)
|
|
78
|
-
assert_equal
|
|
141
|
+
assert_equal 4, persons.size
|
|
79
142
|
tom = persons.select{|p| p.name == "Tom"}.first
|
|
80
143
|
assert_not_nil tom
|
|
81
144
|
end
|
|
145
|
+
|
|
146
|
+
include SimpleECoreModelChecker
|
|
82
147
|
|
|
148
|
+
def test_simle_xmi_ecore_instantiator
|
|
149
|
+
envECore = RGen::Environment.new
|
|
150
|
+
File.open(XML_DIR+"/ea_testmodel.xml") { |f|
|
|
151
|
+
SimpleXMIECoreInstantiator.new.instantiateECoreModel(envECore, f.read)
|
|
152
|
+
}
|
|
153
|
+
checkECoreModel(envECore)
|
|
154
|
+
end
|
|
155
|
+
|
|
83
156
|
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'rgen/ecore/ecore'
|
|
2
|
+
|
|
3
|
+
# This "light" version of the ECore model checker is used to check the
|
|
4
|
+
# model produced by the XMLInstantiatorTest only.
|
|
5
|
+
#
|
|
6
|
+
module SimpleECoreModelChecker
|
|
7
|
+
include RGen::ECore
|
|
8
|
+
|
|
9
|
+
def checkECoreModel(env)
|
|
10
|
+
|
|
11
|
+
# check main package
|
|
12
|
+
mainPackage = env.elements.select {|e| e.is_a? EPackage and e.name == "HouseMetamodel"}.first
|
|
13
|
+
assert_not_nil mainPackage
|
|
14
|
+
|
|
15
|
+
# check Rooms package
|
|
16
|
+
assert mainPackage.eSubpackages.is_a?(Array)
|
|
17
|
+
assert_equal 1, mainPackage.eSubpackages.size
|
|
18
|
+
assert mainPackage.eSubpackages[0].is_a?(EPackage)
|
|
19
|
+
roomsPackage = mainPackage.eSubpackages[0]
|
|
20
|
+
assert_equal "Rooms", roomsPackage.name
|
|
21
|
+
|
|
22
|
+
# check main package classes
|
|
23
|
+
assert mainPackage.eClassifiers.is_a?(Array)
|
|
24
|
+
assert_equal 3, mainPackage.eClassifiers.size
|
|
25
|
+
assert mainPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
|
|
26
|
+
houseClass = mainPackage.eClassifiers.select{|c| c.name == "House"}.first
|
|
27
|
+
personClass = mainPackage.eClassifiers.select{|c| c.name == "Person"}.first
|
|
28
|
+
meetingPlaceClass = mainPackage.eClassifiers.select{|c| c.name == "MeetingPlace"}.first
|
|
29
|
+
assert_not_nil houseClass
|
|
30
|
+
assert_not_nil personClass
|
|
31
|
+
assert_not_nil meetingPlaceClass
|
|
32
|
+
|
|
33
|
+
# check Rooms package classes
|
|
34
|
+
assert roomsPackage.eClassifiers.is_a?(Array)
|
|
35
|
+
assert_equal 3, roomsPackage.eClassifiers.size
|
|
36
|
+
assert roomsPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
|
|
37
|
+
roomClass = roomsPackage.eClassifiers.select{|c| c.name == "Room"}.first
|
|
38
|
+
kitchenClass = roomsPackage.eClassifiers.select{|c| c.name == "Kitchen"}.first
|
|
39
|
+
bathroomClass = roomsPackage.eClassifiers.select{|c| c.name == "Bathroom"}.first
|
|
40
|
+
assert_not_nil roomClass
|
|
41
|
+
assert_not_nil kitchenClass
|
|
42
|
+
assert_not_nil bathroomClass
|
|
43
|
+
|
|
44
|
+
# check Room inheritance
|
|
45
|
+
assert kitchenClass.eSuperTypes.is_a?(Array)
|
|
46
|
+
assert_equal 2, kitchenClass.eSuperTypes.size
|
|
47
|
+
assert_equal roomClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "Room"}.first.object_id
|
|
48
|
+
assert_equal meetingPlaceClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "MeetingPlace"}.first.object_id
|
|
49
|
+
assert bathroomClass.eSuperTypes.is_a?(Array)
|
|
50
|
+
assert_equal 1, bathroomClass.eSuperTypes.size
|
|
51
|
+
assert_equal roomClass.object_id, bathroomClass.eSuperTypes[0].object_id
|
|
52
|
+
|
|
53
|
+
# check House-Room "part of" association
|
|
54
|
+
assert houseClass.eAllContainments.eType.is_a?(Array)
|
|
55
|
+
assert_equal 1, houseClass.eAllContainments.eType.size
|
|
56
|
+
roomRef = houseClass.eAllContainments.first
|
|
57
|
+
assert_equal roomClass.object_id, roomRef.eType.object_id
|
|
58
|
+
assert_equal "room", roomRef.name
|
|
59
|
+
assert_equal 1, roomRef.lowerBound
|
|
60
|
+
assert_equal(-1, roomRef.upperBound)
|
|
61
|
+
assert_not_nil roomRef.eOpposite
|
|
62
|
+
assert_equal houseClass.object_id, roomRef.eOpposite.eType.object_id
|
|
63
|
+
|
|
64
|
+
partOfRefs = roomClass.eReferences.select{|r| r.eOpposite && r.eOpposite.containment}
|
|
65
|
+
assert_equal 1, partOfRefs.size
|
|
66
|
+
assert_equal houseClass.object_id, partOfRefs.first.eType.object_id
|
|
67
|
+
assert_equal "house", partOfRefs.first.name
|
|
68
|
+
assert_equal roomRef.object_id, partOfRefs.first.eOpposite.object_id
|
|
69
|
+
|
|
70
|
+
# check House OUT associations
|
|
71
|
+
assert houseClass.eReferences.is_a?(Array)
|
|
72
|
+
assert_equal 3, houseClass.eReferences.size
|
|
73
|
+
bathRef = houseClass.eReferences.find {|e| e.name == "bathroom"}
|
|
74
|
+
kitchenRef = houseClass.eReferences.find {|e| e.name == "kitchen"}
|
|
75
|
+
roomRef = houseClass.eReferences.find {|e| e.name == "room"}
|
|
76
|
+
assert_not_nil bathRef
|
|
77
|
+
assert_nil bathRef.eOpposite
|
|
78
|
+
assert_not_nil kitchenRef
|
|
79
|
+
assert_not_nil roomRef
|
|
80
|
+
assert_equal 1, kitchenRef.lowerBound
|
|
81
|
+
assert_equal 1, kitchenRef.upperBound
|
|
82
|
+
assert_equal 1, roomRef.lowerBound
|
|
83
|
+
assert_equal(-1, roomRef.upperBound)
|
|
84
|
+
|
|
85
|
+
# check House IN associations
|
|
86
|
+
houseInRefs = env.find(:class => EReference, :eType => houseClass)
|
|
87
|
+
assert_equal 3, houseInRefs.size
|
|
88
|
+
homeEnd = houseInRefs.find{|e| e.name == "home"}
|
|
89
|
+
assert_not_nil homeEnd
|
|
90
|
+
assert_equal 0, homeEnd.lowerBound
|
|
91
|
+
assert_equal(-1, homeEnd.upperBound)
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|