assert 2.18.0 → 2.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +66 -37
  3. data/assert.gemspec +4 -3
  4. data/lib/assert/actual_value.rb +140 -0
  5. data/lib/assert/assertions.rb +80 -20
  6. data/lib/assert/context.rb +31 -37
  7. data/lib/assert/context/let_dsl.rb +13 -0
  8. data/lib/assert/context/method_missing.rb +19 -0
  9. data/lib/assert/context/subject_dsl.rb +23 -24
  10. data/lib/assert/macros/methods.rb +4 -4
  11. data/lib/assert/result.rb +5 -1
  12. data/lib/assert/stub.rb +16 -0
  13. data/lib/assert/suite.rb +7 -10
  14. data/lib/assert/test.rb +0 -8
  15. data/lib/assert/version.rb +1 -1
  16. data/test/helper.rb +23 -25
  17. data/test/support/factory.rb +15 -0
  18. data/test/system/stub_tests.rb +332 -333
  19. data/test/system/test_tests.rb +99 -109
  20. data/test/unit/actual_value_tests.rb +371 -0
  21. data/test/unit/assert_tests.rb +111 -43
  22. data/test/unit/assertions/assert_block_tests.rb +30 -31
  23. data/test/unit/assertions/assert_changes_tests.rb +97 -0
  24. data/test/unit/assertions/assert_empty_tests.rb +33 -32
  25. data/test/unit/assertions/assert_equal_tests.rb +94 -74
  26. data/test/unit/assertions/assert_file_exists_tests.rb +32 -33
  27. data/test/unit/assertions/assert_includes_tests.rb +38 -37
  28. data/test/unit/assertions/assert_instance_of_tests.rb +34 -33
  29. data/test/unit/assertions/assert_kind_of_tests.rb +34 -33
  30. data/test/unit/assertions/assert_match_tests.rb +34 -33
  31. data/test/unit/assertions/assert_nil_tests.rb +30 -31
  32. data/test/unit/assertions/assert_raises_tests.rb +55 -55
  33. data/test/unit/assertions/assert_respond_to_tests.rb +36 -35
  34. data/test/unit/assertions/assert_same_tests.rb +86 -81
  35. data/test/unit/assertions/assert_true_false_tests.rb +60 -60
  36. data/test/unit/assertions_tests.rb +26 -24
  37. data/test/unit/config_helpers_tests.rb +43 -38
  38. data/test/unit/config_tests.rb +38 -34
  39. data/test/unit/context/let_dsl_tests.rb +10 -0
  40. data/test/unit/context/setup_dsl_tests.rb +70 -81
  41. data/test/unit/context/subject_dsl_tests.rb +15 -43
  42. data/test/unit/context/suite_dsl_tests.rb +15 -16
  43. data/test/unit/context/test_dsl_tests.rb +50 -52
  44. data/test/unit/context_info_tests.rb +23 -15
  45. data/test/unit/context_tests.rb +184 -179
  46. data/test/unit/default_runner_tests.rb +2 -5
  47. data/test/unit/default_suite_tests.rb +57 -53
  48. data/test/unit/factory_tests.rb +5 -3
  49. data/test/unit/file_line_tests.rb +33 -35
  50. data/test/unit/macro_tests.rb +14 -10
  51. data/test/unit/result_tests.rb +159 -183
  52. data/test/unit/runner_tests.rb +64 -64
  53. data/test/unit/suite_tests.rb +56 -59
  54. data/test/unit/test_tests.rb +118 -139
  55. data/test/unit/utils_tests.rb +43 -45
  56. data/test/unit/view_helpers_tests.rb +54 -52
  57. data/test/unit/view_tests.rb +22 -23
  58. metadata +29 -7
@@ -7,19 +7,21 @@ require "much-stub"
7
7
  module Assert
8
8
  class UnitTests < Assert::Context
9
9
  desc "Assert"
10
- subject { Assert }
10
+ subject { unit_class }
11
+
12
+ let(:unit_class) { Assert }
11
13
 
12
14
  should have_imeths :config, :configure, :view, :suite, :runner
13
15
  should have_imeths :stubs, :stub, :unstub, :unstub!, :stub_send
14
16
 
15
17
  should "know its config instance" do
16
- assert_kind_of Assert::Config, subject.config
18
+ assert_that(subject.config).is_kind_of(Assert::Config)
17
19
  end
18
20
 
19
21
  should "map its view, suite and runner to its config" do
20
- assert_same subject.config.view, subject.view
21
- assert_same subject.config.suite, subject.suite
22
- assert_same subject.config.runner, subject.runner
22
+ assert_that(subject.view).is(subject.config.view)
23
+ assert_that(subject.suite).is(subject.config.suite)
24
+ assert_that(subject.runner).is(subject.config.runner)
23
25
  end
24
26
 
25
27
  # Note: don't really need to explicitly test the configure method as
@@ -27,57 +29,68 @@ module Assert
27
29
  end
28
30
 
29
31
  class StubTests < UnitTests
30
- setup do
31
- @orig_value = Factory.string
32
- @stub_value = Factory.string
33
-
34
- @myclass = Class.new do
32
+ let(:class1) {
33
+ Class.new do
35
34
  def initialize(value); @value = value; end
36
35
  def mymeth; @value; end
37
36
  end
38
- @myobj = @myclass.new(@orig_value)
39
- end
37
+ }
38
+ let(:object1) { class1.new(orig_value1) }
39
+ let(:orig_value1) { Factory.string }
40
+ let(:stub_value1) { Factory.string }
40
41
 
41
42
  should "build a stub" do
42
- stub1 = Assert.stub(@myobj, :mymeth)
43
+ stub1 = Assert.stub(object1, :mymeth)
44
+ assert_that(stub1).is_kind_of(MuchStub::Stub)
45
+ end
46
+
47
+ should "build a stub with an on_call block" do
48
+ my_meth_called_with = nil
49
+ stub1 =
50
+ Assert.stub_on_call(object1, :mymeth) { |call|
51
+ my_meth_called_with = call
52
+ }
53
+
54
+ object1.mymeth
43
55
  assert_kind_of MuchStub::Stub, stub1
56
+ assert_equal [], my_meth_called_with.args
44
57
  end
45
58
 
46
59
  should "lookup stubs that have been called before" do
47
- stub1 = Assert.stub(@myobj, :mymeth)
48
- stub2 = Assert.stub(@myobj, :mymeth)
49
- assert_same stub1, stub2
60
+ stub1 = Assert.stub(object1, :mymeth)
61
+ stub2 = Assert.stub(object1, :mymeth)
62
+ assert_that(stub2).is(stub1)
50
63
  end
51
64
 
52
65
  should "set the stub's do block if given a block" do
53
- Assert.stub(@myobj, :mymeth)
54
- assert_raises(MuchStub::NotStubbedError){ @myobj.mymeth }
55
- Assert.stub(@myobj, :mymeth){ @stub_value }
56
- assert_equal @stub_value, @myobj.mymeth
66
+ Assert.stub(object1, :mymeth)
67
+ assert_that { object1.mymeth }.raises(MuchStub::NotStubbedError)
68
+ Assert.stub(object1, :mymeth){ stub_value1 }
69
+ assert_that(object1.mymeth).equals(stub_value1)
57
70
  end
58
71
 
59
72
  should "teardown stubs" do
60
- assert_equal @orig_value, @myobj.mymeth
61
- Assert.unstub(@myobj, :mymeth)
62
- assert_equal @orig_value, @myobj.mymeth
63
-
64
- assert_equal @orig_value, @myobj.mymeth
65
- Assert.stub(@myobj, :mymeth){ @stub_value }
66
- assert_equal @stub_value, @myobj.mymeth
67
- Assert.unstub(@myobj, :mymeth)
68
- assert_equal @orig_value, @myobj.mymeth
73
+ assert_that(object1.mymeth).equals(orig_value1)
74
+ Assert.unstub(object1, :mymeth)
75
+ assert_that(object1.mymeth).equals(orig_value1)
76
+
77
+ assert_that(object1.mymeth).equals(orig_value1)
78
+ Assert.stub(object1, :mymeth){ stub_value1 }
79
+ assert_that(object1.mymeth).equals(stub_value1)
80
+ Assert.unstub(object1, :mymeth)
81
+ assert_that(object1.mymeth).equals(orig_value1)
69
82
  end
70
83
 
71
84
  should "know and teardown all stubs" do
72
- assert_equal @orig_value, @myobj.mymeth
85
+ assert_that(object1.mymeth).equals(orig_value1)
73
86
 
74
- Assert.stub(@myobj, :mymeth){ @stub_value }
75
- assert_equal @stub_value, @myobj.mymeth
76
- assert_equal 1, Assert.stubs.size
87
+ Assert.stub(object1, :mymeth){ stub_value1 }
88
+ assert_that(object1.mymeth).equals(stub_value1)
89
+ assert_that(Assert.stubs.size).equals(1)
77
90
 
78
91
  Assert.unstub!
79
- assert_equal @orig_value, @myobj.mymeth
80
- assert_empty Assert.stubs
92
+ assert_that(object1.mymeth).equals(orig_value1)
93
+ assert_that(Assert.stubs).is_empty
81
94
  end
82
95
 
83
96
  should "auto-unstub any stubs on teardown" do
@@ -88,21 +101,76 @@ module Assert
88
101
  end
89
102
 
90
103
  context_class.run_setups("scope")
91
- assert_equal 1, Assert.stubs.size
104
+ assert_that(Assert.stubs.size).equals(1)
92
105
 
93
106
  context_class.run_teardowns("scope")
94
- assert_empty Assert.stubs
107
+ assert_that(Assert.stubs).is_empty
95
108
  end
96
109
 
97
110
  should "be able to call a stub's original method" do
98
- err = assert_raises(MuchStub::NotStubbedError){ Assert.stub_send(@myobj, :mymeth) }
99
- assert_includes "not stubbed.", err.message
100
- assert_includes "test/unit/assert_tests.rb", err.backtrace.first
111
+ err =
112
+ assert_that {
113
+ Assert.stub_send(object1, :mymeth)
114
+ }.raises(MuchStub::NotStubbedError)
115
+ assert_that(err.message).includes("not stubbed.")
116
+ assert_that(err.backtrace.first).includes("test/unit/assert_tests.rb")
101
117
 
102
- Assert.stub(@myobj, :mymeth){ @stub_value }
118
+ Assert.stub(object1, :mymeth){ stub_value1 }
119
+
120
+ assert_that(object1.mymeth).equals(stub_value1)
121
+ assert_that(Assert.stub_send(object1, :mymeth)).equals(orig_value1)
122
+ end
103
123
 
104
- assert_equal @stub_value, @myobj.mymeth
105
- assert_equal @orig_value, Assert.stub_send(@myobj, :mymeth)
124
+ should "be able to add a stub tap" do
125
+ my_meth_called_with = nil
126
+ Assert.stub_tap(object1, :mymeth){ |value, *args, &block|
127
+ my_meth_called_with = args
128
+ }
129
+
130
+ assert_that(object1.mymeth).equals(orig_value1)
131
+ assert_that(my_meth_called_with).equals([])
132
+ end
133
+
134
+ should "be able to add a stub tap with an on_call block" do
135
+ my_meth_called_with = nil
136
+ Assert.stub_tap_on_call(object1, :mymeth){ |value, call|
137
+ my_meth_called_with = call
138
+ }
139
+
140
+ assert_that(object1.mymeth).equals(orig_value1)
141
+ assert_that(my_meth_called_with.args).equals([])
142
+ end
143
+
144
+ should "be able to add a stubbed spy" do
145
+ myclass = Class.new do
146
+ def one; self; end
147
+ def two(val); self; end
148
+ def three; self; end
149
+ def ready?; false; end
150
+ end
151
+ myobj = myclass.new
152
+
153
+ spy =
154
+ Assert.stub_spy(
155
+ myobj,
156
+ :one,
157
+ :two,
158
+ :three,
159
+ ready?: true)
160
+
161
+ assert_that(myobj.one).equals(spy)
162
+ assert_that(myobj.two("a")).equals(spy)
163
+ assert_that(myobj.three).equals(spy)
164
+
165
+ assert_that(myobj.one.two("b").three.ready?).is_true
166
+
167
+ assert_that(spy).is_kind_of(MuchStub::CallSpy)
168
+ assert_that(spy.one_call_count).equals(2)
169
+ assert_that(spy.two_call_count).equals(2)
170
+ assert_that(spy.three_call_count).equals(2)
171
+ assert_that(spy.ready_predicate_call_count).equals(1)
172
+ assert_that(spy.two_last_called_with.args).equals(["b"])
173
+ assert_that(spy.ready_predicate_called?).is_true
106
174
  end
107
175
  end
108
176
  end
@@ -6,25 +6,25 @@ module Assert::Assertions
6
6
  include Assert::Test::TestHelpers
7
7
 
8
8
  desc "`assert_block`"
9
- setup do
10
- desc = @desc = "assert block fail desc"
11
- @test = Factory.test do
12
- assert_block{ true } # pass
13
- assert_block(desc){ false } # fail
9
+ subject {
10
+ desc = desc1
11
+ Factory.test do
12
+ assert_block { true } # pass
13
+ assert_block(desc) { false } # fail
14
14
  end
15
- @test.run(&test_run_callback)
16
- end
17
- subject{ @test }
15
+ }
16
+
17
+ let(:desc1) { "assert block fail desc" }
18
18
 
19
19
  should "produce results as expected" do
20
- assert_equal 2, test_run_result_count
21
- assert_equal 1, test_run_result_count(:pass)
22
- assert_equal 1, test_run_result_count(:fail)
23
- end
20
+ subject.run(&test_run_callback)
24
21
 
25
- should "have a fail message with custom and generic explanations" do
26
- exp = "#{@desc}\nExpected block to return a true value."
27
- assert_equal exp, test_run_results(:fail).first.message
22
+ assert_that(test_run_result_count).equals(2)
23
+ assert_that(test_run_result_count(:pass)).equals(1)
24
+ assert_that(test_run_result_count(:fail)).equals(1)
25
+
26
+ exp = "#{desc1}\nExpected block to return a true value."
27
+ assert_that(test_run_results(:fail).first.message).equals(exp)
28
28
  end
29
29
  end
30
30
 
@@ -32,26 +32,25 @@ module Assert::Assertions
32
32
  include Assert::Test::TestHelpers
33
33
 
34
34
  desc "`assert_not_block`"
35
- setup do
36
- desc = @desc = "assert not block fail desc"
37
- @test = Factory.test do
38
- assert_not_block(desc){ true } # fail
39
- assert_not_block{ false } # pass
35
+ subject {
36
+ desc = desc1
37
+ Factory.test do
38
+ assert_not_block(desc) { true } # fail
39
+ assert_not_block { false } # pass
40
40
  end
41
- @test.run(&test_run_callback)
42
- end
43
- subject{ @test }
41
+ }
42
+
43
+ let(:desc1) { "assert not block fail desc" }
44
44
 
45
45
  should "produce results as expected" do
46
- assert_equal 2, test_run_result_count
47
- assert_equal 1, test_run_result_count(:pass)
48
- assert_equal 1, test_run_result_count(:fail)
49
- end
46
+ subject.run(&test_run_callback)
50
47
 
51
- should "have a fail message with custom and generic explanations" do
52
- exp = "#{@desc}\nExpected block to not return a true value."
53
- assert_equal exp, test_run_results(:fail).first.message
48
+ assert_that(test_run_result_count).equals(2)
49
+ assert_that(test_run_result_count(:pass)).equals(1)
50
+ assert_that(test_run_result_count(:fail)).equals(1)
51
+
52
+ exp = "#{desc1}\nExpected block to not return a true value."
53
+ assert_that(test_run_results(:fail).first.message).equals(exp)
54
54
  end
55
55
  end
56
56
  end
57
-
@@ -0,0 +1,97 @@
1
+ require "assert"
2
+ require "assert/assertions"
3
+
4
+ module Assert::Assertions
5
+ class AssertChangesTests < Assert::Context
6
+ include Assert::Test::TestHelpers
7
+
8
+ desc "`assert_changes`"
9
+ subject {
10
+ desc = desc1
11
+ Factory.test do
12
+ @my_var = 1
13
+ assert_changes("@my_var", from: 1, to: 2) { @my_var = 2 } # pass
14
+ @my_var = 1
15
+ assert_changes("@my_var", from: 1) { @my_var = 2 } # pass
16
+ @my_var = 1
17
+ assert_changes("@my_var", to: 2) { @my_var = 2 } # pass
18
+ @my_var = 1
19
+ assert_changes("@my_var", desc: desc) { @my_var = 2 } # pass
20
+
21
+ @my_var = 1
22
+ assert_changes("@my_var", from: 2, to: 1) { @my_var = 2 } # fail
23
+ @my_var = 1
24
+ assert_changes("@my_var", from: 2) { @my_var = 2 } # fail
25
+ @my_var = 1
26
+ assert_changes("@my_var", to: 1) { @my_var = 2 } # fail
27
+ @my_var = 1
28
+ assert_changes("@my_var", desc: desc) { @my_var = 1 } # fail
29
+ end
30
+ }
31
+
32
+ let(:desc1) { "assert changes fail desc" }
33
+
34
+ should "produce results as expected" do
35
+ subject.run(&test_run_callback)
36
+
37
+ assert_that(test_run_result_count).equals(10)
38
+ assert_that(test_run_result_count(:pass)).equals(5)
39
+ assert_that(test_run_result_count(:fail)).equals(5)
40
+
41
+ exp =
42
+ [
43
+ "Expected `@my_var` to change from `2`",
44
+ "Expected `@my_var` to change to `1`",
45
+ "Expected `@my_var` to change from `2`",
46
+ "Expected `@my_var` to change to `1`",
47
+ "#{desc1}\nExpected `@my_var` to change; "\
48
+ "it was `1` and didn't change",
49
+ ]
50
+ messages = test_run_results(:fail).map(&:message)
51
+ messages.each_with_index{ |msg, n| assert_that(msg).matches(/^#{exp[n]}/) }
52
+ end
53
+ end
54
+
55
+ class AssertNotChangesTests < Assert::Context
56
+ include Assert::Test::TestHelpers
57
+
58
+ desc "`assert_changes`"
59
+ subject {
60
+ desc = desc1
61
+ Factory.test do
62
+ @my_var = 1
63
+ assert_not_changes("@my_var", from: 1) { @my_var = 1 } # pass
64
+ @my_var = 1
65
+ assert_not_changes("@my_var", desc: desc) { @my_var = 1 } # pass
66
+
67
+ @my_var = 1
68
+ assert_not_changes("@my_var", from: 2) { @my_var = 1 } # fail
69
+ @my_var = 1
70
+ assert_not_changes("@my_var", from: 1) { @my_var = 2 } # fail
71
+ @my_var = 1
72
+ assert_not_changes("@my_var", desc: desc) { @my_var = 2 } # fail
73
+ end
74
+ }
75
+
76
+ let(:desc1) { "assert not changes fail desc" }
77
+
78
+ should "produce results as expected" do
79
+ subject.run(&test_run_callback)
80
+
81
+ assert_that(test_run_result_count).equals(8)
82
+ assert_that(test_run_result_count(:pass)).equals(5)
83
+ assert_that(test_run_result_count(:fail)).equals(3)
84
+
85
+ exp =
86
+ [
87
+ "Expected `@my_var` to not change from `2`",
88
+ "Expected `@my_var` to not change; "\
89
+ "it was `1` and changed to `2`",
90
+ "#{desc1}\nExpected `@my_var` to not change; "\
91
+ "it was `1` and changed to `2`",
92
+ ]
93
+ messages = test_run_results(:fail).map(&:message)
94
+ messages.each_with_index{ |msg, n| assert_that(msg).matches(/^#{exp[n]}/) }
95
+ end
96
+ end
97
+ end
@@ -8,56 +8,57 @@ module Assert::Assertions
8
8
  include Assert::Test::TestHelpers
9
9
 
10
10
  desc "`assert_empty`"
11
- setup do
12
- desc = @desc = "assert empty fail desc"
13
- args = @args = [[1], desc]
14
- @test = Factory.test do
11
+ subject {
12
+ args = args1
13
+ Factory.test do
15
14
  assert_empty([]) # pass
16
15
  assert_empty(*args) # fail
17
16
  end
18
- @c = @test.config
19
- @test.run(&test_run_callback)
20
- end
21
- subject{ @test }
17
+ }
18
+
19
+ let(:desc1) { "assert empty fail desc" }
20
+ let(:args1) { [[1], desc1] }
21
+ let(:config1) { subject.config }
22
22
 
23
23
  should "produce results as expected" do
24
- assert_equal 2, test_run_result_count
25
- assert_equal 1, test_run_result_count(:pass)
26
- assert_equal 1, test_run_result_count(:fail)
27
- end
24
+ subject.run(&test_run_callback)
28
25
 
29
- should "have a fail message with custom and generic explanations" do
30
- exp = "#{@args[1]}\nExpected #{Assert::U.show(@args[0], @c)} to be empty."
31
- assert_equal exp, test_run_results(:fail).first.message
32
- end
26
+ assert_that(test_run_result_count).equals(2)
27
+ assert_that(test_run_result_count(:pass)).equals(1)
28
+ assert_that(test_run_result_count(:fail)).equals(1)
33
29
 
30
+ exp =
31
+ "#{args1[1]}\nExpected #{Assert::U.show(args1[0], config1)} to be empty."
32
+ assert_that(test_run_results(:fail).first.message).equals(exp)
33
+ end
34
34
  end
35
35
 
36
36
  class AssertNotEmptyTests < Assert::Context
37
37
  include Assert::Test::TestHelpers
38
38
 
39
39
  desc "`assert_not_empty`"
40
- setup do
41
- desc = @desc = "assert not empty fail desc"
42
- args = @args = [[], desc]
43
- @test = Factory.test do
44
- assert_not_empty([1]) # pass
40
+ subject {
41
+ args = args1
42
+ Factory.test do
43
+ assert_not_empty([1]) # pass
45
44
  assert_not_empty(*args) # fail
46
45
  end
47
- @c = @test.config
48
- @test.run(&test_run_callback)
49
- end
50
- subject{ @test }
46
+ }
47
+
48
+ let(:desc1) { "assert not empty fail desc" }
49
+ let(:args1) { [[], desc1] }
50
+ let(:config1) { subject.config }
51
51
 
52
52
  should "produce results as expected" do
53
- assert_equal 2, test_run_result_count
54
- assert_equal 1, test_run_result_count(:pass)
55
- assert_equal 1, test_run_result_count(:fail)
56
- end
53
+ subject.run(&test_run_callback)
54
+
55
+ assert_that(test_run_result_count).equals(2)
56
+ assert_that(test_run_result_count(:pass)).equals(1)
57
+ assert_that(test_run_result_count(:fail)).equals(1)
57
58
 
58
- should "have a fail message with custom and generic explanations" do
59
- exp = "#{@args[1]}\nExpected #{Assert::U.show(@args[0], @c)} to not be empty."
60
- assert_equal exp, test_run_results(:fail).first.message
59
+ exp =
60
+ "#{args1[1]}\nExpected #{Assert::U.show(args1[0], config1)} to not be empty."
61
+ assert_that(test_run_results(:fail).first.message).equals(exp)
61
62
  end
62
63
  end
63
64
  end