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.
- data/.gitignore +8 -0
- data/.yardopts +3 -0
- data/Gemfile +16 -0
- data/LICENSE +19 -0
- data/Rakefile +33 -0
- data/Readme.md +70 -0
- data/docs/GettingStarted.md +196 -0
- data/docs/WhatsNew.md +12 -0
- data/features/README.md +33 -0
- data/features/global.feature +19 -0
- data/features/global_extra_data.feature +27 -0
- data/features/step_definitions/abstract_model_steps.rb +39 -0
- data/features/step_definitions/extra_data_steps.rb +36 -0
- data/features/step_definitions/global_steps.rb +29 -0
- data/features/step_definitions/nat_engine_steps.rb +76 -0
- data/features/step_definitions/network_adapter_steps.rb +38 -0
- data/features/step_definitions/shared_folder_steps.rb +76 -0
- data/features/step_definitions/snapshot_steps.rb +74 -0
- data/features/step_definitions/storage_controller_steps.rb +16 -0
- data/features/step_definitions/virtualbox_steps.rb +17 -0
- data/features/step_definitions/vm_steps.rb +50 -0
- data/features/support/env.rb +61 -0
- data/features/support/helpers.rb +38 -0
- data/features/support/hooks.rb +30 -0
- data/features/support/ordered_hash.rb +49 -0
- data/features/support/vboxmanage.rb +191 -0
- data/features/version.feature +16 -0
- data/features/vm.feature +13 -0
- data/features/vm_bios.feature +29 -0
- data/features/vm_cpu.feature +29 -0
- data/features/vm_extra_data.feature +35 -0
- data/features/vm_hw_virt.feature +29 -0
- data/features/vm_nat_engine.feature +57 -0
- data/features/vm_network_adapters.feature +27 -0
- data/features/vm_shared_folders.feature +42 -0
- data/features/vm_snapshots.feature +29 -0
- data/features/vm_storage_controllers.feature +11 -0
- data/lib/virtualbox.rb +11 -0
- data/lib/virtualbox/abstract_model.rb +281 -0
- data/lib/virtualbox/abstract_model/attributable.rb +290 -0
- data/lib/virtualbox/abstract_model/dirty.rb +177 -0
- data/lib/virtualbox/abstract_model/interface_attributes.rb +98 -0
- data/lib/virtualbox/abstract_model/relatable.rb +332 -0
- data/lib/virtualbox/abstract_model/validatable.rb +167 -0
- data/lib/virtualbox/abstract_model/version_matcher.rb +35 -0
- data/lib/virtualbox/appliance.rb +62 -0
- data/lib/virtualbox/audio_adapter.rb +52 -0
- data/lib/virtualbox/bios.rb +50 -0
- data/lib/virtualbox/com.rb +23 -0
- data/lib/virtualbox/com/abstract_enum.rb +43 -0
- data/lib/virtualbox/com/abstract_implementer.rb +45 -0
- data/lib/virtualbox/com/abstract_interface.rb +167 -0
- data/lib/virtualbox/com/base_interface.rb +38 -0
- data/lib/virtualbox/com/ffi/interface.rb +150 -0
- data/lib/virtualbox/com/ffi/interfaces.rb +54 -0
- data/lib/virtualbox/com/ffi/util.rb +119 -0
- data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
- data/lib/virtualbox/com/ffi_interface.rb +96 -0
- data/lib/virtualbox/com/implementer/base.rb +59 -0
- data/lib/virtualbox/com/implementer/ffi.rb +361 -0
- data/lib/virtualbox/com/implementer/mscom.rb +175 -0
- data/lib/virtualbox/com/implementer/nil.rb +10 -0
- data/lib/virtualbox/com/interface/3.1.x/access_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/appliance.rb +22 -0
- data/lib/virtualbox/com/interface/3.1.x/audio_adapter.rb +15 -0
- data/lib/virtualbox/com/interface/3.1.x/audio_controller_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/audio_driver_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/bios_boot_menu_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/bios_settings.rb +21 -0
- data/lib/virtualbox/com/interface/3.1.x/clipboard_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/console.rb +50 -0
- data/lib/virtualbox/com/interface/3.1.x/cpu_property_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/device_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/dhcp_server.rb +22 -0
- data/lib/virtualbox/com/interface/3.1.x/firmware_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/guest_os_type.rb +23 -0
- data/lib/virtualbox/com/interface/3.1.x/host.rb +42 -0
- data/lib/virtualbox/com/interface/3.1.x/host_network_interface.rb +30 -0
- data/lib/virtualbox/com/interface/3.1.x/host_network_interface_medium_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/host_network_interface_status.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/host_network_interface_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/host_usb_device.rb +13 -0
- data/lib/virtualbox/com/interface/3.1.x/host_usb_device_filter.rb +13 -0
- data/lib/virtualbox/com/interface/3.1.x/hw_virt_ex_property_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/machine.rb +105 -0
- data/lib/virtualbox/com/interface/3.1.x/machine_state.rb +14 -0
- data/lib/virtualbox/com/interface/3.1.x/medium.rb +50 -0
- data/lib/virtualbox/com/interface/3.1.x/medium_attachment.rb +18 -0
- data/lib/virtualbox/com/interface/3.1.x/medium_format.rb +18 -0
- data/lib/virtualbox/com/interface/3.1.x/medium_state.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/medium_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/medium_variant.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/network_adapter.rb +30 -0
- data/lib/virtualbox/com/interface/3.1.x/network_adapter_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/network_attachment_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/nsiexception.rb +23 -0
- data/lib/virtualbox/com/interface/3.1.x/nsisupports.rb +15 -0
- data/lib/virtualbox/com/interface/3.1.x/parallel_port.rb +17 -0
- data/lib/virtualbox/com/interface/3.1.x/port_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/progress.rb +63 -0
- data/lib/virtualbox/com/interface/3.1.x/serial_port.rb +19 -0
- data/lib/virtualbox/com/interface/3.1.x/session.rb +18 -0
- data/lib/virtualbox/com/interface/3.1.x/session_state.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/session_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/shared_folder.rb +17 -0
- data/lib/virtualbox/com/interface/3.1.x/snapshot.rb +20 -0
- data/lib/virtualbox/com/interface/3.1.x/storage_bus.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/storage_controller.rb +23 -0
- data/lib/virtualbox/com/interface/3.1.x/storage_controller_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/system_properties.rb +37 -0
- data/lib/virtualbox/com/interface/3.1.x/usb_controller.rb +20 -0
- data/lib/virtualbox/com/interface/3.1.x/usb_device.rb +24 -0
- data/lib/virtualbox/com/interface/3.1.x/usb_device_filter.rb +23 -0
- data/lib/virtualbox/com/interface/3.1.x/usb_device_filter_action.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/usb_device_state.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/virtual_box_error_info.rb +17 -0
- data/lib/virtualbox/com/interface/3.1.x/virtual_system_description.rb +19 -0
- data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_type.rb +14 -0
- data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_value_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/virtualbox.rb +67 -0
- data/lib/virtualbox/com/interface/3.1.x/vrdp_auth_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.1.x/vrdp_server.rb +19 -0
- data/lib/virtualbox/com/interface/3.2.x/access_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/appliance.rb +22 -0
- data/lib/virtualbox/com/interface/3.2.x/audio_adapter.rb +15 -0
- data/lib/virtualbox/com/interface/3.2.x/audio_controller_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/audio_driver_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/bios_boot_menu_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/bios_settings.rb +21 -0
- data/lib/virtualbox/com/interface/3.2.x/clipboard_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/console.rb +50 -0
- data/lib/virtualbox/com/interface/3.2.x/cpu_property_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/device_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/dhcp_server.rb +22 -0
- data/lib/virtualbox/com/interface/3.2.x/firmware_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/guest.rb +13 -0
- data/lib/virtualbox/com/interface/3.2.x/guest_os_type.rb +33 -0
- data/lib/virtualbox/com/interface/3.2.x/host.rb +43 -0
- data/lib/virtualbox/com/interface/3.2.x/host_network_interface.rb +30 -0
- data/lib/virtualbox/com/interface/3.2.x/host_network_interface_medium_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/host_network_interface_status.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/host_network_interface_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/host_usb_device.rb +13 -0
- data/lib/virtualbox/com/interface/3.2.x/host_usb_device_filter.rb +13 -0
- data/lib/virtualbox/com/interface/3.2.x/hw_virt_ex_property_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/keyboard_hid_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/machine.rb +118 -0
- data/lib/virtualbox/com/interface/3.2.x/machine_state.rb +14 -0
- data/lib/virtualbox/com/interface/3.2.x/medium.rb +51 -0
- data/lib/virtualbox/com/interface/3.2.x/medium_attachment.rb +18 -0
- data/lib/virtualbox/com/interface/3.2.x/medium_format.rb +18 -0
- data/lib/virtualbox/com/interface/3.2.x/medium_state.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/medium_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/medium_variant.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/nat_alias_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/nat_engine.rb +27 -0
- data/lib/virtualbox/com/interface/3.2.x/nat_protocol.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/network_adapter.rb +34 -0
- data/lib/virtualbox/com/interface/3.2.x/network_adapter_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/network_attachment_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/nsiexception.rb +23 -0
- data/lib/virtualbox/com/interface/3.2.x/nsisupports.rb +15 -0
- data/lib/virtualbox/com/interface/3.2.x/parallel_port.rb +17 -0
- data/lib/virtualbox/com/interface/3.2.x/pointing_hid_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/port_mode.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/progress.rb +63 -0
- data/lib/virtualbox/com/interface/3.2.x/serial_port.rb +19 -0
- data/lib/virtualbox/com/interface/3.2.x/session.rb +18 -0
- data/lib/virtualbox/com/interface/3.2.x/session_state.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/session_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/shared_folder.rb +17 -0
- data/lib/virtualbox/com/interface/3.2.x/snapshot.rb +20 -0
- data/lib/virtualbox/com/interface/3.2.x/storage_bus.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/storage_controller.rb +24 -0
- data/lib/virtualbox/com/interface/3.2.x/storage_controller_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/system_properties.rb +42 -0
- data/lib/virtualbox/com/interface/3.2.x/usb_controller.rb +21 -0
- data/lib/virtualbox/com/interface/3.2.x/usb_device.rb +24 -0
- data/lib/virtualbox/com/interface/3.2.x/usb_device_filter.rb +23 -0
- data/lib/virtualbox/com/interface/3.2.x/usb_device_filter_action.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/usb_device_state.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/virtual_box_error_info.rb +17 -0
- data/lib/virtualbox/com/interface/3.2.x/virtual_system_description.rb +19 -0
- data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_type.rb +14 -0
- data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_value_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/virtualbox.rb +67 -0
- data/lib/virtualbox/com/interface/3.2.x/vrdp_auth_type.rb +11 -0
- data/lib/virtualbox/com/interface/3.2.x/vrdp_server.rb +21 -0
- data/lib/virtualbox/com/mscom_interface.rb +44 -0
- data/lib/virtualbox/com/nil_interface.rb +7 -0
- data/lib/virtualbox/com/util.rb +32 -0
- data/lib/virtualbox/cpu.rb +61 -0
- data/lib/virtualbox/dhcp_server.rb +89 -0
- data/lib/virtualbox/dvd.rb +27 -0
- data/lib/virtualbox/exceptions.rb +39 -0
- data/lib/virtualbox/ext/byte_normalizer.rb +17 -0
- data/lib/virtualbox/ext/glob_loader.rb +22 -0
- data/lib/virtualbox/ext/logger.rb +38 -0
- data/lib/virtualbox/ext/platform.rb +27 -0
- data/lib/virtualbox/ext/subclass_listing.rb +24 -0
- data/lib/virtualbox/extra_data.rb +127 -0
- data/lib/virtualbox/forwarded_port.rb +222 -0
- data/lib/virtualbox/global.rb +102 -0
- data/lib/virtualbox/guest_property.rb +116 -0
- data/lib/virtualbox/hard_drive.rb +246 -0
- data/lib/virtualbox/host.rb +71 -0
- data/lib/virtualbox/host_network_interface.rb +137 -0
- data/lib/virtualbox/hw_virtualization.rb +63 -0
- data/lib/virtualbox/lib.rb +84 -0
- data/lib/virtualbox/media.rb +20 -0
- data/lib/virtualbox/medium.rb +145 -0
- data/lib/virtualbox/medium_attachment.rb +61 -0
- data/lib/virtualbox/nat_engine.rb +71 -0
- data/lib/virtualbox/nat_forwarded_port.rb +171 -0
- data/lib/virtualbox/network_adapter.rb +166 -0
- data/lib/virtualbox/proxies/collection.rb +57 -0
- data/lib/virtualbox/shared_folder.rb +220 -0
- data/lib/virtualbox/snapshot.rb +185 -0
- data/lib/virtualbox/storage_controller.rb +160 -0
- data/lib/virtualbox/system_properties.rb +74 -0
- data/lib/virtualbox/usb_controller.rb +59 -0
- data/lib/virtualbox/usb_device_filter.rb +74 -0
- data/lib/virtualbox/version.rb +36 -0
- data/lib/virtualbox/virtual_system_description.rb +47 -0
- data/lib/virtualbox/vm.rb +684 -0
- data/lib/virtualbox/vrdp_server.rb +59 -0
- data/test/test_helper.rb +18 -0
- data/test/virtualbox/abstract_model/attributable_test.rb +269 -0
- data/test/virtualbox/abstract_model/dirty_test.rb +83 -0
- data/test/virtualbox/abstract_model/interface_attributes_test.rb +194 -0
- data/test/virtualbox/abstract_model/relatable_test.rb +348 -0
- data/test/virtualbox/abstract_model/validatable_test.rb +308 -0
- data/test/virtualbox/abstract_model/version_matcher_test.rb +41 -0
- data/test/virtualbox/abstract_model_test.rb +462 -0
- data/test/virtualbox/appliance_test.rb +159 -0
- data/test/virtualbox/audio_adapter_test.rb +83 -0
- data/test/virtualbox/bios_test.rb +83 -0
- data/test/virtualbox/com/abstract_enum_test.rb +49 -0
- data/test/virtualbox/com/abstract_implementer_test.rb +40 -0
- data/test/virtualbox/com/abstract_interface_test.rb +140 -0
- data/test/virtualbox/com/ffi/interface_test.rb +249 -0
- data/test/virtualbox/com/ffi/util_test.rb +108 -0
- data/test/virtualbox/com/ffi_interface_test.rb +42 -0
- data/test/virtualbox/com/implementer/base_test.rb +38 -0
- data/test/virtualbox/com/implementer/ffi_test.rb +527 -0
- data/test/virtualbox/com/implementer/mscom_test.rb +247 -0
- data/test/virtualbox/com/mscom_interface_test.rb +17 -0
- data/test/virtualbox/com/util_test.rb +17 -0
- data/test/virtualbox/cpu_test.rb +103 -0
- data/test/virtualbox/dhcp_server_test.rb +165 -0
- data/test/virtualbox/dvd_test.rb +28 -0
- data/test/virtualbox/ext/byte_normalizer_test.rb +34 -0
- data/test/virtualbox/ext/platform_test.rb +50 -0
- data/test/virtualbox/ext/subclass_listing_test.rb +25 -0
- data/test/virtualbox/extra_data_test.rb +155 -0
- data/test/virtualbox/forwarded_port_test.rb +286 -0
- data/test/virtualbox/global_test.rb +46 -0
- data/test/virtualbox/hard_drive_test.rb +141 -0
- data/test/virtualbox/host_network_interface_test.rb +254 -0
- data/test/virtualbox/host_test.rb +94 -0
- data/test/virtualbox/hw_virtualization_test.rb +103 -0
- data/test/virtualbox/lib_test.rb +93 -0
- data/test/virtualbox/medium_attachment_test.rb +147 -0
- data/test/virtualbox/medium_test.rb +192 -0
- data/test/virtualbox/nat_engine_test.rb +106 -0
- data/test/virtualbox/nat_forwarded_port_test.rb +222 -0
- data/test/virtualbox/network_adapter_test.rb +191 -0
- data/test/virtualbox/proxies/collection_test.rb +102 -0
- data/test/virtualbox/shared_folder_test.rb +219 -0
- data/test/virtualbox/snapshot_test.rb +231 -0
- data/test/virtualbox/storage_controller_test.rb +197 -0
- data/test/virtualbox/system_properties_test.rb +87 -0
- data/test/virtualbox/usb_controller_test.rb +112 -0
- data/test/virtualbox/usb_device_filter_test.rb +93 -0
- data/test/virtualbox/version_test.rb +59 -0
- data/test/virtualbox/virtual_system_description_test.rb +61 -0
- data/test/virtualbox/vm_test.rb +637 -0
- data/test/virtualbox/vrdp_server_test.rb +83 -0
- data/test/virtualbox_test.rb +11 -0
- data/virtualbox.gemspec +25 -0
- metadata +397 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module VirtualBox
|
|
2
|
+
# Represents the VRDP Server settings of a {VM}.
|
|
3
|
+
class VRDPServer < AbstractModel
|
|
4
|
+
attribute :parent, :readonly => true, :property => false
|
|
5
|
+
attribute :enabled, :boolean => true
|
|
6
|
+
attribute :ports
|
|
7
|
+
attribute :net_address
|
|
8
|
+
attribute :auth_type
|
|
9
|
+
attribute :auth_timeout
|
|
10
|
+
attribute :allow_multi_connection, :boolean => true
|
|
11
|
+
attribute :reuse_single_connection, :boolean => true
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
# Populates a relationship with another model.
|
|
15
|
+
#
|
|
16
|
+
# **This method typically won't be used except internally.**
|
|
17
|
+
#
|
|
18
|
+
# @return [VRDPServer]
|
|
19
|
+
def populate_relationship(caller, imachine)
|
|
20
|
+
data = new(caller, imachine.vrdp_server)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Saves the relationship.
|
|
24
|
+
#
|
|
25
|
+
# **This method typically won't be used except internally.**
|
|
26
|
+
def save_relationship(caller, instance)
|
|
27
|
+
instance.save
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def initialize(parent, vrdp_settings)
|
|
32
|
+
write_attribute(:parent, parent)
|
|
33
|
+
|
|
34
|
+
# Load the attributes and mark the whole thing as existing
|
|
35
|
+
load_interface_attributes(vrdp_settings)
|
|
36
|
+
clear_dirty!
|
|
37
|
+
existing_record!
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def validate
|
|
41
|
+
super
|
|
42
|
+
|
|
43
|
+
validates_inclusion_of :enabled, :allow_multi_connection, :reuse_single_connection, :in => [true, false]
|
|
44
|
+
validates_format_of :ports, :with => /^[\d\s\-\.]+$/, :message => "must only contain numbers, spaces, dashes or periods."
|
|
45
|
+
validates_format_of :net_address, :with => /^[\w\d\-\.]+$/, :message => "must only contain latters, numbers, dashes or periods."
|
|
46
|
+
validates_inclusion_of :auth_type, :in => COM::Util.versioned_interface(:VRDPAuthType).map
|
|
47
|
+
validates_numericality_of :auth_timeout
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def save
|
|
51
|
+
parent.with_open_session do |session|
|
|
52
|
+
machine = session.machine
|
|
53
|
+
|
|
54
|
+
# Save them
|
|
55
|
+
save_changed_interface_attributes(machine.vrdp_server)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# ruby-debug, not necessary, but useful if we have it
|
|
2
|
+
begin
|
|
3
|
+
require 'ruby-debug'
|
|
4
|
+
rescue LoadError; end
|
|
5
|
+
|
|
6
|
+
require 'contest'
|
|
7
|
+
require 'mocha'
|
|
8
|
+
require 'virtualbox'
|
|
9
|
+
|
|
10
|
+
# Data
|
|
11
|
+
class Test::Unit::TestCase
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Initialize the FFI stuff. This is typically done dynamically when
|
|
15
|
+
# FFI is initialized (on non-windows machines). Since the tests test
|
|
16
|
+
# the FFI classes, we force initialize a specific version here. It
|
|
17
|
+
# doesn't matter what version, since no actual FFI calls are made.
|
|
18
|
+
VirtualBox::COM::FFI.setup("3.2.x") unless defined?(VirtualBox::COM::FFI::Version_3_2_X)
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
require File.expand_path("../../../test_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
class AttributableTest < Test::Unit::TestCase
|
|
4
|
+
class EmptyAttributeModel
|
|
5
|
+
include VirtualBox::AbstractModel::Attributable
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class AttributeModel < EmptyAttributeModel
|
|
9
|
+
attribute :foo
|
|
10
|
+
attribute :bar
|
|
11
|
+
attribute :boolean_bar, :boolean => true
|
|
12
|
+
|
|
13
|
+
def initialize
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "subclasses" do
|
|
19
|
+
class SubModel < AttributeModel
|
|
20
|
+
attribute :baz
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "have foo bar and baz" do
|
|
24
|
+
attributes = SubModel.attributes
|
|
25
|
+
assert attributes.has_key?(:foo)
|
|
26
|
+
assert attributes.has_key?(:bar)
|
|
27
|
+
assert attributes.has_key?(:baz)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "attribute scopes" do
|
|
32
|
+
class AttributeScopeA < EmptyAttributeModel
|
|
33
|
+
attribute :foo
|
|
34
|
+
attribute_scope(:bar => 7) do
|
|
35
|
+
attribute :foo2
|
|
36
|
+
|
|
37
|
+
attribute_scope(:baz => 3) do
|
|
38
|
+
attribute :bazzed
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
attribute :foo3, :bar => 10
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
setup do
|
|
46
|
+
@klass = AttributeScopeA
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
should "use attribute scope" do
|
|
50
|
+
assert_equal 7, @klass.attributes[:foo2][:bar]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
should "not use attribute scope outside of the block" do
|
|
54
|
+
assert !@klass.attributes[:foo].has_key?(:bar)
|
|
55
|
+
assert_equal 10, @klass.attributes[:foo3][:bar]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
should "properly nest" do
|
|
59
|
+
bazzed = @klass.attributes[:bazzed]
|
|
60
|
+
assert_equal 3, bazzed[:baz]
|
|
61
|
+
assert_equal 7, bazzed[:bar]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "attribute options" do
|
|
66
|
+
context "custom populate keys" do
|
|
67
|
+
class CustomPopulateModel < AttributeModel
|
|
68
|
+
attribute :foo, :populate_key => :foo_key
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
setup do
|
|
72
|
+
@model = CustomPopulateModel.new
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
should "use the populate key instead of the attribute name" do
|
|
76
|
+
@model.populate_attributes({
|
|
77
|
+
:foo => "not me!",
|
|
78
|
+
:foo_key => "bar"
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
assert_equal "bar", @model.foo
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
context "readonly attributes" do
|
|
86
|
+
class ReadonlyModel < AttributeModel
|
|
87
|
+
attribute :foo, :readonly => :readonly
|
|
88
|
+
|
|
89
|
+
def initialize
|
|
90
|
+
super
|
|
91
|
+
populate_attributes({ :foo => "foo" })
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
setup do
|
|
96
|
+
@model = ReadonlyModel.new
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
should "be readonly" do
|
|
100
|
+
assert @model.readonly_attribute?(:foo)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
should "allow reading" do
|
|
104
|
+
assert_equal "foo", @model.foo
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
should "not allow writing" do
|
|
108
|
+
assert_raises(NoMethodError) { @model.foo = "YO" }
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "default values" do
|
|
113
|
+
class DefaultModel < EmptyAttributeModel
|
|
114
|
+
attribute :foo, :default => "FOO!"
|
|
115
|
+
attribute :bar
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
setup do
|
|
119
|
+
@model = DefaultModel.new
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
should "read default values" do
|
|
123
|
+
assert_equal "FOO!", @model.foo
|
|
124
|
+
assert_nil @model.bar
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
context "lazy loading" do
|
|
129
|
+
class LazyModel < EmptyAttributeModel
|
|
130
|
+
attribute :foo, :lazy => true
|
|
131
|
+
attribute :bar
|
|
132
|
+
|
|
133
|
+
def load_attribute(attribute)
|
|
134
|
+
write_attribute(attribute, "foo")
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
setup do
|
|
139
|
+
@model = LazyModel.new
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
should "return proper value for lazy_attribute?" do
|
|
143
|
+
assert @model.lazy_attribute?(:foo)
|
|
144
|
+
assert !@model.lazy_attribute?(:bar)
|
|
145
|
+
assert !@model.lazy_attribute?(:i_dont_exist)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
should "load the lazy attribute on read" do
|
|
149
|
+
assert !@model.loaded_attribute?(:foo)
|
|
150
|
+
assert_equal "foo", @model.foo
|
|
151
|
+
assert @model.loaded_attribute?(:foo)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
should "not be loaded initially, then should be loaded after being read" do
|
|
155
|
+
assert !@model.loaded_attribute?(:foo)
|
|
156
|
+
@model.foo
|
|
157
|
+
assert @model.loaded_attribute?(:foo)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
should "mark as loaded if write_attribute is called on an attribute" do
|
|
161
|
+
assert !@model.loaded_attribute?(:foo)
|
|
162
|
+
@model.write_attribute(:foo, "bar")
|
|
163
|
+
assert @model.loaded_attribute?(:foo)
|
|
164
|
+
assert_equal "bar", @model.foo
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
context "populating attributes" do
|
|
170
|
+
setup do
|
|
171
|
+
@model = AttributeModel.new
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
should "write all valid attributes" do
|
|
175
|
+
new_attributes = {
|
|
176
|
+
:foo => "zxcv",
|
|
177
|
+
:bar => "qwerty"
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@model.populate_attributes(new_attributes)
|
|
181
|
+
new_attributes.each do |k,v|
|
|
182
|
+
assert_equal v, @model.send(k)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
should "not load nonexistent keys" do
|
|
187
|
+
new_attributes = {
|
|
188
|
+
:foo => "zxcv"
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@model.populate_attributes(new_attributes)
|
|
192
|
+
assert @model.loaded_attribute?(:foo)
|
|
193
|
+
assert !@model.loaded_attribute?(:bar)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
context "reading and writing attributes" do
|
|
198
|
+
class VersionedAttributeModel < AttributeModel
|
|
199
|
+
attribute :ver, :version => "3.1"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
setup do
|
|
203
|
+
@model = VersionedAttributeModel.new
|
|
204
|
+
@model.populate_attributes({
|
|
205
|
+
:foo => "foo",
|
|
206
|
+
:bar => false,
|
|
207
|
+
:ver => "ver"
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
@checkstring = "HEY"
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
should "be able to read an entire hash of attributes" do
|
|
214
|
+
atts = @model.attributes
|
|
215
|
+
assert atts.is_a?(Hash)
|
|
216
|
+
assert atts.has_key?(:foo)
|
|
217
|
+
assert atts.has_key?(:bar)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
should "be able to access boolean values with a '?'" do
|
|
221
|
+
@model.boolean_bar = true
|
|
222
|
+
assert @model.boolean_bar?
|
|
223
|
+
@model.boolean_bar = false
|
|
224
|
+
assert !@model.boolean_bar?
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
should "be able to write defined attributes" do
|
|
228
|
+
assert_nothing_raised {
|
|
229
|
+
@model.foo = @check_string
|
|
230
|
+
}
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
should "be able to read defined attributes" do
|
|
234
|
+
assert_nothing_raised {
|
|
235
|
+
assert_equal "foo", @model.foo
|
|
236
|
+
}
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
should "raise an exception if version not supported" do
|
|
240
|
+
VirtualBox.stubs(:version).returns("3.0.14")
|
|
241
|
+
|
|
242
|
+
assert_raises(VirtualBox::Exceptions::UnsupportedVersionException) {
|
|
243
|
+
@model.ver
|
|
244
|
+
}
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
should "read value if version supported" do
|
|
248
|
+
VirtualBox.stubs(:version).returns("3.1.8")
|
|
249
|
+
|
|
250
|
+
assert_nothing_raised {
|
|
251
|
+
assert_equal "ver", @model.ver
|
|
252
|
+
}
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
should "understand false values" do
|
|
256
|
+
assert_nothing_raised {
|
|
257
|
+
assert_equal false, @model.bar
|
|
258
|
+
}
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
should "raise an error if attempting to write an undefined attribute" do
|
|
262
|
+
assert_raises(NoMethodError) { @model.baz = @check_string }
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
should "raise an error if attempting to read an undefined attribute" do
|
|
266
|
+
assert_raises(NoMethodError) { @model.baz }
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require File.expand_path("../../../test_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
class DirtyTest < Test::Unit::TestCase
|
|
4
|
+
class DirtyModel
|
|
5
|
+
include VirtualBox::AbstractModel::Dirty
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@foo = "foo"
|
|
9
|
+
@bar = "bar"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def foo=(value)
|
|
13
|
+
set_dirty!("foo", @foo, value)
|
|
14
|
+
@foo = value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def bar=(value)
|
|
18
|
+
set_dirty!(:bar, @bar, value)
|
|
19
|
+
@bar = value
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "dirty attributes" do
|
|
24
|
+
setup do
|
|
25
|
+
@model = DirtyModel.new
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
should "not be dirty initially" do
|
|
29
|
+
assert !@model.changed?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
should "be dirty after changing an attribute" do
|
|
33
|
+
assert !@model.changed? # sanity
|
|
34
|
+
@model.foo = "my value"
|
|
35
|
+
assert @model.changed?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "be able to clear dirty state" do
|
|
39
|
+
assert !@model.changed?
|
|
40
|
+
@model.foo = "my value"
|
|
41
|
+
assert @model.changed?
|
|
42
|
+
@model.clear_dirty!(:foo)
|
|
43
|
+
assert !@model.changed?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
should "be able to clear dirty state on entire model" do
|
|
47
|
+
@model.foo = "changed"
|
|
48
|
+
@model.bar = "changed"
|
|
49
|
+
assert @model.changed?
|
|
50
|
+
@model.clear_dirty!
|
|
51
|
+
assert !@model.changed?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
should "show changes on specific field" do
|
|
55
|
+
assert !@model.changed?
|
|
56
|
+
@model.foo = "my value"
|
|
57
|
+
assert @model.foo_changed?
|
|
58
|
+
assert_equal ["foo", "my value"], @model.foo_change
|
|
59
|
+
assert_equal "foo", @model.foo_was
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
should "return nil for field_was if its not changed" do
|
|
63
|
+
assert !@model.foo_changed?
|
|
64
|
+
assert_nil @model.foo_was
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
should "show changes for the whole model" do
|
|
68
|
+
assert !@model.changed?
|
|
69
|
+
@model.foo = "foo2"
|
|
70
|
+
@model.bar = "bar2"
|
|
71
|
+
|
|
72
|
+
assert @model.changed?
|
|
73
|
+
changes = @model.changes
|
|
74
|
+
assert_equal 2, changes.length
|
|
75
|
+
assert_equal ["foo", "foo2"], changes[:foo]
|
|
76
|
+
assert_equal ["bar", "bar2"], changes[:bar]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
should "still forward non-dirty magic methods up method_missing" do
|
|
80
|
+
assert_raises(NoMethodError) { @model.foobarbaz }
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require File.expand_path("../../../test_helper", __FILE__)
|
|
2
|
+
|
|
3
|
+
class InterfaceAttributesTest < Test::Unit::TestCase
|
|
4
|
+
class EmptyInterfaceAttributeModel
|
|
5
|
+
include VirtualBox::AbstractModel::Attributable
|
|
6
|
+
include VirtualBox::AbstractModel::InterfaceAttributes
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class InterfaceAttributeModel < EmptyInterfaceAttributeModel
|
|
10
|
+
attribute :foo
|
|
11
|
+
attribute :foo2, :property_getter => :get_foo, :property_setter => :set_foo
|
|
12
|
+
attribute :foo3, :property => :grab_foo3, :readonly => true
|
|
13
|
+
attribute :foo4, :property => :put_foo4
|
|
14
|
+
attribute :bar, :property => false
|
|
15
|
+
attribute :ver, :version => "3.1.3"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "converting spec to a proc" do
|
|
19
|
+
setup do
|
|
20
|
+
@instance = EmptyInterfaceAttributeModel.new
|
|
21
|
+
@interface = mock("interface")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "symbols" do
|
|
25
|
+
should "convert to a proc which calls the symbol on the interface" do
|
|
26
|
+
result = mock("result")
|
|
27
|
+
proc = @instance.spec_to_proc(:foo)
|
|
28
|
+
@interface.expects(:foo).once.returns(result)
|
|
29
|
+
assert_equal result, proc.call(nil, @interface)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
should "forward all parameters" do
|
|
33
|
+
result = mock("result")
|
|
34
|
+
proc = @instance.spec_to_proc(:foo)
|
|
35
|
+
@interface.expects(:foo).with(1, 2, 3).once.returns(result)
|
|
36
|
+
assert_equal result, proc.call(nil, @interface, :key, 1, 2, 3)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "procs" do
|
|
41
|
+
should "leave proc as is" do
|
|
42
|
+
result = mock("result")
|
|
43
|
+
proc = Proc.new { |m| result }
|
|
44
|
+
converted = @instance.spec_to_proc(proc)
|
|
45
|
+
assert_equal proc, converted
|
|
46
|
+
assert_equal result, converted.call(@interface)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "loading a single interface attribute" do
|
|
52
|
+
setup do
|
|
53
|
+
@instance = InterfaceAttributeModel.new
|
|
54
|
+
@interface = mock("interface")
|
|
55
|
+
@interface.stubs(:foo).returns("foo")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
should "return immediately if not a valid attribute" do
|
|
59
|
+
@proc.expects(:call).never
|
|
60
|
+
@instance.load_interface_attribute(:baz, @interface)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
should "return immediately if is marked as a non-property" do
|
|
64
|
+
@proc.expects(:call).never
|
|
65
|
+
@instance.load_interface_attribute(:bar, @interface)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "return immediately if version mismatch" do
|
|
69
|
+
VirtualBox.stubs(:version).returns("3.2.4")
|
|
70
|
+
@interface.expects(:ver).never
|
|
71
|
+
@instance.load_interface_attribute(:ver, @interface)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
should "load the attribute if version matches" do
|
|
75
|
+
VirtualBox.stubs(:version).returns("3.1.3")
|
|
76
|
+
@interface.expects(:ver).returns("foo")
|
|
77
|
+
@instance.load_interface_attribute(:ver, @interface)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
should "use the getter specified if exists" do
|
|
81
|
+
key = :foo2
|
|
82
|
+
@interface.expects(:get_foo).returns(:bar)
|
|
83
|
+
@instance.expects(:write_attribute).with(key, :bar)
|
|
84
|
+
@instance.load_interface_attribute(key, @interface)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
should "use the property specified first" do
|
|
88
|
+
key = :foo3
|
|
89
|
+
@interface.expects(:grab_foo3).returns(:bar)
|
|
90
|
+
@instance.expects(:write_attribute).with(key, :bar)
|
|
91
|
+
@instance.load_interface_attribute(key, @interface)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
should "use the attribute name if no getter is specified" do
|
|
95
|
+
key = :foo
|
|
96
|
+
@interface.expects(:foo).returns(:bar)
|
|
97
|
+
@instance.expects(:write_attribute).with(key, :bar)
|
|
98
|
+
@instance.load_interface_attribute(key, @interface)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
should "write the attribute with the value of the proc" do
|
|
102
|
+
key = :foo
|
|
103
|
+
@instance.expects(:write_attribute).with(key, "foo").once
|
|
104
|
+
@instance.load_interface_attribute(key, @interface)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "saving a single interface attribute" do
|
|
109
|
+
setup do
|
|
110
|
+
@instance = InterfaceAttributeModel.new
|
|
111
|
+
@interface = mock("interface")
|
|
112
|
+
|
|
113
|
+
@value = :bar
|
|
114
|
+
@instance.stubs(:read_attribute).with(anything).returns(@value)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
should "return immediately if not a valid attribute" do
|
|
118
|
+
@proc.expects(:call).never
|
|
119
|
+
@instance.save_interface_attribute(:baz, @interface)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
should "return immediately if attribute doesn't have an interface setter" do
|
|
123
|
+
@proc.expects(:call).never
|
|
124
|
+
@instance.save_interface_attribute(:bar, @interface)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
should "return immediately if version mismatch" do
|
|
128
|
+
VirtualBox.stubs(:version).returns("3.2.4")
|
|
129
|
+
@interface.expects(:ver).never
|
|
130
|
+
@instance.save_interface_attribute(:ver, @interface)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
should "load the attribute if version matches" do
|
|
134
|
+
VirtualBox.stubs(:version).returns("3.1.3")
|
|
135
|
+
@interface.expects(:ver=)
|
|
136
|
+
@instance.save_interface_attribute(:ver, @interface)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
should "save the attribute with the value of the proc" do
|
|
140
|
+
key = :foo
|
|
141
|
+
@interface.expects(:foo=).with(@value).once
|
|
142
|
+
@instance.save_interface_attribute(key, @interface)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
should "use the property specified first" do
|
|
146
|
+
key = :foo4
|
|
147
|
+
@interface.expects(:put_foo4).returns(:bar)
|
|
148
|
+
@instance.save_interface_attribute(key, @interface)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
should "use the setter if it exists" do
|
|
152
|
+
key = :foo2
|
|
153
|
+
@interface.expects(:set_foo).with(@value).once
|
|
154
|
+
@instance.save_interface_attribute(key, @interface)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
should "not save readonly attributes" do
|
|
158
|
+
key = :foo3
|
|
159
|
+
@interface.expects(:foo3=).never
|
|
160
|
+
@instance.save_interface_attribute(key, @interface)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
context "loading all interface attributes" do
|
|
165
|
+
setup do
|
|
166
|
+
@instance = InterfaceAttributeModel.new
|
|
167
|
+
@interface = mock('interface')
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
should "load each" do
|
|
171
|
+
load_seq = sequence("load_seq")
|
|
172
|
+
InterfaceAttributeModel.attributes.each do |key, options|
|
|
173
|
+
@instance.expects(:load_interface_attribute).with(key, @interface)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
@instance.load_interface_attributes(@interface)
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context "saving all interface attributes" do
|
|
181
|
+
setup do
|
|
182
|
+
@instance = InterfaceAttributeModel.new
|
|
183
|
+
@interface = mock('interface')
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
should "save each" do
|
|
187
|
+
InterfaceAttributeModel.attributes.each do |key, options|
|
|
188
|
+
@instance.expects(:save_interface_attribute).with(key, @interface)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
@instance.save_interface_attributes(@interface)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|