assert 2.18.2 → 2.18.3
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 +7 -6
- data/assert.gemspec +1 -1
- data/lib/assert/actual_value.rb +127 -0
- data/lib/assert/assertions.rb +11 -20
- data/lib/assert/context.rb +13 -5
- data/lib/assert/context/let_dsl.rb +13 -0
- data/lib/assert/context/method_missing.rb +19 -0
- data/lib/assert/macros/methods.rb +4 -4
- data/lib/assert/stub.rb +4 -0
- 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 +348 -333
- data/test/system/test_tests.rb +111 -109
- data/test/unit/actual_value_tests.rb +335 -0
- data/test/unit/assert_tests.rb +84 -59
- data/test/unit/assertions/assert_block_tests.rb +32 -31
- data/test/unit/assertions/assert_empty_tests.rb +35 -32
- data/test/unit/assertions/assert_equal_tests.rb +81 -75
- data/test/unit/assertions/assert_file_exists_tests.rb +34 -33
- data/test/unit/assertions/assert_includes_tests.rb +40 -37
- data/test/unit/assertions/assert_instance_of_tests.rb +36 -33
- data/test/unit/assertions/assert_kind_of_tests.rb +36 -33
- data/test/unit/assertions/assert_match_tests.rb +36 -33
- data/test/unit/assertions/assert_nil_tests.rb +32 -31
- data/test/unit/assertions/assert_raises_tests.rb +55 -55
- data/test/unit/assertions/assert_respond_to_tests.rb +38 -35
- data/test/unit/assertions/assert_same_tests.rb +91 -80
- data/test/unit/assertions/assert_true_false_tests.rb +64 -60
- data/test/unit/assertions_tests.rb +15 -13
- data/test/unit/config_helpers_tests.rb +36 -35
- data/test/unit/config_tests.rb +33 -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 +16 -43
- data/test/unit/context/suite_dsl_tests.rb +16 -16
- data/test/unit/context/test_dsl_tests.rb +50 -54
- data/test/unit/context_info_tests.rb +16 -15
- data/test/unit/context_tests.rb +170 -157
- data/test/unit/default_runner_tests.rb +2 -5
- data/test/unit/default_suite_tests.rb +51 -53
- data/test/unit/factory_tests.rb +3 -3
- data/test/unit/file_line_tests.rb +31 -33
- data/test/unit/macro_tests.rb +9 -10
- data/test/unit/result_tests.rb +150 -163
- data/test/unit/runner_tests.rb +63 -63
- data/test/unit/suite_tests.rb +57 -54
- data/test/unit/test_tests.rb +134 -126
- data/test/unit/utils_tests.rb +41 -45
- data/test/unit/view_helpers_tests.rb +55 -52
- data/test/unit/view_tests.rb +20 -22
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff0d6ff9233adc09dda972e165c47c125e158e46b0329b927eb7de201ddebf65
|
4
|
+
data.tar.gz: 8f77b5326cf44e2ed0c7ed72cac390a7147191634354feb2b890f73d572b366f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25b58fd65c099c0c9f8ff16a652e28d5baeae76838b640872224abd7d063759d6fd40b3ec927220260d82321f78cc4b7617d50a081c7ba336b04d45acec8f618
|
7
|
+
data.tar.gz: 669749ff845ae1811802042dd28e27e7a387d9d39a9504d73b8b04667c9597c4da08bd56cc26a7b34838e5afde2970215027a7d3967ad1e7f99175c62c49a08e
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ require "assert"
|
|
9
9
|
|
10
10
|
class MyTests < Assert::Context
|
11
11
|
test "something" do
|
12
|
-
|
12
|
+
assert_that(1).equals(1)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
```
|
@@ -33,13 +33,13 @@ Running tests in random order, seeded with "56382"
|
|
33
33
|
|
34
34
|
## What Assert is not
|
35
35
|
|
36
|
-
* **RSpec/spec-anything**: define tests using assertion statements
|
37
|
-
* **Unit/Functional/Integration/etc**: Assert is agnostic - you define whatever kinds of tests you like
|
38
|
-
* **Mock/Spec/BDD/etc**: Assert is the framework and there are a variety of 3rd party tools to do such things
|
36
|
+
* **RSpec/spec-anything**: define tests using assertion statements.
|
37
|
+
* **Unit/Functional/Integration/etc**: Assert is agnostic - you define whatever kinds of tests you like and Assert runs them in context.
|
38
|
+
* **Mock/Spec/BDD/etc**: Assert is the framework and there are a variety of 3rd party tools to do such things. Feel free to use whatever you like.
|
39
39
|
|
40
40
|
## Description
|
41
41
|
|
42
|
-
Assert is an assertion
|
42
|
+
Assert is an assertion-style testing framework, meaning you use assertion statements to define your tests and create results. Assert uses class-based contexts so if you want to nest your contexts, use inheritance.
|
43
43
|
|
44
44
|
### Features
|
45
45
|
|
@@ -50,6 +50,7 @@ Assert is an assertion style testing framework, meaning you use assertion statem
|
|
50
50
|
* class-based contexts
|
51
51
|
* multiple before/setup & after/teardown blocks
|
52
52
|
* around blocks
|
53
|
+
* `let` value declarations
|
53
54
|
* full backtrace for errors
|
54
55
|
* optionally pretty print objects in failure descriptions
|
55
56
|
* [stubbing API](https://github.com/redding/assert#stub)
|
@@ -666,4 +667,4 @@ If submitting a Pull Request, please:
|
|
666
667
|
|
667
668
|
One note: please respect that Assert itself is intended to be the flexible, base-level, framework-type logic that should change little if at all. Pull requests for niche functionality or personal testing philosphy stuff will likely not be accepted.
|
668
669
|
|
669
|
-
If you wish to extend Assert for your niche purpose/desire/philosophy, please do so in
|
670
|
+
If you wish to extend Assert for your niche purpose/desire/philosophy, please do so in its own gem (preferrably named `assert-<whatever>`) that uses Assert as a dependency.
|
data/assert.gemspec
CHANGED
@@ -0,0 +1,127 @@
|
|
1
|
+
require "much-stub"
|
2
|
+
|
3
|
+
module Assert; end
|
4
|
+
class Assert::ActualValue
|
5
|
+
def initialize(value, context:)
|
6
|
+
@value = value
|
7
|
+
@context = context
|
8
|
+
end
|
9
|
+
|
10
|
+
def returns_true(*args)
|
11
|
+
@context.assert_block(*args, &@value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def does_not_return_true(*args)
|
15
|
+
@context.assert_not_block(*args, &@value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def raises(*expected_exceptions)
|
19
|
+
@context.assert_raises(*expected_exceptions, &@value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def does_not_raise(*expected_exceptions)
|
23
|
+
@context.assert_nothing_raised(*expected_exceptions, &@value)
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_a_kind_of(expected_class, *args)
|
27
|
+
@context.assert_kind_of(expected_class, @value, *args)
|
28
|
+
end
|
29
|
+
alias_method :is_kind_of, :is_a_kind_of
|
30
|
+
|
31
|
+
def is_not_a_kind_of(expected_class, *args)
|
32
|
+
@context.assert_not_kind_of(expected_class, @value, *args)
|
33
|
+
end
|
34
|
+
alias_method :is_not_kind_of, :is_not_a_kind_of
|
35
|
+
|
36
|
+
def is_an_instance_of(expected_class, *args)
|
37
|
+
@context.assert_instance_of(expected_class, @value, *args)
|
38
|
+
end
|
39
|
+
alias_method :is_instance_of, :is_an_instance_of
|
40
|
+
|
41
|
+
def is_not_an_instance_of(expected_class, *args)
|
42
|
+
@context.assert_not_instance_of(expected_class, @value, *args)
|
43
|
+
end
|
44
|
+
alias_method :is_not_instance_of, :is_not_an_instance_of
|
45
|
+
|
46
|
+
def responds_to(expected_method_name, *args)
|
47
|
+
@context.assert_responds_to(expected_method_name, @value, *args)
|
48
|
+
end
|
49
|
+
|
50
|
+
def does_not_respond_to(expected_method_name, *args)
|
51
|
+
@context.assert_not_responds_to(expected_method_name, @value, *args)
|
52
|
+
end
|
53
|
+
|
54
|
+
def is_the_same_as(expected_object, *args)
|
55
|
+
@context.assert_same(expected_object, @value, *args)
|
56
|
+
end
|
57
|
+
|
58
|
+
def is_not_the_same_as(expected_object, *args)
|
59
|
+
@context.assert_not_same(expected_object, @value, *args)
|
60
|
+
end
|
61
|
+
|
62
|
+
def equals(expected_value, *args)
|
63
|
+
@context.assert_equal(expected_value, @value, *args)
|
64
|
+
end
|
65
|
+
alias_method :is_equal_to, :equals
|
66
|
+
|
67
|
+
def does_not_equal(expected_value, *args)
|
68
|
+
@context.assert_not_equal(expected_value, @value, *args)
|
69
|
+
end
|
70
|
+
alias_method :is_not_equal_to, :does_not_equal
|
71
|
+
|
72
|
+
def matches(expected_regex, *args)
|
73
|
+
@context.assert_match(expected_regex, @value, *args)
|
74
|
+
end
|
75
|
+
|
76
|
+
def does_not_match(expected_regex, *args)
|
77
|
+
@context.assert_not_match(expected_regex, @value, *args)
|
78
|
+
end
|
79
|
+
|
80
|
+
def is_empty(*args)
|
81
|
+
@context.assert_empty(@value, *args)
|
82
|
+
end
|
83
|
+
|
84
|
+
def is_not_empty(*args)
|
85
|
+
@context.assert_not_empty(@value, *args)
|
86
|
+
end
|
87
|
+
|
88
|
+
def includes(object, *args)
|
89
|
+
@context.assert_includes(object, @value, *args)
|
90
|
+
end
|
91
|
+
|
92
|
+
def does_not_include(object, *args)
|
93
|
+
@context.assert_not_includes(object, @value, *args)
|
94
|
+
end
|
95
|
+
|
96
|
+
def is_nil(*args)
|
97
|
+
@context.assert_nil(@value, *args)
|
98
|
+
end
|
99
|
+
|
100
|
+
def is_not_nil(*args)
|
101
|
+
@context.assert_not_nil(@value, *args)
|
102
|
+
end
|
103
|
+
|
104
|
+
def is_true(*args)
|
105
|
+
@context.assert_true(@value, *args)
|
106
|
+
end
|
107
|
+
|
108
|
+
def is_not_true(*args)
|
109
|
+
@context.assert_not_true(@value, *args)
|
110
|
+
end
|
111
|
+
|
112
|
+
def is_false(*args)
|
113
|
+
@context.assert_false(@value, *args)
|
114
|
+
end
|
115
|
+
|
116
|
+
def is_not_false(*args)
|
117
|
+
@context.assert_not_false(@value, *args)
|
118
|
+
end
|
119
|
+
|
120
|
+
def is_a_file(*args)
|
121
|
+
@context.assert_file_exists(@value, *args)
|
122
|
+
end
|
123
|
+
|
124
|
+
def is_not_a_file(*args)
|
125
|
+
@context.assert_not_file_exists(@value, *args)
|
126
|
+
end
|
127
|
+
end
|
data/lib/assert/assertions.rb
CHANGED
@@ -2,6 +2,15 @@ require "assert/utils"
|
|
2
2
|
|
3
3
|
module Assert
|
4
4
|
module Assertions
|
5
|
+
IGNORED_ASSERTION_HELPERS =
|
6
|
+
[
|
7
|
+
:assert_throws, :assert_nothing_thrown,
|
8
|
+
:assert_operator, :refute_operator,
|
9
|
+
:assert_in_epsilon, :refute_in_epsilon,
|
10
|
+
:assert_in_delta, :refute_in_delta,
|
11
|
+
:assert_send
|
12
|
+
]
|
13
|
+
|
5
14
|
def assert_block(desc = nil)
|
6
15
|
assert(yield, desc){ "Expected block to return a true value." }
|
7
16
|
end
|
@@ -25,7 +34,7 @@ module Assert
|
|
25
34
|
alias_method :refute_empty, :assert_not_empty
|
26
35
|
|
27
36
|
def assert_equal(exp, act, desc = nil)
|
28
|
-
assert(
|
37
|
+
assert(act == exp, desc) do
|
29
38
|
c = __assert_config__
|
30
39
|
exp_show = Assert::U.show_for_diff(exp, c)
|
31
40
|
act_show = Assert::U.show_for_diff(act, c)
|
@@ -40,7 +49,7 @@ module Assert
|
|
40
49
|
end
|
41
50
|
|
42
51
|
def assert_not_equal(exp, act, desc = nil)
|
43
|
-
assert(
|
52
|
+
assert(act != exp, desc) do
|
44
53
|
c = __assert_config__
|
45
54
|
exp_show = Assert::U.show_for_diff(exp, c)
|
46
55
|
act_show = Assert::U.show_for_diff(act, c)
|
@@ -244,24 +253,6 @@ module Assert
|
|
244
253
|
end
|
245
254
|
alias_method :refute_same, :assert_not_same
|
246
255
|
|
247
|
-
# ignored assertion helpers
|
248
|
-
|
249
|
-
IGNORED_ASSERTION_HELPERS = [
|
250
|
-
:assert_throws, :assert_nothing_thrown,
|
251
|
-
:assert_operator, :refute_operator,
|
252
|
-
:assert_in_epsilon, :refute_in_epsilon,
|
253
|
-
:assert_in_delta, :refute_in_delta,
|
254
|
-
:assert_send
|
255
|
-
]
|
256
|
-
def method_missing(method, *args, &block)
|
257
|
-
if IGNORED_ASSERTION_HELPERS.include?(method.to_sym)
|
258
|
-
ignore "The assertion `#{method}` is not supported."\
|
259
|
-
" Please use another assertion or the basic `assert`."
|
260
|
-
else
|
261
|
-
super
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
256
|
private
|
266
257
|
|
267
258
|
def __assert_config__
|
data/lib/assert/context.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
require "assert/actual_value"
|
1
2
|
require "assert/assertions"
|
3
|
+
require "assert/context/let_dsl"
|
4
|
+
require "assert/context/method_missing"
|
2
5
|
require "assert/context/setup_dsl"
|
3
6
|
require "assert/context/subject_dsl"
|
4
7
|
require "assert/context/suite_dsl"
|
@@ -16,6 +19,8 @@ module Assert
|
|
16
19
|
extend SubjectDSL
|
17
20
|
extend SuiteDSL
|
18
21
|
extend TestDSL
|
22
|
+
extend LetDSL
|
23
|
+
include MethodMissing
|
19
24
|
include Assert::Assertions
|
20
25
|
include Assert::Macros::Methods
|
21
26
|
|
@@ -61,9 +66,8 @@ module Assert
|
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
64
|
-
#
|
65
|
-
#
|
66
|
-
# all other assertion helpers use this one in the end
|
69
|
+
# Check if the result is true. If so, create a new pass result, Otherwise
|
70
|
+
# create a new fail result with the desc and fail msg.
|
67
71
|
def assert(assertion, desc = nil)
|
68
72
|
if assertion
|
69
73
|
pass
|
@@ -78,8 +82,8 @@ module Assert
|
|
78
82
|
end
|
79
83
|
end
|
80
84
|
|
81
|
-
#
|
82
|
-
# result
|
85
|
+
# The opposite of assert. Check if the result is false. If so, create a new
|
86
|
+
# pass result. Otherwise create a new fail result with the desc and fail msg.
|
83
87
|
def assert_not(assertion, fail_desc = nil)
|
84
88
|
assert(!assertion, fail_desc) do
|
85
89
|
"Failed assert_not: assertion was "\
|
@@ -88,6 +92,10 @@ module Assert
|
|
88
92
|
end
|
89
93
|
alias_method :refute, :assert_not
|
90
94
|
|
95
|
+
def assert_that(actual_value)
|
96
|
+
Assert::ActualValue.new(actual_value, context: self)
|
97
|
+
end
|
98
|
+
|
91
99
|
# adds a Pass result to the end of the test's results
|
92
100
|
# does not break test execution
|
93
101
|
def pass(pass_msg = nil)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Assert; end
|
2
|
+
class Assert::Context; end
|
3
|
+
module Assert::Context::LetDSL
|
4
|
+
def let(name, &block)
|
5
|
+
self.send(:define_method, name, &-> {
|
6
|
+
if instance_variable_get("@#{name}").nil?
|
7
|
+
instance_variable_set("@#{name}", instance_eval(&block))
|
8
|
+
end
|
9
|
+
|
10
|
+
instance_variable_get("@#{name}")
|
11
|
+
})
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "assert/assertions"
|
2
|
+
|
3
|
+
module Assert; end
|
4
|
+
class Assert::Context; end
|
5
|
+
module Assert::Context::MethodMissing
|
6
|
+
def method_missing(method, *args, &block)
|
7
|
+
if Assert::Assertions::IGNORED_ASSERTION_HELPERS.include?(method.to_sym)
|
8
|
+
ignore "The assertion `#{method}` is not supported."\
|
9
|
+
" Please use another assertion or the basic `assert`."
|
10
|
+
else
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def respond_to_missing?(method, *)
|
16
|
+
Assert::Assertions::IGNORED_ASSERTION_HELPERS.include?(method.to_sym) ||
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
@@ -102,28 +102,28 @@ module Assert::Macros
|
|
102
102
|
self.class._methods_macro_instance_methods.each do |(method, called_from)|
|
103
103
|
msg = "#{subject.class.name} does not have instance method ##{method}"
|
104
104
|
with_backtrace([called_from]) do
|
105
|
-
|
105
|
+
assert_that(subject).responds_to(method, msg)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
self.class._methods_macro_class_methods.each do |(method, called_from)|
|
110
110
|
msg = "#{subject.class.name} does not have class method ##{method}"
|
111
111
|
with_backtrace([called_from]) do
|
112
|
-
|
112
|
+
assert_that(subject.class).responds_to(method, msg)
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
116
|
self.class._methods_macro_not_instance_methods.each do |(method, called_from)|
|
117
117
|
msg = "#{subject.class.name} has instance method ##{method}"
|
118
118
|
with_backtrace([called_from]) do
|
119
|
-
|
119
|
+
assert_that(subject).does_not_respond_to(method, msg)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
123
|
self.class._methods_macro_not_class_methods.each do |(method, called_from)|
|
124
124
|
msg = "#{subject.class.name} has class method ##{method}"
|
125
125
|
with_backtrace([called_from]) do
|
126
|
-
|
126
|
+
assert_that(subject.class).does_not_respond_to(method, msg)
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
data/lib/assert/stub.rb
CHANGED
data/lib/assert/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -9,38 +9,36 @@ $LOAD_PATH.unshift(ROOT_PATH)
|
|
9
9
|
require "pry"
|
10
10
|
require "test/support/factory"
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@run_callback = proc{ |result| @test_run_results << result }
|
19
|
-
end
|
12
|
+
module Assert::Test::TestHelpers
|
13
|
+
def self.included(receiver)
|
14
|
+
receiver.class_eval do
|
15
|
+
setup do
|
16
|
+
@test_run_results = []
|
17
|
+
@run_callback = proc { |result| @test_run_results << result }
|
20
18
|
end
|
19
|
+
end
|
21
20
|
|
22
|
-
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
def test_run_callback
|
24
|
+
@run_callback
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
def test_run_results(type = nil)
|
28
|
+
return @test_run_results if type.nil?
|
29
|
+
@test_run_results.select{ |r| r.type == type }
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
def test_run_result_count(type = nil)
|
33
|
+
test_run_results(type).count
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
def test_run_result_messages
|
37
|
+
@test_run_results.map(&:message)
|
38
|
+
end
|
40
39
|
|
41
|
-
|
42
|
-
|
43
|
-
end
|
40
|
+
def last_test_run_result
|
41
|
+
@test_run_results.last
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
data/test/support/factory.rb
CHANGED
@@ -85,4 +85,19 @@ module Factory
|
|
85
85
|
instance_eval(&block) if !block.nil?
|
86
86
|
end
|
87
87
|
end
|
88
|
+
|
89
|
+
def self.modes_off_context(&result_block)
|
90
|
+
test = Factory.test
|
91
|
+
Factory.modes_off_context_class.new(
|
92
|
+
test,
|
93
|
+
test.config,
|
94
|
+
result_block || proc { |r| }
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.backtrace
|
99
|
+
assert_lib_path =
|
100
|
+
File.join(ROOT_PATH, "lib/#{Factory.string}:#{Factory.integer}")
|
101
|
+
(Factory.integer(3).times.map{ Factory.string } + [assert_lib_path]).shuffle
|
102
|
+
end
|
88
103
|
end
|