rspec 0.4.0 → 0.5.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.
Files changed (94) hide show
  1. data/CHANGES +7 -12
  2. data/Rakefile +17 -12
  3. data/TUTORIAL +1 -1
  4. data/WHY_RSPEC +115 -0
  5. data/bin/spec +17 -4
  6. data/bin/test2rspec +35 -0
  7. data/examples/airport_spec.rb +35 -0
  8. data/examples/mocking_spec.rb +16 -0
  9. data/examples/spec_framework_spec.rb +28 -0
  10. data/examples/stack.rb +36 -0
  11. data/examples/stack_spec.rb +112 -0
  12. data/lib/spec.rb +5 -18
  13. data/lib/spec/api.rb +4 -0
  14. data/lib/spec/{exceptions.rb → api/exceptions.rb} +1 -1
  15. data/lib/spec/{expectations.rb → api/expectations.rb} +5 -4
  16. data/lib/spec/api/helper.rb +10 -0
  17. data/lib/spec/{have_helper.rb → api/helper/have_helper.rb} +1 -1
  18. data/lib/spec/{instance_helper.rb → api/helper/instance_helper.rb} +0 -0
  19. data/lib/spec/{instance_negator.rb → api/helper/instance_negator.rb} +0 -0
  20. data/lib/spec/{kind_helper.rb → api/helper/kind_helper.rb} +0 -0
  21. data/lib/spec/{kind_negator.rb → api/helper/kind_negator.rb} +0 -0
  22. data/lib/spec/{respond_helper.rb → api/helper/respond_helper.rb} +0 -0
  23. data/lib/spec/{respond_negator.rb → api/helper/respond_negator.rb} +0 -0
  24. data/lib/spec/{should_base.rb → api/helper/should_base.rb} +6 -4
  25. data/lib/spec/{should_helper.rb → api/helper/should_helper.rb} +12 -0
  26. data/lib/spec/{should_negator.rb → api/helper/should_negator.rb} +11 -0
  27. data/lib/spec/api/mock.rb +184 -0
  28. data/lib/spec/rake/spectask.rb +153 -0
  29. data/lib/spec/runner.rb +9 -0
  30. data/lib/spec/runner/backtrace_tweaker.rb +17 -0
  31. data/lib/spec/runner/context.rb +47 -0
  32. data/lib/spec/runner/context_runner.rb +52 -0
  33. data/lib/spec/runner/execution_context.rb +15 -0
  34. data/lib/spec/runner/instance_exec.rb +15 -0
  35. data/lib/spec/runner/kernel_ext.rb +6 -0
  36. data/lib/spec/runner/option_parser.rb +41 -0
  37. data/lib/spec/runner/rdoc_formatter.rb +17 -0
  38. data/lib/spec/runner/simple_text_reporter.rb +92 -0
  39. data/lib/spec/runner/specification.rb +42 -0
  40. data/lib/spec/tool/command_line.rb +39 -0
  41. data/lib/spec/tool/test_unit_translator.rb +112 -0
  42. data/lib/spec/version.rb +13 -0
  43. data/test/spec/api/helper/arbitrary_predicate_test.rb +121 -0
  44. data/test/spec/api/helper/containment_test.rb +117 -0
  45. data/test/spec/api/helper/equality_test.rb +46 -0
  46. data/test/spec/api/helper/identity_test.rb +68 -0
  47. data/test/spec/api/helper/raising_test.rb +50 -0
  48. data/test/spec/api/helper/regex_matching_test.rb +38 -0
  49. data/test/spec/api/helper/should_satisfy_test.rb +37 -0
  50. data/test/spec/api/helper/throwing_test.rb +56 -0
  51. data/test/spec/api/helper/true_false_special_case_test.rb +87 -0
  52. data/test/spec/api/helper/typing_test.rb +107 -0
  53. data/test/spec/api/mock_test.rb +161 -0
  54. data/test/spec/runner/backtrace_tweaker_test.rb +20 -0
  55. data/test/spec/runner/context_runner_test.rb +19 -0
  56. data/test/spec/runner/context_test.rb +29 -0
  57. data/test/spec/runner/execution_context_test.rb +13 -0
  58. data/test/spec/runner/option_parser_test.rb +50 -0
  59. data/test/spec/runner/rdoc_formatter_test.rb +23 -0
  60. data/test/spec/runner/simple_text_reporter_test.rb +128 -0
  61. data/test/spec/runner/specification_test.rb +70 -0
  62. data/test/spec/tool/command_line_test.rb +22 -0
  63. data/test/spec/tool/test_unit_api_spec.rb +61 -0
  64. data/test/spec/tool/test_unit_api_test.rb +61 -0
  65. data/test/spec/tool/test_unit_translator_test.rb +29 -0
  66. data/test/test_helper.rb +8 -0
  67. metadata +89 -67
  68. data/examples/add_specification_spec.rb +0 -15
  69. data/examples/craps.rb +0 -15
  70. data/examples/craps_spec.rb +0 -105
  71. data/examples/dsl_spec.rb +0 -8
  72. data/examples/movie.rb +0 -7
  73. data/examples/movie_list.rb +0 -19
  74. data/examples/movie_spec.rb +0 -37
  75. data/lib/spec/collector.rb +0 -17
  76. data/lib/spec/context.rb +0 -89
  77. data/lib/spec/dsl.rb +0 -23
  78. data/lib/spec/gui_runner.rb +0 -59
  79. data/lib/spec/mock.rb +0 -183
  80. data/lib/spec/text_runner.rb +0 -75
  81. data/test/collection_owner.rb +0 -48
  82. data/test/context_fixtures_test.rb +0 -71
  83. data/test/context_run_test.rb +0 -174
  84. data/test/dsl_test.rb +0 -48
  85. data/test/error_reporting_test.rb +0 -225
  86. data/test/expectations_for_should_have_test.rb +0 -144
  87. data/test/expectations_test.rb +0 -592
  88. data/test/get_classes.rb +0 -6
  89. data/test/gui_runner_test.rb +0 -162
  90. data/test/mock_test.rb +0 -157
  91. data/test/spec_collection_test.rb +0 -39
  92. data/test/specification_addition_test.rb +0 -29
  93. data/test/specification_identification_test.rb +0 -71
  94. data/test/text_runner_test.rb +0 -146
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ module Spec
3
+ module Runner
4
+ class BacktraceTweakerTest < Test::Unit::TestCase
5
+ def test_should_not_barf_on_nil_backtrace
6
+ error = RuntimeError.new
7
+ tweaker = BacktraceTweaker.new
8
+ proc { tweaker.tweak_backtrace error, 'spec name' }.should.not.raise
9
+ end
10
+
11
+ def test_should_remove___instance_exec
12
+ error = RuntimeError.new
13
+ error.set_backtrace ["./examples/airport_spec.rb:28:in `__instance_exec_1014688_1661744'"]
14
+ tweaker = BacktraceTweaker.new
15
+ tweaker.tweak_backtrace error, 'spec name'
16
+ error.backtrace[0].should.equal "./examples/airport_spec.rb:28:in `spec name'"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ module Spec
3
+ module Runner
4
+ class ContextRunnerTest < Test::Unit::TestCase
5
+ def test_should_call_run_doc_on_context
6
+ context1 = Api::Mock.new "context1"
7
+ context2 = Api::Mock.new "context2"
8
+ context1.should_receive(:run_docs)
9
+ context2.should_receive(:run_docs)
10
+ runner = ContextRunner.new ["-d"]
11
+ runner.add_context context1
12
+ runner.add_context context2
13
+ runner.run
14
+ context1.__verify
15
+ context2.__verify
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ module Spec
4
+ module Runner
5
+ class ContextTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @listener = Api::Mock.new "listener"
9
+ @context = Context.new("context") {}
10
+ end
11
+
12
+ def test_should_add_itself_to_listener_on_run
13
+ @listener.should_receive(:add_context).with "context"
14
+ @context.run(@listener)
15
+ @listener.__verify
16
+ end
17
+
18
+ def test_should_add_itself_to_listener_on_run_docs
19
+ @listener.should_receive(:add_context).with "context"
20
+ @context.run_docs(@listener)
21
+ @listener.__verify
22
+ end
23
+
24
+ def test_should_execute_setup_from_inherited_context
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ module Spec
3
+ module Runner
4
+ class ExecutionContextTest < Test::Unit::TestCase
5
+ def test_should_add_new_mock_to_spec_when_mock_message_received
6
+ spec = Api::Mock.new "spec"
7
+ spec.should_receive(:add_mock) {|mock| mock.should.be.instance.of Api::Mock}
8
+ ec = ExecutionContext.new spec
9
+ mock = ec.mock("a mock")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'stringio'
3
+
4
+ module Spec
5
+ module Runner
6
+ class OptionParserTest < Test::Unit::TestCase
7
+
8
+ def test_verbose_should_be_true_by_default
9
+ options = OptionParser.parse([])
10
+ assert(!options.verbose)
11
+ end
12
+
13
+ def test_out_should_be_stdout_by_default
14
+ options = OptionParser.parse([])
15
+ assert_equal(STDOUT, options.out)
16
+ end
17
+
18
+ def test_verbose_should_be_settable_with_v
19
+ options = OptionParser.parse(["-v"])
20
+ assert(options.verbose)
21
+ end
22
+
23
+ def test_verbose_should_be_settable_with_verbose
24
+ options = OptionParser.parse(["--verbose"])
25
+ assert(options.verbose)
26
+ end
27
+
28
+ def test_doc_should_be_false_by_default
29
+ options = OptionParser.parse([])
30
+ assert(!options.doc)
31
+ end
32
+
33
+ def test_doc_should_be_settable_with_d
34
+ options = OptionParser.parse(["-d"])
35
+ assert(options.doc)
36
+ end
37
+
38
+ def test_out_should_be_settable_with_o
39
+ options = OptionParser.parse(["-o","test.txt"])
40
+ assert_equal("test.txt", options.out)
41
+ end
42
+
43
+ def test_out_should_be_settable_with_of
44
+ options = OptionParser.parse(["--of","test.txt"])
45
+ assert_equal("test.txt", options.out)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ module Spec
3
+ module Runner
4
+ class RDocFormatterTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @io = StringIO.new
8
+ @formatter = RDocFormatter.new(@io)
9
+ end
10
+
11
+ def test_should_push_out_context
12
+ @formatter.add_context("context")
13
+ assert_equal("# context\n", @io.string)
14
+ end
15
+
16
+ def test_should_push_out_spec
17
+ @formatter.add_spec("spec")
18
+ assert_equal("# * spec\n", @io.string)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,128 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'stringio'
3
+
4
+ module Spec
5
+ module Runner
6
+ class SimpleTextReporterTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @io = StringIO.new
10
+ @backtrace_tweaker = Spec::Api::Mock.new("backtrace tweaker")
11
+ @reporter = SimpleTextReporter.new(@io, false, @backtrace_tweaker)
12
+ end
13
+
14
+ def test_should_include_time
15
+ @reporter.start
16
+ @reporter.end
17
+ @reporter.dump
18
+ assert_match(/Finished in [0-9].[0-9|e|-]+ seconds/, @io.string)
19
+ end
20
+
21
+ def test_should_output_stats_even_with_no_data
22
+ @reporter.dump
23
+ assert_match(/Finished in 0.0 seconds/, @io.string)
24
+ assert_match(/0 contexts, 0 specifications, 0 failures/, @io.string)
25
+ end
26
+
27
+ def test_should_account_for_context_in_stats_for_pass
28
+ @reporter.add_context Context.new("context") {}
29
+ @reporter.dump
30
+ assert_match(/1 context, 0 specifications, 0 failures/, @io.string)
31
+ end
32
+
33
+ def test_should_account_for_spec_in_stats_for_pass
34
+ @reporter.add_spec Specification.new("spec") {}
35
+ @reporter.dump
36
+ assert_match(/0 contexts, 1 specification, 0 failures/, @io.string)
37
+ end
38
+
39
+ def test_should_account_for_spec_and_error_in_stats_for_pass
40
+ @backtrace_tweaker.should_receive(:tweak_backtrace)
41
+ @reporter.add_spec Specification.new("spec"), [RuntimeError.new]
42
+ @reporter.dump
43
+ assert_match(/0 contexts, 1 specification, 1 failure/, @io.string)
44
+ end
45
+
46
+ def test_should_handle_multiple_contexts_same_name
47
+ @reporter.add_context Context.new("context") {}
48
+ @reporter.add_context Context.new("context") {}
49
+ @reporter.add_context Context.new("context") {}
50
+ @reporter.dump
51
+ assert_match(/3 contexts, 0 specifications, 0 failures/, @io.string)
52
+ end
53
+
54
+ def test_should_handle_multiple_specs_same_name
55
+ @backtrace_tweaker.should_receive(:tweak_backtrace)
56
+ @reporter.add_context Context.new("context") {}
57
+ @reporter.add_spec Specification.new("spec") {}
58
+ @reporter.add_spec Specification.new("spec"), [RuntimeError.new]
59
+ @reporter.add_context Context.new("context") {}
60
+ @reporter.add_spec Specification.new("spec") {}
61
+ @reporter.add_spec Specification.new("spec"), [RuntimeError.new]
62
+ @reporter.dump
63
+ assert_match(/2 contexts, 4 specifications, 2 failures/, @io.string)
64
+ end
65
+
66
+ def test_should_delegate_to_backtrace_tweaker
67
+ @backtrace_tweaker.should_receive(:tweak_backtrace)
68
+ @reporter.add_spec Specification.new("spec"), [RuntimeError.new]
69
+ @backtrace_tweaker.__verify
70
+ end
71
+
72
+ end
73
+
74
+ class SimpleTextReporterQuietOutputTest < Test::Unit::TestCase
75
+
76
+ def setup
77
+ @io = StringIO.new
78
+ @reporter = SimpleTextReporter.new(@io)
79
+ end
80
+
81
+ def test_should_remain_silent_when_context_name_provided
82
+ @reporter.add_context "context"
83
+ assert_equal("\n", @io.string)
84
+ end
85
+
86
+ def test_should_output_dot_when_spec_passed
87
+ @reporter.add_spec "spec"
88
+ assert_equal(".", @io.string)
89
+ end
90
+
91
+ def test_should_output_F_when_spec_failed
92
+ @reporter.add_spec "spec", [RuntimeError.new]
93
+ assert_equal("F", @io.string)
94
+ end
95
+
96
+ end
97
+
98
+
99
+ class SimpleTextReporterVerboseOutputTest < Test::Unit::TestCase
100
+
101
+ def setup
102
+ @io = StringIO.new
103
+ @reporter = SimpleTextReporter.new(@io, true)
104
+ end
105
+
106
+ def test_should_output_when_context_name_provided
107
+ @reporter.add_context "context"
108
+ assert_equal("\ncontext\n", @io.string)
109
+ end
110
+
111
+ def test_should_output_spec_name_when_spec_passed
112
+ @reporter.add_spec "spec"
113
+ assert_equal("- spec\n", @io.string)
114
+ end
115
+
116
+ def test_should_output_failure_when_spec_failed
117
+ error = RuntimeError.new
118
+ begin
119
+ raise error
120
+ rescue
121
+ end
122
+ @reporter.add_spec "spec", [error]
123
+ assert_equal("- spec (FAILED)\n#{error.message} (#{error.class.name})\n#{error.backtrace.join("\n")}\n", @io.string)
124
+ end
125
+
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,70 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ module Spec
3
+ module Runner
4
+ class SpecificationTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @reporter = Api::Mock.new "reporter"
8
+ end
9
+
10
+ def test_should_run_spec_in_scope_of_execution_context
11
+ spec = Specification.new("should pass") do
12
+ self.should.not.be.instance_of Specification
13
+ self.should.be.instance_of ExecutionContext
14
+ end
15
+ @reporter.should_receive(:add_spec).with "should pass", []
16
+ spec.run @reporter
17
+ end
18
+
19
+ def test_should_add_itself_to_reporter_when_passes
20
+ spec = Specification.new("spec") {}
21
+ @reporter.should_receive(:add_spec).with "spec", []
22
+ spec.run(@reporter)
23
+ end
24
+
25
+ def test_should_add_itself_to_reporter_when_fails
26
+ error = RuntimeError.new
27
+ spec = Specification.new("spec") { raise error }
28
+ @reporter.should_receive(:add_spec).with "spec", [error]
29
+ spec.run(@reporter)
30
+ end
31
+
32
+ def test_should_add_itself_to_reporter_when_calling_run_docs
33
+ spec = Specification.new("spec") {}
34
+ @reporter.should_receive(:add_spec).with "spec"
35
+ spec.run_docs(@reporter)
36
+ end
37
+
38
+ def test_should_verify_mocks_after_teardown
39
+ spec = Specification.new("spec") do
40
+ mock = mock("a mock")
41
+ mock.should_receive(:poke)
42
+ end
43
+ @reporter.should_receive(:add_spec) do |spec_name, errors|
44
+ spec_name.should.equal "spec"
45
+ errors[0].message.should.match /expected poke once, but received it 0 times/
46
+ end
47
+ spec.run @reporter
48
+ end
49
+
50
+ def test_should_run_teardown_even_when_main_block_fails
51
+ spec = Specification.new("spec") do
52
+ raise "in body"
53
+ end
54
+ teardown = lambda do
55
+ raise "in teardown"
56
+ end
57
+ @reporter.should_receive(:add_spec) do |spec, errors|
58
+ errors.length.should.equal 2
59
+ errors[0].message.should.equal "in body"
60
+ errors[1].message.should.equal "in teardown"
61
+ end
62
+ spec.run @reporter, nil, teardown
63
+ end
64
+
65
+ def teardown
66
+ @reporter.__verify
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'spec/tool/command_line'
3
+ require 'stringio'
4
+
5
+ module Spec
6
+ module Tool
7
+ class CommandLineTest < Test::Unit::TestCase
8
+ def test_writes_translated_file
9
+ translator = Api::Mock.new "translator"
10
+ filesystem = Api::Mock.new "filesystem"
11
+ filesystem.should_receive(:write_translation).with "./test/spec/tool/test_unit_translator_test.rb", "spec/test_unit_translator_test.rb"
12
+ filesystem.should_receive(:write_translation).with "./test/spec/tool/test_unit_api_test.rb", "spec/test_unit_api_test.rb"
13
+ filesystem.should_receive(:write_translation).with "./test/spec/tool/test_unit_api_spec.rb", "spec/test_unit_api_spec.rb"
14
+ filesystem.should_receive(:write_translation).with "./test/spec/tool/command_line_test.rb", "spec/command_line_test.rb"
15
+
16
+ cl = CommandLine.new(filesystem)
17
+ out = StringIO.new
18
+ cl.run(File.dirname(__FILE__), "spec", out)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec'
2
+
3
+ module Spec
4
+ module Tool
5
+ context "TestUnitApi" do
6
+
7
+ setup do
8
+ @an_int = 789
9
+ end
10
+
11
+ teardown do
12
+ end
13
+
14
+ specify "Can be translated to rspec" do
15
+ a_float = 123.45
16
+ a_nil = nil
17
+
18
+ @an_int.should.not.be nil
19
+ lambda { true }.should.be true
20
+ lambda do
21
+ true
22
+ end.should.be true
23
+ @an_int.should.equal 789
24
+ a_float.should.be.close 123.5, 0.1
25
+ @an_int.should.be.instance.of Fixnum
26
+ @an_int.should.be.kind.of Numeric
27
+ @an_int.to_s.should.match /789/
28
+ a_nil.should.be nil
29
+ @an_int.to_s.should.not.match /7890/
30
+ @an_int.should.not.equal 780
31
+ @an_int.should.not.be nil
32
+ a_float.should.not.be @an_int
33
+ lambda { foo = 1 }.should.not.raise
34
+ lambda do
35
+ foo = 2
36
+ end.should.not.raise
37
+ lambda { foo = 3 }.should.not.throw
38
+ lambda do
39
+ foo = 4
40
+ end.should.not.throw
41
+ #assert_operator object1, operator, object2, "a message"
42
+ lambda { raise NotImplementedError }.should.raise NotImplementedError
43
+ lambda do
44
+ raise NotImplementedError
45
+ end.should.raise NotImplementedError
46
+ lambda { raise NotImplementedError }.should.raise NotImplementedError
47
+ lambda do
48
+ raise NotImplementedError
49
+ end.should.raise NotImplementedError
50
+ @an_int.should.respond.to :to_f
51
+ a_float.should.be a_float
52
+ #assert_send send_array, "a message"
53
+ lambda { throw :foo }.should.throw :foo
54
+ lambda do
55
+ throw :foo
56
+ end.should.throw :foo
57
+
58
+ end
59
+ end
60
+ end
61
+ end