assert 2.18.0 → 2.19.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.
- checksums.yaml +4 -4
- data/README.md +66 -37
- data/assert.gemspec +4 -3
- data/lib/assert/actual_value.rb +140 -0
- data/lib/assert/assertions.rb +80 -20
- data/lib/assert/context.rb +31 -37
- data/lib/assert/context/let_dsl.rb +13 -0
- data/lib/assert/context/method_missing.rb +19 -0
- data/lib/assert/context/subject_dsl.rb +23 -24
- data/lib/assert/macros/methods.rb +4 -4
- data/lib/assert/result.rb +5 -1
- data/lib/assert/stub.rb +16 -0
- data/lib/assert/suite.rb +7 -10
- data/lib/assert/test.rb +0 -8
- data/lib/assert/version.rb +1 -1
- data/test/helper.rb +23 -25
- data/test/support/factory.rb +15 -0
- data/test/system/stub_tests.rb +332 -333
- data/test/system/test_tests.rb +99 -109
- data/test/unit/actual_value_tests.rb +371 -0
- data/test/unit/assert_tests.rb +111 -43
- data/test/unit/assertions/assert_block_tests.rb +30 -31
- data/test/unit/assertions/assert_changes_tests.rb +97 -0
- data/test/unit/assertions/assert_empty_tests.rb +33 -32
- data/test/unit/assertions/assert_equal_tests.rb +94 -74
- data/test/unit/assertions/assert_file_exists_tests.rb +32 -33
- data/test/unit/assertions/assert_includes_tests.rb +38 -37
- data/test/unit/assertions/assert_instance_of_tests.rb +34 -33
- data/test/unit/assertions/assert_kind_of_tests.rb +34 -33
- data/test/unit/assertions/assert_match_tests.rb +34 -33
- data/test/unit/assertions/assert_nil_tests.rb +30 -31
- data/test/unit/assertions/assert_raises_tests.rb +55 -55
- data/test/unit/assertions/assert_respond_to_tests.rb +36 -35
- data/test/unit/assertions/assert_same_tests.rb +86 -81
- data/test/unit/assertions/assert_true_false_tests.rb +60 -60
- data/test/unit/assertions_tests.rb +26 -24
- data/test/unit/config_helpers_tests.rb +43 -38
- data/test/unit/config_tests.rb +38 -34
- data/test/unit/context/let_dsl_tests.rb +10 -0
- data/test/unit/context/setup_dsl_tests.rb +70 -81
- data/test/unit/context/subject_dsl_tests.rb +15 -43
- data/test/unit/context/suite_dsl_tests.rb +15 -16
- data/test/unit/context/test_dsl_tests.rb +50 -52
- data/test/unit/context_info_tests.rb +23 -15
- data/test/unit/context_tests.rb +184 -179
- data/test/unit/default_runner_tests.rb +2 -5
- data/test/unit/default_suite_tests.rb +57 -53
- data/test/unit/factory_tests.rb +5 -3
- data/test/unit/file_line_tests.rb +33 -35
- data/test/unit/macro_tests.rb +14 -10
- data/test/unit/result_tests.rb +159 -183
- data/test/unit/runner_tests.rb +64 -64
- data/test/unit/suite_tests.rb +56 -59
- data/test/unit/test_tests.rb +118 -139
- data/test/unit/utils_tests.rb +43 -45
- data/test/unit/view_helpers_tests.rb +54 -52
- data/test/unit/view_tests.rb +22 -23
- metadata +29 -7
data/test/unit/runner_tests.rb
CHANGED
@@ -10,23 +10,25 @@ require "assert/view"
|
|
10
10
|
class Assert::Runner
|
11
11
|
class UnitTests < Assert::Context
|
12
12
|
desc "Assert::Runner"
|
13
|
-
subject{
|
13
|
+
subject { unit_class }
|
14
|
+
|
15
|
+
let(:unit_class) { Assert::Runner }
|
14
16
|
|
15
17
|
should "include the config helpers" do
|
16
|
-
|
18
|
+
assert_that(subject).includes(Assert::ConfigHelpers)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
22
|
class InitTests < UnitTests
|
21
23
|
desc "when init"
|
22
|
-
|
23
|
-
@config = Factory.modes_off_config
|
24
|
-
@config.suite Assert::DefaultSuite.new(@config)
|
25
|
-
@config.view Assert::View.new(@config, StringIO.new("", "w+"))
|
24
|
+
subject { unit_class.new(config1) }
|
26
25
|
|
27
|
-
|
26
|
+
setup do
|
27
|
+
config1.suite Assert::DefaultSuite.new(config1)
|
28
|
+
config1.view Assert::View.new(config1, StringIO.new("", "w+"))
|
28
29
|
end
|
29
|
-
|
30
|
+
|
31
|
+
let(:config1) { Factory.modes_off_config }
|
30
32
|
|
31
33
|
should have_readers :config
|
32
34
|
should have_imeths :runner, :run
|
@@ -35,116 +37,114 @@ class Assert::Runner
|
|
35
37
|
should have_imeths :before_test, :after_test, :on_result
|
36
38
|
|
37
39
|
should "know its config" do
|
38
|
-
|
40
|
+
assert_that(subject.config).equals(config1)
|
39
41
|
end
|
40
42
|
|
41
43
|
should "override the config helper's runner value with itself" do
|
42
|
-
|
44
|
+
assert_that(subject.runner).equals(subject)
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
46
48
|
class RunTests < InitTests
|
47
49
|
desc "and run"
|
48
|
-
|
49
|
-
@runner_class = Class.new(Assert::Runner) do
|
50
|
-
include CallbackMixin
|
51
|
-
end
|
52
|
-
suite_class = Class.new(Assert::DefaultSuite){ include CallbackMixin }
|
53
|
-
view_class = Class.new(Assert::View){ include CallbackMixin }
|
50
|
+
subject { runner_class1.new(config1) }
|
54
51
|
|
52
|
+
setup do
|
55
53
|
@view_output = ""
|
56
54
|
|
57
|
-
|
58
|
-
|
55
|
+
suite_class = Class.new(Assert::DefaultSuite){ include CallbackMixin }
|
56
|
+
view_class = Class.new(Assert::View){ include CallbackMixin }
|
59
57
|
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
config1.suite suite_class.new(config1)
|
59
|
+
config1.view view_class.new(config1, StringIO.new(@view_output, "w+"))
|
60
|
+
config1.suite.on_test(test1)
|
63
61
|
|
64
|
-
@
|
65
|
-
@result = @runner.run
|
62
|
+
@result_count = subject.run
|
66
63
|
end
|
67
64
|
|
65
|
+
let(:runner_class1) { Class.new(unit_class) { include CallbackMixin } }
|
66
|
+
let(:ci1) { Factory.context_info(Factory.modes_off_context_class) }
|
67
|
+
let(:test1) { Factory.test("should pass", ci1){ assert(1==1) } }
|
68
|
+
|
68
69
|
should "return the fail+error result count as an integer exit code" do
|
69
|
-
|
70
|
+
assert_that(@result_count).equals(0)
|
70
71
|
|
71
72
|
fail_count = Factory.integer
|
72
73
|
error_count = Factory.integer
|
73
74
|
Assert.stub(subject, :fail_result_count){ fail_count }
|
74
75
|
Assert.stub(subject, :error_result_count){ error_count }
|
75
|
-
Assert.stub(
|
76
|
-
|
76
|
+
Assert.stub(test1, :run){ } # no-op
|
77
|
+
result_count = subject.run
|
77
78
|
|
78
|
-
|
79
|
-
assert_equal exp, result
|
79
|
+
assert_that(result_count).equals(fail_count + error_count)
|
80
80
|
end
|
81
81
|
|
82
82
|
should "run all callbacks on itself, the suite and the view" do
|
83
83
|
# itself
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
84
|
+
assert_that(subject.on_start_called).is_true
|
85
|
+
assert_that(subject.before_test_called).equals([test1])
|
86
|
+
assert_that(subject.on_result_called.last).is_instance_of(Assert::Result::Pass)
|
87
|
+
assert_that(subject.after_test_called).equals([test1])
|
88
|
+
assert_that(subject.on_finish_called).is_true
|
89
89
|
|
90
90
|
# suite
|
91
|
-
suite =
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
91
|
+
suite = config1.suite
|
92
|
+
assert_that(suite.on_start_called).is_true
|
93
|
+
assert_that(suite.before_test_called).equals([test1])
|
94
|
+
assert_that(suite.on_result_called.last).is_instance_of(Assert::Result::Pass)
|
95
|
+
assert_that(suite.after_test_called).equals([test1])
|
96
|
+
assert_that(suite.on_finish_called).is_true
|
97
97
|
|
98
98
|
# view
|
99
|
-
view =
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
99
|
+
view = config1.view
|
100
|
+
assert_that(view.on_start_called).is_true
|
101
|
+
assert_that(view.before_test_called).equals([test1])
|
102
|
+
assert_that(view.on_result_called.last).is_instance_of(Assert::Result::Pass)
|
103
|
+
assert_that(view.after_test_called).equals([test1])
|
104
|
+
assert_that(view.on_finish_called).is_true
|
105
105
|
end
|
106
106
|
|
107
107
|
should "describe running the tests in random order if there are tests" do
|
108
108
|
exp = "Running tests in random order, " \
|
109
109
|
"seeded with \"#{subject.runner_seed}\"\n"
|
110
|
-
|
110
|
+
assert_that(@view_output).includes(exp)
|
111
111
|
|
112
112
|
@view_output.gsub!(/./, "")
|
113
|
-
|
113
|
+
config1.suite.clear_tests_to_run
|
114
114
|
subject.run
|
115
|
-
|
115
|
+
assert_that(@view_output).does_not_include(exp)
|
116
116
|
end
|
117
117
|
|
118
118
|
should "run only a single test if a single test is configured" do
|
119
|
-
test = Factory.test("should pass",
|
120
|
-
|
121
|
-
|
122
|
-
|
119
|
+
test = Factory.test("should pass", ci1){ assert(1==1) }
|
120
|
+
config1.suite.clear_tests_to_run
|
121
|
+
config1.suite.on_test(test)
|
122
|
+
config1.single_test test.file_line.to_s
|
123
123
|
|
124
|
-
runner =
|
125
|
-
|
124
|
+
runner = runner_class1.new(config1).tap(&:run)
|
125
|
+
assert_that(runner.before_test_called).equals([test])
|
126
126
|
end
|
127
127
|
|
128
128
|
should "not run any tests if a single test is configured but can't be found" do
|
129
|
-
test = Factory.test("should pass",
|
130
|
-
|
131
|
-
|
132
|
-
|
129
|
+
test = Factory.test("should pass", ci1){ assert(1==1) }
|
130
|
+
config1.suite.clear_tests_to_run
|
131
|
+
config1.suite.on_test(test)
|
132
|
+
config1.single_test Factory.string
|
133
133
|
|
134
|
-
runner =
|
135
|
-
|
134
|
+
runner = runner_class1.new(config1).tap(&:run)
|
135
|
+
assert_that(runner.before_test_called).is_nil
|
136
136
|
end
|
137
137
|
|
138
138
|
should "describe running only a single test if a single test is configured" do
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
config1.suite.clear_tests_to_run
|
140
|
+
config1.suite.on_test(test1)
|
141
|
+
config1.single_test test1.file_line.to_s
|
142
142
|
@view_output.gsub!(/./, "")
|
143
143
|
subject.run
|
144
144
|
|
145
145
|
exp = "Running test: #{subject.single_test_file_line}, " \
|
146
146
|
"seeded with \"#{subject.runner_seed}\"\n"
|
147
|
-
|
147
|
+
assert_that(@view_output).includes(exp)
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
data/test/unit/suite_tests.rb
CHANGED
@@ -6,30 +6,24 @@ require "assert/test"
|
|
6
6
|
require "test/support/inherited_stuff"
|
7
7
|
|
8
8
|
class Assert::Suite
|
9
|
-
|
10
9
|
class UnitTests < Assert::Context
|
11
10
|
desc "Assert::Suite"
|
12
|
-
subject{
|
11
|
+
subject { unit_class }
|
13
12
|
|
14
|
-
|
15
|
-
assert_includes Assert::ConfigHelpers, subject
|
16
|
-
end
|
13
|
+
let(:unit_class) { Assert::Suite }
|
17
14
|
|
18
|
-
should "
|
19
|
-
|
20
|
-
assert_not_match "#{Factory.string}test", subject::TEST_METHOD_REGEX
|
15
|
+
should "include the config helpers" do
|
16
|
+
assert_that(subject).includes(Assert::ConfigHelpers)
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
24
20
|
class InitTests < UnitTests
|
25
21
|
desc "when init"
|
26
|
-
|
27
|
-
@config = Factory.modes_off_config
|
28
|
-
@suite = Assert::Suite.new(@config)
|
29
|
-
end
|
30
|
-
subject{ @suite }
|
22
|
+
subject { unit_class.new(config1) }
|
31
23
|
|
32
|
-
|
24
|
+
let(:config1) { Factory.modes_off_config }
|
25
|
+
|
26
|
+
should have_readers :config, :setups, :teardowns
|
33
27
|
should have_accessors :start_time, :end_time
|
34
28
|
should have_imeths :suite, :setup, :startup, :teardown, :shutdown
|
35
29
|
should have_imeths :tests_to_run?, :tests_to_run_count, :clear_tests_to_run
|
@@ -43,34 +37,33 @@ class Assert::Suite
|
|
43
37
|
should have_imeths :before_test, :after_test, :on_result
|
44
38
|
|
45
39
|
should "know its config" do
|
46
|
-
|
40
|
+
assert_that(subject.config).equals(config1)
|
47
41
|
end
|
48
42
|
|
49
43
|
should "default its attrs" do
|
50
|
-
|
51
|
-
|
52
|
-
assert_equal [], subject.teardowns
|
44
|
+
assert_that(subject.setups).equals([])
|
45
|
+
assert_that(subject.teardowns).equals([])
|
53
46
|
|
54
|
-
|
47
|
+
assert_that(subject.end_time).equals(subject.start_time)
|
55
48
|
end
|
56
49
|
|
57
50
|
should "override the config helper's suite value with itself" do
|
58
|
-
|
51
|
+
assert_that(subject.suite).equals(subject)
|
59
52
|
end
|
60
53
|
|
61
54
|
should "not provide any test/result count implementations" do
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
55
|
+
assert_that(subject.test_count).is_nil
|
56
|
+
assert_that(subject.pass_result_count).is_nil
|
57
|
+
assert_that(subject.fail_result_count).is_nil
|
58
|
+
assert_that(subject.error_result_count).is_nil
|
59
|
+
assert_that(subject.skip_result_count).is_nil
|
60
|
+
assert_that(subject.ignore_result_count).is_nil
|
68
61
|
end
|
69
62
|
|
70
63
|
should "know its run time and rates" do
|
71
|
-
|
72
|
-
|
73
|
-
|
64
|
+
assert_that(subject.run_time).equals(0)
|
65
|
+
assert_that(subject.test_rate).equals(0)
|
66
|
+
assert_that(subject.result_rate).equals(0)
|
74
67
|
|
75
68
|
time = Factory.integer(3).to_f
|
76
69
|
subject.end_time = subject.start_time + time
|
@@ -78,67 +71,71 @@ class Assert::Suite
|
|
78
71
|
Assert.stub(subject, :test_count){ count }
|
79
72
|
Assert.stub(subject, :result_count){ count }
|
80
73
|
|
81
|
-
|
82
|
-
|
83
|
-
|
74
|
+
assert_that(subject.run_time).equals(time)
|
75
|
+
assert_that(subject.test_rate).equals((subject.test_count / subject.run_time))
|
76
|
+
assert_that(subject.result_rate).equals((subject.result_count / subject.run_time))
|
84
77
|
end
|
85
78
|
|
86
79
|
should "add setup procs" do
|
87
80
|
status = nil
|
88
|
-
|
89
|
-
|
81
|
+
subject.setup{ status = "setups" }
|
82
|
+
subject.startup{ status += " have been run" }
|
90
83
|
|
91
|
-
|
84
|
+
assert_that(subject.setups.count).equals(2)
|
92
85
|
subject.setups.each(&:call)
|
93
|
-
|
86
|
+
assert_that(status).equals("setups have been run")
|
94
87
|
end
|
95
88
|
|
96
89
|
should "add teardown procs" do
|
97
90
|
status = nil
|
98
|
-
|
99
|
-
|
91
|
+
subject.teardown{ status = "teardowns" }
|
92
|
+
subject.shutdown{ status += " have been run" }
|
100
93
|
|
101
|
-
|
94
|
+
assert_that(subject.teardowns.count).equals(2)
|
102
95
|
subject.teardowns.each(&:call)
|
103
|
-
|
96
|
+
assert_that(status).equals("teardowns have been run")
|
104
97
|
end
|
105
98
|
end
|
106
99
|
|
107
100
|
class WithTestsLoadedTests < InitTests
|
108
101
|
desc "with tests loaded"
|
102
|
+
|
109
103
|
setup do
|
110
|
-
|
111
|
-
@tests = [
|
112
|
-
Factory.test("should nothing", ci.call){ },
|
113
|
-
Factory.test("should pass", ci.call){ assert(1==1); refute(1==0) },
|
114
|
-
Factory.test("should fail", ci.call){ ignore; assert(1==0); refute(1==1) },
|
115
|
-
Factory.test("should ignore", ci.call){ ignore },
|
116
|
-
Factory.test("should skip", ci.call){ skip; ignore; assert(1==1) },
|
117
|
-
Factory.test("should error", ci.call){ raise Exception; ignore; assert(1==1) }
|
118
|
-
]
|
119
|
-
@tests.each{ |test| @suite.on_test(test) }
|
104
|
+
tests1.each{ |test| subject.on_test(test) }
|
120
105
|
end
|
121
106
|
|
107
|
+
let(:ci1) { proc{ Factory.context_info(Factory.modes_off_context_class) } }
|
108
|
+
let(:tests1) {
|
109
|
+
[
|
110
|
+
Factory.test("should nothing", ci1.call){ },
|
111
|
+
Factory.test("should pass", ci1.call){ assert(1==1); refute(1==0) },
|
112
|
+
Factory.test("should fail", ci1.call){ ignore; assert(1==0); refute(1==1) },
|
113
|
+
Factory.test("should ignore", ci1.call){ ignore },
|
114
|
+
Factory.test("should skip", ci1.call){ skip; ignore; assert(1==1) },
|
115
|
+
Factory.test("should error", ci1.call){ raise Exception; ignore; assert(1==1) }
|
116
|
+
]
|
117
|
+
}
|
118
|
+
|
122
119
|
should "know its tests-to-run attrs" do
|
123
|
-
|
124
|
-
|
120
|
+
assert_that(subject.tests_to_run_count).equals(tests1.size)
|
121
|
+
assert_that(subject.tests_to_run?).is_true
|
125
122
|
|
126
123
|
subject.clear_tests_to_run
|
127
124
|
|
128
|
-
|
129
|
-
|
125
|
+
assert_that(subject.tests_to_run_count).equals(0)
|
126
|
+
assert_that(subject.tests_to_run?).is_false
|
130
127
|
end
|
131
128
|
|
132
129
|
should "find a test to run given a file line" do
|
133
|
-
test =
|
134
|
-
|
130
|
+
test = tests1.sample
|
131
|
+
assert_that(subject.find_test_to_run(test.file_line)).is(test)
|
135
132
|
end
|
136
133
|
|
137
134
|
should "know its sorted tests to run" do
|
138
135
|
sorted_tests = subject.sorted_tests_to_run{ 1 }
|
139
|
-
|
140
|
-
|
141
|
-
|
136
|
+
assert_that(sorted_tests.size).equals(tests1.size)
|
137
|
+
assert_that(sorted_tests.first).is_kind_of(Assert::Test)
|
138
|
+
assert_that(subject.sorted_tests_to_run{ 1 }.first).is(sorted_tests.first)
|
142
139
|
end
|
143
140
|
end
|
144
141
|
end
|
data/test/unit/test_tests.rb
CHANGED
@@ -8,121 +8,100 @@ require "assert/result"
|
|
8
8
|
class Assert::Test
|
9
9
|
class UnitTests < Assert::Context
|
10
10
|
desc "Assert::Test"
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
subject { unit_class }
|
12
|
+
|
13
|
+
let(:unit_class) { Assert::Test }
|
14
|
+
|
15
|
+
let(:context_class1) { Factory.modes_off_context_class { desc "context class" } }
|
16
|
+
let(:context_info1) { Factory.context_info(context_class1) }
|
17
|
+
let(:config1) { Factory.modes_off_config }
|
18
|
+
let(:test_code1) { proc { assert(true) } }
|
18
19
|
|
19
|
-
should have_imeths :name_file_line_context_data, :for_block
|
20
|
+
should have_imeths :name_file_line_context_data, :for_block
|
20
21
|
|
21
22
|
should "know how to build the name and file line given context" do
|
22
23
|
test_name = Factory.string
|
23
|
-
data = subject.name_file_line_context_data(
|
24
|
+
data = subject.name_file_line_context_data(context_info1, test_name)
|
24
25
|
|
25
|
-
exp =
|
26
|
-
|
26
|
+
exp = context_info1.test_name(test_name)
|
27
|
+
assert_that(data[:name]).equals(exp)
|
27
28
|
|
28
|
-
exp =
|
29
|
-
|
29
|
+
exp = context_info1.called_from
|
30
|
+
assert_that(data[:file_line]).equals(exp)
|
30
31
|
end
|
31
32
|
|
32
33
|
should "build tests for a block" do
|
33
34
|
name = Factory.string
|
34
|
-
test = subject.for_block(name,
|
35
|
+
test = subject.for_block(name, context_info1, config1, &test_code1)
|
35
36
|
|
36
|
-
exp = Assert::FileLine.parse(
|
37
|
-
|
37
|
+
exp = Assert::FileLine.parse(context_info1.called_from)
|
38
|
+
assert_that(test.file_line).equals(exp)
|
38
39
|
|
39
|
-
exp =
|
40
|
-
|
40
|
+
exp = context_info1.test_name(name)
|
41
|
+
assert_that(test.name).equals(exp)
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
should "build tests for a method" do
|
48
|
-
meth = "a_test_method"
|
49
|
-
test = subject.for_method(meth, @context_info, @config)
|
50
|
-
|
51
|
-
exp = Assert::FileLine.parse(@context_info.called_from)
|
52
|
-
assert_equal exp, test.file_line
|
53
|
-
|
54
|
-
exp = @context_info.test_name(meth)
|
55
|
-
assert_equal exp, test.name
|
56
|
-
|
57
|
-
assert_equal @context_info, test.context_info
|
58
|
-
assert_equal @config, test.config
|
59
|
-
|
60
|
-
assert_kind_of Proc, test.code
|
61
|
-
self.instance_eval(&test.code)
|
62
|
-
assert_true @a_test_method_called
|
63
|
-
end
|
64
|
-
|
65
|
-
def a_test_method
|
66
|
-
@a_test_method_called = true
|
43
|
+
assert_that(test.context_info).equals(context_info1)
|
44
|
+
assert_that(test.config).equals(config1)
|
45
|
+
assert_that(test.code).equals(test_code1)
|
67
46
|
end
|
68
47
|
end
|
69
48
|
|
70
49
|
class InitWithDataTests < UnitTests
|
71
50
|
desc "when init with data"
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
51
|
+
subject { unit_class.new(meta_data1.merge(run_data1)) }
|
52
|
+
|
53
|
+
let(:file_line1) { Assert::FileLine.new(Factory.string, Factory.integer.to_s) }
|
54
|
+
let(:meta_data1) {
|
55
|
+
{
|
56
|
+
:file_line => file_line1.to_s,
|
76
57
|
:name => Factory.string,
|
77
58
|
:output => Factory.string,
|
78
59
|
:run_time => Factory.float(1.0),
|
79
60
|
}
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
:
|
84
|
-
:
|
61
|
+
}
|
62
|
+
let(:run_data1) {
|
63
|
+
{
|
64
|
+
:context_info => context_info1,
|
65
|
+
:config => config1,
|
66
|
+
:code => test_code1
|
85
67
|
}
|
86
|
-
|
87
|
-
@test = Assert::Test.new(@meta_data.merge(@run_data))
|
88
|
-
end
|
89
|
-
subject{ @test }
|
68
|
+
}
|
90
69
|
|
91
70
|
should have_imeths :file_line, :file_name, :line_num
|
92
71
|
should have_imeths :name, :output, :run_time
|
93
72
|
should have_imeths :context_info, :context_class, :config, :code, :run
|
94
73
|
|
95
74
|
should "use any given attrs" do
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
75
|
+
assert_that(subject.file_line).equals(file_line1)
|
76
|
+
assert_that(subject.name).equals(meta_data1[:name])
|
77
|
+
assert_that(subject.output).equals(meta_data1[:output])
|
78
|
+
assert_that(subject.run_time).equals(meta_data1[:run_time])
|
100
79
|
|
101
|
-
|
102
|
-
|
103
|
-
|
80
|
+
assert_that(subject.context_info).equals(context_info1)
|
81
|
+
assert_that(subject.config).equals(config1)
|
82
|
+
assert_that(subject.code).equals(test_code1)
|
104
83
|
end
|
105
84
|
|
106
85
|
should "default its attrs" do
|
107
|
-
test =
|
86
|
+
test = unit_class.new
|
108
87
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
88
|
+
assert_that(test.file_line).equals(Assert::FileLine.parse(""))
|
89
|
+
assert_that(test.name).equals("")
|
90
|
+
assert_that(test.output).equals("")
|
91
|
+
assert_that(test.run_time).equals(0)
|
113
92
|
|
114
|
-
|
115
|
-
|
116
|
-
|
93
|
+
assert_that(test.context_info).is_nil
|
94
|
+
assert_that(test.config).is_nil
|
95
|
+
assert_that(test.code).is_nil
|
117
96
|
end
|
118
97
|
|
119
98
|
should "know its context class" do
|
120
|
-
|
99
|
+
assert_that(subject.context_class).equals(context_class1)
|
121
100
|
end
|
122
101
|
|
123
102
|
should "know its file line attrs" do
|
124
|
-
|
125
|
-
|
103
|
+
assert_that(subject.file_name).equals(subject.file_line.file)
|
104
|
+
assert_that(subject.line_num).equals(subject.file_line.line.to_i)
|
126
105
|
end
|
127
106
|
|
128
107
|
should "have a custom inspect that only shows limited attributes" do
|
@@ -130,58 +109,60 @@ class Assert::Test
|
|
130
109
|
"@#{method}=#{subject.send(method).inspect}"
|
131
110
|
end.join(" ")
|
132
111
|
exp = "#<#{subject.class}:#{"0x0%x" % (subject.object_id << 1)} #{attrs}>"
|
133
|
-
|
112
|
+
assert_that(subject.inspect).equals(exp)
|
134
113
|
end
|
135
114
|
end
|
136
115
|
|
137
116
|
class PassFailIgnoreHandlingTests < UnitTests
|
138
117
|
include Assert::Test::TestHelpers
|
139
118
|
|
140
|
-
|
141
|
-
|
119
|
+
subject {
|
120
|
+
Factory.test("pass fail ignore test", context_info1) do
|
142
121
|
ignore("something")
|
143
122
|
assert(true)
|
144
123
|
assert(false)
|
145
124
|
end
|
146
|
-
|
125
|
+
}
|
126
|
+
|
127
|
+
setup do
|
128
|
+
subject.context_class.setup do
|
147
129
|
ignore("something")
|
148
130
|
assert(true)
|
149
131
|
assert(false)
|
150
132
|
end
|
151
|
-
|
133
|
+
subject.context_class.teardown do
|
152
134
|
ignore("something")
|
153
135
|
assert(true)
|
154
136
|
assert(false)
|
155
137
|
end
|
156
|
-
|
138
|
+
subject.run(&test_run_callback)
|
157
139
|
end
|
158
|
-
subject{ @test }
|
159
140
|
|
160
141
|
should "capture results in the test and any setups/teardowns" do
|
161
|
-
|
142
|
+
assert_that(test_run_results.size).equals(9)
|
162
143
|
test_run_results.each do |result|
|
163
|
-
|
144
|
+
assert_that(result).is_kind_of(Assert::Result::Base)
|
164
145
|
end
|
165
146
|
end
|
166
147
|
|
167
148
|
should "capture pass results in the test and any setups/teardowns" do
|
168
|
-
|
149
|
+
assert_that(test_run_results(:pass).size).equals(3)
|
169
150
|
test_run_results(:pass).each do |result|
|
170
|
-
|
151
|
+
assert_that(result).is_kind_of(Assert::Result::Pass)
|
171
152
|
end
|
172
153
|
end
|
173
154
|
|
174
155
|
should "capture fail results in the test and any setups/teardowns" do
|
175
|
-
|
156
|
+
assert_that(test_run_results(:fail).size).equals(3)
|
176
157
|
test_run_results(:fail).each do |result|
|
177
|
-
|
158
|
+
assert_that(result).is_kind_of(Assert::Result::Fail)
|
178
159
|
end
|
179
160
|
end
|
180
161
|
|
181
162
|
should "capture ignore results in the test and any setups/teardowns" do
|
182
|
-
|
163
|
+
assert_that(test_run_results(:ignore).size).equals(3)
|
183
164
|
test_run_results(:ignore).each do |result|
|
184
|
-
|
165
|
+
assert_that(result).is_kind_of(Assert::Result::Ignore)
|
185
166
|
end
|
186
167
|
end
|
187
168
|
end
|
@@ -192,7 +173,7 @@ class Assert::Test
|
|
192
173
|
desc "when in halt-on-fail mode"
|
193
174
|
|
194
175
|
should "capture fail results" do
|
195
|
-
test = Factory.test("halt-on-fail test",
|
176
|
+
test = Factory.test("halt-on-fail test", context_info1) do
|
196
177
|
raise Assert::Result::TestFailure
|
197
178
|
end
|
198
179
|
test.run(&test_run_callback)
|
@@ -201,7 +182,7 @@ class Assert::Test
|
|
201
182
|
end
|
202
183
|
|
203
184
|
should "capture fails in the context setup" do
|
204
|
-
test = Factory.test("setup halt-on-fail test",
|
185
|
+
test = Factory.test("setup halt-on-fail test", context_info1){ }
|
205
186
|
test.context_class.setup{ raise Assert::Result::TestFailure }
|
206
187
|
test.run(&test_run_callback)
|
207
188
|
|
@@ -209,7 +190,7 @@ class Assert::Test
|
|
209
190
|
end
|
210
191
|
|
211
192
|
should "capture fails in the context teardown" do
|
212
|
-
test = Factory.test("teardown halt-on-fail test",
|
193
|
+
test = Factory.test("teardown halt-on-fail test", context_info1){ }
|
213
194
|
test.context_class.teardown{ raise Assert::Result::TestFailure }
|
214
195
|
test.run(&test_run_callback)
|
215
196
|
|
@@ -220,9 +201,9 @@ class Assert::Test
|
|
220
201
|
|
221
202
|
def assert_failed(test)
|
222
203
|
with_backtrace(caller) do
|
223
|
-
|
204
|
+
assert_that(test_run_result_count).equals(1, "too many/few fail results")
|
224
205
|
test_run_results.each do |result|
|
225
|
-
|
206
|
+
assert_that(result).is_kind_of(Assert::Result::Fail, "not a fail result")
|
226
207
|
end
|
227
208
|
end
|
228
209
|
end
|
@@ -232,14 +213,14 @@ class Assert::Test
|
|
232
213
|
include Assert::Test::TestHelpers
|
233
214
|
|
234
215
|
should "capture skip results" do
|
235
|
-
test = Factory.test("skip test",
|
216
|
+
test = Factory.test("skip test", context_info1){ skip }
|
236
217
|
test.run(&test_run_callback)
|
237
218
|
|
238
219
|
assert_skipped(test)
|
239
220
|
end
|
240
221
|
|
241
222
|
should "capture skips in the context setup" do
|
242
|
-
test = Factory.test("setup skip test",
|
223
|
+
test = Factory.test("setup skip test", context_info1){ }
|
243
224
|
test.context_class.setup{ skip }
|
244
225
|
test.run(&test_run_callback)
|
245
226
|
|
@@ -247,7 +228,7 @@ class Assert::Test
|
|
247
228
|
end
|
248
229
|
|
249
230
|
should "capture skips in the context teardown" do
|
250
|
-
test = Factory.test("teardown skip test",
|
231
|
+
test = Factory.test("teardown skip test", context_info1){ }
|
251
232
|
test.context_class.teardown{ skip }
|
252
233
|
test.run(&test_run_callback)
|
253
234
|
|
@@ -258,9 +239,9 @@ class Assert::Test
|
|
258
239
|
|
259
240
|
def assert_skipped(test)
|
260
241
|
with_backtrace(caller) do
|
261
|
-
|
242
|
+
assert_that(test_run_result_count).equals(1, "too many/few skip results")
|
262
243
|
test_run_results.each do |result|
|
263
|
-
|
244
|
+
assert_that(result).is_kind_of(Assert::Result::Skip, "not a skip result")
|
264
245
|
end
|
265
246
|
end
|
266
247
|
end
|
@@ -270,7 +251,7 @@ class Assert::Test
|
|
270
251
|
include Assert::Test::TestHelpers
|
271
252
|
|
272
253
|
should "capture error results" do
|
273
|
-
test = Factory.test("error test",
|
254
|
+
test = Factory.test("error test", context_info1) do
|
274
255
|
raise StandardError, "WHAT"
|
275
256
|
end
|
276
257
|
test.run(&test_run_callback)
|
@@ -279,7 +260,7 @@ class Assert::Test
|
|
279
260
|
end
|
280
261
|
|
281
262
|
should "capture errors in the context setup" do
|
282
|
-
test = Factory.test("setup error test",
|
263
|
+
test = Factory.test("setup error test", context_info1){ }
|
283
264
|
test.context_class.setup{ raise "an error" }
|
284
265
|
test.run(&test_run_callback)
|
285
266
|
|
@@ -287,7 +268,7 @@ class Assert::Test
|
|
287
268
|
end
|
288
269
|
|
289
270
|
should "capture errors in the context teardown" do
|
290
|
-
test = Factory.test("teardown error test",
|
271
|
+
test = Factory.test("teardown error test", context_info1){ }
|
291
272
|
test.context_class.teardown{ raise "an error" }
|
292
273
|
test.run(&test_run_callback)
|
293
274
|
|
@@ -298,100 +279,98 @@ class Assert::Test
|
|
298
279
|
|
299
280
|
def assert_errored(test)
|
300
281
|
with_backtrace(caller) do
|
301
|
-
|
282
|
+
assert_that(test_run_result_count).equals(1, "too many/few error results")
|
302
283
|
test_run_results.each do |result|
|
303
|
-
|
284
|
+
assert_that(result).is_kind_of(Assert::Result::Error, "not an error result")
|
304
285
|
end
|
305
286
|
end
|
306
287
|
end
|
307
288
|
end
|
308
289
|
|
309
290
|
class SignalExceptionHandlingTests < UnitTests
|
310
|
-
|
311
291
|
should "raise any signal exceptions and not capture as an error" do
|
312
|
-
test = Factory.test("signal test",
|
292
|
+
test = Factory.test("signal test", context_info1) do
|
313
293
|
raise SignalException, "USR1"
|
314
294
|
end
|
315
295
|
|
316
|
-
|
296
|
+
assert_that { test.run }.raises(SignalException)
|
317
297
|
end
|
318
298
|
|
319
299
|
should "raises signal exceptions in the context setup" do
|
320
|
-
test = Factory.test("setup signal test",
|
300
|
+
test = Factory.test("setup signal test", context_info1){ }
|
321
301
|
test.context_class.setup{ raise SignalException, "INT" }
|
322
302
|
|
323
|
-
|
303
|
+
assert_that { test.run }.raises(SignalException)
|
324
304
|
end
|
325
305
|
|
326
306
|
should "raises signal exceptions in the context teardown" do
|
327
|
-
test = Factory.test("teardown signal test",
|
307
|
+
test = Factory.test("teardown signal test", context_info1){ }
|
328
308
|
test.context_class.teardown{ raise SignalException, "TERM" }
|
329
309
|
|
330
|
-
|
310
|
+
assert_that { test.run }.raises(SignalException)
|
331
311
|
end
|
332
312
|
end
|
333
313
|
|
334
314
|
class ComparingTests < UnitTests
|
335
315
|
desc "<=> another test"
|
336
|
-
|
337
|
-
@test = Factory.test("mmm")
|
338
|
-
end
|
339
|
-
subject{ @test }
|
316
|
+
subject { Factory.test("mmm") }
|
340
317
|
|
341
318
|
should "return 1 with a test named 'aaa' (greater than it)" do
|
342
|
-
|
343
|
-
assert_equal(1, result)
|
319
|
+
assert_that(subject <=> Factory.test("aaa")).equals(1)
|
344
320
|
end
|
345
321
|
|
346
322
|
should "return 0 with a test named the same" do
|
347
|
-
|
348
|
-
assert_equal(0, result)
|
323
|
+
assert_that(subject <=> Factory.test(subject.name)).equals(0)
|
349
324
|
end
|
350
325
|
|
351
326
|
should "return -1 with a test named 'zzz' (less than it)" do
|
352
|
-
|
353
|
-
assert_equal(-1, result)
|
327
|
+
assert_that(subject <=> Factory.test("zzz")).equals(-1)
|
354
328
|
end
|
355
329
|
end
|
356
330
|
|
357
331
|
class CaptureOutTests < UnitTests
|
358
332
|
desc "when capturing std out"
|
359
|
-
|
360
|
-
|
361
|
-
@test = Factory.test("stdout", @capture_config) do
|
333
|
+
subject {
|
334
|
+
Factory.test("stdout", capture_config1) do
|
362
335
|
puts "std out from the test"
|
363
336
|
assert true
|
364
337
|
end
|
365
|
-
|
338
|
+
}
|
339
|
+
|
340
|
+
let(:capture_config1) { Assert::Config.new(:capture_output => true) }
|
366
341
|
|
367
342
|
should "capture any io from the test" do
|
368
|
-
|
369
|
-
|
343
|
+
subject.run
|
344
|
+
assert_that(subject.output).equals("std out from the test\n")
|
370
345
|
end
|
371
346
|
end
|
372
347
|
|
373
348
|
class FullCaptureOutTests < CaptureOutTests
|
374
349
|
desc "across setup, teardown, and meth calls"
|
375
|
-
|
376
|
-
|
350
|
+
subject {
|
351
|
+
Factory.test("fullstdouttest", capture_config1) do
|
377
352
|
puts "std out from the test"
|
378
353
|
assert a_method_an_assert_calls
|
379
354
|
end
|
380
|
-
|
381
|
-
|
382
|
-
|
355
|
+
}
|
356
|
+
|
357
|
+
setup do
|
358
|
+
subject.context_class.setup{ puts "std out from the setup" }
|
359
|
+
subject.context_class.teardown{ puts "std out from the teardown" }
|
360
|
+
subject.context_class.send(:define_method, "a_method_an_assert_calls") do
|
383
361
|
puts "std out from a method an assert called"
|
384
362
|
end
|
385
363
|
end
|
386
364
|
|
387
365
|
should "collect all stdout in the output accessor" do
|
388
|
-
|
389
|
-
|
390
|
-
exp_out =
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
366
|
+
subject.run
|
367
|
+
|
368
|
+
exp_out =
|
369
|
+
"std out from the setup\n"\
|
370
|
+
"std out from the test\n"\
|
371
|
+
"std out from a method an assert called\n"\
|
372
|
+
"std out from the teardown\n"
|
373
|
+
assert_that(subject.output).equals(exp_out)
|
395
374
|
end
|
396
375
|
end
|
397
376
|
end
|