wrong 0.5.0-java → 0.5.2-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,8 +8,6 @@ Wrong provides a general assert method that takes a predicate block. Assertion f
8
8
 
9
9
  We'd very much appreciate feedback and bug reports. There are plenty of things left to be done to make the results look uniformly clean and beautiful. We want your feedback, and especially to give us cases where either it blows up or the output is ugly or uninformative.
10
10
 
11
- It relies on [Predicated](http://github.com/sconover/predicated) for its main failure message.
12
-
13
11
  Inspired by [assert { 2.0 }](http://assert2.rubyforge.org/) but rewritten from scratch. Compatible with Ruby (MRI) 1.8, 1.9, and JRuby 1.5.
14
12
 
15
13
  ## Installation
@@ -22,7 +20,7 @@ We have deployed gems for both Ruby and JRuby; if you get dependency issues on y
22
20
 
23
21
  Wrong provides a simple assert method that takes a block:
24
22
 
25
- require "wrong"
23
+ require "wrong" # or require "wrong/adapters/rspec" (see below)
26
24
 
27
25
  include Wrong
28
26
 
@@ -100,9 +98,41 @@ There's also a spreadsheet showing a translation from Test::Unit and RSpec to Wr
100
98
 
101
99
  And don't miss the [slideshare presentation](http://www.slideshare.net/alexchaffee/wrong-5069976).
102
100
 
101
+ ## Test Framework Adapters ##
102
+
103
+ Adapters for various test frameworks sit under wrong/adapters.
104
+
105
+ Currently we support
106
+
107
+ * Test::Unit - `require 'wrong/adapters/test_unit'`
108
+ * Minitest - `require 'wrong/adapters/minitest'`
109
+ * RSpec - `require 'wrong/adapters/rspec'` (now supports both 1.3 and 2.0)
110
+
111
+ To use these, put the appropriate `require` in your helper, **after** requiring your test framework; it should extend the framework enough that you can use `assert { }` in your test cases without extra fussing around.
112
+
113
+ For example:
114
+
115
+ require "test/unit"
116
+ require "wrong/adapters/test_unit"
117
+ class PlusTest < Test::Unit::TestCase
118
+ def test_adding_two_and_two
119
+ assert { 2 + 2 == 4 }
120
+ end
121
+ end
122
+
123
+ ---
124
+
125
+ require "rspec"
126
+ require "wrong/adapters/rspec"
127
+ describe "plus" do
128
+ it "adds two and two" do
129
+ assert { 2 + 2 == 4 }
130
+ end
131
+ end
132
+
103
133
  ## Piecemeal Usage ##
104
134
 
105
- We know that sometimes you don't want all the little doodads from a library cluttering up your namespace. If you **don't** do
135
+ We know that sometimes you don't want all the little doodads from a library cluttering up your namespace. If you **don't** want to do
106
136
 
107
137
  require 'wrong'
108
138
  include Wrong
@@ -121,6 +151,30 @@ To summarize: if you do `require 'wrong'` and `include Wrong` then you will get
121
151
 
122
152
  And beware: if you don't `require 'wrong'`, then `include Wrong` will not do anything at all.
123
153
 
154
+ ## Gotcha: Side Effects Within the Assert Block ##
155
+
156
+ Be careful about making calls within the assert block that cause state changes.
157
+
158
+ @x = 1
159
+ def increment
160
+ @x += 1
161
+ end
162
+
163
+ assert { increment == 2 }
164
+ assert { increment == 2 }
165
+ ==> Expected (increment == 2), but
166
+ increment is 5
167
+
168
+ The first time increment fires the result is 2. The second time the result is 3, and then Wrong introspects the block to create a good failure message, causing increment to fire a couple more times.
169
+
170
+ Confusing, we know! A few patient Wrong users have hit this when the assert involves ActiveRecord write methods like #create! and #save.
171
+
172
+ The fix: introduce a variable:
173
+
174
+ value = increment
175
+ assert { value == 2 }
176
+ assert { value == 2 }
177
+
124
178
  ## Apology ##
125
179
 
126
180
  So does the world need another assertion framework? In fact, it does not! We actually believe the world needs **fewer** assert methods.
@@ -149,29 +203,31 @@ You get all the information you want, and none you don't want. At least, that's
149
203
 
150
204
  ## BDD with Wrong ##
151
205
 
152
- Wrong is compatible with RSpec and MiniTest::Spec, and probably Cucumber too, so you can use it inside your BDD framework of choice. To make your test code even BDD-er, try aliasing `assert` to either `should` or (Alex's favorite) `expect`.
206
+ Wrong is compatible with RSpec and MiniTest::Spec, and probably Cucumber too, so you can use it inside your BDD framework of choice. To make your test code even BDD-er, try aliasing `assert` to either `should` or (Alex's favorite) `expect`.
153
207
 
154
- Here's an RSpec example:
208
+ Here's an RSpec example:
155
209
 
156
- require "wrong"
210
+ require "wrong"
157
211
  require "wrong/adapters/rspec"
158
- Wrong.config.alias_assert :expect
159
-
212
+ Wrong.config.alias_assert :expect_that
213
+
160
214
  describe BleuCheese do
161
215
  it "stinks" do
162
- expect { BleuCheese.new.smell > 9000 }
163
- end
216
+ expect_that { BleuCheese.new.smell > 9000 }
217
+ end
164
218
  end
165
219
 
166
- This makes your code read like a BDD-style DSL, without RSpec's arcane "should" syntax (which is, let's face it, pretty weird the first few hundred times you have to use it). Compare
220
+ This makes your code read like a BDD-style DSL, without RSpec's "should" syntax (which is, let's face it, pretty weird the first few hundred times you have to use it). Compare
167
221
 
168
- expect { BleuCheese.new.smell > 9000 }
222
+ expect_that { BleuCheese.new.smell > 9000 }
169
223
 
170
224
  to
171
-
225
+
172
226
  BleuCheese.new.smell.should > 9000
173
227
 
174
- and seriously, tell me which one more clearly describes the desired behavior. The object under test doesn't really have a `should` method, so why should it magically get one during a test? And in what human language is "should greater than" a valid phrase?
228
+ and consider which one more clearly describes the desired behavior. The object under test doesn't really have a `should` method, so why should it magically get one during a test? And in what human language is "should greater than" a valid phrase?
229
+
230
+ Warning: currently the use of `alias_assert :expect` is **not** compatible with RSpec, since RSpec also defines `expect` as a synonym for `lambda`. If you really want to use `expect` as an alias form `assert`, then use `Wrong.config.alias_assert :expect, :override => true`. See [issue #6](https://github.com/sconover/wrong/issues/6) for more details.
175
231
 
176
232
  ## Algorithm ##
177
233
 
@@ -191,19 +247,9 @@ Before you get your knickers in a twist about how this is totally unacceptable b
191
247
  * You can't use metaprogramming to write your assert blocks.
192
248
  * All variables and methods must be available in the binding of the assert block.
193
249
  * Passing a proc around and eventually calling assert on it might not work in some Ruby implementations.
250
+ * Beware of Side Effects! (See discussion elsewhere in this document.)
194
251
  * "Doesn't all this parsing slow down my test run"? No - this applies to failure cases only. If the assert block returns true then Wrong simply moves on.
195
252
 
196
- ## Adapters ##
197
-
198
- Adapters for various test frameworks sit under wrong/adapters.
199
-
200
- Currently we support
201
-
202
- * Test::Unit - `require 'wrong/adapters/test_unit'`
203
- * Minitest - `require 'wrong/adapters/minitest'`
204
- * RSpec - `require 'wrong/adapters/rspec'` (now supports both 1.3 and 2.0)
205
-
206
- To use these, put the appropriate `require` in your helper, **after** requiring your test framework; it should extend the framework enough that you can use `assert { }` in your test cases without extra fussing around.
207
253
 
208
254
  ## Explanations ##
209
255
 
@@ -256,11 +302,12 @@ To use the Array formatter, you may also need to `gem install diff-lcs` (it's an
256
302
  assert { "the quick brown fox jumped over the lazy dog" ==
257
303
  "the quick brown hamster jumped over the lazy gerbil" }
258
304
  ==>
259
- Expected ("the quick brown fox jumped over the lazy dog" == "the quick brown hamster jumped over the lazy gerbil"), but
260
- Strings differ at position 16:
261
- first: ..."quick brown fox jumped over the lazy dog"
262
- second: ..."quick brown hamster jumped over the lazy gerbil"
263
- --
305
+ Expected ("the quick brown fox jumped over the lazy dog" == "the quick brown hamster jumped over the lazy gerbil"), but
306
+ Strings differ at position 16:
307
+ first: ..."quick brown fox jumped over the lazy dog"
308
+ second: ..."quick brown hamster jumped over the lazy gerbil"
309
+
310
+ ---
264
311
 
265
312
  require "wrong/message/array_diff"
266
313
  assert { ["venus", "mars", "pluto", "saturn"] ==
@@ -301,14 +348,14 @@ in your `.wrong` file and get ready to be **bedazzled**. If you need custom colo
301
348
 
302
349
  ### Aliases ###
303
350
 
304
- An end to the language wars! Name your "assert" and "deny" methods anything you want.
351
+ An end to the language wars! Name your "assert" and "deny" methods anything you want.
305
352
 
306
353
  * In your code, use `Wrong.config.alias_assert` and `Wrong.config.alias_deny`
307
354
  * In your `.wrong` file, put `alias_assert :expect` on a line by itself
308
355
 
309
356
  Here are some suggestions:
310
357
 
311
- alias_assert :expect
358
+ alias_assert :expect # warning: not compatible with RSpec
312
359
  alias_assert :should # This looks nice in RSpec
313
360
  alias_assert :confirm
314
361
  alias_assert :be
@@ -28,7 +28,7 @@ if Object.const_defined? :RSpec
28
28
  module Core
29
29
  class ExampleGroup
30
30
  include Wrong
31
-
31
+
32
32
  def failure_class
33
33
  RSpec::Expectations::ExpectationNotMetError
34
34
  end
@@ -36,6 +36,25 @@ if Object.const_defined? :RSpec
36
36
  end
37
37
  end
38
38
 
39
+ # Disallow alias_assert :expect
40
+ module Wrong
41
+ class Config
42
+ alias :alias_assert_or_deny_original :alias_assert_or_deny
43
+ def alias_assert_or_deny(valence, extra_name, options = {})
44
+ if extra_name.to_sym == :expect
45
+ if options[:override]
46
+ RSpec::Matchers.class_eval do
47
+ remove_method(:expect)
48
+ end
49
+ else
50
+ raise ConfigError.new("RSpec already has a method named #{extra_name}. Use alias_#{valence} :#{extra_name}, :override => true if you really want to do this.")
51
+ end
52
+ end
53
+ alias_assert_or_deny_original(valence, extra_name, options)
54
+ end
55
+ end
56
+ end
57
+
39
58
  elsif Object.const_defined? :Spec
40
59
  # RSpec 1
41
60
  Spec::Runner.configure do |config|
@@ -46,6 +65,26 @@ elsif Object.const_defined? :Spec
46
65
  end
47
66
  end
48
67
 
68
+ # Disallow alias_assert :expect
69
+ module Wrong
70
+ class Config
71
+ alias :alias_assert_or_deny_original :alias_assert_or_deny
72
+ def alias_assert_or_deny(valence, extra_name, options = {})
73
+ if extra_name.to_sym == :expect
74
+ if options[:override]
75
+ Spec::Example::ExampleMethods.class_eval do
76
+ remove_method(:expect)
77
+ end
78
+ else
79
+ raise ConfigError.new("RSpec already has a method named #{extra_name}. Use alias_#{valence} :#{extra_name}, :override => true if you really want to do this.")
80
+ end
81
+ end
82
+ alias_assert_or_deny_original(valence, extra_name, options)
83
+ end
84
+ end
85
+ end
86
+
87
+
49
88
  else
50
89
  raise "Wrong's RSpec adapter can't find RSpec. Please require 'spec' or 'rspec' before requiring 'wrong/adapters/rspec'."
51
90
  end
@@ -1,5 +1,32 @@
1
1
  require "wrong"
2
2
 
3
+ def wrong_adapter_failure(why)
4
+ $stderr.puts why
5
+ $stderr.puts <<-TEXT
6
+ Make sure to use Bundler or Rubygems to load the test-unit gem. For example:
7
+ require 'rubygems'
8
+ gem 'test-unit'
9
+ require 'test/unit'
10
+ require 'wrong/adapters/test_unit'
11
+ TEXT
12
+ exit 1
13
+ end
14
+
15
+ if Test::Unit.const_defined? :TEST_UNIT_IMPLEMENTATION
16
+ wrong_adapter_failure "You are using MiniTest's compatibility layer, not the real Test::Unit."
17
+ end
18
+
19
+ begin
20
+ require "test/unit/version"
21
+ v = Test::Unit::VERSION
22
+ wrong_adapter_failure "Test::Unit version 2.1.2 or greater required." if v < "2.1.2"
23
+
24
+ require 'test/unit/failure'
25
+ Test::Unit::TestResultFailureSupport # this class is only in 2.x, to catch mixups between 1.8's lib and gem versions
26
+ rescue => e
27
+ wrong_adapter_failure "You are using an outdated version of Test::Unit."
28
+ end
29
+
3
30
  class Test::Unit::TestCase
4
31
  include Wrong
5
32
 
@@ -7,3 +34,9 @@ class Test::Unit::TestCase
7
34
  Test::Unit::AssertionFailedError
8
35
  end
9
36
  end
37
+
38
+ module Wrong::Assert
39
+ def increment_assertion_count
40
+ @_result.add_assertion if @_result
41
+ end
42
+ end
@@ -55,13 +55,17 @@ module Wrong
55
55
  @@last_predicated_error ||= nil
56
56
  end
57
57
 
58
+ # override (redefine) in adapter if necessary
59
+ def increment_assertion_count
60
+ end
61
+
58
62
  def aver(valence, explanation = nil, depth = 0, &block)
63
+ increment_assertion_count
59
64
  require "wrong/rainbow" if Wrong.config[:color]
60
65
 
61
66
  value = block.call
62
67
  value = !value if valence == :deny
63
68
  unless value
64
-
65
69
  chunk = Wrong::Chunk.from_block(block, depth + 2)
66
70
 
67
71
  message = FailureMessage.new(chunk, valence, explanation).full
@@ -294,7 +294,11 @@ public # don't know exactly why this needs to be public but eval'ed code can't f
294
294
  end
295
295
 
296
296
  def self.terminal_width
297
- terminal_size && terminal_size.first
297
+ @terminal_width || (terminal_size && terminal_size.first) || 80
298
+ end
299
+
300
+ def self.terminal_width= forced_with
301
+ @terminal_width = forced_with
298
302
  end
299
303
 
300
304
  # Determines if a shell command exists by searching for it in ENV['PATH'].
@@ -4,6 +4,5 @@ module Wrong
4
4
  (self.to_f - other.to_f).abs < tolerance
5
5
  end
6
6
  end
7
- Float.send :include, CloseTo
8
- Fixnum.send :include, CloseTo
7
+ Numeric.send :include, CloseTo
9
8
  end
@@ -1,6 +1,7 @@
1
1
  require "wrong/chunk"
2
2
 
3
3
  module Wrong
4
+
4
5
  def self.load_config
5
6
  settings = begin
6
7
  Chunk.read_here_or_higher(".wrong")
@@ -20,7 +21,11 @@ module Wrong
20
21
  end
21
22
 
22
23
  class Config < Hash
23
- def initialize(string = nil)
24
+
25
+ class ConfigError < RuntimeError
26
+ end
27
+
28
+ def initialize(string = nil)
24
29
  self[:aliases] = {:assert => [:assert], :deny => [:deny]}
25
30
  if string
26
31
  instance_eval string.gsub(/^(.*=)/, "self.\\1")
@@ -35,18 +40,18 @@ module Wrong
35
40
  self[name.to_sym] = value
36
41
  end
37
42
 
38
- def alias_assert_or_deny(valence, extra_name)
43
+ def alias_assert_or_deny(valence, extra_name, options)
39
44
  Wrong::Assert.send(:alias_method, extra_name, valence)
40
45
  new_method_name = extra_name.to_sym
41
46
  self[:aliases][valence] << new_method_name unless self[:aliases][valence].include?(new_method_name)
42
47
  end
43
48
 
44
- def alias_assert(method_name)
45
- alias_assert_or_deny(:assert, method_name)
49
+ def alias_assert(method_name, options = {})
50
+ alias_assert_or_deny(:assert, method_name, options)
46
51
  end
47
52
 
48
- def alias_deny(method_name)
49
- alias_assert_or_deny(:deny, method_name)
53
+ def alias_deny(method_name, options = {})
54
+ alias_assert_or_deny(:deny, method_name, options)
50
55
  end
51
56
 
52
57
  def assert_method_names
@@ -1,5 +1,6 @@
1
1
  require "sexp"
2
2
  require "wrong/chunk"
3
+ require "pp"
3
4
 
4
5
  class ::Sexp < ::Array
5
6
  def d?
@@ -26,7 +27,9 @@ module Wrong
26
27
  end
27
28
 
28
29
  code = sexp.to_ruby
29
- value = eval(code, block.binding, called_from[0], called_from[1].to_i).inspect
30
+ value = eval(code, block.binding, called_from[0], called_from[1].to_i)
31
+ width = Chunk.terminal_width
32
+ value = PP.pp(value, "", width - (code.size + 3)).chomp
30
33
 
31
34
  if Wrong.config[:color]
32
35
  require "wrong/rainbow"
@@ -1,3 +1,3 @@
1
1
  module Wrong
2
- VERSION = "0.5.0" unless defined?(Wrong::VERSION)
2
+ VERSION = "0.5.2" unless defined?(Wrong::VERSION)
3
3
  end
@@ -22,6 +22,38 @@ describe "wrong's failure" do
22
22
  end
23
23
  end
24
24
 
25
+ describe "alias_assert" do
26
+ it "works for an innocuous name" do
27
+ e = rescuing {
28
+ Wrong.config.alias_assert :allow
29
+ }
30
+ e.should be_nil
31
+ end
32
+
33
+ describe ":expect" do
34
+ it "fails if RSpec is active" do
35
+ e = rescuing {
36
+ Wrong.config.alias_assert :expect
37
+ }
38
+ e.should be_a(Wrong::Config::ConfigError)
39
+ end
40
+
41
+ it "works if we pass :override => true" do
42
+ e = rescuing {
43
+ Wrong.config.alias_assert :expect, :override => true
44
+ }
45
+ e.should be_nil
46
+
47
+ e = rescuing {
48
+ expect { false }
49
+ }
50
+ e.should_not be_nil
51
+ e.should be_a(Spec::Expectations::ExpectationNotMetError)
52
+ end
53
+ end
54
+ end
55
+
56
+
25
57
  describe "arithmetic" do
26
58
  it "should not work like this" do
27
59
  assert { 2 + 2 == 5 }
@@ -17,6 +17,7 @@ puts RSpec::Core::Version::STRING
17
17
  require 'rspec/autorun'
18
18
  require "wrong/adapters/rspec"
19
19
 
20
+ # these first ones should pass, since they describe how Wrong works inside the RSpec ecosystem
20
21
  describe "wrong's failure" do
21
22
  it "is an RSpec exception" do
22
23
  e = rescuing {
@@ -26,6 +27,37 @@ describe "wrong's failure" do
26
27
  end
27
28
  end
28
29
 
30
+ describe "alias_assert" do
31
+ it "works for an innocuous name" do
32
+ e = rescuing {
33
+ Wrong.config.alias_assert :allow
34
+ }
35
+ e.should be_nil
36
+ end
37
+
38
+ describe ":expect" do
39
+ it "fails if RSpec is active" do
40
+ e = rescuing {
41
+ Wrong.config.alias_assert :expect
42
+ }
43
+ e.should be_a(Wrong::Config::ConfigError)
44
+ end
45
+
46
+ it "works if we pass :override => true" do
47
+ e = rescuing {
48
+ Wrong.config.alias_assert :expect, :override => true
49
+ }
50
+ e.should be_nil
51
+
52
+ e = rescuing {
53
+ expect { false }
54
+ }
55
+ e.should_not be_nil
56
+ e.should be_a(RSpec::Expectations::ExpectationNotMetError)
57
+ end
58
+ end
59
+ end
60
+
29
61
  describe "arithmetic" do
30
62
  it "should not work like this" do
31
63
  assert { 2 + 2 == 5 }
@@ -36,7 +36,7 @@ describe "testing rspec" do
36
36
  (rspec_version == 1 || RUBY_VERSION =~ /^1\.8\./ || RUBY_VERSION == '1.9.1' ? nil : 1) # RSpec v1 exits with 0 on failure :-(
37
37
  end
38
38
 
39
- assert { spec_output.include? "2 examples, 1 failure" }
39
+ assert { spec_output.include? "1 failure" }
40
40
  assert { spec_output.include? "Expected ((2 + 2) == 5), but" }
41
41
  end
42
42
  end
@@ -1,8 +1,10 @@
1
- require "./test/test_helper"
1
+ here = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift "#{here}/../../lib"
2
3
 
4
+ # gem "test-unit"
3
5
  require "test/unit"
6
+ require "test/unit/autorunner"
4
7
 
5
- #require "wrong/assert"
6
8
  require "wrong/adapters/test_unit"
7
9
 
8
10
  # get rid of atrocious Test::Unit color scheme (gray on green = puke)
@@ -19,21 +21,21 @@ class MyFailingAssertTest < Test::Unit::TestCase
19
21
  assert{1==2}
20
22
  end
21
23
  end
22
-
24
+
23
25
  my_failing_deny_test = Class.new(Test::Unit::TestCase)
24
26
  my_failing_deny_test.class_eval do
25
27
  def test_fail
26
28
  deny{1==1}
27
29
  end
28
30
  end
29
-
31
+
30
32
  result = Test::Unit::TestResult.new
31
33
  my_failing_assert_test.new("test_fail").run(result) {|started, name| }
32
34
  #I can do without all the TU Listener business, thank you
33
35
  failures = result.instance_variable_get("@failures".to_sym)
34
36
  assert{ failures.length==1 }
35
37
  assert{ failures.first.long_display.include?("Expected (1 == 2)") }
36
-
38
+
37
39
  result = Test::Unit::TestResult.new
38
40
  failures = result.instance_variable_get("@failures".to_sym)
39
41
  my_failing_deny_test.new("test_fail").run(result) {|started, name| }
@@ -57,3 +59,30 @@ class MyFailingAssertTest < Test::Unit::TestCase
57
59
  assert { e.message == "up is down.\n<false> is not true." }
58
60
  end
59
61
  end
62
+
63
+ class TestUnitAdapterTest < Test::Unit::TestCase
64
+ def setup
65
+ @add_assertion_called = 0
66
+ end
67
+
68
+ def add_assertion
69
+ super
70
+ @add_assertion_called += 1
71
+ end
72
+
73
+ def current_result
74
+ @_result
75
+ end
76
+
77
+ def test_assert_bumps_assertion_count
78
+ assertion_count = current_result.assertion_count
79
+ assert { true }
80
+ assert_equal assertion_count+1, current_result.assertion_count
81
+ end
82
+
83
+ def test_assert_calls_add_assertion
84
+ assert_equal 0, @add_assertion_called
85
+ assert { true }
86
+ assert_equal 1, @add_assertion_called
87
+ end
88
+ end
@@ -28,7 +28,14 @@ describe "a tool for capturing output" do
28
28
 
29
29
  assert { out == "hi\n"}
30
30
  assert { err == "bye\n"}
31
+ end
32
+
33
+ it "returns an empty string if nothing was emitted" do
34
+ out, err = capturing(:stdout, :stderr) do
35
+ end
31
36
 
37
+ assert { out == ""}
38
+ assert { err == ""}
32
39
  end
33
40
 
34
41
  it "supports nesting" do
@@ -2,12 +2,19 @@ here = File.expand_path(File.dirname(__FILE__))
2
2
  require "#{here}/test_helper"
3
3
  require "wrong/chunk"
4
4
  require 'yaml'
5
+ require 'wrong/helpers'
5
6
 
6
7
  unless Object.const_defined?(:Chunk)
7
8
  Chunk = Wrong::Chunk
8
9
  end
9
10
 
10
11
  describe Chunk do
12
+
13
+ # normalize yaml
14
+ def y(s)
15
+ s.gsub(/--- $/, "---").chomp
16
+ end
17
+
11
18
  describe "#from_block" do
12
19
  it "reads the source location" do
13
20
  file, line = __FILE__, __LINE__
@@ -177,21 +184,19 @@ z
177
184
  code_parts = chunk.parts
178
185
  assert !code_parts.include?("rescuing")
179
186
  end
180
-
187
+
181
188
  it "skips assignments" do
182
189
  chunk = Chunk.new(__FILE__, __LINE__ + 1); <<-CODE
183
190
  x = 7; x
184
191
  CODE
185
192
  assert !chunk.parts.include?("(x = 7)")
186
- end
193
+ end
187
194
  end
188
195
 
189
196
  describe "#details" do
190
197
  def details(&block)
191
198
  chunk = Chunk.from_block(block, 1)
192
- d = chunk.details
193
- # puts d
194
- d
199
+ chunk.details
195
200
  end
196
201
 
197
202
  it "returns an empty string if there are no parts" do
@@ -256,14 +261,14 @@ z
256
261
  # this means it's a literal slash plus t inside double quotes -- i.e. it shows the escaped (inspected) string
257
262
  assert d == "\n" + ' x is "flavor:\tvanilla"' + "\n"
258
263
  end
259
-
264
+
260
265
  it "splits lower-down details correctly (bug)" do
261
266
  hash = {:flavor => "vanilla"}
262
267
  exception_with_newlines = Exception.new(hash.to_yaml.chomp)
263
268
  d = details {
264
269
  rescuing { raise exception_with_newlines }.message.include?(":flavor: chocolate")
265
270
  }
266
- assert d.include? "exception_with_newlines is #<Exception: --- \n :flavor: vanilla>"
271
+ assert (y(d).include? "exception_with_newlines is #<Exception: ---\n :flavor: vanilla>"), d.inspect
267
272
  end
268
273
 
269
274
  it "skips assignments" do
@@ -277,19 +282,19 @@ z
277
282
  def initialize(inspected_value)
278
283
  @inspected_value = inspected_value
279
284
  end
280
-
285
+
281
286
  def inspect
282
287
  @inspected_value
283
288
  end
284
289
  end
285
-
290
+
286
291
 
287
292
  it "indents unescaped newlines inside the inspected value" do
288
293
  x = Weirdo.new("first\nsecond\nthird")
289
294
  d = details { assert { x == "foo" } }
290
295
  assert d == "\n x is first\n second\n third\n"
291
296
  end
292
-
297
+
293
298
  describe '#pretty_value' do
294
299
  before do
295
300
  @chunk = chunk = Chunk.new(__FILE__, __LINE__ + 1); <<-CODE
@@ -297,23 +302,37 @@ z
297
302
  CODE
298
303
  end
299
304
 
305
+ after do
306
+ Chunk.terminal_width = 80
307
+ end
308
+
300
309
  it 'inspects its value' do
301
310
  assert @chunk.pretty_value(12) == "12"
302
311
  assert @chunk.pretty_value("foo") == "\"foo\""
303
312
  end
304
-
313
+
305
314
  it 'escapes newlines in strings' do
306
315
  assert @chunk.pretty_value("foo\nbar\nbaz") == "\"foo\\nbar\\nbaz\""
307
316
  end
308
-
317
+
309
318
  it 'indents newlines in raw inspect values (e.g. exceptions or YAML or whatever)' do
310
319
  w = Weirdo.new("foo\nbar\nbaz")
311
320
  assert @chunk.pretty_value(w) == "foo\n bar\n baz"
312
321
  end
313
-
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
+
314
333
  # def pretty_value(value, starting_col = 0, indent_wrapped_lines = 3, size = Chunk.terminal_size)
315
-
316
- it 'inserts newlines in really long values, wrapped at the terminal width' do
334
+
335
+ it 'inserts newlines in really long values, wrapped at the given width' do
317
336
  abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
318
337
  pretty = @chunk.pretty_value(abc, 0, 0, 10)
319
338
  assert pretty == <<-DONE.chomp
@@ -322,7 +341,18 @@ klmnopqrst
322
341
  uvwxyz
323
342
  DONE
324
343
  end
325
-
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
+
326
356
  it 'subtracts the starting column from the wrapped width of the first line' do
327
357
  abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
328
358
  pretty = @chunk.pretty_value(abc, 2, 0, 10)
@@ -332,7 +362,7 @@ ijklmnopqr
332
362
  stuvwxyz
333
363
  DONE
334
364
  end
335
-
365
+
336
366
  it "indents wrapped lines" do
337
367
  abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
338
368
  pretty = @chunk.pretty_value(abc, 2, 3, 10)
@@ -343,17 +373,18 @@ abcdefgh
343
373
  wxyz
344
374
  DONE
345
375
  end
346
-
376
+
347
377
  it "wraps correctly" do
348
378
  hash = {:flavor => "vanilla"}
349
379
  object = Weirdo.new(hash.to_yaml.chomp)
350
380
  pretty = @chunk.pretty_value(object, 2, 3, 80)
351
- assert pretty == <<-DONE.chomp
352
- ---
381
+ assert y(pretty) == y(<<-DONE), pretty.inspect
382
+ ---
353
383
  :flavor: vanilla
354
384
  DONE
355
385
  end
356
386
 
387
+
357
388
  end
358
389
 
359
390
  end
@@ -1,6 +1,7 @@
1
1
  require "./test/test_helper"
2
2
  require "wrong/close_to"
3
3
  require "wrong"
4
+ require "bigdecimal"
4
5
 
5
6
  describe "#close_to? (monkey patch for float comparison)" do
6
7
  include Wrong
@@ -35,5 +36,11 @@ describe "#close_to? (monkey patch for float comparison)" do
35
36
  deny { 5.close_to? 5.1 }
36
37
  assert { 5.close_to? 5.1, 0.5 }
37
38
  end
39
+
40
+ it "also works for bigdecimals" do
41
+ assert { BigDecimal.new("5.0").close_to? 5 }
42
+ assert { BigDecimal.new("5.0").close_to? 5.0001 }
43
+ deny { BigDecimal.new("5.0").close_to? 5.1 }
44
+ end
38
45
 
39
46
  end
@@ -22,6 +22,15 @@ describe "d" do
22
22
  assert { output == "x is \"one\\ttwo\"\n" }
23
23
  end
24
24
 
25
+ it "pretty-prints the value" do
26
+ Wrong::Chunk.terminal_width = 80
27
+ x = {:a => "a" * 60, :b => "b" * 60}
28
+ output = capturing do
29
+ d { x }
30
+ end
31
+ assert { output == "x is {:a=>\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n :b=>\"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"}\n" }
32
+ end
33
+
25
34
  it "works on an expression" do
26
35
  x = 5
27
36
  output = capturing do
metadata CHANGED
@@ -1,111 +1,93 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: wrong
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 5
8
- - 0
9
- version: 0.5.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ prerelease:
10
6
  platform: java
11
- authors:
7
+ authors:
12
8
  - Steve Conover
13
9
  - Alex Chaffee
14
10
  autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
-
18
- date: 2010-12-08 00:00:00 -08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
13
+ date: 2011-07-07 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
22
16
  name: predicated
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &2162741940 !ruby/object:Gem::Requirement
24
18
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 2
31
- - 2
32
- version: 0.2.2
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.2.3
33
23
  type: :runtime
34
24
  prerelease: false
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *2162741940
26
+ - !ruby/object:Gem::Dependency
37
27
  name: ruby_parser
38
- requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirement: &2162741440 !ruby/object:Gem::Requirement
39
29
  none: false
40
- requirements:
30
+ requirements:
41
31
  - - ~>
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 2
45
- - 0
46
- - 4
32
+ - !ruby/object:Gem::Version
47
33
  version: 2.0.4
48
34
  type: :runtime
49
35
  prerelease: false
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *2162741440
37
+ - !ruby/object:Gem::Dependency
52
38
  name: ruby2ruby
53
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &2162740980 !ruby/object:Gem::Requirement
54
40
  none: false
55
- requirements:
41
+ requirements:
56
42
  - - ~>
57
- - !ruby/object:Gem::Version
58
- segments:
59
- - 1
60
- - 2
61
- version: "1.2"
43
+ - !ruby/object:Gem::Version
44
+ version: '1.2'
62
45
  type: :runtime
63
46
  prerelease: false
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *2162740980
48
+ - !ruby/object:Gem::Dependency
66
49
  name: sexp_processor
67
- requirement: &id004 !ruby/object:Gem::Requirement
50
+ requirement: &2162740520 !ruby/object:Gem::Requirement
68
51
  none: false
69
- requirements:
52
+ requirements:
70
53
  - - ~>
71
- - !ruby/object:Gem::Version
72
- segments:
73
- - 3
74
- - 0
75
- version: "3.0"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
76
56
  type: :runtime
77
57
  prerelease: false
78
- version_requirements: *id004
79
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *2162740520
59
+ - !ruby/object:Gem::Dependency
80
60
  name: diff-lcs
81
- requirement: &id005 !ruby/object:Gem::Requirement
61
+ requirement: &2162740060 !ruby/object:Gem::Requirement
82
62
  none: false
83
- requirements:
63
+ requirements:
84
64
  - - ~>
85
- - !ruby/object:Gem::Version
86
- segments:
87
- - 1
88
- - 1
89
- - 2
65
+ - !ruby/object:Gem::Version
90
66
  version: 1.1.2
91
67
  type: :runtime
92
68
  prerelease: false
93
- version_requirements: *id005
94
- description: |-
95
- Wrong provides a general assert method that takes a predicate block. Assertion failure
69
+ version_requirements: *2162740060
70
+ description: ! 'Wrong provides a general assert method that takes a predicate block.
71
+ Assertion failure
72
+
96
73
  messages are rich in detail. The Wrong idea is to replace all those countless assert_this,
97
- assert_that library methods which only exist to give a more useful failure message than
98
- "assertion failed". Wrong replaces all of them in one fell swoop, since if you can write it
99
- in Ruby, Wrong can make a sensible failure message out of it. Also provided are several
100
- helper methods, like rescuing, capturing, and d.
74
+
75
+ assert_that library methods which only exist to give a more useful failure message
76
+ than
77
+
78
+ "assertion failed". Wrong replaces all of them in one fell swoop, since if you can
79
+ write it
80
+
81
+ in Ruby, Wrong can make a sensible failure message out of it. Also provided are
82
+ several
83
+
84
+ helper methods, like rescuing, capturing, and d.'
101
85
  email: sconover@gmail.com
102
86
  executables: []
103
-
104
87
  extensions: []
105
-
106
- extra_rdoc_files:
88
+ extra_rdoc_files:
107
89
  - README.markdown
108
- files:
90
+ files:
109
91
  - lib/wrong/adapters/minitest.rb
110
92
  - lib/wrong/adapters/rspec.rb
111
93
  - lib/wrong/adapters/test_unit.rb
@@ -168,40 +150,35 @@ files:
168
150
  - test/suite.rb
169
151
  - test/test_helper.rb
170
152
  - test/wrong_test.rb
171
- has_rdoc: true
172
153
  homepage: http://github.com/sconover/wrong
173
154
  licenses: []
174
-
175
155
  post_install_message:
176
156
  rdoc_options: []
177
-
178
- require_paths:
157
+ require_paths:
179
158
  - lib
180
- required_ruby_version: !ruby/object:Gem::Requirement
159
+ required_ruby_version: !ruby/object:Gem::Requirement
181
160
  none: false
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- hash: 401403040534659610
186
- segments:
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ segments:
187
166
  - 0
188
- version: "0"
189
- required_rubygems_version: !ruby/object:Gem::Requirement
167
+ hash: 4298502534753736492
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
169
  none: false
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- segments:
195
- - 0
196
- version: "0"
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
197
174
  requirements: []
198
-
199
175
  rubyforge_project: wrong
200
- rubygems_version: 1.3.7
176
+ rubygems_version: 1.8.5
201
177
  signing_key:
202
178
  specification_version: 3
203
- summary: Wrong provides a general assert method that takes a predicate block. Assertion failure messages are rich in detail.
204
- test_files:
179
+ summary: Wrong provides a general assert method that takes a predicate block. Assertion
180
+ failure messages are rich in detail.
181
+ test_files:
205
182
  - test/adapters/minitest_test.rb
206
183
  - test/adapters/railsapp/app/controllers/application_controller.rb
207
184
  - test/adapters/railsapp/app/helpers/application_helper.rb