vmsim 0.2.4 → 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +69 -0
- data/README.md +36 -0
- data/Rakefile +6 -33
- data/doc/handout.odt +0 -0
- data/lib/archive_builder.rb +1 -1
- data/lib/deploy/deployer.rb +9 -13
- data/lib/version.rb +1 -0
- data/lib/vmsim.rb +5 -0
- data/vmsim.gemspec +20 -87
- metadata +91 -92
- data/VERSION +0 -1
- data/test/adapter/actuator_collection_test.rb +0 -106
- data/test/adapter/sensor_collection_test.rb +0 -51
- data/test/deploy/deployer_test.rb +0 -114
- data/test/deploy/was_run.sh +0 -5
- data/test/devices/devices_test.rb +0 -78
- data/test/hardware/bin_test.rb +0 -57
- data/test/hardware/button_test.rb +0 -23
- data/test/hardware/can_test.rb +0 -11
- data/test/hardware/cash_register_test.rb +0 -157
- data/test/hardware/component_test.rb +0 -37
- data/test/hardware/display_test.rb +0 -94
- data/test/hardware/drawer_test.rb +0 -100
- data/test/hardware/enum_test.rb +0 -33
- data/test/hardware/simulator_test.rb +0 -189
- data/test/test_helper.rb +0 -5
@@ -1,106 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'hardware_adapter'
|
3
|
-
|
4
|
-
module Adapter
|
5
|
-
class ActuatorCollectionTest < Test::Unit::TestCase
|
6
|
-
attr_reader :actuator_collection, :actuator_called, :other_actuator_called
|
7
|
-
def setup
|
8
|
-
@actuator_collection = ActuatorCollection.new(SynchronousFirer)
|
9
|
-
@actuator_called = false
|
10
|
-
@other_actuator_called = false
|
11
|
-
actuator_collection.create_actuator_for('some_actuator') do
|
12
|
-
@actuator_called = true
|
13
|
-
end
|
14
|
-
actuator_collection.create_actuator_for(:some_other_actuator) do
|
15
|
-
@other_actuator_called = true
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_list_lists_actuators
|
20
|
-
assert_equal [:some_actuator, :some_other_actuator], actuator_collection.list
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_actuators_not_called_if_not_fired
|
24
|
-
assert_equal false, actuator_called, "this actuator should not be called yet"
|
25
|
-
assert_equal false, other_actuator_called, "this actuator should not be called yet"
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_calls_block_given_for_any_actuator
|
29
|
-
actuator_collection.fire(:some_actuator)
|
30
|
-
actuator_collection.fire(:some_other_actuator)
|
31
|
-
|
32
|
-
assert actuator_called, "actuator should be called on fire"
|
33
|
-
assert other_actuator_called, "actuator should be called on fire"
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_actuator_block_can_accept_parameters
|
37
|
-
int_val = -1
|
38
|
-
string_val = ""
|
39
|
-
actuator_collection.create_actuator_for(:parametarized_actuator) do |param1, param2|
|
40
|
-
int_val = param1
|
41
|
-
string_val = param2
|
42
|
-
end
|
43
|
-
actuator_collection.fire(:parametarized_actuator, 34, "gijs")
|
44
|
-
|
45
|
-
assert_equal 34, int_val
|
46
|
-
assert_equal "gijs", string_val
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_actuator_block_may_skip_parameters
|
50
|
-
int_val = -1
|
51
|
-
string_val = ""
|
52
|
-
actuator_collection.create_actuator_for(:parametarized_actuator) do |param1, param2|
|
53
|
-
int_val = param1
|
54
|
-
string_val = param2
|
55
|
-
end
|
56
|
-
actuator_collection.fire(:parametarized_actuator, 34, "gijs", "truus")
|
57
|
-
|
58
|
-
assert_equal 34, int_val
|
59
|
-
assert_equal "gijs", string_val
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_raises_exception_on_firing_unknown_actuator
|
63
|
-
assert_raises NoSuchActuatorException do
|
64
|
-
actuator_collection.fire(:unknown_actuator)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_raises_exception_on_no_block_given
|
69
|
-
assert_raises NoActuatorBlockGiven do
|
70
|
-
actuator_collection.create_actuator_for(:actuator_no_block)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_raises_exception_on_duplicate_actuator
|
75
|
-
assert_raises DuplicateActuatorException do
|
76
|
-
actuator_collection.create_actuator_for(:some_actuator) {}
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class AsynchronousFirerTest < Test::Unit::TestCase
|
82
|
-
def test_fires_on_other_thread
|
83
|
-
fired = false
|
84
|
-
firer = AsynchronousFirer.new do
|
85
|
-
sleep(0.1)
|
86
|
-
fired = true
|
87
|
-
end
|
88
|
-
t = firer.fire
|
89
|
-
assert_equal false, fired, "should not be fired"
|
90
|
-
t.join
|
91
|
-
assert fired, "should be fired"
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_fires_on_other_thread_with_parameters
|
95
|
-
fired = ''
|
96
|
-
firer = AsynchronousFirer.new do |value|
|
97
|
-
sleep(0.1)
|
98
|
-
fired = value
|
99
|
-
end
|
100
|
-
t = firer.fire('passed string value')
|
101
|
-
assert_equal '', fired, "should not be fired"
|
102
|
-
t.join
|
103
|
-
assert_equal 'passed string value', fired, "should be fired"
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'hardware_adapter'
|
3
|
-
|
4
|
-
module Adapter
|
5
|
-
|
6
|
-
class SensorCollectionFireTest < Test::Unit::TestCase
|
7
|
-
attr_reader :sensors
|
8
|
-
def setup
|
9
|
-
@sensors = SensorCollection.new
|
10
|
-
sensors.create_sensor_for(:bin_entry)
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_list_lists_sensor
|
14
|
-
sensors.create_sensor_for(:something_entry)
|
15
|
-
assert_equal [:bin_entry, :something_entry], sensors.list
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_calls_block_given_for_a_sensor
|
19
|
-
bin_entry_fired = false
|
20
|
-
sensors.on(:bin_entry) do
|
21
|
-
bin_entry_fired = true
|
22
|
-
end
|
23
|
-
sensors.fire(:bin_entry)
|
24
|
-
assert bin_entry_fired, "bin_entry should be fired"
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_swallows_fire_silently_when_no_handler_defined
|
28
|
-
sensors.fire(:bin_entry)
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
class SensorCollectionFireWithoutReceptorsCreatedTest < Test::Unit::TestCase
|
34
|
-
attr_reader :sensors
|
35
|
-
def setup
|
36
|
-
@sensors = SensorCollection.new
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_swallows_fire_silently_when_no_handler_defined
|
40
|
-
sensors.fire(:bin_entry)
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_on_raises_a_no_such_sensor_exception
|
44
|
-
assert_raises NoSuchSensorException do
|
45
|
-
sensors.on(:bin_entry) {}
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
@@ -1,114 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'deploy'
|
3
|
-
require 'tmpdir'
|
4
|
-
require 'archive_builder'
|
5
|
-
|
6
|
-
module Deploy
|
7
|
-
module DeployerTestHelper
|
8
|
-
attr_reader :deployer
|
9
|
-
def create_deployer
|
10
|
-
@deployer = Deployer.new(File.expand_path(File.join(File.dirname(__FILE__), 'was_run.sh')))
|
11
|
-
end
|
12
|
-
def deploy(archive)
|
13
|
-
create_deployer
|
14
|
-
deployer.deploy archive
|
15
|
-
end
|
16
|
-
def is_running(pid)
|
17
|
-
begin
|
18
|
-
Process.kill(0, pid)
|
19
|
-
return true
|
20
|
-
rescue
|
21
|
-
return false
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class DeployerDeployTest < Test::Unit::TestCase
|
27
|
-
include ArchiveBuilder
|
28
|
-
include DeployerTestHelper
|
29
|
-
include FileUtils
|
30
|
-
def teardown
|
31
|
-
rm_r './tmp' if File.exists?('./tmp')
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_unzips_the_archive_and_fires_the_executable
|
35
|
-
deploy an_archive('controlcode.pkg') {
|
36
|
-
a_file("main.rb").with("puts 'was unpacked'")
|
37
|
-
}
|
38
|
-
assert is_running(deployer.current_pid)
|
39
|
-
assert_match /was started.*was unpacked/m, deployer.wait_for.run_log
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_unzips_the_archive_with_relative_path_and_fires_the_executable
|
43
|
-
deploy an_archive('controlcode.pkg', 'tmp') {
|
44
|
-
a_file("main.rb").with("puts 'was unpacked'")
|
45
|
-
}
|
46
|
-
assert is_running(deployer.current_pid)
|
47
|
-
assert_match /was started.*was unpacked/m, deployer.wait_for.run_log
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_clears_current_pid_on_exit
|
51
|
-
deploy an_archive('controlcode.pkg') {
|
52
|
-
a_file("main.rb").with("puts 'was unpacked'")
|
53
|
-
}
|
54
|
-
assert_nil deployer.wait_for.current_pid
|
55
|
-
assert !File.exists?(Deployer::PIDFILE), "PIDFILE should be gone"
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_removes_previous_files
|
59
|
-
deploy an_archive('controlcode.pkg') {
|
60
|
-
a_file("loaded_class.rb").with("class LoadedClass; end")
|
61
|
-
a_file("main.rb").with("require 'loaded_class'")
|
62
|
-
}
|
63
|
-
|
64
|
-
deploy an_archive('controlcode.pkg') {
|
65
|
-
a_file("main.rb").with("puts 'was unpacked'")
|
66
|
-
}
|
67
|
-
|
68
|
-
assert !File.exists?(File.join(Deployer::DEPLOYED_DIR, 'loaded_class.rb')), "loaded class should be removed"
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_removes_previous_directories
|
72
|
-
deploy an_archive('controlcode.pkg') {
|
73
|
-
a_file("lib/loaded_class.rb").with("class LoadedClass; end")
|
74
|
-
a_file("main.rb").with("require 'lib/loaded_class'")
|
75
|
-
}
|
76
|
-
|
77
|
-
deploy an_archive('controlcode.pkg') {
|
78
|
-
a_file("main.rb").with("puts 'was unpacked'")
|
79
|
-
}
|
80
|
-
|
81
|
-
assert !File.exists?(File.join(Deployer::DEPLOYED_DIR, 'loaded_class.rb')), "loaded class should be removed"
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_kills_the_current_running_process_and_starts_new_one
|
85
|
-
deploy an_archive('controlcode.pkg') {
|
86
|
-
a_file("main.rb").with("sleep 1")
|
87
|
-
}
|
88
|
-
old_process_id = deployer.current_pid
|
89
|
-
|
90
|
-
deploy an_archive('controlcode.pkg') {
|
91
|
-
a_file("main.rb").with("puts 'was unpacked'")
|
92
|
-
}
|
93
|
-
|
94
|
-
assert !is_running(old_process_id), "process should be stopped before starting new"
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
class DeployerKillTest < Test::Unit::TestCase
|
100
|
-
include ArchiveBuilder
|
101
|
-
include DeployerTestHelper
|
102
|
-
|
103
|
-
def test_kills_the_current_running_process
|
104
|
-
deploy an_archive('controlcode.pkg') {
|
105
|
-
a_file("main.rb").with("sleep 20")
|
106
|
-
}
|
107
|
-
process_id = deployer.current_pid
|
108
|
-
create_deployer
|
109
|
-
deployer.kill
|
110
|
-
assert !is_running(process_id), "process should be stopped"
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
data/test/deploy/was_run.sh
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'mocha'
|
3
|
-
require 'devices'
|
4
|
-
|
5
|
-
module Devices
|
6
|
-
class DevicesTest < Test::Unit::TestCase
|
7
|
-
attr_reader :actuators, :sensors, :devices, :handler
|
8
|
-
def setup
|
9
|
-
@actuators = mock('actuatorcollection')
|
10
|
-
@sensors = mock('sensorcollection')
|
11
|
-
@devices = Devices.new(actuators, sensors)
|
12
|
-
@handler = 'not called'
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_display_show
|
16
|
-
actuators.expects(:fire).with(:display_show, 1, "test message")
|
17
|
-
devices.display_show(1, "test message")
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_button_on_press
|
21
|
-
sensors.expects(:on).with(:button_press_1).yields
|
22
|
-
devices.on_button_pressed(1) { handler_called }
|
23
|
-
assert_equal 'called', handler
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_bin_entry
|
27
|
-
sensors.expects(:on).with(:bin_entry).yields
|
28
|
-
devices.on_bin_entry { handler_called }
|
29
|
-
assert_equal 'called', handler
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_bin_fetch_all
|
33
|
-
sensors.expects(:on).with(:bin_fetch_all).yields
|
34
|
-
devices.on_bin_fetch_all { handler_called }
|
35
|
-
assert_equal 'called', handler
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_cash_register_fill_money
|
39
|
-
sensors.expects(:on).with(:cash_fill_100).yields
|
40
|
-
devices.on_cash_filled(100) { handler_called }
|
41
|
-
assert_equal 'called', handler
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_cash_register_insert_money
|
45
|
-
sensors.expects(:on).with(:cash_insert_100).yields
|
46
|
-
devices.on_cash_inserted(100) { handler_called }
|
47
|
-
assert_equal 'called', handler
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_cash_drop_drops_coin
|
51
|
-
actuators.expects(:fire).with(:cash_drop_100)
|
52
|
-
devices.cash_drop_coin(100)
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_drawer_register_can_dropped
|
56
|
-
sensors.expects(:on).with(:drawer_drop_can_0).yields
|
57
|
-
devices.on_drawer_dropped(0) { handler_called }
|
58
|
-
assert_equal 'called', handler
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_drawer_register_can_filled
|
62
|
-
sensors.expects(:on).with(:drawer_fill_can_0).yields
|
63
|
-
devices.on_drawer_filled(0) { handler_called }
|
64
|
-
assert_equal 'called', handler
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_drawer_drop_drops_can
|
68
|
-
actuators.expects(:fire).with(:drawer_drop_can_1)
|
69
|
-
devices.drawer_drop_can(1)
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def handler_called
|
75
|
-
@handler = 'called'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
data/test/hardware/bin_test.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'mocha'
|
3
|
-
require 'hardware'
|
4
|
-
require 'hardware_adapter'
|
5
|
-
|
6
|
-
module Hardware
|
7
|
-
class BinTest < Test::Unit::TestCase
|
8
|
-
attr_reader :bin, :sensor_collection
|
9
|
-
def setup
|
10
|
-
@sensor_collection = mock('sensor_collection')
|
11
|
-
@bin = Bin.new(sensor_collection)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_receive_fills_the_bin_with_the_item
|
15
|
-
sensor_collection.expects(:fire).with(:bin_entry)
|
16
|
-
bin.receive('some_object')
|
17
|
-
assert_equal(['some_object'], bin.contents)
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_fetch_the_stuff_empties_the_bin
|
21
|
-
sensor_collection.stubs(:fire).with(:bin_entry) # firing :bin_entry tested above
|
22
|
-
bin.receive('some_object')
|
23
|
-
bin.receive('some_object')
|
24
|
-
|
25
|
-
sensor_collection.expects(:fire).with(:bin_fetch_all)
|
26
|
-
bin.fetch_all
|
27
|
-
|
28
|
-
assert_equal([], bin.contents)
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_configure_configures_the_sensor_in_the_sensor_collection
|
32
|
-
sensor_collection.expects(:create_sensor_for).with(:bin_entry)
|
33
|
-
sensor_collection.expects(:create_sensor_for).with(:bin_fetch_all)
|
34
|
-
bin.configure
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_updates_ui_when_receiving_something
|
38
|
-
bin = Bin.new(Adapter::SensorCollection.null)
|
39
|
-
change_called = false
|
40
|
-
bin.monitor_changes do
|
41
|
-
change_called = true
|
42
|
-
end
|
43
|
-
bin.receive('some_object')
|
44
|
-
assert change_called, 'change was not called'
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_updates_ui_when_fetching_all
|
48
|
-
bin = Bin.new(Adapter::SensorCollection.null)
|
49
|
-
change_called = false
|
50
|
-
bin.monitor_changes do
|
51
|
-
change_called = true
|
52
|
-
end
|
53
|
-
bin.fetch_all
|
54
|
-
assert change_called, 'change was not called'
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'mocha'
|
3
|
-
require 'hardware'
|
4
|
-
|
5
|
-
module Hardware
|
6
|
-
class ButtonTest < Test::Unit::TestCase
|
7
|
-
attr_reader :sensor_collection, :button
|
8
|
-
def setup
|
9
|
-
@sensor_collection = mock('sensor_collection')
|
10
|
-
@button = Button.new(sensor_collection, 1)
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_press_fires_sensor
|
14
|
-
sensor_collection.expects(:fire).with(:button_press_1)
|
15
|
-
button.press
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_configure_configures_sensor_for_button_press
|
19
|
-
sensor_collection.expects(:create_sensor_for).with(:button_press_1)
|
20
|
-
button.configure
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/test/hardware/can_test.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'hardware'
|
3
|
-
|
4
|
-
module Hardware
|
5
|
-
class CanTest < Test::Unit::TestCase
|
6
|
-
def test_to_s_shows_can_name
|
7
|
-
assert_equal 'can of cola', Can.cola.to_s
|
8
|
-
assert_equal 'can of fanta', Can.fanta.to_s
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,157 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'mocha'
|
3
|
-
require 'hardware'
|
4
|
-
require 'hardware_adapter'
|
5
|
-
|
6
|
-
module Hardware
|
7
|
-
RIGHT_AWAY = 0
|
8
|
-
class CashRegisterDroppingCoinsInBin < Test::Unit::TestCase
|
9
|
-
attr_reader :register, :bin
|
10
|
-
def setup
|
11
|
-
@bin = mock('bin')
|
12
|
-
@register = CashRegister.new(bin, Adapter::SensorCollection.null, nil)
|
13
|
-
register.fill(Coin.two_euro, 1, RIGHT_AWAY)
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_drops_coin_in_bin
|
17
|
-
bin.expects(:receive).with(Coin.two_euro)
|
18
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_drops_nohting_when_empty
|
22
|
-
bin.expects(:receive).with(Coin.two_euro).never
|
23
|
-
register.drop_coin(Coin.one_euro, RIGHT_AWAY)
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_drops_eventually_empties_the_coin_stock
|
27
|
-
bin.expects(:receive).with(Coin.two_euro).once
|
28
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
29
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_filling_coins_adds_to_stock
|
33
|
-
register.fill(Coin.two_euro, 1, 0)
|
34
|
-
bin.expects(:receive).with(Coin.two_euro).twice
|
35
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
36
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
37
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_insert_coin_adds_it_to_stock
|
41
|
-
register.insert_coin(Coin.two_euro)
|
42
|
-
bin.expects(:receive).with(Coin.two_euro).twice
|
43
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
44
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
45
|
-
register.drop_coin(Coin.two_euro, RIGHT_AWAY)
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
class CashRegisterSensorFiringTest < Test::Unit::TestCase
|
51
|
-
attr_reader :register, :bin, :sensor_collection
|
52
|
-
|
53
|
-
def setup
|
54
|
-
@bin = stub('bin', :receive)
|
55
|
-
@sensor_collection = mock('sensor_collection')
|
56
|
-
@register = CashRegister.new(bin, sensor_collection, nil)
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_insert_two_euros_fires_cash_insert_200
|
60
|
-
sensor_collection.expects(:fire).with(:cash_insert_200)
|
61
|
-
register.insert_coin(Coin.two_euro)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_insert_one_euro_fires_cash_insert_100
|
65
|
-
sensor_collection.expects(:fire).with(:cash_insert_100)
|
66
|
-
register.insert_coin(Coin.one_euro)
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_insert_fifty_cents_fires_cash_insert_50
|
70
|
-
sensor_collection.expects(:fire).with(:cash_insert_50)
|
71
|
-
register.insert_coin(Coin.fifty_cents)
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_filling_two_euros_fires_cash_fills_200
|
75
|
-
sensor_collection.expects(:fire).with(:cash_fill_200).twice
|
76
|
-
register.fill(Coin.two_euro, 2, RIGHT_AWAY)
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_filling_one_euro_fires_cash_fills_100
|
80
|
-
sensor_collection.expects(:fire).with(:cash_fill_100).once
|
81
|
-
register.fill(Coin.one_euro, 1, RIGHT_AWAY)
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_filling_fifty_cents_fires_cash_fills_50
|
85
|
-
sensor_collection.expects(:fire).with(:cash_fill_50).twice
|
86
|
-
register.fill(Coin.fifty_cents, 2, RIGHT_AWAY)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
class CashRegisterConfigureTest < Test::Unit::TestCase
|
91
|
-
attr_reader :sensor_collection, :actuator_collection, :register
|
92
|
-
def setup
|
93
|
-
@sensor_collection = mock('sensor_collection')
|
94
|
-
@actuator_collection = mock('actuator_collection')
|
95
|
-
@register = CashRegister.new(nil, sensor_collection, actuator_collection)
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_configures_sensors_for_coins_insertions_and_actuators_for_coin_drops
|
99
|
-
sensor_collection.expects(:create_sensor_for).with(:cash_insert_200)
|
100
|
-
sensor_collection.expects(:create_sensor_for).with(:cash_insert_100)
|
101
|
-
sensor_collection.expects(:create_sensor_for).with(:cash_insert_50)
|
102
|
-
sensor_collection.expects(:create_sensor_for).with(:cash_fill_200)
|
103
|
-
sensor_collection.expects(:create_sensor_for).with(:cash_fill_100)
|
104
|
-
sensor_collection.expects(:create_sensor_for).with(:cash_fill_50)
|
105
|
-
actuator_collection.expects(:create_actuator_for).with(:cash_drop_200)
|
106
|
-
actuator_collection.expects(:create_actuator_for).with(:cash_drop_100)
|
107
|
-
actuator_collection.expects(:create_actuator_for).with(:cash_drop_50)
|
108
|
-
|
109
|
-
register.configure()
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
|
114
|
-
class MyCashRegister < CashRegister
|
115
|
-
def drop_coin(coin)
|
116
|
-
@coin = coin
|
117
|
-
end
|
118
|
-
def coin_dropped?(coin)
|
119
|
-
@coin == coin
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
class CashRegisterRespondingToActuatorsTest < Test::Unit::TestCase
|
124
|
-
attr_reader :sensor_collection, :actuator_collection, :register
|
125
|
-
def setup
|
126
|
-
@sensor_collection = mock('sensor_collection')
|
127
|
-
@actuator_collection = mock('actuator_collection')
|
128
|
-
@register = MyCashRegister.new(nil, sensor_collection, actuator_collection)
|
129
|
-
sensor_collection.stubs(:create_sensor_for)
|
130
|
-
actuator_collection.stubs(:create_actuator_for)
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_actuating_drop_200_drops_two_euro_coin_in_bin
|
134
|
-
actuator_collection.stubs(:create_actuator_for).with(:cash_drop_200).yields
|
135
|
-
|
136
|
-
register.configure()
|
137
|
-
|
138
|
-
assert register.coin_dropped?(Coin.two_euro), "two euro should be dropped"
|
139
|
-
end
|
140
|
-
|
141
|
-
def test_actuating_drop_100_drops_one_euro_coin_in_bin
|
142
|
-
actuator_collection.stubs(:create_actuator_for).with(:cash_drop_100).yields
|
143
|
-
|
144
|
-
register.configure()
|
145
|
-
|
146
|
-
assert register.coin_dropped?(Coin.one_euro), "one euro should be dropped"
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_actuating_drop_50_drops_fifty_cents_coin_in_bin
|
150
|
-
actuator_collection.stubs(:create_actuator_for).with(:cash_drop_50).yields
|
151
|
-
|
152
|
-
register.configure()
|
153
|
-
|
154
|
-
assert register.coin_dropped?(Coin.fifty_cents), "fifty cents should be dropped"
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'..','test_helper')
|
2
|
-
require 'hardware'
|
3
|
-
|
4
|
-
module Hardware
|
5
|
-
class MyComponent < Component
|
6
|
-
def changed # published protected method
|
7
|
-
super
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class ComponentMonitorChangesTest < Test::Unit::TestCase
|
12
|
-
attr_reader :component, :changed_block_called
|
13
|
-
def setup
|
14
|
-
@component = MyComponent.new(nil,nil)
|
15
|
-
@changed_block_called = 'changed_block_not_called'
|
16
|
-
component.monitor_changes do
|
17
|
-
@changed_block_called = 'changed_block_called'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_changes_block_initially_not_called
|
22
|
-
assert_equal 'changed_block_not_called', changed_block_called
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_changes_block_initially_called_when_changed
|
26
|
-
component.changed
|
27
|
-
assert_equal 'changed_block_called', changed_block_called
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_changed_ignored_when_block_not_registered
|
31
|
-
@component = MyComponent.new(nil,nil)
|
32
|
-
component.changed
|
33
|
-
assert_equal 'changed_block_not_called', changed_block_called
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|