assert 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +6 -0
  3. data/Gemfile.lock +17 -0
  4. data/README.rdoc +77 -0
  5. data/Rakefile +7 -0
  6. data/assert.gemspec +21 -0
  7. data/examples/empty_test.rb +5 -0
  8. data/examples/results_test.rb +25 -0
  9. data/examples/single_test.rb +9 -0
  10. data/lib/assert.rb +8 -0
  11. data/lib/assert/assertions.rb +253 -0
  12. data/lib/assert/context.rb +196 -0
  13. data/lib/assert/options.rb +43 -0
  14. data/lib/assert/rake_tasks.rb +95 -0
  15. data/lib/assert/result.rb +164 -0
  16. data/lib/assert/result_set.rb +14 -0
  17. data/lib/assert/runner.rb +60 -0
  18. data/lib/assert/setup/autorun.rb +34 -0
  19. data/lib/assert/setup/helpers.rb +62 -0
  20. data/lib/assert/setup/suite.rb +12 -0
  21. data/lib/assert/setup/view.rb +11 -0
  22. data/lib/assert/suite.rb +128 -0
  23. data/lib/assert/test.rb +90 -0
  24. data/lib/assert/version.rb +3 -0
  25. data/lib/assert/view/base.rb +54 -0
  26. data/lib/assert/view/terminal.rb +138 -0
  27. data/test/assertions/assert_block_test.rb +39 -0
  28. data/test/assertions/assert_instance_of_test.rb +43 -0
  29. data/test/assertions/assert_kind_of_test.rb +43 -0
  30. data/test/assertions/assert_not_block_test.rb +39 -0
  31. data/test/assertions/assert_not_instance_of_test.rb +43 -0
  32. data/test/assertions/assert_not_kind_of_test.rb +43 -0
  33. data/test/assertions/assert_not_respond_to_test.rb +43 -0
  34. data/test/assertions/assert_nothing_raised_test.rb +46 -0
  35. data/test/assertions/assert_raises_test.rb +49 -0
  36. data/test/assertions/assert_respond_to_test.rb +43 -0
  37. data/test/assertions_test.rb +334 -0
  38. data/test/context/class_methods_test.rb +314 -0
  39. data/test/context_test.rb +288 -0
  40. data/test/fixtures/inherited_stuff.rb +36 -0
  41. data/test/fixtures/sample_context.rb +13 -0
  42. data/test/helper.rb +52 -0
  43. data/test/irb.rb +10 -0
  44. data/test/options_test.rb +78 -0
  45. data/test/result_set_test.rb +89 -0
  46. data/test/result_test.rb +255 -0
  47. data/test/runner_test.rb +33 -0
  48. data/test/suite_test.rb +200 -0
  49. data/test/test/running_test.rb +327 -0
  50. data/test/test_test.rb +184 -0
  51. data/test/view_test.rb +35 -0
  52. metadata +155 -0
@@ -0,0 +1,89 @@
1
+ require 'assert'
2
+
3
+ require 'assert/result_set'
4
+ require 'assert/result'
5
+ require 'assert/view/base'
6
+
7
+ class FakeView < Assert::View::Base
8
+ attr_accessor :printed
9
+
10
+ def initialize(suite, output_io)
11
+ super
12
+ self.printed = []
13
+ end
14
+
15
+ def print_runtime_result(result)
16
+ self.printed.push(result)
17
+ end
18
+
19
+ end
20
+
21
+ class Assert::ResultSet
22
+ class BasicTest < Assert::Context
23
+ desc "Assert result set"
24
+ setup do
25
+ @result_set = Assert::ResultSet.new
26
+ end
27
+ subject { @result_set }
28
+
29
+ INSTANCE_METHODS = [
30
+ :view, :view=
31
+ ]
32
+ INSTANCE_METHODS.each do |method|
33
+ should "respond to the instance method ##{method}" do
34
+ assert_respond_to subject, method
35
+ end
36
+ end
37
+
38
+
39
+
40
+ class ViewTest < BasicTest
41
+ desc "view"
42
+ setup do
43
+ @view_s = ""
44
+ @view = @result_set.view = FakeView.new(nil, StringIO.new(@view_s, "w+"))
45
+
46
+ @pass_result = Assert::Result::Pass.new("test", "pass", [])
47
+ @result_set << @pass_result
48
+ @fail_result = Assert::Result::Fail.new("test", "fail", [])
49
+ @result_set << @fail_result
50
+ @skip_result = Assert::Result::Skip.new("test", RuntimeError.new)
51
+ @result_set << @skip_result
52
+ @error_result = Assert::Result::Error.new("test", RuntimeError.new)
53
+ @result_set << @error_result
54
+ end
55
+ subject{ @view }
56
+
57
+ should "have 'printed' 1 pass result" do
58
+ pass_results = @view.printed.reject{|r| !r.pass? }
59
+ assert_equal 1, pass_results.size
60
+ assert_kind_of Assert::Result::Pass, pass_results.first
61
+ assert_equal @pass_result.test_name, pass_results.first.test_name
62
+ assert_equal @pass_result.message, pass_results.first.message
63
+ end
64
+ should "have 'printed' 1 fail result" do
65
+ fail_results = @view.printed.reject{|r| !r.fail? }
66
+ assert_equal 1, fail_results.size
67
+ assert_kind_of Assert::Result::Fail, fail_results.first
68
+ assert_equal @fail_result.test_name, fail_results.first.test_name
69
+ assert_equal @fail_result.message, fail_results.first.message
70
+ end
71
+ should "have 'printed' 1 skip result" do
72
+ skip_results = @view.printed.reject{|r| !r.skip? }
73
+ assert_equal 1, skip_results.size
74
+ assert_kind_of Assert::Result::Skip, skip_results.first
75
+ assert_equal @skip_result.test_name, skip_results.first.test_name
76
+ assert_equal @skip_result.message, skip_results.first.message
77
+ end
78
+ should "have 'printed' 1 error result" do
79
+ error_results = @view.printed.reject{|r| !r.error? }
80
+ assert_equal 1, error_results.size
81
+ assert_kind_of Assert::Result::Error, error_results.first
82
+ assert_equal @error_result.test_name, error_results.first.test_name
83
+ assert_equal @error_result.message, error_results.first.message
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,255 @@
1
+ require 'assert'
2
+
3
+ require 'assert/result'
4
+
5
+ module Assert::Result
6
+
7
+ class BacktraceTest < Assert::Context
8
+ desc "a result backtrace"
9
+ setup{ @backtrace = Backtrace.new(caller) }
10
+ subject { @backtrace }
11
+
12
+ INSTANCE_METHODS = [
13
+ :to_s, :filtered
14
+ ]
15
+ INSTANCE_METHODS.each do |method|
16
+ should "respond to the instance method ##{method}" do
17
+ assert_respond_to subject, method
18
+ end
19
+ end
20
+
21
+ should "be an Array" do
22
+ assert_kind_of ::Array, subject
23
+ end
24
+
25
+ should "render as a string by joining on the newline" do
26
+ assert_equal subject.join("\n"), subject.to_s
27
+ end
28
+
29
+ should "another backtrace when filtered" do
30
+ assert_kind_of Backtrace, subject
31
+ end
32
+
33
+ should "default itself when created from nil" do
34
+ assert_equal ["No backtrace"], Backtrace.new
35
+ end
36
+ end
37
+
38
+ class BaseTest < Assert::Context
39
+ desc "a base result"
40
+ setup do
41
+ @result = Assert::Result::Base.new("a test name", "a message", ["line 1", "line2"])
42
+ end
43
+ subject{ @result }
44
+
45
+ INSTANCE_METHODS = [
46
+ :test_name, :message, :backtrace, :to_sym, :to_s, :trace
47
+ ]
48
+ INSTANCE_METHODS.each do |method|
49
+ should "respond to the instance method ##{method}" do
50
+ assert_respond_to subject, method
51
+ end
52
+ end
53
+
54
+ Assert::Result.types.keys.each do |type|
55
+ should "respond to the instance method ##{type}?" do
56
+ assert_respond_to subject, "#{type}?"
57
+ end
58
+
59
+ should "not be #{type}" do
60
+ assert_equal false, subject.send("#{type}?")
61
+ end
62
+ end
63
+
64
+ should "nil out empty messages" do
65
+ assert_equal nil, Assert::Result::Base.new("a test name", "").message
66
+ end
67
+
68
+ should "show only its class and message when inspected" do
69
+ assert_equal "#<#{subject.class} @message=#{subject.message.inspect}>", subject.inspect
70
+ end
71
+
72
+ end
73
+
74
+ class ToStringTest < BaseTest
75
+ should "include its test context name in the to_s" do
76
+ assert subject.to_s.include?(subject.test_name)
77
+ end
78
+
79
+ should "include its test name in the to_s" do
80
+ assert subject.to_s.include?(subject.test_name)
81
+ end
82
+
83
+ should "include its message in the to_s" do
84
+ assert subject.to_s.include?(subject.message)
85
+ end
86
+
87
+ should "include its trace in the to_s" do
88
+ assert subject.to_s.include?(subject.trace)
89
+ end
90
+
91
+ should "have a trace with the first filtered line of the backtrace" do
92
+ assert_equal subject.backtrace.filtered.first, subject.trace
93
+ end
94
+ end
95
+
96
+ class PassTest < Assert::Context
97
+ desc "a pass result"
98
+ setup do
99
+ @result = Assert::Result::Pass.new("test", "passed", [])
100
+ end
101
+ subject { @result }
102
+
103
+ should "be pass?" do
104
+ assert_equal true, subject.pass?
105
+ end
106
+
107
+ Assert::Result.types.keys.reject{|k| k == :pass}.each do |type|
108
+ should "not be #{type}?" do
109
+ assert_equal false, subject.send("#{type}?")
110
+ end
111
+ end
112
+
113
+ should "know its to_sym" do
114
+ assert_equal :passed, subject.to_sym
115
+ end
116
+
117
+ should "include PASS in its to_s" do
118
+ assert subject.to_s.include?("PASS")
119
+ end
120
+ end
121
+
122
+ class FailTest < Assert::Context
123
+ desc "a fail result"
124
+ setup do
125
+ @result = Assert::Result::Fail.new("test", "failed", [])
126
+ end
127
+ subject { @result }
128
+
129
+ should "be fail?" do
130
+ assert_equal true, subject.fail?
131
+ end
132
+
133
+ Assert::Result.types.keys.reject{|k| k == :fail}.each do |type|
134
+ should "not be #{type}?" do
135
+ assert_equal false, subject.send("#{type}?")
136
+ end
137
+ end
138
+
139
+ should "know its to_sym" do
140
+ assert_equal :failed, subject.to_sym
141
+ end
142
+
143
+ should "include FAIL in its to_s" do
144
+ assert subject.to_s.include?("FAIL")
145
+ end
146
+ end
147
+
148
+ class IgnoreTest < Assert::Context
149
+ desc "an ignore result"
150
+ setup do
151
+ @result = Assert::Result::Ignore.new("test", "ignored", [])
152
+ end
153
+ subject { @result }
154
+
155
+ should "be ignore?" do
156
+ assert_equal true, subject.ignore?
157
+ end
158
+
159
+ Assert::Result.types.keys.reject{|k| k == :ignore}.each do |type|
160
+ should "not be #{type}?" do
161
+ assert_equal false, subject.send("#{type}?")
162
+ end
163
+ end
164
+
165
+ should "know its to_sym" do
166
+ assert_equal :ignored, subject.to_sym
167
+ end
168
+
169
+ should "include IGNORE in its to_s" do
170
+ assert subject.to_s.include?("IGNORE")
171
+ end
172
+ end
173
+
174
+ class FromExceptionTest < Assert::Context
175
+ before do
176
+ begin
177
+ raise Exception, "test error"
178
+ rescue Exception => err
179
+ @exception = err
180
+ end
181
+ @result = Assert::Result::FromException.new("test", @exception)
182
+ end
183
+ subject{ @result }
184
+
185
+ should "have the same backtrace as the original exception it was created from" do
186
+ assert_equal @exception.backtrace, subject.backtrace
187
+ end
188
+
189
+ end
190
+
191
+ class SkippedRuntimeErrorTest < Assert::Context
192
+
193
+ should "be a runtime error" do
194
+ assert_kind_of RuntimeError, Assert::Result::TestSkipped.new
195
+ end
196
+
197
+ end
198
+
199
+ class SkipTest < FromExceptionTest
200
+ desc "a skip result"
201
+ setup do
202
+ @result = Assert::Result::Skip.new("test", @exception)
203
+ end
204
+ subject { @result }
205
+
206
+ should "be skip?" do
207
+ assert_equal true, subject.skip?
208
+ end
209
+
210
+ Assert::Result.types.keys.reject{|k| k == :skip}.each do |type|
211
+ should "not be #{type}?" do
212
+ assert_equal false, subject.send("#{type}?")
213
+ end
214
+ end
215
+
216
+ should "know its to_sym" do
217
+ assert_equal :skipped, subject.to_sym
218
+ end
219
+
220
+ should "include SKIP in its to_s" do
221
+ assert subject.to_s.include?("SKIP")
222
+ end
223
+ end
224
+
225
+ class ErrorTest < FromExceptionTest
226
+ desc "an error result"
227
+ setup do
228
+ @result = Assert::Result::Error.new("test", @exception)
229
+ end
230
+ subject { @result }
231
+
232
+ should "be error?" do
233
+ assert_equal true, subject.error?
234
+ end
235
+
236
+ Assert::Result.types.keys.reject{|k| k == :error}.each do |type|
237
+ should "not be #{type}?" do
238
+ assert_equal false, subject.send("#{type}?")
239
+ end
240
+ end
241
+
242
+ should "know its to_sym" do
243
+ assert_equal :errored, subject.to_sym
244
+ end
245
+
246
+ should "include ERRORED in its to_s" do
247
+ assert subject.to_s.include?("ERROR")
248
+ end
249
+
250
+ should "have a trace created from the original exception's unfiltered backtrace" do
251
+ assert_equal @exception.backtrace.join("\n"), subject.trace
252
+ end
253
+ end
254
+
255
+ end
@@ -0,0 +1,33 @@
1
+ require 'assert'
2
+
3
+ require 'assert/suite'
4
+ require 'assert/view/base'
5
+ require 'assert/runner'
6
+
7
+ class Assert::Runner
8
+
9
+ class BasicTest < Assert::Context
10
+ desc "a basic runner"
11
+ setup do
12
+ @suite = Assert::Suite.new
13
+ @view = Assert::View::Base.new(@suite, StringIO.new("", "w+"))
14
+ @runner = Assert::Runner.new(@suite, @view)
15
+ end
16
+ subject { @runner }
17
+
18
+ INSTANCE_METHODS = [
19
+ :run, :count
20
+ ]
21
+ INSTANCE_METHODS.each do |method|
22
+ should "respond to the instance method ##{method}" do
23
+ assert_respond_to subject, method
24
+ end
25
+ end
26
+
27
+ should "return an integer exit code" do
28
+ assert_equal 0, subject.run
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,200 @@
1
+ require 'assert'
2
+
3
+ require 'assert/suite'
4
+ require 'assert/context'
5
+ require 'assert/test'
6
+ require 'test/fixtures/inherited_stuff'
7
+ require 'test/fixtures/sample_context'
8
+
9
+
10
+ class Assert::Suite
11
+
12
+ class BasicTest < Assert::Context
13
+ desc "an basic suite"
14
+ setup do
15
+ @suite = Assert::Suite.new
16
+ end
17
+ subject { @suite }
18
+
19
+ INSTANCE_METHODS = [
20
+ :start_time, :end_time, :start_time=, :end_time=,
21
+ :<<,
22
+ :contexts, :tests, :ordered_tests, :ordered_results,
23
+ :count, :test_count, :result_count,
24
+ :run_time
25
+ ]
26
+ INSTANCE_METHODS.each do |method|
27
+ should "respond to the instance method ##{method}" do
28
+ assert_respond_to subject, method
29
+ end
30
+ end
31
+
32
+ should "be a hash" do
33
+ assert_kind_of ::Hash, subject
34
+ end
35
+
36
+ should "push contexts on itself" do
37
+ context_class = Factory.context_class
38
+ subject << context_class
39
+ assert_equal true, subject.has_key?(context_class)
40
+ assert_equal [], subject[context_class]
41
+ end
42
+
43
+ should "determine a klass' local public test methods" do
44
+ assert_equal(
45
+ ["test_subclass_stuff", "test_mixin_stuff"].sort,
46
+ subject.send(:local_public_test_methods, SubStuff).sort
47
+ )
48
+ end
49
+
50
+ should "have zero run time by default" do
51
+ assert_equal 0, subject.run_time
52
+ end
53
+
54
+ end
55
+
56
+ class WithTestsTest < Assert::Context
57
+ desc "a suite with tests"
58
+ setup do
59
+ @suite = Assert::Suite.new
60
+ context_class = Factory.context_class
61
+ @suite[context_class] = [
62
+ Factory.test("should do nothing", context_class),
63
+ Factory.test("should pass", context_class) do
64
+ assert(1==1)
65
+ refute(1==0)
66
+ end,
67
+ Factory.test("should fail", context_class) do
68
+ ignore
69
+ assert(1==0)
70
+ refute(1==1)
71
+ end,
72
+ Factory.test("should be ignored", context_class) do
73
+ ignore
74
+ end,
75
+ Factory.test("should skip", context_class) do
76
+ skip
77
+ ignore
78
+ assert(1==1)
79
+ end,
80
+ Factory.test("should error", context_class) do
81
+ raise Exception
82
+ ignore
83
+ assert(1==1)
84
+ end
85
+ ]
86
+ @suite.tests.each(&:run)
87
+ end
88
+ subject{ @suite }
89
+
90
+ should "know how many tests it has" do
91
+ assert_equal 6, subject.test_count
92
+ end
93
+
94
+ should "know its ordered tests" do
95
+ assert_equal subject.test_count, subject.ordered_tests.size
96
+ end
97
+
98
+ should "know how many results it has" do
99
+ assert_equal 8, subject.result_count
100
+ end
101
+
102
+ should "know its ordered results" do
103
+ assert_equal subject.test_count, subject.ordered_tests.size
104
+ end
105
+
106
+ should "know how many pass results it has" do
107
+ assert_equal 2, subject.result_count(:pass)
108
+ end
109
+
110
+ should "know how many fail results it has" do
111
+ assert_equal 2, subject.result_count(:fail)
112
+ end
113
+
114
+ should "know how many ignore results it has" do
115
+ assert_equal 2, subject.result_count(:ignore)
116
+ end
117
+
118
+ should "know how many skip results it has" do
119
+ assert_equal 1, subject.result_count(:skip)
120
+ end
121
+
122
+ should "know how many error results it has" do
123
+ assert_equal 1, subject.result_count(:error)
124
+ end
125
+
126
+ end
127
+
128
+ class CountTest < WithTestsTest
129
+
130
+ should "count its tests" do
131
+ assert_equal subject.test_count, subject.count(:tests)
132
+ end
133
+
134
+ should "count its results" do
135
+ assert_equal subject.result_count, subject.count(:results)
136
+ end
137
+
138
+ should "count its passed results" do
139
+ assert_equal subject.result_count(:pass), subject.count(:passed)
140
+ assert_equal subject.result_count(:pass), subject.count(:pass)
141
+ end
142
+
143
+ should "count its failed results" do
144
+ assert_equal subject.result_count(:fail), subject.count(:failed)
145
+ assert_equal subject.result_count(:fail), subject.count(:fail)
146
+ end
147
+
148
+ should "count its ignored results" do
149
+ assert_equal subject.result_count(:ignore), subject.count(:ignored)
150
+ assert_equal subject.result_count(:ignore), subject.count(:ignore)
151
+ end
152
+
153
+ should "count its skipped results" do
154
+ assert_equal subject.result_count(:skip), subject.count(:skipped)
155
+ assert_equal subject.result_count(:skip), subject.count(:skip)
156
+ end
157
+
158
+ should "count its errored results" do
159
+ assert_equal subject.result_count(:error), subject.count(:errored)
160
+ assert_equal subject.result_count(:error), subject.count(:error)
161
+ end
162
+
163
+ end
164
+
165
+
166
+ class TestsTest < WithTestsTest
167
+
168
+ should "build test instances to run" do
169
+ assert_kind_of Assert::Test, subject.tests.first
170
+ end
171
+
172
+ end
173
+
174
+
175
+ class PrepTest < Assert::Context
176
+ desc "a suite with a context with local public test meths"
177
+ setup do
178
+ @suite = Assert::Suite.new
179
+ @suite << TwoTests
180
+ end
181
+ subject{ @suite }
182
+
183
+ should "create tests from any local public test methods with a prep call" do
184
+ subject.send(:prep)
185
+ assert_equal 2, subject.test_count(TwoTests)
186
+ end
187
+
188
+ should "not double count local public test methods with multiple prep calls" do
189
+ subject.send(:prep)
190
+ subject.send(:prep)
191
+ assert_equal 2, subject.test_count(TwoTests)
192
+ end
193
+
194
+ should "create tests from any local public test methods with a test_count call" do
195
+ assert_equal 2, subject.test_count(TwoTests)
196
+ end
197
+
198
+ end
199
+
200
+ end