rgen-0.6.6/ 0000755 0001750 0001750 00000000000 12243455557 010660 5 ustar ssm ssm rgen-0.6.6/metadata.yml 0000644 0001750 0001750 00000020016 12243455557 013162 0 ustar ssm ssm --- !ruby/object:Gem::Specification
name: rgen
version: !ruby/object:Gem::Version
version: 0.6.6
prerelease:
platform: ruby
authors:
- Martin Thiede
autorequire:
bindir: bin
cert_chain: []
date: 2013-08-30 00:00:00.000000000 Z
dependencies: []
description: RGen is a framework for Model Driven Software Development (MDSD) in Ruby.
This means that it helps you build Metamodels, instantiate Models, modify and transform
Models and finally generate arbitrary textual content from it.
email: martin dot thiede at gmx de
executables: []
extensions: []
extra_rdoc_files:
- README.rdoc
- CHANGELOG
- MIT-LICENSE
files:
- lib/ea_support/ea_support.rb
- lib/ea_support/id_store.rb
- lib/ea_support/uml13_ea_metamodel.rb
- lib/ea_support/uml13_ea_metamodel_ext.rb
- lib/ea_support/uml13_ea_metamodel_generator.rb
- lib/ea_support/uml13_ea_to_uml13.rb
- lib/ea_support/uml13_to_uml13_ea.rb
- lib/metamodels/uml13_metamodel.rb
- lib/metamodels/uml13_metamodel_ext.rb
- lib/mmgen/metamodel_generator.rb
- lib/mmgen/mm_ext/ecore_mmgen_ext.rb
- lib/mmgen/mmgen.rb
- lib/mmgen/templates/annotations.tpl
- lib/mmgen/templates/metamodel_generator.tpl
- lib/rgen/array_extensions.rb
- lib/rgen/ecore/ecore.rb
- lib/rgen/ecore/ecore_builder_methods.rb
- lib/rgen/ecore/ecore_ext.rb
- lib/rgen/ecore/ecore_interface.rb
- lib/rgen/ecore/ecore_to_ruby.rb
- lib/rgen/ecore/ruby_to_ecore.rb
- lib/rgen/environment.rb
- lib/rgen/fragment/dump_file_cache.rb
- lib/rgen/fragment/fragmented_model.rb
- lib/rgen/fragment/model_fragment.rb
- lib/rgen/instantiator/abstract_instantiator.rb
- lib/rgen/instantiator/abstract_xml_instantiator.rb
- lib/rgen/instantiator/default_xml_instantiator.rb
- lib/rgen/instantiator/ecore_xml_instantiator.rb
- lib/rgen/instantiator/json_instantiator.rb
- lib/rgen/instantiator/json_parser.rb
- lib/rgen/instantiator/json_parser.y
- lib/rgen/instantiator/nodebased_xml_instantiator.rb
- lib/rgen/instantiator/qualified_name_resolver.rb
- lib/rgen/instantiator/reference_resolver.rb
- lib/rgen/instantiator/resolution_helper.rb
- lib/rgen/instantiator/xmi11_instantiator.rb
- lib/rgen/metamodel_builder.rb
- lib/rgen/metamodel_builder/builder_extensions.rb
- lib/rgen/metamodel_builder/builder_runtime.rb
- lib/rgen/metamodel_builder/constant_order_helper.rb
- lib/rgen/metamodel_builder/data_types.rb
- lib/rgen/metamodel_builder/intermediate/annotation.rb
- lib/rgen/metamodel_builder/intermediate/feature.rb
- lib/rgen/metamodel_builder/mm_multiple.rb
- lib/rgen/metamodel_builder/module_extension.rb
- lib/rgen/model_builder.rb
- lib/rgen/model_builder/builder_context.rb
- lib/rgen/model_builder/model_serializer.rb
- lib/rgen/model_builder/reference_resolver.rb
- lib/rgen/serializer/json_serializer.rb
- lib/rgen/serializer/opposite_reference_filter.rb
- lib/rgen/serializer/qualified_name_provider.rb
- lib/rgen/serializer/xmi11_serializer.rb
- lib/rgen/serializer/xmi20_serializer.rb
- lib/rgen/serializer/xml_serializer.rb
- lib/rgen/template_language.rb
- lib/rgen/template_language/directory_template_container.rb
- lib/rgen/template_language/output_handler.rb
- lib/rgen/template_language/template_container.rb
- lib/rgen/template_language/template_helper.rb
- lib/rgen/transformer.rb
- lib/rgen/util/auto_class_creator.rb
- lib/rgen/util/cached_glob.rb
- lib/rgen/util/file_cache_map.rb
- lib/rgen/util/file_change_detector.rb
- lib/rgen/util/method_delegation.rb
- lib/rgen/util/model_comparator.rb
- lib/rgen/util/model_comparator_base.rb
- lib/rgen/util/model_dumper.rb
- lib/rgen/util/name_helper.rb
- lib/rgen/util/pattern_matcher.rb
- lib/transformers/ecore_to_uml13.rb
- lib/transformers/uml13_to_ecore.rb
- test/array_extensions_test.rb
- test/ea_instantiator_test.rb
- test/ea_serializer_test.rb
- test/ecore_self_test.rb
- test/environment_test.rb
- test/json_test.rb
- test/metamodel_builder_test.rb
- test/metamodel_from_ecore_test.rb
- test/metamodel_order_test.rb
- test/metamodel_roundtrip_test.rb
- test/metamodel_roundtrip_test/TestModel.rb
- test/metamodel_roundtrip_test/TestModel_Regenerated.rb
- test/metamodel_roundtrip_test/houseMetamodel.ecore
- test/metamodel_roundtrip_test/houseMetamodel_Regenerated.ecore
- test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb
- test/metamodel_roundtrip_test/using_builtin_types.ecore
- test/metamodel_roundtrip_test/using_builtin_types_serialized.ecore
- test/method_delegation_test.rb
- test/model_builder/builder_context_test.rb
- test/model_builder/builder_test.rb
- test/model_builder/ecore_internal.rb
- test/model_builder/ecore_original.rb
- test/model_builder/ecore_original_regenerated.rb
- test/model_builder/reference_resolver_test.rb
- test/model_builder/serializer_test.rb
- test/model_builder/statemachine_metamodel.rb
- test/model_builder/test_model/statemachine1.rb
- test/model_builder_test.rb
- test/model_fragment_test.rb
- test/output_handler_test.rb
- test/qualified_name_provider_test.rb
- test/qualified_name_resolver_test.rb
- test/reference_resolver_test.rb
- test/rgen_test.rb
- test/template_language_test.rb
- test/template_language_test/expected_result1.txt
- test/template_language_test/expected_result2.txt
- test/template_language_test/expected_result3.txt
- test/template_language_test/indentStringTestDefaultIndent.out
- test/template_language_test/indentStringTestTabIndent.out
- test/template_language_test/templates/callback_indent_test/a.tpl
- test/template_language_test/templates/callback_indent_test/b.tpl
- test/template_language_test/templates/code/array.tpl
- test/template_language_test/templates/content/author.tpl
- test/template_language_test/templates/content/chapter.tpl
- test/template_language_test/templates/define_local_test/local.tpl
- test/template_language_test/templates/define_local_test/test.tpl
- test/template_language_test/templates/evaluate_test/test.tpl
- test/template_language_test/templates/indent_string_test.tpl
- test/template_language_test/templates/index/c/cmod.tpl
- test/template_language_test/templates/index/chapter.tpl
- test/template_language_test/templates/no_backslash_r_test.tpl
- test/template_language_test/templates/no_indent_test/no_indent.tpl
- test/template_language_test/templates/no_indent_test/sub1/no_indent.tpl
- test/template_language_test/templates/no_indent_test/test.tpl
- test/template_language_test/templates/no_indent_test/test2.tpl
- test/template_language_test/templates/no_indent_test/test3.tpl
- test/template_language_test/templates/null_context_test.tpl
- test/template_language_test/templates/root.tpl
- test/template_language_test/templates/template_resolution_test/sub1.tpl
- test/template_language_test/templates/template_resolution_test/sub1/sub1.tpl
- test/template_language_test/templates/template_resolution_test/test.tpl
- test/template_language_test/testout.txt
- test/testmodel/class_model_checker.rb
- test/testmodel/ea_testmodel.eap
- test/testmodel/ea_testmodel.xml
- test/testmodel/ea_testmodel_partial.xml
- test/testmodel/ea_testmodel_regenerated.xml
- test/testmodel/ecore_model_checker.rb
- test/testmodel/manual_testmodel.xml
- test/testmodel/object_model_checker.rb
- test/transformer_test.rb
- test/util/file_cache_map_test.rb
- test/util/file_cache_map_test/testdir/fileA
- test/util/pattern_matcher_test.rb
- test/util_test.rb
- test/xml_instantiator_test.rb
- test/xml_instantiator_test/simple_ecore_model_checker.rb
- test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb
- test/xml_instantiator_test/simple_xmi_metamodel.rb
- test/xml_instantiator_test/simple_xmi_to_ecore.rb
- README.rdoc
- CHANGELOG
- MIT-LICENSE
- Rakefile
homepage: http://ruby-gen.org
licenses: []
post_install_message:
rdoc_options:
- --main
- README.rdoc
- -x
- test
- -x
- metamodels
- -x
- ea_support/uml13*
require_paths:
- lib
required_ruby_version: !ruby/object:Gem::Requirement
none: false
requirements:
- - ! '>='
- !ruby/object:Gem::Version
version: '0'
required_rubygems_version: !ruby/object:Gem::Requirement
none: false
requirements:
- - ! '>='
- !ruby/object:Gem::Version
version: '0'
requirements: []
rubyforge_project: rgen
rubygems_version: 1.8.24
signing_key:
specification_version: 3
summary: Ruby Modelling and Generator Framework
test_files: []
rgen-0.6.6/Rakefile 0000644 0001750 0001750 00000003061 12243455557 012325 0 ustar ssm ssm require 'rubygems/package_task'
require 'rdoc/task'
RGenGemSpec = Gem::Specification.new do |s|
s.name = %q{rgen}
s.version = "0.6.6"
s.date = Time.now.strftime("%Y-%m-%d")
s.summary = %q{Ruby Modelling and Generator Framework}
s.email = %q{martin dot thiede at gmx de}
s.homepage = %q{http://ruby-gen.org}
s.rubyforge_project = %q{rgen}
s.description = %q{RGen is a framework for Model Driven Software Development (MDSD) in Ruby. This means that it helps you build Metamodels, instantiate Models, modify and transform Models and finally generate arbitrary textual content from it.}
s.authors = ["Martin Thiede"]
gemfiles = Rake::FileList.new
gemfiles.include("{lib,test}/**/*")
gemfiles.include("README.rdoc", "CHANGELOG", "MIT-LICENSE", "Rakefile")
gemfiles.exclude(/\b\.bak\b/)
s.files = gemfiles
s.rdoc_options = ["--main", "README.rdoc", "-x", "test", "-x", "metamodels", "-x", "ea_support/uml13*"]
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG", "MIT-LICENSE"]
end
RDoc::Task.new do |rd|
rd.main = "README.rdoc"
rd.rdoc_files.include("README.rdoc", "CHANGELOG", "MIT-LICENSE", "lib/**/*.rb")
rd.rdoc_files.exclude("lib/metamodels/*")
rd.rdoc_files.exclude("lib/ea_support/uml13*")
rd.rdoc_dir = "doc"
end
RGenPackageTask = Gem::PackageTask.new(RGenGemSpec) do |p|
p.need_zip = false
end
task :prepare_package_rdoc => :rdoc do
RGenPackageTask.package_files.include("doc/**/*")
end
task :release => [:prepare_package_rdoc, :package]
task :clobber => [:clobber_rdoc, :clobber_package]
rgen-0.6.6/MIT-LICENSE 0000644 0001750 0001750 00000002041 12243455557 012311 0 ustar ssm ssm Copyright (c) 2013 Martin Thiede
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
rgen-0.6.6/CHANGELOG 0000644 0001750 0001750 00000020342 12243455557 012073 0 ustar ssm ssm =0.1.0 (August 3rd, 2006)
* First public release
=0.2.0 (September 3rd, 2006)
* Added model transformation language (Transformer)
* Now RGen is distributed as a gem
* More complete documentation
=0.3.0 (October 9th, 2006)
* Improved XML Instantiator (Namespaces, Resolver, Customization)
* Added many_to_one builder method
* Added attribute reflection to MMBase (one_attributes, many_attributes)
* Added +copy+ method to Transformer
* Added simple model dumper module
* Fixed mmgen/mmgen.rb
=0.4.0 (Aug 8th, 2007)
* Added ECore metamodel and use it as the core metametamodel
* Revised and extended MetamodelBuilder language
* There is an ECore instance describing each metamodel built using MetamodelBuilder now
* Metamodel generator is now ECore based
* Added Ruby implementation of Boolean and Enum types
* Switched XML Instantiator to xmlscan for performance reasons
* Cleaned up instantiator file structure
* Renamed RGen::XMLInstantiator into RGen::Instantiator::DefaultXMLInstantiator
* Included xmlscan as a redistributed module
* Added support for chardata within XML tags
* Added (Enterprise Architect) XMI to ECore instantiator
* Some minor fixes in NameHelper
* Some fixes to template language
* Added UML1.3 Metamodel
* Added tranformation from UML1.3 to ECore
=0.4.1 (Nov 25th, 2007)
* Template language performance improvement
* Bugfix: use true/false instead of symbols for boolean attribute default values in metamodel classes
* Minor fixes on metamodel generator and ecore primitive type handling
* Made transformer implementation non-recursive to prevent "stack level too deep" exception for large models
* Minor fixes on EAInstantiator
* Made transformer search for matching rules for superclasses
* Bugfix: Enums are now added to EPackages created using the "ecore" method on a module
* Bugfix: Metamodel generator now writes enum names
* Performance improvement: don't require ecore transformer every time someone calls "ecore"
* Major performance improvement of template engine (no Regexps to check \n at end of line)
* Major performance improvement: AbstractXMLInstantiator optionally controls the garbage collector
* Major performance improvement: ERB templates are reused in metamodel_builder
* Added delete method to Environment
=0.4.2 (Mar 2nd, 2008)
* Performance improvement: collection feature of array extension uses hashes now to speed up array union
* Performance improvement: find on environment hashes elements by class
* Extended Transformer to allow sharing of result maps between several Transformer instances
* Bugfix: User defined upper bound values are no longer overwritten by -1 in all "many" metamodel builder methods
=0.4.3 (Aug 12th, 2008)
* Performance improvement: significant speed up of metamodel reverse registration
* Bugfix: Use object identity for metamodel to-many add/remove methods
* Bugfix: If expand's :for expression evaluates to nil an error is generated (silently used current context before)
* Template language indentation string can be set on DirectoryTemplateContainer and with the "file" command
=0.4.4 (Sep 10th, 2008)
* Added "abstract" metamodel DSL command
* Added ecore_ext.rb with convenience methods
* Added XMI1.1 serializer, revised XMLSerializer super class
=0.4.5 (Nov 17th, 2008)
* Updated XMI1.1 serializer to support explicit placement of elements on content level of the XMI file
=0.4.6 (Mar 1st, 2009)
* Bugfix: expand :foreach silently assumed current context if :foreach evalutated to nil
* Bugfix: fixed unit test for non-Windows plattforms (\r\n)
* Bugfix: depending on the Ruby version and/or platform constants used in templates could not be resolved
* Added automatic line ending detection (\n or \r\n) for template language +nl+ command
=0.5.0 (Jun 8th, 2009)
* Added ModelBuilder and ModelSerializer
* Added template language "define_local" command
* Added template language "evaluate" command
* Fixed template language bug: indentation problem when expand continues a non-empty line
* Fixed template language bug: template content expands several times when a template container is called recursively
* Fixed template language bug: template resolution problem if a template file has the same name as a template directory
* Cleaned up EA support
* Added method to clear ecore metamodel reflection cache
* Improved overriding of metamodel features in reopened classes
=0.5.1 (Nov 10th, 2009)
* Fixed metamodel builder bug: _register at one-side did not unregister from the element referenced by the old value
* Added helper class for building simple model comparators
=0.5.2 (Jun 13th, 2010)
* Added has_many_attr to metamodel builder, support for "many" attributes
* Added JSON support (json instantiator and serializer)
* Added QualifiedNameResolver instantiation helper
* Added reference proxy support
* Added more generic access methods on metaclasses
* Added ReferenceResolver resolver mixin
* Fixed ecore xml instantiator and serializer to handle references to builtin datatypes correctly
* Fixed bug in ecore xml serializer to not output references which are opposites of containment references
=0.5.3 (Aug 13th, 2010)
* Fixed string escaping in JSON instantiator and serializer
* Fixed order of eClassifiers and eSubpackages within an EPackage created by reflection on a RGen module
=0.5.4
* Fixed undeterministic order of child elements in ModelSerializer
* Fixed undeterministic order of attributes in XMI serializers
* Fixed ModelSerializer to always serialize the to-one part of bidirectional 1:N references
* Fixed ModelSerializer to add :as => in case of ambiguous child roles
* Made JsonInstantiator search subpackages for unqualified class names
=0.6.0
* Added exception when trying to instantiate abstract class
* Replaced xmlscan by dependency to nokogiri
* Made RGen work with Ruby 1.9
* Cleaned up intermediate attribute and reference description, improvement of metamodel load time
* Added optional data property for MMProxy
* Added ECoreToRuby which can create Ruby classes and modules from ECore models in memory (without metamodel generator)
* Refactored out QualifiedNameProvider and OppositeReferenceFilter
* Added model fragment/fragmented models support
* Extended Instantiator::ReferenceResolver and changed it into a class
* Moved utilities into util folder/module
* Added FileCacheMap
* Fixed template language bug: indenting not correct after callback into same template container and iinc/idec
* Added support for fragmented models
* Added FileChangeDetector utility
* Added CachedGlob utility
* Added index parameter to model element add methods
* Added MMGeneric
* Modified has_many_attr to allow the same value in the same attribute multiple times
* Made Environment#delete faster on large models
* Added type check of ecore defaultValueLiteral content in MetamodelBuilder
* Many-feature setters can work with an Enumerable instead of an Array
* Added pattern matcher utility
* Fixed problem of Ruby hanging when exceptions occur
* Fixed metamodel generator to quote illegal enum literal symbols
* Imporved UML to ECore transformer and EA support
=0.6.1
* Fixed metamodel builder to not overwrite a model element's 'class' method
* Added enum type transformation to ECoreToUML13 transformer, primitive type mapping based on instanceClassName
* Fixed default value appearing on read after setting a feature value to nil
* Added eIsSet and eUnset methods
* Added eContainer and eContainingFeature methods
* Fixed ModelFragment#elements not containing root elements
* Added optional output of invalidation reason to FileCacheMap#load_data
=0.6.2
* Made qualified name provider work with unidirectional containment references
* Fixed array_extension breaking the Hash[] method
=0.6.3
* Added BigDecimal support
=0.6.4
* Made FileChangeDetector and FileCacheMap robust against missing files
=0.6.5
* Fixed missing default argument of FragmentedModel#resolve
* Added to_str to methods which aren't forwarded by array extension on empty arrays
=0.6.6
* Added ModelFragment#mark_resolved and ResolutionHelper
* Added ReferenceResolver option to output failed resolutions
* Major performance improvement of FragmentedModel#resolve
* Fixed a Ruby 2.0 related warning
rgen-0.6.6/README.rdoc 0000644 0001750 0001750 00000004067 12243455557 012475 0 ustar ssm ssm = RGen - Ruby Modelling and Generator Framework
RGen is a framework for Model Driven Software Development (MDSD)in Ruby.
This means that it helps you build Metamodels, instantiate Models, modify
and transform Models and finally generate arbitrary textual content from it.
RGen features include:
* Supporting Ruby 1.8.6, 1.8.7 and 1.9.x
* Metamodel definition language (internal Ruby DSL)
* ECore Meta-metamodel with an ECore instance available for every Metamodel
* Generator creating the Ruby metamodel definition from an ECore instance
* Transformer creating Ruby metamodel classes/modules from an ECore instance
* Instantiation of Metamodels, i.e. creation of Models (e.g. from XML)
* Model builder, internal Ruby DSL
* Model fragmentation over several several files and per-fragment caching
* Model Transformation language (internal Ruby DSL)
* Powerful template based generator language (internal Ruby DSL inside of ERB)
* UML 1.3 metamodel and XMI 1.1 instantiator included
* ECore XML support (XMI 2.0)
* UML-to-ECore and ECore-to-UML transformation (UML class models)
* Enterprise Architect support (UML1.3/XMI1.1)
== Download
Get the latest release from Github: https://github.com/mthiede/rgen
== Installation
Install RGen as a Ruby gem:
gem install rgen
== Running the Tests
Change to the 'test' folder and run the test suite:
cd test
ruby rgen_test.rb
== Documentation
RDoc documentation is available at Github: http://mthiede.github.com/rgen/
Find the main documentation parts for:
* RGen::MetamodelBuilder
* RGen::Transformer
* RGen::TemplateLanguage
* RGen::Fragment::FragmentedModel
== Examples
There are several examples of using RGen within the framework itself.
Metamodel Definition:
lib/rgen/ecore/ecore.rb
lib/metamodels/uml13_metamodel.rb
Instantiation:
lib/rgen/instantiator/xmi11_instantiator.rb
lib/rgen/instantiator/ecore_xml_instantiator.rb
Transformations:
lib/rgen/ecore/ruby_to_ecore.rb
lib/transformers/uml13_to_ecore.rb
Generators:
lib/mmgen/metamodel_generator.rb
== License
RGen is released under the MIT license.
rgen-0.6.6/test/ 0000755 0001750 0001750 00000000000 12243455557 011637 5 ustar ssm ssm rgen-0.6.6/test/xml_instantiator_test/ 0000755 0001750 0001750 00000000000 12243455557 016275 5 ustar ssm ssm rgen-0.6.6/test/xml_instantiator_test/simple_xmi_to_ecore.rb 0000644 0001750 0001750 00000005652 12243455557 022657 0 ustar ssm ssm require 'rgen/transformer'
require 'rgen/ecore/ecore'
require 'rgen/array_extensions'
require 'xml_instantiator_test/simple_xmi_metamodel'
class SimpleXmiToECore < RGen::Transformer
include RGen::ECore
class MapHelper
def initialize(keyMethod,valueMethod,elements)
@keyMethod, @valueMethod, @elements = keyMethod, valueMethod, elements
end
def [](key)
return @elements.select{|e| e.send(@keyMethod) == key}.first.send(@valueMethod) rescue NoMethodError
nil
end
end
class TaggedValueHelper < MapHelper
def initialize(element)
super('tag','value',element.modelElement_taggedValue.taggedValue)
end
end
# Do the actual transformation.
# Input and output environment have to be provided to the transformer constructor.
def transform
trans(:class => SimpleXMIMetaModel::UML::Clazz)
end
transform SimpleXMIMetaModel::UML::Package, :to => EPackage do
{ :name => name,
:eSuperPackage => trans(parent.parent.is_a?(SimpleXMIMetaModel::UML::Package) ? parent.parent : nil) }
end
transform SimpleXMIMetaModel::UML::Clazz, :to => EClass do
{ :name => name,
:ePackage => trans(parent.parent.is_a?(SimpleXMIMetaModel::UML::Package) ? parent.parent : nil),
:eStructuralFeatures => trans(classifier_feature.attribute + associationEnds),
:eOperations => trans(classifier_feature.operation),
:eSuperTypes => trans(generalizationsAsSubtype.supertypeClass),
:eAnnotations => [ EAnnotation.new(:details => trans(modelElement_taggedValue.taggedValue)) ] }
end
transform SimpleXMIMetaModel::UML::TaggedValue, :to => EStringToStringMapEntry do
{ :key => tag, :value => value}
end
transform SimpleXMIMetaModel::UML::Attribute, :to => EAttribute do
typemap = { "String" => EString, "boolean" => EBoolean, "int" => EInt, "float" => EFloat }
tv = TaggedValueHelper.new(@current_object)
{ :name => name, :eType => typemap[tv['type']],
:eAnnotations => [ EAnnotation.new(:details => trans(modelElement_taggedValue.taggedValue)) ] }
end
transform SimpleXMIMetaModel::UML::Operation, :to => EOperation do
{ :name => name }
end
transform SimpleXMIMetaModel::UML::AssociationEnd, :to => EReference, :if => :isReference do
{ :eType => trans(otherEnd.typeClass),
:name => otherEnd.name,
:eOpposite => trans(otherEnd),
:lowerBound => (otherEnd.multiplicity || '0').split('..').first.to_i,
:upperBound => (otherEnd.multiplicity || '1').split('..').last.gsub('*','-1').to_i,
:containment => (aggregation == 'composite'),
:eAnnotations => [ EAnnotation.new(:details => trans(modelElement_taggedValue.taggedValue)) ] }
end
method :isReference do
otherEnd.isNavigable == 'true' ||
# composite assocations are bidirectional
aggregation == 'composite' || otherEnd.aggregation == 'composite'
end
end
rgen-0.6.6/test/xml_instantiator_test/simple_xmi_metamodel.rb 0000644 0001750 0001750 00000002164 12243455557 023022 0 ustar ssm ssm # This is an extension of the implicit metamodel created by the
# DefaultXMLInstantiator when it reads an Enterprise Architect
# XMI file.
#
module SimpleXMIMetaModel
module UML
include RGen::MetamodelBuilder
class Classifier_feature < MMBase
end
class ClassifierRole < MMBase
end
class Clazz < ClassifierRole
end
class Interface < ClassifierRole
end
class Operation < MMBase
end
class Generalization < MMBase
end
class ModelElement_stereotype < MMBase
end
class AssociationEnd < MMBase
module ClassModule
def otherEnd
parent.associationEnd.find{|ae| ae != self}
end
end
end
class AssociationEndRole < MMBase
end
ClassifierRole.one_to_many 'associationEnds', AssociationEnd, 'typeClass'
ClassifierRole.one_to_many 'associationEndRoles', AssociationEndRole, 'typeClass'
Clazz.one_to_many 'generalizationsAsSubtype', Generalization, 'subtypeClass'
Clazz.one_to_many 'generalizationsAsSupertype', Generalization, 'supertypeClass'
end
end
rgen-0.6.6/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb 0000644 0001750 0001750 00000003320 12243455557 024742 0 ustar ssm ssm require 'rgen/instantiator/default_xml_instantiator'
require 'rgen/environment'
require 'rgen/ecore/ecore'
require 'xml_instantiator_test/simple_xmi_metamodel'
# SimpleXMIECoreInstantiator demonstrates the usage of the DefaultXMLInstantiator.
# It can be used to instantiate an ECore model from an XMI description
# produced by Enterprise Architect.
#
# Note however, that this is *not* the recommended way to read an EA model.
# See EAInstantiatorTest for the clean way to do this.
#
# This example shows how arbitrary XML content can be used to instantiate
# an implicit metamodel. The resulting model is transformed into a simple
# ECore model.
#
# See XMLInstantiatorTest for an example of how to use this class.
#
class SimpleXMIECoreInstantiator < RGen::Instantiator::DefaultXMLInstantiator
map_tag_ns "omg.org/UML1.3", SimpleXMIMetaModel::UML
resolve_by_id :typeClass, :src => :type, :id => :xmi_id
resolve_by_id :subtypeClass, :src => :subtype, :id => :xmi_id
resolve_by_id :supertypeClass, :src => :supertype, :id => :xmi_id
def initialize
@envXMI = RGen::Environment.new
super(@envXMI, SimpleXMIMetaModel, true)
end
def new_object(node)
if node.tag == "EAStub"
class_name = saneClassName(node.attributes["UMLType"])
mod = XMIMetaModel::UML
build_on_error(NameError, :build_class, class_name, mod) do
mod.const_get(class_name).new
end
else
super
end
end
# This method does the actual work.
def instantiateECoreModel(envOut, str)
instantiate(str)
require 'xml_instantiator_test/simple_xmi_to_ecore'
SimpleXmiToECore.new(@envXMI,envOut).transform
end
end
rgen-0.6.6/test/xml_instantiator_test/simple_ecore_model_checker.rb 0000644 0001750 0001750 00000010114 12243455557 024131 0 ustar ssm ssm require 'rgen/ecore/ecore'
# This "light" version of the ECore model checker is used to check the
# model produced by the XMLInstantiatorTest only.
#
module SimpleECoreModelChecker
include RGen::ECore
def checkECoreModel(env)
# check main package
mainPackage = env.elements.select {|e| e.is_a? EPackage and e.name == "HouseMetamodel"}.first
assert_not_nil mainPackage
# check Rooms package
assert mainPackage.eSubpackages.is_a?(Array)
assert_equal 1, mainPackage.eSubpackages.size
assert mainPackage.eSubpackages[0].is_a?(EPackage)
roomsPackage = mainPackage.eSubpackages[0]
assert_equal "Rooms", roomsPackage.name
# check main package classes
assert mainPackage.eClassifiers.is_a?(Array)
assert_equal 3, mainPackage.eClassifiers.size
assert mainPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
houseClass = mainPackage.eClassifiers.select{|c| c.name == "House"}.first
personClass = mainPackage.eClassifiers.select{|c| c.name == "Person"}.first
meetingPlaceClass = mainPackage.eClassifiers.select{|c| c.name == "MeetingPlace"}.first
assert_not_nil houseClass
assert_not_nil personClass
assert_not_nil meetingPlaceClass
# check Rooms package classes
assert roomsPackage.eClassifiers.is_a?(Array)
assert_equal 3, roomsPackage.eClassifiers.size
assert roomsPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
roomClass = roomsPackage.eClassifiers.select{|c| c.name == "Room"}.first
kitchenClass = roomsPackage.eClassifiers.select{|c| c.name == "Kitchen"}.first
bathroomClass = roomsPackage.eClassifiers.select{|c| c.name == "Bathroom"}.first
assert_not_nil roomClass
assert_not_nil kitchenClass
assert_not_nil bathroomClass
# check Room inheritance
assert kitchenClass.eSuperTypes.is_a?(Array)
assert_equal 2, kitchenClass.eSuperTypes.size
assert_equal roomClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "Room"}.first.object_id
assert_equal meetingPlaceClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "MeetingPlace"}.first.object_id
assert bathroomClass.eSuperTypes.is_a?(Array)
assert_equal 1, bathroomClass.eSuperTypes.size
assert_equal roomClass.object_id, bathroomClass.eSuperTypes[0].object_id
# check House-Room "part of" association
assert houseClass.eAllContainments.eType.is_a?(Array)
assert_equal 1, houseClass.eAllContainments.eType.size
roomRef = houseClass.eAllContainments.first
assert_equal roomClass.object_id, roomRef.eType.object_id
assert_equal "room", roomRef.name
assert_equal 1, roomRef.lowerBound
assert_equal(-1, roomRef.upperBound)
assert_not_nil roomRef.eOpposite
assert_equal houseClass.object_id, roomRef.eOpposite.eType.object_id
partOfRefs = roomClass.eReferences.select{|r| r.eOpposite && r.eOpposite.containment}
assert_equal 1, partOfRefs.size
assert_equal houseClass.object_id, partOfRefs.first.eType.object_id
assert_equal "house", partOfRefs.first.name
assert_equal roomRef.object_id, partOfRefs.first.eOpposite.object_id
# check House OUT associations
assert houseClass.eReferences.is_a?(Array)
assert_equal 3, houseClass.eReferences.size
bathRef = houseClass.eReferences.find {|e| e.name == "bathroom"}
kitchenRef = houseClass.eReferences.find {|e| e.name == "kitchen"}
roomRef = houseClass.eReferences.find {|e| e.name == "room"}
assert_not_nil bathRef
assert_nil bathRef.eOpposite
assert_not_nil kitchenRef
assert_not_nil roomRef
assert_equal 1, kitchenRef.lowerBound
assert_equal 1, kitchenRef.upperBound
assert_equal 1, roomRef.lowerBound
assert_equal(-1, roomRef.upperBound)
# check House IN associations
houseInRefs = env.find(:class => EReference, :eType => houseClass)
assert_equal 3, houseInRefs.size
homeEnd = houseInRefs.find{|e| e.name == "home"}
assert_not_nil homeEnd
assert_equal 0, homeEnd.lowerBound
assert_equal(-1, homeEnd.upperBound)
end
end
rgen-0.6.6/test/xml_instantiator_test.rb 0000644 0001750 0001750 00000011354 12243455557 016626 0 ustar ssm ssm $:.unshift File.join(File.dirname(__FILE__),"..","lib")
require 'test/unit'
require 'rgen/instantiator/default_xml_instantiator'
require 'rgen/environment'
require 'rgen/util/model_dumper'
require 'xml_instantiator_test/simple_xmi_ecore_instantiator'
require 'xml_instantiator_test/simple_ecore_model_checker'
module EmptyMM
end
module DefaultMM
module MNS
class Room < RGen::MetamodelBuilder::MMBase; end
end
class Person < RGen::MetamodelBuilder::MMBase; end
Person.one_to_one 'personalRoom', MNS::Room, 'inhabitant'
end
class XMLInstantiatorTest < Test::Unit::TestCase
XML_DIR = File.join(File.dirname(__FILE__),"testmodel")
include RGen::Util::ModelDumper
class MyInstantiator < RGen::Instantiator::DefaultXMLInstantiator
map_tag_ns "testmodel.org/myNamespace", DefaultMM::MNS
def class_name(str)
camelize(str)
end
# resolve :type do
# @env.find(:xmi_id => getType).first
# end
resolve_by_id :personalRoom, :id => :getId, :src => :room
end
class PruneTestInstantiator < RGen::Instantiator::NodebasedXMLInstantiator
attr_reader :max_depth
set_prune_level 2
def initialize(env)
super(env)
@max_depth = 0
end
def on_descent(node)
end
def on_ascent(node)
calc_max_depth(node, 0)
end
def calc_max_depth(node, offset)
if node.children.nil? || node.children.size == 0
@max_depth = offset if offset > @max_depth
else
node.children.each do |c|
calc_max_depth(c, offset+1)
end
end
end
end
module PruneTestMM
end
def test_pruning
env = RGen::Environment.new
# prune level 2 is set in the class body
inst = PruneTestInstantiator.new(env)
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
assert_equal 2, inst.max_depth
PruneTestInstantiator.set_prune_level(0)
inst = PruneTestInstantiator.new(env)
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
assert_equal 5, inst.max_depth
PruneTestInstantiator.set_prune_level(1)
inst = PruneTestInstantiator.new(env)
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
assert_equal 1, inst.max_depth
end
def test_custom
env = RGen::Environment.new
inst = MyInstantiator.new(env, DefaultMM, true)
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
house = env.find(:class => DefaultMM::MNS::House).first
assert_not_nil house
assert_equal 2, house.room.size
rooms = env.find(:class => DefaultMM::MNS::Room)
assert_equal 2, rooms.size
assert_equal 0, (house.room - rooms).size
rooms.each {|r| assert r.parent == house}
tomsRoom = rooms.select{|r| r.name == "TomsRoom"}.first
assert_not_nil tomsRoom
persons = env.find(:class => DefaultMM::Person)
assert_equal 4, persons.size
tom = persons.select{|p| p.name == "Tom"}.first
assert_not_nil tom
assert tom.personalRoom == tomsRoom
mpns = env.find(:class => DefaultMM::MultiPartName)
assert mpns.first.respond_to?("insideMultiPart")
end
def test_default
env = RGen::Environment.new
inst = RGen::Instantiator::DefaultXMLInstantiator.new(env, EmptyMM, true)
inst.instantiate_file(File.join(XML_DIR,"manual_testmodel.xml"))
house = env.find(:class => EmptyMM::MNS_House).first
assert_not_nil house
assert_equal 2, house.mNS_Room.size
assert_equal "before kitchen", remove_whitespace_elements(house.chardata)[0].strip
assert_equal "after kitchen", remove_whitespace_elements(house.chardata)[1].strip
assert_equal "after toms room", remove_whitespace_elements(house.chardata)[2].strip
rooms = env.find(:class => EmptyMM::MNS_Room)
assert_equal 2, rooms.size
assert_equal 0, (house.mNS_Room - rooms).size
rooms.each {|r| assert r.parent == house}
tomsRoom = rooms.select{|r| r.name == "TomsRoom"}.first
assert_not_nil tomsRoom
assert_equal "within toms room", remove_whitespace_elements(tomsRoom.chardata)[0]
persons = env.find(:class => EmptyMM::Person)
assert_equal 4, persons.size
tom = persons.select{|p| p.name == "Tom"}.first
assert_not_nil tom
end
def remove_whitespace_elements(elements)
elements.reject{|e| e.strip == ""}
end
include SimpleECoreModelChecker
def test_simle_xmi_ecore_instantiator
envECore = RGen::Environment.new
File.open(XML_DIR+"/ea_testmodel.xml") { |f|
SimpleXMIECoreInstantiator.new.instantiateECoreModel(envECore, f.read)
}
checkECoreModel(envECore)
end
end
rgen-0.6.6/test/util_test.rb 0000644 0001750 0001750 00000000160 12243455557 014175 0 ustar ssm ssm $:.unshift File.dirname(__FILE__)
require 'util/file_cache_map_test'
require 'util/pattern_matcher_test'
rgen-0.6.6/test/util/ 0000755 0001750 0001750 00000000000 12243455557 012614 5 ustar ssm ssm rgen-0.6.6/test/util/pattern_matcher_test.rb 0000644 0001750 0001750 00000004776 12243455557 017376 0 ustar ssm ssm $:.unshift(File.dirname(__FILE__)+"/../../lib")
require 'test/unit'
require 'rgen/environment'
require 'rgen/metamodel_builder'
require 'rgen/model_builder'
require 'rgen/util/pattern_matcher'
class PatternMatcherTest < Test::Unit::TestCase
module TestMM
extend RGen::MetamodelBuilder::ModuleExtension
class Node < RGen::MetamodelBuilder::MMBase
has_attr 'name', String
contains_many 'children', Node, 'parent'
end
end
def modelA
env = RGen::Environment.new
RGen::ModelBuilder.build(TestMM, env) do
node "A" do
node "AA"
end
node "B" do
node "B1"
node "B2"
node "B3"
end
node "C" do
node "C1"
node "C2"
end
node "D" do
node "DD"
end
end
env
end
def test_simple
matcher = RGen::Util::PatternMatcher.new
matcher.add_pattern("simple") do |env, c|
TestMM::Node.new(:name => "A", :children => [
TestMM::Node.new(:name => "AA")])
end
matcher.add_pattern("bad") do |env, c|
TestMM::Node.new(:name => "X")
end
env = modelA
match = matcher.find_pattern(env, "simple")
assert_not_nil match
assert_equal "A", match.root.name
assert_equal env.find(:class => TestMM::Node, :name => "A").first.object_id, match.root.object_id
assert_equal 2, match.elements.size
assert_equal [nil], match.bound_values
assert_nil matcher.find_pattern(env, "bad")
end
def test_value_binding
matcher = RGen::Util::PatternMatcher.new
matcher.add_pattern("single_child") do |env, name, child|
TestMM::Node.new(:name => name, :children => [ child ])
end
matcher.add_pattern("double_child") do |env, name, child1, child2|
TestMM::Node.new(:name => name, :children => [ child1, child2 ])
end
matcher.add_pattern("child_pattern") do |env, child_name|
TestMM::Node.new(:name => "A", :children => [
TestMM::Node.new(:name => child_name)])
end
env = modelA
match = matcher.find_pattern(env, "single_child")
assert_not_nil match
assert_equal "A", match.root.name
assert_equal "AA", match.bound_values[1].name
match = matcher.find_pattern(env, "single_child", "D")
assert_not_nil match
assert_equal "D", match.root.name
assert_equal "DD", match.bound_values[0].name
match = matcher.find_pattern(env, "double_child")
assert_not_nil match
assert_equal "C", match.root.name
match = matcher.find_pattern(env, "child_pattern")
assert_not_nil match
assert_equal ["AA"], match.bound_values
end
end
rgen-0.6.6/test/util/file_cache_map_test/ 0000755 0001750 0001750 00000000000 12243455557 016552 5 ustar ssm ssm rgen-0.6.6/test/util/file_cache_map_test/testdir/ 0000755 0001750 0001750 00000000000 12243455557 020230 5 ustar ssm ssm rgen-0.6.6/test/util/file_cache_map_test/testdir/fileA 0000644 0001750 0001750 00000000010 12243455557 021162 0 ustar ssm ssm somedata rgen-0.6.6/test/util/file_cache_map_test.rb 0000644 0001750 0001750 00000006270 12243455557 017104 0 ustar ssm ssm $:.unshift(File.dirname(__FILE__)+"/../../lib")
require 'test/unit'
require 'fileutils'
require 'rgen/util/file_cache_map'
class FileCacheMapTest < Test::Unit::TestCase
TestDir = File.dirname(__FILE__)+"/file_cache_map_test/testdir"
def setup
FileUtils.rm_r(Dir[TestDir+"/*"])
# * doesn't include dot files
FileUtils.rm_r(Dir[TestDir+"/.cache"])
@cm = RGen::Util::FileCacheMap.new(".cache", ".test")
end
def test_nocache
reasons = []
assert_equal(:invalid, @cm.load_data(TestDir+"/fileA", :invalidation_reasons => reasons))
assert_equal [:no_cachefile], reasons
end
def test_storeload
keyFile = TestDir+"/fileA"
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.store_data(keyFile, "valuedata")
assert(File.exist?(TestDir+"/.cache/fileA.test"))
assert_equal("valuedata", @cm.load_data(keyFile))
end
def test_storeload_subdir
keyFile = TestDir+"/subdir/fileA"
FileUtils.mkdir(TestDir+"/subdir")
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.store_data(keyFile, "valuedata")
assert(File.exist?(TestDir+"/subdir/.cache/fileA.test"))
assert_equal("valuedata", @cm.load_data(keyFile))
end
def test_storeload_postfix
keyFile = TestDir+"/fileB.txt"
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.store_data(keyFile, "valuedata")
assert(File.exist?(TestDir+"/.cache/fileB.txt.test"))
assert_equal("valuedata", @cm.load_data(keyFile))
end
def test_storeload_empty
keyFile = TestDir+"/fileA"
File.open(keyFile, "w") {|f| f.write("")}
@cm.store_data(keyFile, "valuedata")
assert(File.exist?(TestDir+"/.cache/fileA.test"))
assert_equal("valuedata", @cm.load_data(keyFile))
end
def test_corruptcache
keyFile = TestDir+"/fileA"
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.store_data(keyFile, "valuedata")
File.open(TestDir+"/.cache/fileA.test","a") {|f| f.write("more data")}
reasons = []
assert_equal(:invalid, @cm.load_data(keyFile, :invalidation_reasons => reasons))
assert_equal [:cachefile_corrupted], reasons
end
def test_changedcontent
keyFile = TestDir+"/fileA"
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.store_data(keyFile, "valuedata")
File.open(keyFile, "a") {|f| f.write("more data")}
reasons = []
assert_equal(:invalid, @cm.load_data(keyFile, :invalidation_reasons => reasons))
assert_equal [:keyfile_changed], reasons
end
def test_versioninfo
keyFile = TestDir+"/fileA"
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.version_info = "123"
@cm.store_data(keyFile, "valuedata")
assert(File.exist?(TestDir+"/.cache/fileA.test"))
assert_equal("valuedata", @cm.load_data(keyFile))
end
def test_changed_version
keyFile = TestDir+"/fileA"
File.open(keyFile, "w") {|f| f.write("somedata")}
@cm.version_info = "123"
@cm.store_data(keyFile, "valuedata")
@cm.version_info = "456"
reasons = []
assert_equal(:invalid, @cm.load_data(keyFile, :invalidation_reasons => reasons))
assert_equal [:keyfile_changed], reasons
end
end
rgen-0.6.6/test/transformer_test.rb 0000644 0001750 0001750 00000016407 12243455557 015575 0 ustar ssm ssm $:.unshift File.join(File.dirname(__FILE__),"..","lib")
$:.unshift File.join(File.dirname(__FILE__),"..","test")
require 'test/unit'
require 'rgen/transformer'
require 'rgen/environment'
require 'rgen/util/model_comparator'
require 'metamodels/uml13_metamodel'
require 'testmodel/class_model_checker'
class TransformerTest < Test::Unit::TestCase
class ModelIn
attr_accessor :name
end
class ModelInSub < ModelIn
end
class ModelAIn
attr_accessor :name
attr_accessor :modelB
end
class ModelBIn
attr_accessor :name
attr_accessor :modelA
end
class ModelCIn
attr_accessor :number
end
class ModelOut
attr_accessor :name
end
class ModelAOut
attr_accessor :name
attr_accessor :modelB
end
class ModelBOut
attr_accessor :name
attr_accessor :modelA
end
class ModelCOut
attr_accessor :number
end
class MyTransformer < RGen::Transformer
attr_reader :modelInTrans_count
attr_reader :modelAInTrans_count
attr_reader :modelBInTrans_count
transform ModelIn, :to => ModelOut do
# aribitrary ruby code may be placed before the hash creating the output element
@modelInTrans_count ||= 0; @modelInTrans_count += 1
{ :name => name }
end
transform ModelAIn, :to => ModelAOut do
@modelAInTrans_count ||= 0; @modelAInTrans_count += 1
{ :name => name, :modelB => trans(modelB) }
end
transform ModelBIn, :to => ModelBOut do
@modelBInTrans_count ||= 0; @modelBInTrans_count += 1
{ :name => name, :modelA => trans(modelA) }
end
transform ModelCIn, :to => ModelCOut, :if => :largeNumber do
# a method can be called anywhere in a transformer block
{ :number => duplicateNumber }
end
transform ModelCIn, :to => ModelCOut, :if => :smallNumber do
{ :number => number / 2 }
end
method :largeNumber do
number > 1000
end
method :smallNumber do
number < 500
end
method :duplicateNumber do
number * 2;
end
end
class MyTransformer2 < RGen::Transformer
# check that subclasses are independent (i.e. do not share the rules)
transform ModelIn, :to => ModelOut do
{ :name => name }
end
end
def test_transformer
from = ModelIn.new
from.name = "TestName"
env_out = RGen::Environment.new
t = MyTransformer.new(:env_in, env_out)
assert t.trans(from).is_a?(ModelOut)
assert_equal "TestName", t.trans(from).name
assert_equal 1, env_out.elements.size
assert_equal env_out.elements.first, t.trans(from)
assert_equal 1, t.modelInTrans_count
end
def test_transformer_chain
from = ModelIn.new
from.name = "Test1"
from2 = ModelIn.new
from2.name = "Test2"
from3 = ModelIn.new
from3.name = "Test3"
env_out = RGen::Environment.new
elementMap = {}
t1 = MyTransformer.new(:env_in, env_out, elementMap)
assert t1.trans(from).is_a?(ModelOut)
assert_equal "Test1", t1.trans(from).name
assert_equal 1, t1.modelInTrans_count
# modifying the element map means that following calls of +trans+ will be affected
assert_equal( {from => t1.trans(from)}, elementMap )
elementMap.merge!({from2 => :dummy})
assert_equal :dummy, t1.trans(from2)
# second transformer based on the element map of the first
t2 = MyTransformer.new(:env_in, env_out, elementMap)
# second transformer returns same objects
assert_equal t1.trans(from).object_id, t2.trans(from).object_id
assert_equal :dummy, t2.trans(from2)
# and no transformer rule is evaluated at this point
assert_equal nil, t2.modelInTrans_count
# now transform a new object in second transformer
assert t2.trans(from3).is_a?(ModelOut)
assert_equal "Test3", t2.trans(from3).name
assert_equal 1, t2.modelInTrans_count
# the first transformer returns the same object without evaluation of a transformer rule
assert_equal t1.trans(from3).object_id, t2.trans(from3).object_id
assert_equal 1, t1.modelInTrans_count
end
def test_transformer_subclass
from = ModelInSub.new
from.name = "TestName"
t = MyTransformer.new
assert t.trans(from).is_a?(ModelOut)
assert_equal "TestName", t.trans(from).name
assert_equal 1, t.modelInTrans_count
end
def test_transformer_array
froms = [ModelIn.new, ModelIn.new]
froms[0].name = "M1"
froms[1].name = "M2"
env_out = RGen::Environment.new
t = MyTransformer.new(:env_in, env_out)
assert t.trans(froms).is_a?(Array)
assert t.trans(froms)[0].is_a?(ModelOut)
assert_equal "M1", t.trans(froms)[0].name
assert t.trans(froms)[1].is_a?(ModelOut)
assert_equal "M2", t.trans(froms)[1].name
assert_equal 2, env_out.elements.size
assert (t.trans(froms)-env_out.elements).empty?
assert_equal 2, t.modelInTrans_count
end
def test_transformer_cyclic
# setup a cyclic dependency between fromA and fromB
fromA = ModelAIn.new
fromB = ModelBIn.new
fromA.modelB = fromB
fromA.name = "ModelA"
fromB.modelA = fromA
fromB.name = "ModelB"
env_out = RGen::Environment.new
t = MyTransformer.new(:env_in, env_out)
# check that trans resolves the cycle correctly (no endless loop)
# both elements, fromA and fromB will be transformed with the transformation
# of the first element, either fromA or fromB
assert t.trans(fromA).is_a?(ModelAOut)
assert_equal "ModelA", t.trans(fromA).name
assert t.trans(fromA).modelB.is_a?(ModelBOut)
assert_equal "ModelB", t.trans(fromA).modelB.name
assert_equal t.trans(fromA), t.trans(fromA).modelB.modelA
assert_equal t.trans(fromB), t.trans(fromA).modelB
assert_equal 2, env_out.elements.size
assert (env_out.elements - [t.trans(fromA), t.trans(fromB)]).empty?
assert_equal 1, t.modelAInTrans_count
assert_equal 1, t.modelBInTrans_count
end
def test_transformer_conditional
froms = [ModelCIn.new, ModelCIn.new, ModelCIn.new]
froms[0].number = 100
froms[1].number = 1000
froms[2].number = 2000
env_out = RGen::Environment.new
t = MyTransformer.new(:env_in, env_out)
assert t.trans(froms).is_a?(Array)
assert_equal 2, t.trans(froms).size
# this one matched the smallNumber rule
assert t.trans(froms[0]).is_a?(ModelCOut)
assert_equal 50, t.trans(froms[0]).number
# this one did not match any rule
assert t.trans(froms[1]).nil?
# this one matched the largeNumber rule
assert t.trans(froms[2]).is_a?(ModelCOut)
assert_equal 4000, t.trans(froms[2]).number
# elements in environment are the same as the ones returned
assert_equal 2, env_out.elements.size
assert (t.trans(froms)-env_out.elements).empty?
end
class CopyTransformer < RGen::Transformer
include UML13
def transform
trans(:class => UML13::Package)
end
UML13.ecore.eClassifiers.each do |c|
copy c.instanceClass
end
end
MODEL_DIR = File.join(File.dirname(__FILE__),"testmodel")
include Testmodel::ClassModelChecker
include RGen::Util::ModelComparator
def test_copyTransformer
envIn = RGen::Environment.new
envOut = RGen::Environment.new
EASupport.instantiateUML13FromXMI11(envIn, MODEL_DIR+"/ea_testmodel.xml")
CopyTransformer.new(envIn, envOut).transform
checkClassModel(envOut)
assert modelEqual?(
envIn.find(:class => UML13::Model).first,
envOut.find(:class => UML13::Model).first)
end
end
rgen-0.6.6/test/testmodel/ 0000755 0001750 0001750 00000000000 12243455557 013637 5 ustar ssm ssm rgen-0.6.6/test/testmodel/object_model_checker.rb 0000644 0001750 0001750 00000004637 12243455557 020310 0 ustar ssm ssm require 'metamodels/uml13_metamodel'
require 'metamodels/uml13_metamodel_ext'
module Testmodel
# Checks the UML Object model elements from the example model
#
module ObjectModelChecker
# convenient extension for this test only
module UML13::ClassifierRole::ClassModule
def classname
taggedValue.find{|tv| tv.tag == "classname"}.value
end
end
def checkObjectModel(envUML)
# check main package
mainPackage = envUML.find(:class => UML13::Package, :name => "HouseExampleModel").first
assert_not_nil mainPackage
eaRootCollaboration = mainPackage.ownedElement.find{|e| e.is_a?(UML13::Collaboration) && e.name == "Collaborations"}
assert_not_nil eaRootCollaboration
# check main package objects
objects = eaRootCollaboration.ownedElement.select{|e| e.is_a?(UML13::ClassifierRole)}
assert_equal 6, objects.size
someone = objects.find{|o| o.name == "Someone"}
assert_equal "Person", someone.classname
someonesHouse = objects.find{|o| o.name == "SomeonesHouse"}
assert_equal "House", someonesHouse.classname
greenRoom = objects.find{|o| o.name == "GreenRoom"}
assert_equal "Room", greenRoom.classname
yellowRoom = objects.find{|o| o.name == "YellowRoom"}
assert_equal "Room", yellowRoom.classname
hotRoom = objects.find{|o| o.name == "HotRoom"}
assert_equal "Kitchen", hotRoom.classname
wetRoom = objects.find{|o| o.name == "WetRoom"}
assert_equal "Bathroom", wetRoom.classname
# Someone to SomeonesHouse
assert someone.associationEnd.otherEnd.getType.is_a?(Array)
assert_equal 1, someone.associationEnd.otherEnd.getType.size
houseEnd = someone.associationEnd.otherEnd[0]
assert_equal someonesHouse.object_id, houseEnd.getType.object_id
assert_equal "home", houseEnd.name
# Someone to SomeonesHouse
assert someonesHouse.localCompositeEnd.otherEnd.is_a?(Array)
assert_equal 4, someonesHouse.localCompositeEnd.otherEnd.size
assert someonesHouse.localCompositeEnd.otherEnd.all?{|e| e.name == "room"}
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == yellowRoom}
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == greenRoom}
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == hotRoom}
assert_not_nil someonesHouse.localCompositeEnd.otherEnd.getType.find{|o| o == wetRoom}
end
end
end rgen-0.6.6/test/testmodel/manual_testmodel.xml 0000644 0001750 0001750 00000001003 12243455557 017710 0 ustar ssm ssm
before kitchen
after kitchen
within toms room
after toms room
rgen-0.6.6/test/testmodel/ecore_model_checker.rb 0000644 0001750 0001750 00000010277 12243455557 020134 0 ustar ssm ssm require 'rgen/ecore/ecore'
module Testmodel
# Checks the ECore model elements created by transformation from the
# UML Class model elements from the example model
#
module ECoreModelChecker
include RGen::ECore
def checkECoreModel(env)
# check main package
mainPackage = env.elements.select {|e| e.is_a? EPackage and e.name == "HouseMetamodel"}.first
assert_not_nil mainPackage
# check Rooms package
assert mainPackage.eSubpackages.is_a?(Array)
assert_equal 1, mainPackage.eSubpackages.size
assert mainPackage.eSubpackages[0].is_a?(EPackage)
roomsPackage = mainPackage.eSubpackages[0]
assert_equal "Rooms", roomsPackage.name
# check main package classes
assert mainPackage.eClassifiers.is_a?(Array)
assert_equal 4, mainPackage.eClassifiers.size
assert mainPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
houseClass = mainPackage.eClassifiers.select{|c| c.name == "House"}.first
personClass = mainPackage.eClassifiers.select{|c| c.name == "Person"}.first
meetingPlaceClass = mainPackage.eClassifiers.select{|c| c.name == "MeetingPlace"}.first
cookingPlaceInterface = mainPackage.eClassifiers.select{|c| c.name == "CookingPlace"}.first
assert_not_nil houseClass
assert_not_nil personClass
assert_not_nil meetingPlaceClass
assert_not_nil cookingPlaceInterface
# check Rooms package classes
assert roomsPackage.eClassifiers.is_a?(Array)
assert_equal 3, roomsPackage.eClassifiers.size
assert roomsPackage.eClassifiers.all?{|c| c.is_a?(EClass)}
roomClass = roomsPackage.eClassifiers.select{|c| c.name == "Room"}.first
kitchenClass = roomsPackage.eClassifiers.select{|c| c.name == "Kitchen"}.first
bathroomClass = roomsPackage.eClassifiers.select{|c| c.name == "Bathroom"}.first
assert_not_nil roomClass
assert_not_nil kitchenClass
assert_not_nil bathroomClass
# check Room inheritance
assert kitchenClass.eSuperTypes.is_a?(Array)
assert_equal 3, kitchenClass.eSuperTypes.size
assert_equal roomClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "Room"}.first.object_id
assert_equal meetingPlaceClass.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "MeetingPlace"}.first.object_id
assert_equal cookingPlaceInterface.object_id, kitchenClass.eSuperTypes.select{|c| c.name == "CookingPlace"}.first.object_id
assert bathroomClass.eSuperTypes.is_a?(Array)
assert_equal 1, bathroomClass.eSuperTypes.size
assert_equal roomClass.object_id, bathroomClass.eSuperTypes[0].object_id
# check House-Room "part of" association
assert houseClass.eAllContainments.eType.is_a?(Array)
assert_equal 1, houseClass.eAllContainments.eType.size
roomRef = houseClass.eAllContainments.first
assert_equal roomClass.object_id, roomRef.eType.object_id
assert_equal "room", roomRef.name
assert_equal 1, roomRef.lowerBound
assert_equal(-1, roomRef.upperBound)
assert_not_nil roomRef.eOpposite
assert_equal houseClass.object_id, roomRef.eOpposite.eType.object_id
partOfRefs = roomClass.eReferences.select{|r| r.eOpposite && r.eOpposite.containment}
assert_equal 1, partOfRefs.size
assert_equal houseClass.object_id, partOfRefs.first.eType.object_id
assert_equal "house", partOfRefs.first.name
assert_equal roomRef.object_id, partOfRefs.first.eOpposite.object_id
# check House OUT associations
assert houseClass.eReferences.is_a?(Array)
assert_equal 3, houseClass.eReferences.size
bathRef = houseClass.eReferences.find {|e| e.name == "bathroom"}
kitchenRef = houseClass.eReferences.find {|e| e.name == "kitchen"}
roomRef = houseClass.eReferences.find {|e| e.name == "room"}
assert_not_nil bathRef
assert_nil bathRef.eOpposite
assert_not_nil kitchenRef
assert_not_nil roomRef
assert_equal 1, kitchenRef.lowerBound
assert_equal 1, kitchenRef.upperBound
assert_equal 1, roomRef.lowerBound
assert_equal(-1, roomRef.upperBound)
# check House IN associations
houseInRefs = env.find(:class => EReference, :eType => houseClass)
assert_equal 3, houseInRefs.size
homeEnd = houseInRefs.find{|e| e.name == "home"}
assert_not_nil homeEnd
assert_equal 0, homeEnd.lowerBound
assert_equal(-1, homeEnd.upperBound)
end
end
end rgen-0.6.6/test/testmodel/ea_testmodel_regenerated.xml 0000644 0001750 0001750 00000215570 12243455557 021405 0 ustar ssm ssm
Enterprise Architect
2.5
rgen-0.6.6/test/testmodel/ea_testmodel_partial.xml 0000644 0001750 0001750 00000052440 12243455557 020547 0 ustar ssm ssm
Enterprise Architect
2.5
rgen-0.6.6/test/testmodel/ea_testmodel.xml 0000644 0001750 0001750 00000215310 12243455557 017030 0 ustar ssm ssm
Enterprise Architect
2.5
HouseMetamodel
Rooms
HouseExampleModel
rgen-0.6.6/test/testmodel/ea_testmodel.eap 0000644 0001750 0001750 00004614000 12243455557 017000 0 ustar ssm ssm Standard Jet DB µnb` ÂUé©gr@? œ~Ÿÿ…š1Åyºí0¼ßÌcÙíÇŸFûмN†ûì7]DœúÆ^(æ¶Š`T”{6õß±wôCϯ±34ay[’µ|*ñ|™˜ýOJ”l>`&_•øÐ‰$…gÆ'DÒîÏeíÿÇF¡xíé- ¸ è {ö % Ê
&