virtualbox 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +9 -9
- data/VERSION +1 -1
- data/docs/GettingStarted.md +11 -11
- data/docs/WhatsNew.md +1 -1
- data/lib/virtualbox.rb +10 -1
- data/lib/virtualbox/abstract_model.rb +47 -29
- data/lib/virtualbox/abstract_model/attributable.rb +16 -16
- data/lib/virtualbox/abstract_model/dirty.rb +10 -10
- data/lib/virtualbox/abstract_model/relatable.rb +22 -22
- data/lib/virtualbox/abstract_model/validatable.rb +4 -4
- data/lib/virtualbox/attached_device.rb +23 -23
- data/lib/virtualbox/command.rb +9 -9
- data/lib/virtualbox/dvd.rb +7 -7
- data/lib/virtualbox/ext/subclass_listing.rb +1 -1
- data/lib/virtualbox/extra_data.rb +17 -17
- data/lib/virtualbox/forwarded_port.rb +23 -23
- data/lib/virtualbox/hard_drive.rb +27 -27
- data/lib/virtualbox/image.rb +25 -18
- data/lib/virtualbox/nic.rb +22 -22
- data/lib/virtualbox/proxies/collection.rb +4 -4
- data/lib/virtualbox/shared_folder.rb +25 -25
- data/lib/virtualbox/storage_controller.rb +16 -16
- data/lib/virtualbox/vm.rb +95 -42
- data/test/virtualbox/abstract_model/attributable_test.rb +28 -28
- data/test/virtualbox/abstract_model/dirty_test.rb +13 -13
- data/test/virtualbox/abstract_model/relatable_test.rb +36 -36
- data/test/virtualbox/abstract_model/validatable_test.rb +22 -22
- data/test/virtualbox/abstract_model_test.rb +46 -36
- data/test/virtualbox/attached_device_test.rb +47 -47
- data/test/virtualbox/command_test.rb +12 -12
- data/test/virtualbox/dvd_test.rb +15 -19
- data/test/virtualbox/ext/subclass_listing_test.rb +2 -2
- data/test/virtualbox/extra_data_test.rb +37 -37
- data/test/virtualbox/forwarded_port_test.rb +31 -31
- data/test/virtualbox/hard_drive_test.rb +40 -48
- data/test/virtualbox/image_test.rb +36 -33
- data/test/virtualbox/nic_test.rb +22 -22
- data/test/virtualbox/proxies/collection_test.rb +6 -6
- data/test/virtualbox/shared_folder_test.rb +36 -36
- data/test/virtualbox/storage_controller_test.rb +14 -14
- data/test/virtualbox/vm_test.rb +121 -70
- data/test/virtualbox_test.rb +19 -0
- data/virtualbox.gemspec +5 -3
- metadata +4 -2
@@ -3,38 +3,38 @@ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
3
3
|
class DirtyTest < Test::Unit::TestCase
|
4
4
|
class DirtyModel
|
5
5
|
include VirtualBox::AbstractModel::Dirty
|
6
|
-
|
6
|
+
|
7
7
|
def initialize
|
8
8
|
@foo = "foo"
|
9
9
|
@bar = "bar"
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def foo=(value)
|
13
13
|
set_dirty!(:foo, @foo, value)
|
14
14
|
@foo = value
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def bar=(value)
|
18
18
|
set_dirty!(:bar, @bar, value)
|
19
19
|
@bar = value
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
context "dirty attributes" do
|
24
24
|
setup do
|
25
25
|
@model = DirtyModel.new
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
should "not be dirty initially" do
|
29
29
|
assert !@model.changed?
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
should "be dirty after changing an attribute" do
|
33
33
|
assert !@model.changed? # sanity
|
34
34
|
@model.foo = "my value"
|
35
35
|
assert @model.changed?
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
should "be able to clear dirty state" do
|
39
39
|
assert !@model.changed?
|
40
40
|
@model.foo = "my value"
|
@@ -42,7 +42,7 @@ class DirtyTest < Test::Unit::TestCase
|
|
42
42
|
@model.clear_dirty!(:foo)
|
43
43
|
assert !@model.changed?
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
should "be able to clear dirty state on entire model" do
|
47
47
|
@model.foo = "changed"
|
48
48
|
@model.bar = "changed"
|
@@ -50,7 +50,7 @@ class DirtyTest < Test::Unit::TestCase
|
|
50
50
|
@model.clear_dirty!
|
51
51
|
assert !@model.changed?
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
should "show changes on specific field" do
|
55
55
|
assert !@model.changed?
|
56
56
|
@model.foo = "my value"
|
@@ -58,24 +58,24 @@ class DirtyTest < Test::Unit::TestCase
|
|
58
58
|
assert_equal ["foo", "my value"], @model.foo_change
|
59
59
|
assert_equal "foo", @model.foo_was
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
should "return nil for field_was if its not changed" do
|
63
63
|
assert !@model.foo_changed?
|
64
64
|
assert_nil @model.foo_was
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
should "show changes for the whole model" do
|
68
68
|
assert !@model.changed?
|
69
69
|
@model.foo = "foo2"
|
70
70
|
@model.bar = "bar2"
|
71
|
-
|
71
|
+
|
72
72
|
assert @model.changed?
|
73
73
|
changes = @model.changes
|
74
74
|
assert_equal 2, changes.length
|
75
75
|
assert_equal ["foo", "foo2"], changes[:foo]
|
76
76
|
assert_equal ["bar", "bar2"], changes[:bar]
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
should "still forward non-dirty magic methods up method_missing" do
|
80
80
|
assert_raises(NoMethodError) { @model.foobarbaz }
|
81
81
|
end
|
@@ -10,120 +10,120 @@ class RelatableTest < Test::Unit::TestCase
|
|
10
10
|
def self.set_relationship(caller, old_value, new_value)
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
class RelatableModel
|
15
15
|
include VirtualBox::AbstractModel::Relatable
|
16
|
-
|
16
|
+
|
17
17
|
relationship :foos, Relatee
|
18
18
|
relationship :bars, BarRelatee
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
setup do
|
22
22
|
@data = {}
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
context "class methods" do
|
26
26
|
should "read back relationships in order added" do
|
27
27
|
order = mock("order")
|
28
28
|
order_seq = sequence("order_seq")
|
29
29
|
order.expects(:foos).in_sequence(order_seq)
|
30
30
|
order.expects(:bars).in_sequence(order_seq)
|
31
|
-
|
31
|
+
|
32
32
|
RelatableModel.relationships.each do |name, options|
|
33
33
|
order.send(name)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
context "setting a relationship" do
|
39
39
|
setup do
|
40
40
|
@model = RelatableModel.new
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
should "have a magic method relationship= which calls set_relationship" do
|
44
44
|
@model.expects(:set_relationship).with(:foos, "FOOS!")
|
45
45
|
@model.foos = "FOOS!"
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
should "raise a NonSettableRelationshipException if relationship can't be set" do
|
49
49
|
assert_raises(VirtualBox::Exceptions::NonSettableRelationshipException) {
|
50
50
|
@model.foos = "FOOS!"
|
51
51
|
}
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
should "call set_relationship on the relationship class" do
|
55
55
|
BarRelatee.expects(:populate_relationship).returns("foo")
|
56
56
|
@model.populate_relationships({})
|
57
|
-
|
57
|
+
|
58
58
|
BarRelatee.expects(:set_relationship).with(@model, "foo", "bars")
|
59
59
|
assert_nothing_raised { @model.bars = "bars" }
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
should "set the result of set_relationship as the new relationship data" do
|
63
63
|
BarRelatee.stubs(:set_relationship).returns("hello")
|
64
64
|
@model.bars = "zoo"
|
65
65
|
assert_equal "hello", @model.bars
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
context "subclasses" do
|
70
70
|
class SubRelatableModel < RelatableModel
|
71
71
|
relationship :bars, RelatableTest::Relatee
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
setup do
|
75
75
|
@relationships = SubRelatableModel.relationships
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
should "inherit relationships of parent" do
|
79
79
|
assert SubRelatableModel.has_relationship?(:foos)
|
80
80
|
assert SubRelatableModel.has_relationship?(:bars)
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
should "inherit options of relationships" do
|
84
84
|
assert_equal Relatee, SubRelatableModel.relationships_hash[:foos][:klass]
|
85
85
|
end
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
context "default callbacks" do
|
89
89
|
setup do
|
90
90
|
@model = RelatableModel.new
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
should "not raise an error if populate_relationship doesn't exist" do
|
94
94
|
assert !BarRelatee.respond_to?(:populate_relationship)
|
95
95
|
assert_nothing_raised { @model.populate_relationships(nil) }
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
should "not raise an error when saving relationships if the callback doesn't exist" do
|
99
99
|
assert !Relatee.respond_to?(:save_relationship)
|
100
100
|
assert_nothing_raised { @model.save_relationships }
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
should "not raise an error in destroying relationships if the callback doesn't exist" do
|
104
104
|
assert !Relatee.respond_to?(:destroy_relationship)
|
105
105
|
assert_nothing_raised { @model.destroy_relationships }
|
106
106
|
end
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
context "destroying" do
|
110
110
|
setup do
|
111
111
|
@model = RelatableModel.new
|
112
112
|
@model.populate_relationships({})
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
context "a single relationship" do
|
116
116
|
should "call destroy_relationship only for the given relationship" do
|
117
117
|
Relatee.expects(:destroy_relationship).once
|
118
118
|
BarRelatee.expects(:destroy_relationship).never
|
119
119
|
@model.destroy_relationship(:foos)
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
should "forward any args passed into destroy_relationship" do
|
123
123
|
Relatee.expects(:destroy_relationship).with(@model, anything, "HELLO").once
|
124
124
|
@model.destroy_relationship(:foos, "HELLO")
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
should "pass the data into destroy_relationship" do
|
128
128
|
Relatee.expects(:destroy_relationship).with(@model, "FOO").once
|
129
129
|
@model.destroy_relationship(:foos)
|
@@ -135,69 +135,69 @@ class RelatableTest < Test::Unit::TestCase
|
|
135
135
|
Relatee.expects(:destroy_relationship).with(@model, anything).once
|
136
136
|
@model.destroy_relationships
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
should "forward any args passed into destroy relationships" do
|
140
140
|
Relatee.expects(:destroy_relationship).with(@model, anything, "HELLO").once
|
141
141
|
@model.destroy_relationships("HELLO")
|
142
142
|
end
|
143
143
|
end
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
context "saving relationships" do
|
147
147
|
setup do
|
148
148
|
@model = RelatableModel.new
|
149
149
|
end
|
150
|
-
|
150
|
+
|
151
151
|
should "call save_relationship on the related class" do
|
152
152
|
Relatee.expects(:save_relationship).with(@model, @model.foos).once
|
153
153
|
@model.save_relationships
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
should "forward parameters through" do
|
157
157
|
Relatee.expects(:save_relationship).with(@model, @model.foos, "YES").once
|
158
158
|
@model.save_relationships("YES")
|
159
159
|
end
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
context "reading relationships" do
|
163
163
|
setup do
|
164
164
|
@model = RelatableModel.new
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
should "provide a read method for relationships" do
|
168
168
|
assert_nothing_raised { @model.foos }
|
169
169
|
end
|
170
170
|
end
|
171
|
-
|
171
|
+
|
172
172
|
context "checking for relationships" do
|
173
173
|
setup do
|
174
174
|
@model = RelatableModel.new
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
should "have a class method as well" do
|
178
178
|
assert RelatableModel.has_relationship?(:foos)
|
179
179
|
assert !RelatableModel.has_relationship?(:bazs)
|
180
180
|
end
|
181
|
-
|
181
|
+
|
182
182
|
should "return true for existing relationships" do
|
183
183
|
assert @model.has_relationship?(:foos)
|
184
184
|
end
|
185
|
-
|
185
|
+
|
186
186
|
should "return false for nonexistent relationships" do
|
187
187
|
assert !@model.has_relationship?(:bazs)
|
188
188
|
end
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
context "populating relationships" do
|
192
192
|
setup do
|
193
193
|
@model = RelatableModel.new
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
should "call populate_relationship on the related class" do
|
197
197
|
Relatee.expects(:populate_relationship).with(@model, @data).once
|
198
198
|
@model.populate_relationships(@data)
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
should "properly save returned value as the value for the relationship" do
|
202
202
|
Relatee.expects(:populate_relationship).once.returns("HEY")
|
203
203
|
@model.populate_relationships(@data)
|
@@ -3,27 +3,27 @@ require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
|
|
3
3
|
class ValidatableTest < Test::Unit::TestCase
|
4
4
|
class ValidatableModel
|
5
5
|
include VirtualBox::AbstractModel::Validatable
|
6
|
-
|
6
|
+
|
7
7
|
attr_accessor :foos
|
8
8
|
attr_accessor :bars
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
context "errors" do
|
12
12
|
setup do
|
13
13
|
@model = ValidatableModel.new
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
should "have no errors by default" do
|
17
17
|
assert @model.errors.empty?
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
should "be able to add errors" do
|
21
21
|
@model.add_error(:foo, "is blank")
|
22
22
|
assert !@model.errors.empty?
|
23
23
|
assert !@model.errors[:foo].nil?
|
24
24
|
assert_equal "is blank", @model.errors[:foo].first
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
should "be able to add multiple errors" do
|
28
28
|
@model.add_error(:foo, "foo")
|
29
29
|
@model.add_error(:foo, "bar")
|
@@ -31,7 +31,7 @@ class ValidatableTest < Test::Unit::TestCase
|
|
31
31
|
assert !@model.errors[:foo].nil?
|
32
32
|
assert_equal 2, @model.errors[:foo].length
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
should "be able to clear errors" do
|
36
36
|
@model.add_error(:foo, "foo")
|
37
37
|
assert !@model.errors.empty?
|
@@ -39,82 +39,82 @@ class ValidatableTest < Test::Unit::TestCase
|
|
39
39
|
assert @model.errors.empty?
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
context "validity" do
|
44
44
|
setup do
|
45
45
|
@model = ValidatableModel.new
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
should "call validate on valid?" do
|
49
49
|
@model.expects(:validate)
|
50
50
|
assert @model.valid?
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
should "be valid if there are no errors" do
|
54
54
|
assert @model.valid?
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
should "be invalid if there are any errors" do
|
58
58
|
@model.add_error(:foo, "foo")
|
59
59
|
assert !@model.valid?
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
should "have a validate method by default which returns true" do
|
63
63
|
assert @model.validate
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
context "specific validations" do
|
68
68
|
setup do
|
69
69
|
@model = ValidatableModel.new
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
context "validates_presence_of" do
|
73
73
|
setup do
|
74
74
|
@model.foos = "foo"
|
75
75
|
@model.bars = "bar"
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
should "not add an error if not blank" do
|
79
79
|
@model.validates_presence_of(:foos)
|
80
80
|
assert @model.valid?
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
should "add an error if blank field" do
|
84
84
|
@model.foos = ""
|
85
85
|
@model.validates_presence_of(:foos)
|
86
86
|
assert !@model.valid?
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
should "add an error for a nil field" do
|
90
90
|
@model.foos = nil
|
91
91
|
@model.validates_presence_of(:foos)
|
92
92
|
assert !@model.valid?
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
should "validate multiple fields" do
|
96
96
|
@model.bars = nil
|
97
97
|
@model.validates_presence_of([:foos, :bars])
|
98
|
-
|
98
|
+
|
99
99
|
assert !@model.valid?
|
100
100
|
assert @model.errors[:bars]
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
should "return false on invalid" do
|
104
104
|
@model.bars = nil
|
105
105
|
assert !@model.validates_presence_of(:bars)
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
should "return true on valid" do
|
109
109
|
@model.bars = "foo"
|
110
110
|
assert @model.validates_presence_of(:bars)
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
should "return false if any are invalid on multiple fields" do
|
114
114
|
@model.bars = nil
|
115
115
|
assert !@model.validates_presence_of([:foos, :bars])
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
should "return true if all fields are valid" do
|
119
119
|
@model.foos = "foo"
|
120
120
|
@model.bars = "bar"
|