seeing_is_believing 2.2.0 → 3.0.0.beta.1

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Changelog.md +33 -0
  4. data/bin/seeing_is_believing +1 -1
  5. data/features/errors.feature +3 -3
  6. data/features/examples.feature +6 -6
  7. data/features/flags.feature +51 -196
  8. data/features/regression.feature +12 -3
  9. data/features/safe.feature +33 -0
  10. data/features/support/env.rb +20 -0
  11. data/features/xmpfilter-style.feature +156 -0
  12. data/lib/seeing_is_believing.rb +17 -35
  13. data/lib/seeing_is_believing/binary.rb +81 -176
  14. data/lib/seeing_is_believing/binary/align_chunk.rb +5 -7
  15. data/lib/seeing_is_believing/binary/align_file.rb +4 -5
  16. data/lib/seeing_is_believing/binary/align_line.rb +4 -4
  17. data/lib/seeing_is_believing/binary/annotate_end_of_file.rb +60 -0
  18. data/lib/seeing_is_believing/binary/annotate_every_line.rb +64 -0
  19. data/lib/seeing_is_believing/binary/annotate_xmpfilter_style.rb +133 -0
  20. data/lib/seeing_is_believing/binary/comment_formatter.rb +19 -5
  21. data/lib/seeing_is_believing/binary/comment_lines.rb +1 -1
  22. data/lib/seeing_is_believing/binary/commentable_lines.rb +1 -1
  23. data/lib/seeing_is_believing/binary/interpret_flags.rb +149 -0
  24. data/lib/seeing_is_believing/binary/parse_args.rb +96 -104
  25. data/lib/seeing_is_believing/binary/remove_annotations.rb +95 -0
  26. data/lib/seeing_is_believing/binary/rewrite_comments.rb +8 -30
  27. data/lib/seeing_is_believing/code.rb +99 -0
  28. data/lib/seeing_is_believing/evaluate_by_moving_files.rb +27 -19
  29. data/lib/seeing_is_believing/evaluate_with_eval_in.rb +27 -0
  30. data/lib/seeing_is_believing/event_stream/consumer.rb +111 -0
  31. data/lib/seeing_is_believing/event_stream/events.rb +16 -0
  32. data/lib/seeing_is_believing/event_stream/producer.rb +106 -0
  33. data/lib/seeing_is_believing/event_stream/update_result.rb +21 -0
  34. data/lib/seeing_is_believing/inspect_expressions.rb +24 -0
  35. data/lib/seeing_is_believing/parser_helpers.rb +1 -11
  36. data/lib/seeing_is_believing/result.rb +14 -56
  37. data/lib/seeing_is_believing/the_matrix.rb +14 -14
  38. data/lib/seeing_is_believing/version.rb +1 -1
  39. data/lib/seeing_is_believing/wrap_expressions.rb +32 -9
  40. data/seeing_is_believing.gemspec +7 -7
  41. data/spec/binary/comment_formatter_spec.rb +169 -18
  42. data/spec/binary/comment_lines_spec.rb +1 -1
  43. data/spec/binary/interpret_flags_spec.rb +307 -0
  44. data/spec/binary/parse_args_spec.rb +93 -91
  45. data/spec/binary/{clean_body_spec.rb → remove_annotations_spec.rb} +29 -22
  46. data/spec/binary/rewrite_comments_spec.rb +13 -13
  47. data/spec/code_spec.rb +49 -0
  48. data/spec/debugger_spec.rb +1 -1
  49. data/spec/evaluate_by_moving_files_spec.rb +7 -3
  50. data/spec/event_stream_spec.rb +390 -0
  51. data/spec/hard_core_ensure_spec.rb +1 -1
  52. data/spec/seeing_is_believing_spec.rb +137 -40
  53. data/spec/spec_helper.rb +3 -3
  54. data/spec/wrap_expressions_spec.rb +48 -35
  55. metadata +58 -35
  56. data/lib/seeing_is_believing/binary/add_annotations.rb +0 -144
  57. data/lib/seeing_is_believing/binary/clean_body.rb +0 -95
  58. data/lib/seeing_is_believing/has_exception.rb +0 -27
  59. data/lib/seeing_is_believing/line.rb +0 -90
  60. data/spec/line_spec.rb +0 -86
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'ichannel'
3
3
  require 'seeing_is_believing/hard_core_ensure'
4
4
 
5
- describe SeeingIsBelieving::HardCoreEnsure do
5
+ RSpec.describe SeeingIsBelieving::HardCoreEnsure do
6
6
  def call(options)
7
7
  described_class.new(options).call
8
8
  end
@@ -1,10 +1,26 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'spec_helper'
3
- require 'seeing_is_believing'
4
3
  require 'stringio'
4
+ require 'seeing_is_believing'
5
+ require 'seeing_is_believing/evaluate_with_eval_in'
6
+
7
+ RSpec.describe SeeingIsBelieving do
8
+ def method_result(name)
9
+ @result = def __some_method__; end
10
+ if :__some_method__ == @result
11
+ name.inspect
12
+ elsif nil == @result
13
+ nil.inspect
14
+ else
15
+ raise "huh? #{@result.inspect}"
16
+ end
17
+ end
5
18
 
6
- describe SeeingIsBelieving do
7
19
  def invoke(input, options={})
20
+ if options[:debug]
21
+ options.delete :debug
22
+ options[:debugger] = SeeingIsBelieving::Debugger.new(stream: $stderr, colour: true)
23
+ end
8
24
  described_class.new(input, options).call
9
25
  end
10
26
 
@@ -14,6 +30,10 @@ describe SeeingIsBelieving do
14
30
 
15
31
  let(:proving_grounds_dir) { File.expand_path '../../proving_grounds', __FILE__ }
16
32
 
33
+ it 'evaluates with EvaluateByMovingFiles by default' do
34
+ expect(values_for "`echo 1`").to eq [['"1\n"']] # shows we're not using the only other option (EvaluateWithEvalIn)
35
+ end
36
+
17
37
  it 'takes a string and returns a result of the line numbers (counting from 1) and each inspected result from that line' do
18
38
  input = "10+10\n'2'+'2'"
19
39
  expect(invoke(input)[1]).to eq ["20"]
@@ -25,6 +45,16 @@ describe SeeingIsBelieving do
25
45
  expect(invoke(input)[1]).to eq ['"NUM"']
26
46
  end
27
47
 
48
+ it 'allows uers to pass in their own inspection recorder' do
49
+ wrapper = lambda { |program, num_captures|
50
+ SeeingIsBelieving::InspectExpressions.call \
51
+ program,
52
+ num_captures,
53
+ after_each: -> line_number { ").tap { $SiB.record_result(:inspect, #{line_number}, 'zomg') }" }
54
+ }
55
+ expect(invoke(':body', record_expressions: wrapper)[1]).to eq ['"zomg"']
56
+ end
57
+
28
58
  it 'remembers context of previous lines' do
29
59
  expect(values_for("a=12\na*2")).to eq [['12'], ['24']]
30
60
  end
@@ -51,8 +81,8 @@ describe SeeingIsBelieving do
51
81
  it 'evalutes to an empty array for lines that it cannot understand' do
52
82
  expect(values_for("[3].map \\\ndo |n|\n n*2\n end")).to eq [['[3]'], [], ['6'], ['[6]']]
53
83
  expect(values_for("'\n1\n'")).to eq [[], [], ['"\n1\n"']]
54
- expect(values_for("<<HEREDOC\n\n1\nHEREDOC")).to eq [[%Q'"\\n1\\n"']] # newlines escaped b/c lib inspects them
55
- expect(values_for("<<-HEREDOC\n\n1\nHEREDOC")).to eq [[%Q'"\\n1\\n"']]
84
+ expect(values_for("<<HEREDOC\n\n1\nHEREDOC")).to eq [[%Q'"\\n1\\n"'], [], [], []] # newlines escaped b/c lib inspects them
85
+ expect(values_for("<<-HEREDOC\n\n1\nHEREDOC")).to eq [[%Q'"\\n1\\n"'], [], [], []]
56
86
  end
57
87
 
58
88
  it 'records the targets of chained methods' do
@@ -65,8 +95,8 @@ describe SeeingIsBelieving do
65
95
  end
66
96
 
67
97
  it "records heredocs" do
68
- expect(values_for("<<A\n1\nA")).to eq [[%'"1\\n"']]
69
- expect(values_for("<<-A\n1\nA")).to eq [[%'"1\\n"']]
98
+ expect(values_for("<<A\n1\nA")).to eq [[%'"1\\n"'], [], []]
99
+ expect(values_for("<<-A\n1\nA")).to eq [[%'"1\\n"'], [], []]
70
100
  end
71
101
 
72
102
  it 'does not insert code into the middle of heredocs' do
@@ -105,10 +135,7 @@ describe SeeingIsBelieving do
105
135
  expect(result.exception.message).to eq 'omg!'
106
136
 
107
137
  expect(result[1]).to eq ['12']
108
-
109
138
  expect(result[2]).to eq []
110
- expect(result[2].exception).to eq result.exception
111
-
112
139
  expect(result[3]).to eq []
113
140
  end
114
141
 
@@ -128,11 +155,11 @@ describe SeeingIsBelieving do
128
155
 
129
156
  # comment
130
157
  __LINE__')
131
- ).to eq [['1'], ['2'], [], [], ['5'], [], ['5'], [], [], ['10']]
158
+ ).to eq [['1'], ['2'], [], [], ['5'], [method_result(:meth)], ['5'], [], [], ['10']]
132
159
  end
133
160
 
134
161
  it 'records return statements' do
135
- expect(values_for("def meth \n return 1 \n end \n meth")).to eq [[], ['1'], [], ['1']]
162
+ expect(values_for("def meth \n return 1 \n end \n meth")).to eq [[], ['1'], [method_result(:meth)], ['1']]
136
163
  expect(values_for("-> { \n return 1 \n }.call" )).to eq [[], ['1'], ['1']]
137
164
  expect(values_for("-> { return 1 }.call" )).to eq [['1']]
138
165
 
@@ -149,7 +176,7 @@ describe SeeingIsBelieving do
149
176
  end
150
177
 
151
178
  it 'does not try to record the keyword redo' do
152
- expect(values_for(<<-DOC)).to eq [[], ['0'], ['0...3'], ['1', '2', '3', '4'], ['false', 'true', 'false', 'false'], ['0...3'], [], ['0...3']]
179
+ expect(values_for(<<-DOC)).to eq [[], ['0'], ['0...3'], ['1', '2', '3', '4'], ['false', 'true', 'false', 'false'], ['0...3'], [method_result(:meth)], ['0...3']]
153
180
  def meth
154
181
  n = 0
155
182
  for i in 0...3
@@ -162,7 +189,7 @@ describe SeeingIsBelieving do
162
189
  end
163
190
 
164
191
  it 'does not try to record the keyword retry' do
165
- expect(values_for(<<-DOC)).to eq [[], [], [], [], ['nil']]
192
+ expect(values_for(<<-DOC)).to eq [[], [], [], [method_result(:meth)], ['nil']]
166
193
  def meth
167
194
  rescue
168
195
  retry
@@ -228,7 +255,7 @@ describe SeeingIsBelieving do
228
255
  end
229
256
 
230
257
  it 'does not capture output from __END__ onward' do
231
- expect(values_for("1+1\nDATA.read\n__END__\n....")).to eq [['2'], ['"....\n"']] # <-- should this actually write a newline on the end?
258
+ expect(values_for("1+1\nDATA.read\n__END__\n....")).to eq [['2'], ['"....\n"'], [], []] # <-- should this actually write a newline on the end?
232
259
  end
233
260
 
234
261
  it 'raises a SyntaxError when the whole program is invalid' do
@@ -250,7 +277,7 @@ describe SeeingIsBelieving do
250
277
  it 'can deal with methods that are invoked entirely on the next line' do
251
278
  expect(values_for("a = 1\n.even?\na")).to eq [['1'], ['false'], ['false']]
252
279
  expect(values_for("a = 1.\neven?\na")).to eq [['1'], ['false'], ['false']]
253
- expect(values_for("1\n.even?\n__END__")).to eq [['1'], ['false']]
280
+ expect(values_for("1\n.even?\n__END__")).to eq [['1'], ['false'], []] # TODO: would be nice if we could consolidate this shit so we could find out things like __END__ without repeatedly parsing, I'd prefer if this did not imply there were results on this line -.-
254
281
  end
255
282
 
256
283
  it 'does not record leading comments' do
@@ -278,7 +305,7 @@ describe SeeingIsBelieving do
278
305
 
279
306
  it "doesn't fuck up when there are lines with magic comments in the middle of the app" do
280
307
  expect(values_for '1+1
281
- # encoding: wtf').to eq [['2']]
308
+ # encoding: wtf').to eq [['2'], []]
282
309
  end
283
310
 
284
311
  it "doesn't remove multiple leading comments" do
@@ -321,12 +348,10 @@ describe SeeingIsBelieving do
321
348
  File.write 'omg-ruby', "#!/usr/bin/env ruby
322
349
  $LOAD_PATH.unshift '#{File.expand_path '../../lib', __FILE__}'
323
350
 
324
- require 'seeing_is_believing'
325
- result = SeeingIsBelieving::Result.new
326
- result.record_result(1, /omg/)
327
-
328
- require 'json'
329
- puts JSON.dump result.to_primitive
351
+ require 'seeing_is_believing/event_stream/producer'
352
+ sib = SeeingIsBelieving::EventStream::Producer.new($stdout)
353
+ sib.record_result(:inspect, 1, /omg/)
354
+ sib.finish!
330
355
  "
331
356
  File.chmod 0755, 'omg-ruby'
332
357
  old_path = ENV['PATH']
@@ -339,21 +364,47 @@ describe SeeingIsBelieving do
339
364
  end
340
365
  end
341
366
 
342
- it 'does not record BEGIN and END', not_implemented: true do
343
- pending 'not implemented'
344
- expect { invoke <<-CODE }.to_not raise_error
345
- puts 1
346
- BEGIN {
347
- puts "begin code"
348
- some_var = 2
349
- }
350
- puts 3
351
- END {
352
- puts "end code"
353
- puts some_var
354
- }
355
- puts 4
356
- CODE
367
+ describe 'BEGIN and END' do
368
+ it 'Executes in the appropriate order' do
369
+ pending 'not implemented'
370
+ expect(invoke <<-CODE).stdout.to eq "1\n2\n3\n4\n5\n6\n7\n8\n9\n"
371
+ p 3
372
+ END { p 8 }
373
+ p 4
374
+ BEGIN { p 1 }
375
+ p 5
376
+ END { p 9 }
377
+ p 6
378
+ BEGIN { p 2 }
379
+ p 7
380
+ CODE
381
+ end
382
+
383
+ it 'Maintains correct line numbers' do
384
+ pending 'not implemented'
385
+ expected_values = [
386
+ ['1'],
387
+ [],
388
+ ['3'],
389
+ [],
390
+ ['5'],
391
+ [],
392
+ ['7'],
393
+ [],
394
+ ['9'],
395
+ ]
396
+ expect(values_for <<-CODE).to eq expected_values
397
+ __LINE__
398
+ BEGIN {
399
+ __LINE__
400
+ }
401
+ __LINE__
402
+ END {
403
+ __LINE__
404
+ }
405
+ __LINE__
406
+ CODE
407
+ end
357
408
  end
358
409
 
359
410
  # For more info about this one
@@ -367,12 +418,19 @@ describe SeeingIsBelieving do
367
418
  result = invoke(%[def self.inspect
368
419
  self
369
420
  end
370
- self], filename: 'blowsup.rb')
421
+ self], filename: 'blowsup.rb') # TODO This actually writes the file into the root of SiB
371
422
  expect(result).to have_exception
372
423
  expect(result.exception.class_name).to eq 'SystemStackError'
373
424
  expect(result.exception.backtrace.grep(/blowsup.rb/)).to_not be_empty # backtrace includes a line that we can show
374
425
  expect(result.exception.message).to match /recursive/i
375
- expect(result[4].exception).to eq result.exception
426
+ end
427
+
428
+ it 'makes the SeeingIsBelieving::VERSION available to the program' do
429
+ expect(values_for "SeeingIsBelieving::VERSION").to eq [[SeeingIsBelieving::VERSION.inspect]]
430
+ end
431
+
432
+ it 'does not change the number of lines in the file' do
433
+ expect(values_for "File.read(__FILE__).lines.count").to eq [['1']]
376
434
  end
377
435
 
378
436
  context 'when given a debugger' do
@@ -392,8 +450,47 @@ describe SeeingIsBelieving do
392
450
  it 'prints the result' do
393
451
  call
394
452
  expect(stream.string).to include "RESULT:"
395
- expect(stream.string).to include '1=>#<SIB:Line["1"] (1, 1) no exception>'
453
+ expect(stream.string).to include 'SIB::Result'
454
+ expect(stream.string).to include '@results={'
396
455
  end
397
456
  # should ProgramRewriter have some debug options?
398
457
  end
458
+
459
+ context 'when :evaluator option is set' do
460
+ require 'webmock'
461
+ WebMock.disable_net_connect!
462
+
463
+ include WebMock::API
464
+ before { WebMock.reset! }
465
+
466
+ it 'can use EvaluateByMovingFiles' do
467
+ # shows we're not using the only other option (EvaluateWithEvalIn)
468
+ expect(values_for "`echo 1`", evaluator: SeeingIsBelieving::EvaluateByMovingFiles).to eq [['"1\n"']]
469
+ end
470
+
471
+ it 'can use EvaluateWithEvalIn' do
472
+ require 'seeing_is_believing/event_stream/producer'
473
+ redirect_url = 'https://example.com/whatever'
474
+ api_redirect_url = redirect_url + '.json'
475
+
476
+ stream = StringIO.new
477
+ producer = SeeingIsBelieving::EventStream::Producer.new(stream)
478
+ producer.record_result :inspect, 1, "a"
479
+ producer.record_result :inspect, 1, "b"
480
+ producer.record_result :inspect, 2, "c"
481
+ producer.finish!
482
+
483
+ response = { 'lang' => 'whatever',
484
+ 'lang_friendly' => 'whatever',
485
+ 'code' => 'whatever',
486
+ 'output' => stream.string,
487
+ 'status' => 'OK (0.012 sec real, 0.013 sec wall, 7 MB, 22 syscalls)'}
488
+
489
+ stub_request(:post, 'https://eval.in/').to_return(status: 302, headers: {'Location' => redirect_url})
490
+ stub_request(:get, api_redirect_url).to_return(status: 200, body: JSON.dump(response))
491
+
492
+ values = values_for "whatever", evaluator: SeeingIsBelieving::EvaluateWithEvalIn
493
+ expect(values).to eq [['"a"', '"b"'], ['"c"']]
494
+ end
495
+ end
399
496
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,3 @@
1
- # RSpec.configure do |c|
2
- # c.disable_monkey_patching!
3
- # end
1
+ RSpec.configure do |c|
2
+ c.disable_monkey_patching!
3
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
  require 'seeing_is_believing/wrap_expressions'
3
3
 
4
- describe SeeingIsBelieving::WrapExpressions do
4
+ RSpec.describe SeeingIsBelieving::WrapExpressions do
5
5
  def wrap(code)
6
6
  described_class.call code,
7
7
  before_each: -> * { '<' },
@@ -17,23 +17,36 @@ describe SeeingIsBelieving::WrapExpressions do
17
17
  end
18
18
 
19
19
  describe 'wrapping the body' do
20
- let(:options) { { before_all: "[",
21
- after_all: "]",
22
- before_each: -> * { '<' },
23
- after_each: -> * { '>' } } }
20
+ let(:options) { { before_all: -> { "[".freeze },
21
+ after_all: -> { "]".freeze },
22
+ before_each: -> * { '<'.freeze },
23
+ after_each: -> * { '>'.freeze } } }
24
24
 
25
25
  it 'wraps the entire body, ignoring leading comments and the data segment' do
26
26
  expect(described_class.call("#comment\nA\n__END__\n1", options)).to eq "#comment\n[<A>]\n__END__\n1"
27
27
  end
28
28
 
29
- it 'does nothing when there are only comments' do
30
- expect(described_class.call("# abc", options)).to eq "# abc"
29
+ it 'comes in on blank lines' do
30
+ expect(described_class.call('', options)).to eq '[]'
31
+ end
32
+
33
+ it 'comes in first when there are only comments' do
34
+ expect(described_class.call("# abc", options)).to eq "[]# abc"
31
35
  end
32
36
 
33
37
  it 'comes in before trailing comments' do
34
38
  expect(described_class.call("1# abc", options)).to eq "[<1>]# abc"
35
39
  end
36
40
 
41
+ # this changes the number of lines, annoyingly, though it shouldn't mess anything up,
42
+ # unless you were trying to reopen the file to read it, in which case, *surprise* the whole thing's been rewritten
43
+ it 'injects a newline if there is a data segment and the after block doesn\'t end in a newline' do
44
+ expect(described_class.call("__END__", options)).to eq "[]\n__END__"
45
+ expect(described_class.call("\n__END__", options)).to eq "[]\n__END__"
46
+ expect(described_class.call("\n\n__END__", options)).to eq "[]\n\n__END__"
47
+ expect(described_class.call("__END__!", options)).to eq "[<__END__!>]"
48
+ end
49
+
37
50
  it 'wraps bodies that are wrapped in parentheses' do
38
51
  expect(wrap('(1)')).to eq '<(1)>'
39
52
  expect(wrap("(\n<<doc\ndoc\n)")).to eq "<(\n<<<doc>\ndoc\n)>"
@@ -71,9 +84,9 @@ describe SeeingIsBelieving::WrapExpressions do
71
84
  "end",
72
85
  options)
73
86
  ).to eq "[<a>\n"\
74
- "def b\n"\
87
+ "<def b\n"\
75
88
  " <c = 1>\n"\
76
- "end]"
89
+ "end>]"
77
90
  end
78
91
  end
79
92
 
@@ -185,8 +198,8 @@ describe SeeingIsBelieving::WrapExpressions do
185
198
  end
186
199
 
187
200
  it 'does not wrap multiple expressions when they constitute a void value' do
188
- expect(wrap("def a\n1\nreturn 2\nend")).to eq "def a\n<1>\nreturn <2>\nend"
189
- expect(wrap("def a\nreturn 1\n2\nend")).to eq "def a\nreturn <1>\n<2>\nend"
201
+ expect(wrap("def a\n1\nreturn 2\nend")).to eq "<def a\n<1>\nreturn <2>\nend>"
202
+ expect(wrap("def a\nreturn 1\n2\nend")).to eq "<def a\nreturn <1>\n<2>\nend>"
190
203
  end
191
204
 
192
205
  it 'wraps nested expressions' do
@@ -519,19 +532,19 @@ describe SeeingIsBelieving::WrapExpressions do
519
532
  end
520
533
 
521
534
  it 'does not wrap if the last value in any portion is a void value expression' do
522
- expect(wrap("def a\nif true\nreturn 1\nend\nend")).to eq "def a\nif <true>\nreturn <1>\nend\nend"
523
- expect(wrap("def a\nif true\n1\nelse\nreturn 2\nend\nend")).to eq "def a\nif <true>\n<1>\nelse\nreturn <2>\nend\nend"
524
- expect(wrap("def a\nif true\n1\nelsif true\n2\nelse\nreturn 3\nend\nend")).to eq "def a\nif <true>\n<1>\nelsif <true>\n<2>\nelse\nreturn <3>\nend\nend"
525
- expect(wrap("def a\nif true\nif true\nreturn 1\nend\nend\nend")).to eq "def a\nif <true>\nif <true>\nreturn <1>\nend\nend\nend"
526
- expect(wrap("def a\nunless true\nreturn 1\nend\nend")).to eq "def a\nunless <true>\nreturn <1>\nend\nend"
527
- expect(wrap("def a\nunless true\n1\nelse\nreturn 2\nend\nend")).to eq "def a\nunless <true>\n<1>\nelse\nreturn <2>\nend\nend"
528
- expect(wrap("def a\ntrue ?\n(return 1) :\n2\nend")).to eq "def a\n<true> ?\n(return <1>) :\n<2>\nend"
529
- expect(wrap("def a\ntrue ?\n1 :\n(return 2)\nend")).to eq "def a\n<true> ?\n<1> :\n(return <2>)\nend"
535
+ expect(wrap("def a\nif true\nreturn 1\nend\nend")).to eq "<def a\nif <true>\nreturn <1>\nend\nend>"
536
+ expect(wrap("def a\nif true\n1\nelse\nreturn 2\nend\nend")).to eq "<def a\nif <true>\n<1>\nelse\nreturn <2>\nend\nend>"
537
+ expect(wrap("def a\nif true\n1\nelsif true\n2\nelse\nreturn 3\nend\nend")).to eq "<def a\nif <true>\n<1>\nelsif <true>\n<2>\nelse\nreturn <3>\nend\nend>"
538
+ expect(wrap("def a\nif true\nif true\nreturn 1\nend\nend\nend")).to eq "<def a\nif <true>\nif <true>\nreturn <1>\nend\nend\nend>"
539
+ expect(wrap("def a\nunless true\nreturn 1\nend\nend")).to eq "<def a\nunless <true>\nreturn <1>\nend\nend>"
540
+ expect(wrap("def a\nunless true\n1\nelse\nreturn 2\nend\nend")).to eq "<def a\nunless <true>\n<1>\nelse\nreturn <2>\nend\nend>"
541
+ expect(wrap("def a\ntrue ?\n(return 1) :\n2\nend")).to eq "<def a\n<true> ?\n(return <1>) :\n<2>\nend>"
542
+ expect(wrap("def a\ntrue ?\n1 :\n(return 2)\nend")).to eq "<def a\n<true> ?\n<1> :\n(return <2>)\nend>"
530
543
  end
531
544
 
532
545
  # not sure if I actually want this, or if it's just easier b/c it falls out of the current implementation
533
546
  it 'wraps the conditional from an inline if, when it cannot wrap the entire if' do
534
- expect(wrap("def a\nreturn if 1\nend")).to eq "def a\nreturn if <1>\nend"
547
+ expect(wrap("def a\nreturn if 1\nend")).to eq "<def a\nreturn if <1>\nend>"
535
548
  end
536
549
 
537
550
  it 'does not wrap &&, and, ||, or, not' do
@@ -781,37 +794,37 @@ describe SeeingIsBelieving::WrapExpressions do
781
794
  end
782
795
 
783
796
  describe 'method definitions' do
784
- it 'does not wrap the definition or arguments' do
785
- expect(wrap("def a(b,c=1,*d,&e)\nend")).to eq "def a(b,c=1,*d,&e)\nend"
797
+ it 'does wraps the definition, but not the arguments' do
798
+ expect(wrap("def a(b,c=1,*d,&e)\nend")).to eq "<def a(b,c=1,*d,&e)\nend>"
786
799
  end
787
800
 
788
801
  it 'wraps the body' do
789
- expect(wrap("def a\n1\nend")).to eq "def a\n<1>\nend"
790
- expect(wrap("def a()\n1\nend")).to eq "def a()\n<1>\nend"
802
+ expect(wrap("def a\n1\nend")).to eq "<def a\n<1>\nend>"
803
+ expect(wrap("def a()\n1\nend")).to eq "<def a()\n<1>\nend>"
791
804
  end
792
805
 
793
- it 'does not try to wrap singleton method definitions' do
794
- expect(wrap("def a.b\n1\nend")).to eq "def a.b\n<1>\nend"
795
- expect(wrap("def a.b()\n1\nend")).to eq "def a.b()\n<1>\nend"
806
+ it 'wrap singleton method definitions' do
807
+ expect(wrap("def a.b\n1\nend")).to eq "<def a.b\n<1>\nend>"
808
+ # expect(wrap("def a.b()\n1\nend")).to eq "<def a.b()\n<1>\nend>"
796
809
  end
797
810
 
798
811
  it 'wraps calls to yield' do
799
- expect(wrap("def a\nyield\nend")).to eq "def a\n<yield>\nend"
812
+ expect(wrap("def a\nyield\nend")).to eq "<def a\n<yield>\nend>"
800
813
  end
801
814
 
802
815
  it 'wraps calls to super' do
803
- expect(wrap("def a\nsuper\nend")).to eq "def a\n<super>\nend"
804
- expect(wrap("def a\nsuper 1\nend")).to eq "def a\n<super 1>\nend"
816
+ expect(wrap("def a\nsuper\nend")).to eq "<def a\n<super>\nend>"
817
+ expect(wrap("def a\nsuper 1\nend")).to eq "<def a\n<super 1>\nend>"
805
818
  end
806
819
 
807
820
  it 'wraps the bodies of returns' do
808
- expect(wrap("def a\nreturn 1\nend")).to eq "def a\nreturn <1>\nend"
821
+ expect(wrap("def a\nreturn 1\nend")).to eq "<def a\nreturn <1>\nend>"
809
822
  end
810
823
 
811
824
  it 'wraps the rescue and ensure portion' do
812
- expect(wrap("def a\n1\nrescue\n2\nend")).to eq "def a\n<1>\nrescue\n<2>\nend"
813
- expect(wrap("def a\n1\nrescue\n2\nensure\n3\nend")).to eq "def a\n<1>\nrescue\n<2>\nensure\n<3>\nend"
814
- expect(wrap("def a\n1\nensure\n2\nend")).to eq "def a\n<1>\nensure\n<2>\nend"
825
+ expect(wrap("def a\n1\nrescue\n2\nend")).to eq "<def a\n<1>\nrescue\n<2>\nend>"
826
+ expect(wrap("def a\n1\nrescue\n2\nensure\n3\nend")).to eq "<def a\n<1>\nrescue\n<2>\nensure\n<3>\nend>"
827
+ expect(wrap("def a\n1\nensure\n2\nend")).to eq "<def a\n<1>\nensure\n<2>\nend>"
815
828
  end
816
829
  end
817
830
 
@@ -836,7 +849,7 @@ describe SeeingIsBelieving::WrapExpressions do
836
849
  describe 'BEGIN/END' do
837
850
  # not implemented b/c we cannot wrap around these either.
838
851
  # So what does it mean to wrap around?
839
- # mabe this?
852
+ # maybe this?
840
853
  # 1
841
854
  # BEGIN {}
842
855
  # 2