minilab 1.0.0-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. data/.document +2 -0
  2. data/CHANGES +2 -0
  3. data/LICENSE +19 -0
  4. data/README +107 -0
  5. data/Rakefile +145 -0
  6. data/config/environment.rb +15 -0
  7. data/config/objects.yml +22 -0
  8. data/lib/analog_io.rb +30 -0
  9. data/lib/digital_auxport_io.rb +49 -0
  10. data/lib/digital_configuration.rb +66 -0
  11. data/lib/digital_port_io.rb +68 -0
  12. data/lib/extension/extconf.rb +4 -0
  13. data/lib/extension/minilab_hardware.c +235 -0
  14. data/lib/extension/minilab_hardware.so +0 -0
  15. data/lib/library_translator.rb +48 -0
  16. data/lib/minilab.rb +149 -0
  17. data/lib/minilab_context.rb +39 -0
  18. data/lib/result_verifier.rb +14 -0
  19. data/test/integration/analog_input_output_test.rb +43 -0
  20. data/test/integration/connect_to_hardware_test.rb +13 -0
  21. data/test/integration/digital_input_output_test.rb +114 -0
  22. data/test/integration/integration_test.rb +53 -0
  23. data/test/integration/require_minilab_test.rb +9 -0
  24. data/test/system/analog_input.test +3 -0
  25. data/test/system/analog_output.test +37 -0
  26. data/test/system/digital_port_input.test +5 -0
  27. data/test/system/digital_port_output.test +39 -0
  28. data/test/system/digital_port_read_byte.test +26 -0
  29. data/test/system/digital_screw_terminals_input.test +2 -0
  30. data/test/system/digital_screw_terminals_output.test +11 -0
  31. data/test/system/minilab_driver.rb +85 -0
  32. data/test/test_helper.rb +11 -0
  33. data/test/unit/analog_io_test.rb +87 -0
  34. data/test/unit/digital_auxport_io_test.rb +114 -0
  35. data/test/unit/digital_configuration_test.rb +136 -0
  36. data/test/unit/digital_port_io_test.rb +117 -0
  37. data/test/unit/library_translator_test.rb +100 -0
  38. data/test/unit/minilab_context_test.rb +82 -0
  39. data/test/unit/minilab_hardware_test.rb +83 -0
  40. data/test/unit/minilab_test.rb +131 -0
  41. data/test/unit/result_verifier_test.rb +33 -0
  42. data/vendor/behaviors/lib/behaviors.rb +50 -0
  43. data/vendor/behaviors/tasks/behaviors_tasks.rake +140 -0
  44. data/vendor/behaviors/test/behaviors_tasks_test.rb +71 -0
  45. data/vendor/behaviors/test/behaviors_test.rb +50 -0
  46. data/vendor/behaviors/test/tasks_test/Rakefile +16 -0
  47. data/vendor/behaviors/test/tasks_test/doc/behaviors.html +55 -0
  48. data/vendor/behaviors/test/tasks_test/lib/user.rb +2 -0
  49. data/vendor/behaviors/test/tasks_test/test/user_test.rb +17 -0
  50. data/vendor/constructor/Rakefile +44 -0
  51. data/vendor/constructor/config/environment.rb +12 -0
  52. data/vendor/constructor/lib/constructor.rb +132 -0
  53. data/vendor/constructor/test/constructor_test.rb +366 -0
  54. data/vendor/constructor/test/helper.rb +3 -0
  55. data/vendor/diy/README +26 -0
  56. data/vendor/diy/Rakefile +18 -0
  57. data/vendor/diy/lib/constructor.rb +114 -0
  58. data/vendor/diy/lib/diy.rb +329 -0
  59. data/vendor/diy/proto/context.rb +117 -0
  60. data/vendor/diy/proto/context.yml +20 -0
  61. data/vendor/diy/test/diy_test.rb +370 -0
  62. data/vendor/diy/test/files/broken_construction.yml +7 -0
  63. data/vendor/diy/test/files/cat/cat.rb +4 -0
  64. data/vendor/diy/test/files/cat/extra_conflict.yml +5 -0
  65. data/vendor/diy/test/files/cat/heritage.rb +2 -0
  66. data/vendor/diy/test/files/cat/needs_input.yml +3 -0
  67. data/vendor/diy/test/files/cat/the_cat_lineage.rb +1 -0
  68. data/vendor/diy/test/files/dog/dog_model.rb +4 -0
  69. data/vendor/diy/test/files/dog/dog_presenter.rb +4 -0
  70. data/vendor/diy/test/files/dog/dog_view.rb +2 -0
  71. data/vendor/diy/test/files/dog/file_resolver.rb +2 -0
  72. data/vendor/diy/test/files/dog/other_thing.rb +2 -0
  73. data/vendor/diy/test/files/dog/simple.yml +11 -0
  74. data/vendor/diy/test/files/donkey/foo.rb +8 -0
  75. data/vendor/diy/test/files/donkey/foo/bar/qux.rb +7 -0
  76. data/vendor/diy/test/files/fud/objects.yml +13 -0
  77. data/vendor/diy/test/files/fud/toy.rb +15 -0
  78. data/vendor/diy/test/files/gnu/objects.yml +14 -0
  79. data/vendor/diy/test/files/gnu/thinger.rb +8 -0
  80. data/vendor/diy/test/files/goat/base.rb +8 -0
  81. data/vendor/diy/test/files/goat/can.rb +6 -0
  82. data/vendor/diy/test/files/goat/goat.rb +6 -0
  83. data/vendor/diy/test/files/goat/objects.yml +12 -0
  84. data/vendor/diy/test/files/goat/paper.rb +6 -0
  85. data/vendor/diy/test/files/goat/plane.rb +8 -0
  86. data/vendor/diy/test/files/goat/shirt.rb +6 -0
  87. data/vendor/diy/test/files/goat/wings.rb +8 -0
  88. data/vendor/diy/test/files/horse/holder_thing.rb +4 -0
  89. data/vendor/diy/test/files/horse/objects.yml +7 -0
  90. data/vendor/diy/test/files/yak/core_model.rb +4 -0
  91. data/vendor/diy/test/files/yak/core_presenter.rb +4 -0
  92. data/vendor/diy/test/files/yak/core_view.rb +1 -0
  93. data/vendor/diy/test/files/yak/data_source.rb +1 -0
  94. data/vendor/diy/test/files/yak/fringe_model.rb +4 -0
  95. data/vendor/diy/test/files/yak/fringe_presenter.rb +4 -0
  96. data/vendor/diy/test/files/yak/fringe_view.rb +1 -0
  97. data/vendor/diy/test/files/yak/my_objects.yml +21 -0
  98. data/vendor/diy/test/test_helper.rb +40 -0
  99. data/vendor/hardmock/CHANGES +8 -0
  100. data/vendor/hardmock/LICENSE +7 -0
  101. data/vendor/hardmock/README +48 -0
  102. data/vendor/hardmock/Rakefile +100 -0
  103. data/vendor/hardmock/TODO +7 -0
  104. data/vendor/hardmock/config/environment.rb +12 -0
  105. data/vendor/hardmock/homepage/demo.rb +21 -0
  106. data/vendor/hardmock/homepage/hardmock_sample.png +0 -0
  107. data/vendor/hardmock/homepage/index.html +65 -0
  108. data/vendor/hardmock/init.rb +3 -0
  109. data/vendor/hardmock/lib/hardmock.rb +634 -0
  110. data/vendor/hardmock/lib/method_cleanout.rb +14 -0
  111. data/vendor/hardmock/rcov.rake +18 -0
  112. data/vendor/hardmock/test/functional/assert_error_test.rb +52 -0
  113. data/vendor/hardmock/test/functional/auto_verify_test.rb +192 -0
  114. data/vendor/hardmock/test/functional/direct_mock_usage_test.rb +396 -0
  115. data/vendor/hardmock/test/functional/hardmock_test.rb +380 -0
  116. data/vendor/hardmock/test/test_helper.rb +23 -0
  117. data/vendor/hardmock/test/unit/expectation_builder_test.rb +18 -0
  118. data/vendor/hardmock/test/unit/expector_test.rb +56 -0
  119. data/vendor/hardmock/test/unit/method_cleanout_test.rb +35 -0
  120. data/vendor/hardmock/test/unit/mock_control_test.rb +172 -0
  121. data/vendor/hardmock/test/unit/mock_test.rb +273 -0
  122. data/vendor/hardmock/test/unit/simple_expectation_test.rb +345 -0
  123. data/vendor/hardmock/test/unit/trapper_test.rb +60 -0
  124. data/vendor/hardmock/test/unit/verify_error_test.rb +34 -0
  125. data/vendor/systir/systir.rb +403 -0
  126. data/vendor/systir/test/unit/ui/xml/testrunner.rb +192 -0
  127. data/vendor/systir/test/unit/ui/xml/xmltestrunner.xslt +109 -0
  128. metadata +235 -0
@@ -0,0 +1,100 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/../test_helper"
2
+ require 'library_translator'
3
+ require 'extension/minilab_hardware'
4
+
5
+ class LibraryTranslatorTest < Test::Unit::TestCase
6
+ include MinilabConstants
7
+
8
+ def setup
9
+ @target = LibraryTranslator.new
10
+ end
11
+
12
+ def teardown
13
+ end
14
+
15
+ def check_pins_and_ports(low, high, port)
16
+ low.upto(high) do |pin|
17
+ assert_equal port, @target.get_port_for_pin(pin), "Didn't get #{port} for pin #{pin}"
18
+ end
19
+ end
20
+
21
+ # tests
22
+ should "provide :porta when asked about numbered pins on the hardware's FIRSTPORTA" do
23
+ check_pins_and_ports(30, 37, :porta)
24
+ end
25
+
26
+ should "provide :portb when asked about numbered pins on the hardware's FIRSTPORTB" do
27
+ check_pins_and_ports(3, 10, :portb)
28
+ end
29
+
30
+ should "provide :portcl when asked about numbered pins on the hardware's FIRSTPORTCL" do
31
+ check_pins_and_ports(26, 29, :portcl)
32
+ end
33
+
34
+ should "provide :portch when asked about numbered pins on the hardware's FIRSTPORTCH" do
35
+ check_pins_and_ports(22, 25, :portch)
36
+ end
37
+
38
+ should "raise an error when asked about a pin number that does not map to a port (such as the pins for ground, 5v +ve, DIO1..3, etc)" do
39
+ [ 1, 2, "DIO0", "DIO2", nil, :thedude, 832].each do |bad_pin|
40
+ assert_raise(RuntimeError) { @target.get_port_for_pin(bad_pin) }
41
+ end
42
+ end
43
+
44
+ should "get the number the library uses for the pin when asked to translate from the numbers on the board (port a pins)" do
45
+ assert_equal 7, @target.get_library_pin_number(30)
46
+ assert_equal 6, @target.get_library_pin_number(31)
47
+ assert_equal 5, @target.get_library_pin_number(32)
48
+ assert_equal 4, @target.get_library_pin_number(33)
49
+ assert_equal 3, @target.get_library_pin_number(34)
50
+ assert_equal 2, @target.get_library_pin_number(35)
51
+ assert_equal 1, @target.get_library_pin_number(36)
52
+ assert_equal 0, @target.get_library_pin_number(37)
53
+ end
54
+
55
+ should "get the number the library uses for the pin when asked to translate from the numbers on the board (port b pins)" do
56
+ assert_equal 15, @target.get_library_pin_number(3)
57
+ assert_equal 14, @target.get_library_pin_number(4)
58
+ assert_equal 13, @target.get_library_pin_number(5)
59
+ assert_equal 12, @target.get_library_pin_number(6)
60
+ assert_equal 11, @target.get_library_pin_number(7)
61
+ assert_equal 10, @target.get_library_pin_number(8)
62
+ assert_equal 9, @target.get_library_pin_number(9)
63
+ assert_equal 8, @target.get_library_pin_number(10)
64
+ end
65
+
66
+ should "get the number the library uses for the pin when asked to translate from the numbers on the board (port cl pins)" do
67
+ assert_equal 19, @target.get_library_pin_number(26)
68
+ assert_equal 18, @target.get_library_pin_number(27)
69
+ assert_equal 17, @target.get_library_pin_number(28)
70
+ assert_equal 16, @target.get_library_pin_number(29)
71
+ end
72
+
73
+ should "get the number the library uses for the pin when asked to translate from the numbers on the board (port ch pins)" do
74
+ assert_equal 23, @target.get_library_pin_number(22)
75
+ assert_equal 22, @target.get_library_pin_number(23)
76
+ assert_equal 21, @target.get_library_pin_number(24)
77
+ assert_equal 20, @target.get_library_pin_number(25)
78
+ end
79
+
80
+ should "raise an error if the pin passed in to get_library_pin_number is invalid" do
81
+ [20, 21, nil, 12, :heynow, "uba"].each do |bad_pin|
82
+ assert_raise(RuntimeError) { @target.get_library_pin_number(bad_pin) }
83
+ end
84
+ end
85
+
86
+ should "know the mapping between symbolic ports and ports in the library" do
87
+ assert_equal FIRSTPORTA, @target.get_library_port(:porta), "wrong port"
88
+ assert_equal FIRSTPORTB, @target.get_library_port(:portb), "wrong port"
89
+ assert_equal FIRSTPORTCL, @target.get_library_port(:portcl), "wrong port"
90
+ assert_equal FIRSTPORTCH, @target.get_library_port(:portch), "wrong port"
91
+ end
92
+
93
+ should "raise an error if asked about the library port that does not exist" do
94
+ [:portd, :portci, "cigarette butt", nil].each do |bad_port|
95
+ assert_error RuntimeError, "Port #{bad_port} is not a valid port." do
96
+ @target.get_library_port(bad_port)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,82 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require "minilab_context"
3
+ require "minilab"
4
+
5
+ class MinilabContextTest < Test::Unit::TestCase
6
+ def setup
7
+ MinilabContext.clear
8
+ @target = MinilabContext.new
9
+ end
10
+
11
+ def build_context
12
+ context = nil
13
+
14
+ assert_nothing_raised "should build without error" do
15
+ context = @target.build
16
+ end
17
+ assert_not_nil context, "should have gotten a context"
18
+
19
+ context
20
+ end
21
+
22
+ should "build minilab context" do
23
+ context = build_context
24
+
25
+ minilab = context[:minilab]
26
+ assert_not_nil minilab, "should have a minilab object in the context"
27
+ assert_kind_of Minilab, minilab, "should have gotten a Minilab object"
28
+ end
29
+
30
+ should "allow for the context to be cleared" do
31
+ first_context = @target.build
32
+ MinilabContext.clear
33
+ second_context = @target.build
34
+
35
+ assert_not_same first_context, second_context, "context should have been cleared and rebuilt"
36
+ end
37
+
38
+ should "return the same context when built more than once" do
39
+ first_context = build_context
40
+ second_context = build_context
41
+
42
+ assert_same first_context, second_context, "not the same context object"
43
+ end
44
+
45
+ should "allow arbitrary objects to be injected into the context before it is built" do
46
+ create_mock(:minilab_hardware)
47
+ MinilabContext.inject(:object => :minilab_hardware, :instance => @minilab_hardware)
48
+
49
+ context = build_context
50
+ minilab = context[:minilab_hardware]
51
+ assert_same @minilab_hardware, minilab, "not the same object was returned from the context as was injected"
52
+
53
+ create_mock(:kryll)
54
+ MinilabContext.inject(:object => :kryll, :instance => @kryll)
55
+
56
+ context = build_context
57
+ kryll = context[:kryll]
58
+ assert_same @kryll, kryll, "not the same object was returned from the context as was injected"
59
+ end
60
+
61
+ should "blow up if trying to inject an object without the appropriate parameters" do
62
+ assert_error RuntimeError, /missing parameter :object/i do
63
+ MinilabContext.inject(:instance => "foo")
64
+ end
65
+
66
+ assert_error RuntimeError, /missing parameter :instance/i do
67
+ MinilabContext.inject(:object => "foo")
68
+ end
69
+
70
+ assert_error RuntimeError, /parameters hash was nil/i do
71
+ MinilabContext.inject(nil)
72
+ end
73
+ end
74
+
75
+ should "raise an error if trying to inject an object into the context after it has been built" do
76
+ @target.build
77
+
78
+ assert_error RuntimeError, /minilab_hardware/i do
79
+ MinilabContext.inject(:object => 'minilab_hardware', :instance => "kaboo")
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,83 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/../test_helper"
2
+ require 'extension/minilab_hardware'
3
+
4
+ # The intent of this test is to assert some basic properties on the extension.
5
+ # Typically I would not check these things, but this class is made from C code.
6
+ # Even though it's easy to create Ruby constants, methods, etc. with Ruby's C
7
+ # support, it's still more work than it takes in Ruby syntax. So here I'm
8
+ # trying to show that the stuff we expect to be there is actually there. It's
9
+ # also here to help pinpoint any problems that may not show up until system test
10
+ # time.
11
+ #
12
+ # Outside of the tests for checking hash parameters, I'm willing to discuss
13
+ # whether maintaining this set of tests is truly worthwhile. I may change my
14
+ # mind.
15
+ class MinilabHardwareTest < Test::Unit::TestCase
16
+ include MinilabConstants
17
+
18
+ def setup
19
+ @target = MinilabHardware.new
20
+ end
21
+
22
+ should "have expected constants" do
23
+ [
24
+ :DONTPRINT,
25
+ :STOPALL,
26
+ :CURRENTREVNUM,
27
+ :DIGITALIN,
28
+ :DIGITALOUT,
29
+ :FIRSTPORTA,
30
+ :FIRSTPORTB,
31
+ :FIRSTPORTCL,
32
+ :FIRSTPORTCH
33
+ ].each do |constant|
34
+ assert MinilabConstants.const_defined?(constant), "#{constant} should exist as a constant in MinilabConstants"
35
+ end
36
+ end
37
+
38
+ should "have the expected methods" do
39
+ expected_methods =
40
+ [
41
+ :setup_error_handling,
42
+ :declare_revision,
43
+ :get_revision,
44
+ :get_error_string,
45
+
46
+ :configure_auxport,
47
+ :configure_port,
48
+
49
+ :read_analog,
50
+ :read_digital_pin,
51
+ :read_auxport,
52
+ :read_port,
53
+
54
+ :write_analog,
55
+ :write_digital_pin,
56
+ :write_auxport,
57
+ ]
58
+
59
+ expected_methods.each do |method|
60
+ assert @target.respond_to?(method), "Minilab hardware object does not respond to #{method.to_s}"
61
+ end
62
+ end
63
+
64
+ should "raise an error if auxport configuration isn't given the correct hash parameters" do
65
+ assert_error RuntimeError, ":direction is a required parameter" do
66
+ @target.configure_auxport(:pin => 3)
67
+ end
68
+
69
+ assert_error RuntimeError, ":pin is a required parameter" do
70
+ @target.configure_auxport(:direction => DIGITALIN)
71
+ end
72
+ end
73
+
74
+ should "raise an error if port configuration isn't given the correct hash parameters" do
75
+ assert_error RuntimeError, ":direction is a required parameter" do
76
+ @target.configure_port(:port => FIRSTPORTA)
77
+ end
78
+
79
+ assert_error RuntimeError, ":port is a required parameter" do
80
+ @target.configure_port(:direction => DIGITALOUT)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,131 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/../test_helper"
2
+ require 'Minilab'
3
+ require 'extension/minilab_hardware'
4
+
5
+ class MinilabTest < Test::Unit::TestCase
6
+ include MinilabConstants
7
+
8
+ def setup
9
+ mox = create_mocks(:minilab_hardware, :result_verifier, :analog_io,
10
+ :digital_auxport_io, :digital_port_io)
11
+ @minilab = Minilab.new(mox)
12
+ end
13
+
14
+ should "allow the user to easily build the minilab object and its dependences" do
15
+ minilab = nil
16
+
17
+ assert_nothing_raised "should build without error" do
18
+ minilab = Minilab.build
19
+ end
20
+
21
+ assert_not_nil minilab, "should have gotten an object"
22
+ assert_kind_of Minilab, minilab, "should have gotten a Minilab object"
23
+ end
24
+
25
+ should "connect to the hardware, setup the error handling, declare the library revision, and setup the db37 ports for input" do
26
+ connect
27
+ end
28
+
29
+ should "bomb out if trying to use a method but haven't connected yet" do
30
+ assert_not_connected_error { @minilab.read_analog(0) }
31
+ assert_not_connected_error { @minilab.write_analog(0, 2.2) }
32
+ assert_not_connected_error { @minilab.read_digital(6) }
33
+ assert_not_connected_error { @minilab.write_digital(6, 1) }
34
+ assert_not_connected_error { @minilab.read_digital_byte(:porta) }
35
+ assert_not_connected_error { @minilab.configure_input_port(:portcl) }
36
+ assert_not_connected_error { @minilab.configure_output_port(:portb) }
37
+ end
38
+
39
+ # IO tests
40
+ should "read analog input" do
41
+ connect
42
+ @analog_io.expects.read_analog(4).returns(1.1)
43
+
44
+ assert_equal 1.1, @minilab.read_analog(4)
45
+ end
46
+
47
+ should "write analog output" do
48
+ connect
49
+ @analog_io.expects.write_analog(1, 5.9).returns(true)
50
+
51
+ @minilab.write_analog(1, 5.9)
52
+ end
53
+
54
+ should "read digital input from the DIO auxport terminals" do
55
+ connect
56
+ @digital_auxport_io.expects.read_digital('DIO1').returns(1)
57
+
58
+ assert_equal 1, @minilab.read_digital('DIO1')
59
+ end
60
+
61
+ should "write digital output to the DIO auxport terminals" do
62
+ connect
63
+ @digital_auxport_io.expects.write_digital('DIO3', 0).returns(true)
64
+
65
+ @minilab.write_digital('DIO3', 0)
66
+ end
67
+
68
+ should "use the digital port object when the pin is a numbered pin for read_digital" do
69
+ connect
70
+ @digital_port_io.expects.read_digital(7).returns(1)
71
+
72
+ assert_equal 1, @minilab.read_digital(7)
73
+ end
74
+
75
+ should "use the digital port object when the pin is a numbered pin for write_digital" do
76
+ connect
77
+ @digital_port_io.expects.write_digital(2, 1).returns(:yourmom)
78
+
79
+ assert_equal :yourmom, @minilab.write_digital(2, 1)
80
+ end
81
+
82
+ should "use the digital port object to read a byte from a digital port" do
83
+ connect
84
+ @digital_port_io.expects.read_port(:porta).returns(0x22)
85
+ assert_equal 0x22, @minilab.read_digital_byte(:porta)
86
+
87
+ @digital_port_io.expects.read_port(:portcl).returns("monitor")
88
+ assert_equal "monitor", @minilab.read_digital_byte(:portcl)
89
+ end
90
+
91
+ # Configuration tests
92
+ should "use the digital port object for configuring a port for input" do
93
+ connect
94
+ @digital_port_io.expects.configure_input_port(:portch).returns(true)
95
+
96
+ assert @minilab.configure_input_port(:portch)
97
+ end
98
+
99
+ should "use the digital port object for configuring a port for output" do
100
+ connect
101
+ @digital_port_io.expects.configure_output_port(:porta).returns(true)
102
+
103
+ assert @minilab.configure_output_port(:porta)
104
+ end
105
+
106
+ private
107
+ def connect
108
+ result1 = { :skype => "good" }
109
+ result2 = { :button => "round" }
110
+
111
+ @minilab_hardware.expects.setup_error_handling(DONTPRINT, STOPALL).returns(result1)
112
+ @result_verifier.expects.verify(result1, "setup_error_handling")
113
+
114
+ @minilab_hardware.expects.declare_revision(CURRENTREVNUM).returns(result2)
115
+ @result_verifier.expects.verify(result2, "declare_revision")
116
+
117
+ ports = [:porta, :portb, "thedude", 54]
118
+ @digital_port_io.expects.get_valid_ports().returns(ports)
119
+ ports.each do |port|
120
+ @digital_port_io.expects.configure_input_port(port)
121
+ end
122
+
123
+ @minilab.connect
124
+ end
125
+
126
+ def assert_not_connected_error
127
+ error = "Cannot use any minilab methods without calling 'connect' first."
128
+ assert_error(RuntimeError, error) { yield }
129
+ end
130
+
131
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + "/../test_helper"
2
+ require 'result_verifier'
3
+
4
+ class ResultVerifierTest < Test::Unit::TestCase
5
+ def setup
6
+ mox = create_mocks :minilab_hardware
7
+ @target = ResultVerifier.new(mox)
8
+ end
9
+
10
+ should "return true when there is no error and not consult the hardware" do
11
+ result = { :value => 2 }
12
+
13
+ assert_equal true, @target.verify(result)
14
+ end
15
+
16
+ should "raise an exception when there is an error" do
17
+ result = { :error => 1 }
18
+ @minilab_hardware.expect.get_error_string(1).returns("kaboom")
19
+ assert_error(RuntimeError, /kaboom/) { @target.verify(result) }
20
+
21
+
22
+ result = { :error => 2 }
23
+ @minilab_hardware.expect.get_error_string(2).returns("burn")
24
+ assert_error(RuntimeError, /burn/) { @target.verify(result) }
25
+ end
26
+
27
+ should "include the custom message passed in the exception that is raised" do
28
+ result = { :error => 1 }
29
+ @minilab_hardware.expect.get_error_string(1).returns("oy")
30
+
31
+ assert_error(RuntimeError, /argh/) { @target.verify(result, "argh") }
32
+ end
33
+ end
@@ -0,0 +1,50 @@
1
+ =begin rdoc
2
+ = Usage
3
+ Behaviors provides a single method: should.
4
+
5
+ Your test classes should <tt>extend Behaviors</tt>.
6
+
7
+ Instead of naming test methods like:
8
+
9
+ def test_something
10
+ end
11
+
12
+ You declare test methods like:
13
+
14
+ should "perform action" do
15
+ end
16
+
17
+ You also have the ability to declare flunking test methods as a way
18
+ to describe future tests:
19
+
20
+ should "perform other action"
21
+
22
+ = Motivation
23
+ Test methods typically focus on the name of the method under test instead of its behavior.
24
+
25
+ Creating test methods with <tt>should</tt> statements focuses on the behaviors of an object.
26
+ This enhances the TDD experience by provoking the developer to think about the role of the object under test.
27
+
28
+ Writing the tests first to declare an object's behaviors and then implementing those
29
+ behaviors through object methods produces the most value.
30
+ Using this behavior-driven approach prevents the dangers associated with assuming a one-to-one mapping of method names to
31
+ test method names.
32
+
33
+ For a more complete BDD framework, try RSpec http://rspec.rubyforge.org/
34
+
35
+ = Rake tasks
36
+
37
+ Behaviors includes a pair of Rake tasks, <tt>behaviors</tt> and <tt>behaviors_html</tt>. These tasks will output to the
38
+ console or an html file in the <tt>doc</tt> directory with a list all of your <tt>should</tt> tests.
39
+ Use these tasks to summarize the behavior of your project.
40
+ =end
41
+ module Behaviors
42
+ def should(behave,&block)
43
+ mname = "test_should_#{behave}"
44
+ if block
45
+ define_method mname, &block
46
+ else
47
+ puts ">>> UNIMPLEMENTED CASE: #{name.sub(/Test$/,'')} should #{behave}"
48
+ end
49
+ end
50
+ end