rspec 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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