wrong 0.3.3 → 0.4.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.
- data/README.markdown +77 -11
- data/lib/wrong.rb +20 -0
- data/lib/wrong/adapters/minitest.rb +6 -18
- data/lib/wrong/adapters/rspec.rb +18 -7
- data/lib/wrong/adapters/test_unit.rb +2 -2
- data/lib/wrong/assert.rb +45 -90
- data/lib/wrong/chunk.rb +89 -27
- data/lib/wrong/close_to.rb +7 -11
- data/lib/wrong/d.rb +42 -0
- data/lib/wrong/failure_message.rb +43 -0
- data/lib/wrong/helpers.rb +66 -0
- data/lib/wrong/irb.rb +1 -1
- data/lib/wrong/message/array_diff.rb +57 -75
- data/lib/wrong/message/string_comparison.rb +88 -0
- data/lib/wrong/message/test_context.rb +2 -0
- data/lib/{predicated/lib/predicated/sexp_patch.rb → wrong/ruby2ruby_patch.rb} +3 -5
- data/lib/wrong/sexp_ext.rb +12 -4
- data/lib/wrong/version.rb +1 -1
- data/test/adapters/rspec1/failing_spec.rb +23 -0
- data/test/adapters/rspec2/failing_spec.rb +26 -0
- data/test/adapters/rspec_test.rb +65 -4
- data/test/adapters/test_unit_test.rb +6 -1
- data/test/assert_advanced_test.rb +51 -0
- data/test/assert_test.rb +4 -48
- data/test/capturing_test.rb +4 -2
- data/test/chunk_test.rb +36 -11
- data/test/close_to_test.rb +2 -2
- data/test/config_test.rb +5 -5
- data/test/d_test.rb +64 -0
- data/test/failure_message_test.rb +40 -0
- data/test/failures_test.rb +6 -7
- data/test/message/array_diff_test.rb +18 -14
- data/test/message/{test_context_text.rb → test_context_test.rb} +2 -1
- data/test/rescuing_test.rb +5 -4
- data/test/separate.rb +4 -0
- data/test/sexp_ext_test.rb +2 -2
- data/test/string_comparison_test.rb +159 -0
- data/test/suite.rb +7 -4
- data/test/test_helper.rb +2 -0
- data/test/wrong_test.rb +60 -0
- metadata +92 -46
- data/lib/wrong/message/string_diff.rb +0 -42
- data/test/message/string_diff_test.rb +0 -89
data/test/d_test.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong"
|
3
|
+
require "wrong/d"
|
4
|
+
require "wrong/adapters/minitest"
|
5
|
+
|
6
|
+
describe "d" do
|
7
|
+
include Wrong::D
|
8
|
+
|
9
|
+
it "prints its argument's name and its value" do
|
10
|
+
x = 5
|
11
|
+
output = capturing do
|
12
|
+
d { x }
|
13
|
+
end
|
14
|
+
assert { output == "x is 5\n" }
|
15
|
+
end
|
16
|
+
|
17
|
+
it "inspects the value" do
|
18
|
+
x = "one\ttwo"
|
19
|
+
output = capturing do
|
20
|
+
d { x }
|
21
|
+
end
|
22
|
+
assert { output == "x is \"one\\ttwo\"\n" }
|
23
|
+
end
|
24
|
+
|
25
|
+
it "works on an expression" do
|
26
|
+
x = 5
|
27
|
+
output = capturing do
|
28
|
+
d { x + 2 }
|
29
|
+
end
|
30
|
+
assert { output == "(x + 2) is 7\n" }
|
31
|
+
end
|
32
|
+
|
33
|
+
it "works even if it's not the only thing on the line" do
|
34
|
+
x = 8
|
35
|
+
output = capturing do
|
36
|
+
x; d { x }
|
37
|
+
end
|
38
|
+
assert { output == "x is 8\n" }
|
39
|
+
end
|
40
|
+
|
41
|
+
it "works even if it's nested in another block on the same line" do
|
42
|
+
x = 8
|
43
|
+
output = capturing do
|
44
|
+
assert { d { x }; true }
|
45
|
+
end
|
46
|
+
assert { output == "x is 8\n" }
|
47
|
+
end
|
48
|
+
|
49
|
+
it "works when called on an extending module" do
|
50
|
+
module Something
|
51
|
+
extend Wrong::D
|
52
|
+
end
|
53
|
+
x = 99
|
54
|
+
output = capturing { Something.d { x }}
|
55
|
+
assert { output == "x is 99\n" }
|
56
|
+
end
|
57
|
+
|
58
|
+
it "works when called on the D module" do
|
59
|
+
x = 9
|
60
|
+
output = capturing { Wrong::D.d { x }}
|
61
|
+
assert { output == "x is 9\n" }
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong/assert"
|
3
|
+
require "wrong/failure_message"
|
4
|
+
|
5
|
+
module Wrong
|
6
|
+
|
7
|
+
class BogusFormatter < FailureMessage::Formatter
|
8
|
+
def match?
|
9
|
+
predicate.is_a? BogusPredicate
|
10
|
+
end
|
11
|
+
|
12
|
+
def describe
|
13
|
+
"bogus #{predicate.object_id}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class BogusPredicate < Predicated::Predicate
|
18
|
+
end
|
19
|
+
|
20
|
+
describe FailureMessage::Formatter do
|
21
|
+
include Wrong::Assert
|
22
|
+
|
23
|
+
it "describes a predicate" do
|
24
|
+
predicate = BogusPredicate.new
|
25
|
+
formatter = BogusFormatter.new(predicate)
|
26
|
+
assert { formatter.describe == "bogus #{predicate.object_id}" }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe FailureMessage do
|
31
|
+
include Wrong::Assert
|
32
|
+
|
33
|
+
it "can register a formatter class for a predicate pattern" do
|
34
|
+
FailureMessage.register_formatter(BogusFormatter)
|
35
|
+
assert { FailureMessage.formatter_for(BogusPredicate.new).is_a? BogusFormatter }
|
36
|
+
assert { FailureMessage.formatters.include?(BogusFormatter)}
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/test/failures_test.rb
CHANGED
@@ -14,7 +14,6 @@ describe "failures" do
|
|
14
14
|
|
15
15
|
it "raw boolean assert failure" do
|
16
16
|
error = get_error { @m.assert { false } }
|
17
|
-
# puts error.message
|
18
17
|
assert_match "false", error.message
|
19
18
|
end
|
20
19
|
|
@@ -22,7 +21,6 @@ describe "failures" do
|
|
22
21
|
error = get_error {
|
23
22
|
@m.deny { true }
|
24
23
|
}
|
25
|
-
# puts error.message
|
26
24
|
assert_match "true", error.message
|
27
25
|
end
|
28
26
|
|
@@ -74,7 +72,7 @@ describe "failures" do
|
|
74
72
|
assert_match("1 is not equal to 2", get_error {
|
75
73
|
@m.assert {
|
76
74
|
1==
|
77
|
-
|
75
|
+
2
|
78
76
|
}
|
79
77
|
}.message)
|
80
78
|
end
|
@@ -97,7 +95,7 @@ describe "failures" do
|
|
97
95
|
it "omit a primary failure message since 'This is not true etc.' is more obscuring than clarifying" do
|
98
96
|
m = get_error {
|
99
97
|
x = 5
|
100
|
-
@m.assert { x == 5 && x != 5}
|
98
|
+
@m.assert { x == 5 && x != 5 }
|
101
99
|
}.message
|
102
100
|
assert m == "Expected ((x == 5) and (not (x == 5))), but \n (x == 5) is true\n x is 5\n (not (x == 5)) is false\n"
|
103
101
|
end
|
@@ -137,10 +135,11 @@ describe "failures" do
|
|
137
135
|
|
138
136
|
describe "hash comparisons" do
|
139
137
|
it "basic" do
|
138
|
+
e = get_error {
|
139
|
+
@m.assert { {1=>2}=={"a"=>"b"} }
|
140
|
+
}
|
140
141
|
assert_match '{1=>2} is not equal to {"a"=>"b"}',
|
141
|
-
|
142
|
-
@m.assert { {1=>2}=={"a"=>"b"} }
|
143
|
-
}.message
|
142
|
+
e.message
|
144
143
|
end
|
145
144
|
end
|
146
145
|
|
@@ -1,15 +1,18 @@
|
|
1
1
|
require "./test/test_helper"
|
2
2
|
require "wrong/assert"
|
3
|
-
require "wrong/
|
3
|
+
require "wrong/helpers"
|
4
4
|
require "wrong/adapters/minitest"
|
5
5
|
|
6
|
+
require "wrong/message/array_diff"
|
7
|
+
|
6
8
|
describe "when you're comparing strings and they don't match, show me the diff message" do
|
7
9
|
|
8
10
|
def assert_string_diff_message(first_array, second_array, expected_error_message)
|
11
|
+
e = rescuing {
|
12
|
+
Wrong.assert { first_array == second_array }
|
13
|
+
}
|
9
14
|
assert {
|
10
|
-
|
11
|
-
assert { first_array == second_array }
|
12
|
-
}.message.include?(expected_error_message)
|
15
|
+
e.message.include?(expected_error_message.strip)
|
13
16
|
}
|
14
17
|
end
|
15
18
|
|
@@ -17,26 +20,27 @@ describe "when you're comparing strings and they don't match, show me the diff m
|
|
17
20
|
deny {
|
18
21
|
rescuing {
|
19
22
|
assert { [1]==2 }
|
20
|
-
}.message.include?("
|
23
|
+
}.message.include?("^")
|
21
24
|
}
|
22
25
|
deny {
|
23
26
|
rescuing {
|
24
27
|
assert { nil==[1] }
|
25
|
-
}.message.include?("
|
28
|
+
}.message.include?("^")
|
26
29
|
}
|
27
30
|
end
|
28
31
|
|
29
32
|
it "simple" do
|
33
|
+
e = rescuing {
|
34
|
+
assert { ["a"]==["b"] }
|
35
|
+
}
|
30
36
|
assert {
|
31
|
-
|
32
|
-
assert { ["a"]==["b"] }
|
33
|
-
}.message.include?("diff")
|
37
|
+
e.message.include?("^")
|
34
38
|
}
|
35
39
|
|
36
40
|
assert_string_diff_message(["a", "b"], ["a", "c", "c"], %{
|
37
41
|
["a", "b"]
|
38
42
|
["a", "c", "c"]
|
39
|
-
^ ^
|
43
|
+
^ ^
|
40
44
|
})
|
41
45
|
end
|
42
46
|
|
@@ -44,13 +48,13 @@ describe "when you're comparing strings and they don't match, show me the diff m
|
|
44
48
|
assert_string_diff_message(["a", "b", "c"], ["a", "cccc", "c"], %{
|
45
49
|
["a", "b" , "c"]
|
46
50
|
["a", "cccc", "c"]
|
47
|
-
^
|
51
|
+
^
|
48
52
|
})
|
49
53
|
|
50
54
|
assert_string_diff_message(["a", "b", "c", "d"], ["a", "cccc", "xxx", "d"], %{
|
51
55
|
["a", "b" , "c" , "d"]
|
52
56
|
["a", "cccc", "xxx", "d"]
|
53
|
-
^ ^
|
57
|
+
^ ^
|
54
58
|
})
|
55
59
|
end
|
56
60
|
|
@@ -58,7 +62,7 @@ describe "when you're comparing strings and they don't match, show me the diff m
|
|
58
62
|
assert_string_diff_message([1, true], [2, true, nil], %{
|
59
63
|
[1, true]
|
60
64
|
[2, true, nil]
|
61
|
-
^ ^
|
65
|
+
^ ^
|
62
66
|
})
|
63
67
|
end
|
64
68
|
|
@@ -67,7 +71,7 @@ describe "when you're comparing strings and they don't match, show me the diff m
|
|
67
71
|
assert_string_diff_message([1, [2]], [1, [2, 3]], %{
|
68
72
|
[1, [2] ]
|
69
73
|
[1, [2, 3]]
|
70
|
-
^
|
74
|
+
^
|
71
75
|
})
|
72
76
|
|
73
77
|
end
|
@@ -2,7 +2,7 @@ require "./test/test_helper"
|
|
2
2
|
require "wrong/assert"
|
3
3
|
require "wrong/message/test_context"
|
4
4
|
|
5
|
-
|
5
|
+
xdescribe "showing the lines just above where the failure occurs, so you have some context" do
|
6
6
|
|
7
7
|
include Wrong::Assert
|
8
8
|
|
@@ -14,6 +14,7 @@ describe "showing the lines just above where the failure occurs, so you have som
|
|
14
14
|
begin
|
15
15
|
assert{ a == b }
|
16
16
|
rescue Wrong::Assert::AssertionFailedError => e
|
17
|
+
puts e
|
17
18
|
assert do
|
18
19
|
e.message.include?(
|
19
20
|
%{ it "you can see test method all the way back to the start of the test, plus an indication of where the failure was" do
|
data/test/rescuing_test.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
require "./test/test_helper"
|
2
|
-
|
3
|
-
require "wrong/assert"
|
4
2
|
require "wrong/adapters/minitest"
|
5
3
|
|
6
|
-
describe "a
|
4
|
+
describe "a helper for rescuing errors" do
|
7
5
|
|
8
6
|
class RedError < StandardError; end
|
9
7
|
class BlueError < StandardError; end
|
10
8
|
|
11
|
-
it "
|
9
|
+
it "returns the error that was raised" do
|
12
10
|
assert{ rescuing{raise RedError.new}.is_a?(RedError) }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns nil if nothing was raised" do
|
13
14
|
assert{ rescuing{"x"}.nil? }
|
14
15
|
end
|
15
16
|
|
data/test/separate.rb
ADDED
data/test/sexp_ext_test.rb
CHANGED
@@ -2,10 +2,10 @@ require "./test/test_helper"
|
|
2
2
|
require "wrong/sexp_ext"
|
3
3
|
|
4
4
|
describe Sexp do
|
5
|
-
describe "#
|
5
|
+
describe "#deep_clone" do
|
6
6
|
it "deeply duplicates the sexp" do
|
7
7
|
original = RubyParser.new.parse("x == 5")
|
8
|
-
duplicate = original.
|
8
|
+
duplicate = original.deep_clone
|
9
9
|
assert(original.object_id != duplicate.object_id)
|
10
10
|
assert(original[1].object_id != duplicate[1].object_id)
|
11
11
|
assert(original[1][3].object_id != duplicate[1][3].object_id)
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong/adapters/minitest"
|
3
|
+
require "wrong/message/string_comparison"
|
4
|
+
|
5
|
+
module Wrong
|
6
|
+
describe StringComparison do
|
7
|
+
|
8
|
+
before do
|
9
|
+
# crank the window and prelude down for these tests
|
10
|
+
@old_window = StringComparison.window
|
11
|
+
@old_prelude = StringComparison.prelude
|
12
|
+
StringComparison.window = 16
|
13
|
+
StringComparison.prelude = 8
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
StringComparison.window = @old_window
|
18
|
+
StringComparison.prelude = @old_prelude
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#same?' do
|
22
|
+
it "says identical empty strings are the same" do
|
23
|
+
comparison = StringComparison.new("", "")
|
24
|
+
assert { comparison.same? }
|
25
|
+
end
|
26
|
+
|
27
|
+
it "says identical non-empty strings are the same" do
|
28
|
+
comparison = StringComparison.new("abc", "abc")
|
29
|
+
assert { comparison.same? }
|
30
|
+
end
|
31
|
+
|
32
|
+
it "says two nils are the same" do
|
33
|
+
comparison = StringComparison.new(nil, nil)
|
34
|
+
assert { comparison.same? }
|
35
|
+
end
|
36
|
+
|
37
|
+
it "says a string is different from a different string" do
|
38
|
+
comparison = StringComparison.new("abc", "xyz")
|
39
|
+
deny { comparison.same? }
|
40
|
+
end
|
41
|
+
|
42
|
+
it "says a string is different from nil" do
|
43
|
+
comparison = StringComparison.new("abc", nil)
|
44
|
+
deny { comparison.same? }
|
45
|
+
end
|
46
|
+
|
47
|
+
it "says nil is different from a string" do
|
48
|
+
comparison = StringComparison.new(nil, "abc")
|
49
|
+
deny { comparison.same? }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#different_at' do
|
54
|
+
describe "returns the location where two strings differ" do
|
55
|
+
|
56
|
+
it "at the beginning of the strings" do
|
57
|
+
assert { StringComparison.new("abc", "xyz").different_at == 0 }
|
58
|
+
end
|
59
|
+
|
60
|
+
it "at the middle of the strings" do
|
61
|
+
assert { StringComparison.new("abc", "ayz").different_at == 1 }
|
62
|
+
end
|
63
|
+
|
64
|
+
it "when the first string is longer" do
|
65
|
+
assert { StringComparison.new("abcd", "abc").different_at == 3 }
|
66
|
+
end
|
67
|
+
|
68
|
+
it "when the second string is longer" do
|
69
|
+
assert { StringComparison.new("abc", "abcd").different_at == 3 }
|
70
|
+
end
|
71
|
+
|
72
|
+
it "with nil as the first string" do
|
73
|
+
assert { StringComparison.new(nil, "abc").different_at == 0 }
|
74
|
+
end
|
75
|
+
|
76
|
+
it "with nil as the second string" do
|
77
|
+
assert { StringComparison.new("abc", nil).different_at == 0 }
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#message' do
|
84
|
+
def compare(first, second, expected_message)
|
85
|
+
expected_message.strip!
|
86
|
+
assert { StringComparison.new(first, second).message == expected_message }
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'shows the whole of both strings when the difference is near the start' do
|
90
|
+
compare "abc", "xyz", <<-MESSAGE
|
91
|
+
Strings differ at position 0:
|
92
|
+
first: "abc"
|
93
|
+
second: "xyz"
|
94
|
+
MESSAGE
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'shows ellipses when the difference is in the middle of a long string' do
|
98
|
+
compare "abcdefghijklmnopqrstuvwxyz", "abcdefghijkl*nopqrstuvwxyz", <<-MESSAGE
|
99
|
+
Strings differ at position 12:
|
100
|
+
first: ..."efghijklmnopqrst"...
|
101
|
+
second: ..."efghijkl*nopqrst"...
|
102
|
+
MESSAGE
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'shows ellipses when the difference is near the beginning of a long string' do
|
106
|
+
compare "abcdefghijklmnopqrstuvwxyz", "a*cdefghijklmnopqrstuvwxyz", <<-MESSAGE
|
107
|
+
Strings differ at position 1:
|
108
|
+
first: "abcdefghijklmnop"...
|
109
|
+
second: "a*cdefghijklmnop"...
|
110
|
+
MESSAGE
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'shows ellipses when the difference is near the end of a long string' do
|
114
|
+
compare "abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvw*yz", <<-MESSAGE
|
115
|
+
Strings differ at position 23:
|
116
|
+
first: ..."pqrstuvwxyz"
|
117
|
+
second: ..."pqrstuvw*yz"
|
118
|
+
MESSAGE
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'allows user to override the default window size' do
|
122
|
+
original = StringComparison.window
|
123
|
+
begin
|
124
|
+
StringComparison.window = 10
|
125
|
+
compare "abcdefghijklmnopqrstuvwxyz", "a*cdefghijklmnopqrstuvwxyz", <<-MESSAGE
|
126
|
+
Strings differ at position 1:
|
127
|
+
first: "abcdefghij"...
|
128
|
+
second: "a*cdefghij"...
|
129
|
+
MESSAGE
|
130
|
+
ensure
|
131
|
+
StringComparison.window = original
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'allows user to override the prelude size' do
|
136
|
+
original = StringComparison.prelude
|
137
|
+
begin
|
138
|
+
StringComparison.prelude = 2
|
139
|
+
compare "abcdefghijklmnopqrstuvwxyz", "abcdefghijkl*nopqrstuvwxyz", <<-MESSAGE
|
140
|
+
Strings differ at position 12:
|
141
|
+
first: ..."klmnopqrstuvwxyz"
|
142
|
+
second: ..."kl*nopqrstuvwxyz"
|
143
|
+
MESSAGE
|
144
|
+
ensure
|
145
|
+
StringComparison.prelude = original
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "Wrong integration" do
|
152
|
+
it "works" do
|
153
|
+
error = rescuing do
|
154
|
+
assert { "xyz" == "abc" }
|
155
|
+
end
|
156
|
+
assert { error.message =~ /Strings differ/ }
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|