File: class_model_checker.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 (119 lines) | stat: -rw-r--r-- 5,218 bytes parent folder | download | duplicates (3)
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
require 'metamodels/uml13_metamodel'
require 'metamodels/uml13_metamodel_ext'

module Testmodel

# Checks the UML Class model elements from the example model
# 
module ClassModelChecker			
    
	def checkClassModel(envUML)
						
		# check main package
		mainPackage = envUML.find(:class => UML13::Package, :name => "HouseMetamodel").first
		assert mainPackage != nil
		
		# check Rooms package
		subs = mainPackage.ownedElement.select{|e| e.is_a?(UML13::Package)}
		assert_equal 1, subs.size
		roomsPackage = subs.first
		assert_equal "Rooms", roomsPackage.name
		
		# check main package classes
		classes = mainPackage.ownedElement.select{|e| e.is_a?(UML13::Class)}
		assert_equal 3, classes.size
		houseClass = classes.find{|c| c.name == "House"}
		personClass = classes.find{|c| c.name == "Person"}
		meetingPlaceClass = classes.find{|c| c.name == "MeetingPlace"}
		cookingPlaceInterface = mainPackage.ownedElement.find{|e| e.is_a?(UML13::Interface) && e.name == "CookingPlace"}
		assert houseClass != nil
		assert personClass != nil
		assert meetingPlaceClass != nil
        assert cookingPlaceInterface != nil

		# check Rooms package classes
		classes = roomsPackage.ownedElement.select{|e| e.is_a?(UML13::Class)}
		assert_equal 3, classes.size
		roomClass = classes.find{|c| c.name == "Room"}
		kitchenClass = classes.find{|c| c.name == "Kitchen"}
		bathroomClass = classes.find{|c| c.name == "Bathroom"}
		assert roomClass != nil
		assert kitchenClass != nil
		assert bathroomClass != nil
		
		# check Room inheritance
		assert_equal 2, roomClass.specialization.child.size
		assert nil != roomClass.specialization.child.find{|c| c.name == "Kitchen"}
		assert nil != roomClass.specialization.child.find{|c| c.name == "Bathroom"}
		assert_equal 2, kitchenClass.generalization.parent.size
		assert_equal roomClass.object_id, kitchenClass.generalization.parent.find{|c| c.name == "Room"}.object_id
		assert_equal meetingPlaceClass.object_id, kitchenClass.generalization.parent.find{|c| c.name == "MeetingPlace"}.object_id
		assert_equal 1, bathroomClass.generalization.parent.size
		assert_equal roomClass.object_id, bathroomClass.generalization.parent.first.object_id
		assert nil != kitchenClass.clientDependency.find{|d| d.stereotype.name == "implements"}
        assert_equal cookingPlaceInterface.object_id, kitchenClass.clientDependency.supplier.find{|c| c.name == "CookingPlace"}.object_id
        assert_equal kitchenClass.object_id, cookingPlaceInterface.supplierDependency.client.find{|c| c.name == "Kitchen"}.object_id

		# check House-Room "part of" association
		assert_equal 1, houseClass.localCompositeEnd.size
		roomEnd = houseClass.localCompositeEnd.first.otherEnd
		assert_equal UML13::Association, roomEnd.association.class
		assert_equal roomClass.object_id, roomEnd.type.object_id
		assert_equal "room", roomEnd.name
		assert_equal UML13::Multiplicity, roomEnd.multiplicity.class
		assert_equal "1", roomEnd.multiplicity.range.first.lower
		assert_equal "*", roomEnd.multiplicity.range.first.upper
		
		assert_equal 1, roomClass.remoteCompositeEnd.size
		assert_equal houseClass.object_id, roomClass.remoteCompositeEnd.first.type.object_id
		assert_equal "house", roomClass.remoteCompositeEnd.first.name
				
		# check House OUT associations
		assert_equal 2, houseClass.remoteNavigableEnd.size
		bathEnd = houseClass.remoteNavigableEnd.find{|e| e.name == "bathroom"}
		kitchenEnd = houseClass.remoteNavigableEnd.find{|e| e.name== "kitchen"}
		assert bathEnd != nil
		assert kitchenEnd != nil
		assert_equal UML13::Association, bathEnd.association.class
		assert_equal UML13::Association, kitchenEnd.association.class
		assert_equal "1", kitchenEnd.multiplicity.range.first.lower
		assert_equal "1", kitchenEnd.multiplicity.range.first.upper
		
		# check House IN associations
		assert_equal 3, houseClass.localNavigableEnd.size
		homeEnd = houseClass.localNavigableEnd.find{|e| e.name == "home"}
		assert homeEnd != nil
		assert_equal UML13::Association, homeEnd.association.class
		assert_equal "0", homeEnd.multiplicity.range.first.lower
		assert_equal "*", homeEnd.multiplicity.range.first.upper
		
		# check House all associations
		assert_equal 4, houseClass.associationEnd.size
	end

    def checkClassModelPartial(envUML)
        # HouseMetamodel package is not part of the partial export
		mainPackage = envUML.find(:class => UML13::Package, :name => "HouseMetamodel").first
		assert_nil mainPackage
		
		roomsPackage = envUML.find(:class => UML13::Package, :name => "Rooms").first
		assert roomsPackage != nil
		
		roomClass = envUML.find(:class => UML13::Class, :name => "Room").first
		assert roomClass != nil
		
		# House is created from an EAStub
		houseClass = roomClass.remoteCompositeEnd.first.type
		assert houseClass != nil
		assert_equal "House", houseClass.name
        # House is not in a package since it's just a stub
		assert houseClass.namespace.nil?
		
		# in the partial model, House has only 3 (not 4) associations
		# since the fourth class (Person) is not in Rooms package
		assert_equal 3, houseClass.associationEnd.size
    end
    
end

end