rgen 0.5.4 → 0.6.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 +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
|