seeing_is_believing 3.0.0.beta.4 → 3.0.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -8
  3. data/Rakefile +1 -1
  4. data/Readme.md +65 -25
  5. data/bin/seeing_is_believing +1 -0
  6. data/docs/sib-streaming.gif +0 -0
  7. data/features/deprecated-flags.feature +62 -2
  8. data/features/errors.feature +12 -7
  9. data/features/examples.feature +143 -4
  10. data/features/flags.feature +89 -29
  11. data/features/regression.feature +58 -14
  12. data/features/support/env.rb +4 -0
  13. data/features/xmpfilter-style.feature +181 -36
  14. data/lib/seeing_is_believing.rb +44 -33
  15. data/lib/seeing_is_believing/binary.rb +31 -88
  16. data/lib/seeing_is_believing/binary/align_chunk.rb +30 -11
  17. data/lib/seeing_is_believing/binary/annotate_end_of_file.rb +10 -16
  18. data/lib/seeing_is_believing/binary/annotate_every_line.rb +5 -25
  19. data/lib/seeing_is_believing/binary/annotate_marked_lines.rb +136 -0
  20. data/lib/seeing_is_believing/binary/comment_lines.rb +8 -10
  21. data/lib/seeing_is_believing/binary/commentable_lines.rb +20 -26
  22. data/lib/seeing_is_believing/binary/config.rb +392 -0
  23. data/lib/seeing_is_believing/binary/data_structures.rb +57 -0
  24. data/lib/seeing_is_believing/binary/engine.rb +104 -0
  25. data/lib/seeing_is_believing/binary/{comment_formatter.rb → format_comment.rb} +6 -6
  26. data/lib/seeing_is_believing/binary/remove_annotations.rb +29 -28
  27. data/lib/seeing_is_believing/binary/rewrite_comments.rb +42 -43
  28. data/lib/seeing_is_believing/code.rb +105 -49
  29. data/lib/seeing_is_believing/debugger.rb +6 -5
  30. data/lib/seeing_is_believing/error.rb +6 -17
  31. data/lib/seeing_is_believing/evaluate_by_moving_files.rb +78 -129
  32. data/lib/seeing_is_believing/event_stream/consumer.rb +114 -64
  33. data/lib/seeing_is_believing/event_stream/events.rb +169 -11
  34. data/lib/seeing_is_believing/event_stream/handlers/debug.rb +57 -0
  35. data/lib/seeing_is_believing/event_stream/handlers/record_exitstatus.rb +18 -0
  36. data/lib/seeing_is_believing/event_stream/handlers/stream_json_events.rb +45 -0
  37. data/lib/seeing_is_believing/event_stream/handlers/update_result.rb +39 -0
  38. data/lib/seeing_is_believing/event_stream/producer.rb +25 -24
  39. data/lib/seeing_is_believing/hash_struct.rb +206 -0
  40. data/lib/seeing_is_believing/result.rb +20 -3
  41. data/lib/seeing_is_believing/the_matrix.rb +20 -12
  42. data/lib/seeing_is_believing/version.rb +1 -1
  43. data/lib/seeing_is_believing/wrap_expressions.rb +55 -115
  44. data/lib/seeing_is_believing/wrap_expressions_with_inspect.rb +14 -0
  45. data/seeing_is_believing.gemspec +1 -1
  46. data/spec/binary/alignment_specs.rb +27 -0
  47. data/spec/binary/comment_lines_spec.rb +3 -2
  48. data/spec/binary/config_spec.rb +657 -0
  49. data/spec/binary/engine_spec.rb +97 -0
  50. data/spec/binary/{comment_formatter_spec.rb → format_comment_spec.rb} +2 -2
  51. data/spec/binary/marker_spec.rb +71 -0
  52. data/spec/binary/options_spec.rb +0 -0
  53. data/spec/binary/remove_annotations_spec.rb +31 -18
  54. data/spec/binary/rewrite_comments_spec.rb +26 -11
  55. data/spec/code_spec.rb +190 -6
  56. data/spec/debugger_spec.rb +4 -0
  57. data/spec/evaluate_by_moving_files_spec.rb +38 -20
  58. data/spec/event_stream_spec.rb +265 -116
  59. data/spec/hash_struct_spec.rb +514 -0
  60. data/spec/seeing_is_believing_spec.rb +108 -46
  61. data/spec/spec_helper.rb +9 -0
  62. data/spec/wrap_expressions_spec.rb +207 -172
  63. metadata +30 -18
  64. data/docs/for-presentations +0 -33
  65. data/lib/seeing_is_believing/binary/annotate_xmpfilter_style.rb +0 -128
  66. data/lib/seeing_is_believing/binary/interpret_flags.rb +0 -156
  67. data/lib/seeing_is_believing/binary/parse_args.rb +0 -263
  68. data/lib/seeing_is_believing/event_stream/update_result.rb +0 -24
  69. data/lib/seeing_is_believing/inspect_expressions.rb +0 -21
  70. data/lib/seeing_is_believing/parser_helpers.rb +0 -82
  71. data/spec/binary/interpret_flags_spec.rb +0 -332
  72. data/spec/binary/parse_args_spec.rb +0 -415
@@ -85,21 +85,21 @@ Feature: Using flags
85
85
  Then stdout is "12345"
86
86
 
87
87
 
88
- Scenario: --number-of-captures determines how many times a line will be recorded
89
- Given the file "number_of_captures.rb":
88
+ Scenario: --max-line-captures determines how many times a line will be recorded
89
+ Given the file "max_line_captures.rb":
90
90
  """
91
91
  5.times do |i|
92
92
  i
93
93
  end
94
94
  """
95
- When I run "seeing_is_believing --number-of-captures 4 number_of_captures.rb"
95
+ When I run "seeing_is_believing --max-line-captures 4 max_line_captures.rb"
96
96
  Then stdout is:
97
97
  """
98
98
  5.times do |i| # => 5
99
99
  i # => 0, 1, 2, 3, ...
100
100
  end # => 5
101
101
  """
102
- When I run "seeing_is_believing --number-of-captures 5 number_of_captures.rb"
102
+ When I run "seeing_is_believing --max-line-captures 5 max_line_captures.rb"
103
103
  Then stdout is:
104
104
  """
105
105
  5.times do |i| # => 5
@@ -251,17 +251,17 @@ Feature: Using flags
251
251
  And stdout includes "Examples:"
252
252
 
253
253
 
254
- Scenario: --timeout
254
+ Scenario: --timeout-seconds
255
255
  Given the file "will_timeout.rb" "sleep 1"
256
- When I run "seeing_is_believing --timeout 0.1 will_timeout.rb"
256
+ When I run "seeing_is_believing --timeout-seconds 0.1 will_timeout.rb"
257
257
  Then stdout is empty
258
258
  And the exit status is 2
259
259
  And stderr is "Timeout Error after 0.1 seconds!"
260
260
 
261
261
 
262
- Scenario: --timeout
262
+ Scenario: --timeout-seconds
263
263
  Given the file "will_not_timeout.rb" "1 + 1"
264
- When I run "seeing_is_believing --timeout 1.0 will_not_timeout.rb"
264
+ When I run "seeing_is_believing --timeout-seconds 1.0 will_not_timeout.rb"
265
265
  Then stderr is empty
266
266
  And the exit status is 0
267
267
  And stdout is "1 + 1 # => 2"
@@ -367,28 +367,60 @@ Feature: Using flags
367
367
  """
368
368
 
369
369
 
370
- Scenario: --inherit-exit-status
371
- Given the file "exit_status.rb" "exit 123"
372
- When I run "seeing_is_believing exit_status.rb"
370
+ Scenario: --inherit-exitstatus causes SiB to exit with the status of the evaluated file
371
+ Given the file "exitstatus.rb" "exit 123"
372
+
373
+ When I run "seeing_is_believing exitstatus.rb"
373
374
  Then the exit status is 1
374
- When I run "seeing_is_believing --inherit-exit-status exit_status.rb"
375
+ And stderr is empty
376
+ And stdout is "exit 123"
377
+
378
+ When I run "seeing_is_believing -i exitstatus.rb"
375
379
  Then the exit status is 123
380
+ And stderr is empty
381
+ And stdout is "exit 123"
382
+
383
+
384
+ Scenario: --inherit-exitstatus works with exit!
385
+ Given the file "exit_bang.rb":
386
+ """
387
+ :hello
388
+ exit! 100
389
+ """
390
+
391
+ When I run "seeing_is_believing exit_bang.rb"
392
+ Then stderr is empty
393
+ And the exit status is 1
394
+ And stdout is:
395
+ """
396
+ :hello # => :hello
397
+ exit! 100
398
+ """
399
+
400
+ When I run "seeing_is_believing -i exit_bang.rb"
401
+ Then stderr is empty
402
+ And the exit status is 100
403
+ And stdout is:
404
+ """
405
+ :hello # => :hello
406
+ exit! 100
407
+ """
376
408
 
377
409
 
378
- # Show that Ruby exceptions exit with 1, and --inherit-exit-status does as well
379
- Scenario: --inherit-exit-status
380
- Given the file "exception_exit_status.rb" "raise Exception"
381
- When I run "ruby exception_exit_status.rb"
410
+ # Show that Ruby exceptions exit with 1, and --inherit-exitstatus does as well
411
+ Scenario: --inherit-exitstatus
412
+ Given the file "exception_exitstatus.rb" "raise Exception"
413
+ When I run "ruby exception_exitstatus.rb"
382
414
  Then the exit status is 1
383
- When I run "seeing_is_believing --inherit-exit-status exception_exit_status.rb"
415
+ When I run "seeing_is_believing -i exception_exitstatus.rb"
384
416
  Then the exit status is 1
385
417
 
386
418
 
387
- Scenario: --inherit-exit-status in an at_exit block
388
- Given the file "exit_status_in_at_exit_block.rb" "at_exit { exit 10 }"
389
- When I run "seeing_is_believing exit_status_in_at_exit_block.rb"
419
+ Scenario: --inherit-exitstatus in an at_exit block
420
+ Given the file "exitstatus_in_at_exit_block.rb" "at_exit { exit 10 }"
421
+ When I run "seeing_is_believing exitstatus_in_at_exit_block.rb"
390
422
  Then the exit status is 1
391
- When I run "seeing_is_believing --inherit-exit-status exit_status_in_at_exit_block.rb"
423
+ When I run "seeing_is_believing -i exitstatus_in_at_exit_block.rb"
392
424
  Then the exit status is 10
393
425
 
394
426
 
@@ -400,14 +432,13 @@ Feature: Using flags
400
432
  2
401
433
  """
402
434
  When I run "seeing_is_believing --debug simple_program.rb"
403
- Then stderr is empty
435
+ Then stdout is empty
404
436
  And the exit status is 0
405
- And stdout includes "TRANSLATED PROGRAM:"
406
- And stdout includes "$SiB"
407
- And stdout includes "RESULT:"
408
- And stdout includes "@results="
409
- And stdout includes "OUTPUT:"
410
- And stdout includes:
437
+ And stderr includes "REWRITTEN PROGRAM:"
438
+ And stderr includes "$SiB"
439
+ And stderr includes "EVENTS:"
440
+ And stderr includes "OUTPUT:"
441
+ And stderr includes:
411
442
  """
412
443
  # encoding: utf-8
413
444
  1# 123
@@ -445,7 +476,36 @@ Feature: Using flags
445
476
  },
446
477
  "stdout": "b\n",
447
478
  "stderr": "c\n",
448
- "exit_status": 1
479
+ "exitstatus": 1
449
480
  }
450
481
  """
451
482
 
483
+ Scenario: --stream prints events from the event stream as they are seen
484
+ Given the file "record_event_stream.rb" "3.times { |i| p i }"
485
+ When I run "seeing_is_believing record_event_stream.rb --stream"
486
+ Then stderr is empty
487
+ And the exit status is 0
488
+ And stdout includes:
489
+ """
490
+ ["stdout",{"value":"0\n"}]
491
+ """
492
+ And stdout includes:
493
+ """
494
+ ["exitstatus",{"value":0}]
495
+ """
496
+ And stdout includes:
497
+ """
498
+ ["max_line_captures",{"value":-1,"is_infinity":true}]
499
+ """
500
+
501
+ Scenario: --stream respects the exit status
502
+ When I run "seeing_is_believing -ie 'exit 12' --stream"
503
+ Then stderr is empty
504
+ And the exit status is 12
505
+
506
+ Scenario: --stream sees leading data even with a hostile BEGIN block.
507
+ When I run "seeing_is_believing -e 'BEGIN { exit! }' --stream"
508
+ Then stdout includes:
509
+ """
510
+ ["sib_version",{"value":"{{SeeingIsBelieving::VERSION}}"}]
511
+ """
@@ -184,7 +184,7 @@ Feature:
184
184
  """
185
185
  class CreditCard
186
186
 
187
- end
187
+ end # => nil
188
188
 
189
189
  describe CreditCard do # ~> NoMethodError: undefined method `describe' for main:Object
190
190
 
@@ -224,7 +224,7 @@ Feature:
224
224
  def inspect
225
225
  "<PROC>" # => "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>", "<PROC>"
226
226
  end # => {{method_result :inspect}}
227
- end
227
+ end # => {{method_result :inspect}}
228
228
 
229
229
  generic_fib_gen = -> current, prev {
230
230
  -> {
@@ -290,7 +290,11 @@ Feature:
290
290
  {{'.' * 100_000}}
291
291
  """
292
292
  When I run "seeing_is_believing long_invalid_data_segment.rb"
293
- Then stderr includes "1: unterminated string meets end of file"
293
+ Then stderr is:
294
+ """
295
+ Syntax Error: long_invalid_data_segment.rb:1
296
+ unterminated string meets end of file
297
+ """
294
298
  And the exit status is 2
295
299
  And stdout is empty
296
300
 
@@ -390,7 +394,7 @@ Feature:
390
394
  class Object
391
395
  def !(a)
392
396
  end # => {{method_result :!}}
393
- end
397
+ end # => {{method_result :!}}
394
398
  """
395
399
 
396
400
 
@@ -441,22 +445,62 @@ Feature:
441
445
  Thread.new { Queue.new.shift }.join # ~> fatal
442
446
  """
443
447
 
444
- @wip
448
+
445
449
  Scenario: Xmpfilter does not write the error messages inside of strings
446
450
  Given the file "error_within_string.rb":
447
451
  """
448
- raise(ArgumentError, "line1
449
- line2")
452
+ 1.send "a
453
+ b"
450
454
  """
451
455
  When I run "seeing_is_believing --xmpfilter-style error_within_string.rb"
456
+ Then stdout includes:
457
+ """
458
+ 1.send "a
459
+ b"
460
+
461
+ # ~> NoMethodError
462
+ # ~> undefined method `a
463
+ # ~> b' for 1:Fixnum
464
+ """
465
+
466
+
467
+ # not going to get too detailed on what it prints, b/c that message seems pretty fragile,
468
+ # but just generally that it doesn't fkn blow up
469
+ Scenario: https://github.com/JoshCheek/seeing_is_believing/issues/46
470
+ Given the file "json_and_encodings.rb":
471
+ """
472
+ # encoding: utf-8
473
+ require 'json'
474
+ JSON.parse JSON.dump("√")
475
+ """
476
+ When I run "seeing_is_believing json_and_encodings.rb"
477
+ Then stderr is empty
478
+ And the exit status is 1
479
+ And stdout includes:
480
+ """
481
+ require 'json' # => true
482
+ JSON.parse JSON.dump("√")
483
+ """
484
+
485
+
486
+ Scenario: Correctly identify end of file
487
+ Given the file "fake_data_segment.rb":
488
+ """
489
+ puts "output"
490
+ "
491
+ __END__
492
+ "
493
+ __END__
494
+ """
495
+ When I run "seeing_is_believing fake_data_segment.rb"
452
496
  Then stdout is:
453
497
  """
454
- raise(ArgumentError, "line1
455
- line2") # ~> ArgumentError: line1\n line2
498
+ puts "output" # => nil
499
+ "
500
+ __END__
501
+ " # => "\n__END__\n"
456
502
 
457
- # ~> ArgumentError
458
- # ~> line1
459
- # ~> line2
460
- # ~>
461
- # ~> f4.rb:1:in `<main>'
503
+ # >> output
504
+ __END__
462
505
  """
506
+
@@ -27,6 +27,10 @@ Then 'stdout is exactly:' do |code|
27
27
  expect(@last_executed.stdout).to eq eval_curlies(code)
28
28
  end
29
29
 
30
+ Then 'stdout is exactly "$code"' do |code|
31
+ expect(@last_executed.stdout).to eq eval_curlies(code)
32
+ end
33
+
30
34
  Then 'stdout is the JSON:' do |json|
31
35
  require 'json'
32
36
  expected = JSON.parse(json)
@@ -3,13 +3,6 @@ Feature: Xmpfilter style
3
3
  Support the same (or highly similar) interface as xmpfilter,
4
4
  so that people who use that lib can easily transition to SiB.
5
5
 
6
- TODO:
7
- * multiple values on pp lines
8
- * show that exceptions respect line-length restriction flags
9
- * Scenario: pp output on line with exception
10
- * when input has previously identified exception
11
-
12
-
13
6
  Scenario: --xmpfilter-style Generic updating of marked lines
14
7
  Given the file "magic_comments.rb":
15
8
  """
@@ -149,7 +142,7 @@ Feature: Xmpfilter style
149
142
  """
150
143
 
151
144
 
152
- Scenario: Cleaning previous output
145
+ Scenario: Cleaning previous output does not clean the xmpfilter annotations
153
146
  Given the file "xmpfilter_cleaning.rb":
154
147
  """
155
148
  # commented out # => previous annotation
@@ -157,55 +150,60 @@ Feature: Xmpfilter style
157
150
  # => "1111111111...
158
151
  # "1111111111...
159
152
  # normal comment
160
- # => 123
153
+
154
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
155
+ # => {:foo=>42,
156
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
157
+ # :wibble=>{:magic_word=>"xyzzy"}}
161
158
  """
162
159
  When I run "seeing_is_believing --xmpfilter-style --clean xmpfilter_cleaning.rb"
163
160
  Then stdout is:
164
161
  """
165
162
  # commented out # => previous annotation
166
- 1
163
+ 1 # =>
164
+ # =>
167
165
  # normal comment
166
+
167
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
168
+ # =>
168
169
  """
169
170
 
170
171
 
171
- @wip
172
- Scenario: Correctly cleans/rewrites when the First line of inspection is indented more than its children
173
- Given the file "indented_inspection.rb":
172
+ # Not totally in love with this, but it'll do unless I can think of something better.
173
+ Scenario: Error raised on an annotated line preserves the annotation
174
+ Given the file "error_on_annotated_line.a.rb":
174
175
  """
175
- obj = Object.new
176
- def obj.inspect
177
- " 1 \n2 2\n"
178
- end
179
- obj
176
+ "a"+1 # =>
180
177
  # =>
181
178
  """
182
- When I run "seeing_is_believing -x indented_inspection.rb | seeing_is_believing -x"
183
- Then stdout is:
179
+ When I run "seeing_is_believing --xmpfilter-style error_on_annotated_line.a.rb"
180
+ Then stdout includes:
184
181
  """
185
- obj = Object.new
186
- def obj.inspect
187
- " 1 \n2 2\n"
188
- end
189
- obj
190
- # => 1
191
- # 2 2
182
+ "a"+1 # => TypeError:
183
+ """
184
+ And stdout includes:
192
185
  """
186
+ # =>
193
187
 
194
- # this one needs a bit more thought put into it, but I'm kinda fading now
195
- @wip
196
- Scenario: Error raised on an annotated line does not wipe it out
197
- Given the file "error_on_annotated_line.rb":
188
+ # ~> TypeError
189
+ """
190
+ Given the file "error_on_annotated_line.b.rb":
198
191
  """
199
- a # =>
192
+ "a"+"1" # => TypeError: no implicit conversion of Fixnum into String
193
+ # =>
194
+
195
+ # ~> TypeError
196
+ # ~> no implicit conversion of Fixnum into String
200
197
  """
201
- When I run "seeing_is_believing --xmpfilter-style error_on_annotated_line.rb"
202
- Then I stdout is:
198
+ When I run "seeing_is_believing --xmpfilter-style error_on_annotated_line.b.rb"
199
+ Then stdout is:
203
200
  """
204
- idk, but we need to be able to fix the thing and run it again
205
- without losing the annotation
201
+ "a"+"1" # => "a1"
202
+ # => "a1"
206
203
  """
207
204
 
208
205
 
206
+ # maybe can't fix this as it depends on the implementation of PP.pp
209
207
  @not-implemented
210
208
  Scenario: It can record values even when method is overridden
211
209
  Given the file "pretty_inspect_with_method_overridden.rb":
@@ -219,3 +217,150 @@ Feature: Xmpfilter style
219
217
  def method()end; self # => main
220
218
  # => main
221
219
  """
220
+
221
+
222
+ # Choosing this output style b/c it's what xmpfilter chooses,
223
+ # and it works conveniently with what's already in place.
224
+ #
225
+ # It looks better with the comma on the preceding line, but harder to identify the individual results.
226
+ #
227
+ # It looks better with an empty line between the results, but if the user strips trailing whitespace inbetween runs,
228
+ # it will confuse the annotations for normal comments.
229
+ #
230
+ # Might be cool to have it do a value comment before each result, instead of a comma.
231
+ # But at present, it doesn't wipe out "useless" value comments,
232
+ # e.g. cleaning this would leave three value markers after the hash.
233
+ Scenario: Multiline output that is repeatedly invoked
234
+ Given the file "mutltiline_output_repeatedly_invoked.rb":
235
+ """
236
+ 3.times do
237
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
238
+ # =>
239
+ end
240
+ """
241
+ When I run "seeing_is_believing -x mutltiline_output_repeatedly_invoked.rb"
242
+ Then stdout is:
243
+ """
244
+ 3.times do
245
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
246
+ # => {:foo=>42,
247
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
248
+ # :wibble=>{:magic_word=>"xyzzy"}}
249
+ # ,{:foo=>42,
250
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
251
+ # :wibble=>{:magic_word=>"xyzzy"}}
252
+ # ,{:foo=>42,
253
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
254
+ # :wibble=>{:magic_word=>"xyzzy"}}
255
+ end
256
+ """
257
+ When I run "seeing_is_believing -x mutltiline_output_repeatedly_invoked.rb | seeing_is_believing -x"
258
+ Then stdout is:
259
+ """
260
+ 3.times do
261
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
262
+ # => {:foo=>42,
263
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
264
+ # :wibble=>{:magic_word=>"xyzzy"}}
265
+ # ,{:foo=>42,
266
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
267
+ # :wibble=>{:magic_word=>"xyzzy"}}
268
+ # ,{:foo=>42,
269
+ # :bar=>{:baz=>1, :buz=>2, :fuz=>3},
270
+ # :wibble=>{:magic_word=>"xyzzy"}}
271
+ end
272
+ """
273
+
274
+
275
+ Scenario: Multiline values where the first line is indented more than the successive lines use a nonbreaking space
276
+ Given the file "inspect_tree.rb":
277
+ """
278
+ bst = Object.new
279
+ def bst.inspect
280
+ " 4\n"\
281
+ " 2 6\n"\
282
+ "1 3 5 7\n"
283
+ end
284
+ bst
285
+ # =>
286
+ """
287
+ When I run "seeing_is_believing --xmpfilter-style inspect_tree.rb"
288
+ # NOTE: The first space after the => is a nonbreaking space
289
+ Then stdout is:
290
+ """
291
+ bst = Object.new
292
+ def bst.inspect
293
+ " 4\n"\
294
+ " 2 6\n"\
295
+ "1 3 5 7\n"
296
+ end
297
+ bst
298
+ # =>   4
299
+ # 2 6
300
+ # 1 3 5 7
301
+ """
302
+
303
+
304
+ Scenario: Leading whitespace on nextline, but not multiline uses normal spaces
305
+ Given the file "nextline_with_leading_whitespace_but_not_multiline.rb":
306
+ """
307
+ o = Object.new
308
+ def o.inspect; " o" end
309
+ o
310
+ # =>
311
+ """
312
+ When I run "seeing_is_believing --xmpfilter-style nextline_with_leading_whitespace_but_not_multiline.rb"
313
+ Then stdout is:
314
+ """
315
+ o = Object.new
316
+ def o.inspect; " o" end
317
+ o
318
+ # => o
319
+ """
320
+
321
+
322
+
323
+ Scenario: Xmpfilter uses the same comment formatting as normal
324
+ Given the file "xmpfilter_result_lengths.rb":
325
+ """
326
+ $stdout.puts "a"*100
327
+ $stderr.puts "a"*100
328
+
329
+ "a" # =>
330
+ "aa" # =>
331
+ "aaa" # =>
332
+ "aaaa" # =>
333
+
334
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
335
+ # =>
336
+
337
+ raise "a"*100
338
+ """
339
+ When I run "seeing_is_believing -x --result-length 10 xmpfilter_result_lengths.rb"
340
+ Then stderr is empty
341
+ And stdout is:
342
+ """
343
+ $stdout.puts "a"*100
344
+ $stderr.puts "a"*100
345
+
346
+ "a" # => "a"
347
+ "aa" # => "aa"
348
+ "aaa" # => "aaa"
349
+ "aaaa" # => "a...
350
+
351
+ {foo: 42, bar: {baz: 1, buz: 2, fuz: 3}, wibble: {magic_word: "xyzzy"}}
352
+ # => {:...
353
+ # :...
354
+ # :...
355
+
356
+ raise "a"*100 # ~> Ru...
357
+
358
+ # >> aa...
359
+
360
+ # !> aa...
361
+
362
+ # ~> Ru...
363
+ # ~> aa...
364
+ # ~>
365
+ # ~> xm...
366
+ """