rgen 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +28 -0
- data/Rakefile +3 -4
- data/lib/ea_support/uml13_ea_metamodel.rb +3 -3
- data/lib/ea_support/uml13_ea_to_uml13.rb +33 -2
- data/lib/ea_support/uml13_to_uml13_ea.rb +7 -0
- data/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +4 -4
- data/lib/mmgen/templates/metamodel_generator.tpl +143 -143
- data/lib/rgen/ecore/ecore.rb +11 -1
- data/lib/rgen/ecore/ecore_interface.rb +47 -0
- data/lib/rgen/ecore/ecore_to_ruby.rb +166 -0
- data/lib/rgen/ecore/{ecore_transformer.rb → ruby_to_ecore.rb} +11 -11
- data/lib/rgen/environment.rb +15 -2
- data/lib/rgen/fragment/dump_file_cache.rb +63 -0
- data/lib/rgen/fragment/fragmented_model.rb +139 -0
- data/lib/rgen/fragment/model_fragment.rb +268 -0
- data/lib/rgen/instantiator/abstract_xml_instantiator.rb +44 -72
- data/lib/rgen/instantiator/default_xml_instantiator.rb +2 -2
- data/lib/rgen/instantiator/ecore_xml_instantiator.rb +16 -1
- data/lib/rgen/instantiator/json_instantiator.rb +16 -2
- data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +118 -138
- data/lib/rgen/instantiator/qualified_name_resolver.rb +5 -1
- data/lib/rgen/instantiator/reference_resolver.rb +126 -24
- data/lib/rgen/instantiator/xmi11_instantiator.rb +6 -2
- data/lib/rgen/metamodel_builder.rb +18 -6
- data/lib/rgen/metamodel_builder/builder_extensions.rb +431 -407
- data/lib/rgen/metamodel_builder/builder_runtime.rb +8 -8
- data/lib/rgen/metamodel_builder/constant_order_helper.rb +4 -4
- data/lib/rgen/metamodel_builder/data_types.rb +5 -1
- data/lib/rgen/metamodel_builder/intermediate/feature.rb +167 -0
- data/lib/rgen/metamodel_builder/module_extension.rb +2 -2
- data/lib/rgen/model_builder.rb +10 -5
- data/lib/rgen/model_builder/builder_context.rb +17 -1
- data/lib/rgen/serializer/opposite_reference_filter.rb +18 -0
- data/lib/rgen/serializer/qualified_name_provider.rb +45 -0
- data/lib/rgen/template_language/template_container.rb +3 -1
- data/lib/rgen/{auto_class_creator.rb → util/auto_class_creator.rb} +6 -1
- data/lib/rgen/util/cached_glob.rb +67 -0
- data/lib/rgen/util/file_cache_map.rb +104 -0
- data/lib/rgen/util/file_change_detector.rb +78 -0
- data/lib/rgen/{method_delegation.rb → util/method_delegation.rb} +18 -3
- data/lib/rgen/{model_comparator.rb → util/model_comparator.rb} +17 -5
- data/lib/rgen/{model_comparator_base.rb → util/model_comparator_base.rb} +6 -1
- data/lib/rgen/{model_dumper.rb → util/model_dumper.rb} +6 -1
- data/lib/rgen/{name_helper.rb → util/name_helper.rb} +6 -1
- data/lib/rgen/util/pattern_matcher.rb +329 -0
- data/lib/transformers/uml13_to_ecore.rb +103 -60
- data/test/ecore_self_test.rb +43 -42
- data/test/json_test.rb +15 -0
- data/test/metamodel_builder_test.rb +361 -206
- data/test/metamodel_from_ecore_test.rb +45 -0
- data/test/metamodel_order_test.rb +10 -4
- data/test/metamodel_roundtrip_test.rb +2 -2
- data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +1 -1
- data/test/metamodel_roundtrip_test/houseMetamodel_Regenerated.ecore +50 -50
- data/test/method_delegation_test.rb +9 -9
- data/test/model_builder/ecore_internal.rb +19 -9
- data/test/model_builder/serializer_test.rb +1 -1
- data/test/reference_resolver_test.rb +79 -12
- data/test/rgen_test.rb +2 -0
- data/test/template_language_test.rb +7 -0
- data/test/template_language_test/templates/callback_indent_test/a.tpl +12 -0
- data/test/template_language_test/templates/callback_indent_test/b.tpl +5 -0
- data/test/testmodel/ea_testmodel_regenerated.xml +588 -583
- data/test/transformer_test.rb +3 -3
- data/test/util/file_cache_map_test.rb +91 -0
- data/test/util/file_cache_map_test/testdir/fileA +1 -0
- data/test/util_test.rb +4 -0
- data/test/xml_instantiator_test.rb +139 -135
- metadata +49 -104
- data/lib/rgen/ecore/ecore_instantiator.rb +0 -31
- data/lib/rgen/metamodel_builder/metamodel_description.rb +0 -232
- data/redist/xmlscan/ChangeLog +0 -1301
- data/redist/xmlscan/README +0 -34
- data/redist/xmlscan/THANKS +0 -11
- data/redist/xmlscan/doc/changes.html +0 -74
- data/redist/xmlscan/doc/changes.rd +0 -80
- data/redist/xmlscan/doc/en/conformance.html +0 -136
- data/redist/xmlscan/doc/en/conformance.rd +0 -152
- data/redist/xmlscan/doc/en/manual.html +0 -356
- data/redist/xmlscan/doc/en/manual.rd +0 -402
- data/redist/xmlscan/doc/ja/conformance.ja.html +0 -118
- data/redist/xmlscan/doc/ja/conformance.ja.rd +0 -134
- data/redist/xmlscan/doc/ja/manual.ja.html +0 -325
- data/redist/xmlscan/doc/ja/manual.ja.rd +0 -370
- data/redist/xmlscan/doc/src/Makefile +0 -41
- data/redist/xmlscan/doc/src/conformance.rd.src +0 -256
- data/redist/xmlscan/doc/src/langsplit.rb +0 -110
- data/redist/xmlscan/doc/src/manual.rd.src +0 -614
- data/redist/xmlscan/install.rb +0 -41
- data/redist/xmlscan/lib/xmlscan/encoding.rb +0 -311
- data/redist/xmlscan/lib/xmlscan/htmlscan.rb +0 -289
- data/redist/xmlscan/lib/xmlscan/namespace.rb +0 -352
- data/redist/xmlscan/lib/xmlscan/parser.rb +0 -299
- data/redist/xmlscan/lib/xmlscan/scanner.rb +0 -1109
- data/redist/xmlscan/lib/xmlscan/version.rb +0 -22
- data/redist/xmlscan/lib/xmlscan/visitor.rb +0 -158
- data/redist/xmlscan/lib/xmlscan/xmlchar.rb +0 -441
- data/redist/xmlscan/memo/CONFORMANCE +0 -1249
- data/redist/xmlscan/memo/PRODUCTIONS +0 -195
- data/redist/xmlscan/memo/contentspec.ry +0 -335
- data/redist/xmlscan/samples/chibixml.rb +0 -105
- data/redist/xmlscan/samples/getxmlchar.rb +0 -122
- data/redist/xmlscan/samples/rexml.rb +0 -159
- data/redist/xmlscan/samples/xmlbench.rb +0 -88
- data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +0 -29
- data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +0 -62
- data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +0 -62
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +0 -99
- data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +0 -116
- data/redist/xmlscan/samples/xmlconftest.rb +0 -200
- data/redist/xmlscan/test.rb +0 -7
- data/redist/xmlscan/tests/deftestcase.rb +0 -73
- data/redist/xmlscan/tests/runtest.rb +0 -47
- data/redist/xmlscan/tests/testall.rb +0 -14
- data/redist/xmlscan/tests/testencoding.rb +0 -438
- data/redist/xmlscan/tests/testhtmlscan.rb +0 -752
- data/redist/xmlscan/tests/testnamespace.rb +0 -457
- data/redist/xmlscan/tests/testparser.rb +0 -591
- data/redist/xmlscan/tests/testscanner.rb +0 -1749
- data/redist/xmlscan/tests/testxmlchar.rb +0 -143
- data/redist/xmlscan/tests/visitor.rb +0 -34
@@ -4,71 +4,114 @@ require 'rgen/ecore/ecore'
|
|
4
4
|
require 'rgen/array_extensions'
|
5
5
|
|
6
6
|
class UML13ToECore < RGen::Transformer
|
7
|
-
|
7
|
+
include RGen::ECore
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# Options:
|
10
|
+
#
|
11
|
+
# :reference_filter:
|
12
|
+
# a proc which receives an AssociationEnd or a Dependency and should return
|
13
|
+
# true or false, depending on if a referece should be created for it or not
|
14
|
+
#
|
15
|
+
def initialize(*args)
|
16
|
+
options = {}
|
17
|
+
if args.last.is_a?(Hash)
|
18
|
+
options = args.pop
|
19
|
+
end
|
20
|
+
@reference_filter = options[:reference_filter] || proc do |e|
|
21
|
+
if e.is_a?(UML13::AssociationEnd)
|
22
|
+
otherEnd = e.association.connection.find{|ae| ae != e}
|
23
|
+
otherEnd.name && otherEnd.name.size > 0
|
24
|
+
else
|
25
|
+
false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
super(*args)
|
29
|
+
end
|
12
30
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
def transform
|
32
|
+
trans(:class => UML13::Class)
|
33
|
+
end
|
34
|
+
|
35
|
+
transform UML13::Model, :to => EPackage do
|
36
|
+
trans(ownedClassOrPackage)
|
37
|
+
{ :name => name && name.strip }
|
38
|
+
end
|
39
|
+
|
40
|
+
transform UML13::Package, :to => EPackage do
|
41
|
+
trans(ownedClassOrPackage)
|
42
|
+
{ :name => name && name.strip,
|
43
|
+
:eSuperPackage => trans(namespace.is_a?(UML13::Package) ? namespace : nil) }
|
44
|
+
end
|
45
|
+
|
46
|
+
method :ownedClassOrPackage do
|
47
|
+
ownedElement.select{|e| e.is_a?(UML13::Package) || e.is_a?(UML13::Class)}
|
48
|
+
end
|
49
|
+
|
50
|
+
transform UML13::Class, :to => EClass do
|
51
|
+
{ :name => name && name.strip,
|
52
|
+
:abstract => isAbstract,
|
53
|
+
:ePackage => trans(namespace.is_a?(UML13::Package) ? namespace : nil),
|
54
|
+
:eStructuralFeatures => trans(feature.select{|f| f.is_a?(UML13::Attribute)} +
|
55
|
+
associationEnd + clientDependency),
|
56
|
+
:eOperations => trans(feature.select{|f| f.is_a?(UML13::Operation)}),
|
57
|
+
:eSuperTypes => trans(generalization.parent + clientDependency.select{|d| d.stereotype && d.stereotype.name == "implements"}.supplier),
|
34
58
|
:eAnnotations => createAnnotations(taggedValue) }
|
35
|
-
|
59
|
+
end
|
60
|
+
|
61
|
+
transform UML13::Interface, :to => EClass do
|
62
|
+
{ :name => name && name.strip,
|
63
|
+
:abstract => isAbstract,
|
64
|
+
:ePackage => trans(namespace.is_a?(UML13::Package) ? namespace : nil),
|
65
|
+
:eStructuralFeatures => trans(feature.select{|f| f.is_a?(UML13::Attribute)} + associationEnd),
|
66
|
+
:eOperations => trans(feature.select{|f| f.is_a?(UML13::Operation)}),
|
67
|
+
:eSuperTypes => trans(generalization.parent)}
|
68
|
+
end
|
36
69
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
70
|
+
transform UML13::Attribute, :to => EAttribute do
|
71
|
+
{ :name => name && name.strip, :eType => trans(getType),
|
72
|
+
:lowerBound => (multiplicity && multiplicity.range.first.lower &&
|
73
|
+
multiplicity.range.first.lower.to_i) || 0,
|
74
|
+
:upperBound => (multiplicity && multiplicity.range.first.upper &&
|
75
|
+
multiplicity.range.first.upper.gsub('*','-1').to_i) || 1,
|
76
|
+
:eAnnotations => createAnnotations(taggedValue) }
|
77
|
+
end
|
44
78
|
|
45
|
-
|
46
|
-
|
47
|
-
|
79
|
+
transform UML13::DataType, :to => EDataType do
|
80
|
+
{ :name => name && name.strip,
|
81
|
+
:ePackage => trans(namespace.is_a?(UML13::Package) ? namespace : nil),
|
48
82
|
:eAnnotations => createAnnotations(taggedValue) }
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
83
|
+
end
|
84
|
+
|
85
|
+
transform UML13::Operation, :to => EOperation do
|
86
|
+
{ :name => name && name.strip }
|
87
|
+
end
|
88
|
+
|
89
|
+
transform UML13::AssociationEnd, :to => EReference, :if => :isReference do
|
90
|
+
otherEnd = association.connection.find{|ae| ae != @current_object}
|
91
|
+
{ :eType => trans(otherEnd.type),
|
92
|
+
:name => otherEnd.name && otherEnd.name.strip,
|
93
|
+
:eOpposite => trans(otherEnd),
|
94
|
+
:lowerBound => (otherEnd.multiplicity && otherEnd.multiplicity.range.first.lower &&
|
61
95
|
otherEnd.multiplicity.range.first.lower.to_i) || 0,
|
62
|
-
|
96
|
+
:upperBound => (otherEnd.multiplicity && otherEnd.multiplicity.range.first.upper &&
|
63
97
|
otherEnd.multiplicity.range.first.upper.gsub('*','-1').to_i) || 1,
|
64
|
-
|
98
|
+
:containment => (aggregation == :composite),
|
65
99
|
:eAnnotations => createAnnotations(association.taggedValue) }
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
100
|
+
end
|
101
|
+
|
102
|
+
transform UML13::Dependency, :to => EReference, :if => :isReference do
|
103
|
+
{ :eType => trans(supplier.first),
|
104
|
+
:name => name,
|
105
|
+
:lowerBound => 0,
|
106
|
+
:upperBound => 1,
|
107
|
+
:containment => false,
|
108
|
+
:eAnnotations => createAnnotations(taggedValue)
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
method :isReference do
|
113
|
+
@reference_filter.call(@current_object)
|
114
|
+
end
|
72
115
|
|
73
116
|
def createAnnotations(taggedValues)
|
74
117
|
if taggedValues.size > 0
|
@@ -78,7 +121,7 @@ class UML13ToECore < RGen::Transformer
|
|
78
121
|
end
|
79
122
|
end
|
80
123
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
124
|
+
transform UML13::TaggedValue, :to => EStringToStringMapEntry do
|
125
|
+
{ :key => tag, :value => value}
|
126
|
+
end
|
127
|
+
end
|
data/test/ecore_self_test.rb
CHANGED
@@ -5,49 +5,50 @@ require 'rgen/ecore/ecore'
|
|
5
5
|
require 'rgen/array_extensions'
|
6
6
|
|
7
7
|
class ECoreSelfTest < Test::Unit::TestCase
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
include RGen::ECore
|
9
|
+
|
10
|
+
def test_simple
|
11
|
+
assert_equal \
|
12
|
+
%w(lowerBound ordered unique upperBound many required eType).sort,
|
13
|
+
ETypedElement.ecore.eStructuralFeatures.name.sort
|
14
|
+
|
15
|
+
assert_equal \
|
16
|
+
EClassifier.ecore,
|
17
|
+
ETypedElement.ecore.eStructuralFeatures.find{|f| f.name=="eType"}.eType
|
18
|
+
assert_equal %w(ENamedElement), ETypedElement.ecore.eSuperTypes.name
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
assert_equal \
|
21
|
+
EModelElement.ecore,
|
22
|
+
EModelElement.ecore.eStructuralFeatures.find{|f| f.name=="eAnnotations"}.eOpposite.eType
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
24
|
+
assert_equal \
|
25
|
+
%w(eType),
|
26
|
+
ETypedElement.ecore.eReferences.name
|
27
|
+
|
28
|
+
assert_equal \
|
29
|
+
%w(lowerBound ordered unique upperBound many required).sort,
|
30
|
+
ETypedElement.ecore.eAttributes.name.sort
|
31
|
+
|
32
|
+
assert RGen::ECore.ecore.is_a?(EPackage)
|
33
|
+
assert_equal "ECore", RGen::ECore.ecore.name
|
34
|
+
assert_equal "RGen", RGen::ECore.ecore.eSuperPackage.name
|
35
|
+
assert_equal %w(ECore), RGen.ecore.eSubpackages.name
|
36
|
+
assert_equal\
|
37
|
+
%w(EObject EModelElement EAnnotation ENamedElement ETypedElement
|
38
|
+
EStructuralFeature EAttribute EClassifier EDataType EEnum EEnumLiteral EFactory
|
39
|
+
EOperation EPackage EParameter EReference EStringToStringMapEntry EClass
|
40
|
+
ETypeArgument EGenericType).sort,
|
41
|
+
RGen::ECore.ecore.eClassifiers.name.sort
|
42
|
+
|
43
|
+
assert_equal "false", EAttribute.ecore.eAllAttributes.
|
44
|
+
find{|a|a.name == "derived"}.defaultValueLiteral
|
45
|
+
assert_equal false, EAttribute.ecore.eAllAttributes.
|
46
|
+
find{|a|a.name == "derived"}.defaultValue
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
assert_nil EAttribute.ecore.eAllAttributes.
|
49
|
+
find{|a|a.name == "defaultValueLiteral"}.defaultValueLiteral
|
50
|
+
assert_nil EAttribute.ecore.eAllAttributes.
|
51
|
+
find{|a|a.name == "defaultValueLiteral"}.defaultValue
|
51
52
|
|
52
|
-
|
53
|
-
end
|
53
|
+
end
|
54
|
+
end
|
data/test/json_test.rb
CHANGED
@@ -14,6 +14,7 @@ class JsonTest < Test::Unit::TestCase
|
|
14
14
|
has_attr 'text', String
|
15
15
|
has_attr 'integer', Integer
|
16
16
|
has_attr 'float', Float
|
17
|
+
has_one 'other', TestNode
|
17
18
|
contains_many 'childs', TestNode, 'parent'
|
18
19
|
end
|
19
20
|
end
|
@@ -152,5 +153,19 @@ class JsonTest < Test::Unit::TestCase
|
|
152
153
|
inst.instantiate(%q({ "_class": "Data2", "data2": "something" }))
|
153
154
|
end
|
154
155
|
end
|
156
|
+
|
157
|
+
def test_json_instantiator_references
|
158
|
+
env = RGen::Environment.new
|
159
|
+
inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM, :nameAttribute => "text")
|
160
|
+
inst.instantiate(%q([
|
161
|
+
{ "_class": "TestNode", "text": "A", "childs": [
|
162
|
+
{ "_class": "TestNode", "text": "B" } ]},
|
163
|
+
{ "_class": "TestNode", "text": "C", "other": "/A/B"}]
|
164
|
+
))
|
165
|
+
nodeA = env.find(:class => TestMM::TestNode, :text => "A").first
|
166
|
+
nodeC = env.find(:class => TestMM::TestNode, :text => "C").first
|
167
|
+
assert_equal 1, nodeA.childs.size
|
168
|
+
assert_equal nodeA.childs[0], nodeC.other
|
169
|
+
end
|
155
170
|
end
|
156
171
|
|
@@ -6,18 +6,150 @@ require 'rgen/array_extensions'
|
|
6
6
|
|
7
7
|
class MetamodelBuilderTest < Test::Unit::TestCase
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
module TestMetamodel
|
10
|
+
extend RGen::MetamodelBuilder::ModuleExtension
|
11
|
+
|
12
|
+
class SimpleClass < RGen::MetamodelBuilder::MMBase
|
13
|
+
KindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
|
14
|
+
has_attr 'name' # default is String
|
15
|
+
has_attr 'stringWithDefault', String, :defaultValueLiteral => "xtest"
|
16
|
+
has_attr 'integerWithDefault', Integer, :defaultValueLiteral => "123"
|
17
|
+
has_attr 'floatWithDefault', Float, :defaultValueLiteral => "0.123"
|
18
|
+
has_attr 'boolWithDefault', Boolean, :defaultValueLiteral => "true"
|
19
|
+
has_attr 'anything', Object
|
20
|
+
has_attr 'allowed', RGen::MetamodelBuilder::DataTypes::Boolean
|
21
|
+
has_attr 'kind', KindType
|
22
|
+
has_attr 'kindWithDefault', KindType, :defaultValueLiteral => "extended"
|
23
|
+
end
|
24
|
+
|
25
|
+
class ManyAttrClass < RGen::MetamodelBuilder::MMBase
|
26
|
+
has_many_attr 'literals', String
|
27
|
+
has_many_attr 'bools', Boolean
|
28
|
+
has_many_attr 'integers', Integer
|
29
|
+
has_many_attr 'enums', RGen::MetamodelBuilder::DataTypes::Enum.new([:a, :b, :c])
|
30
|
+
has_many_attr 'limitTest', Integer, :upperBound => 2
|
31
|
+
end
|
32
|
+
|
33
|
+
class ClassA < RGen::MetamodelBuilder::MMBase
|
34
|
+
# metamodel accessors must work independent of the ==() method
|
35
|
+
module ClassModule
|
36
|
+
def ==(o)
|
37
|
+
o.is_a?(ClassA)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class ClassB < RGen::MetamodelBuilder::MMBase
|
43
|
+
end
|
44
|
+
|
45
|
+
class ClassC < RGen::MetamodelBuilder::MMBase
|
46
|
+
end
|
47
|
+
|
48
|
+
class HasOneTestClass < RGen::MetamodelBuilder::MMBase
|
49
|
+
has_one 'classA', ClassA
|
50
|
+
has_one 'classB', ClassB
|
51
|
+
end
|
52
|
+
|
53
|
+
class HasManyTestClass < RGen::MetamodelBuilder::MMBase
|
54
|
+
has_many 'classA', ClassA
|
55
|
+
end
|
56
|
+
|
57
|
+
class OneClass < RGen::MetamodelBuilder::MMBase
|
58
|
+
end
|
59
|
+
class ManyClass < RGen::MetamodelBuilder::MMBase
|
60
|
+
end
|
61
|
+
OneClass.one_to_many 'manyClasses', ManyClass, 'oneClass', :upperBound => 5
|
62
|
+
|
63
|
+
class AClassMM < RGen::MetamodelBuilder::MMBase
|
64
|
+
end
|
65
|
+
class BClassMM < RGen::MetamodelBuilder::MMBase
|
66
|
+
end
|
67
|
+
AClassMM.many_to_many 'bClasses', BClassMM, 'aClasses'
|
68
|
+
|
69
|
+
module SomePackage
|
70
|
+
extend RGen::MetamodelBuilder::ModuleExtension
|
71
|
+
|
72
|
+
class ClassA < RGen::MetamodelBuilder::MMBase
|
73
|
+
end
|
74
|
+
|
75
|
+
module SubPackage
|
76
|
+
extend RGen::MetamodelBuilder::ModuleExtension
|
77
|
+
|
78
|
+
class ClassB < RGen::MetamodelBuilder::MMBase
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class OneClass2 < RGen::MetamodelBuilder::MMBase
|
84
|
+
end
|
85
|
+
class ManyClass2 < RGen::MetamodelBuilder::MMBase
|
86
|
+
end
|
87
|
+
ManyClass2.many_to_one 'oneClass', OneClass2, 'manyClasses'
|
88
|
+
|
89
|
+
class AClassOO < RGen::MetamodelBuilder::MMBase
|
90
|
+
end
|
91
|
+
class BClassOO < RGen::MetamodelBuilder::MMBase
|
92
|
+
end
|
93
|
+
AClassOO.one_to_one 'bClass', BClassOO, 'aClass'
|
94
|
+
|
95
|
+
class SomeSuperClass < RGen::MetamodelBuilder::MMBase
|
96
|
+
has_attr "name"
|
97
|
+
has_many "classAs", ClassA
|
98
|
+
end
|
99
|
+
|
100
|
+
class SomeSubClass < SomeSuperClass
|
101
|
+
has_attr "subname"
|
102
|
+
has_many "classBs", ClassB
|
103
|
+
end
|
104
|
+
|
105
|
+
class OtherSubClass < SomeSuperClass
|
106
|
+
has_attr "othersubname"
|
107
|
+
has_many "classCs", ClassC
|
108
|
+
end
|
109
|
+
|
110
|
+
class SubSubClass < RGen::MetamodelBuilder::MMMultiple(SomeSubClass, OtherSubClass)
|
111
|
+
has_attr "subsubname"
|
112
|
+
end
|
113
|
+
|
114
|
+
module AnnotatedModule
|
115
|
+
extend RGen::MetamodelBuilder::ModuleExtension
|
116
|
+
|
117
|
+
annotation "moduletag" => "modulevalue"
|
118
|
+
|
119
|
+
class AnnotatedClass < RGen::MetamodelBuilder::MMBase
|
120
|
+
annotation "sometag" => "somevalue", "othertag" => "othervalue"
|
121
|
+
annotation :source => "rgen/test", :details => {"thirdtag" => "thirdvalue"}
|
122
|
+
|
123
|
+
has_attr "boolAttr", Boolean do
|
124
|
+
annotation "attrtag" => "attrval"
|
125
|
+
annotation :source => "rgen/test2", :details => {"attrtag2" => "attrvalue2", "attrtag3" => "attrvalue3"}
|
126
|
+
end
|
127
|
+
|
128
|
+
has_many "others", AnnotatedClass do
|
129
|
+
annotation "reftag" => "refval"
|
130
|
+
annotation :source => "rgen/test3", :details => {"reftag2" => "refvalue2", "reftag3" => "refvalue3"}
|
131
|
+
end
|
132
|
+
|
133
|
+
many_to_many "m2m", AnnotatedClass, "m2mback" do
|
134
|
+
annotation "m2mtag" => "m2mval"
|
135
|
+
opposite_annotation "opposite_m2mtag" => "opposite_m2mval"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
class AbstractClass < RGen::MetamodelBuilder::MMBase
|
142
|
+
abstract
|
143
|
+
end
|
144
|
+
|
17
145
|
end
|
18
|
-
|
146
|
+
|
147
|
+
def mm
|
148
|
+
TestMetamodel
|
149
|
+
end
|
150
|
+
|
19
151
|
def test_has_attr
|
20
|
-
sc = SimpleClass.new
|
152
|
+
sc = mm::SimpleClass.new
|
21
153
|
|
22
154
|
assert_respond_to sc, :name
|
23
155
|
assert_respond_to sc, :name=
|
@@ -28,10 +160,13 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
28
160
|
assert_raise StandardError do
|
29
161
|
sc.name = 5
|
30
162
|
end
|
31
|
-
assert_equal "EString", SimpleClass.ecore.eAttributes.find{|a| a.name=="name"}.eType.name
|
163
|
+
assert_equal "EString", mm::SimpleClass.ecore.eAttributes.find{|a| a.name=="name"}.eType.name
|
32
164
|
|
33
165
|
assert_equal "xtest", sc.stringWithDefault
|
34
166
|
assert_equal :extended, sc.kindWithDefault
|
167
|
+
assert_equal 123, sc.integerWithDefault
|
168
|
+
assert_equal 0.123, sc.floatWithDefault
|
169
|
+
assert_equal true, sc.boolWithDefault
|
35
170
|
|
36
171
|
sc.anything = :asymbol
|
37
172
|
assert_equal :asymbol, sc.anything
|
@@ -52,7 +187,7 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
52
187
|
assert_raise StandardError do
|
53
188
|
sc.allowed = "a string"
|
54
189
|
end
|
55
|
-
assert_equal "EBoolean", SimpleClass.ecore.eAttributes.find{|a| a.name=="allowed"}.eType.name
|
190
|
+
assert_equal "EBoolean", mm::SimpleClass.ecore.eAttributes.find{|a| a.name=="allowed"}.eType.name
|
56
191
|
|
57
192
|
assert_respond_to sc, :kind
|
58
193
|
assert_respond_to sc, :kind=
|
@@ -69,20 +204,12 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
69
204
|
sc.kind = "a string"
|
70
205
|
end
|
71
206
|
|
72
|
-
enum = SimpleClass.ecore.eAttributes.find{|a| a.name=="kind"}.eType
|
207
|
+
enum = mm::SimpleClass.ecore.eAttributes.find{|a| a.name=="kind"}.eType
|
73
208
|
assert_equal ["extended", "simple"], enum.eLiterals.name.sort
|
74
209
|
end
|
75
210
|
|
76
|
-
class ManyAttrClass < RGen::MetamodelBuilder::MMBase
|
77
|
-
has_many_attr 'literals', String
|
78
|
-
has_many_attr 'bools', Boolean
|
79
|
-
has_many_attr 'integers', Integer
|
80
|
-
has_many_attr 'enums', RGen::MetamodelBuilder::DataTypes::Enum.new([:a, :b, :c])
|
81
|
-
has_many_attr 'limitTest', Integer, :upperBound => 2
|
82
|
-
end
|
83
|
-
|
84
211
|
def test_many_attr
|
85
|
-
o = ManyAttrClass.new
|
212
|
+
o = mm::ManyAttrClass.new
|
86
213
|
|
87
214
|
assert_respond_to o, :literals
|
88
215
|
assert_respond_to o, :addLiterals
|
@@ -102,13 +229,13 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
102
229
|
assert_equal ["a", "b", "b"], o.literals
|
103
230
|
# but the same string object "a" can only occur once
|
104
231
|
o.addLiterals(o.literals.first)
|
105
|
-
assert_equal ["a", "b", "b"], o.literals
|
232
|
+
assert_equal ["a", "b", "b", "a"], o.literals
|
106
233
|
# removing works by object identity, so providing a new string won't delete an existing one
|
107
234
|
o.removeLiterals("a")
|
108
|
-
assert_equal ["a", "b", "b"], o.literals
|
235
|
+
assert_equal ["a", "b", "b", "a"], o.literals
|
109
236
|
theA = o.literals.first
|
110
237
|
o.removeLiterals(theA)
|
111
|
-
assert_equal ["b", "b"], o.literals
|
238
|
+
assert_equal ["b", "b", "a"], o.literals
|
112
239
|
# removing something which is not present has no effect
|
113
240
|
o.removeLiterals(theA)
|
114
241
|
assert_equal ["b", "b"], o.literals
|
@@ -120,54 +247,42 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
120
247
|
# setting multiple elements at a time
|
121
248
|
o.literals = ["a", "b", "c"]
|
122
249
|
assert_equal ["a", "b", "c"], o.literals
|
123
|
-
# can only take
|
250
|
+
# can only take enumerables
|
124
251
|
assert_raise(StandardError) do
|
125
|
-
o.literals =
|
252
|
+
o.literals = 1
|
126
253
|
end
|
127
254
|
|
128
255
|
o.bools = [true, false, true, false]
|
129
|
-
assert_equal [true, false], o.bools
|
256
|
+
assert_equal [true, false, true, false], o.bools
|
130
257
|
|
131
258
|
o.integers = [1, 2, 2, 3, 3]
|
132
|
-
assert_equal [1, 2, 3], o.integers
|
259
|
+
assert_equal [1, 2, 2, 3, 3], o.integers
|
133
260
|
|
134
261
|
o.enums = [:a, :a, :b, :c, :c]
|
135
|
-
assert_equal [:a, :b, :c], o.enums
|
262
|
+
assert_equal [:a, :a, :b, :c, :c], o.enums
|
136
263
|
|
137
|
-
lit = ManyAttrClass.ecore.eAttributes.find{|a| a.name == "literals"}
|
264
|
+
lit = mm::ManyAttrClass.ecore.eAttributes.find{|a| a.name == "literals"}
|
138
265
|
assert lit.is_a?(RGen::ECore::EAttribute)
|
139
266
|
assert lit.many
|
140
267
|
|
141
|
-
lim = ManyAttrClass.ecore.eAttributes.find{|a| a.name == "limitTest"}
|
268
|
+
lim = mm::ManyAttrClass.ecore.eAttributes.find{|a| a.name == "limitTest"}
|
142
269
|
assert lit.many
|
143
270
|
assert_equal 2, lim.upperBound
|
144
271
|
end
|
145
272
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
class ClassB < RGen::MetamodelBuilder::MMBase
|
156
|
-
end
|
157
|
-
|
158
|
-
class ClassC < RGen::MetamodelBuilder::MMBase
|
159
|
-
end
|
160
|
-
|
161
|
-
class HasOneTestClass < RGen::MetamodelBuilder::MMBase
|
162
|
-
has_one 'classA', ClassA
|
163
|
-
has_one 'classB', ClassB
|
273
|
+
def test_many_attr_insert
|
274
|
+
o = mm::ManyAttrClass.new
|
275
|
+
o.addLiterals("a")
|
276
|
+
o.addLiterals("b", 0)
|
277
|
+
o.addLiterals("c", 1)
|
278
|
+
assert_equal ["b", "c", "a"], o.literals
|
164
279
|
end
|
165
|
-
|
280
|
+
|
166
281
|
def test_has_one
|
167
|
-
sc = HasOneTestClass.new
|
282
|
+
sc = mm::HasOneTestClass.new
|
168
283
|
assert_respond_to sc, :classA
|
169
284
|
assert_respond_to sc, :classA=
|
170
|
-
ca = ClassA.new
|
285
|
+
ca = mm::ClassA.new
|
171
286
|
sc.classA = ca
|
172
287
|
assert_equal ca, sc.classA
|
173
288
|
sc.classA = nil
|
@@ -175,7 +290,7 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
175
290
|
|
176
291
|
assert_respond_to sc, :classB
|
177
292
|
assert_respond_to sc, :classB=
|
178
|
-
cb = ClassB.new
|
293
|
+
cb = mm::ClassB.new
|
179
294
|
sc.classB = cb
|
180
295
|
assert_equal cb, sc.classB
|
181
296
|
|
@@ -183,22 +298,18 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
183
298
|
sc.classB = ca
|
184
299
|
end
|
185
300
|
|
186
|
-
assert_equal [], ClassA.ecore.eReferences
|
187
|
-
assert_equal [], ClassB.ecore.eReferences
|
188
|
-
assert_equal ["classA", "classB"].sort, HasOneTestClass.ecore.eReferences.name.sort
|
189
|
-
assert_equal [], HasOneTestClass.ecore.eReferences.select { |a| a.many == true }
|
190
|
-
assert_equal [], HasOneTestClass.ecore.eAttributes
|
191
|
-
end
|
192
|
-
|
193
|
-
class HasManyTestClass < RGen::MetamodelBuilder::MMBase
|
194
|
-
has_many 'classA', ClassA
|
301
|
+
assert_equal [], mm::ClassA.ecore.eReferences
|
302
|
+
assert_equal [], mm::ClassB.ecore.eReferences
|
303
|
+
assert_equal ["classA", "classB"].sort, mm::HasOneTestClass.ecore.eReferences.name.sort
|
304
|
+
assert_equal [], mm::HasOneTestClass.ecore.eReferences.select { |a| a.many == true }
|
305
|
+
assert_equal [], mm::HasOneTestClass.ecore.eAttributes
|
195
306
|
end
|
196
307
|
|
197
308
|
def test_has_many
|
198
|
-
o = HasManyTestClass.new
|
199
|
-
ca1 = ClassA.new
|
200
|
-
ca2 = ClassA.new
|
201
|
-
ca3 = ClassA.new
|
309
|
+
o = mm::HasManyTestClass.new
|
310
|
+
ca1 = mm::ClassA.new
|
311
|
+
ca2 = mm::ClassA.new
|
312
|
+
ca3 = mm::ClassA.new
|
202
313
|
o.addClassA(ca1)
|
203
314
|
o.addClassA(ca2)
|
204
315
|
assert_equal [ca1, ca2], o.classA
|
@@ -210,24 +321,33 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
210
321
|
o.removeClassA(ca2)
|
211
322
|
assert_equal [ca1], o.classA
|
212
323
|
assert_raise StandardError do
|
213
|
-
o.addClassA(ClassB.new)
|
324
|
+
o.addClassA(mm::ClassB.new)
|
214
325
|
end
|
215
|
-
assert_equal [], HasManyTestClass.ecore.eReferences.select{|r| r.many == false}
|
216
|
-
assert_equal ["classA"], HasManyTestClass.ecore.eReferences.select{|r| r.many == true}.name
|
326
|
+
assert_equal [], mm::HasManyTestClass.ecore.eReferences.select{|r| r.many == false}
|
327
|
+
assert_equal ["classA"], mm::HasManyTestClass.ecore.eReferences.select{|r| r.many == true}.name
|
217
328
|
end
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
329
|
+
|
330
|
+
def test_has_many_insert
|
331
|
+
o = mm::HasManyTestClass.new
|
332
|
+
ca1 = mm::ClassA.new
|
333
|
+
ca2 = mm::ClassA.new
|
334
|
+
ca3 = mm::ClassA.new
|
335
|
+
ca4 = mm::ClassA.new
|
336
|
+
ca5 = mm::ClassA.new
|
337
|
+
o.addClassA(ca1)
|
338
|
+
o.addClassA(ca2)
|
339
|
+
o.addClassA(ca3,0)
|
340
|
+
o.addClassA(ca4,1)
|
341
|
+
o.addGeneric("classA",ca5,2)
|
342
|
+
assert_equal [ca3, ca4, ca5, ca1, ca2], o.classA
|
222
343
|
end
|
223
|
-
OneClass.one_to_many 'manyClasses', ManyClass, 'oneClass', :upperBound => 5
|
224
344
|
|
225
345
|
def test_one_to_many
|
226
|
-
oc = OneClass.new
|
346
|
+
oc = mm::OneClass.new
|
227
347
|
assert_respond_to oc, :manyClasses
|
228
348
|
assert oc.manyClasses.empty?
|
229
349
|
|
230
|
-
mc = ManyClass.new
|
350
|
+
mc = mm::ManyClass.new
|
231
351
|
assert_respond_to mc, :oneClass
|
232
352
|
assert_respond_to mc, :oneClass=
|
233
353
|
assert_nil mc.oneClass
|
@@ -252,17 +372,17 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
252
372
|
assert !oc.manyClasses.include?(mc)
|
253
373
|
assert_equal nil, mc.oneClass
|
254
374
|
|
255
|
-
assert_equal [], OneClass.ecore.eReferences.select{|r| r.many == false}
|
256
|
-
assert_equal ["manyClasses"], OneClass.ecore.eReferences.select{|r| r.many == true}.name
|
257
|
-
assert_equal 5, OneClass.ecore.eReferences.find{|r| r.many == true}.upperBound
|
258
|
-
assert_equal ["oneClass"], ManyClass.ecore.eReferences.select{|r| r.many == false}.name
|
259
|
-
assert_equal [], ManyClass.ecore.eReferences.select{|r| r.many == true}
|
375
|
+
assert_equal [], mm::OneClass.ecore.eReferences.select{|r| r.many == false}
|
376
|
+
assert_equal ["manyClasses"], mm::OneClass.ecore.eReferences.select{|r| r.many == true}.name
|
377
|
+
assert_equal 5, mm::OneClass.ecore.eReferences.find{|r| r.many == true}.upperBound
|
378
|
+
assert_equal ["oneClass"], mm::ManyClass.ecore.eReferences.select{|r| r.many == false}.name
|
379
|
+
assert_equal [], mm::ManyClass.ecore.eReferences.select{|r| r.many == true}
|
260
380
|
end
|
261
381
|
|
262
382
|
def test_one_to_many_replace1
|
263
|
-
oc1 = OneClass.new
|
264
|
-
oc2 = OneClass.new
|
265
|
-
mc = ManyClass.new
|
383
|
+
oc1 = mm::OneClass.new
|
384
|
+
oc2 = mm::OneClass.new
|
385
|
+
mc = mm::ManyClass.new
|
266
386
|
|
267
387
|
oc1.manyClasses = [mc]
|
268
388
|
assert_equal [mc], oc1.manyClasses
|
@@ -276,9 +396,9 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
276
396
|
end
|
277
397
|
|
278
398
|
def test_one_to_many_replace2
|
279
|
-
oc = OneClass.new
|
280
|
-
mc1 = ManyClass.new
|
281
|
-
mc2 = ManyClass.new
|
399
|
+
oc = mm::OneClass.new
|
400
|
+
mc1 = mm::ManyClass.new
|
401
|
+
mc2 = mm::ManyClass.new
|
282
402
|
|
283
403
|
mc1.oneClass = oc
|
284
404
|
assert_equal [mc1], oc.manyClasses
|
@@ -291,18 +411,24 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
291
411
|
assert_equal oc, mc2.oneClass
|
292
412
|
end
|
293
413
|
|
294
|
-
|
295
|
-
|
296
|
-
|
414
|
+
def test_one_to_many_insert
|
415
|
+
oc = mm::OneClass.new
|
416
|
+
mc1 = mm::ManyClass.new
|
417
|
+
mc2 = mm::ManyClass.new
|
418
|
+
|
419
|
+
oc.addManyClasses(mc1, 0)
|
420
|
+
oc.addManyClasses(mc2, 0)
|
421
|
+
assert_equal [mc2, mc1], oc.manyClasses
|
422
|
+
assert_equal oc, mc1.oneClass
|
423
|
+
assert_equal oc, mc2.oneClass
|
297
424
|
end
|
298
|
-
|
299
|
-
|
425
|
+
|
300
426
|
def test_one_to_many2
|
301
|
-
oc = OneClass2.new
|
427
|
+
oc = mm::OneClass2.new
|
302
428
|
assert_respond_to oc, :manyClasses
|
303
429
|
assert oc.manyClasses.empty?
|
304
430
|
|
305
|
-
mc = ManyClass2.new
|
431
|
+
mc = mm::ManyClass2.new
|
306
432
|
assert_respond_to mc, :oneClass
|
307
433
|
assert_respond_to mc, :oneClass=
|
308
434
|
assert_nil mc.oneClass
|
@@ -327,25 +453,19 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
327
453
|
assert !oc.manyClasses.include?(mc)
|
328
454
|
assert_equal nil, mc.oneClass
|
329
455
|
|
330
|
-
assert_equal [], OneClass2.ecore.eReferences.select{|r| r.many == false}
|
331
|
-
assert_equal ["manyClasses"], OneClass2.ecore.eReferences.select{|r| r.many == true}.name
|
332
|
-
assert_equal ["oneClass"], ManyClass2.ecore.eReferences.select{|r| r.many == false}.name
|
333
|
-
assert_equal [], ManyClass2.ecore.eReferences.select{|r| r.many == true}
|
334
|
-
end
|
335
|
-
|
336
|
-
class AClassOO < RGen::MetamodelBuilder::MMBase
|
337
|
-
end
|
338
|
-
class BClassOO < RGen::MetamodelBuilder::MMBase
|
456
|
+
assert_equal [], mm::OneClass2.ecore.eReferences.select{|r| r.many == false}
|
457
|
+
assert_equal ["manyClasses"], mm::OneClass2.ecore.eReferences.select{|r| r.many == true}.name
|
458
|
+
assert_equal ["oneClass"], mm::ManyClass2.ecore.eReferences.select{|r| r.many == false}.name
|
459
|
+
assert_equal [], mm::ManyClass2.ecore.eReferences.select{|r| r.many == true}
|
339
460
|
end
|
340
|
-
AClassOO.one_to_one 'bClass', BClassOO, 'aClass'
|
341
461
|
|
342
462
|
def test_one_to_one
|
343
|
-
ac = AClassOO.new
|
463
|
+
ac = mm::AClassOO.new
|
344
464
|
assert_respond_to ac, :bClass
|
345
465
|
assert_respond_to ac, :bClass=
|
346
466
|
assert_nil ac.bClass
|
347
467
|
|
348
|
-
bc = BClassOO.new
|
468
|
+
bc = mm::BClassOO.new
|
349
469
|
assert_respond_to bc, :aClass
|
350
470
|
assert_respond_to bc, :aClass=
|
351
471
|
assert_nil bc.aClass
|
@@ -370,16 +490,16 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
370
490
|
assert_equal nil, ac.bClass
|
371
491
|
assert_equal nil, bc.aClass
|
372
492
|
|
373
|
-
assert_equal ["bClass"], AClassOO.ecore.eReferences.select{|r| r.many == false}.name
|
374
|
-
assert_equal [], AClassOO.ecore.eReferences.select{|r| r.many == true}
|
375
|
-
assert_equal ["aClass"], BClassOO.ecore.eReferences.select{|r| r.many == false}.name
|
376
|
-
assert_equal [], BClassOO.ecore.eReferences.select{|r| r.many == true}
|
493
|
+
assert_equal ["bClass"], mm::AClassOO.ecore.eReferences.select{|r| r.many == false}.name
|
494
|
+
assert_equal [], mm::AClassOO.ecore.eReferences.select{|r| r.many == true}
|
495
|
+
assert_equal ["aClass"], mm::BClassOO.ecore.eReferences.select{|r| r.many == false}.name
|
496
|
+
assert_equal [], mm::BClassOO.ecore.eReferences.select{|r| r.many == true}
|
377
497
|
end
|
378
498
|
|
379
499
|
def test_one_to_one_replace
|
380
|
-
a = AClassOO.new
|
381
|
-
b1 = BClassOO.new
|
382
|
-
b2 = BClassOO.new
|
500
|
+
a = mm::AClassOO.new
|
501
|
+
b1 = mm::BClassOO.new
|
502
|
+
b2 = mm::BClassOO.new
|
383
503
|
|
384
504
|
a.bClass = b1
|
385
505
|
assert_equal b1, a.bClass
|
@@ -392,19 +512,13 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
392
512
|
assert_equal a, b2.aClass
|
393
513
|
end
|
394
514
|
|
395
|
-
class AClassMM < RGen::MetamodelBuilder::MMBase
|
396
|
-
end
|
397
|
-
class BClassMM < RGen::MetamodelBuilder::MMBase
|
398
|
-
end
|
399
|
-
AClassMM.many_to_many 'bClasses', BClassMM, 'aClasses'
|
400
|
-
|
401
515
|
def test_many_to_many
|
402
516
|
|
403
|
-
ac = AClassMM.new
|
517
|
+
ac = mm::AClassMM.new
|
404
518
|
assert_respond_to ac, :bClasses
|
405
519
|
assert ac.bClasses.empty?
|
406
520
|
|
407
|
-
bc = BClassMM.new
|
521
|
+
bc = mm::BClassMM.new
|
408
522
|
assert_respond_to bc, :aClasses
|
409
523
|
assert bc.aClasses.empty?
|
410
524
|
|
@@ -438,69 +552,50 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
438
552
|
assert !ac.bClasses.include?(bc)
|
439
553
|
assert !bc.aClasses.include?(ac)
|
440
554
|
|
441
|
-
assert_equal [], AClassMM.ecore.eReferences.select{|r| r.many == false}
|
442
|
-
assert_equal ["bClasses"], AClassMM.ecore.eReferences.select{|r| r.many == true}.name
|
443
|
-
assert_equal [], BClassMM.ecore.eReferences.select{|r| r.many == false}
|
444
|
-
assert_equal ["aClasses"], BClassMM.ecore.eReferences.select{|r| r.many == true}.name
|
445
|
-
end
|
446
|
-
|
447
|
-
class SomeSuperClass < RGen::MetamodelBuilder::MMBase
|
448
|
-
has_attr "name"
|
449
|
-
has_many "classAs", ClassA
|
450
|
-
end
|
451
|
-
|
452
|
-
class SomeSubClass < SomeSuperClass
|
453
|
-
has_attr "subname"
|
454
|
-
has_many "classBs", ClassB
|
455
|
-
end
|
456
|
-
|
457
|
-
class OtherSubClass < SomeSuperClass
|
458
|
-
has_attr "othersubname"
|
459
|
-
has_many "classCs", ClassC
|
555
|
+
assert_equal [], mm::AClassMM.ecore.eReferences.select{|r| r.many == false}
|
556
|
+
assert_equal ["bClasses"], mm::AClassMM.ecore.eReferences.select{|r| r.many == true}.name
|
557
|
+
assert_equal [], mm::BClassMM.ecore.eReferences.select{|r| r.many == false}
|
558
|
+
assert_equal ["aClasses"], mm::BClassMM.ecore.eReferences.select{|r| r.many == true}.name
|
460
559
|
end
|
461
560
|
|
462
|
-
def
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
assert_equal ["name", "othersubname"], OtherSubClass.ecore.eAllAttributes.name.sort
|
468
|
-
assert_equal ["classAs", "classCs"], OtherSubClass.ecore.eAllReferences.name.sort
|
469
|
-
end
|
470
|
-
|
471
|
-
module AnnotatedModule
|
472
|
-
extend RGen::MetamodelBuilder::ModuleExtension
|
561
|
+
def test_many_to_many_insert
|
562
|
+
ac1 = mm::AClassMM.new
|
563
|
+
ac2 = mm::AClassMM.new
|
564
|
+
bc1= mm::BClassMM.new
|
565
|
+
bc2= mm::BClassMM.new
|
473
566
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
annotation :source => "rgen/test", :details => {"thirdtag" => "thirdvalue"}
|
479
|
-
|
480
|
-
has_attr "boolAttr", Boolean do
|
481
|
-
annotation "attrtag" => "attrval"
|
482
|
-
annotation :source => "rgen/test2", :details => {"attrtag2" => "attrvalue2", "attrtag3" => "attrvalue3"}
|
483
|
-
end
|
484
|
-
|
485
|
-
has_many "others", AnnotatedClass do
|
486
|
-
annotation "reftag" => "refval"
|
487
|
-
annotation :source => "rgen/test3", :details => {"reftag2" => "refvalue2", "reftag3" => "refvalue3"}
|
488
|
-
end
|
567
|
+
ac1.addBClasses(bc1)
|
568
|
+
ac1.addBClasses(bc2, 0)
|
569
|
+
ac2.addBClasses(bc1)
|
570
|
+
ac2.addBClasses(bc2, 0)
|
489
571
|
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
572
|
+
assert_equal [bc2, bc1], ac1.bClasses
|
573
|
+
assert_equal [bc2, bc1], ac2.bClasses
|
574
|
+
assert_equal [ac1, ac2], bc1.aClasses
|
575
|
+
assert_equal [ac1, ac2], bc2.aClasses
|
576
|
+
end
|
577
|
+
|
578
|
+
def test_inheritance
|
579
|
+
assert_equal ["name"], mm::SomeSuperClass.ecore.eAllAttributes.name
|
580
|
+
assert_equal ["classAs"], mm::SomeSuperClass.ecore.eAllReferences.name
|
581
|
+
assert_equal ["name", "subname"], mm::SomeSubClass.ecore.eAllAttributes.name.sort
|
582
|
+
assert_equal ["classAs", "classBs"], mm::SomeSubClass.ecore.eAllReferences.name.sort
|
583
|
+
assert_equal ["name", "othersubname"], mm::OtherSubClass.ecore.eAllAttributes.name.sort
|
584
|
+
assert_equal ["classAs", "classCs"], mm::OtherSubClass.ecore.eAllReferences.name.sort
|
585
|
+
assert mm::SomeSubClass.new.is_a?(mm::SomeSuperClass)
|
586
|
+
assert_equal ["name", "othersubname", "subname", "subsubname"], mm::SubSubClass.ecore.eAllAttributes.name.sort
|
587
|
+
assert_equal ["classAs", "classBs", "classCs"], mm::SubSubClass.ecore.eAllReferences.name.sort
|
588
|
+
assert mm::SubSubClass.new.is_a?(mm::SomeSuperClass)
|
589
|
+
assert mm::SubSubClass.new.is_a?(mm::SomeSubClass)
|
590
|
+
assert mm::SubSubClass.new.is_a?(mm::OtherSubClass)
|
496
591
|
end
|
497
592
|
|
498
593
|
def test_annotations
|
499
|
-
assert_equal 1, AnnotatedModule.ecore.eAnnotations.size
|
500
|
-
anno = AnnotatedModule.ecore.eAnnotations.first
|
594
|
+
assert_equal 1, mm::AnnotatedModule.ecore.eAnnotations.size
|
595
|
+
anno = mm::AnnotatedModule.ecore.eAnnotations.first
|
501
596
|
checkAnnotation(anno, nil, {"moduletag" => "modulevalue"})
|
502
597
|
|
503
|
-
eClass = AnnotatedModule::AnnotatedClass.ecore
|
598
|
+
eClass = mm::AnnotatedModule::AnnotatedClass.ecore
|
504
599
|
assert_equal 2, eClass.eAnnotations.size
|
505
600
|
anno = eClass.eAnnotations.find{|a| a.source == "rgen/test"}
|
506
601
|
checkAnnotation(anno, "rgen/test", {"thirdtag" => "thirdvalue"})
|
@@ -542,25 +637,11 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
542
637
|
end
|
543
638
|
end
|
544
639
|
|
545
|
-
module SomePackage
|
546
|
-
extend RGen::MetamodelBuilder::ModuleExtension
|
547
|
-
|
548
|
-
class ClassA < RGen::MetamodelBuilder::MMBase
|
549
|
-
end
|
550
|
-
|
551
|
-
module SubPackage
|
552
|
-
extend RGen::MetamodelBuilder::ModuleExtension
|
553
|
-
|
554
|
-
class ClassB < RGen::MetamodelBuilder::MMBase
|
555
|
-
end
|
556
|
-
end
|
557
|
-
end
|
558
|
-
|
559
640
|
def test_ecore_identity
|
560
|
-
subPackage = SomePackage::SubPackage.ecore
|
561
|
-
assert_equal subPackage.eClassifiers.first.object_id, SomePackage::SubPackage::ClassB.ecore.object_id
|
641
|
+
subPackage = mm::SomePackage::SubPackage.ecore
|
642
|
+
assert_equal subPackage.eClassifiers.first.object_id, mm::SomePackage::SubPackage::ClassB.ecore.object_id
|
562
643
|
|
563
|
-
somePackage = SomePackage.ecore
|
644
|
+
somePackage = mm::SomePackage.ecore
|
564
645
|
assert_equal somePackage.eSubpackages.first.object_id, subPackage.object_id
|
565
646
|
end
|
566
647
|
|
@@ -569,14 +650,18 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
569
650
|
assert_equal "test", p.targetIdentifier
|
570
651
|
p.targetIdentifier = 123
|
571
652
|
assert_equal 123, p.targetIdentifier
|
653
|
+
p.data = "additional info"
|
654
|
+
assert_equal "additional info", p.data
|
655
|
+
q = RGen::MetamodelBuilder::MMProxy.new("ident", "data")
|
656
|
+
assert_equal "data", q.data
|
572
657
|
end
|
573
658
|
|
574
659
|
def test_proxies_has_one
|
575
|
-
e = HasOneTestClass.new
|
660
|
+
e = mm::HasOneTestClass.new
|
576
661
|
proxy = RGen::MetamodelBuilder::MMProxy.new
|
577
662
|
e.classA = proxy
|
578
663
|
assert_equal proxy, e.classA
|
579
|
-
a = ClassA.new
|
664
|
+
a = mm::ClassA.new
|
580
665
|
# displace proxy
|
581
666
|
e.classA = a
|
582
667
|
assert_equal a, e.classA
|
@@ -586,7 +671,7 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
586
671
|
end
|
587
672
|
|
588
673
|
def test_proxies_has_many
|
589
|
-
e = HasManyTestClass.new
|
674
|
+
e = mm::HasManyTestClass.new
|
590
675
|
proxy = RGen::MetamodelBuilder::MMProxy.new
|
591
676
|
e.addClassA(proxy)
|
592
677
|
assert_equal [proxy], e.classA
|
@@ -606,8 +691,8 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
606
691
|
end
|
607
692
|
|
608
693
|
def test_proxies_one_to_one
|
609
|
-
ea = AClassOO.new
|
610
|
-
eb = BClassOO.new
|
694
|
+
ea = mm::AClassOO.new
|
695
|
+
eb = mm::BClassOO.new
|
611
696
|
proxy1 = RGen::MetamodelBuilder::MMProxy.new
|
612
697
|
proxy2 = RGen::MetamodelBuilder::MMProxy.new
|
613
698
|
ea.bClass = proxy1
|
@@ -625,8 +710,8 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
625
710
|
end
|
626
711
|
|
627
712
|
def test_proxies_one_to_many
|
628
|
-
eo = OneClass.new
|
629
|
-
em = ManyClass.new
|
713
|
+
eo = mm::OneClass.new
|
714
|
+
em = mm::ManyClass.new
|
630
715
|
proxy1 = RGen::MetamodelBuilder::MMProxy.new
|
631
716
|
proxy2 = RGen::MetamodelBuilder::MMProxy.new
|
632
717
|
eo.addManyClasses(proxy1)
|
@@ -652,8 +737,8 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
652
737
|
end
|
653
738
|
|
654
739
|
def test_proxies_many_to_many
|
655
|
-
e1 = AClassMM.new
|
656
|
-
e2 = BClassMM.new
|
740
|
+
e1 = mm::AClassMM.new
|
741
|
+
e2 = mm::BClassMM.new
|
657
742
|
proxy1 = RGen::MetamodelBuilder::MMProxy.new
|
658
743
|
proxy2 = RGen::MetamodelBuilder::MMProxy.new
|
659
744
|
e1.addBClasses(proxy1)
|
@@ -670,10 +755,10 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
670
755
|
end
|
671
756
|
|
672
757
|
def test_genericAccess
|
673
|
-
e1 = OneClass.new
|
674
|
-
e2 = ManyClass.new
|
675
|
-
e3 = OneClass.new
|
676
|
-
e4 = ManyClass.new
|
758
|
+
e1 = mm::OneClass.new
|
759
|
+
e2 = mm::ManyClass.new
|
760
|
+
e3 = mm::OneClass.new
|
761
|
+
e4 = mm::ManyClass.new
|
677
762
|
# use on "many" feature
|
678
763
|
e1.setOrAddGeneric("manyClasses", e2)
|
679
764
|
assert_equal [e2], e1.manyClasses
|
@@ -688,4 +773,74 @@ class MetamodelBuilderTest < Test::Unit::TestCase
|
|
688
773
|
assert_equal [], e4.getGenericAsArray("oneClass")
|
689
774
|
end
|
690
775
|
|
776
|
+
def test_abstract
|
777
|
+
assert_raise StandardError do
|
778
|
+
mm::AbstractClass.new
|
779
|
+
end
|
780
|
+
end
|
781
|
+
|
782
|
+
module BadDefaultValueLiteralContainer
|
783
|
+
Test1 = proc do
|
784
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
785
|
+
has_attr 'integerWithDefault', Integer, :defaultValueLiteral => "1.1"
|
786
|
+
end
|
787
|
+
end
|
788
|
+
Test2 = proc do
|
789
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
790
|
+
has_attr 'integerWithDefault', Integer, :defaultValueLiteral => "x"
|
791
|
+
end
|
792
|
+
end
|
793
|
+
Test3 = proc do
|
794
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
795
|
+
has_attr 'boolWithDefault', Boolean, :defaultValueLiteral => "1"
|
796
|
+
end
|
797
|
+
end
|
798
|
+
Test4 = proc do
|
799
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
800
|
+
has_attr 'floatWithDefault', Float, :defaultValueLiteral => "1"
|
801
|
+
end
|
802
|
+
end
|
803
|
+
Test5 = proc do
|
804
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
805
|
+
has_attr 'floatWithDefault', Float, :defaultValueLiteral => "true"
|
806
|
+
end
|
807
|
+
end
|
808
|
+
Test6 = proc do
|
809
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
810
|
+
kindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
|
811
|
+
has_attr 'enumWithDefault', kindType, :defaultValueLiteral => "xxx"
|
812
|
+
end
|
813
|
+
end
|
814
|
+
Test7 = proc do
|
815
|
+
class BadClass < RGen::MetamodelBuilder::MMBase
|
816
|
+
kindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
|
817
|
+
has_attr 'enumWithDefault', kindType, :defaultValueLiteral => "7"
|
818
|
+
end
|
819
|
+
end
|
820
|
+
end
|
821
|
+
|
822
|
+
def test_bad_default_value_literal
|
823
|
+
assert_raise StandardError do
|
824
|
+
BadDefaultValueLiteralContainer::Test1.call
|
825
|
+
end
|
826
|
+
assert_raise StandardError do
|
827
|
+
BadDefaultValueLiteralContainer::Test2.call
|
828
|
+
end
|
829
|
+
assert_raise StandardError do
|
830
|
+
BadDefaultValueLiteralContainer::Test3.call
|
831
|
+
end
|
832
|
+
assert_raise StandardError do
|
833
|
+
BadDefaultValueLiteralContainer::Test4.call
|
834
|
+
end
|
835
|
+
assert_raise StandardError do
|
836
|
+
BadDefaultValueLiteralContainer::Test5.call
|
837
|
+
end
|
838
|
+
assert_raise StandardError do
|
839
|
+
BadDefaultValueLiteralContainer::Test6.call
|
840
|
+
end
|
841
|
+
assert_raise StandardError do
|
842
|
+
BadDefaultValueLiteralContainer::Test7.call
|
843
|
+
end
|
844
|
+
end
|
845
|
+
|
691
846
|
end
|