File: xml_instantiator_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 (160 lines) | stat: -rw-r--r-- 4,839 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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
$:.unshift File.join(File.dirname(__FILE__),"..","lib")

require 'minitest/autorun'
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 < Minitest::Test

  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 house != nil
    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 tomsRoom != nil
    
    persons = env.find(:class => DefaultMM::Person)
    assert_equal 4, persons.size
    tom = persons.select{|p| p.name == "Tom"}.first
    assert tom != nil
    
    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 house != nil
    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 tomsRoom != nil
    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 tom != nil
  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