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
@@ -1,5 +1,6 @@
1
1
  require "./test/test_helper"
2
2
  require "wrong/assert"
3
+ require "wrong/chunk"
3
4
  require "wrong/failure_message"
4
5
 
5
6
  class BogusFormatter < Wrong::FailureMessage::Formatter
@@ -15,6 +16,11 @@ end
15
16
  class BogusPredicate < Predicated::Predicate
16
17
  end
17
18
 
19
+ # normalize yaml
20
+ def y(s)
21
+ s.gsub(/--- $/, "---").chomp
22
+ end
23
+
18
24
  module Wrong
19
25
 
20
26
  describe Wrong::FailureMessage::Formatter do
@@ -27,13 +33,13 @@ module Wrong
27
33
  end
28
34
  end
29
35
 
30
- describe Wrong::FailureMessage do
36
+ describe Wrong::FailureMessage do
31
37
  include Wrong::Assert
32
38
 
33
39
  it "can register a formatter class for a predicate pattern" do
34
40
  Wrong::FailureMessage.register_formatter(::BogusFormatter)
35
41
  assert { Wrong::FailureMessage.formatter_for(::BogusPredicate.new).is_a? ::BogusFormatter }
36
- assert { Wrong::FailureMessage.formatters.include?(::BogusFormatter)}
42
+ assert { Wrong::FailureMessage.formatters.include?(::BogusFormatter) }
37
43
  end
38
44
 
39
45
  before do
@@ -43,22 +49,21 @@ module Wrong
43
49
  end
44
50
 
45
51
  def message(options = {}, &block)
46
- valence = options[:valence] || :assert
52
+ valence = options[:valence] || :assert
47
53
  explanation = options[:explanation]
48
54
  Wrong::FailureMessage.new(@chunk, valence, explanation)
49
55
  end
50
56
 
51
-
52
- describe "#basic" do
57
+ describe "#basic" do
53
58
  it "shows the code" do
54
59
  assert { message.basic == "Expected ((2 + 2) == 5)" }
55
60
  end
56
-
61
+
57
62
  it "reverses the message for :deny valence" do
58
63
  assert { message(:valence => :deny).basic == "Didn't expect ((2 + 2) == 5)" }
59
64
  end
60
65
  end
61
-
66
+
62
67
  describe '#full' do
63
68
  it "contains the basic message" do
64
69
  assert { message.full.include? message.basic }
@@ -68,23 +73,217 @@ module Wrong
68
73
  msg = message(:explanation => "the sky is falling")
69
74
  assert { msg.full.include? "the sky is falling" }
70
75
  end
71
-
76
+
72
77
  it "doesn't say 'but' if there are no details" do
73
78
  @chunk = Wrong::Chunk.new(__FILE__, __LINE__ + 1) do
74
79
  2
75
80
  end
76
- assert { @chunk.details.empty? }
77
- deny { message.full.include? ", but"}
81
+ assert { message.details.empty? }
82
+ deny { message.full.include? ", but" }
78
83
  end
79
-
84
+
80
85
  it "says 'but' if there are details" do
81
86
  @chunk = Wrong::Chunk.new(__FILE__, __LINE__ + 1) do
82
87
  2 + 2 == 5
83
88
  end
84
- assert { message.full.include? ", but\n (2 + 2) is 4"}
89
+ assert { message.full.include? ", but\n (2 + 2) is 4" }
85
90
  end
86
-
87
91
  end
88
92
 
93
+ describe "#details" do
94
+ def details(&block)
95
+ @chunk = Wrong::Chunk.from_block(block, 1)
96
+ message.details
97
+ end
98
+
99
+ it "returns an empty string if there are no parts" do
100
+ d = details { assert { true } }
101
+ assert d == ""
102
+ end
103
+
104
+ it "returns an string beginning with a newline if there are parts" do
105
+ x = 10
106
+ d = details { assert { x == 10 } }
107
+ assert d == "\n x is 10\n"
108
+ end
109
+
110
+ it "skips literals" do
111
+ d = details { assert { 10 == 11 } }
112
+ assert d == ""
113
+ end
114
+
115
+ it "shows lots of details" do
116
+ x = 10
117
+ d = details { assert { (x * (x - 10)) == (x / (x + 10)) } }
118
+ assert d == <<-DETAILS
119
+
120
+ (x * (x - 10)) is 0
121
+ x is 10
122
+ (x - 10) is 0
123
+ (x / (x + 10)) is 0
124
+ (x + 10) is 20
125
+ DETAILS
126
+ end
127
+
128
+ it "skips duplicates" do
129
+ x = 10
130
+ d = details { assert { (x + 5) == 1 + (x + 5) } }
131
+ assert d == <<-DETAILS
132
+
133
+ (x + 5) is 15
134
+ x is 10
135
+ (1 + (x + 5)) is 16
136
+ DETAILS
137
+ end
138
+
139
+ it "shows exceptions" do
140
+ d = details { assert { (raise "hi") == 1 } }
141
+ assert d == "\n raise(\"hi\") raises RuntimeError: hi\n"
142
+ end
143
+
144
+ it "indents newlines inside the exception message" do
145
+ d = details { assert { (raise "hello\nsailor") == 1 } }
146
+ assert d == "\n raise(\"hello\\nsailor\") raises RuntimeError: hello\n sailor\n"
147
+ end
148
+
149
+ it "abridges exceptions with no message" do
150
+ d = details { assert { (raise Exception.new) == 1 } }
151
+ assert d == "\n raise(Exception.new) raises Exception\n" +
152
+ " Exception.new is #<Exception: Exception>\n"
153
+ end
154
+
155
+ it "inspects values" do
156
+ x = "flavor:\tvanilla"
157
+ d = details { assert { x == "flavor:\tchocolate" } }
158
+ # this means it's a literal slash plus t inside double quotes -- i.e. it shows the escaped (inspected) string
159
+ assert d == "\n" + ' x is "flavor:\tvanilla"' + "\n"
160
+ end
161
+
162
+ it "splits lower-down details correctly (bug)" do
163
+ hash = {:flavor => "vanilla"}
164
+ exception_with_newlines = Exception.new(hash.to_yaml.chomp)
165
+ d = details {
166
+ rescuing { raise exception_with_newlines }.message.include?(":flavor: chocolate")
167
+ }
168
+ assert (y(d).include? "exception_with_newlines is #<Exception: ---\n :flavor: vanilla>"), d.inspect
169
+ end
170
+
171
+ it "skips assignments" do
172
+ y = 14
173
+ d = details do
174
+ x = 7; y
175
+ end
176
+ assert d !~ /x = 7/
177
+ assert d =~ /y is 14/
178
+ end
179
+
180
+ class Weirdo
181
+ def initialize(inspected_value)
182
+ @inspected_value = inspected_value
183
+ end
184
+
185
+ def inspect
186
+ @inspected_value
187
+ end
188
+ end
189
+
190
+ it "indents unescaped newlines inside the inspected value" do
191
+ x = Weirdo.new("first\nsecond\nthird")
192
+ d = details { assert { x == "foo" } }
193
+ assert d == "\n x is first\n second\n third\n"
194
+ end
195
+
196
+ describe '#pretty_value' do
197
+ before do
198
+ @chunk = chunk = Chunk.new(__FILE__, __LINE__ + 1); <<-CODE
199
+ true
200
+ CODE
201
+ end
202
+
203
+ after do
204
+ Wrong::Terminal.width = 80
205
+ end
206
+
207
+ it 'inspects its value' do
208
+ assert message.pretty_value(12) == "12"
209
+ assert message.pretty_value("foo") == "\"foo\""
210
+ end
211
+
212
+ it 'escapes newlines in strings' do
213
+ assert message.pretty_value("foo\nbar\nbaz") == "\"foo\\nbar\\nbaz\""
214
+ end
215
+
216
+ it 'indents newlines in raw inspect values (e.g. exceptions or YAML or whatever)' do
217
+ w = Weirdo.new("foo\nbar\nbaz")
218
+ assert message.pretty_value(w) == "foo\n bar\n baz"
219
+ end
220
+
221
+ it "returns the terminal width" do
222
+ assert Terminal.width.is_a? Fixnum
223
+ assert Terminal.width > 0
224
+ end
225
+
226
+ it "can fake the terminal width" do
227
+ Terminal.width = 66
228
+ assert Terminal.width == 66
229
+ end
230
+
231
+ # def pretty_value(value, starting_col = 0, indent_wrapped_lines = 3, size = Terminal.size)
232
+
233
+ it 'inserts newlines in really long values, wrapped at the given width' do
234
+ abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
235
+ pretty = message.pretty_value(abc, 0, 0, 10)
236
+ assert pretty == <<-DONE.chomp
237
+ abcdefghij
238
+ klmnopqrst
239
+ uvwxyz
240
+ DONE
241
+ end
242
+
243
+ it 'inserts newlines in really long values, wrapped at the terminal width' do
244
+ Terminal.width = 10
245
+ abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
246
+ pretty = message.pretty_value(abc, 0, 0)
247
+ assert pretty == <<-DONE.chomp
248
+ abcdefghij
249
+ klmnopqrst
250
+ uvwxyz
251
+ DONE
252
+ end
253
+
254
+ it 'subtracts the starting column from the wrapped width of the first line' do
255
+ abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
256
+ pretty = message.pretty_value(abc, 2, 0, 10)
257
+ assert pretty == <<-DONE.chomp
258
+ abcdefgh
259
+ ijklmnopqr
260
+ stuvwxyz
261
+ DONE
262
+ end
263
+
264
+ it "indents wrapped lines" do
265
+ abc = Weirdo.new("abcdefghijklmnopqrstuvwxyz")
266
+ pretty = message.pretty_value(abc, 2, 3, 10)
267
+ assert pretty == <<-DONE.chomp
268
+ abcdefgh
269
+ ijklmno
270
+ pqrstuv
271
+ wxyz
272
+ DONE
273
+ end
274
+
275
+ it "wraps correctly" do
276
+ hash = {:flavor => "vanilla"}
277
+ object = Weirdo.new(hash.to_yaml.chomp)
278
+ pretty = message.pretty_value(object, 2, 3, 80)
279
+ assert y(pretty) == y(<<-DONE), pretty.inspect
280
+ ---
281
+ :flavor: vanilla
282
+ DONE
283
+ end
284
+
285
+
286
+ end
287
+ end
89
288
  end
90
289
  end
@@ -37,8 +37,8 @@ def sys(cmd, expected_status = 0)
37
37
  # in Ruby 1.8, wait_thread is nil :-( so just pretend the process was successful (status 0)
38
38
  exit_status = (wait_thread.value.exitstatus if wait_thread) || 0
39
39
  output = stdout.read + stderr.read
40
- unless expected_status.nil?
41
- assert(cmd) { output and exit_status == expected_status }
40
+ unless expected_status == :ignore
41
+ assert(cmd) { cmd and output and exit_status == expected_status }
42
42
  end
43
43
  yield output if block_given?
44
44
  output
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wrong
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,24 +10,24 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-14 00:00:00.000000000 Z
13
+ date: 2012-11-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: predicated
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ! '>='
20
+ - - ~>
21
21
  - !ruby/object:Gem::Version
22
- version: 0.2.3
22
+ version: 0.2.6
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
28
- - - ! '>='
28
+ - - ~>
29
29
  - !ruby/object:Gem::Version
30
- version: 0.2.3
30
+ version: 0.2.6
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: ruby_parser
33
33
  requirement: !ruby/object:Gem::Requirement
@@ -92,54 +92,6 @@ dependencies:
92
92
  - - ~>
93
93
  - !ruby/object:Gem::Version
94
94
  version: 1.1.2
95
- - !ruby/object:Gem::Dependency
96
- name: ParseTree
97
- requirement: !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
100
- - - ~>
101
- - !ruby/object:Gem::Version
102
- version: '3.0'
103
- type: :runtime
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: '3.0'
111
- - !ruby/object:Gem::Dependency
112
- name: sourcify
113
- requirement: !ruby/object:Gem::Requirement
114
- none: false
115
- requirements:
116
- - - ! '>='
117
- - !ruby/object:Gem::Version
118
- version: 0.3.0
119
- type: :runtime
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: 0.3.0
127
- - !ruby/object:Gem::Dependency
128
- name: file-tail
129
- requirement: !ruby/object:Gem::Requirement
130
- none: false
131
- requirements:
132
- - - ~>
133
- - !ruby/object:Gem::Version
134
- version: '1.0'
135
- type: :runtime
136
- prerelease: false
137
- version_requirements: !ruby/object:Gem::Requirement
138
- none: false
139
- requirements:
140
- - - ~>
141
- - !ruby/object:Gem::Version
142
- version: '1.0'
143
95
  description: ! 'Wrong provides a general assert method that takes a predicate block.
144
96
  Assertion failure
145
97
 
@@ -179,12 +131,30 @@ files:
179
131
  - lib/wrong/message/test_context.rb
180
132
  - lib/wrong/rainbow.rb
181
133
  - lib/wrong/rescuing.rb
182
- - lib/wrong/ruby2ruby_patch.rb
183
134
  - lib/wrong/sexp_ext.rb
135
+ - lib/wrong/terminal.rb
184
136
  - lib/wrong/version.rb
185
137
  - lib/wrong.rb
186
138
  - README.markdown
187
139
  - test/adapters/minitest_test.rb
140
+ - test/adapters/railsapp/app/controllers/application_controller.rb
141
+ - test/adapters/railsapp/app/helpers/application_helper.rb
142
+ - test/adapters/railsapp/config/application.rb
143
+ - test/adapters/railsapp/config/boot.rb
144
+ - test/adapters/railsapp/config/environment.rb
145
+ - test/adapters/railsapp/config/environments/development.rb
146
+ - test/adapters/railsapp/config/environments/production.rb
147
+ - test/adapters/railsapp/config/environments/test.rb
148
+ - test/adapters/railsapp/config/initializers/backtrace_silencers.rb
149
+ - test/adapters/railsapp/config/initializers/inflections.rb
150
+ - test/adapters/railsapp/config/initializers/mime_types.rb
151
+ - test/adapters/railsapp/config/initializers/secret_token.rb
152
+ - test/adapters/railsapp/config/initializers/session_store.rb
153
+ - test/adapters/railsapp/config/initializers/wrap_parameters.rb
154
+ - test/adapters/railsapp/config/routes.rb
155
+ - test/adapters/railsapp/db/seeds.rb
156
+ - test/adapters/railsapp/spec/spec_helper.rb
157
+ - test/adapters/railsapp/spec/wrong_spec.rb
188
158
  - test/adapters/rspec1/failing_spec.rb
189
159
  - test/adapters/rspec2/failing_spec.rb
190
160
  - test/adapters/rspec_rails_test.rb
@@ -224,13 +194,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
224
194
  version: '0'
225
195
  segments:
226
196
  - 0
227
- hash: 2518606047608978167
197
+ hash: 573842953252703249
228
198
  required_rubygems_version: !ruby/object:Gem::Requirement
229
199
  none: false
230
200
  requirements:
231
201
  - - ! '>='
232
202
  - !ruby/object:Gem::Version
233
203
  version: '0'
204
+ segments:
205
+ - 0
206
+ hash: 573842953252703249
234
207
  requirements: []
235
208
  rubyforge_project: wrong
236
209
  rubygems_version: 1.8.24
@@ -240,6 +213,24 @@ summary: Wrong provides a general assert method that takes a predicate block. A
240
213
  failure messages are rich in detail.
241
214
  test_files:
242
215
  - test/adapters/minitest_test.rb
216
+ - test/adapters/railsapp/app/controllers/application_controller.rb
217
+ - test/adapters/railsapp/app/helpers/application_helper.rb
218
+ - test/adapters/railsapp/config/application.rb
219
+ - test/adapters/railsapp/config/boot.rb
220
+ - test/adapters/railsapp/config/environment.rb
221
+ - test/adapters/railsapp/config/environments/development.rb
222
+ - test/adapters/railsapp/config/environments/production.rb
223
+ - test/adapters/railsapp/config/environments/test.rb
224
+ - test/adapters/railsapp/config/initializers/backtrace_silencers.rb
225
+ - test/adapters/railsapp/config/initializers/inflections.rb
226
+ - test/adapters/railsapp/config/initializers/mime_types.rb
227
+ - test/adapters/railsapp/config/initializers/secret_token.rb
228
+ - test/adapters/railsapp/config/initializers/session_store.rb
229
+ - test/adapters/railsapp/config/initializers/wrap_parameters.rb
230
+ - test/adapters/railsapp/config/routes.rb
231
+ - test/adapters/railsapp/db/seeds.rb
232
+ - test/adapters/railsapp/spec/spec_helper.rb
233
+ - test/adapters/railsapp/spec/wrong_spec.rb
243
234
  - test/adapters/rspec1/failing_spec.rb
244
235
  - test/adapters/rspec2/failing_spec.rb
245
236
  - test/adapters/rspec_rails_test.rb