File: metamodel_order_test.rb

package info (click to toggle)
ruby-rgen 0.10.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,428 kB
  • sloc: ruby: 11,344; xml: 1,368; yacc: 72; makefile: 10
file content (131 lines) | stat: -rw-r--r-- 5,661 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
$:.unshift File.join(File.dirname(__FILE__),"..","lib")

require 'minitest/autorun'
require 'rgen/ecore/ecore'
require 'rgen/array_extensions'

class MetamodelOrderTest < Minitest::Test
	include RGen::ECore
	
  module TestMM1
    extend RGen::MetamodelBuilder::ModuleExtension

    class Class11 < RGen::MetamodelBuilder::MMBase
    end

    module Module11
      extend RGen::MetamodelBuilder::ModuleExtension

      DataType111 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType111" ,:literals => {:b => 1})
      DataType112 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType112", :literals => {:b => 1})

      class Class111 < RGen::MetamodelBuilder::MMBase
      end
      
      # anonymous classes won't be handled by the order helper, but will be in eClassifiers
      Class112 = Class.new(RGen::MetamodelBuilder::MMBase)

      # classes that are not MMBase won't be handled
      class Class113 
      end

      # modules that are not extended by the ModuleExtension are not handled
      module Module111
      end

      # however it can be extendend later on
      module Module112
        # this one is not handled by the order helper since Module112 doesn't have the ModuleExtension yet
        # however, it will be in eClassifiers
        class Class1121 < RGen::MetamodelBuilder::MMBase
        end
      end
      # this datatype must be in Module11 not Module112
      DataType113 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType113", :literals => {:b => 1})

      Module112.extend(RGen::MetamodelBuilder::ModuleExtension)
      # this datatype must be in Module11 not Module112
      DataType114 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType114", :literals => {:b => 1})
      module Module112
        # this one is handled because now Module112 is extended
        class Class1122 < RGen::MetamodelBuilder::MMBase
        end
      end

      DataType115 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType115", :literals => {:b => 1})
      DataType116 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType116", :literals => {:b => 1})
    end

    DataType11 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType11", :literals => {:a => 1})

    class Class12 < RGen::MetamodelBuilder::MMBase
    end

    class Class13 < RGen::MetamodelBuilder::MMBase
    end
  end

  # datatypes outside of a module won't be handled
  DataType1 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType1", :literals => {:b => 1})

  # classes outside of a module won't be handled
  class Class1 < RGen::MetamodelBuilder::MMBase
  end

  module TestMM2
    extend RGen::MetamodelBuilder::ModuleExtension
  
    TestMM1::Module11.extend(RGen::MetamodelBuilder::ModuleExtension)
    # this is a critical case: because of the previous extension of Module11 which is in a different
    # hierarchy, DataType21 is looked for in Module11 and its parents; finally it is not
    # found and the definition is ignored for order calculation
    DataType21 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType21", :literals => {:b => 1})

    module Module21
      extend RGen::MetamodelBuilder::ModuleExtension
    end

    module Module22
      extend RGen::MetamodelBuilder::ModuleExtension
    end

    module Module23
      extend RGen::MetamodelBuilder::ModuleExtension
    end

    # if there is no other class or module after the last datatype, it won't show up in _constantOrder
    # however, the order of eClassifiers can still be reconstructed
    # note that this can not be tested if the test is executed as part of the whole testsuite 
    # since there will be classes and modules created within other test files
    DataType22 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType22", :literals => {:b => 1})
  end

  def test_constant_order
    assert_equal ["Class11", "Module11", "DataType11", "Class12", "Class13"], TestMM1._constantOrder
    assert_equal ["DataType111", "DataType112", "Class111", "DataType113", "Module112", "DataType114", "DataType115", "DataType116"], TestMM1::Module11._constantOrder
    assert_equal ["Class1122"], TestMM1::Module11::Module112._constantOrder
    if File.basename($0) == "metamodel_order_test.rb"
      # this won't work if run in the whole test suite (see comment at DataType22)
      assert_equal ["Module21", "Module22", "Module23"], TestMM2._constantOrder
    end
  end

  def test_classifier_order
    # eClassifiers also contains the ones which where ignored in order calculation, these are expected at the end
    # (in an arbitrary order)
    assert_equal ["Class11", "DataType11", "Class12", "Class13"], TestMM1.ecore.eClassifiers.name
    assert_equal ["DataType111", "DataType112", "Class111", "DataType113", "DataType114", "DataType115", "DataType116", "Class112"], TestMM1::Module11.ecore.eClassifiers.name
    assert_equal ["Class1122", "Class1121"], TestMM1::Module11::Module112.ecore.eClassifiers.name
    # no classifiers in TestMM2._constantOrder, so the datatypes can appear in arbitrary order
    assert_equal ["DataType21","DataType22"], TestMM2.ecore.eClassifiers.name.sort
  end

  def test_subpackage_order
    assert_equal ["Module11"], TestMM1.ecore.eSubpackages.name
    assert_equal ["Module112"], TestMM1::Module11.ecore.eSubpackages.name
    assert_equal [], TestMM1::Module11::Module112.ecore.eSubpackages.name
    assert_equal ["Module21", "Module22", "Module23"], TestMM2.ecore.eSubpackages.name
  end
end