minispec 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.pryrc +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +2140 -0
- data/Rakefile +11 -0
- data/bin/minispec +4 -0
- data/lib/minispec.rb +175 -0
- data/lib/minispec/api.rb +2 -0
- data/lib/minispec/api/class.rb +195 -0
- data/lib/minispec/api/class/after.rb +49 -0
- data/lib/minispec/api/class/around.rb +54 -0
- data/lib/minispec/api/class/before.rb +101 -0
- data/lib/minispec/api/class/helpers.rb +116 -0
- data/lib/minispec/api/class/let.rb +44 -0
- data/lib/minispec/api/class/tests.rb +33 -0
- data/lib/minispec/api/instance.rb +158 -0
- data/lib/minispec/api/instance/mocks/doubles.rb +36 -0
- data/lib/minispec/api/instance/mocks/mocks.rb +319 -0
- data/lib/minispec/api/instance/mocks/spies.rb +17 -0
- data/lib/minispec/api/instance/mocks/stubs.rb +105 -0
- data/lib/minispec/helpers.rb +1 -0
- data/lib/minispec/helpers/array.rb +56 -0
- data/lib/minispec/helpers/booleans.rb +108 -0
- data/lib/minispec/helpers/generic.rb +24 -0
- data/lib/minispec/helpers/mocks/expectations.rb +29 -0
- data/lib/minispec/helpers/mocks/spies.rb +36 -0
- data/lib/minispec/helpers/raise.rb +44 -0
- data/lib/minispec/helpers/throw.rb +29 -0
- data/lib/minispec/mocks.rb +11 -0
- data/lib/minispec/mocks/expectations.rb +77 -0
- data/lib/minispec/mocks/stubs.rb +178 -0
- data/lib/minispec/mocks/validations.rb +80 -0
- data/lib/minispec/mocks/validations/amount.rb +63 -0
- data/lib/minispec/mocks/validations/arguments.rb +161 -0
- data/lib/minispec/mocks/validations/caller.rb +43 -0
- data/lib/minispec/mocks/validations/order.rb +47 -0
- data/lib/minispec/mocks/validations/raise.rb +111 -0
- data/lib/minispec/mocks/validations/return.rb +74 -0
- data/lib/minispec/mocks/validations/throw.rb +91 -0
- data/lib/minispec/mocks/validations/yield.rb +141 -0
- data/lib/minispec/proxy.rb +201 -0
- data/lib/minispec/reporter.rb +185 -0
- data/lib/minispec/utils.rb +139 -0
- data/lib/minispec/utils/differ.rb +325 -0
- data/lib/minispec/utils/pretty_print.rb +51 -0
- data/lib/minispec/utils/raise.rb +123 -0
- data/lib/minispec/utils/throw.rb +140 -0
- data/minispec.gemspec +27 -0
- data/test/mocks/expectations/amount.rb +67 -0
- data/test/mocks/expectations/arguments.rb +126 -0
- data/test/mocks/expectations/caller.rb +55 -0
- data/test/mocks/expectations/generic.rb +35 -0
- data/test/mocks/expectations/order.rb +46 -0
- data/test/mocks/expectations/raise.rb +166 -0
- data/test/mocks/expectations/return.rb +71 -0
- data/test/mocks/expectations/throw.rb +113 -0
- data/test/mocks/expectations/yield.rb +109 -0
- data/test/mocks/spies/amount.rb +68 -0
- data/test/mocks/spies/arguments.rb +57 -0
- data/test/mocks/spies/generic.rb +61 -0
- data/test/mocks/spies/order.rb +38 -0
- data/test/mocks/spies/raise.rb +158 -0
- data/test/mocks/spies/return.rb +71 -0
- data/test/mocks/spies/throw.rb +113 -0
- data/test/mocks/spies/yield.rb +101 -0
- data/test/mocks/test__doubles.rb +98 -0
- data/test/mocks/test__expectations.rb +27 -0
- data/test/mocks/test__mocks.rb +197 -0
- data/test/mocks/test__proxies.rb +61 -0
- data/test/mocks/test__spies.rb +43 -0
- data/test/mocks/test__stubs.rb +427 -0
- data/test/proxified_asserts.rb +34 -0
- data/test/setup.rb +53 -0
- data/test/test__around.rb +58 -0
- data/test/test__assert.rb +510 -0
- data/test/test__before_and_after.rb +117 -0
- data/test/test__before_and_after_all.rb +71 -0
- data/test/test__helpers.rb +197 -0
- data/test/test__raise.rb +104 -0
- data/test/test__skip.rb +41 -0
- data/test/test__throw.rb +103 -0
- metadata +196 -0
@@ -0,0 +1,117 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class Hooks < self
|
3
|
+
|
4
|
+
BEFORE, AFTER = {}, {}
|
5
|
+
EXPECTED = {
|
6
|
+
[:*] => [:jazz, :blues, :rhythm_and_blues],
|
7
|
+
jazz: [[:*], [:jazz]],
|
8
|
+
blues: [[:*], [/blues/], [/blues/, {:except=>/rhythm/}]],
|
9
|
+
rhythm_and_blues: [[:*], [/blues/]]
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
class Before
|
13
|
+
include Minispec
|
14
|
+
|
15
|
+
before do |test, matcher|
|
16
|
+
update_status(test, matcher)
|
17
|
+
update_status(matcher, test)
|
18
|
+
end
|
19
|
+
|
20
|
+
before :jazz do |test, matcher|
|
21
|
+
update_status(test, matcher)
|
22
|
+
end
|
23
|
+
|
24
|
+
before /blues/ do |test, matcher|
|
25
|
+
update_status(test, matcher)
|
26
|
+
end
|
27
|
+
|
28
|
+
before /blues/, except: /rhythm/ do |test, matcher|
|
29
|
+
update_status(test, matcher)
|
30
|
+
end
|
31
|
+
|
32
|
+
test :jazz do
|
33
|
+
end
|
34
|
+
|
35
|
+
test :blues do
|
36
|
+
end
|
37
|
+
|
38
|
+
test :rhythm_and_blues do
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def update_status test, matcher
|
43
|
+
(BEFORE[test] ||= []).push(matcher)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
msrun(Before)
|
47
|
+
|
48
|
+
class After
|
49
|
+
include Minispec
|
50
|
+
|
51
|
+
after do |test, matcher|
|
52
|
+
update_status(test, matcher)
|
53
|
+
update_status(matcher, test)
|
54
|
+
end
|
55
|
+
|
56
|
+
after :jazz do |test, matcher|
|
57
|
+
update_status(test, matcher)
|
58
|
+
end
|
59
|
+
|
60
|
+
after /blues/ do |test, matcher|
|
61
|
+
update_status(test, matcher)
|
62
|
+
end
|
63
|
+
|
64
|
+
after /blues/, except: /rhythm/ do |test, matcher|
|
65
|
+
update_status(test, matcher)
|
66
|
+
end
|
67
|
+
|
68
|
+
test :jazz do
|
69
|
+
end
|
70
|
+
|
71
|
+
test :blues do
|
72
|
+
end
|
73
|
+
|
74
|
+
test :rhythm_and_blues do
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
def update_status test, matcher
|
79
|
+
(AFTER[test] ||= []).push(matcher)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
msrun(After)
|
83
|
+
|
84
|
+
def test_before_any
|
85
|
+
assert_equal BEFORE[[:*]], EXPECTED[[:*]]
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_after_any
|
89
|
+
assert_equal AFTER[[:*]], EXPECTED[[:*]]
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_before_jazz
|
93
|
+
assert_equal BEFORE[:jazz], EXPECTED[:jazz]
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_after_jazz
|
97
|
+
assert_equal AFTER[:jazz], EXPECTED[:jazz]
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_before_blues
|
101
|
+
assert_equal BEFORE[:blues], EXPECTED[:blues]
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_after_blues
|
105
|
+
assert_equal AFTER[:blues], EXPECTED[:blues]
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_before_rhythm_and_blues
|
109
|
+
assert_equal BEFORE[:rhythm_and_blues], EXPECTED[:rhythm_and_blues]
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_after_rhythm_and_blues
|
113
|
+
assert_equal AFTER[:rhythm_and_blues], EXPECTED[:rhythm_and_blues]
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class BeforeAllTest < self
|
3
|
+
|
4
|
+
X, Y = [], []
|
5
|
+
module BeforeAll
|
6
|
+
include Minispec
|
7
|
+
|
8
|
+
before_all do
|
9
|
+
X << self.class
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class BeforeAllInherited
|
14
|
+
include BeforeAll
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_inherited_boot
|
18
|
+
msrun(BeforeAllInherited)
|
19
|
+
assert X.include?(BeforeAllInherited)
|
20
|
+
end
|
21
|
+
|
22
|
+
class BeforeAllInheritedAndOverriden
|
23
|
+
include BeforeAll
|
24
|
+
|
25
|
+
before_all do
|
26
|
+
Y << self.class
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_override_inherited_boot
|
31
|
+
msrun(BeforeAllInheritedAndOverriden)
|
32
|
+
refute X.include?(BeforeAllInheritedAndOverriden)
|
33
|
+
assert Y.include?(BeforeAllInheritedAndOverriden)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class AfterAllTest < self
|
38
|
+
|
39
|
+
X, Y = [], []
|
40
|
+
module AfterAll
|
41
|
+
include Minispec
|
42
|
+
|
43
|
+
after_all do
|
44
|
+
X << self.class
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class AfterAllInherited
|
49
|
+
include AfterAll
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_inherited_after_all
|
53
|
+
msrun(AfterAllInherited)
|
54
|
+
assert X.include?(AfterAllInherited)
|
55
|
+
end
|
56
|
+
|
57
|
+
class AfterAllInheritedAndOverriden
|
58
|
+
include AfterAll
|
59
|
+
|
60
|
+
after_all do
|
61
|
+
Y << self.class
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_override_inherited_after_all
|
66
|
+
msrun(AfterAllInheritedAndOverriden)
|
67
|
+
refute X.include?(AfterAllInheritedAndOverriden)
|
68
|
+
assert Y.include?(AfterAllInheritedAndOverriden)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class Helpers < self
|
3
|
+
|
4
|
+
class TrueTest
|
5
|
+
include Minispec
|
6
|
+
|
7
|
+
testing :true? do
|
8
|
+
is(true).true?
|
9
|
+
end
|
10
|
+
should ':fail' do
|
11
|
+
is(:blah).true?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
define_tests(TrueTest)
|
15
|
+
|
16
|
+
class PositiveTest
|
17
|
+
include Minispec
|
18
|
+
|
19
|
+
testing :positive? do
|
20
|
+
is(true).positive?
|
21
|
+
is(:something).positive?
|
22
|
+
is('anything').positive?
|
23
|
+
end
|
24
|
+
should ':fail when nil' do
|
25
|
+
is(nil).positive?
|
26
|
+
end
|
27
|
+
should ':fail when false' do
|
28
|
+
is(false).positive?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
define_tests(PositiveTest)
|
32
|
+
|
33
|
+
class FalseTest
|
34
|
+
include Minispec
|
35
|
+
|
36
|
+
testing :false? do
|
37
|
+
is(false).false?
|
38
|
+
end
|
39
|
+
should ':fail' do
|
40
|
+
is(:blah).false?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
define_tests(FalseTest)
|
44
|
+
|
45
|
+
class FalsyTest
|
46
|
+
include Minispec
|
47
|
+
|
48
|
+
testing :nil do
|
49
|
+
is(nil).falsy?
|
50
|
+
end
|
51
|
+
testing :false do
|
52
|
+
is(false).falsy?
|
53
|
+
end
|
54
|
+
should ':fail' do
|
55
|
+
is(:something).falsy?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
define_tests(FalsyTest)
|
59
|
+
|
60
|
+
class ArrayTest
|
61
|
+
include Minispec
|
62
|
+
|
63
|
+
testing :same_elements do
|
64
|
+
a1 = [1, 2, :a, :b, :c]
|
65
|
+
a2 = [:b, 1, :c, 2, :a]
|
66
|
+
assert(a1).has.same_elements_as a2
|
67
|
+
end
|
68
|
+
should 'raise if non-Array given' do
|
69
|
+
does { assert('').has.same_elements '' }.raise? ArgumentError, /Array\?/
|
70
|
+
end
|
71
|
+
should 'raise if right array missing' do
|
72
|
+
does { assert([]).has.same_elements }.raise? ArgumentError
|
73
|
+
end
|
74
|
+
should ':fail if arrays size vary' do
|
75
|
+
assert([1]).has.same_elements [1,2]
|
76
|
+
end
|
77
|
+
should ':fail if arrays elements vary' do
|
78
|
+
assert([:a, :b]).has.same_elements [:x, :y]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
define_tests(ArrayTest)
|
82
|
+
|
83
|
+
class ContainTest
|
84
|
+
include Minispec
|
85
|
+
|
86
|
+
should 'work with integers' do
|
87
|
+
does([1, 2, 5, 6]).contain? 1, 2
|
88
|
+
end
|
89
|
+
should 'work with floats' do
|
90
|
+
does([1.2, 2]).contain? 1.2
|
91
|
+
end
|
92
|
+
should 'work with strings' do
|
93
|
+
does([1.2, '2', 5, 4]).contain? '2', 4
|
94
|
+
end
|
95
|
+
should 'work with regexps' do
|
96
|
+
does([1.2, 'abc', 8, 9]).contain? /b/, 9
|
97
|
+
end
|
98
|
+
should ':fail if no element found' do
|
99
|
+
does([1, 2]).contain? :a
|
100
|
+
end
|
101
|
+
should ':fail if no element matched' do
|
102
|
+
does([:a, :b]).contain? /x/
|
103
|
+
end
|
104
|
+
should 'raise if non-Array given' do
|
105
|
+
does { assert(:blah).contain? :blah }.raise? ArgumentError
|
106
|
+
end
|
107
|
+
end
|
108
|
+
define_tests(ContainTest)
|
109
|
+
|
110
|
+
class ContainAnyTest
|
111
|
+
include Minispec
|
112
|
+
|
113
|
+
should 'work with integers' do
|
114
|
+
does([1, 2, 5, 6]).contain_any? 1, 8
|
115
|
+
end
|
116
|
+
should 'work with floats' do
|
117
|
+
does([4, 2]).contain_any? 2
|
118
|
+
end
|
119
|
+
should 'work with strings' do
|
120
|
+
does([1.2, '2', 5, 4]).contain_any? '2', 4
|
121
|
+
end
|
122
|
+
should 'work with regexps' do
|
123
|
+
does([1.2, 'abc', 8]).contain_any? /b/, 9
|
124
|
+
end
|
125
|
+
should ':fail if no element found' do
|
126
|
+
does([1, 2]).contain_any? :a
|
127
|
+
end
|
128
|
+
should ':fail if no element matched' do
|
129
|
+
does([:a, :b]).contain_any? /x/
|
130
|
+
end
|
131
|
+
should 'raise if non-Array given' do
|
132
|
+
does { assert(:blah).contain_any? :blah }.raise? ArgumentError
|
133
|
+
end
|
134
|
+
end
|
135
|
+
define_tests(ContainAnyTest)
|
136
|
+
|
137
|
+
class SilentTest
|
138
|
+
include Minispec
|
139
|
+
|
140
|
+
should 'pass' do
|
141
|
+
is { '' }.silent?
|
142
|
+
end
|
143
|
+
|
144
|
+
should ':fail because of stdout' do
|
145
|
+
assert { puts 'something' }.is_silent
|
146
|
+
end
|
147
|
+
|
148
|
+
should ':fail because of stderr' do
|
149
|
+
assert { warn 'something' }.is_silent
|
150
|
+
end
|
151
|
+
|
152
|
+
should 'pass when it is not silent and not expected to' do
|
153
|
+
assert { puts 'something' }.is_not.silent
|
154
|
+
end
|
155
|
+
|
156
|
+
should ':fail when it is silent but not expected to' do
|
157
|
+
assert { }.is_not.silent
|
158
|
+
end
|
159
|
+
end
|
160
|
+
define_tests(SilentTest)
|
161
|
+
|
162
|
+
class LeftBlockTest
|
163
|
+
include Minispec
|
164
|
+
|
165
|
+
helper :blank? do |block|
|
166
|
+
is(&block).empty?
|
167
|
+
end
|
168
|
+
|
169
|
+
should 'pass' do
|
170
|
+
is { '' }.blank?
|
171
|
+
end
|
172
|
+
|
173
|
+
should ':fail' do
|
174
|
+
is { '-' }.blank?
|
175
|
+
end
|
176
|
+
end
|
177
|
+
define_tests(LeftBlockTest)
|
178
|
+
|
179
|
+
class RightBlockTest
|
180
|
+
include Minispec
|
181
|
+
|
182
|
+
helper :any_value? do |obj, block|
|
183
|
+
assert(obj).any?(&block)
|
184
|
+
end
|
185
|
+
|
186
|
+
should 'pass' do
|
187
|
+
has([1, 2]).any_value? {|v| v > 1}
|
188
|
+
end
|
189
|
+
|
190
|
+
should ':fail' do
|
191
|
+
has([1, 2]).any_value? {|v| v > 5}
|
192
|
+
end
|
193
|
+
end
|
194
|
+
define_tests(RightBlockTest)
|
195
|
+
|
196
|
+
end
|
197
|
+
end
|
data/test/test__raise.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class Raise < self
|
3
|
+
|
4
|
+
class Unit
|
5
|
+
include Minispec
|
6
|
+
continue_on_failures true
|
7
|
+
|
8
|
+
begin
|
9
|
+
should 'pass when error raised and expected' do
|
10
|
+
does { blah }.raise_error?
|
11
|
+
end
|
12
|
+
|
13
|
+
should ':fail when error expected but NOT raised' do
|
14
|
+
does { :blah }.raise_error?
|
15
|
+
end
|
16
|
+
|
17
|
+
should 'pass when NO error expected and NO error raised' do
|
18
|
+
refute { }.raise_error
|
19
|
+
end
|
20
|
+
|
21
|
+
should ':fail when error raised but NOT expected' do
|
22
|
+
refute { Blah }.raise_error
|
23
|
+
end
|
24
|
+
should ':fail when error raised but NOT expected - alternative syntax' do
|
25
|
+
assure { Blah }.does_not.raise_error
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
should 'pass when raised error type match expected error type' do
|
31
|
+
expect { Blah }.to_raise_error NameError
|
32
|
+
end
|
33
|
+
|
34
|
+
should ':fail when raised error type match expected error type but negation used' do
|
35
|
+
refute { Blah }.raise NameError
|
36
|
+
assure { Blah }.does_not.raise NameError
|
37
|
+
end
|
38
|
+
|
39
|
+
should ':fail when raised error type DOES NOT match expected error type' do
|
40
|
+
does { Blah }.raise_error? StandardError
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
begin # error message as first argument
|
45
|
+
should 'pass when raised error message is equal to expected one' do
|
46
|
+
does { Blah }.raise_error? 'uninitialized constant MinispecTest::Raise::Unit::Blah'
|
47
|
+
end
|
48
|
+
|
49
|
+
should ':fail when raised error message is NOT equal to expected one' do
|
50
|
+
does { Blah }.raise_error? 'Blah'
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'pass when raised error message match expected error message' do
|
54
|
+
does { Blah }.raise_error? /uninitialized constant/
|
55
|
+
end
|
56
|
+
|
57
|
+
should ':fail when raised error message match expected error message but negation used' do
|
58
|
+
refute { Blah }.raise_error /uninitialized constant/
|
59
|
+
assure { Blah }.does_not.raise /uninitialized constant/
|
60
|
+
end
|
61
|
+
|
62
|
+
should ':fail when raised error message DOES NOT match expected error message' do
|
63
|
+
does { Blah }.raise_error? 'something that Ruby would never throw'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
begin # error message as second argument
|
68
|
+
should 'pass when raised error matches expected one' do
|
69
|
+
does { Blah }.raise_error? NameError, /uninitialized constant/
|
70
|
+
end
|
71
|
+
|
72
|
+
should ':fail when raised error match expected error but negation used' do
|
73
|
+
refute { Blah }.raise_error? NameError, /uninitialized constant/
|
74
|
+
assure { Blah }.does_not.raise NameError, /uninitialized constant/
|
75
|
+
end
|
76
|
+
|
77
|
+
should ':fail when type matching and message DOES NOT' do
|
78
|
+
does { Blah }.raise_error? NameError, 'something that Ruby would never throw'
|
79
|
+
end
|
80
|
+
|
81
|
+
should ':fail when message matching and type DOES NOT' do
|
82
|
+
does { Blah }.raise_error? ArgumentError, 'Blah'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
begin # using a block to validate raised error
|
87
|
+
should 'pass when given block validates raised error' do
|
88
|
+
e_class = NameError
|
89
|
+
expect { Blah }.to_raise {|e| e.class == e_class }
|
90
|
+
end
|
91
|
+
|
92
|
+
should ':fail when given block does not validate raised error' do
|
93
|
+
expect { Blah }.to_raise {false}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
should 'raise ArgumentError when both arguments and block given' do
|
98
|
+
does { expect { }.to_raise(NameError) {} }.raise? ArgumentError
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
define_tests(Unit)
|
103
|
+
end
|
104
|
+
end
|