assert 2.14.0 → 2.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/assert.gemspec +0 -2
  4. data/lib/assert/assert_runner.rb +1 -1
  5. data/lib/assert/assertions.rb +1 -1
  6. data/lib/assert/config.rb +6 -1
  7. data/lib/assert/config_helpers.rb +75 -0
  8. data/lib/assert/context.rb +20 -14
  9. data/lib/assert/context/test_dsl.rb +17 -13
  10. data/lib/assert/{view/default_view.rb → default_view.rb} +9 -17
  11. data/lib/assert/factory.rb +2 -7
  12. data/lib/assert/file_line.rb +7 -3
  13. data/lib/assert/macro.rb +1 -1
  14. data/lib/assert/macros/methods.rb +1 -1
  15. data/lib/assert/result.rb +84 -90
  16. data/lib/assert/runner.rb +8 -2
  17. data/lib/assert/suite.rb +15 -5
  18. data/lib/assert/test.rb +112 -75
  19. data/lib/assert/version.rb +1 -1
  20. data/lib/assert/view.rb +108 -21
  21. data/lib/assert/view_helpers.rb +238 -0
  22. data/test/support/factory.rb +23 -6
  23. data/test/system/test_tests.rb +359 -0
  24. data/test/unit/assertions_tests.rb +1 -1
  25. data/test/unit/config_helpers_tests.rb +95 -0
  26. data/test/unit/config_tests.rb +5 -1
  27. data/test/unit/context/test_dsl_tests.rb +25 -17
  28. data/test/unit/context_tests.rb +45 -10
  29. data/test/unit/factory_tests.rb +9 -11
  30. data/test/unit/file_line_tests.rb +22 -0
  31. data/test/unit/result_tests.rb +219 -160
  32. data/test/unit/runner_tests.rb +19 -5
  33. data/test/unit/suite_tests.rb +23 -4
  34. data/test/unit/test_tests.rb +167 -33
  35. data/test/unit/view_helpers_tests.rb +210 -0
  36. data/test/unit/view_tests.rb +66 -26
  37. metadata +12 -23
  38. data/lib/assert/view/base.rb +0 -91
  39. data/lib/assert/view/helpers/ansi_styles.rb +0 -25
  40. data/lib/assert/view/helpers/common.rb +0 -209
  41. data/test/system/running_tests.rb +0 -404
@@ -8,7 +8,7 @@ module Assert::Assertions
8
8
  setup do
9
9
  @context_class = Factory.modes_off_context_class
10
10
  @test = Factory.test
11
- @context = @context_class.new(@test, @test.config)
11
+ @context = @context_class.new(@test, @test.config, proc{ |r| })
12
12
  end
13
13
  subject{ @context }
14
14
 
@@ -0,0 +1,95 @@
1
+ require 'assert'
2
+ require 'assert/config_helpers'
3
+
4
+ require 'assert/config'
5
+
6
+ module Assert::ConfigHelpers
7
+
8
+ class UnitTests < Assert::Context
9
+ desc "Assert::ConfigHelpers"
10
+ setup do
11
+ @helpers_class = Class.new do
12
+ include Assert::ConfigHelpers
13
+
14
+ def config
15
+ # use the assert config since it has tests, contexts, etc
16
+ # also maybe use a fresh config that is empty
17
+ @config ||= [Assert.config, Assert::Config.new].choice
18
+ end
19
+ end
20
+ @helpers = @helpers_class.new
21
+ end
22
+ subject{ @helpers }
23
+
24
+ should have_imeths :runner_seed, :count, :tests?, :all_pass?
25
+ should have_imeths :run_time, :test_rate, :result_rate
26
+ should have_imeths :suite_contexts, :ordered_suite_contexts
27
+ should have_imeths :suite_files, :ordered_suite_files
28
+ should have_imeths :show_test_profile_info?, :show_test_verbose_info?
29
+ should have_imeths :ocurring_result_types
30
+
31
+ should "know its runner seed" do
32
+ assert_equal subject.config.runner_seed, subject.runner_seed
33
+ end
34
+
35
+ should "know how to count things on the suite" do
36
+ thing = [:pass, :fail, :results, :tests].choice
37
+ assert_equal subject.config.suite.count(thing), subject.count(thing)
38
+ end
39
+
40
+ should "know if it has tests or not" do
41
+ exp = subject.count(:tests) > 0
42
+ assert_equal exp, subject.tests?
43
+ end
44
+
45
+ should "know its formatted run time, test rate and result rate" do
46
+ format = '%.6f'
47
+
48
+ exp = format % subject.config.suite.run_time
49
+ assert_equal exp, subject.run_time(format)
50
+
51
+ exp = format % subject.config.suite.test_rate
52
+ assert_equal exp, subject.test_rate(format)
53
+
54
+ exp = format % subject.config.suite.result_rate
55
+ assert_equal exp, subject.result_rate(format)
56
+ end
57
+
58
+ should "know its suite contexts and ordered suite contexts" do
59
+ exp = subject.config.suite.tests.inject([]) do |contexts, test|
60
+ contexts << test.context_info.klass
61
+ end.uniq
62
+ assert_equal exp, subject.suite_contexts
63
+
64
+ exp = subject.suite_contexts.sort{ |a,b| a.to_s <=> b.to_s }
65
+ assert_equal exp, subject.ordered_suite_contexts
66
+ end
67
+
68
+ should "know its suite files and ordered suite files" do
69
+ exp = subject.config.suite.tests.inject([]) do |files, test|
70
+ files << test.context_info.file
71
+ end.uniq
72
+ assert_equal exp, subject.suite_files
73
+
74
+ exp = subject.suite_files.sort{ |a,b| a.to_s <=> b.to_s }
75
+ assert_equal exp, subject.ordered_suite_files
76
+ end
77
+
78
+ should "know whether to show test profile info" do
79
+ assert_equal !!subject.config.profile, subject.show_test_profile_info?
80
+ end
81
+
82
+ should "know whether to show verbose info" do
83
+ assert_equal !!subject.config.verbose, subject.show_test_verbose_info?
84
+ end
85
+
86
+ should "know what result types occur in a suite's results" do
87
+ exp = [:pass, :fail, :ignore, :skip, :error].select do |result_sym|
88
+ subject.count(result_sym) > 0
89
+ end
90
+ assert_equal exp, subject.ocurring_result_types
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -1,6 +1,10 @@
1
1
  require 'assert'
2
2
  require 'assert/config'
3
3
 
4
+ require 'assert/default_view'
5
+ require 'assert/runner'
6
+ require 'assert/suite'
7
+
4
8
  class Assert::Config
5
9
 
6
10
  class UnitTests < Assert::Context
@@ -18,7 +22,7 @@ class Assert::Config
18
22
  should have_imeths :debug, :apply
19
23
 
20
24
  should "default the view, suite, and runner" do
21
- assert_kind_of Assert::View::DefaultView, subject.view
25
+ assert_kind_of Assert::DefaultView, subject.view
22
26
  assert_kind_of Assert::Suite, subject.suite
23
27
  assert_kind_of Assert::Runner, subject.runner
24
28
  end
@@ -17,10 +17,11 @@ module Assert::Context::TestDSL
17
17
  assert_equal 1, context_class.suite.tests.size
18
18
 
19
19
  exp_test_name = @test_desc
20
- built_test = context_class.suite.tests.first
20
+ built_test = context_class.suite.tests.first
21
+
21
22
  assert_kind_of Assert::Test, built_test
22
23
  assert_equal exp_test_name, built_test.name
23
- assert_equal @test_block, built_test.code
24
+ assert_equal @test_block, built_test.code
24
25
  end
25
26
 
26
27
  should "build a test using `should` with a desc and code block" do
@@ -30,10 +31,11 @@ module Assert::Context::TestDSL
30
31
  assert_equal 1, context_class.suite.tests.size
31
32
 
32
33
  exp_test_name = "should #{@test_desc}"
33
- built_test = context_class.suite.tests.last
34
+ built_test = context_class.suite.tests.last
35
+
34
36
  assert_kind_of Assert::Test, built_test
35
37
  assert_equal exp_test_name, built_test.name
36
- assert_equal @test_block, built_test.code
38
+ assert_equal @test_block, built_test.code
37
39
  end
38
40
 
39
41
  should "build a test that skips with no msg when `test_eventually` called" do
@@ -43,8 +45,9 @@ module Assert::Context::TestDSL
43
45
  context.instance_eval(&context.class.suite.tests.last.code)
44
46
  end
45
47
 
46
- assert_equal 1, context.class.suite.tests.size
47
- assert_equal "", err.message
48
+ assert_equal 1, context.class.suite.tests.size
49
+ assert_equal 'TODO', err.message
50
+ assert_equal 1, err.backtrace.size
48
51
  end
49
52
 
50
53
  should "build a test that skips with no msg when `should_eventually` called" do
@@ -54,8 +57,9 @@ module Assert::Context::TestDSL
54
57
  context.instance_eval(&context.class.suite.tests.last.code)
55
58
  end
56
59
 
57
- assert_equal 1, context.class.suite.tests.size
58
- assert_equal "", err.message
60
+ assert_equal 1, context.class.suite.tests.size
61
+ assert_equal 'TODO', err.message
62
+ assert_equal 1, err.backtrace.size
59
63
  end
60
64
 
61
65
  should "skip with the msg \"TODO\" when `test` called with no block" do
@@ -65,8 +69,9 @@ module Assert::Context::TestDSL
65
69
  context.instance_eval(&context.class.suite.tests.last.code)
66
70
  end
67
71
 
68
- assert_equal 1, context.class.suite.tests.size
69
- assert_equal "TODO", err.message
72
+ assert_equal 1, context.class.suite.tests.size
73
+ assert_equal 'TODO', err.message
74
+ assert_equal 1, err.backtrace.size
70
75
  end
71
76
 
72
77
  should "skip with the msg \"TODO\" when `should` called with no block" do
@@ -76,8 +81,9 @@ module Assert::Context::TestDSL
76
81
  context.instance_eval(&context.class.suite.tests.last.code)
77
82
  end
78
83
 
79
- assert_equal 1, context.class.suite.tests.size
80
- assert_equal "TODO", err.message
84
+ assert_equal 1, context.class.suite.tests.size
85
+ assert_equal 'TODO', err.message
86
+ assert_equal 1, err.backtrace.size
81
87
  end
82
88
 
83
89
  should "skip with the msg \"TODO\" when `test_eventually` called with no block" do
@@ -87,8 +93,9 @@ module Assert::Context::TestDSL
87
93
  context.instance_eval(&context.class.suite.tests.last.code)
88
94
  end
89
95
 
90
- assert_equal 1, context.class.suite.tests.size
91
- assert_equal "TODO", err.message
96
+ assert_equal 1, context.class.suite.tests.size
97
+ assert_equal 'TODO', err.message
98
+ assert_equal 1, err.backtrace.size
92
99
  end
93
100
 
94
101
  should "skip with the msg \"TODO\" when `should_eventually` called with no block" do
@@ -98,8 +105,9 @@ module Assert::Context::TestDSL
98
105
  context.instance_eval(&context.class.suite.tests.last.code)
99
106
  end
100
107
 
101
- assert_equal 1, context.class.suite.tests.size
102
- assert_equal "TODO", err.message
108
+ assert_equal 1, context.class.suite.tests.size
109
+ assert_equal 'TODO', err.message
110
+ assert_equal 1, err.backtrace.size
103
111
  end
104
112
 
105
113
  should "build a test from a macro using `test`" do
@@ -147,7 +155,7 @@ module Assert::Context::TestDSL
147
155
  context_class = Factory.modes_off_context_class &build_block
148
156
  context_info = Factory.context_info(context_class)
149
157
  test = Factory.test("whatever", context_info)
150
- context_class.new(test, test.config)
158
+ context_class.new(test, test.config, proc{ |r| })
151
159
  end
152
160
 
153
161
  def capture_err(err_class, &block)
@@ -11,7 +11,9 @@ class Assert::Context
11
11
  setup do
12
12
  @test = Factory.test
13
13
  @context_class = @test.context_class
14
- @context = @context_class.new(@test, @test.config)
14
+ @callback_result = nil
15
+ @result_callback = proc{ |result| @callback_result = result }
16
+ @context = @context_class.new(@test, @test.config, @result_callback)
15
17
  end
16
18
  subject{ @context }
17
19
 
@@ -42,7 +44,7 @@ class Assert::Context
42
44
  setup do
43
45
  @skip_msg = "I need to implement this in the future."
44
46
  begin; @context.skip(@skip_msg); rescue Exception => @exception; end
45
- @result = Factory.skip_result("something", @exception)
47
+ @result = Factory.skip_result(@exception)
46
48
  end
47
49
  subject{ @result }
48
50
 
@@ -52,6 +54,19 @@ class Assert::Context
52
54
  assert_equal @skip_msg, subject.message
53
55
  end
54
56
 
57
+ should "not call the result callback" do
58
+ assert_nil @callback_result
59
+ end
60
+
61
+ should "use any given called from arg as the exception backtrace" do
62
+ assert_not_equal 1, @exception.backtrace.size
63
+
64
+ called_from = Factory.string
65
+ begin; @context.skip(@skip_msg, called_from); rescue Exception => exception; end
66
+ assert_equal 1, exception.backtrace.size
67
+ assert_equal called_from, exception.backtrace.first
68
+ end
69
+
55
70
  end
56
71
 
57
72
  class IgnoreTests < UnitTests
@@ -67,6 +82,10 @@ class Assert::Context
67
82
  assert_equal @ignore_msg, subject.message
68
83
  end
69
84
 
85
+ should "call the result callback" do
86
+ assert_equal @result, @callback_result
87
+ end
88
+
70
89
  end
71
90
 
72
91
  class PassTests < UnitTests
@@ -82,6 +101,10 @@ class Assert::Context
82
101
  assert_equal @pass_msg, subject.message
83
102
  end
84
103
 
104
+ should "call the result callback" do
105
+ assert_equal @result, @callback_result
106
+ end
107
+
85
108
  end
86
109
 
87
110
  class FlunkTests < UnitTests
@@ -97,6 +120,10 @@ class Assert::Context
97
120
  assert_equal @flunk_msg, subject.message
98
121
  end
99
122
 
123
+ should "call the result callback" do
124
+ assert_equal @result, @callback_result
125
+ end
126
+
100
127
  end
101
128
 
102
129
  class FailTests < UnitTests
@@ -118,13 +145,17 @@ class Assert::Context
118
145
  assert_equal fail_msg, result.message
119
146
  end
120
147
 
148
+ should "call the result callback" do
149
+ assert_equal @result, @callback_result
150
+ end
151
+
121
152
  end
122
153
 
123
- class HaltOnFailTests < FailTests
124
- desc "when halting on fails"
154
+ class HaltOnFailTests < UnitTests
155
+ desc "failing when halting on fails"
125
156
  setup do
126
157
  @halt_config = Assert::Config.new(:halt_on_fail => true)
127
- @context = @context_class.new(@test, @halt_config)
158
+ @context = @context_class.new(@test, @halt_config, @result_callback)
128
159
  @fail_msg = "something failed"
129
160
  end
130
161
  subject{ @result }
@@ -138,10 +169,14 @@ class Assert::Context
138
169
  assert_kind_of Assert::Result::TestFailure, err
139
170
  assert_equal @fail_msg, err.message
140
171
 
141
- result = Assert::Result::Fail.new(Factory.test("something"), err)
172
+ result = Assert::Result::Fail.for_test(Factory.test("something"), err)
142
173
  assert_equal @fail_msg, result.message
143
174
  end
144
175
 
176
+ should "not call the result callback" do
177
+ assert_nil @callback_result
178
+ end
179
+
145
180
  end
146
181
 
147
182
  class AssertTests < UnitTests
@@ -154,7 +189,7 @@ class Assert::Context
154
189
  should "return a pass result given a `true` assertion" do
155
190
  result = subject.assert(true, @fail_desc){ @what_failed }
156
191
  assert_kind_of Assert::Result::Pass, result
157
- assert_nil result.message
192
+ assert_equal '', result.message
158
193
  end
159
194
 
160
195
  should "return a fail result given a `false` assertion" do
@@ -193,7 +228,7 @@ class Assert::Context
193
228
  should "return a pass result given a `false` assertion" do
194
229
  result = subject.assert_not(false, @fail_desc)
195
230
  assert_kind_of Assert::Result::Pass, result
196
- assert_nil result.message
231
+ assert_equal '', result.message
197
232
  end
198
233
 
199
234
  should "return a fail result given a `true` assertion" do
@@ -225,7 +260,7 @@ class Assert::Context
225
260
  @context_class = Factory.modes_off_context_class do
226
261
  subject{ @something = expected }
227
262
  end
228
- @context = @context_class.new(@test, @test.config)
263
+ @context = @context_class.new(@test, @test.config, proc{ |result| })
229
264
  @subject = @context.subject
230
265
  end
231
266
  subject{ @subject }
@@ -248,7 +283,7 @@ class Assert::Context
248
283
  begin
249
284
  @context.with_backtrace(@from_bt, &@from_block)
250
285
  rescue Assert::Result::TestSkipped => e
251
- @test.results << Assert::Result::Skip.new(@test, e)
286
+ @test.results << Assert::Result::Skip.for_test(@test, e)
252
287
  end
253
288
 
254
289
  assert_equal 5, @test.results.size
@@ -63,6 +63,15 @@ module Assert::Factory
63
63
  assert_equal 1, subject.text(1).length
64
64
  end
65
65
 
66
+ should "return a random string using `slug`" do
67
+ assert_kind_of String, subject.slug
68
+ assert_equal 5, subject.slug.length
69
+ end
70
+
71
+ should "allow passing a maximum length using `slug`" do
72
+ assert_equal 1, subject.slug(1).length
73
+ end
74
+
66
75
  should "return a random hex string using `hex`" do
67
76
  assert_kind_of String, subject.hex
68
77
  assert_match /\A[0-9a-f]{10}\Z/, subject.hex
@@ -72,17 +81,6 @@ module Assert::Factory
72
81
  assert_equal 1, subject.hex(1).length
73
82
  end
74
83
 
75
- should "return a random slug string using `slug`" do
76
- assert_kind_of String, subject.slug
77
- segments = subject.slug.split('-')
78
- assert_equal 2, segments.size
79
- segments.each{ |s| assert_match /\A[a-z]{4}\Z/, s }
80
- end
81
-
82
- should "allow passing a maximum length using `slug`" do
83
- assert_equal 1, subject.slug(1).length
84
- end
85
-
86
84
  should "return a random file name string using `file_name`" do
87
85
  assert_kind_of String, subject.file_name
88
86
  assert_match /\A[a-z]{6}\.[a-z]{3}\Z/, subject.file_name
@@ -21,6 +21,20 @@ class Assert::FileLine
21
21
  assert_equal @line, file_line.line
22
22
  end
23
23
 
24
+ should "handle parsing bad data gracefully" do
25
+ file_line = subject.parse(@file)
26
+ assert_equal '', file_line.file
27
+ assert_equal '', file_line.line
28
+
29
+ file_line = subject.parse('')
30
+ assert_equal '', file_line.file
31
+ assert_equal '', file_line.line
32
+
33
+ file_line = subject.parse(nil)
34
+ assert_equal '', file_line.file
35
+ assert_equal '', file_line.line
36
+ end
37
+
24
38
  end
25
39
 
26
40
  class InitTests < UnitTests
@@ -35,6 +49,14 @@ class Assert::FileLine
35
49
  should "know its file and line" do
36
50
  assert_equal @file, subject.file
37
51
  assert_equal @line, subject.line
52
+
53
+ file_line = Assert::FileLine.new(@file)
54
+ assert_equal @file, file_line.file
55
+ assert_equal '', file_line.line
56
+
57
+ file_line = Assert::FileLine.new
58
+ assert_equal '', file_line.file
59
+ assert_equal '', file_line.line
38
60
  end
39
61
 
40
62
  should "know its string representation" do
@@ -3,277 +3,336 @@ require 'assert/result'
3
3
 
4
4
  module Assert::Result
5
5
 
6
- class BacktraceTests < Assert::Context
7
- desc "Assert::Result::Backtrace"
6
+ class UnitTests < Assert::Context
7
+ desc "Assert::Result"
8
8
  setup do
9
- @backtrace = Backtrace.new(caller)
9
+ @test = Factory.test("a test name")
10
10
  end
11
- subject { @backtrace }
11
+ subject{ Assert::Result }
12
12
 
13
- should have_instance_methods :to_s, :filtered
13
+ should have_imeths :types, :new
14
14
 
15
- should "be an Array" do
16
- assert_kind_of ::Array, subject
17
- end
15
+ should "know its types" do
16
+ exp = {
17
+ :pass => Pass,
18
+ :fail => Fail,
19
+ :ignore => Ignore,
20
+ :skip => Skip,
21
+ :error => Error
22
+ }
23
+ assert_equal exp, subject.types
18
24
 
19
- should "render as a string by joining on the newline" do
20
- assert_equal subject.join("\n"), subject.to_s
25
+ assert_equal Base, subject.types[Factory.string]
21
26
  end
22
27
 
23
- should "another backtrace when filtered" do
24
- assert_kind_of Backtrace, subject
25
- end
28
+ should "create results from data hashes" do
29
+ type = Assert::Result.types.keys.choice
30
+ exp = Assert::Result.types[type].new(:type => type)
26
31
 
27
- should "default itself when created from nil" do
28
- assert_equal ["No backtrace"], Backtrace.new
32
+ assert_equal exp, Assert::Result.new(:type => type)
29
33
  end
30
34
 
31
35
  end
32
36
 
33
- class BaseTests < Assert::Context
34
- desc "Assert::Result::Base"
37
+ class BaseTests < UnitTests
38
+ desc "Base"
35
39
  setup do
36
- @test = Factory.test("a test name")
37
- @result = Assert::Result::Base.new(@test, "a message", ["line 1", "line2"])
40
+ @given_data = {
41
+ :type => Factory.string,
42
+ :name => Factory.string,
43
+ :test_name => Factory.string,
44
+ :message => Factory.string,
45
+ :backtrace => Backtrace.new(caller),
46
+ :trace => Factory.string
47
+ }
48
+ @result = Base.new(@given_data)
38
49
  end
39
50
  subject{ @result }
40
51
 
41
- should have_readers :test, :message, :backtrace
42
- should have_imeths :test_name, :name, :to_sym, :to_s, :trace
43
- should have_imeth :set_backtrace
52
+ should have_cmeths :type, :name, :for_test
53
+ should have_imeths :type, :name, :test_name, :message, :backtrace, :trace
54
+ should have_imeths *Assert::Result.types.keys.map{ |k| "#{k}?" }
55
+ should have_imeths :set_backtrace, :data, :to_sym, :to_s
44
56
 
45
- Assert::Result.types.keys.each do |type|
46
- should "respond to the instance method ##{type}?" do
47
- assert_respond_to "#{type}?", subject
48
- end
57
+ should "know its class-level type/name" do
58
+ assert_equal :unknown, subject.class.type
59
+ assert_equal '', subject.class.name
60
+ end
49
61
 
50
- should "not be #{type}" do
51
- assert_equal false, subject.send("#{type}?")
52
- end
62
+ should "know how to build a result for a given test" do
63
+ message = Factory.text
64
+ bt = Factory.integer(3).times.map{ Factory.string }
65
+ result = Base.for_test(@test, message, bt)
66
+
67
+ exp_backtrace = Backtrace.new(bt)
68
+ exp_trace = exp_backtrace.filtered.first.to_s
69
+
70
+ assert_equal @test.name, result.test_name
71
+ assert_equal message, result.message
72
+ assert_equal exp_backtrace, result.backtrace
73
+ assert_equal exp_trace, result.trace
53
74
  end
54
75
 
55
- should "know its test" do
56
- assert_equal @test, subject.test
76
+ should "use any given attrs" do
77
+ assert_equal @given_data[:type].to_sym, subject.type
78
+ assert_equal @given_data[:name], subject.name
79
+ assert_equal @given_data[:test_name], subject.test_name
80
+ assert_equal @given_data[:message], subject.message
81
+ assert_equal @given_data[:backtrace], subject.backtrace
82
+ assert_equal @given_data[:trace], subject.trace
57
83
  end
58
84
 
59
- should "nil out empty messages" do
60
- assert_equal nil, Assert::Result::Base.new(@test, "").message
85
+ should "default its attrs" do
86
+ result = Base.new({})
87
+
88
+ assert_equal :unknown, result.type
89
+ assert_equal '', result.name
90
+ assert_equal '', result.test_name
91
+ assert_equal '', result.message
92
+ assert_equal Backtrace.new([]), result.backtrace
93
+ assert_equal '', result.trace
61
94
  end
62
95
 
63
- should "show only its class and message when inspected" do
64
- exp = "#<#{subject.class}:#{'0x0%x' % (subject.object_id << 1)}"\
65
- " @message=#{subject.message.inspect}>"
66
- assert_equal exp, subject.inspect
96
+ should "know if it is a certain type of result" do
97
+ Assert::Result.types.keys.each do |type|
98
+ assert_false subject.send("#{type}?")
99
+ Assert.stub(subject, :type){ type }
100
+ assert_true subject.send("#{type}?")
101
+ end
67
102
  end
68
103
 
69
- should "allow overriding the result backtrace with `set_backtrace`" do
70
- subject.set_backtrace(['bt'])
104
+ should "allow setting a new backtrace" do
105
+ new_bt = Factory.integer(3).times.map{ Factory.string }
106
+ exp_backtrace = Backtrace.new(new_bt)
107
+ exp_trace = exp_backtrace.filtered.first.to_s
108
+
109
+ subject.set_backtrace(new_bt)
71
110
 
72
- assert_kind_of Assert::Result::Backtrace, subject.backtrace
73
- assert_equal ['bt'], subject.backtrace
111
+ assert_equal exp_backtrace, subject.backtrace
112
+ assert_equal exp_trace, subject.trace
74
113
  end
75
114
 
76
- should "include its test context name in the to_s" do
77
- assert subject.to_s.include?(subject.test_name)
115
+ should "know its data" do
116
+ exp = {
117
+ :type => subject.type,
118
+ :name => subject.name,
119
+ :test_name => subject.test_name,
120
+ :message => subject.message,
121
+ :backtrace => subject.backtrace,
122
+ :trace => subject.trace,
123
+ }
124
+ assert_equal exp, subject.data
78
125
  end
79
126
 
80
- should "include its test name in the to_s" do
81
- assert subject.to_s.include?(subject.test_name)
127
+ should "know its symbol representation" do
128
+ assert_equal subject.type, subject.to_sym
82
129
  end
83
130
 
84
- should "include its message in the to_s" do
85
- assert subject.to_s.include?(subject.message)
131
+ should "know its string representation" do
132
+ str = subject.to_s
133
+
134
+ assert_includes subject.name.upcase, str
135
+ assert_includes subject.test_name, str
136
+ assert_includes subject.message, str
137
+ assert_includes subject.trace, str
138
+
139
+ assert_equal 3, str.split("\n").count
140
+
141
+ Assert.stub(subject, :message){ '' }
142
+ Assert.stub(subject, :trace){ '' }
143
+
144
+ assert_equal 1, subject.to_s.split("\n").count
86
145
  end
87
146
 
88
- should "include its trace in the to_s" do
89
- assert subject.to_s.include?(subject.trace)
147
+ should "know if it is equal to another result" do
148
+ other = Assert::Result::Base.new(@given_data)
149
+ assert_equal other, subject
150
+
151
+ Assert.stub(other, [:type, :message].choice){ Factory.string }
152
+ assert_not_equal other, subject
90
153
  end
91
154
 
92
- should "have a trace with the first filtered line of the backtrace" do
93
- assert_equal subject.backtrace.filtered.first, subject.trace
155
+ should "show only its class and message when inspected" do
156
+ exp = "#<#{subject.class}:#{'0x0%x' % (subject.object_id << 1)}"\
157
+ " @message=#{subject.message.inspect}>"
158
+ assert_equal exp, subject.inspect
94
159
  end
160
+
95
161
  end
96
162
 
97
- class PassTests < Assert::Context
98
- desc "Assert::Result::Pass"
163
+ class PassTests < UnitTests
164
+ desc "Pass"
99
165
  setup do
100
- @test = Factory.test("a test name")
101
- @result = Assert::Result::Pass.new(@test, "passed", [])
166
+ @result = Pass.new({})
102
167
  end
103
168
  subject { @result }
104
169
 
105
- should "pass?" do
106
- assert_equal true, subject.pass?
170
+ should "know its type/name" do
171
+ assert_equal :pass, subject.type
172
+ assert_equal :pass, subject.class.type
173
+ assert_equal 'Pass', subject.class.name
107
174
  end
108
175
 
109
- Assert::Result.types.keys.reject{|k| k == :pass}.each do |type|
110
- should "not be #{type}?" do
111
- assert_equal false, subject.send("#{type}?")
112
- end
113
- end
176
+ end
114
177
 
115
- should "know its to_sym" do
116
- assert_equal :pass, subject.to_sym
178
+ class IgnoreTests < UnitTests
179
+ desc "Ignore"
180
+ setup do
181
+ @result = Ignore.new({})
117
182
  end
183
+ subject { @result }
118
184
 
119
- should "know its name" do
120
- assert_equal "Pass", subject.name
185
+ should "know its type/name" do
186
+ assert_equal :ignore, subject.type
187
+ assert_equal :ignore, subject.class.type
188
+ assert_equal 'Ignore', subject.class.name
121
189
  end
122
190
 
123
- should "include PASS in its to_s" do
124
- assert subject.to_s.include?("PASS")
191
+ end
192
+
193
+ class TestFailureTests < UnitTests
194
+ desc "TestFailure"
195
+ subject{ TestFailure }
196
+
197
+ should "be a runtime error" do
198
+ assert_kind_of RuntimeError, subject.new
125
199
  end
126
200
 
127
201
  end
128
202
 
129
- class IgnoreTests < Assert::Context
130
- desc "Assert::Result::Ignore"
203
+ class FailTests < UnitTests
204
+ desc "Fail"
131
205
  setup do
132
- @test = Factory.test("a test name")
133
- @result = Assert::Result::Ignore.new(@test, "ignored", [])
206
+ @result = Fail.new({})
134
207
  end
135
208
  subject { @result }
136
209
 
137
- should "ignore?" do
138
- assert_equal true, subject.ignore?
210
+ should "know its type/name" do
211
+ assert_equal :fail, subject.type
212
+ assert_equal :fail, subject.class.type
213
+ assert_equal 'Fail', subject.class.name
139
214
  end
140
215
 
141
- Assert::Result.types.keys.reject{|k| k == :ignore}.each do |type|
142
- should "not be #{type}?" do
143
- assert_equal false, subject.send("#{type}?")
144
- end
145
- end
216
+ should "allow creating for a test with TestFailure exceptions" do
217
+ err = TestFailure.new
218
+ err.set_backtrace(caller)
219
+ result = Fail.for_test(@test, err)
146
220
 
147
- should "know its to_sym" do
148
- assert_equal :ignore, subject.to_sym
221
+ assert_equal err.message, result.message
222
+
223
+ exp_bt = Backtrace.new(err.backtrace)
224
+ assert_equal exp_bt, result.backtrace
149
225
  end
150
226
 
151
- should "know its name" do
152
- assert_equal "Ignore", subject.name
227
+ should "not allow creating for a test with non-TestFailure exceptions" do
228
+ assert_raises(ArgumentError){ Fail.for_test(@test, RuntimeError.new) }
153
229
  end
154
230
 
155
- should "include IGNORE in its to_s" do
156
- assert subject.to_s.include?("IGNORE")
231
+ end
232
+
233
+ class TestSkippedTests < UnitTests
234
+ desc "TestSkipped"
235
+ subject{ TestSkipped }
236
+
237
+ should "be a runtime error" do
238
+ assert_kind_of RuntimeError, subject.new
157
239
  end
158
240
 
159
241
  end
160
242
 
161
- class FailTests < Assert::Context
162
- desc "Assert::Result::Fail"
243
+ class SkipTests < UnitTests
244
+ desc "Skip"
163
245
  setup do
164
- @test = Factory.test("a test name")
165
- @result = Assert::Result::Fail.new(@test, "failed", [])
246
+ @result = Skip.new({})
166
247
  end
167
248
  subject { @result }
168
249
 
169
- should "use a runtime error (TestFailure) for controlling flow" do
170
- assert_kind_of RuntimeError, Assert::Result::TestFailure.new
171
- end
172
-
173
- should "fail?" do
174
- assert_equal true, subject.fail?
250
+ should "know its type/name" do
251
+ assert_equal :skip, subject.type
252
+ assert_equal :skip, subject.class.type
253
+ assert_equal 'Skip', subject.class.name
175
254
  end
176
255
 
177
- Assert::Result.types.keys.reject{|k| k == :fail}.each do |type|
178
- should "not be #{type}?" do
179
- assert_equal false, subject.send("#{type}?")
180
- end
181
- end
256
+ should "allow creating for a test with TestSkipped exceptions" do
257
+ err = TestSkipped.new
258
+ err.set_backtrace(caller)
259
+ result = Skip.for_test(@test, err)
182
260
 
183
- should "know its to_sym" do
184
- assert_equal :fail, subject.to_sym
185
- end
261
+ assert_equal err.message, result.message
186
262
 
187
- should "know its name" do
188
- assert_equal "Fail", subject.name
263
+ exp_bt = Backtrace.new(err.backtrace)
264
+ assert_equal exp_bt, result.backtrace
189
265
  end
190
266
 
191
- should "include FAIL in its to_s" do
192
- assert subject.to_s.include?("FAIL")
267
+ should "not allow creating for a test with non-TestSkipped exceptions" do
268
+ assert_raises(ArgumentError){ Skip.for_test(@test, RuntimeError.new) }
193
269
  end
194
270
 
195
271
  end
196
272
 
197
- class SkipTests < Assert::Context
198
- desc "Assert::Result::Skip"
273
+ class ErrorTests < UnitTests
274
+ desc "Error"
199
275
  setup do
200
- @test = Factory.test("a test name")
201
- @exception = nil
202
- begin
203
- raise TestSkipped, "test ski["
204
- rescue Exception => err
205
- @exception = err
206
- end
207
- @result = Assert::Result::Skip.new(@test, @exception)
276
+ @result = Error.new({})
208
277
  end
209
278
  subject { @result }
210
279
 
211
- should "use a runtime error (TestSkipped) for controlling flow" do
212
- assert_kind_of RuntimeError, Assert::Result::TestSkipped.new
280
+ should "know its class-level type/name" do
281
+ assert_equal :error, subject.class.type
282
+ assert_equal 'Error', subject.class.name
213
283
  end
214
284
 
215
- should "skip?" do
216
- assert_equal true, subject.skip?
217
- end
285
+ should "allow creating for a test with exceptions" do
286
+ err = Exception.new
287
+ err.set_backtrace(caller)
288
+ result = Error.for_test(@test, err)
218
289
 
219
- Assert::Result.types.keys.reject{|k| k == :skip}.each do |type|
220
- should "not be #{type}?" do
221
- assert_equal false, subject.send("#{type}?")
222
- end
223
- end
224
-
225
- should "know its to_sym" do
226
- assert_equal :skip, subject.to_sym
227
- end
290
+ exp_msg = "#{err.message} (#{err.class.name})"
291
+ assert_equal exp_msg, result.message
228
292
 
229
- should "know its name" do
230
- assert_equal "Skip", subject.name
293
+ exp_bt = Backtrace.new(err.backtrace)
294
+ assert_equal exp_bt, result.backtrace
295
+ assert_equal exp_bt.to_s, result.trace
231
296
  end
232
297
 
233
- should "include SKIP in its to_s" do
234
- assert subject.to_s.include?("SKIP")
298
+ should "not allow creating for a test without an exception" do
299
+ assert_raises(ArgumentError){ Error.for_test(@test, Factory.string) }
235
300
  end
236
301
 
237
302
  end
238
303
 
239
- class ErrorTests < Assert::Context
240
- desc "Assert::Result::Error"
304
+ class BacktraceTests < UnitTests
305
+ desc "Backtrace"
241
306
  setup do
242
- @test = Factory.test("a test name")
243
- @exception = nil
244
- begin
245
- raise Exception, "test error"
246
- rescue Exception => err
247
- @exception = err
248
- end
249
- @result = Assert::Result::Error.new(@test, @exception)
307
+ @backtrace = Backtrace.new(caller)
250
308
  end
251
- subject { @result }
309
+ subject { @backtrace }
252
310
 
253
- should "error?" do
254
- assert_equal true, subject.error?
311
+ should have_cmeths :parse
312
+ should have_imeths :to_s, :filtered
313
+
314
+ should "be parseable from its string representation" do
315
+ assert_equal subject, Backtrace.parse(subject.to_s)
255
316
  end
256
317
 
257
- Assert::Result.types.keys.reject{|k| k == :error}.each do |type|
258
- should "not be #{type}?" do
259
- assert_equal false, subject.send("#{type}?")
260
- end
318
+ should "be an Array" do
319
+ assert_kind_of ::Array, subject
261
320
  end
262
321
 
263
- should "know its to_sym" do
264
- assert_equal :error, subject.to_sym
322
+ should "know its DELIM" do
323
+ assert_equal "\n", Backtrace::DELIM
265
324
  end
266
325
 
267
- should "know its name" do
268
- assert_equal "Error", subject.name
326
+ should "render as a string by joining on the newline" do
327
+ assert_equal subject.join(Backtrace::DELIM), subject.to_s
269
328
  end
270
329
 
271
- should "include ERRORED in its to_s" do
272
- assert subject.to_s.include?("ERROR")
330
+ should "another backtrace when filtered" do
331
+ assert_kind_of Backtrace, subject
273
332
  end
274
333
 
275
- should "have a trace created from the original exception's unfiltered backtrace" do
276
- assert_equal @exception.backtrace.join("\n"), subject.trace
334
+ should "default itself when created from nil" do
335
+ assert_equal ["No backtrace"], Backtrace.new
277
336
  end
278
337
 
279
338
  end