assert 2.4.0 → 2.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 (52) hide show
  1. data/README.md +8 -8
  2. data/lib/assert.rb +9 -62
  3. data/lib/assert/assert_runner.rb +15 -30
  4. data/lib/assert/assertions.rb +105 -41
  5. data/lib/assert/cli.rb +1 -1
  6. data/lib/assert/config.rb +56 -0
  7. data/lib/assert/context.rb +44 -150
  8. data/lib/assert/context/setup_dsl.rb +70 -0
  9. data/lib/assert/context/subject_dsl.rb +39 -0
  10. data/lib/assert/context/suite_dsl.rb +20 -0
  11. data/lib/assert/context/test_dsl.rb +51 -0
  12. data/lib/assert/runner.rb +8 -2
  13. data/lib/assert/suite.rb +33 -12
  14. data/lib/assert/test.rb +11 -8
  15. data/lib/assert/utils.rb +23 -11
  16. data/lib/assert/version.rb +1 -1
  17. data/lib/assert/view.rb +9 -7
  18. data/lib/assert/view/base.rb +26 -4
  19. data/lib/assert/view/default_view.rb +1 -1
  20. data/lib/assert/view/helpers/ansi_styles.rb +1 -1
  21. data/lib/assert/view/helpers/common.rb +16 -6
  22. data/test/helper.rb +1 -94
  23. data/test/support/factory.rb +70 -0
  24. data/test/system/running_tests.rb +55 -28
  25. data/test/unit/assert_tests.rb +6 -33
  26. data/test/unit/assertions/assert_block_tests.rb +3 -3
  27. data/test/unit/assertions/assert_empty_tests.rb +6 -4
  28. data/test/unit/assertions/assert_equal_tests.rb +19 -22
  29. data/test/unit/assertions/assert_file_exists_tests.rb +6 -4
  30. data/test/unit/assertions/assert_includes_tests.rb +8 -4
  31. data/test/unit/assertions/assert_instance_of_tests.rb +8 -6
  32. data/test/unit/assertions/assert_kind_of_tests.rb +8 -5
  33. data/test/unit/assertions/assert_match_tests.rb +8 -4
  34. data/test/unit/assertions/assert_nil_tests.rb +6 -4
  35. data/test/unit/assertions/assert_raises_tests.rb +2 -2
  36. data/test/unit/assertions/assert_respond_to_tests.rb +7 -5
  37. data/test/unit/assertions/assert_same_tests.rb +75 -6
  38. data/test/unit/assertions/assert_true_false_tests.rb +116 -0
  39. data/test/unit/assertions_tests.rb +7 -5
  40. data/test/unit/config_tests.rb +58 -0
  41. data/test/unit/context/{setup_teardown_singleton_tests.rb → setup_dsl_tests.rb} +17 -19
  42. data/test/unit/context/subject_dsl_tests.rb +78 -0
  43. data/test/unit/context/suite_dsl_tests.rb +47 -0
  44. data/test/unit/context/{test_should_singleton_tests.rb → test_dsl_tests.rb} +33 -34
  45. data/test/unit/context_tests.rb +19 -15
  46. data/test/unit/runner_tests.rb +9 -3
  47. data/test/unit/suite_tests.rb +20 -23
  48. data/test/unit/test_tests.rb +22 -14
  49. data/test/unit/utils_tests.rb +15 -21
  50. data/test/unit/view_tests.rb +12 -5
  51. metadata +23 -10
  52. data/test/unit/context/basic_singleton_tests.rb +0 -86
@@ -0,0 +1,47 @@
1
+ require 'assert'
2
+ require 'assert/context/suite_dsl'
3
+
4
+ require 'assert/suite'
5
+
6
+ module Assert::Context::SuiteDSL
7
+
8
+ class UnitTests < Assert::Context
9
+ desc "Assert::Context::SuiteDSL"
10
+ setup do
11
+ @custom_suite = Factory.modes_off_suite
12
+ @context_class = Factory.context_class
13
+ end
14
+ subject{ @context_class }
15
+
16
+ should "use `Assert.suite` by default" do
17
+ assert_equal Assert.suite, subject.suite
18
+ end
19
+
20
+ should "use any given custom suite" do
21
+ subject.suite(@custom_suite)
22
+ assert_equal @custom_suite, subject.suite
23
+ end
24
+
25
+ end
26
+
27
+ class SuiteFromParentTests < UnitTests
28
+ desc "`suite` method using parent context"
29
+ setup do
30
+ @parent_class = Factory.context_class
31
+ @parent_class.suite(@custom_suite)
32
+ @context_class = Factory.context_class(@parent_class)
33
+ end
34
+
35
+ should "default to it's parents subject block" do
36
+ assert_equal @custom_suite, subject.suite
37
+ end
38
+
39
+ should "use any given custom suite" do
40
+ another_suite = Factory.modes_off_suite
41
+ subject.suite(another_suite)
42
+ assert_equal another_suite, subject.suite
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -1,25 +1,23 @@
1
1
  require 'assert'
2
- require 'assert/context'
2
+ require 'assert/context/test_dsl'
3
3
 
4
- class Assert::Context
4
+ module Assert::Context::TestDSL
5
5
 
6
- # `ContextSingletonTests` defined in `test/helper.rb`
7
- class TestShouldSingletonTests < ContextSingletonTests
8
- desc "test and should methods"
6
+ class UnitTests < Assert::Context
7
+ desc "Assert::Context::TestDSL"
9
8
  setup do
10
- @test_count_before = Assert.suite.tests.size
11
9
  @test_desc = "be true"
12
10
  @test_block = ::Proc.new{ assert(true) }
13
11
  end
14
12
 
15
13
  should "build a test using `test` with a desc and code block" do
16
14
  d, b = @test_desc, @test_block
17
- Factory.context_class { test(d, &b) }
15
+ context_class = Factory.modes_off_context_class{ test(d, &b) }
18
16
 
19
- assert_equal @test_count_before+1, Assert.suite.tests.size
17
+ assert_equal 1, context_class.suite.tests.size
20
18
 
21
19
  exp_test_name = @test_desc
22
- built_test = Assert.suite.tests.last
20
+ built_test = context_class.suite.tests.first
23
21
  assert_kind_of Assert::Test, built_test
24
22
  assert_equal exp_test_name, built_test.name
25
23
  assert_equal @test_block, built_test.code
@@ -27,12 +25,12 @@ class Assert::Context
27
25
 
28
26
  should "build a test using `should` with a desc and code block" do
29
27
  d, b = @test_desc, @test_block
30
- Factory.context_class { should(d, &b) }
28
+ context_class = Factory.modes_off_context_class{ should(d, &b) }
31
29
 
32
- assert_equal @test_count_before+1, Assert.suite.tests.size
30
+ assert_equal 1, context_class.suite.tests.size
33
31
 
34
32
  exp_test_name = "should #{@test_desc}"
35
- built_test = Assert.suite.tests.last
33
+ built_test = context_class.suite.tests.last
36
34
  assert_kind_of Assert::Test, built_test
37
35
  assert_equal exp_test_name, built_test.name
38
36
  assert_equal @test_block, built_test.code
@@ -42,10 +40,10 @@ class Assert::Context
42
40
  d, b = @test_desc, @test_block
43
41
  context = build_eval_context{ test_eventually(d, &b) }
44
42
  err = capture_err(Assert::Result::TestSkipped) do
45
- context.instance_eval(&Assert.suite.tests.last.code)
43
+ context.instance_eval(&context.class.suite.tests.last.code)
46
44
  end
47
45
 
48
- assert_equal @test_count_before+1, Assert.suite.tests.size
46
+ assert_equal 1, context.class.suite.tests.size
49
47
  assert_equal "", err.message
50
48
  end
51
49
 
@@ -53,10 +51,10 @@ class Assert::Context
53
51
  d, b = @test_desc, @test_block
54
52
  context = build_eval_context{ should_eventually(d, &b) }
55
53
  err = capture_err(Assert::Result::TestSkipped) do
56
- context.instance_eval(&Assert.suite.tests.last.code)
54
+ context.instance_eval(&context.class.suite.tests.last.code)
57
55
  end
58
56
 
59
- assert_equal @test_count_before+1, Assert.suite.tests.size
57
+ assert_equal 1, context.class.suite.tests.size
60
58
  assert_equal "", err.message
61
59
  end
62
60
 
@@ -64,10 +62,10 @@ class Assert::Context
64
62
  d = @test_desc
65
63
  context = build_eval_context { test(d) } # no block passed
66
64
  err = capture_err(Assert::Result::TestSkipped) do
67
- context.instance_eval(&Assert.suite.tests.last.code)
65
+ context.instance_eval(&context.class.suite.tests.last.code)
68
66
  end
69
67
 
70
- assert_equal @test_count_before+1, Assert.suite.tests.size
68
+ assert_equal 1, context.class.suite.tests.size
71
69
  assert_equal "TODO", err.message
72
70
  end
73
71
 
@@ -75,10 +73,10 @@ class Assert::Context
75
73
  d = @test_desc
76
74
  context = build_eval_context { should(d) } # no block passed
77
75
  err = capture_err(Assert::Result::TestSkipped) do
78
- context.instance_eval(&Assert.suite.tests.last.code)
76
+ context.instance_eval(&context.class.suite.tests.last.code)
79
77
  end
80
78
 
81
- assert_equal @test_count_before+1, Assert.suite.tests.size
79
+ assert_equal 1, context.class.suite.tests.size
82
80
  assert_equal "TODO", err.message
83
81
  end
84
82
 
@@ -86,10 +84,10 @@ class Assert::Context
86
84
  d = @test_desc
87
85
  context = build_eval_context{ test_eventually(d) } # no block given
88
86
  err = capture_err(Assert::Result::TestSkipped) do
89
- context.instance_eval(&Assert.suite.tests.last.code)
87
+ context.instance_eval(&context.class.suite.tests.last.code)
90
88
  end
91
89
 
92
- assert_equal @test_count_before+1, Assert.suite.tests.size
90
+ assert_equal 1, context.class.suite.tests.size
93
91
  assert_equal "TODO", err.message
94
92
  end
95
93
 
@@ -97,27 +95,27 @@ class Assert::Context
97
95
  d = @test_desc
98
96
  context = build_eval_context{ should_eventually(d) } # no block given
99
97
  err = capture_err(Assert::Result::TestSkipped) do
100
- context.instance_eval(&Assert.suite.tests.last.code)
98
+ context.instance_eval(&context.class.suite.tests.last.code)
101
99
  end
102
100
 
103
- assert_equal @test_count_before+1, Assert.suite.tests.size
101
+ assert_equal 1, context.class.suite.tests.size
104
102
  assert_equal "TODO", err.message
105
103
  end
106
104
 
107
105
  should "build a test from a macro using `test`" do
108
106
  d, b = @test_desc, @test_block
109
107
  m = Assert::Macro.new{ test(d, &b); test(d, &b) }
110
- Factory.context_class { test(m) }
108
+ context_class = Factory.modes_off_context_class{ test(m) }
111
109
 
112
- assert_equal @test_count_before+2, Assert.suite.tests.size
110
+ assert_equal 2, context_class.suite.tests.size
113
111
  end
114
112
 
115
113
  should "build a test from a macro using `should`" do
116
114
  d, b = @test_desc, @test_block
117
115
  m = Assert::Macro.new{ should(d, &b); should(d, &b) }
118
- Factory.context_class { should(m) }
116
+ context_class = Factory.modes_off_context_class{ should(m) }
119
117
 
120
- assert_equal @test_count_before+2, Assert.suite.tests.size
118
+ assert_equal 2, context_class.suite.tests.size
121
119
  end
122
120
 
123
121
  should "build a test that skips from a macro using `test_eventually`" do
@@ -125,9 +123,9 @@ class Assert::Context
125
123
  m = Assert::Macro.new{ test(d, &b); test(d, &b) }
126
124
  context = build_eval_context{ test_eventually(m) }
127
125
 
128
- assert_equal @test_count_before+1, Assert.suite.tests.size
126
+ assert_equal 1, context.class.suite.tests.size
129
127
  assert_raises(Assert::Result::TestSkipped) do
130
- context.instance_eval(&Assert.suite.tests.last.code)
128
+ context.instance_eval(&context.class.suite.tests.last.code)
131
129
  end
132
130
  end
133
131
 
@@ -136,9 +134,9 @@ class Assert::Context
136
134
  m = Assert::Macro.new{ should(d, &b); should(d, &b) }
137
135
  context = build_eval_context{ should_eventually(m) }
138
136
 
139
- assert_equal @test_count_before+1, Assert.suite.tests.size
137
+ assert_equal 1, context.class.suite.tests.size
140
138
  assert_raises(Assert::Result::TestSkipped) do
141
- context.instance_eval(&Assert.suite.tests.last.code)
139
+ context.instance_eval(&context.class.suite.tests.last.code)
142
140
  end
143
141
 
144
142
  end
@@ -146,9 +144,10 @@ class Assert::Context
146
144
  private
147
145
 
148
146
  def build_eval_context(&build_block)
149
- context_class = Factory.context_class &build_block
147
+ context_class = Factory.modes_off_context_class &build_block
150
148
  context_info = Factory.context_info(context_class)
151
- context_class.new(Factory.test("whatever", context_info))
149
+ test = Factory.test("whatever", context_info)
150
+ context_class.new(test, test.config)
152
151
  end
153
152
 
154
153
  def capture_err(err_class, &block)
@@ -1,6 +1,7 @@
1
1
  require 'assert'
2
2
  require 'assert/context'
3
3
 
4
+ require 'assert/config'
4
5
  require 'assert/utils'
5
6
 
6
7
  class Assert::Context
@@ -10,13 +11,19 @@ class Assert::Context
10
11
  setup do
11
12
  @test = Factory.test
12
13
  @context_class = @test.context_class
13
- @context = @context_class.new(@test)
14
- end
15
- teardown do
16
- TEST_ASSERT_SUITE.tests.clear
14
+ @context = @context_class.new(@test, @test.config)
17
15
  end
18
16
  subject{ @context }
19
17
 
18
+ # DSL methods
19
+ should have_cmeths :description, :desc, :describe, :subject, :suite
20
+ should have_cmeths :setup_once, :before_once, :startup
21
+ should have_cmeths :teardown_once, :after_once, :shutdown
22
+ should have_cmeths :setup, :before, :setups
23
+ should have_cmeths :teardown, :after, :teardowns
24
+ should have_cmeths :test, :test_eventually, :test_skip
25
+ should have_cmeths :should, :should_eventually, :should_skip
26
+
20
27
  should have_imeths :assert, :assert_not, :refute
21
28
  should have_imeths :skip, :pass, :fail, :flunk, :ignore
22
29
  should have_imeths :with_backtrace, :subject
@@ -115,16 +122,13 @@ class Assert::Context
115
122
  class HaltOnFailTests < FailTests
116
123
  desc "when halting on fails"
117
124
  setup do
118
- @orig_halt_fail = Assert.config.halt_on_fail
125
+ @halt_config = Assert::Config.new(:halt_on_fail => true)
126
+ @context = @context_class.new(@test, @halt_config)
119
127
  @fail_msg = "something failed"
120
128
  end
121
- teardown do
122
- Assert.config.halt_on_fail @orig_halt_fail
123
- end
124
129
  subject{ @result }
125
130
 
126
131
  should "raise an exception with the failure's message" do
127
- Assert.config.halt_on_fail true
128
132
  err = begin
129
133
  @context.fail @fail_msg
130
134
  rescue Exception => exception
@@ -158,10 +162,10 @@ class Assert::Context
158
162
  end
159
163
 
160
164
  should "pp the assertion value in the fail message by default" do
161
- exp_default_what = "Failed assert: assertion was `#{Assert::U.show(false)}`."
165
+ exp_def_what = "Failed assert: assertion was `#{Assert::U.show(false, @test.config)}`."
162
166
  result = subject.assert(false, @fail_desc)
163
167
 
164
- assert_equal [@fail_desc, exp_default_what].join("\n"), result.message
168
+ assert_equal [@fail_desc, exp_def_what].join("\n"), result.message
165
169
  end
166
170
 
167
171
  should "use a custom fail message if one is given" do
@@ -197,10 +201,10 @@ class Assert::Context
197
201
  end
198
202
 
199
203
  should "pp the assertion value in the fail message by default" do
200
- exp_default_what = "Failed assert_not: assertion was `#{Assert::U.show(true)}`."
204
+ exp_def_what = "Failed assert_not: assertion was `#{Assert::U.show(true, @test.config)}`."
201
205
  result = subject.assert_not(true, @fail_desc)
202
206
 
203
- assert_equal [@fail_desc, exp_default_what].join("\n"), result.message
207
+ assert_equal [@fail_desc, exp_def_what].join("\n"), result.message
204
208
  end
205
209
 
206
210
  should "return a fail result given a \"truthy\" assertion" do
@@ -217,10 +221,10 @@ class Assert::Context
217
221
  desc "subject method"
218
222
  setup do
219
223
  expected = @expected = "amazing"
220
- @context_class = Factory.context_class do
224
+ @context_class = Factory.modes_off_context_class do
221
225
  subject{ @something = expected }
222
226
  end
223
- @context = @context_class.new
227
+ @context = @context_class.new(@test, @test.config)
224
228
  @subject = @context.subject
225
229
  end
226
230
  subject{ @subject }
@@ -8,13 +8,19 @@ class Assert::Runner
8
8
  class BasicTests < Assert::Context
9
9
  desc "a basic runner"
10
10
  setup do
11
- @suite = Assert::Suite.new
11
+ @config = Factory.modes_off_config
12
+ @suite = Assert::Suite.new(@config)
12
13
  @view = Assert::View::Base.new(StringIO.new("", "w+"), @suite)
13
- @runner = Assert::Runner.new
14
+ @runner = Assert::Runner.new(@config)
14
15
  end
15
16
  subject { @runner }
16
17
 
17
- should have_instance_methods :run
18
+ should have_readers :config
19
+ should have_imeths :run
20
+
21
+ should "know its config" do
22
+ assert_equal @config, subject.config
23
+ end
18
24
 
19
25
  should "return an integer exit code" do
20
26
  assert_equal 0, subject.run(@suite, @view)
@@ -5,17 +5,19 @@ require 'test/support/inherited_stuff'
5
5
 
6
6
  class Assert::Suite
7
7
 
8
- class BasicTests < Assert::Context
9
- desc "an basic suite"
8
+ class UnitTests < Assert::Context
9
+ desc "Assert::Suite"
10
10
  setup do
11
- @suite = Assert::Suite.new
11
+ @config = Factory.modes_off_config
12
+ @suite = Assert::Suite.new(@config)
12
13
  end
13
14
  subject{ @suite }
14
15
 
15
- should have_imeths :ordered_tests, :results, :ordered_results, :run_time
16
+ should have_accessors :config, :tests, :test_methods, :start_time, :end_time
17
+ should have_imeths :ordered_tests, :results, :ordered_results
18
+ should have_imeths :run_time, :test_rate, :result_rate
16
19
  should have_imeths :count, :test_count, :result_count
17
20
  should have_imeths :setup, :startup, :teardown, :shutdown
18
- should have_accessors :tests, :test_methods, :start_time, :end_time
19
21
 
20
22
  should "determine a klass' local public test methods" do
21
23
  exp = ["test_subclass_stuff", "test_mixin_stuff", "test_repeated"].sort
@@ -23,17 +25,18 @@ class Assert::Suite
23
25
  assert_equal(exp, act)
24
26
  end
25
27
 
26
- should "have zero a run time by default" do
28
+ should "have a zero run time, test rate and result by default" do
27
29
  assert_equal 0, subject.run_time
30
+ assert_equal 0, subject.test_rate
31
+ assert_equal 0, subject.result_rate
28
32
  end
29
33
 
30
34
  end
31
35
 
32
- class WithTestsTests < Assert::Context
36
+ class WithTestsTests < UnitTests
33
37
  desc "a suite with tests"
34
38
  setup do
35
- ci = Factory.context_info(Factory.context_class)
36
- @suite = Assert::Suite.new
39
+ ci = Factory.context_info(Factory.modes_off_context_class)
37
40
  @suite.tests = [
38
41
  Factory.test("should nothing", ci){ },
39
42
  Factory.test("should pass", ci){ assert(1==1); refute(1==0) },
@@ -44,7 +47,6 @@ class Assert::Suite
44
47
  ]
45
48
  @suite.tests.each(&:run)
46
49
  end
47
- subject{ @suite }
48
50
 
49
51
  should "build test instances to run" do
50
52
  assert_kind_of Assert::Test, subject.tests.first
@@ -121,37 +123,33 @@ class Assert::Suite
121
123
 
122
124
  end
123
125
 
124
- class SetupTests < Assert::Context
126
+ class SetupTests < UnitTests
125
127
  desc "a suite with a setup block"
126
128
  setup do
127
129
  @setup_status = nil
128
- @suite = Assert::Suite.new
129
130
  @setup_blocks = []
130
131
  @setup_blocks << ::Proc.new{ @setup_status = "setup" }
131
132
  @setup_blocks << ::Proc.new{ @setup_status += " has been run" }
132
133
  @setup_blocks.each{ |setup_block| @suite.setup(&setup_block) }
133
134
  end
134
- subject{ @setup_status }
135
135
 
136
136
  should "set the setup status to the correct message" do
137
- @suite.setup
138
- assert_equal "setup has been run", subject
137
+ subject.setup
138
+ assert_equal "setup has been run", @setup_status
139
139
  end
140
140
 
141
141
  should "return the setup blocks with the #setups method" do
142
- setups = @suite.send(:setups)
143
142
  @setup_blocks.each do |setup_block|
144
- assert_includes setup_block, setups
143
+ assert_includes setup_block, subject.send(:setups)
145
144
  end
146
145
  end
147
146
 
148
147
  end
149
148
 
150
- class TeardownTests < Assert::Context
149
+ class TeardownTests < UnitTests
151
150
  desc "a suite with a teardown"
152
151
  setup do
153
152
  @teardown_status = nil
154
- @suite = Assert::Suite.new
155
153
  @teardown_blocks = []
156
154
  @teardown_blocks << ::Proc.new{ @teardown_status += " has been run" }
157
155
  @teardown_blocks << ::Proc.new{ @teardown_status = "teardown" }
@@ -159,20 +157,19 @@ class Assert::Suite
159
157
  end
160
158
 
161
159
  should "set the teardown status to the correct message" do
162
- @suite.teardown
160
+ subject.teardown
163
161
  assert_equal "teardown has been run", @teardown_status
164
162
  end
165
163
 
166
164
  should "return the teardown blocks with the #teardowns method" do
167
- teardowns = @suite.send(:teardowns)
168
165
  @teardown_blocks.each do |setup_block|
169
- assert_includes setup_block, teardowns
166
+ assert_includes setup_block, subject.send(:teardowns)
170
167
  end
171
168
  end
172
169
 
173
170
  end
174
171
 
175
- class ContextInfoTests < Assert::Context
172
+ class ContextInfoTests < UnitTests
176
173
  desc "a suite's context info"
177
174
  setup do
178
175
  @caller = caller