assert 2.4.0 → 2.5.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/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