bbrowning-virtualbox 0.7.6.dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. data/.gitignore +8 -0
  2. data/.yardopts +3 -0
  3. data/Gemfile +16 -0
  4. data/LICENSE +19 -0
  5. data/Rakefile +33 -0
  6. data/Readme.md +70 -0
  7. data/docs/GettingStarted.md +196 -0
  8. data/docs/WhatsNew.md +12 -0
  9. data/features/README.md +33 -0
  10. data/features/global.feature +19 -0
  11. data/features/global_extra_data.feature +27 -0
  12. data/features/step_definitions/abstract_model_steps.rb +39 -0
  13. data/features/step_definitions/extra_data_steps.rb +36 -0
  14. data/features/step_definitions/global_steps.rb +29 -0
  15. data/features/step_definitions/nat_engine_steps.rb +76 -0
  16. data/features/step_definitions/network_adapter_steps.rb +38 -0
  17. data/features/step_definitions/shared_folder_steps.rb +76 -0
  18. data/features/step_definitions/snapshot_steps.rb +74 -0
  19. data/features/step_definitions/storage_controller_steps.rb +16 -0
  20. data/features/step_definitions/virtualbox_steps.rb +17 -0
  21. data/features/step_definitions/vm_steps.rb +50 -0
  22. data/features/support/env.rb +61 -0
  23. data/features/support/helpers.rb +38 -0
  24. data/features/support/hooks.rb +30 -0
  25. data/features/support/ordered_hash.rb +49 -0
  26. data/features/support/vboxmanage.rb +191 -0
  27. data/features/version.feature +16 -0
  28. data/features/vm.feature +13 -0
  29. data/features/vm_bios.feature +29 -0
  30. data/features/vm_cpu.feature +29 -0
  31. data/features/vm_extra_data.feature +35 -0
  32. data/features/vm_hw_virt.feature +29 -0
  33. data/features/vm_nat_engine.feature +57 -0
  34. data/features/vm_network_adapters.feature +27 -0
  35. data/features/vm_shared_folders.feature +42 -0
  36. data/features/vm_snapshots.feature +29 -0
  37. data/features/vm_storage_controllers.feature +11 -0
  38. data/lib/virtualbox.rb +11 -0
  39. data/lib/virtualbox/abstract_model.rb +281 -0
  40. data/lib/virtualbox/abstract_model/attributable.rb +290 -0
  41. data/lib/virtualbox/abstract_model/dirty.rb +177 -0
  42. data/lib/virtualbox/abstract_model/interface_attributes.rb +98 -0
  43. data/lib/virtualbox/abstract_model/relatable.rb +332 -0
  44. data/lib/virtualbox/abstract_model/validatable.rb +167 -0
  45. data/lib/virtualbox/abstract_model/version_matcher.rb +35 -0
  46. data/lib/virtualbox/appliance.rb +62 -0
  47. data/lib/virtualbox/audio_adapter.rb +52 -0
  48. data/lib/virtualbox/bios.rb +50 -0
  49. data/lib/virtualbox/com.rb +23 -0
  50. data/lib/virtualbox/com/abstract_enum.rb +43 -0
  51. data/lib/virtualbox/com/abstract_implementer.rb +45 -0
  52. data/lib/virtualbox/com/abstract_interface.rb +167 -0
  53. data/lib/virtualbox/com/base_interface.rb +38 -0
  54. data/lib/virtualbox/com/ffi/interface.rb +150 -0
  55. data/lib/virtualbox/com/ffi/interfaces.rb +54 -0
  56. data/lib/virtualbox/com/ffi/util.rb +119 -0
  57. data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
  58. data/lib/virtualbox/com/ffi_interface.rb +96 -0
  59. data/lib/virtualbox/com/implementer/base.rb +59 -0
  60. data/lib/virtualbox/com/implementer/ffi.rb +361 -0
  61. data/lib/virtualbox/com/implementer/mscom.rb +175 -0
  62. data/lib/virtualbox/com/implementer/nil.rb +10 -0
  63. data/lib/virtualbox/com/interface/3.1.x/access_mode.rb +11 -0
  64. data/lib/virtualbox/com/interface/3.1.x/appliance.rb +22 -0
  65. data/lib/virtualbox/com/interface/3.1.x/audio_adapter.rb +15 -0
  66. data/lib/virtualbox/com/interface/3.1.x/audio_controller_type.rb +11 -0
  67. data/lib/virtualbox/com/interface/3.1.x/audio_driver_type.rb +11 -0
  68. data/lib/virtualbox/com/interface/3.1.x/bios_boot_menu_mode.rb +11 -0
  69. data/lib/virtualbox/com/interface/3.1.x/bios_settings.rb +21 -0
  70. data/lib/virtualbox/com/interface/3.1.x/clipboard_mode.rb +11 -0
  71. data/lib/virtualbox/com/interface/3.1.x/console.rb +50 -0
  72. data/lib/virtualbox/com/interface/3.1.x/cpu_property_type.rb +11 -0
  73. data/lib/virtualbox/com/interface/3.1.x/device_type.rb +11 -0
  74. data/lib/virtualbox/com/interface/3.1.x/dhcp_server.rb +22 -0
  75. data/lib/virtualbox/com/interface/3.1.x/firmware_type.rb +11 -0
  76. data/lib/virtualbox/com/interface/3.1.x/guest_os_type.rb +23 -0
  77. data/lib/virtualbox/com/interface/3.1.x/host.rb +42 -0
  78. data/lib/virtualbox/com/interface/3.1.x/host_network_interface.rb +30 -0
  79. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_medium_type.rb +11 -0
  80. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_status.rb +11 -0
  81. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_type.rb +11 -0
  82. data/lib/virtualbox/com/interface/3.1.x/host_usb_device.rb +13 -0
  83. data/lib/virtualbox/com/interface/3.1.x/host_usb_device_filter.rb +13 -0
  84. data/lib/virtualbox/com/interface/3.1.x/hw_virt_ex_property_type.rb +11 -0
  85. data/lib/virtualbox/com/interface/3.1.x/machine.rb +105 -0
  86. data/lib/virtualbox/com/interface/3.1.x/machine_state.rb +14 -0
  87. data/lib/virtualbox/com/interface/3.1.x/medium.rb +50 -0
  88. data/lib/virtualbox/com/interface/3.1.x/medium_attachment.rb +18 -0
  89. data/lib/virtualbox/com/interface/3.1.x/medium_format.rb +18 -0
  90. data/lib/virtualbox/com/interface/3.1.x/medium_state.rb +11 -0
  91. data/lib/virtualbox/com/interface/3.1.x/medium_type.rb +11 -0
  92. data/lib/virtualbox/com/interface/3.1.x/medium_variant.rb +11 -0
  93. data/lib/virtualbox/com/interface/3.1.x/network_adapter.rb +30 -0
  94. data/lib/virtualbox/com/interface/3.1.x/network_adapter_type.rb +11 -0
  95. data/lib/virtualbox/com/interface/3.1.x/network_attachment_type.rb +11 -0
  96. data/lib/virtualbox/com/interface/3.1.x/nsiexception.rb +23 -0
  97. data/lib/virtualbox/com/interface/3.1.x/nsisupports.rb +15 -0
  98. data/lib/virtualbox/com/interface/3.1.x/parallel_port.rb +17 -0
  99. data/lib/virtualbox/com/interface/3.1.x/port_mode.rb +11 -0
  100. data/lib/virtualbox/com/interface/3.1.x/progress.rb +63 -0
  101. data/lib/virtualbox/com/interface/3.1.x/serial_port.rb +19 -0
  102. data/lib/virtualbox/com/interface/3.1.x/session.rb +18 -0
  103. data/lib/virtualbox/com/interface/3.1.x/session_state.rb +11 -0
  104. data/lib/virtualbox/com/interface/3.1.x/session_type.rb +11 -0
  105. data/lib/virtualbox/com/interface/3.1.x/shared_folder.rb +17 -0
  106. data/lib/virtualbox/com/interface/3.1.x/snapshot.rb +20 -0
  107. data/lib/virtualbox/com/interface/3.1.x/storage_bus.rb +11 -0
  108. data/lib/virtualbox/com/interface/3.1.x/storage_controller.rb +23 -0
  109. data/lib/virtualbox/com/interface/3.1.x/storage_controller_type.rb +11 -0
  110. data/lib/virtualbox/com/interface/3.1.x/system_properties.rb +37 -0
  111. data/lib/virtualbox/com/interface/3.1.x/usb_controller.rb +20 -0
  112. data/lib/virtualbox/com/interface/3.1.x/usb_device.rb +24 -0
  113. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter.rb +23 -0
  114. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter_action.rb +11 -0
  115. data/lib/virtualbox/com/interface/3.1.x/usb_device_state.rb +11 -0
  116. data/lib/virtualbox/com/interface/3.1.x/virtual_box_error_info.rb +17 -0
  117. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description.rb +19 -0
  118. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_type.rb +14 -0
  119. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_value_type.rb +11 -0
  120. data/lib/virtualbox/com/interface/3.1.x/virtualbox.rb +67 -0
  121. data/lib/virtualbox/com/interface/3.1.x/vrdp_auth_type.rb +11 -0
  122. data/lib/virtualbox/com/interface/3.1.x/vrdp_server.rb +19 -0
  123. data/lib/virtualbox/com/interface/3.2.x/access_mode.rb +11 -0
  124. data/lib/virtualbox/com/interface/3.2.x/appliance.rb +22 -0
  125. data/lib/virtualbox/com/interface/3.2.x/audio_adapter.rb +15 -0
  126. data/lib/virtualbox/com/interface/3.2.x/audio_controller_type.rb +11 -0
  127. data/lib/virtualbox/com/interface/3.2.x/audio_driver_type.rb +11 -0
  128. data/lib/virtualbox/com/interface/3.2.x/bios_boot_menu_mode.rb +11 -0
  129. data/lib/virtualbox/com/interface/3.2.x/bios_settings.rb +21 -0
  130. data/lib/virtualbox/com/interface/3.2.x/clipboard_mode.rb +11 -0
  131. data/lib/virtualbox/com/interface/3.2.x/console.rb +50 -0
  132. data/lib/virtualbox/com/interface/3.2.x/cpu_property_type.rb +11 -0
  133. data/lib/virtualbox/com/interface/3.2.x/device_type.rb +11 -0
  134. data/lib/virtualbox/com/interface/3.2.x/dhcp_server.rb +22 -0
  135. data/lib/virtualbox/com/interface/3.2.x/firmware_type.rb +11 -0
  136. data/lib/virtualbox/com/interface/3.2.x/guest.rb +13 -0
  137. data/lib/virtualbox/com/interface/3.2.x/guest_os_type.rb +33 -0
  138. data/lib/virtualbox/com/interface/3.2.x/host.rb +43 -0
  139. data/lib/virtualbox/com/interface/3.2.x/host_network_interface.rb +30 -0
  140. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_medium_type.rb +11 -0
  141. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_status.rb +11 -0
  142. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_type.rb +11 -0
  143. data/lib/virtualbox/com/interface/3.2.x/host_usb_device.rb +13 -0
  144. data/lib/virtualbox/com/interface/3.2.x/host_usb_device_filter.rb +13 -0
  145. data/lib/virtualbox/com/interface/3.2.x/hw_virt_ex_property_type.rb +11 -0
  146. data/lib/virtualbox/com/interface/3.2.x/keyboard_hid_type.rb +11 -0
  147. data/lib/virtualbox/com/interface/3.2.x/machine.rb +118 -0
  148. data/lib/virtualbox/com/interface/3.2.x/machine_state.rb +14 -0
  149. data/lib/virtualbox/com/interface/3.2.x/medium.rb +51 -0
  150. data/lib/virtualbox/com/interface/3.2.x/medium_attachment.rb +18 -0
  151. data/lib/virtualbox/com/interface/3.2.x/medium_format.rb +18 -0
  152. data/lib/virtualbox/com/interface/3.2.x/medium_state.rb +11 -0
  153. data/lib/virtualbox/com/interface/3.2.x/medium_type.rb +11 -0
  154. data/lib/virtualbox/com/interface/3.2.x/medium_variant.rb +11 -0
  155. data/lib/virtualbox/com/interface/3.2.x/nat_alias_mode.rb +11 -0
  156. data/lib/virtualbox/com/interface/3.2.x/nat_engine.rb +27 -0
  157. data/lib/virtualbox/com/interface/3.2.x/nat_protocol.rb +11 -0
  158. data/lib/virtualbox/com/interface/3.2.x/network_adapter.rb +34 -0
  159. data/lib/virtualbox/com/interface/3.2.x/network_adapter_type.rb +11 -0
  160. data/lib/virtualbox/com/interface/3.2.x/network_attachment_type.rb +11 -0
  161. data/lib/virtualbox/com/interface/3.2.x/nsiexception.rb +23 -0
  162. data/lib/virtualbox/com/interface/3.2.x/nsisupports.rb +15 -0
  163. data/lib/virtualbox/com/interface/3.2.x/parallel_port.rb +17 -0
  164. data/lib/virtualbox/com/interface/3.2.x/pointing_hid_type.rb +11 -0
  165. data/lib/virtualbox/com/interface/3.2.x/port_mode.rb +11 -0
  166. data/lib/virtualbox/com/interface/3.2.x/progress.rb +63 -0
  167. data/lib/virtualbox/com/interface/3.2.x/serial_port.rb +19 -0
  168. data/lib/virtualbox/com/interface/3.2.x/session.rb +18 -0
  169. data/lib/virtualbox/com/interface/3.2.x/session_state.rb +11 -0
  170. data/lib/virtualbox/com/interface/3.2.x/session_type.rb +11 -0
  171. data/lib/virtualbox/com/interface/3.2.x/shared_folder.rb +17 -0
  172. data/lib/virtualbox/com/interface/3.2.x/snapshot.rb +20 -0
  173. data/lib/virtualbox/com/interface/3.2.x/storage_bus.rb +11 -0
  174. data/lib/virtualbox/com/interface/3.2.x/storage_controller.rb +24 -0
  175. data/lib/virtualbox/com/interface/3.2.x/storage_controller_type.rb +11 -0
  176. data/lib/virtualbox/com/interface/3.2.x/system_properties.rb +42 -0
  177. data/lib/virtualbox/com/interface/3.2.x/usb_controller.rb +21 -0
  178. data/lib/virtualbox/com/interface/3.2.x/usb_device.rb +24 -0
  179. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter.rb +23 -0
  180. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter_action.rb +11 -0
  181. data/lib/virtualbox/com/interface/3.2.x/usb_device_state.rb +11 -0
  182. data/lib/virtualbox/com/interface/3.2.x/virtual_box_error_info.rb +17 -0
  183. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description.rb +19 -0
  184. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_type.rb +14 -0
  185. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_value_type.rb +11 -0
  186. data/lib/virtualbox/com/interface/3.2.x/virtualbox.rb +67 -0
  187. data/lib/virtualbox/com/interface/3.2.x/vrdp_auth_type.rb +11 -0
  188. data/lib/virtualbox/com/interface/3.2.x/vrdp_server.rb +21 -0
  189. data/lib/virtualbox/com/mscom_interface.rb +44 -0
  190. data/lib/virtualbox/com/nil_interface.rb +7 -0
  191. data/lib/virtualbox/com/util.rb +32 -0
  192. data/lib/virtualbox/cpu.rb +61 -0
  193. data/lib/virtualbox/dhcp_server.rb +89 -0
  194. data/lib/virtualbox/dvd.rb +27 -0
  195. data/lib/virtualbox/exceptions.rb +39 -0
  196. data/lib/virtualbox/ext/byte_normalizer.rb +17 -0
  197. data/lib/virtualbox/ext/glob_loader.rb +22 -0
  198. data/lib/virtualbox/ext/logger.rb +38 -0
  199. data/lib/virtualbox/ext/platform.rb +27 -0
  200. data/lib/virtualbox/ext/subclass_listing.rb +24 -0
  201. data/lib/virtualbox/extra_data.rb +127 -0
  202. data/lib/virtualbox/forwarded_port.rb +222 -0
  203. data/lib/virtualbox/global.rb +102 -0
  204. data/lib/virtualbox/guest_property.rb +116 -0
  205. data/lib/virtualbox/hard_drive.rb +246 -0
  206. data/lib/virtualbox/host.rb +71 -0
  207. data/lib/virtualbox/host_network_interface.rb +137 -0
  208. data/lib/virtualbox/hw_virtualization.rb +63 -0
  209. data/lib/virtualbox/lib.rb +84 -0
  210. data/lib/virtualbox/media.rb +20 -0
  211. data/lib/virtualbox/medium.rb +145 -0
  212. data/lib/virtualbox/medium_attachment.rb +61 -0
  213. data/lib/virtualbox/nat_engine.rb +71 -0
  214. data/lib/virtualbox/nat_forwarded_port.rb +171 -0
  215. data/lib/virtualbox/network_adapter.rb +166 -0
  216. data/lib/virtualbox/proxies/collection.rb +57 -0
  217. data/lib/virtualbox/shared_folder.rb +220 -0
  218. data/lib/virtualbox/snapshot.rb +185 -0
  219. data/lib/virtualbox/storage_controller.rb +160 -0
  220. data/lib/virtualbox/system_properties.rb +74 -0
  221. data/lib/virtualbox/usb_controller.rb +59 -0
  222. data/lib/virtualbox/usb_device_filter.rb +74 -0
  223. data/lib/virtualbox/version.rb +36 -0
  224. data/lib/virtualbox/virtual_system_description.rb +47 -0
  225. data/lib/virtualbox/vm.rb +684 -0
  226. data/lib/virtualbox/vrdp_server.rb +59 -0
  227. data/test/test_helper.rb +18 -0
  228. data/test/virtualbox/abstract_model/attributable_test.rb +269 -0
  229. data/test/virtualbox/abstract_model/dirty_test.rb +83 -0
  230. data/test/virtualbox/abstract_model/interface_attributes_test.rb +194 -0
  231. data/test/virtualbox/abstract_model/relatable_test.rb +348 -0
  232. data/test/virtualbox/abstract_model/validatable_test.rb +308 -0
  233. data/test/virtualbox/abstract_model/version_matcher_test.rb +41 -0
  234. data/test/virtualbox/abstract_model_test.rb +462 -0
  235. data/test/virtualbox/appliance_test.rb +159 -0
  236. data/test/virtualbox/audio_adapter_test.rb +83 -0
  237. data/test/virtualbox/bios_test.rb +83 -0
  238. data/test/virtualbox/com/abstract_enum_test.rb +49 -0
  239. data/test/virtualbox/com/abstract_implementer_test.rb +40 -0
  240. data/test/virtualbox/com/abstract_interface_test.rb +140 -0
  241. data/test/virtualbox/com/ffi/interface_test.rb +249 -0
  242. data/test/virtualbox/com/ffi/util_test.rb +108 -0
  243. data/test/virtualbox/com/ffi_interface_test.rb +42 -0
  244. data/test/virtualbox/com/implementer/base_test.rb +38 -0
  245. data/test/virtualbox/com/implementer/ffi_test.rb +527 -0
  246. data/test/virtualbox/com/implementer/mscom_test.rb +247 -0
  247. data/test/virtualbox/com/mscom_interface_test.rb +17 -0
  248. data/test/virtualbox/com/util_test.rb +17 -0
  249. data/test/virtualbox/cpu_test.rb +103 -0
  250. data/test/virtualbox/dhcp_server_test.rb +165 -0
  251. data/test/virtualbox/dvd_test.rb +28 -0
  252. data/test/virtualbox/ext/byte_normalizer_test.rb +34 -0
  253. data/test/virtualbox/ext/platform_test.rb +50 -0
  254. data/test/virtualbox/ext/subclass_listing_test.rb +25 -0
  255. data/test/virtualbox/extra_data_test.rb +155 -0
  256. data/test/virtualbox/forwarded_port_test.rb +286 -0
  257. data/test/virtualbox/global_test.rb +46 -0
  258. data/test/virtualbox/hard_drive_test.rb +141 -0
  259. data/test/virtualbox/host_network_interface_test.rb +254 -0
  260. data/test/virtualbox/host_test.rb +94 -0
  261. data/test/virtualbox/hw_virtualization_test.rb +103 -0
  262. data/test/virtualbox/lib_test.rb +93 -0
  263. data/test/virtualbox/medium_attachment_test.rb +147 -0
  264. data/test/virtualbox/medium_test.rb +192 -0
  265. data/test/virtualbox/nat_engine_test.rb +106 -0
  266. data/test/virtualbox/nat_forwarded_port_test.rb +222 -0
  267. data/test/virtualbox/network_adapter_test.rb +191 -0
  268. data/test/virtualbox/proxies/collection_test.rb +102 -0
  269. data/test/virtualbox/shared_folder_test.rb +219 -0
  270. data/test/virtualbox/snapshot_test.rb +231 -0
  271. data/test/virtualbox/storage_controller_test.rb +197 -0
  272. data/test/virtualbox/system_properties_test.rb +87 -0
  273. data/test/virtualbox/usb_controller_test.rb +112 -0
  274. data/test/virtualbox/usb_device_filter_test.rb +93 -0
  275. data/test/virtualbox/version_test.rb +59 -0
  276. data/test/virtualbox/virtual_system_description_test.rb +61 -0
  277. data/test/virtualbox/vm_test.rb +637 -0
  278. data/test/virtualbox/vrdp_server_test.rb +83 -0
  279. data/test/virtualbox_test.rb +11 -0
  280. data/virtualbox.gemspec +25 -0
  281. metadata +397 -0
@@ -0,0 +1,41 @@
1
+ require File.expand_path("../../../test_helper", __FILE__)
2
+
3
+ class VersionMatcherTest < Test::Unit::TestCase
4
+ setup do
5
+ @module = VirtualBox::AbstractModel::VersionMatcher
6
+ @klass = Class.new
7
+ @klass.send(:extend, @module)
8
+ end
9
+
10
+ context "asserting version matches" do
11
+ should "raise an exception if versions do not match" do
12
+ assert_raises(VirtualBox::Exceptions::UnsupportedVersionException) {
13
+ @klass.assert_version_match("3.1", "3.2.4")
14
+ }
15
+ end
16
+
17
+ should "not raise an exception if versions do match" do
18
+ assert_nothing_raised {
19
+ @klass.assert_version_match("3.0", "3.0.14")
20
+ }
21
+ end
22
+ end
23
+
24
+ context "version matching" do
25
+ should "return true if versions match" do
26
+ assert @klass.version_match?("3.2", "3.2.4")
27
+ assert !@klass.version_match?("3.1", "3.2.4")
28
+ end
29
+ end
30
+
31
+ context "splitting version" do
32
+ should "split into a max of two parts by period" do
33
+ assert_equal %W[3 2], @klass.split_version("3.2.0")
34
+ assert_equal %W[3 1], @klass.split_version("3.1.1.1.1")
35
+ end
36
+
37
+ should "return an empty array if it can't split" do
38
+ assert_equal [], @klass.split_version(nil)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,462 @@
1
+ require File.expand_path("../../test_helper", __FILE__)
2
+
3
+ class AbstractModelTest < Test::Unit::TestCase
4
+ class Foo
5
+ def self.set_relationship(caller, old_value, new_value)
6
+ new_value
7
+ end
8
+
9
+ def self.validate_relationship(caller, data)
10
+ end
11
+ end
12
+
13
+ class Bar; end
14
+
15
+ class FakeModel < VirtualBox::AbstractModel
16
+ attribute :foo, :property => false
17
+ attribute :bar
18
+ relationship :foos, Foo
19
+ relationship :bars, Bar, :dependent => :destroy
20
+ end
21
+
22
+ context "reloading" do
23
+ context "with a single class" do
24
+ setup do
25
+ @model = FakeModel.new
26
+ end
27
+
28
+ teardown do
29
+ FakeModel.reloaded!
30
+ end
31
+
32
+ should "not want to be reloaded initially" do
33
+ assert !FakeModel.reload?
34
+ end
35
+
36
+ should "want to be reloaded once signaled by the class method" do
37
+ FakeModel.reload!
38
+ assert FakeModel.reload?
39
+ end
40
+
41
+ should "want to be reloaded once signaled by the instance method" do
42
+ @model.reload!
43
+ assert FakeModel.reload?
44
+ end
45
+
46
+ should "not want to be reloaded once reloaded! is called" do
47
+ @model.reload!
48
+ assert FakeModel.reload?
49
+ FakeModel.reloaded!
50
+ assert !FakeModel.reload?
51
+ end
52
+ end
53
+
54
+ context "with inheritance" do
55
+ class SubModel < FakeModel
56
+ end
57
+
58
+ setup do
59
+ @lazy = FakeModel.new
60
+ @sub = SubModel.new
61
+ end
62
+
63
+ should "not interfere with each others reload flags" do
64
+ @lazy.reload!
65
+ assert !SubModel.reload?
66
+ assert FakeModel.reload?
67
+ end
68
+ end
69
+ end
70
+
71
+ context "errors for relationship default implementation" do
72
+ setup do
73
+ @klass = FakeModel
74
+ end
75
+
76
+ should "return the errors on the item" do
77
+ errors = mock("errors")
78
+ item = mock("item")
79
+ item.stubs(:errors).returns(errors)
80
+ assert_equal errors, @klass.errors_for_relationship(nil, item)
81
+ end
82
+
83
+ should "return nil if the item doesn't respond to errors" do
84
+ assert_nil @klass.errors_for_relationship(nil, 7)
85
+ end
86
+ end
87
+
88
+ context "lazy attributes and relationships" do
89
+ class LazyModel < VirtualBox::AbstractModel
90
+ attribute :foo, :lazy => true
91
+ attribute :bar
92
+ relationship :foos, AbstractModelTest::Foo, :lazy => true
93
+ relationship :bars, AbstractModelTest::Bar, :lazy => true
94
+ end
95
+
96
+ setup do
97
+ @model = LazyModel.new
98
+ end
99
+
100
+ should "return false on lazy_attribute? for all attributes if new" do
101
+ assert !@model.lazy_attribute?(:foo)
102
+ assert !@model.lazy_relationship?(:foos)
103
+ end
104
+ end
105
+
106
+ context "inspecting" do
107
+ setup do
108
+ @model = FakeModel.new
109
+ end
110
+
111
+ should "generate the proper inspect string" do
112
+ assert_equal "#<AbstractModelTest::FakeModel :bar=nil, :bars=..., :foo=nil, :foos=...>", @model.inspect
113
+ end
114
+
115
+ should "turn attributes which are AbstractModels into classes" do
116
+ @model.foo = @model.dup
117
+ assert_equal "#<AbstractModelTest::FakeModel :bar=nil, :bars=..., :foo=#<AbstractModelTest::FakeModel>, :foos=...>", @model.inspect
118
+ end
119
+
120
+ should "turn attributes which are AbstractInterfaces into classes" do
121
+ @model.foo = VirtualBox::COM::Util.versioned_interface(:VirtualBox).new(VirtualBox::COM::Implementer::Nil, nil)
122
+ assert_equal "#<AbstractModelTest::FakeModel :bar=nil, :bars=..., :foo=#<VirtualBox::COM::Interface::Version_3_2_X::VirtualBox>, :foos=...>", @model.inspect
123
+ end
124
+ end
125
+
126
+ context "validation" do
127
+ setup do
128
+ @model = FakeModel.new
129
+ end
130
+
131
+ should "clear all previous errors" do
132
+ @model.expects(:clear_errors).once
133
+ @model.validate
134
+ end
135
+
136
+ should "call validate_relationship on each relationship class" do
137
+ Foo.expects(:validate_relationship).once.with(@model, nil)
138
+ @model.validate
139
+ end
140
+
141
+ should "forward arguments to validate_relationship" do
142
+ Foo.expects(:validate_relationship).once.with(@model, nil, "HELLO")
143
+ @model.validate("HELLO")
144
+ end
145
+
146
+ should "succeed if all relationships succeeded" do
147
+ Foo.expects(:validate_relationship).returns(true)
148
+ assert @model.validate
149
+ end
150
+
151
+ should "fail if one relationship failed to validate" do
152
+ Foo.expects(:validate_relationship).returns(true)
153
+ Bar.expects(:validate_relationship).returns(false)
154
+ assert !@model.validate
155
+ end
156
+
157
+ context "errors" do
158
+ should "return the errors of the relationships, as well as the model itself" do
159
+ @model.foo = nil
160
+ assert !@model.validate
161
+
162
+ @model.validates_presence_of(:foo)
163
+ Foo.expects(:errors_for_relationship).with(@model, nil).returns("BAD")
164
+ errors = @model.errors
165
+ assert errors.has_key?(:foos)
166
+ assert_equal "BAD", errors[:foos]
167
+ assert errors.has_key?(:foo)
168
+ end
169
+ end
170
+ end
171
+
172
+ context "new/existing records" do
173
+ setup do
174
+ @model = FakeModel.new
175
+ end
176
+
177
+ should "be a new record by default" do
178
+ assert @model.new_record?
179
+ end
180
+
181
+ should "not be a new record if populate_attributes is called" do
182
+ @model.populate_attributes({})
183
+ assert !@model.new_record?
184
+ end
185
+
186
+ should "not be a new record after saving" do
187
+ assert @model.new_record?
188
+ @model.save
189
+ assert !@model.new_record?
190
+ end
191
+
192
+ should "become a new record again if new_record! is called" do
193
+ assert @model.new_record?
194
+ @model.save
195
+ assert !@model.new_record?
196
+ @model.new_record!
197
+ assert @model.new_record?
198
+ end
199
+
200
+ should "become an existing record if existing_record! is called" do
201
+ assert @model.new_record?
202
+ @model.existing_record!
203
+ assert !@model.new_record?
204
+ end
205
+ end
206
+
207
+ context "parent machine" do
208
+ setup do
209
+ # Create a subclass of VM and no-op the initialize so it doesn't
210
+ # try to populate VM attributes or relationships
211
+ @root = Class.new(VirtualBox::VM)
212
+ @root.class_eval("def initialize; end")
213
+ @root = @root.new
214
+
215
+ @leaf = @root
216
+ 3.times do |i|
217
+ child = Class.new(VirtualBox::AbstractModel)
218
+ child.attribute(:parent, :readonly => true, :property => false)
219
+ child = child.new
220
+ child.write_attribute(:parent, @leaf)
221
+ @leaf = child
222
+ end
223
+ end
224
+
225
+ should "get the parent" do
226
+ # Sanity test
227
+ assert_equal @root, @leaf.parent.parent.parent
228
+ assert @root.is_a?(VirtualBox::VM)
229
+
230
+ # Actual test
231
+ assert_equal @root, @leaf.parent_machine
232
+ end
233
+ end
234
+
235
+ context "subclasses" do
236
+ class FakeTwoModel < FakeModel
237
+ attribute :baz
238
+ end
239
+
240
+ setup do
241
+ @model = FakeTwoModel.new
242
+ @model.populate_attributes({
243
+ :foo => "foo",
244
+ :bar => "bar",
245
+ :baz => "baz"
246
+ })
247
+ end
248
+
249
+ should "have access to parents attributes" do
250
+ assert_nothing_raised do
251
+ assert_equal "foo", @model.foo
252
+ end
253
+ end
254
+ end
255
+
256
+ context "destroying" do
257
+ setup do
258
+ @model = FakeModel.new
259
+ end
260
+
261
+ should "call destroy_relationship only for dependent relationships" do
262
+ Foo.expects(:destroy_relationship).never
263
+ Bar.expects(:destroy_relationship).once
264
+
265
+ @model.destroy
266
+ end
267
+
268
+ should "forward any arguments to the destroy method" do
269
+ Bar.expects(:destroy_relationship).with(@model, anything, "HELLO").once
270
+ @model.destroy("HELLO")
271
+ end
272
+ end
273
+
274
+ context "saving" do
275
+ setup do
276
+ @model = FakeModel.new
277
+ @model.populate_attributes({
278
+ :foo => "foo",
279
+ :bar => "bar"
280
+ })
281
+ end
282
+
283
+ should "call save_attribute for only attributes which have changed" do
284
+ @model.foo = "foo2"
285
+ assert @model.foo_changed?
286
+ assert !@model.bar_changed?
287
+ @model.expects(:save_attribute).with(:foo, "foo2").once
288
+ @model.save
289
+ end
290
+
291
+ should "clear dirty state once saved" do
292
+ @model.foo = "foo2"
293
+ assert @model.foo_changed?
294
+ @model.save
295
+ assert !@model.foo_changed?
296
+ end
297
+
298
+ should "forward parameters through" do
299
+ @model.expects(:save_attribute).with(:foo, "foo2", "YES").once
300
+ Foo.expects(:save_relationship).with(@model, anything, "YES").once
301
+
302
+ @model.foo = "foo2"
303
+ @model.save("YES")
304
+ end
305
+
306
+ should "return true if succeeds" do
307
+ assert @model.save
308
+ end
309
+ end
310
+
311
+ context "save!" do
312
+ setup do
313
+ @model = FakeModel.new
314
+ end
315
+
316
+ should "raise an exception if save failed" do
317
+ args = %W[foo bar baz]
318
+ @model.expects(:save).with(*args).returns(false)
319
+ assert_raises(VirtualBox::Exceptions::ValidationFailedException) {
320
+ @model.save!(*args)
321
+ }
322
+ end
323
+
324
+ should "not raise an exception if save succeeds" do
325
+ @model.expects(:save).returns(true)
326
+ assert_nothing_raised { @model.save! }
327
+ end
328
+ end
329
+
330
+ context "populating relationships and attributes" do
331
+ setup do
332
+ @model = FakeModel.new
333
+ end
334
+
335
+ context "populating attributes" do
336
+ should "populate relationships at the same time as attributes" do
337
+ Foo.expects(:populate_relationship).once
338
+ @model.populate_attributes({})
339
+ end
340
+
341
+ should "not populate relationships if :ignore_relationships is true" do
342
+ Foo.expects(:populate_relationship).never
343
+ @model.populate_attributes({}, :ignore_relationships => true)
344
+ end
345
+
346
+ should "cause the model to become an existing record" do
347
+ assert @model.new_record?
348
+ @model.populate_attributes({})
349
+ assert !@model.new_record?
350
+ end
351
+
352
+ should "not cause dirtiness" do
353
+ assert_nil @model.foo
354
+ @model.populate_attributes({ :foo => "foo" })
355
+ assert_equal "foo", @model.foo
356
+ assert !@model.changed?
357
+ end
358
+ end
359
+
360
+ context "populating relationships" do
361
+ should "cause the model to become an existing record" do
362
+ assert @model.new_record?
363
+ @model.populate_relationships({})
364
+ assert !@model.new_record?
365
+ end
366
+
367
+ should "not cause dirtiness" do
368
+ # TODO: This test doesn't do much right now. We need to actually compare
369
+ # the relationship values for dirtiness.
370
+ @model.populate_relationships({ :foo => "foo" })
371
+ assert !@model.changed?
372
+ end
373
+ end
374
+
375
+ context "populating a single relationship" do
376
+ should "cause the model to become an existing record" do
377
+ assert @model.new_record?
378
+ @model.populate_relationship(:foos, {})
379
+ assert !@model.new_record?
380
+ end
381
+
382
+ should "not cause dirtiness" do
383
+ @model.populate_relationship(:foos, {})
384
+ assert !@model.changed?
385
+ end
386
+ end
387
+ end
388
+
389
+ context "integrating interface attributes" do
390
+ setup do
391
+ @model = FakeModel.new
392
+ end
393
+
394
+ should "clear the dirty state of an attribute after saving" do
395
+ key = :foo
396
+ interface = :bar
397
+ @model.expects(:clear_dirty!).with(key).once
398
+ @model.save_interface_attribute(key, interface)
399
+ end
400
+ end
401
+
402
+ context "integrating relatable" do
403
+ setup do
404
+ @model = FakeModel.new
405
+ end
406
+
407
+ context "saving all changed interface attributes" do
408
+ setup do
409
+ @interface = mock("interface")
410
+ @changes = [[:a, []], [:b, []], [:c, []]]
411
+ @model.stubs(:changes).returns(@changes)
412
+ end
413
+
414
+ should "save each" do
415
+ @model.changes.each do |key, options|
416
+ @model.expects(:save_interface_attribute).with(key, @interface)
417
+ end
418
+
419
+ @model.save_changed_interface_attributes(@interface)
420
+ end
421
+ end
422
+
423
+ context "with dirty" do
424
+ should "set dirty state when a relationship is set" do
425
+ assert !@model.changed?
426
+ @model.foos = "foo"
427
+ assert @model.changed?
428
+ end
429
+ end
430
+ end
431
+
432
+ context "integrating attributable and dirty" do
433
+ setup do
434
+ @model = FakeModel.new
435
+ end
436
+
437
+ should "not affect dirtiness with populate_attributes" do
438
+ assert !@model.changed?
439
+ @model.populate_attributes({
440
+ :foo => "foo2"
441
+ })
442
+
443
+ assert !@model.changed?
444
+ assert_equal "foo2", @model.foo
445
+ end
446
+
447
+ should "mark dirtiness on write_attribute" do
448
+ assert !@model.changed?
449
+ @model.write_attribute(:foo, "foo2")
450
+ assert @model.changed?
451
+ assert @model.foo_changed?
452
+ assert_equal "foo2", @model.foo
453
+ end
454
+
455
+ should "not mark dirtiness on write_attribute if the attribute is lazy and not yet loaded" do
456
+ @model.expects(:lazy_attribute?).with(:foo).returns(true)
457
+ @model.expects(:loaded_attribute?).with(:foo).returns(false)
458
+ @model.expects(:set_dirty!).never
459
+ @model.write_attribute(:foo, "foo2")
460
+ end
461
+ end
462
+ end