rgen 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/CHANGELOG +20 -1
  2. data/MIT-LICENSE +1 -1
  3. data/README +12 -9
  4. data/lib/instantiators/ea_instantiator.rb +36 -0
  5. data/lib/metamodels/uml13_metamodel.rb +559 -0
  6. data/lib/metamodels/uml13_metamodel_ext.rb +26 -0
  7. data/lib/mmgen/metamodel_generator.rb +5 -5
  8. data/lib/mmgen/mm_ext/ecore_ext.rb +95 -0
  9. data/lib/mmgen/mmgen.rb +6 -4
  10. data/lib/mmgen/templates/annotations.tpl +37 -0
  11. data/lib/mmgen/templates/metamodel_generator.tpl +171 -0
  12. data/lib/rgen/ecore/ecore.rb +190 -0
  13. data/lib/rgen/ecore/ecore_instantiator.rb +25 -0
  14. data/lib/rgen/ecore/ecore_transformer.rb +85 -0
  15. data/lib/rgen/environment.rb +9 -24
  16. data/lib/rgen/find_helper.rb +68 -0
  17. data/lib/rgen/{instantiator.rb → instantiator/abstract_instantiator.rb} +6 -2
  18. data/lib/rgen/instantiator/abstract_xml_instantiator.rb +59 -0
  19. data/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
  20. data/lib/rgen/instantiator/ecore_xml_instantiator.rb +144 -0
  21. data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +157 -0
  22. data/lib/rgen/instantiator/xmi11_instantiator.rb +164 -0
  23. data/lib/rgen/metamodel_builder.rb +103 -9
  24. data/lib/rgen/metamodel_builder/build_helper.rb +26 -4
  25. data/lib/rgen/metamodel_builder/builder_extensions.rb +285 -88
  26. data/lib/rgen/metamodel_builder/builder_runtime.rb +7 -1
  27. data/lib/rgen/metamodel_builder/data_types.rb +67 -0
  28. data/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
  29. data/lib/rgen/metamodel_builder/metamodel_description.rb +232 -0
  30. data/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
  31. data/lib/rgen/metamodel_builder/module_extension.rb +33 -0
  32. data/lib/rgen/model_comparator.rb +56 -0
  33. data/lib/rgen/model_dumper.rb +5 -5
  34. data/lib/rgen/name_helper.rb +17 -1
  35. data/lib/rgen/template_language.rb +148 -28
  36. data/lib/rgen/template_language/directory_template_container.rb +56 -38
  37. data/lib/rgen/template_language/output_handler.rb +93 -77
  38. data/lib/rgen/template_language/template_container.rb +186 -143
  39. data/lib/rgen/transformer.rb +19 -14
  40. data/lib/transformers/uml13_to_ecore.rb +75 -0
  41. data/redist/xmlscan/ChangeLog +1301 -0
  42. data/redist/xmlscan/README +34 -0
  43. data/redist/xmlscan/THANKS +11 -0
  44. data/redist/xmlscan/doc/changes.html +74 -0
  45. data/redist/xmlscan/doc/changes.rd +80 -0
  46. data/redist/xmlscan/doc/en/conformance.html +136 -0
  47. data/redist/xmlscan/doc/en/conformance.rd +152 -0
  48. data/redist/xmlscan/doc/en/manual.html +356 -0
  49. data/redist/xmlscan/doc/en/manual.rd +402 -0
  50. data/redist/xmlscan/doc/ja/conformance.ja.html +118 -0
  51. data/redist/xmlscan/doc/ja/conformance.ja.rd +134 -0
  52. data/redist/xmlscan/doc/ja/manual.ja.html +325 -0
  53. data/redist/xmlscan/doc/ja/manual.ja.rd +370 -0
  54. data/redist/xmlscan/doc/src/Makefile +41 -0
  55. data/redist/xmlscan/doc/src/conformance.rd.src +256 -0
  56. data/redist/xmlscan/doc/src/langsplit.rb +110 -0
  57. data/redist/xmlscan/doc/src/manual.rd.src +614 -0
  58. data/redist/xmlscan/install.rb +41 -0
  59. data/redist/xmlscan/lib/xmlscan/encoding.rb +311 -0
  60. data/redist/xmlscan/lib/xmlscan/htmlscan.rb +289 -0
  61. data/redist/xmlscan/lib/xmlscan/namespace.rb +352 -0
  62. data/redist/xmlscan/lib/xmlscan/parser.rb +299 -0
  63. data/redist/xmlscan/lib/xmlscan/scanner.rb +1109 -0
  64. data/redist/xmlscan/lib/xmlscan/version.rb +22 -0
  65. data/redist/xmlscan/lib/xmlscan/visitor.rb +158 -0
  66. data/redist/xmlscan/lib/xmlscan/xmlchar.rb +441 -0
  67. data/redist/xmlscan/memo/CONFORMANCE +1249 -0
  68. data/redist/xmlscan/memo/PRODUCTIONS +195 -0
  69. data/redist/xmlscan/memo/contentspec.ry +335 -0
  70. data/redist/xmlscan/samples/chibixml.rb +105 -0
  71. data/redist/xmlscan/samples/getxmlchar.rb +122 -0
  72. data/redist/xmlscan/samples/rexml.rb +159 -0
  73. data/redist/xmlscan/samples/xmlbench.rb +88 -0
  74. data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +22 -0
  75. data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +29 -0
  76. data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +62 -0
  77. data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +22 -0
  78. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +62 -0
  79. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +22 -0
  80. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +22 -0
  81. data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +99 -0
  82. data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +116 -0
  83. data/redist/xmlscan/samples/xmlconftest.rb +200 -0
  84. data/redist/xmlscan/test.rb +7 -0
  85. data/redist/xmlscan/tests/deftestcase.rb +73 -0
  86. data/redist/xmlscan/tests/runtest.rb +47 -0
  87. data/redist/xmlscan/tests/testall.rb +14 -0
  88. data/redist/xmlscan/tests/testencoding.rb +438 -0
  89. data/redist/xmlscan/tests/testhtmlscan.rb +752 -0
  90. data/redist/xmlscan/tests/testnamespace.rb +457 -0
  91. data/redist/xmlscan/tests/testparser.rb +591 -0
  92. data/redist/xmlscan/tests/testscanner.rb +1749 -0
  93. data/redist/xmlscan/tests/testxmlchar.rb +143 -0
  94. data/redist/xmlscan/tests/visitor.rb +34 -0
  95. data/test/array_extensions_test.rb +2 -2
  96. data/test/ea_instantiator_test.rb +41 -0
  97. data/test/ecore_self_test.rb +53 -0
  98. data/test/environment_test.rb +11 -6
  99. data/test/metamodel_builder_test.rb +404 -245
  100. data/test/metamodel_roundtrip_test.rb +52 -0
  101. data/test/metamodel_roundtrip_test/TestModel.rb +65 -0
  102. data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +64 -0
  103. data/test/metamodel_roundtrip_test/houseMetamodel.ecore +32 -0
  104. data/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +39 -0
  105. data/test/rgen_test.rb +3 -3
  106. data/test/template_language_test.rb +65 -39
  107. data/test/template_language_test/expected_result.txt +24 -3
  108. data/test/template_language_test/templates/code/array.tpl +11 -0
  109. data/test/template_language_test/templates/content/author.tpl +7 -0
  110. data/test/template_language_test/templates/content/chapter.tpl +1 -1
  111. data/test/template_language_test/templates/root.tpl +17 -8
  112. data/test/template_language_test/testout.txt +24 -3
  113. data/test/testmodel/class_model_checker.rb +119 -0
  114. data/test/{xmi_instantiator_test/testmodel.eap → testmodel/ea_testmodel.eap} +0 -0
  115. data/test/{xmi_instantiator_test/testmodel.xml → testmodel/ea_testmodel.xml} +81 -14
  116. data/test/testmodel/ea_testmodel_partial.xml +317 -0
  117. data/test/testmodel/ecore_model_checker.rb +101 -0
  118. data/test/testmodel/manual_testmodel.xml +22 -0
  119. data/test/testmodel/object_model_checker.rb +67 -0
  120. data/test/transformer_test.rb +18 -10
  121. data/test/xml_instantiator_test.rb +81 -8
  122. data/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
  123. data/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
  124. data/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
  125. data/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
  126. metadata +126 -28
  127. data/lib/ea/xmi_class_instantiator.rb +0 -46
  128. data/lib/ea/xmi_helper.rb +0 -26
  129. data/lib/ea/xmi_metamodel.rb +0 -34
  130. data/lib/ea/xmi_object_instantiator.rb +0 -46
  131. data/lib/ea/xmi_to_classmodel.rb +0 -78
  132. data/lib/ea/xmi_to_objectmodel.rb +0 -92
  133. data/lib/mmgen/mm_ext/uml_classmodel_ext.rb +0 -71
  134. data/lib/mmgen/templates/uml_classmodel.tpl +0 -63
  135. data/lib/rgen/xml_instantiator.rb +0 -132
  136. data/lib/uml/objectmodel_instantiator.rb +0 -53
  137. data/lib/uml/uml_classmodel.rb +0 -92
  138. data/lib/uml/uml_objectmodel.rb +0 -65
  139. data/test/metamodel_generator_test.rb +0 -44
  140. data/test/metamodel_generator_test/TestModel.rb +0 -40
  141. data/test/metamodel_generator_test/expected_result.txt +0 -40
  142. data/test/xmi_class_instantiator_test.rb +0 -24
  143. data/test/xmi_instantiator_test/class_model_checker.rb +0 -97
  144. data/test/xmi_object_instantiator_test.rb +0 -65
  145. data/test/xml_instantiator_test/testmodel.xml +0 -7
@@ -0,0 +1,143 @@
1
+ #
2
+ # tests/xmlchar.rb
3
+ #
4
+ # Copyright (C) Ueno Katsuhiro 2002
5
+ #
6
+ # $Id: testxmlchar.rb,v 1.4 2005/05/22 07:07:12 nahi Exp $
7
+ #
8
+
9
+ require 'test/unit'
10
+ require 'deftestcase'
11
+ require 'xmlscan/xmlchar'
12
+ require 'visitor'
13
+
14
+
15
+ class TestXMLChar < Test::Unit::TestCase
16
+
17
+ include XMLScan::XMLChar
18
+
19
+ def test_valid_char_p
20
+ assert_equal true, valid_char?(9)
21
+ assert_equal true, valid_char?(10)
22
+ assert_equal true, valid_char?(13)
23
+ assert_equal true, valid_char?(32)
24
+ assert_equal false, valid_char?(8)
25
+ assert_equal true, valid_char?(0xfffd)
26
+ assert_equal false, valid_char?(0xfffe)
27
+ assert_equal false, valid_char?(0xffff)
28
+ assert_equal false, valid_char?(0x200000)
29
+ end
30
+
31
+
32
+ # \xE3\x81\xBB = ho
33
+ # \xE3\x81\x92 = ge
34
+ # \xE3\x81\xB5 = fu
35
+ # \xE3\x81\x8C = ga
36
+
37
+ Hoge = "\xE3\x81\xBB\xE3\x81\x92"
38
+ Fuga = "\xE3\x81\xB5\xE3\x81\x8C"
39
+
40
+ Testcases = [
41
+ # chardata? nmtoken? name?
42
+ [ 'hogefuga', true, true, true ],
43
+ [ Hoge+Fuga, true, true, true ],
44
+ [ Hoge+' '+Fuga, true, false, false ],
45
+ [ Hoge+"\n"+Fuga, true, false, false ],
46
+ [ Hoge+"\r"+Fuga, true, false, false ],
47
+ [ Hoge+"\t"+Fuga, true, false, false ],
48
+ [ Hoge+"\f"+Fuga, false, false, false ],
49
+ [ Hoge+'.'+Fuga, true, true, true ],
50
+ [ Hoge+'-'+Fuga, true, true, true ],
51
+ [ Hoge+'_'+Fuga, true, true, true ],
52
+ [ Hoge+':'+Fuga, true, true, true ],
53
+ [ Hoge+'%'+Fuga, true, false, false ],
54
+ [ '.'+Hoge+Fuga, true, true, false ],
55
+ [ '-'+Hoge+Fuga, true, true, false ],
56
+ [ '_'+Hoge+Fuga, true, true, true ],
57
+ [ ':'+Hoge+Fuga, true, true, true ],
58
+ [ '%'+Hoge+Fuga, true, false, false ],
59
+ [ Hoge+"\xfe"+Fuga, false, false, false ],
60
+ [ Hoge+"\xff"+Fuga, false, false, false ],
61
+ [ [0xffff].pack('U'), false, false, false ],
62
+ ]
63
+
64
+
65
+ def test_valid_chardata_p
66
+ Testcases.each { |str,expect,|
67
+ assert_equal expect, valid_chardata?(str), str.inspect
68
+ }
69
+ end
70
+
71
+ def test_valid_nmtoken_p
72
+ Testcases.each { |str,dummy,expect,|
73
+ assert_equal expect, valid_nmtoken?(str), str.inspect
74
+ }
75
+ end
76
+
77
+ def test_valid_name_p
78
+ Testcases.each { |str,dummy,dummy,expect,|
79
+ assert_equal expect, valid_name?(str), str.inspect
80
+ }
81
+ end
82
+
83
+ end
84
+
85
+
86
+
87
+ class TestXMLScannerStrict < Test::Unit::TestCase
88
+
89
+ include DefTestCase
90
+
91
+ Visitor = RecordingVisitor.new_class(XMLScan::Visitor)
92
+
93
+
94
+ private
95
+
96
+ def setup
97
+ @origkcode = $KCODE
98
+ $KCODE = 'U'
99
+ @v = Visitor.new
100
+ @s = XMLScan::XMLScanner.new(@v, :strict_char)
101
+ end
102
+
103
+ def teardown
104
+ $KCODE = @origkcode
105
+ end
106
+
107
+ def parse(src)
108
+ @s.parse src
109
+ @v.result
110
+ end
111
+
112
+
113
+ public
114
+
115
+ Hoge = TestXMLChar::Hoge
116
+ Fuga = TestXMLChar::Fuga
117
+
118
+
119
+ deftestcase 'document', <<-'TESTCASEEND'
120
+
121
+ "<:.#{Hoge}>hoge</:.#{Hoge}>"
122
+ [ :on_stag, ":.#{Hoge}" ]
123
+ [ :on_stag_end, ":.#{Hoge}" ]
124
+ [ :on_chardata, "hoge" ]
125
+ [ :on_etag, ":.#{Hoge}" ]
126
+
127
+ "<.:#{Hoge}>hoge</.:#{Hoge}>"
128
+ [ :parse_error, "`.:#{Hoge}' is not valid for XML name"]
129
+ [ :on_stag, ".:#{Hoge}" ]
130
+ [ :on_stag_end, ".:#{Hoge}" ]
131
+ [ :on_chardata, "hoge" ]
132
+ [ :parse_error, "`.:#{Hoge}' is not valid for XML name"]
133
+ [ :on_etag, ".:#{Hoge}" ]
134
+
135
+ TESTCASEEND
136
+
137
+ end
138
+
139
+
140
+
141
+
142
+
143
+ load "#{File.dirname($0)}/runtest.rb" if __FILE__ == $0
@@ -0,0 +1,34 @@
1
+ #
2
+ # tests/visitor.rb
3
+ #
4
+ # Copyright (C) UENO Katsuhiro 2002
5
+ #
6
+ # $Id: visitor.rb,v 1.3 2002/09/24 21:39:30 katsu Exp $
7
+ #
8
+
9
+ module RecordingVisitor
10
+
11
+ def initialize
12
+ @result = []
13
+ end
14
+
15
+ attr_reader :result
16
+
17
+ def self.new_class(visitor)
18
+ klass = Class.new
19
+ mod = self
20
+ klass.module_eval { include mod, visitor }
21
+ methods = visitor.instance_methods
22
+ visitor.included_modules.each { |i| methods.concat i.instance_methods }
23
+ methods.sort.uniq.each { |i|
24
+ klass.module_eval <<-END, __FILE__, __LINE__ + 1
25
+ def #{i}(*args)
26
+ @result.push [ :#{i} ].concat(args)
27
+ end
28
+ END
29
+ }
30
+ klass
31
+ end
32
+
33
+
34
+ end
@@ -23,8 +23,8 @@ class ArrayExtensionsTest < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  class MMBaseClass < RGen::MetamodelBuilder::MMBase
26
- has_one 'name'
27
- has_one 'age'
26
+ has_attr 'name'
27
+ has_attr 'age', Integer
28
28
  end
29
29
 
30
30
  def test_with_mmbase
@@ -0,0 +1,41 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+
3
+ require 'test/unit'
4
+ require 'rgen/environment'
5
+ require 'metamodels/uml13_metamodel'
6
+ require 'instantiators/ea_instantiator'
7
+ require 'transformers/uml13_to_ecore'
8
+ require 'testmodel/class_model_checker'
9
+ require 'testmodel/object_model_checker'
10
+ require 'testmodel/ecore_model_checker'
11
+
12
+ class EAInstantiatorTest < Test::Unit::TestCase
13
+
14
+ include Testmodel::ClassModelChecker
15
+ include Testmodel::ObjectModelChecker
16
+ include Testmodel::ECoreModelChecker
17
+
18
+ MODEL_DIR = File.join(File.dirname(__FILE__),"testmodel")
19
+
20
+ def test_instantiator
21
+ envUML = RGen::Environment.new
22
+ File.open(MODEL_DIR+"/ea_testmodel.xml") { |f|
23
+ inst = EAInstantiator.new(envUML, EAInstantiator::ERROR)
24
+ inst.instantiate(f.read)
25
+ }
26
+ checkClassModel(envUML)
27
+ checkObjectModel(envUML)
28
+ envECore = RGen::Environment.new
29
+ UML13ToECore.new(envUML, envECore).transform
30
+ checkECoreModel(envECore)
31
+ end
32
+
33
+ def test_partial
34
+ envUML = RGen::Environment.new
35
+ File.open(MODEL_DIR+"/ea_testmodel_partial.xml") { |f|
36
+ inst = EAInstantiator.new(envUML, EAInstantiator::ERROR)
37
+ inst.instantiate(f.read)
38
+ }
39
+ checkClassModelPartial(envUML)
40
+ end
41
+ end
@@ -0,0 +1,53 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+
3
+ require 'test/unit'
4
+ require 'rgen/ecore/ecore'
5
+ require 'rgen/array_extensions'
6
+
7
+ class ECoreSelfTest < Test::Unit::TestCase
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
+
20
+ assert_equal \
21
+ EModelElement.ecore,
22
+ EModelElement.ecore.eStructuralFeatures.find{|f| f.name=="eAnnotations"}.eOpposite.eType
23
+
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).sort,
40
+ RGen::ECore.ecore.eClassifiers.name.sort
41
+
42
+ assert_equal "false", EAttribute.ecore.eAllAttributes.
43
+ find{|a|a.name == "derived"}.defaultValueLiteral
44
+ assert_equal false, EAttribute.ecore.eAllAttributes.
45
+ find{|a|a.name == "derived"}.defaultValue
46
+
47
+ assert_nil EAttribute.ecore.eAllAttributes.
48
+ find{|a|a.name == "defaultValueLiteral"}.defaultValueLiteral
49
+ assert_nil EAttribute.ecore.eAllAttributes.
50
+ find{|a|a.name == "defaultValueLiteral"}.defaultValue
51
+
52
+ end
53
+ end
@@ -18,25 +18,30 @@ class EnvironmentTest < Test::Unit::TestCase
18
18
  m2 = ModelSub.new
19
19
  m2.name = "M2"
20
20
  m3 = "justAString"
21
- env_in = RGen::Environment.new << m1 << m2 << m3
22
-
23
- result = env_in.find(:class => Model, :name => "M1")
21
+ env = RGen::Environment.new << m1 << m2 << m3
22
+ assertFind(env, m1, m2, m3)
23
+ idx = env.findIndex(:name)
24
+ assertFind(idx, m1, m2, m3)
25
+ end
26
+
27
+ def assertFind(context, m1, m2, m3)
28
+ result = context.find(:class => Model, :name => "M1")
24
29
  assert result.is_a?(Array)
25
30
  assert_equal 1, result.size
26
31
  assert_equal m1, result.first
27
32
 
28
- result = env_in.find(:class => Model)
33
+ result = context.find(:class => Model)
29
34
  assert result.is_a?(Array)
30
35
  assert_equal 2, result.size
31
36
  assert_equal m1, result[0]
32
37
  assert_equal m2, result[1]
33
38
 
34
- result = env_in.find(:name => "M2")
39
+ result = context.find(:name => "M2")
35
40
  assert result.is_a?(Array)
36
41
  assert_equal 1, result.size
37
42
  assert_equal m2, result[0]
38
43
 
39
- result = env_in.find(:class => [Model, String])
44
+ result = context.find(:class => [Model, String])
40
45
  assert result.is_a?(Array)
41
46
  assert_equal 3, result.size
42
47
  assert_equal m1, result[0]
@@ -2,260 +2,419 @@ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
2
 
3
3
  require 'test/unit'
4
4
  require 'rgen/metamodel_builder'
5
+ require 'rgen/array_extensions'
5
6
 
6
7
  class MetamodelBuilderTest < Test::Unit::TestCase
8
+
9
+ class SimpleClass < RGen::MetamodelBuilder::MMBase
10
+ KindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
11
+ has_attr 'name' # default is String
12
+ has_attr 'stringWithDefault', String, :defaultValueLiteral => "xtest"
13
+ has_attr 'anything', Object
14
+ has_attr 'allowed', RGen::MetamodelBuilder::DataTypes::Boolean
15
+ has_attr 'kind', KindType
16
+ has_attr 'kindWithDefault', KindType, :defaultValueLiteral => "extended"
17
+ end
18
+
19
+ def test_has_attr
20
+ sc = SimpleClass.new
21
+
22
+ assert_respond_to sc, :name
23
+ assert_respond_to sc, :name=
24
+ sc.name = "TestName"
25
+ assert_equal "TestName", sc.name
26
+ sc.name = nil
27
+ assert_equal nil, sc.name
28
+ assert_raise StandardError do
29
+ sc.name = 5
30
+ end
31
+ assert_equal "EString", SimpleClass.ecore.eAttributes.find{|a| a.name=="name"}.eType.name
7
32
 
8
- class HasOneTestClass < RGen::MetamodelBuilder::MMBase
9
- has_one 'name'
10
- has_one 'an_array', Array
11
- end
12
-
13
- def test_has_one
14
- sc = HasOneTestClass.new
15
- assert_respond_to sc, :name
16
- assert_respond_to sc, :name=
17
- sc.name = 'SomeName'
18
- assert_equal 'SomeName', sc.name
19
- sc.name = nil
20
- assert_equal nil, sc.name
33
+ assert_equal "xtest", sc.stringWithDefault
34
+ assert_equal :extended, sc.kindWithDefault
35
+
36
+ sc.anything = :asymbol
37
+ assert_equal :asymbol, sc.anything
38
+ sc.anything = self # a class
39
+ assert_equal self, sc.anything
40
+
41
+ assert_respond_to sc, :allowed
42
+ assert_respond_to sc, :allowed=
43
+ sc.allowed = true
44
+ assert_equal true, sc.allowed
45
+ sc.allowed = false
46
+ assert_equal false, sc.allowed
47
+ sc.allowed = nil
48
+ assert_equal nil, sc.allowed
49
+ assert_raise StandardError do
50
+ sc.allowed = :someSymbol
51
+ end
52
+ assert_raise StandardError do
53
+ sc.allowed = "a string"
54
+ end
55
+ assert_equal "EBoolean", SimpleClass.ecore.eAttributes.find{|a| a.name=="allowed"}.eType.name
56
+
57
+ assert_respond_to sc, :kind
58
+ assert_respond_to sc, :kind=
59
+ sc.kind = :simple
60
+ assert_equal :simple, sc.kind
61
+ sc.kind = :extended
62
+ assert_equal :extended, sc.kind
63
+ sc.kind = nil
64
+ assert_equal nil, sc.kind
65
+ assert_raise StandardError do
66
+ sc.kind = :false
67
+ end
68
+ assert_raise StandardError do
69
+ sc.kind = "a string"
70
+ end
71
+
72
+ enum = SimpleClass.ecore.eAttributes.find{|a| a.name=="kind"}.eType
73
+ assert_equal ["extended", "simple"], enum.eLiterals.name.sort
74
+ end
75
+
76
+ class ClassA < RGen::MetamodelBuilder::MMBase
77
+ end
78
+
79
+ class ClassB < RGen::MetamodelBuilder::MMBase
80
+ end
81
+
82
+ class ClassC < RGen::MetamodelBuilder::MMBase
83
+ end
84
+
85
+ class HasOneTestClass < RGen::MetamodelBuilder::MMBase
86
+ has_one 'classA', ClassA
87
+ has_one 'classB', ClassB
88
+ end
89
+
90
+ def test_has_one
91
+ sc = HasOneTestClass.new
92
+ assert_respond_to sc, :classA
93
+ assert_respond_to sc, :classA=
94
+ ca = ClassA.new
95
+ sc.classA = ca
96
+ assert_equal ca, sc.classA
97
+ sc.classA = nil
98
+ assert_equal nil, sc.classA
99
+
100
+ assert_respond_to sc, :classB
101
+ assert_respond_to sc, :classB=
102
+ cb = ClassB.new
103
+ sc.classB = cb
104
+ assert_equal cb, sc.classB
105
+
106
+ assert_raise StandardError do
107
+ sc.classB = ca
108
+ end
109
+
110
+ assert_equal [], ClassA.ecore.eReferences
111
+ assert_equal [], ClassB.ecore.eReferences
112
+ assert_equal ["classA", "classB"].sort, HasOneTestClass.ecore.eReferences.name.sort
113
+ assert_equal [], HasOneTestClass.ecore.eReferences.select { |a| a.many == true }
114
+ assert_equal [], HasOneTestClass.ecore.eAttributes
115
+ end
116
+
117
+ class HasManyTestClass < RGen::MetamodelBuilder::MMBase
118
+ has_many 'classA', ClassA
119
+ end
120
+
121
+ def test_has_many
122
+ o = HasManyTestClass.new
123
+ ca1 = ClassA.new
124
+ ca2 = ClassA.new
125
+ ca3 = ClassA.new
126
+ o.addClassA(ca1)
127
+ o.addClassA(ca2)
128
+ assert_equal [ca1, ca2], o.classA
129
+ # make sure we get a copy
130
+ o.classA.clear
131
+ assert_equal [ca1, ca2], o.classA
132
+ o.removeClassA(ca3)
133
+ assert_equal [ca1, ca2], o.classA
134
+ o.removeClassA(ca2)
135
+ assert_equal [ca1], o.classA
136
+ assert_raise StandardError do
137
+ o.addClassA(ClassB.new)
138
+ end
139
+ assert_equal [], HasManyTestClass.ecore.eReferences.select{|r| r.many == false}
140
+ assert_equal ["classA"], HasManyTestClass.ecore.eReferences.select{|r| r.many == true}.name
141
+ end
142
+
143
+ class OneClass < RGen::MetamodelBuilder::MMBase
144
+ end
145
+ class ManyClass < RGen::MetamodelBuilder::MMBase
146
+ end
147
+ OneClass.one_to_many 'manyClasses', ManyClass, 'oneClass'
148
+
149
+ def test_one_to_many
150
+ oc = OneClass.new
151
+ assert_respond_to oc, :manyClasses
152
+ assert oc.manyClasses.empty?
153
+
154
+ mc = ManyClass.new
155
+ assert_respond_to mc, :oneClass
156
+ assert_respond_to mc, :oneClass=
157
+ assert_nil mc.oneClass
158
+
159
+ # put the OneClass into the ManyClass
160
+ mc.oneClass = oc
161
+ assert_equal oc, mc.oneClass
162
+ assert oc.manyClasses.include?(mc)
163
+
164
+ # remove the OneClass from the ManyClass
165
+ mc.oneClass = nil
166
+ assert_equal nil, mc.oneClass
167
+ assert !oc.manyClasses.include?(mc)
168
+
169
+ # put the ManyClass into the OneClass
170
+ oc.addManyClasses mc
171
+ assert oc.manyClasses.include?(mc)
172
+ assert_equal oc, mc.oneClass
173
+
174
+ # remove the ManyClass from the OneClass
175
+ oc.removeManyClasses mc
176
+ assert !oc.manyClasses.include?(mc)
177
+ assert_equal nil, mc.oneClass
178
+
179
+ assert_equal [], OneClass.ecore.eReferences.select{|r| r.many == false}
180
+ assert_equal ["manyClasses"], OneClass.ecore.eReferences.select{|r| r.many == true}.name
181
+ assert_equal ["oneClass"], ManyClass.ecore.eReferences.select{|r| r.many == false}.name
182
+ assert_equal [], ManyClass.ecore.eReferences.select{|r| r.many == true}
183
+ end
184
+
185
+ class OneClass2 < RGen::MetamodelBuilder::MMBase
186
+ end
187
+ class ManyClass2 < RGen::MetamodelBuilder::MMBase
188
+ end
189
+ ManyClass2.many_to_one 'oneClass', OneClass2, 'manyClasses'
190
+
191
+ def test_one_to_many2
192
+ oc = OneClass2.new
193
+ assert_respond_to oc, :manyClasses
194
+ assert oc.manyClasses.empty?
195
+
196
+ mc = ManyClass2.new
197
+ assert_respond_to mc, :oneClass
198
+ assert_respond_to mc, :oneClass=
199
+ assert_nil mc.oneClass
200
+
201
+ # put the OneClass into the ManyClass
202
+ mc.oneClass = oc
203
+ assert_equal oc, mc.oneClass
204
+ assert oc.manyClasses.include?(mc)
205
+
206
+ # remove the OneClass from the ManyClass
207
+ mc.oneClass = nil
208
+ assert_equal nil, mc.oneClass
209
+ assert !oc.manyClasses.include?(mc)
210
+
211
+ # put the ManyClass into the OneClass
212
+ oc.addManyClasses mc
213
+ assert oc.manyClasses.include?(mc)
214
+ assert_equal oc, mc.oneClass
215
+
216
+ # remove the ManyClass from the OneClass
217
+ oc.removeManyClasses mc
218
+ assert !oc.manyClasses.include?(mc)
219
+ assert_equal nil, mc.oneClass
220
+
221
+ assert_equal [], OneClass2.ecore.eReferences.select{|r| r.many == false}
222
+ assert_equal ["manyClasses"], OneClass2.ecore.eReferences.select{|r| r.many == true}.name
223
+ assert_equal ["oneClass"], ManyClass2.ecore.eReferences.select{|r| r.many == false}.name
224
+ assert_equal [], ManyClass2.ecore.eReferences.select{|r| r.many == true}
225
+ end
226
+
227
+ class AClassOO < RGen::MetamodelBuilder::MMBase
228
+ end
229
+ class BClassOO < RGen::MetamodelBuilder::MMBase
230
+ end
231
+ AClassOO.one_to_one 'bClass', BClassOO, 'aClass'
232
+
233
+ def test_one_to_one
234
+ ac = AClassOO.new
235
+ assert_respond_to ac, :bClass
236
+ assert_respond_to ac, :bClass=
237
+ assert_nil ac.bClass
238
+
239
+ bc = BClassOO.new
240
+ assert_respond_to bc, :aClass
241
+ assert_respond_to bc, :aClass=
242
+ assert_nil bc.aClass
243
+
244
+ # put the AClass into the BClass
245
+ bc.aClass = ac
246
+ assert_equal ac, bc.aClass
247
+ assert_equal bc, ac.bClass
248
+
249
+ # remove the AClass from the BClass
250
+ bc.aClass = nil
251
+ assert_equal nil, bc.aClass
252
+ assert_equal nil, ac.bClass
253
+
254
+ # put the BClass into the AClass
255
+ ac.bClass = bc
256
+ assert_equal bc, ac.bClass
257
+ assert_equal ac, bc.aClass
258
+
259
+ # remove the BClass from the AClass
260
+ ac.bClass = nil
261
+ assert_equal nil, ac.bClass
262
+ assert_equal nil, bc.aClass
263
+
264
+ assert_equal ["bClass"], AClassOO.ecore.eReferences.select{|r| r.many == false}.name
265
+ assert_equal [], AClassOO.ecore.eReferences.select{|r| r.many == true}
266
+ assert_equal ["aClass"], BClassOO.ecore.eReferences.select{|r| r.many == false}.name
267
+ assert_equal [], BClassOO.ecore.eReferences.select{|r| r.many == true}
268
+ end
269
+
270
+ class AClassMM < RGen::MetamodelBuilder::MMBase
271
+ end
272
+ class BClassMM < RGen::MetamodelBuilder::MMBase
273
+ end
274
+ AClassMM.many_to_many 'bClasses', BClassMM, 'aClasses'
275
+
276
+ def test_many_to_many
277
+
278
+ ac = AClassMM.new
279
+ assert_respond_to ac, :bClasses
280
+ assert ac.bClasses.empty?
281
+
282
+ bc = BClassMM.new
283
+ assert_respond_to bc, :aClasses
284
+ assert bc.aClasses.empty?
285
+
286
+ # put the AClass into the BClass
287
+ bc.addAClasses ac
288
+ assert bc.aClasses.include?(ac)
289
+ assert ac.bClasses.include?(bc)
290
+
291
+ # put something else into the BClass
292
+ assert_raise StandardError do
293
+ bc.addAClasses :notaaclass
294
+ end
295
+
296
+ # remove the AClass from the BClass
297
+ bc.removeAClasses ac
298
+ assert !bc.aClasses.include?(ac)
299
+ assert !ac.bClasses.include?(bc)
300
+
301
+ # put the BClass into the AClass
302
+ ac.addBClasses bc
303
+ assert ac.bClasses.include?(bc)
304
+ assert bc.aClasses.include?(ac)
305
+
306
+ # put something else into the AClass
307
+ assert_raise StandardError do
308
+ ac.addBClasses :notabclass
309
+ end
310
+
311
+ # remove the BClass from the AClass
312
+ ac.removeBClasses bc
313
+ assert !ac.bClasses.include?(bc)
314
+ assert !bc.aClasses.include?(ac)
315
+
316
+ assert_equal [], AClassMM.ecore.eReferences.select{|r| r.many == false}
317
+ assert_equal ["bClasses"], AClassMM.ecore.eReferences.select{|r| r.many == true}.name
318
+ assert_equal [], BClassMM.ecore.eReferences.select{|r| r.many == false}
319
+ assert_equal ["aClasses"], BClassMM.ecore.eReferences.select{|r| r.many == true}.name
320
+ end
321
+
322
+ class SomeSuperClass < RGen::MetamodelBuilder::MMBase
323
+ has_attr "name"
324
+ has_many "classAs", ClassA
325
+ end
326
+
327
+ class SomeSubClass < SomeSuperClass
328
+ has_attr "subname"
329
+ has_many "classBs", ClassB
330
+ end
331
+
332
+ class OtherSubClass < SomeSuperClass
333
+ has_attr "othersubname"
334
+ has_many "classCs", ClassC
335
+ end
336
+
337
+ def test_inheritance
338
+ assert_equal ["name"], SomeSuperClass.ecore.eAllAttributes.name
339
+ assert_equal ["classAs"], SomeSuperClass.ecore.eAllReferences.name
340
+ assert_equal ["name", "subname"], SomeSubClass.ecore.eAllAttributes.name.sort
341
+ assert_equal ["classAs", "classBs"], SomeSubClass.ecore.eAllReferences.name.sort
342
+ assert_equal ["name", "othersubname"], OtherSubClass.ecore.eAllAttributes.name.sort
343
+ assert_equal ["classAs", "classCs"], OtherSubClass.ecore.eAllReferences.name.sort
344
+ end
345
+
346
+ module AnnotatedModule
347
+ extend RGen::MetamodelBuilder::ModuleExtension
21
348
 
22
- assert_respond_to sc, :an_array
23
- assert_respond_to sc, :an_array=
24
- aa = Array.new
25
- sc.an_array = aa
26
- assert_equal aa, sc.an_array
27
-
28
- assert_raise StandardError do
29
- sc.an_array = "a string"
30
- end
31
-
32
- assert_equal HasOneTestClass.one_attributes, ["name", "an_array"]
33
- assert_equal HasOneTestClass.many_attributes, []
34
- end
35
-
36
- class HasManyTestClass < RGen::MetamodelBuilder::MMBase
37
- has_many 'string', String
38
- end
39
-
40
- def test_has_many
41
- o = HasManyTestClass.new
42
- o.addString("s1")
43
- o.addString("s2")
44
- assert_equal ["s1","s2"], o.string
45
- # make sure we get a copy
46
- o.string.clear
47
- assert_equal ["s1","s2"], o.string
48
- o.removeString("s3")
49
- assert_equal ["s1","s2"], o.string
50
- o.removeString("s2")
51
- assert_equal ["s1"], o.string
52
- assert_raise StandardError do
53
- o.addString(:notastring)
54
- end
55
- assert_equal HasManyTestClass.one_attributes, []
56
- assert_equal HasManyTestClass.many_attributes, ["string"]
57
- end
349
+ annotation "moduletag" => "modulevalue"
350
+
351
+ class AnnotatedClass < RGen::MetamodelBuilder::MMBase
352
+ annotation "sometag" => "somevalue", "othertag" => "othervalue"
353
+ annotation :source => "rgen/test", :details => {"thirdtag" => "thirdvalue"}
354
+
355
+ has_attr "boolAttr", Boolean do
356
+ annotation "attrtag" => "attrval"
357
+ annotation :source => "rgen/test2", :details => {"attrtag2" => "attrvalue2", "attrtag3" => "attrvalue3"}
358
+ end
58
359
 
59
- class OneClass < RGen::MetamodelBuilder::MMBase
60
- end
61
- class ManyClass < RGen::MetamodelBuilder::MMBase
62
- end
63
- OneClass.one_to_many 'manyClasses', ManyClass, 'oneClass'
64
-
65
- def test_one_to_many
66
- oc = OneClass.new
67
- assert_respond_to oc, :manyClasses
68
- assert oc.manyClasses.empty?
69
-
70
- mc = ManyClass.new
71
- assert_respond_to mc, :oneClass
72
- assert_respond_to mc, :oneClass=
73
- assert_nil mc.oneClass
74
-
75
- # put the OneClass into the ManyClass
76
- mc.oneClass = oc
77
- assert_equal oc, mc.oneClass
78
- assert oc.manyClasses.include?(mc)
79
-
80
- # remove the OneClass from the ManyClass
81
- mc.oneClass = nil
82
- assert_equal nil, mc.oneClass
83
- assert !oc.manyClasses.include?(mc)
360
+ has_many "others", AnnotatedClass do
361
+ annotation "reftag" => "refval"
362
+ annotation :source => "rgen/test3", :details => {"reftag2" => "refvalue2", "reftag3" => "refvalue3"}
363
+ end
84
364
 
85
- # put the ManyClass into the OneClass
86
- oc.addManyClasses mc
87
- assert oc.manyClasses.include?(mc)
88
- assert_equal oc, mc.oneClass
89
-
90
- # remove the ManyClass from the OneClass
91
- oc.removeManyClasses mc
92
- assert !oc.manyClasses.include?(mc)
93
- assert_equal nil, mc.oneClass
365
+ many_to_many "m2m", AnnotatedClass, "m2mback" do
366
+ annotation "m2mtag" => "m2mval"
367
+ opposite_annotation "opposite_m2mtag" => "opposite_m2mval"
368
+ end
369
+ end
370
+
371
+ end
372
+
373
+ def test_annotations
374
+ assert_equal 1, AnnotatedModule.ecore.eAnnotations.size
375
+ anno = AnnotatedModule.ecore.eAnnotations.first
376
+ checkAnnotation(anno, nil, {"moduletag" => "modulevalue"})
94
377
 
95
- assert_equal OneClass.one_attributes, []
96
- assert_equal OneClass.many_attributes, ["manyClasses"]
97
- assert_equal ManyClass.one_attributes, ["oneClass"]
98
- assert_equal ManyClass.many_attributes, []
99
- end
378
+ eClass = AnnotatedModule::AnnotatedClass.ecore
379
+ assert_equal 2, eClass.eAnnotations.size
380
+ anno = eClass.eAnnotations.find{|a| a.source == "rgen/test"}
381
+ checkAnnotation(anno, "rgen/test", {"thirdtag" => "thirdvalue"})
382
+ anno = eClass.eAnnotations.find{|a| a.source == nil}
383
+ checkAnnotation(anno, nil, {"sometag" => "somevalue", "othertag" => "othervalue"})
100
384
 
101
- class OneClass2 < RGen::MetamodelBuilder::MMBase
102
- end
103
- class ManyClass2 < RGen::MetamodelBuilder::MMBase
104
- end
105
- ManyClass2.many_to_one 'oneClass', OneClass2, 'manyClasses'
106
-
107
- def test_one_to_many2
108
- oc = OneClass2.new
109
- assert_respond_to oc, :manyClasses
110
- assert oc.manyClasses.empty?
111
-
112
- mc = ManyClass2.new
113
- assert_respond_to mc, :oneClass
114
- assert_respond_to mc, :oneClass=
115
- assert_nil mc.oneClass
116
-
117
- # put the OneClass into the ManyClass
118
- mc.oneClass = oc
119
- assert_equal oc, mc.oneClass
120
- assert oc.manyClasses.include?(mc)
121
-
122
- # remove the OneClass from the ManyClass
123
- mc.oneClass = nil
124
- assert_equal nil, mc.oneClass
125
- assert !oc.manyClasses.include?(mc)
385
+ eAttr = eClass.eAttributes.first
386
+ assert_equal 2, eAttr.eAnnotations.size
387
+ anno = eAttr.eAnnotations.find{|a| a.source == "rgen/test2"}
388
+ checkAnnotation(anno, "rgen/test2", {"attrtag2" => "attrvalue2", "attrtag3" => "attrvalue3"})
389
+ anno = eAttr.eAnnotations.find{|a| a.source == nil}
390
+ checkAnnotation(anno, nil, {"attrtag" => "attrval"})
126
391
 
127
- # put the ManyClass into the OneClass
128
- oc.addManyClasses mc
129
- assert oc.manyClasses.include?(mc)
130
- assert_equal oc, mc.oneClass
131
-
132
- # remove the ManyClass from the OneClass
133
- oc.removeManyClasses mc
134
- assert !oc.manyClasses.include?(mc)
135
- assert_equal nil, mc.oneClass
392
+ eRef = eClass.eReferences.find{|r| !r.eOpposite}
393
+ assert_equal 2, eRef.eAnnotations.size
394
+ anno = eRef.eAnnotations.find{|a| a.source == "rgen/test3"}
395
+ checkAnnotation(anno, "rgen/test3", {"reftag2" => "refvalue2", "reftag3" => "refvalue3"})
396
+ anno = eRef.eAnnotations.find{|a| a.source == nil}
397
+ checkAnnotation(anno, nil, {"reftag" => "refval"})
136
398
 
137
- assert_equal OneClass2.one_attributes, []
138
- assert_equal OneClass2.many_attributes, ["manyClasses"]
139
- assert_equal ManyClass2.one_attributes, ["oneClass"]
140
- assert_equal ManyClass2.many_attributes, []
141
- end
399
+ eRef = eClass.eReferences.find{|r| r.eOpposite}
400
+ assert_equal 1, eRef.eAnnotations.size
401
+ anno = eRef.eAnnotations.first
402
+ checkAnnotation(anno, nil, {"m2mtag" => "m2mval"})
403
+ eRef = eRef.eOpposite
404
+ assert_equal 1, eRef.eAnnotations.size
405
+ anno = eRef.eAnnotations.first
406
+ checkAnnotation(anno, nil, {"opposite_m2mtag" => "opposite_m2mval"})
407
+ end
142
408
 
143
- class AClassOO < RGen::MetamodelBuilder::MMBase
144
- end
145
- class BClassOO < RGen::MetamodelBuilder::MMBase
146
- end
147
- AClassOO.one_to_one 'bClass', BClassOO, 'aClass'
148
-
149
- def test_one_to_one
150
- ac = AClassOO.new
151
- assert_respond_to ac, :bClass
152
- assert_respond_to ac, :bClass=
153
- assert_nil ac.bClass
154
-
155
- bc = BClassOO.new
156
- assert_respond_to bc, :aClass
157
- assert_respond_to bc, :aClass=
158
- assert_nil bc.aClass
159
-
160
- # put the AClass into the BClass
161
- bc.aClass = ac
162
- assert_equal ac, bc.aClass
163
- assert_equal bc, ac.bClass
164
-
165
- # remove the AClass from the BClass
166
- bc.aClass = nil
167
- assert_equal nil, bc.aClass
168
- assert_equal nil, ac.bClass
169
-
170
- # put the BClass into the AClass
171
- ac.bClass = bc
172
- assert_equal bc, ac.bClass
173
- assert_equal ac, bc.aClass
174
-
175
- # remove the BClass from the AClass
176
- ac.bClass = nil
177
- assert_equal nil, ac.bClass
178
- assert_equal nil, bc.aClass
179
-
180
- assert_equal AClassOO.one_attributes, ["bClass"]
181
- assert_equal AClassOO.many_attributes, []
182
- assert_equal BClassOO.one_attributes, ["aClass"]
183
- assert_equal BClassOO.many_attributes, []
184
- end
185
-
186
- class AClassMM < RGen::MetamodelBuilder::MMBase
187
- end
188
- class BClassMM < RGen::MetamodelBuilder::MMBase
189
- end
190
- AClassMM.many_to_many 'bClasses', BClassMM, 'aClasses'
191
-
192
- def test_many_to_many
193
-
194
- ac = AClassMM.new
195
- assert_respond_to ac, :bClasses
196
- assert ac.bClasses.empty?
197
-
198
- bc = BClassMM.new
199
- assert_respond_to bc, :aClasses
200
- assert bc.aClasses.empty?
201
-
202
- # put the AClass into the BClass
203
- bc.addAClasses ac
204
- assert bc.aClasses.include?(ac)
205
- assert ac.bClasses.include?(bc)
206
-
207
- # put something else into the BClass
208
- assert_raise StandardError do
209
- bc.addAClasses :notaaclass
210
- end
211
-
212
- # remove the AClass from the BClass
213
- bc.removeAClasses ac
214
- assert !bc.aClasses.include?(ac)
215
- assert !ac.bClasses.include?(bc)
216
-
217
- # put the BClass into the AClass
218
- ac.addBClasses bc
219
- assert ac.bClasses.include?(bc)
220
- assert bc.aClasses.include?(ac)
221
-
222
- # put something else into the AClass
223
- assert_raise StandardError do
224
- ac.addBClasses :notabclass
225
- end
226
-
227
- # remove the BClass from the AClass
228
- ac.removeBClasses bc
229
- assert !ac.bClasses.include?(bc)
230
- assert !bc.aClasses.include?(ac)
231
-
232
- assert_equal AClassMM.one_attributes, []
233
- assert_equal AClassMM.many_attributes, ["bClasses"]
234
- assert_equal BClassMM.one_attributes, []
235
- assert_equal BClassMM.many_attributes, ["aClasses"]
236
- end
237
-
238
- class SomeSuperClass < RGen::MetamodelBuilder::MMBase
239
- has_one "name"
240
- has_many "others"
241
- end
242
-
243
- class SomeSubClass < SomeSuperClass
244
- has_one "subname"
245
- has_many "subothers"
246
- end
247
-
248
- class OtherSubClass < SomeSuperClass
249
- has_one "othersubname"
250
- has_many "othersubothers"
251
- end
252
-
253
- def test_inheritance
254
- assert_equal SomeSuperClass.one_attributes, ["name"]
255
- assert_equal SomeSuperClass.many_attributes, ["others"]
256
- assert_equal SomeSubClass.one_attributes.sort, ["name", "subname"]
257
- assert_equal SomeSubClass.many_attributes.sort, ["others", "subothers"]
258
- assert_equal OtherSubClass.one_attributes.sort, ["name", "othersubname"]
259
- assert_equal OtherSubClass.many_attributes.sort, ["others", "othersubothers"]
260
- end
409
+ def checkAnnotation(anno, source, hash)
410
+ assert anno.is_a?(RGen::ECore::EAnnotation)
411
+ assert_equal source, anno.source
412
+ assert_equal hash.size, anno.details.size
413
+ hash.each_pair do |k, v|
414
+ detail = anno.details.find{|d| d.key == k}
415
+ assert detail.is_a?(RGen::ECore::EStringToStringMapEntry)
416
+ assert_equal v, detail.value
417
+ end
418
+ end
419
+
261
420
  end