wrong 0.6.3 → 0.7.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.
Files changed (42) hide show
  1. data/README.markdown +10 -7
  2. data/lib/wrong.rb +1 -0
  3. data/lib/wrong/adapters/rspec.rb +4 -0
  4. data/lib/wrong/assert.rb +1 -2
  5. data/lib/wrong/chunk.rb +5 -170
  6. data/lib/wrong/close_to.rb +7 -1
  7. data/lib/wrong/config.rb +3 -3
  8. data/lib/wrong/d.rb +2 -1
  9. data/lib/wrong/failure_message.rb +109 -7
  10. data/lib/wrong/message/string_comparison.rb +1 -1
  11. data/lib/wrong/sexp_ext.rb +2 -1
  12. data/lib/wrong/terminal.rb +43 -0
  13. data/lib/wrong/version.rb +1 -1
  14. data/test/adapters/railsapp/app/controllers/application_controller.rb +3 -0
  15. data/test/adapters/railsapp/app/helpers/application_helper.rb +2 -0
  16. data/test/adapters/railsapp/config/application.rb +54 -0
  17. data/test/adapters/railsapp/config/boot.rb +6 -0
  18. data/test/adapters/railsapp/config/environment.rb +5 -0
  19. data/test/adapters/railsapp/config/environments/development.rb +30 -0
  20. data/test/adapters/railsapp/config/environments/production.rb +60 -0
  21. data/test/adapters/railsapp/config/environments/test.rb +42 -0
  22. data/test/adapters/railsapp/config/initializers/backtrace_silencers.rb +7 -0
  23. data/test/adapters/railsapp/config/initializers/inflections.rb +10 -0
  24. data/test/adapters/railsapp/config/initializers/mime_types.rb +5 -0
  25. data/test/adapters/railsapp/config/initializers/secret_token.rb +7 -0
  26. data/test/adapters/railsapp/config/initializers/session_store.rb +8 -0
  27. data/test/adapters/railsapp/config/initializers/wrap_parameters.rb +14 -0
  28. data/test/adapters/railsapp/config/routes.rb +58 -0
  29. data/test/adapters/railsapp/db/seeds.rb +7 -0
  30. data/test/adapters/railsapp/spec/spec_helper.rb +33 -0
  31. data/test/adapters/railsapp/spec/wrong_spec.rb +8 -0
  32. data/test/adapters/rspec_rails_test.rb +4 -4
  33. data/test/adapters/rspec_test.rb +2 -2
  34. data/test/assert_advanced_test.rb +9 -1
  35. data/test/chunk_test.rb +0 -200
  36. data/test/close_to_test.rb +34 -2
  37. data/test/d_test.rb +2 -2
  38. data/test/eventually_test.rb +27 -34
  39. data/test/failure_message_test.rb +212 -13
  40. data/test/test_helper.rb +2 -2
  41. metadata +47 -56
  42. data/lib/wrong/ruby2ruby_patch.rb +0 -37
@@ -0,0 +1,8 @@
1
+
2
+ require './spec/spec_helper.rb'
3
+ describe 'wrong in rspec in rails' do
4
+ it 'calls the wrong assert' do
5
+ assert { 1 + 1 == 3}
6
+ end
7
+ end
8
+
@@ -12,11 +12,11 @@ include Wrong
12
12
  # called rspec-rails-generate.sh -- if you dare
13
13
 
14
14
 
15
- if RUBY_VERSION == "1.9.2" # too many issues with other versions
15
+ if RUBY_VERSION >= "1.9.2" # too many issues with other versions
16
16
  describe "testing rspec-rails" do
17
17
 
18
18
  [2].each do |rspec_version|
19
- it "in version #{rspec_version}" do
19
+ it "in rspec version #{rspec_version}" do
20
20
  railsapp_dir = "#{here}/railsapp"
21
21
 
22
22
  unless File.exist?(railsapp_dir)
@@ -32,7 +32,7 @@ describe "testing rspec-rails" do
32
32
  FileUtils.rm "#{railsapp_dir}/Gemfile.lock", :force => true
33
33
 
34
34
  # todo: extract into common function
35
- sys "bundle check" do |output|
35
+ sys "bundle check", :ignore do |output|
36
36
  unless output == "The Gemfile's dependencies are satisfied\n"
37
37
  sys "bundle install --gemfile=#{railsapp_dir}/Gemfile"
38
38
  end
@@ -47,7 +47,7 @@ describe "testing rspec-rails" do
47
47
  end
48
48
 
49
49
  spec_output = sys "rspec spec/wrong_spec.rb",
50
- (rspec_version == 1 || RUBY_VERSION =~ /^1\.8\./ || RUBY_VERSION == '1.9.1' ? nil : 1) # RSpec v1 exits with 0 on failure :-(
50
+ (rspec_version == 1 || RUBY_VERSION =~ /^1\.8\./ || RUBY_VERSION == '1.9.1' ? :ignore : 1) # RSpec v1 exits with 0 on failure :-(
51
51
  end
52
52
 
53
53
  assert { spec_output.include? "1 example, 1 failure" }
@@ -20,7 +20,7 @@ describe "testing rspec" do
20
20
  clear_bundler_env
21
21
  FileUtils.rm "#{dir}/Gemfile.lock", :force => true
22
22
 
23
- sys "bundle check", nil do |output|
23
+ sys "bundle check", :ignore do |output|
24
24
  unless output == "The Gemfile's dependencies are satisfied\n"
25
25
  sys "bundle install --gemfile=#{dir}/Gemfile --local"
26
26
  end
@@ -35,7 +35,7 @@ describe "testing rspec" do
35
35
 
36
36
  Bundler.with_clean_env do
37
37
  # RSpec v1 exits with 0 on failure :-( (as do older rubies)
38
- expected_status = (rspec_version == 1 || RUBY_VERSION =~ /^1\.8\./ || RUBY_VERSION == '1.9.1' ? nil : 1)
38
+ expected_status = (rspec_version == 1 || RUBY_VERSION =~ /^1\.8\./ || RUBY_VERSION == '1.9.1' ? :ignore : 1)
39
39
  spec_output = sys "ruby #{dir}/failing_spec.rb", expected_status
40
40
  end
41
41
  end
@@ -16,7 +16,7 @@ describe "advanced assert features" do
16
16
  assert_later { x > 10 }
17
17
  end
18
18
 
19
- assert(e.message =~ /Expected \(x > 10\), but.*x is 10/m, e.message)
19
+ assert(e.message =~ /Expected assert_later { \(x > 10\) }, but.*x is 10/m, e.message)
20
20
  end
21
21
  end
22
22
 
@@ -48,4 +48,12 @@ describe "advanced assert features" do
48
48
 
49
49
  # todo: test for finding it if you'd changed dirs into a parent or sibling or cousin dir
50
50
 
51
+ it "can compare two hashes" do
52
+ assert { {1=>2} == {1=>2} }
53
+ unless RUBY_VERSION < "1.9"
54
+ assert do
55
+ {a:2} == {a:2}
56
+ end
57
+ end
58
+ end
51
59
  end
@@ -10,11 +10,6 @@ end
10
10
 
11
11
  describe Chunk do
12
12
 
13
- # normalize yaml
14
- def y(s)
15
- s.gsub(/--- $/, "---").chomp
16
- end
17
-
18
13
  describe "#from_block" do
19
14
  it "reads the source location" do
20
15
  file, line = __FILE__, __LINE__
@@ -193,199 +188,4 @@ z
193
188
  end
194
189
  end
195
190
 
196
- describe "#details" do
197
- def details(&block)
198
- chunk = Chunk.from_block(block, 1)
199
- chunk.details
200
- end
201
-
202
- it "returns an empty string if there are no parts" do
203
- d = details { assert { true } }
204
- assert d == ""
205
- end
206
-
207
- it "returns an string beginning with a newline if there are parts" do
208
- x = 10
209
- d = details { assert { x == 10 } }
210
- assert d == "\n x is 10\n"
211
- end
212
-
213
- it "skips literals" do
214
- d = details { assert { 10 == 11 } }
215
- assert d == ""
216
- end
217
-
218
- it "shows lots of details" do
219
- x = 10
220
- d = details { assert { (x * (x - 10)) == (x / (x + 10)) } }
221
- assert d == <<-DETAILS
222
-
223
- (x * (x - 10)) is 0
224
- x is 10
225
- (x - 10) is 0
226
- (x / (x + 10)) is 0
227
- (x + 10) is 20
228
- DETAILS
229
- end
230
-
231
- it "skips duplicates" do
232
- x = 10
233
- d = details { assert { (x + 5) == 1 + (x + 5) } }
234
- assert d == <<-DETAILS
235
-
236
- (x + 5) is 15
237
- x is 10
238
- (1 + (x + 5)) is 16
239
- DETAILS
240
- end
241
-
242
- it "shows exceptions" do
243
- d = details { assert { (raise "hi") == 1 } }
244
- assert d == "\n raise(\"hi\") raises RuntimeError: hi\n"
245
- end
246
-
247
- it "indents newlines inside the exception message" do
248
- d = details { assert { (raise "hello\nsailor") == 1 } }
249
- assert d == "\n raise(\"hello\\nsailor\") raises RuntimeError: hello\n sailor\n"
250
- end
251
-
252
- it "abridges exceptions with no message" do
253
- d = details { assert { (raise Exception.new) == 1 } }
254
- assert d == "\n raise(Exception.new) raises Exception\n" +
255
- " Exception.new is #<Exception: Exception>\n"
256
- end
257
-
258
- it "inspects values" do
259
- x = "flavor:\tvanilla"
260
- d = details { assert { x == "flavor:\tchocolate" } }
261
- # this means it's a literal slash plus t inside double quotes -- i.e. it shows the escaped (inspected) string
262
- assert d == "\n" + ' x is "flavor:\tvanilla"' + "\n"
263
- end
264
-
265
- it "splits lower-down details correctly (bug)" do
266
- hash = {:flavor => "vanilla"}
267
- exception_with_newlines = Exception.new(hash.to_yaml.chomp)
268
- d = details {
269
- rescuing { raise exception_with_newlines }.message.include?(":flavor: chocolate")
270
- }
271
- assert (y(d).include? "exception_with_newlines is #<Exception: ---\n :flavor: vanilla>"), d.inspect
272
- end
273
-
274
- it "skips assignments" do
275
- y = 14
276
- d = details { x = 7; y }
277
- assert d !~ /x = 7/
278
- assert d =~ /y is 14/
279
- end
280
-
281
- class Weirdo
282
- def initialize(inspected_value)
283
- @inspected_value = inspected_value
284
- end
285
-
286
- def inspect
287
- @inspected_value
288
- end
289
- end
290
-
291
-
292
- it "indents unescaped newlines inside the inspected value" do
293
- x = Weirdo.new("first\nsecond\nthird")
294
- d = details { assert { x == "foo" } }
295
- assert d == "\n x is first\n second\n third\n"
296
- end
297
-
298
- describe '#pretty_value' do
299
- before do
300
- @chunk = chunk = Chunk.new(__FILE__, __LINE__ + 1); <<-CODE
301
- true
302
- CODE
303
- end
304
-
305
- after do
306
- Chunk.terminal_width = 80
307
- end
308
-
309
- it 'inspects its value' do
310
- assert @chunk.pretty_value(12) == "12"
311
- assert @chunk.pretty_value("foo") == "\"foo\""
312
- end
313
-
314
- it 'escapes newlines in strings' do
315
- assert @chunk.pretty_value("foo\nbar\nbaz") == "\"foo\\nbar\\nbaz\""
316
- end
317
-
318
- it 'indents newlines in raw inspect values (e.g. exceptions or YAML or whatever)' do
319
- w = Weirdo.new("foo\nbar\nbaz")
320
- assert @chunk.pretty_value(w) == "foo\n bar\n baz"
321
- end
322
-
323
- it "returns the terminal width" do
324
- assert Chunk.terminal_width.is_a? Fixnum
325
- assert Chunk.terminal_width > 0
326
- end
327
-
328
- it "can fake the terminal width" do
329
- Chunk.terminal_width = 66
330
- assert Chunk.terminal_width == 66
331
- end
332
-
333
- # def pretty_value(value, starting_col = 0, indent_wrapped_lines = 3, size = Chunk.terminal_size)
334
-
335
- it 'inserts newlines in really long values, wrapped at the given width' do
336
- abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
337
- pretty = @chunk.pretty_value(abc, 0, 0, 10)
338
- assert pretty == <<-DONE.chomp
339
- abcdefghij
340
- klmnopqrst
341
- uvwxyz
342
- DONE
343
- end
344
-
345
- it 'inserts newlines in really long values, wrapped at the terminal width' do
346
- Chunk.terminal_width = 10
347
- abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
348
- pretty = @chunk.pretty_value(abc, 0, 0)
349
- assert pretty == <<-DONE.chomp
350
- abcdefghij
351
- klmnopqrst
352
- uvwxyz
353
- DONE
354
- end
355
-
356
- it 'subtracts the starting column from the wrapped width of the first line' do
357
- abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
358
- pretty = @chunk.pretty_value(abc, 2, 0, 10)
359
- assert pretty == <<-DONE.chomp
360
- abcdefgh
361
- ijklmnopqr
362
- stuvwxyz
363
- DONE
364
- end
365
-
366
- it "indents wrapped lines" do
367
- abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
368
- pretty = @chunk.pretty_value(abc, 2, 3, 10)
369
- assert pretty == <<-DONE.chomp
370
- abcdefgh
371
- ijklmno
372
- pqrstuv
373
- wxyz
374
- DONE
375
- end
376
-
377
- it "wraps correctly" do
378
- hash = {:flavor => "vanilla"}
379
- object = Weirdo.new(hash.to_yaml.chomp)
380
- pretty = @chunk.pretty_value(object, 2, 3, 80)
381
- assert y(pretty) == y(<<-DONE), pretty.inspect
382
- ---
383
- :flavor: vanilla
384
- DONE
385
- end
386
-
387
-
388
- end
389
-
390
- end
391
191
  end
@@ -2,6 +2,7 @@ require "./test/test_helper"
2
2
  require "wrong/close_to"
3
3
  require "wrong"
4
4
  require "bigdecimal"
5
+ require 'time'
5
6
 
6
7
  describe "#close_to? (monkey patch for float comparison)" do
7
8
  include Wrong
@@ -36,11 +37,42 @@ describe "#close_to? (monkey patch for float comparison)" do
36
37
  deny { 5.close_to? 5.1 }
37
38
  assert { 5.close_to? 5.1, 0.5 }
38
39
  end
39
-
40
- it "also works for bigdecimals" do
40
+
41
+ it "also works for bigdecimals" do
41
42
  assert { BigDecimal.new("5.0").close_to? 5 }
42
43
  assert { BigDecimal.new("5.0").close_to? 5.0001 }
43
44
  deny { BigDecimal.new("5.0").close_to? 5.1 }
44
45
  end
45
46
 
47
+ one_hour = 60 * 60
48
+ one_day = one_hour * 24
49
+
50
+ it "works for dates" do
51
+ monday = Date.parse("2000-01-02")
52
+ tuesday = Date.parse("2000-01-03")
53
+ assert { monday.close_to? monday }
54
+ deny { monday.close_to? tuesday }
55
+ assert { monday.close_to? tuesday, one_day + 1 }
56
+ end
57
+
58
+ it "works for times" do
59
+ noon = Time.parse("12:00:00")
60
+ one_pm = Time.parse("13:00:00")
61
+ one_pm_and_one_second = Time.parse("13:00:01")
62
+ assert { one_pm.close_to? one_pm }
63
+ assert { one_pm.close_to? one_pm_and_one_second, 2 }
64
+ deny { noon.close_to? one_pm }
65
+ assert { noon.close_to? one_pm, one_hour + 1 }
66
+ end
67
+
68
+ it "works for datetimes" do
69
+ noon = DateTime.parse("2000-01-01 12:00:00")
70
+ one_pm = DateTime.parse("2000-01-01 13:00:00")
71
+ one_pm_and_one_second = DateTime.parse("2000-01-01 13:00:01")
72
+ assert { one_pm.close_to? one_pm }
73
+ assert { one_pm.close_to? one_pm_and_one_second, 2 }
74
+ deny { noon.close_to? one_pm }
75
+ assert { noon.close_to? one_pm, one_hour + 1 }
76
+ end
77
+
46
78
  end
@@ -24,7 +24,7 @@ describe "d" do
24
24
 
25
25
  it "pretty-prints the value" do
26
26
  begin
27
- Wrong::Chunk.terminal_width = 20
27
+ Wrong::Terminal.width = 20
28
28
  x = ["a" * 10, "b" * 10]
29
29
  output = capturing do
30
30
  d { x }
@@ -33,7 +33,7 @@ describe "d" do
33
33
  "x is [\"aaaaaaaaaa\",\n \"bbbbbbbbbb\"]\n"
34
34
  }
35
35
  ensure
36
- Wrong::Chunk.terminal_width = nil
36
+ Wrong::Terminal.width = nil
37
37
  end
38
38
  end
39
39
 
@@ -1,4 +1,4 @@
1
- # based on
1
+ # based on
2
2
  # * https://gist.github.com/1228927
3
3
  # * https://github.com/pivotal/selenium/blob/master/lib/selenium/wait_for.rb
4
4
  # see
@@ -30,7 +30,7 @@ describe "eventually" do
30
30
  include Wrong::Helpers
31
31
  include Wrong::D
32
32
 
33
- # rolling our own mock clock and stubbing framework since we want these
33
+ # rolling our own mock clock and stubbing framework since we want these
34
34
  # tests to run in MiniTest or in any version of RSpec
35
35
 
36
36
  class ::Time
@@ -43,27 +43,27 @@ describe "eventually" do
43
43
  def now= new_now
44
44
  @now = new_now
45
45
  end
46
- end
46
+ end
47
47
  end
48
48
 
49
49
  def stub_it(receiver, method_name, &block)
50
50
  receiver.singleton_class.send(:define_method, method_name, &block)
51
51
  end
52
-
52
+
53
53
  def unstub_it(receiver, method_name)
54
54
  receiver.singleton_class.send(:remove_method, method_name)
55
55
  end
56
56
 
57
57
  before do
58
- stub_it(self, :sleep) do |secs|
58
+ stub_it(self, :sleep) do |secs|
59
59
  Time.now += secs
60
60
  end
61
61
  end
62
-
62
+
63
63
  after do
64
64
  unstub_it(self, :sleep)
65
65
  end
66
-
66
+
67
67
  it "requires a block" do
68
68
  e = rescuing {
69
69
  eventually
@@ -86,29 +86,25 @@ describe "eventually" do
86
86
  deny { e.nil? }
87
87
  assert { Time.now == original_now + 5}
88
88
  end
89
-
89
+
90
90
  it "calls the block every 0.25 seconds" do
91
- original_now = Time.now
91
+ original_now = Time.now
92
92
  called_at = []
93
93
  rescuing {
94
- eventually {
94
+ eventually {
95
95
  called_at << (Time.now - original_now)
96
96
  false
97
97
  }
98
98
  }
99
99
  assert { called_at.uniq == [
100
- 0.0, 0.25, 0.5, 0.75,
101
- 1.0, 1.25, 1.5, 1.75,
102
- 2.0, 2.25, 2.5, 2.75,
103
- 3.0, 3.25, 3.5, 3.75,
104
- 4.0, 4.25, 4.5, 4.75,
100
+ 0.0, 0.25, 0.5, 0.75,
101
+ 1.0, 1.25, 1.5, 1.75,
102
+ 2.0, 2.25, 2.5, 2.75,
103
+ 3.0, 3.25, 3.5, 3.75,
104
+ 4.0, 4.25, 4.5, 4.75,
105
105
  ] }
106
106
  end
107
-
108
- it "puts the elapsed time in the exception message"
109
- # assert { e.message =~ /\(after 5 sec\)$/}
110
-
111
-
107
+
112
108
  it "returns after the condition is false for a while then true" do
113
109
  original_now = Time.now
114
110
  eventually {
@@ -121,19 +117,20 @@ describe "eventually" do
121
117
  end
122
118
 
123
119
  it "raises a detailed Wrong exception if the result keeps being false" do
124
- original_now = Time.now
125
120
  e = rescuing do
126
121
  eventually { false }
127
122
  end
128
123
  assert { e.message == "Expected false" }
129
-
124
+
130
125
  x = 1
131
126
  e = rescuing do
132
- eventually { x + 2 == 4 }
127
+ eventually do
128
+ x + 2 == 4
129
+ end
133
130
  end
134
131
  assert { e.message == "Expected ((x + 2) == 4), but\n (x + 2) is 3\n x is 1\n" }
135
132
  end
136
-
133
+
137
134
  describe "if the block raises an exception" do
138
135
  it "for 5 seconds, it raises that exception" do
139
136
  original_now = Time.now
@@ -160,27 +157,23 @@ describe "eventually" do
160
157
  }
161
158
  end
162
159
  end
163
-
164
- describe "passes a context hash to the block" do
165
- it "that influences the error message"
166
- end
167
-
160
+
168
161
  describe "takes an options hash" do
169
162
  it "that can change the timeout" do
170
- original_now = Time.now
163
+ original_now = Time.now
171
164
  rescuing {
172
165
  eventually(:timeout => 2) { false }
173
166
  }
174
167
  assert {
175
- Time.now == original_now + 2
168
+ Time.now == original_now + 2
176
169
  }
177
170
  end
178
-
171
+
179
172
  it "that can change the delay" do
180
- original_now = Time.now
173
+ original_now = Time.now
181
174
  called_at = []
182
175
  rescuing {
183
- eventually(:delay => 1.5) {
176
+ eventually(:delay => 1.5) {
184
177
  called_at << (Time.now - original_now)
185
178
  false
186
179
  }