wrong 0.4.0-java
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 +300 -0
- data/lib/wrong.rb +27 -0
- data/lib/wrong/adapters/minitest.rb +14 -0
- data/lib/wrong/adapters/rspec.rb +21 -0
- data/lib/wrong/adapters/test_unit.rb +9 -0
- data/lib/wrong/assert.rb +105 -0
- data/lib/wrong/chunk.rb +233 -0
- data/lib/wrong/close_to.rb +9 -0
- data/lib/wrong/config.rb +29 -0
- 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 +16 -0
- data/lib/wrong/message/array_diff.rb +69 -0
- data/lib/wrong/message/string_comparison.rb +88 -0
- data/lib/wrong/message/test_context.rb +28 -0
- data/lib/wrong/rainbow.rb +127 -0
- data/lib/wrong/ruby2ruby_patch.rb +37 -0
- data/lib/wrong/sexp_ext.rb +49 -0
- data/lib/wrong/version.rb +3 -0
- data/test/adapters/minitest_test.rb +97 -0
- data/test/adapters/rspec1/failing_spec.rb +23 -0
- data/test/adapters/rspec2/failing_spec.rb +26 -0
- data/test/adapters/rspec_test.rb +104 -0
- data/test/adapters/test_unit_test.rb +59 -0
- data/test/assert_advanced_test.rb +51 -0
- data/test/assert_test.rb +76 -0
- data/test/capturing_test.rb +59 -0
- data/test/chunk_test.rb +264 -0
- data/test/close_to_test.rb +39 -0
- data/test/config_test.rb +89 -0
- data/test/d_test.rb +64 -0
- data/test/failure_message_test.rb +40 -0
- data/test/failures_test.rb +157 -0
- data/test/message/array_diff_test.rb +79 -0
- data/test/message/test_context_test.rb +69 -0
- data/test/rescuing_test.rb +17 -0
- data/test/separate.rb +4 -0
- data/test/sexp_ext_test.rb +80 -0
- data/test/string_comparison_test.rb +159 -0
- data/test/suite.rb +7 -0
- data/test/test_helper.rb +64 -0
- data/test/wrong_test.rb +60 -0
- metadata +215 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong/assert"
|
3
|
+
require "wrong/message/test_context"
|
4
|
+
|
5
|
+
xdescribe "showing the lines just above where the failure occurs, so you have some context" do
|
6
|
+
|
7
|
+
include Wrong::Assert
|
8
|
+
|
9
|
+
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
|
10
|
+
a = 1
|
11
|
+
b = 2
|
12
|
+
c = 1
|
13
|
+
assert{ a == c }
|
14
|
+
begin
|
15
|
+
assert{ a == b }
|
16
|
+
rescue Wrong::Assert::AssertionFailedError => e
|
17
|
+
puts e
|
18
|
+
assert do
|
19
|
+
e.message.include?(
|
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
|
21
|
+
a = 1
|
22
|
+
b = 2
|
23
|
+
c = 1
|
24
|
+
assert{ a == c }
|
25
|
+
begin
|
26
|
+
assert{ a == b } ASSERTION FAILURE test/include_test_context_test.rb:15}
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
deny {e.message.include?("works with it too")}
|
31
|
+
deny {e.message.include?("test_works_with_test_undercore")}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "works with it too" do
|
36
|
+
begin
|
37
|
+
assert{ 1 == 2 }
|
38
|
+
rescue Wrong::Assert::AssertionFailedError => e
|
39
|
+
assert do
|
40
|
+
e.message.include?(
|
41
|
+
%{ it "works with it too" do
|
42
|
+
begin
|
43
|
+
assert{ 1 == 2 } ASSERTION FAILURE test/include_test_context_test.rb:36}
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
deny {e.message.include?("you can see test method")}
|
48
|
+
deny {e.message.include?("test_works_with_test_undercore")}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_works_with_test_undercore_too
|
53
|
+
begin
|
54
|
+
assert{ 1 == 2 }
|
55
|
+
rescue Wrong::Assert::AssertionFailedError => e
|
56
|
+
assert do
|
57
|
+
e.message.include?(
|
58
|
+
%{ def test_works_with_test_undercore_too
|
59
|
+
begin
|
60
|
+
assert{ 1 == 2 } ASSERTION FAILURE test/include_test_context_test.rb:53}
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
deny {e.message.include?("you can see test method")}
|
65
|
+
deny {e.message.include?("works with it too")}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong/adapters/minitest"
|
3
|
+
|
4
|
+
describe "a helper for rescuing errors" do
|
5
|
+
|
6
|
+
class RedError < StandardError; end
|
7
|
+
class BlueError < StandardError; end
|
8
|
+
|
9
|
+
it "returns the error that was raised" do
|
10
|
+
assert{ rescuing{raise RedError.new}.is_a?(RedError) }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns nil if nothing was raised" do
|
14
|
+
assert{ rescuing{"x"}.nil? }
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/test/separate.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong/sexp_ext"
|
3
|
+
|
4
|
+
describe Sexp do
|
5
|
+
describe "#deep_clone" do
|
6
|
+
it "deeply duplicates the sexp" do
|
7
|
+
original = RubyParser.new.parse("x == 5")
|
8
|
+
duplicate = original.deep_clone
|
9
|
+
assert(original.object_id != duplicate.object_id)
|
10
|
+
assert(original[1].object_id != duplicate[1].object_id)
|
11
|
+
assert(original[1][3].object_id != duplicate[1][3].object_id)
|
12
|
+
assert(original[3].object_id != duplicate[3].object_id)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse(ruby)
|
17
|
+
RubyParser.new.parse(ruby)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#to_ruby" do
|
21
|
+
it "converts the sexp to ruby code" do
|
22
|
+
sexp = parse("x == 5")
|
23
|
+
assert sexp.to_ruby == "(x == 5)"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "leaves the original sexp alone" do
|
27
|
+
sexp = parse("x == 5")
|
28
|
+
assert sexp.to_ruby == "(x == 5)"
|
29
|
+
assert sexp.to_ruby == "(x == 5)" # intended
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#assertion? with a question mark" do
|
34
|
+
it "matches an sexp that looks like assert { }" do
|
35
|
+
sexp = parse("assert { true }")
|
36
|
+
assert sexp.assertion?
|
37
|
+
end
|
38
|
+
|
39
|
+
it "matches an sexp that looks like assert(message) { }" do
|
40
|
+
sexp = parse("assert('hi') { true }")
|
41
|
+
assert sexp.assertion?
|
42
|
+
end
|
43
|
+
|
44
|
+
it "matches an sexp that looks like deny { }" do
|
45
|
+
sexp = parse("deny { false }")
|
46
|
+
assert sexp.assertion?
|
47
|
+
end
|
48
|
+
|
49
|
+
it "doesn't match an sexp that calls assert without a block" do
|
50
|
+
sexp = parse("assert(true)")
|
51
|
+
assert !sexp.assertion?
|
52
|
+
end
|
53
|
+
|
54
|
+
it "doesn't match a normal sexp" do
|
55
|
+
sexp = parse("x == 5")
|
56
|
+
assert !sexp.assertion?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#assertion" do
|
61
|
+
it "matches a top-level sexp that looks like assert { }" do
|
62
|
+
sexp = parse("assert { true }")
|
63
|
+
code = sexp.assertion.to_ruby
|
64
|
+
assert code == "assert { true }"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "matches a nested sexp that looks like assert { }" do
|
68
|
+
sexp = parse("nesting { assert { true } }")
|
69
|
+
code = sexp.assertion.to_ruby
|
70
|
+
assert code == "assert { true }"
|
71
|
+
end
|
72
|
+
|
73
|
+
it "matches the first nested sexp that looks like assert { }" do
|
74
|
+
sexp = parse("nesting { assert { true } or assert { false } }")
|
75
|
+
code = sexp.assertion.to_ruby
|
76
|
+
assert code == "assert { true }"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -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
|
data/test/suite.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#simple (but slow) way to make sure requires are isolated
|
2
|
+
failed = Dir["test/**/*_test.rb"].collect do |test_file|
|
3
|
+
ok = system("bundle exec ruby #{test_file}")
|
4
|
+
test_file unless ok
|
5
|
+
end.compact
|
6
|
+
puts "suite " + (failed.empty? ? "passed" : "FAILED: #{failed.join(', ')}")
|
7
|
+
exit(failed.empty? ? 0 : 1)
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
puts "RUBY_VERSION=#{RUBY_VERSION}#{" (JRuby)" if Object.const_defined?(:JRuby)}"
|
2
|
+
|
3
|
+
dir = File.dirname(__FILE__)
|
4
|
+
$LOAD_PATH.unshift "#{dir}/../lib"
|
5
|
+
|
6
|
+
predicated_project_dir = File.expand_path("../predicated")
|
7
|
+
if File.exist?(predicated_project_dir) # if predicated project is a sibling of this project
|
8
|
+
puts "using predicated from #{predicated_project_dir}"
|
9
|
+
$LOAD_PATH.unshift "#{predicated_project_dir}/lib"
|
10
|
+
require "predicated"
|
11
|
+
end
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "minitest/spec"
|
15
|
+
require "minitest/unit"
|
16
|
+
require "pp"
|
17
|
+
|
18
|
+
# yes, this does look a lot like Wrong::Assert#rescuing :-)
|
19
|
+
def get_error
|
20
|
+
error = nil
|
21
|
+
begin
|
22
|
+
yield
|
23
|
+
rescue Exception, RuntimeError => e
|
24
|
+
error = e
|
25
|
+
end
|
26
|
+
error
|
27
|
+
end
|
28
|
+
|
29
|
+
class MiniTest::Unit::TestCase
|
30
|
+
end
|
31
|
+
|
32
|
+
module Kernel
|
33
|
+
def xdescribe(str)
|
34
|
+
puts "x'd out describe \"#{str}\""
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class MiniTest::Spec
|
39
|
+
include MiniTest::Assertions
|
40
|
+
|
41
|
+
class << self
|
42
|
+
def xit(str)
|
43
|
+
puts "x'd out test \"#{str}\""
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# dummy class for use by tests
|
49
|
+
class Color
|
50
|
+
attr_reader :name
|
51
|
+
def initialize(name)
|
52
|
+
@name = name
|
53
|
+
end
|
54
|
+
|
55
|
+
def ==(other)
|
56
|
+
other.is_a?(Color) && @name == other.name
|
57
|
+
end
|
58
|
+
|
59
|
+
def inspect
|
60
|
+
"Color:#{@name}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
MiniTest::Unit.autorun
|
data/test/wrong_test.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require "./test/test_helper"
|
2
|
+
require "wrong"
|
3
|
+
|
4
|
+
describe "the Wrong module" do
|
5
|
+
|
6
|
+
class Client
|
7
|
+
include Wrong
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "by itself" do
|
11
|
+
it "gets the assert method" do
|
12
|
+
Wrong.assert { true }
|
13
|
+
end
|
14
|
+
|
15
|
+
it "gets the deny method" do
|
16
|
+
Wrong.deny { false }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "gets the capturing method" do
|
20
|
+
value = Wrong.capturing { puts "ok" }
|
21
|
+
assert value == "ok\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "gets the rescuing method" do
|
25
|
+
value = Wrong.rescuing { raise "uh-oh" }
|
26
|
+
assert value.message == "uh-oh"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "when included" do
|
32
|
+
it "gets the assert method" do
|
33
|
+
Client.new.assert { true }
|
34
|
+
end
|
35
|
+
|
36
|
+
it "gets the deny method" do
|
37
|
+
Client.new.deny { false }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "gets the capturing method" do
|
41
|
+
value = Client.new.capturing { puts "ok" }
|
42
|
+
assert value == "ok\n"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "gets the rescuing method" do
|
46
|
+
value = Client.new.rescuing { raise "uh-oh" }
|
47
|
+
assert value.message == "uh-oh"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "adds #close_to? to Float" do
|
51
|
+
assert 1.0.respond_to?(:close_to?)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "adds #d to a global namespace" do
|
55
|
+
x = 5
|
56
|
+
output = Wrong.capturing { d { x } }
|
57
|
+
Wrong.assert { output == "x is 5\n" }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|