rspec 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/CHANGES +57 -32
  2. data/EXAMPLES.rd +0 -0
  3. data/Rakefile +22 -21
  4. data/bin/spec +9 -11
  5. data/doc/README +1 -3
  6. data/doc/plugin/syntax.rb +27 -5
  7. data/doc/src/core_team.page +22 -0
  8. data/doc/src/default.css +11 -11
  9. data/doc/src/default.template +0 -1
  10. data/doc/src/documentation/index.page +183 -8
  11. data/doc/src/documentation/meta.info +7 -7
  12. data/doc/src/documentation/mocks.page +168 -109
  13. data/doc/src/documentation/underscores.page +20 -0
  14. data/doc/src/examples.page +2 -1
  15. data/doc/src/images/David_and_Aslak.jpg +0 -0
  16. data/doc/src/images/Whats_That_Dude.jpg +0 -0
  17. data/doc/src/index.page +70 -3
  18. data/doc/src/meta.info +18 -11
  19. data/doc/src/tools/index.page +40 -134
  20. data/doc/src/tools/meta.info +9 -3
  21. data/doc/src/tools/rails.page +3 -1
  22. data/doc/src/tools/rake.page +20 -3
  23. data/doc/src/tools/rcov.page +19 -0
  24. data/doc/src/tools/spec.page +99 -0
  25. data/doc/src/tools/test2rspec.page +2 -4
  26. data/doc/src/tutorials/index.page +52 -0
  27. data/doc/src/tutorials/meta.info +31 -0
  28. data/doc/src/tutorials/notes.txt +252 -0
  29. data/doc/src/tutorials/stack.rb +11 -0
  30. data/doc/src/tutorials/stack_01.page +224 -0
  31. data/doc/src/tutorials/stack_02.page +180 -0
  32. data/doc/src/tutorials/stack_03.page +291 -0
  33. data/doc/src/tutorials/stack_04.page +203 -0
  34. data/doc/src/tutorials/stack_04.page.orig +123 -0
  35. data/doc/src/tutorials/stack_05.page +90 -0
  36. data/doc/src/tutorials/stack_05.page.orig +124 -0
  37. data/doc/src/tutorials/stack_06.page +359 -0
  38. data/doc/src/tutorials/stack_06.page.orig +359 -0
  39. data/doc/src/tutorials/stack_spec.rb +41 -0
  40. data/examples/airport_spec.rb +4 -4
  41. data/examples/{spec_framework_spec.rb → bdd_framework_spec.rb} +6 -7
  42. data/examples/mocking_spec.rb +0 -5
  43. data/examples/stack_spec.rb +6 -7
  44. data/examples/sugar_spec.rb +14 -0
  45. data/lib/spec/api.rb +5 -2
  46. data/lib/spec/api/helper/should_base.rb +17 -22
  47. data/lib/spec/api/helper/should_helper.rb +4 -3
  48. data/lib/spec/api/helper/should_negator.rb +3 -2
  49. data/lib/spec/api/mocks/argument_expectation.rb +104 -0
  50. data/lib/spec/api/{mock.rb → mocks/message_expectation.rb} +47 -96
  51. data/lib/spec/api/mocks/mock.rb +63 -0
  52. data/lib/spec/api/mocks/order_group.rb +21 -0
  53. data/lib/spec/api/sugar.rb +47 -0
  54. data/lib/spec/rake/rcov_verify.rb +45 -0
  55. data/lib/spec/rake/spectask.rb +41 -56
  56. data/lib/spec/runner.rb +4 -1
  57. data/lib/spec/runner/backtrace_tweaker.rb +24 -3
  58. data/lib/spec/runner/base_text_formatter.rb +28 -0
  59. data/lib/spec/runner/context.rb +21 -18
  60. data/lib/spec/runner/context_runner.rb +20 -31
  61. data/lib/spec/runner/execution_context.rb +3 -3
  62. data/lib/spec/runner/kernel_ext.rb +10 -1
  63. data/lib/spec/runner/option_parser.rb +32 -14
  64. data/lib/spec/runner/progress_bar_formatter.rb +21 -0
  65. data/lib/spec/runner/rdoc_formatter.rb +15 -5
  66. data/lib/spec/runner/reporter.rb +100 -0
  67. data/lib/spec/runner/specdoc_formatter.rb +20 -0
  68. data/lib/spec/runner/specification.rb +42 -22
  69. data/lib/spec/version.rb +1 -1
  70. data/test/rcov/rcov_testtask.rb +1 -0
  71. data/test/spec/api/duck_type_test.rb +4 -4
  72. data/test/spec/api/helper/raising_test.rb +37 -17
  73. data/test/spec/api/{mock_arg_constraints_test.rb → mocks/mock_arg_constraints_test.rb} +10 -4
  74. data/test/spec/api/mocks/mock_ordering_test.rb +62 -0
  75. data/test/spec/api/{mock_test.rb → mocks/mock_test.rb} +30 -7
  76. data/test/spec/api/mocks/null_object_test.rb +31 -0
  77. data/test/spec/api/sugar_test.rb +71 -0
  78. data/test/spec/runner/backtrace_tweaker_test.rb +52 -4
  79. data/test/spec/runner/context_runner_test.rb +41 -21
  80. data/test/spec/runner/context_test.rb +60 -32
  81. data/test/spec/runner/execution_context_test.rb +4 -3
  82. data/test/spec/runner/failure_dump_test.rb +92 -0
  83. data/test/spec/runner/kernel_ext_test.rb +1 -2
  84. data/test/spec/runner/option_parser_test.rb +48 -28
  85. data/test/spec/runner/progress_bar_formatter_test.rb +48 -0
  86. data/test/spec/runner/rdoc_formatter_test.rb +31 -4
  87. data/test/spec/runner/reporter_test.rb +103 -0
  88. data/test/spec/runner/specdoc_formatter_test.rb +50 -0
  89. data/test/spec/runner/specification_test.rb +49 -11
  90. data/test/test_helper.rb +1 -4
  91. metadata +46 -15
  92. data/doc/src/community.page +0 -7
  93. data/doc/src/documentation/api.page +0 -185
  94. data/doc/src/why_rspec.page +0 -7
  95. data/examples/empty_stack_spec.rb +0 -22
  96. data/examples/team_spec.rb +0 -30
  97. data/lib/spec/api/duck_type.rb +0 -16
  98. data/lib/spec/runner/simple_text_reporter.rb +0 -88
  99. data/test/rcov/rcov_verify.rb +0 -28
  100. data/test/spec/runner/simple_text_reporter_test.rb +0 -123
@@ -1,7 +0,0 @@
1
- ---
2
- title: Community
3
- inMenu: true
4
- ---
5
- h2. Community
6
-
7
- Mailing lists, Issue tracker, How to send patches etc.
@@ -1,185 +0,0 @@
1
- ---
2
- title: Core API
3
- inMenu: true
4
- ordering: 5
5
- ---
6
- h2. Core API
7
-
8
- When RSpec executes specifications, it defines a method <code>should</code> on every object in the system. This <code>should</code> method is your entry to the magic of RSpec.
9
-
10
- Almost all expectation forms have a corresponding negated form. It is listed when it is supported and, in general, is met when ever the non-negated form would be violated.
11
-
12
- h3. General
13
-
14
- h4. Arbitrary Block
15
-
16
- <pre>
17
- target.should.satisfy {|arg| ...}
18
- target.should.not.satisfy {|arg| ...}
19
- </pre>
20
-
21
- The supplied block is evaluated, passing <code>target</code> as the sole argument. If the block evaluates to <code>false</code> in the case of <code>should.satisfy</code>, or <code>true</code> in the case of <code>should.not.satisfy</code>, <code>ExpectationNotMetError</code> is raised.
22
-
23
- <pre>
24
- target.should.satisfy {|arg| arg > 0}
25
- </pre>
26
-
27
- h4. Equality
28
-
29
- <pre>
30
- target.should.equal <value>
31
- target.should.not.equal <value>
32
- </pre>
33
-
34
- The target object is compared to <code>value</code> using ==. If the result is <code>false</code> (or <code>true</code> for the negated form) <code>ExpectationNotMetError</code> is raised.
35
-
36
- h4. Floating Point Comparison
37
-
38
- <pre>
39
- target.should.be.close <value>, <tolerance>
40
- target.should.not.be.close <value>, <tolerance>
41
- </pre>
42
-
43
- The target object is compared to <code>value</code>. In the former case, if they differ by more that <code>tolerance</code> <code>ExpectationNotMetError</code> is raised. In the latter case, it is raised if they differ by less than <code>tolerance</code>.
44
-
45
- <pre>
46
- target.should.be.close 27.35, 0.05
47
- </pre>
48
-
49
- h4. Identity
50
-
51
- <pre>
52
- target.should.be <value>
53
- target.should.not.be <value>
54
- </pre>
55
-
56
- The target object is compared to <code>value</code> using <code>equal?</code>. If the result is <code>false</code> (or <code>true</code> for the negated form) <code>ExpectationNotMetError</code> is raised.
57
-
58
- h4. Arbitrary Predicate
59
-
60
-
61
- <pre>
62
- target.should.predicate [optional args]
63
- target.should.be.predicate [optional args]
64
- target.should.not.predicate [optional args]
65
- target.should.not.be.predicate [optional args]
66
- </pre>
67
-
68
- The message <code>predicate?</code> is sent to <code>target</code> with any supplied arguments. If the result is <code>false</code> (or <code>true</code> for the negated form) <code>ExpectationNotMetError</code> is raised.
69
-
70
- <pre>
71
- container.should.include 'a' => container.include? 'a'
72
- container.should.be.empty => container.empty?
73
- </pre>
74
-
75
- h4. Pattern Matching
76
-
77
- <pre>
78
- target.should.match <regex>
79
- target.should.not.match <regex>
80
- </pre>
81
-
82
- The <code>target</code> is matched against <code>regex</code>. An <code>ExpectationNotMetError</code> is raised if the match fails or succeeds, respectively.
83
-
84
- h3. Class/Type
85
-
86
- h4. Direct Instance
87
-
88
- <pre>
89
- target.should.be.an.instance.of <class>
90
- target.should.not.be.an.instance.of <class>
91
- </pre>
92
-
93
- An <code>ExpectationNotMetError</code> is raised if <code>target</code> is not or is, respectively, an direct instance of <code>class</code>. As expected this correlates to <code>target.instance_of? class</code>.
94
-
95
- h4. Ancestor Class
96
-
97
- <pre>
98
- target.should.be.a.kind.of <class>
99
- target.should.not.be.a.kind.of <class>
100
- </pre>
101
-
102
- As above, but uses <code>target.kind_of? class</code>: checking whether <code>class</code> is the direct class of <code>target</code>, or an ancestor of <code>target</code>'s class.
103
-
104
- h4. Type
105
-
106
- <pre>
107
- target.should.respond.to <symbol>
108
- target.should.not.respond.to <symbol>
109
- </pre>
110
-
111
- Uses <code>target.respond_to? symbol?</code> to check whether <code>symbol</code> is the name of a message that <code>target</code> understands.
112
-
113
- h3. Procs
114
-
115
- h4. Raising
116
-
117
- <pre>
118
- proc.should.raise <exception>
119
- proc.should.not.raise <exception>
120
- </pre>
121
-
122
- Checks that <code>proc</code> does or doesn't cause the named exception to be raised. Typically the <code>proc</code> is created in place using <code>lambda</code>. For example:
123
-
124
- <pre>
125
- lambda { 3 / 0 }.should.raise ZeroDivisionError
126
- </pre>
127
-
128
- There is a more general form as well.
129
-
130
- <pre>
131
- proc.should.raise
132
- proc.should.not.raise
133
- </pre>
134
-
135
- These forms don't worry about what exception is raised (or not). All they are concern with is that some except was raised, or that no exception was raised.
136
-
137
- h4. Throwing
138
-
139
- <pre>
140
- proc.should.throw <symbol>
141
- proc.should.not.throw <symbol>
142
- </pre>
143
-
144
- Similar to the above, but checks that <code>symbol</code> is thrown from within <code>proc</code>, or that it is not. The latter is actually one of two cases: some other symbol is
145
- thrown, or no symbol is thrown.
146
-
147
- <pre>
148
- proc.should.not.throw
149
- </pre>
150
-
151
- This form is more specific. It checks that no symbol is thrown from within <code>proc</code>.
152
-
153
- h3. Collections
154
-
155
- h4. Containment
156
-
157
- <pre>
158
- target.should.include <object>
159
- </pre>
160
-
161
- This is simply a specific case of the arbitrary predicate form. It uses <code>target.include? object</code> and raises an <code>ExpectationNotMetError</code> if that returns false. The remaining collection forms are a little more involved. They rely on two things: <code>target</code> responds to the message <code>things</code> by returning an object that responds to either <code>length</code> or <code>size</code>, which return a number that is a measure of size. Currently <code>length</code> is used if is appropriate, otherwise <code>size</code> is attempted.
162
-
163
- h4. Exact Size
164
-
165
- <pre>
166
- target.should.have(<number>).<things>
167
- </pre>
168
-
169
- The <code>things</code> of <code>target</code> has a length/size of exactly <code>number</code>.
170
-
171
- h4. Lower Bound
172
-
173
- <pre>
174
- target.should.have.at.least(<number>).<things>
175
- </pre>
176
-
177
- The <code>things</code> of <code>target</code> has a length/size of no less than <code>number</code>.
178
-
179
- h4. Upper Bound
180
-
181
- <pre>
182
- target.should.have.at.most(<number>).<things>
183
- </pre>
184
-
185
- The <code>things</code> of <code>target</code> has a length/size of no more than <code>number</code>.
@@ -1,7 +0,0 @@
1
- ---
2
- title: Why RSpec
3
- inMenu: true
4
- ---
5
- h2. Why RSpec
6
-
7
- Bla bla bla
@@ -1,22 +0,0 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
2
- require File.dirname(__FILE__) + "/stack"
3
-
4
- context "An empty stack" do
5
-
6
- setup do
7
- @stack = Stack.new
8
- end
9
-
10
- specify "should accept an item when sent push" do
11
- lambda { @stack.push Object.new }.should.not.raise
12
- end
13
-
14
- specify "should complain when sent top" do
15
- lambda { @stack.top }.should.raise StackUnderflowError
16
- end
17
-
18
- specify "should complain when sent pop" do
19
- lambda { @stack.pop }.should.raise StackUnderflowError
20
- end
21
-
22
- end
@@ -1,30 +0,0 @@
1
- require File.dirname(__FILE__) + '/../lib/spec'
2
-
3
- class Team
4
- attr_reader :players
5
- def initialize
6
- @players = Players.new
7
- end
8
- end
9
-
10
- class Players
11
- def size
12
- 0
13
- end
14
- end
15
-
16
- context "A new team" do
17
-
18
- setup do
19
- @team = Team.new
20
- end
21
-
22
- specify "should have 3 players (failing example)" do
23
- @team.should.have(3).players
24
- end
25
-
26
- specify "should have 1 player (failing example)" do
27
- @team.players.size.should.be 1
28
- end
29
-
30
- end
@@ -1,16 +0,0 @@
1
- module Spec
2
- module Api
3
-
4
- class DuckType
5
- def initialize(*methods_to_respond_do)
6
- @methods_to_respond_do = methods_to_respond_do
7
- end
8
-
9
- def walks_like?(obj)
10
- @methods_to_respond_do.each { |sym| return false unless obj.respond_to? sym }
11
- return true
12
- end
13
- end
14
-
15
- end
16
- end
@@ -1,88 +0,0 @@
1
- module Spec
2
- module Runner
3
- class SimpleTextReporter
4
- def initialize(output=STDOUT,verbose=false,backtrace_tweaker=BacktraceTweaker.new)
5
- @output = output
6
- @context_names = []
7
- @errors = []
8
- @spec_names = []
9
- @verbose = verbose
10
- @backtrace_tweaker = backtrace_tweaker
11
- end
12
-
13
- def add_context(name)
14
- @output << "\n" if @context_names.empty? unless @verbose
15
- @output << "\n#{name}\n" if @verbose
16
- @context_names << name
17
- end
18
-
19
- def add_spec(name, errors=[])
20
- if errors.empty?
21
- spec_passed(name)
22
- else
23
- errors.each { |error| @backtrace_tweaker.tweak_backtrace(error, name) }
24
- # only show the first one (there might be more)
25
- spec_failed(name, errors[0])
26
- end
27
- end
28
-
29
- def start
30
- @start_time = Time.new
31
- end
32
-
33
- def end
34
- @end_time = Time.new
35
- end
36
-
37
- def dump
38
- @output << "\n"
39
- dump_errors
40
- @output << "\n\n" unless @errors.empty?
41
- @output << "\n" if @errors.empty?
42
- @output << "Finished in " << (duration).to_s << " seconds\n\n"
43
- @output << "#{@context_names.length} context#{'s' unless @context_names.length == 1 }, "
44
- @output << "#{@spec_names.length} specification#{'s' unless @spec_names.length == 1 }, "
45
- @output << "#{@errors.length} failure#{'s' unless @errors.length == 1 }"
46
- @output << "\n"
47
- end
48
-
49
- def dump_errors
50
- return if @errors.empty?
51
- @output << "\n"
52
- @errors.inject(1) do |index, error|
53
- @output << "\n\n" if index > 1
54
- @output << index.to_s << ")\n"
55
- @output << "#{error.message} (#{error.class.name})\n"
56
- dump_backtrace(error.backtrace)
57
- index + 1
58
- end
59
- end
60
-
61
- def dump_backtrace(trace)
62
- @output << trace.join("\n") unless trace.nil?
63
- end
64
-
65
- private
66
-
67
- def duration
68
- return @end_time - @start_time unless (@end_time.nil? or @start_time.nil?)
69
- return "0.0"
70
- end
71
-
72
- def spec_passed(name)
73
- @spec_names << name
74
- @output << "- #{name}\n" if @verbose
75
- @output << '.' unless @verbose
76
- end
77
-
78
- def spec_failed(name, error)
79
- @spec_names << name
80
- @errors << error
81
- @output << "- #{name} (FAILED - #{@errors.length})\n" if @verbose
82
- @output << 'F' unless @verbose
83
- end
84
-
85
- end
86
-
87
- end
88
- end
@@ -1,28 +0,0 @@
1
- module RCov
2
- class VerifyTask < Rake::TaskLib
3
- attr_accessor :name
4
- attr_accessor :index_html
5
- attr_accessor :threshold
6
-
7
- def initialize(name=:rcov_verify)
8
- @name = name
9
- yield self if block_given?
10
- raise "Threshold must be set" if @threshold.nil?
11
- define
12
- end
13
-
14
- def define
15
- desc "Verify that rcov coverage is at least #{threshold}"
16
- task @name do
17
- total_coverage = nil
18
- File.open(index_html).each_line do |line|
19
- if line =~ /<tt>(\d+\.\d+)%<\/tt>&nbsp;<\/td>/
20
- total_coverage = eval($1)
21
- break
22
- end
23
- end
24
- raise "Coverage must be at least #{threshold}% but was #{total_coverage}%" if total_coverage < threshold
25
- end
26
- end
27
- end
28
- end
@@ -1,123 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../test_helper'
2
-
3
- module Spec
4
- module Runner
5
- class SimpleTextReporterTest < Test::Unit::TestCase
6
-
7
- def setup
8
- @io = StringIO.new
9
- @backtrace_tweaker = Spec::Api::Mock.new("backtrace tweaker")
10
- @reporter = SimpleTextReporter.new(@io, false, @backtrace_tweaker)
11
- end
12
-
13
- def test_should_include_time
14
- @reporter.start
15
- @reporter.end
16
- @reporter.dump
17
- assert_match(/Finished in [0-9].[0-9|e|-]+ seconds/, @io.string)
18
- end
19
-
20
- def test_should_output_stats_even_with_no_data
21
- @reporter.dump
22
- assert_match(/Finished in 0.0 seconds/, @io.string)
23
- assert_match(/0 contexts, 0 specifications, 0 failures/, @io.string)
24
- end
25
-
26
- def test_should_account_for_context_in_stats_for_pass
27
- @reporter.add_context "context"
28
- @reporter.dump
29
- assert_match(/1 context, 0 specifications, 0 failures/, @io.string)
30
- end
31
-
32
- def test_should_account_for_spec_in_stats_for_pass
33
- @reporter.add_spec Specification.new("spec"), {}
34
- @reporter.dump
35
- assert_match(/0 contexts, 1 specification, 0 failures/, @io.string)
36
- end
37
-
38
- def test_should_account_for_spec_and_error_in_stats_for_pass
39
- @backtrace_tweaker.should.receive(:tweak_backtrace)
40
- @reporter.add_context "context"
41
- @reporter.add_spec Specification.new("spec"), [RuntimeError.new]
42
- @reporter.dump
43
- assert_match(/1 context, 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"
57
- @reporter.add_spec "spec"
58
- @reporter.add_spec "spec", [RuntimeError.new]
59
- @reporter.add_context "context"
60
- @reporter.add_spec "spec"
61
- @reporter.add_spec "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_context "context"
69
- @reporter.add_spec "spec", [RuntimeError.new]
70
- @backtrace_tweaker.__verify
71
- end
72
-
73
- end
74
-
75
- class SimpleTextReporterQuietOutputTest < Test::Unit::TestCase
76
-
77
- def setup
78
- @io = StringIO.new
79
- @reporter = SimpleTextReporter.new(@io)
80
- @reporter.add_context "context"
81
- end
82
-
83
- def test_should_remain_silent_when_context_name_provided
84
- assert_equal("\n", @io.string)
85
- end
86
-
87
- def test_should_output_dot_when_spec_passed
88
- @reporter.add_spec "spec"
89
- assert_equal("\n.", @io.string)
90
- end
91
-
92
- def test_should_output_F_when_spec_failed
93
- @reporter.add_spec "spec", [RuntimeError.new]
94
- assert_equal("\nF", @io.string)
95
- end
96
-
97
- end
98
-
99
- class SimpleTextReporterVerboseOutputTest < Test::Unit::TestCase
100
-
101
- def setup
102
- @io = StringIO.new
103
- @reporter = SimpleTextReporter.new(@io, true)
104
- @reporter.add_context "context"
105
- end
106
-
107
- def test_should_output_when_context_name_provided
108
- assert_match(/\ncontext\n/, @io.string)
109
- end
110
-
111
- def test_should_output_spec_name_when_spec_passed
112
- @reporter.add_spec "spec"
113
- assert_match(/- spec\n/, @io.string)
114
- end
115
-
116
- def test_should_output_failure_when_spec_failed
117
- @reporter.add_spec "spec", [RuntimeError.new]
118
- assert_match(/spec \(FAILED - 1\)/, @io.string)
119
- end
120
-
121
- end
122
- end
123
- end