seeing_is_believing 0.0.9 → 0.0.10

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.
@@ -1,5 +1,7 @@
1
- require 'seeing_is_believing/arg_parser'
2
- require 'seeing_is_believing/print_results_next_to_lines'
1
+ require 'seeing_is_believing'
2
+ require 'seeing_is_believing/binary/arg_parser'
3
+ require 'seeing_is_believing/binary/print_results_next_to_lines'
4
+
3
5
 
4
6
  class SeeingIsBelieving
5
7
  class Binary
@@ -17,7 +19,7 @@ class SeeingIsBelieving
17
19
  elsif should_print_help? then print_help ; 0
18
20
  elsif has_filename? && file_dne? then print_file_dne ; 1
19
21
  elsif invalid_syntax? then print_syntax_error ; 1
20
- else print_program ; (printer.has_exception? ? 1 : 0)
22
+ else print_program ; (results.has_exception? ? 1 : 0)
21
23
  end
22
24
  end
23
25
 
@@ -25,27 +27,23 @@ class SeeingIsBelieving
25
27
 
26
28
  private
27
29
 
28
- def filename
30
+ def has_filename?
29
31
  flags[:filename]
30
32
  end
31
- alias has_filename? filename
32
33
 
33
- # le sigh
34
+ def body
35
+ @body ||= PrintResultsNextToLines.remove_previous_output_from \
36
+ (file_is_on_stdin? ? stdin.read : File.read(flags[:filename]))
37
+ end
38
+
39
+ def results
40
+ @results ||= SeeingIsBelieving.call body,
41
+ filename: flags[:filename],
42
+ stdin: (file_is_on_stdin? ? '' : stdin)
43
+ end
44
+
34
45
  def printer
35
- @printer ||= begin
36
- if file_is_on_stdin?
37
- body = stdin.read
38
- stdin = ''
39
- else
40
- body = File.read(filename)
41
- stdin = self.stdin
42
- end
43
- PrintResultsNextToLines.new body,
44
- stdin,
45
- filename: filename,
46
- start_line: flags[:start_line],
47
- end_line: flags[:end_line]
48
- end
46
+ @printer ||= PrintResultsNextToLines.new body, results, flags
49
47
  end
50
48
 
51
49
  def flags
@@ -69,15 +67,15 @@ class SeeingIsBelieving
69
67
  end
70
68
 
71
69
  def file_is_on_stdin?
72
- filename.nil?
70
+ flags[:filename].nil?
73
71
  end
74
72
 
75
73
  def file_dne?
76
- !File.exist?(filename)
74
+ !File.exist?(flags[:filename])
77
75
  end
78
76
 
79
77
  def print_file_dne
80
- stderr.puts "#{filename} does not exist!"
78
+ stderr.puts "#{flags[:filename]} does not exist!"
81
79
  end
82
80
 
83
81
  def print_program
@@ -85,8 +83,8 @@ class SeeingIsBelieving
85
83
  end
86
84
 
87
85
  def syntax_error_notice
88
- return if file_is_on_stdin? # <-- should probably check stdin too
89
- out, err, syntax_status = Open3.capture3('ruby', '-c', filename)
86
+ return if file_is_on_stdin? # <-- BUG: should check stdin too
87
+ out, err, syntax_status = Open3.capture3 'ruby', '-c', flags[:filename]
90
88
  return err unless syntax_status.success?
91
89
  end
92
90
 
@@ -97,5 +95,6 @@ class SeeingIsBelieving
97
95
  def print_syntax_error
98
96
  stderr.puts syntax_error_notice
99
97
  end
98
+
100
99
  end
101
100
  end
@@ -20,17 +20,18 @@ require 'seeing_is_believing/hard_core_ensure'
20
20
 
21
21
  class SeeingIsBelieving
22
22
  class EvaluateByMovingFiles
23
- attr_accessor :program, :filename, :error_stream, :input_stream
23
+ attr_accessor :program, :filename, :error_stream, :input_stream, :matrix_filename
24
24
 
25
25
  def initialize(program, filename, options={})
26
- self.program = program
27
- self.filename = File.expand_path(filename)
28
- self.error_stream = options.fetch :error_stream, $stderr # hmm, not really liking the global here
29
- self.input_stream = options.fetch :input_stream, StringIO.new('')
26
+ self.program = program
27
+ self.filename = filename
28
+ self.error_stream = options.fetch :error_stream, $stderr # hmm, not really liking the global here
29
+ self.input_stream = options.fetch :input_stream, StringIO.new('')
30
+ self.matrix_filename = options[:matrix_filename] || 'seeing_is_believing/the_matrix'
30
31
  end
31
32
 
32
33
  def call
33
- @result ||= HardCoreEnsure.call(
34
+ @result ||= HardCoreEnsure.call \
34
35
  code: -> {
35
36
  dont_overwrite_existing_tempfile!
36
37
  move_file_to_tempfile
@@ -47,7 +48,6 @@ class SeeingIsBelieving
47
48
  ensure: -> {
48
49
  restore_backup
49
50
  }
50
- )
51
51
  end
52
52
 
53
53
  def file_directory
@@ -83,9 +83,8 @@ class SeeingIsBelieving
83
83
 
84
84
  def evaluate_file
85
85
  Open3.popen3 'ruby', '-W0', # no warnings (b/c I hijack STDOUT/STDERR)
86
- '-I', File.expand_path('../..', __FILE__), # fix load path
87
- '-r', 'seeing_is_believing/the_matrix', # hijack the environment so it can be recorded
88
- '-C', file_directory, # run in the file's directory
86
+ '-I', File.expand_path('../..', __FILE__), # add lib to the load path
87
+ '-r', matrix_filename, # hijack the environment so it can be recorded
89
88
  filename do |i, o, e, t|
90
89
  out_reader = Thread.new { o.read }
91
90
  err_reader = Thread.new { e.read }
@@ -21,19 +21,18 @@ class SeeingIsBelieving
21
21
  self.get_next_line = options.fetch :get_next_line
22
22
  self.peek_next_line = options.fetch :peek_next_line
23
23
  self.on_complete = options.fetch :on_complete
24
- @line_number = 0
25
24
  end
26
25
 
27
26
  def call
28
- expressions = []
29
- expression = nil
27
+ offset, expressions, expression = 0, [], nil
30
28
  begin
31
29
  pending_expression = generate
32
30
  debug { "GENERATED: #{pending_expression.expression.inspect}, ADDING IT TO #{inspected_expressions expressions}" }
33
31
  expressions << pending_expression
34
- expression = reduce expressions unless next_line_modifies_current?
32
+ expression = reduce expressions, offset unless next_line_modifies_current?
33
+ offset += 1
35
34
  end until expressions.empty?
36
- expression
35
+ return expression, offset
37
36
  end
38
37
 
39
38
  private
@@ -41,7 +40,6 @@ class SeeingIsBelieving
41
40
  attr_accessor :debug_stream, :should_debug, :get_next_line, :peek_next_line, :on_complete, :expressions
42
41
 
43
42
  def generate
44
- @line_number += 1
45
43
  expression = get_next_line.call
46
44
  raise SyntaxError unless expression
47
45
  PendingExpression.new(expression, [])
@@ -49,9 +47,8 @@ class SeeingIsBelieving
49
47
 
50
48
  def next_line_modifies_current?
51
49
  # method invocations can be put on the next line, and begin with a dot.
52
- # I think that's the only case we need to worry about. e.g:
53
- # 3
54
- # .times { |i| p i }
50
+ # I think that's the only case we need to worry about.
51
+ # e.g: `3\n.times { |i| p i }`
55
52
  peek_next_line.call && peek_next_line.call =~ /^\s*\./
56
53
  end
57
54
 
@@ -67,7 +64,7 @@ class SeeingIsBelieving
67
64
  @debug_stream.puts yield if debug?
68
65
  end
69
66
 
70
- def reduce(expressions)
67
+ def reduce(expressions, offset)
71
68
  expressions.size.times do |i|
72
69
  expression = expressions[i..-1].map(&:expression) # uhm, should this expression we are checking for validity consider the children?
73
70
  .join("\n") # must use newline otherwise can get expressions like `a\\+b` that should be `a\\\n+b`, former is invalid
@@ -76,7 +73,7 @@ class SeeingIsBelieving
76
73
  result = on_complete.call(expressions[i].expression,
77
74
  expressions[i].children,
78
75
  expressions[i+1..-1].map { |pe| [pe.expression, pe.children] }.flatten, # hmmm, not sure this is really correct, but it allows it to work for my use cases
79
- @line_number)
76
+ offset)
80
77
  expressions.replace expressions[0, i]
81
78
  expressions[i-1].children << result unless expressions.empty?
82
79
  debug { "REDUCED: #{result.inspect}, LIST: #{inspected_expressions expressions}" }
@@ -1,3 +1,3 @@
1
1
  class SeeingIsBelieving
2
- VERSION = '0.0.9'
2
+ VERSION = '0.0.10'
3
3
  end
@@ -11,18 +11,49 @@ class SeeingIsBelieving
11
11
  include TracksLineNumbersSeen
12
12
  BLANK_REGEX = /\A\s*\Z/
13
13
 
14
+ def self.call(*args)
15
+ new(*args).call
16
+ end
17
+
14
18
  def initialize(string_or_stream, options={})
15
- @string = string_or_stream
16
- @stream = to_stream string_or_stream
17
- @filename = options[:filename]
18
- @stdin = to_stream options.fetch(:stdin, '')
19
+ @string = string_or_stream
20
+ @stream = to_stream string_or_stream
21
+ @matrix_filename = options[:matrix_filename]
22
+ @filename = options[:filename]
23
+ @stdin = to_stream options.fetch(:stdin, '')
24
+ @line_number = 1
19
25
  end
20
26
 
27
+ # :( refactor me
21
28
  def call
22
29
  @memoized_result ||= begin
30
+ # extract leading comments, leading =begin and magic comments can't be wrapped for exceptions without breaking
31
+ leading_comments = ''
32
+ while next_line_queue.peek =~ /^\s*#/
33
+ leading_comments << next_line_queue.dequeue << "\n"
34
+ @line_number += 1
35
+ end
36
+ while next_line_queue.peek == '=begin'
37
+ lines = next_line_queue.dequeue << "\n"
38
+ @line_number += 1
39
+ until SyntaxAnalyzer.begin_and_end_comments_are_complete? lines
40
+ lines << next_line_queue.dequeue << "\n"
41
+ @line_number += 1
42
+ end
43
+ leading_comments << lines
44
+ end
45
+
46
+ # extract program
23
47
  program = ''
24
- program << expression_list.call until next_line_queue.peek.nil? || data_segment?
25
- program = record_exceptions_in program
48
+ until next_line_queue.peek.nil? || data_segment?
49
+ expression, expression_size = expression_list.call
50
+ program << expression
51
+ track_line_number @line_number
52
+ @line_number += expression_size
53
+ end
54
+ program = leading_comments + record_exceptions_in(program)
55
+
56
+ # extract data segment
26
57
  program << "\n" << the_rest_of_the_stream if data_segment?
27
58
  result_for program, min_line_number, max_line_number
28
59
  end
@@ -30,18 +61,17 @@ class SeeingIsBelieving
30
61
 
31
62
  private
32
63
 
33
- attr_reader :stream
64
+ attr_reader :stream, :matrix_filename
34
65
 
35
66
  def expression_list
36
67
  @expression_list ||= ExpressionList.new get_next_line: lambda { next_line_queue.dequeue },
37
68
  peek_next_line: lambda { next_line_queue.peek },
38
- on_complete: lambda { |line, children, completions, line_number|
39
- track_line_number line_number
69
+ on_complete: lambda { |line, children, completions, offset|
40
70
  expression = [line, *children, *completions].map(&:chomp).join("\n")
41
71
  if do_not_record? expression
42
72
  expression + "\n"
43
73
  else
44
- record_yahself(expression, line_number) + "\n"
74
+ record_yahself(expression, @line_number+offset) + "\n"
45
75
  end
46
76
  }
47
77
  end
@@ -68,7 +98,7 @@ class SeeingIsBelieving
68
98
  def result_for(program, min_line_number, max_line_number)
69
99
  Dir.mktmpdir "seeing_is_believing_temp_dir" do |dir|
70
100
  filename = @filename || File.join(dir, 'program.rb')
71
- EvaluateByMovingFiles.new(program, filename, input_stream: @stdin).call.tap do |result|
101
+ EvaluateByMovingFiles.new(program, filename, input_stream: @stdin, matrix_filename: matrix_filename).call.tap do |result|
72
102
  result.track_line_number min_line_number
73
103
  result.track_line_number max_line_number
74
104
  end
@@ -84,10 +114,7 @@ class SeeingIsBelieving
84
114
  end
85
115
 
86
116
  def next_line_queue
87
- @next_line_queue ||= Queue.new do
88
- line = stream.gets
89
- line && line.chomp
90
- end
117
+ @next_line_queue ||= Queue.new { (line = stream.gets) && line.chomp }
91
118
  end
92
119
 
93
120
  def the_rest_of_the_stream
@@ -1,6 +1,6 @@
1
- require 'seeing_is_believing/arg_parser'
1
+ require 'seeing_is_believing/binary/arg_parser'
2
2
 
3
- describe SeeingIsBelieving::ArgParser do
3
+ describe SeeingIsBelieving::Binary::ArgParser do
4
4
  RSpec::Matchers.define :have_error do |error_assertion|
5
5
  match do |options|
6
6
  options[:errors].find do |error|
@@ -26,6 +26,20 @@ describe SeeingIsBelieving::ArgParser do
26
26
  described_class.parse args
27
27
  end
28
28
 
29
+ shared_examples 'it requires a positive int argument' do |flags|
30
+ it 'expects an integer argument' do
31
+ flags.each do |flag|
32
+ parse([flag, '1']).should_not have_error /#{flag}/
33
+ parse([flag, '0']).should have_error /#{flag}/
34
+ parse([flag, '-1']).should have_error /#{flag}/
35
+ parse([flag, '1.0']).should have_error /#{flag}/
36
+ parse([flag, 'a']).should have_error /#{flag}/
37
+ parse([flag, '' ]).should have_error /#{flag}/
38
+ parse([flag ]).should have_error /#{flag}/
39
+ end
40
+ end
41
+ end
42
+
29
43
  specify 'unknown options set an error' do
30
44
  parse(['--abc']).should have_error 'Unknown option: "--abc"'
31
45
  parse(['-a']).should have_error 'Unknown option: "-a"'
@@ -68,18 +82,7 @@ describe SeeingIsBelieving::ArgParser do
68
82
  parse(['--start-line', '12'])[:start_line].should == 12
69
83
  end
70
84
 
71
- it 'sets an error if it cannot be turned into a positive integer' do
72
- line_error_assertions = lambda do |flag|
73
- parse([flag, '1']).should_not have_error /#{flag}/
74
- parse([flag, '0']).should have_error /#{flag}/
75
- parse([flag, 'a']).should have_error /#{flag}/
76
- parse([flag, '']).should have_error /#{flag}/
77
- parse([flag, '1.0']).should have_error /#{flag}/
78
- parse([flag]).should have_error /#{flag}/
79
- end
80
- line_error_assertions['-l']
81
- line_error_assertions['--start-line']
82
- end
85
+ it_behaves_like 'it requires a positive int argument', ['-l', '--start-line']
83
86
  end
84
87
 
85
88
  describe ':end_line' do
@@ -92,16 +95,7 @@ describe SeeingIsBelieving::ArgParser do
92
95
  parse(['--end-line', '12'])[:end_line].should == 12
93
96
  end
94
97
 
95
- it 'sets an error if it cannot be turned into an integer' do
96
- line_error_assertions = lambda do |flag|
97
- parse([flag, '1']).should_not have_error /#{flag}/
98
- parse([flag, 'a']).should have_error /#{flag}/
99
- parse([flag, '']).should have_error /#{flag}/
100
- parse([flag]).should have_error /#{flag}/
101
- end
102
- line_error_assertions['-L']
103
- line_error_assertions['--end-line']
104
- end
98
+ it_behaves_like 'it requires a positive int argument', ['-L', '--end-line']
105
99
  end
106
100
 
107
101
  it 'swaps start and end line around if they are out of order' do
@@ -109,6 +103,32 @@ describe SeeingIsBelieving::ArgParser do
109
103
  parse(%w[-l 2 -L 1])[:end_line].should == 2
110
104
  end
111
105
 
106
+ describe ':result_length' do
107
+ it 'defaults to infinity' do
108
+ parse([])[:result_length].should == Float::INFINITY
109
+ end
110
+
111
+ it 'is set with -D and --result-length' do
112
+ parse(['-D', '10'])[:result_length].should == 10
113
+ parse(['--result-length', '10'])[:result_length].should == 10
114
+ end
115
+
116
+ it_behaves_like 'it requires a positive int argument', ['-D', '--result-length']
117
+ end
118
+
119
+ describe ':line_length' do
120
+ it 'defaults to infinity' do
121
+ parse([])[:line_length].should == Float::INFINITY
122
+ end
123
+
124
+ it 'is set with -d and --line-length' do
125
+ parse(['-d', '10'])[:line_length].should == 10
126
+ parse(['--line-length', '10'])[:line_length].should == 10
127
+ end
128
+
129
+ it_behaves_like 'it requires a positive int argument', ['-d', '--line-length']
130
+ end
131
+
112
132
  describe ':help' do
113
133
  it 'defaults to nil' do
114
134
  parse([])[:help].should be_nil
@@ -68,11 +68,4 @@ describe SeeingIsBelieving::EvaluateByMovingFiles do
68
68
  expect { evaluator.call }.to raise_error
69
69
  stderr.string.should include "It blew up"
70
70
  end
71
-
72
- it "doesn't block waiting for io on stdin" do
73
- reader, writer = IO.pipe
74
- thread = Thread.new { invoke '1', input_stream: reader }
75
- sleep 0.05
76
- thread.should_not be_alive
77
- end
78
71
  end
@@ -16,31 +16,32 @@ describe SeeingIsBelieving::ExpressionList do
16
16
 
17
17
  example 'example: multiple children' do
18
18
  block_invocations = 0
19
- result = call %w[a( b+ c x\\ + y )] do |line, children, completions, line_number|
20
- case line_number
21
- when 3
19
+ result, size = call %w[a( b+ c x\\ + y )] do |line, children, completions, offset|
20
+ case offset
21
+ when 2
22
22
  line.should == 'b+'
23
23
  children.should == []
24
24
  completions.should == ['c']
25
25
  block_invocations += 1
26
26
  'b+c'
27
- when 6
27
+ when 5
28
28
  line.should == 'x\\'
29
29
  children.should == []
30
30
  completions.should == ['+', 'y']
31
31
  block_invocations += 10
32
32
  'x\\+y'
33
- when 7
33
+ when 6
34
34
  line.should == 'a('
35
35
  children.should == ['b+c', 'x\\+y']
36
36
  completions.should == [')']
37
37
  block_invocations += 100
38
38
  'ALL DONE!'
39
39
  else
40
- raise "line_number: #{line_number.inspect}"
40
+ raise "offset: #{offset.inspect}"
41
41
  end
42
42
  end
43
43
  result.should == 'ALL DONE!'
44
+ size.should == 7
44
45
  block_invocations.should == 111
45
46
  end
46
47
 
@@ -53,15 +54,15 @@ describe SeeingIsBelieving::ExpressionList do
53
54
  ' end',
54
55
  'end',
55
56
  ]
56
- result = call expressions do |line, children, completions, line_number|
57
- case line_number
58
- when 3
57
+ result, size = call expressions do |line, children, completions, offset|
58
+ case offset
59
+ when 2
59
60
  [line, children, completions].should == [' n1 + n2', [], []]
60
61
  block_invocations += 1
61
- when 4
62
+ when 3
62
63
  [line, children, completions].should == [' [2].map do |n2|', [' n1 + n2'], [' end']]
63
64
  block_invocations += 10
64
- when 5
65
+ when 4
65
66
  [line, children, completions].should == ['[1].map do |n1|',
66
67
  [" [2].map do |n2|\n n1 + n2\n end"],
67
68
  ['end']]
@@ -77,6 +78,7 @@ describe SeeingIsBelieving::ExpressionList do
77
78
  " n1 + n2\n"\
78
79
  " end\n"\
79
80
  "end"
81
+ size.should == 5
80
82
  end
81
83
 
82
84
 
@@ -87,12 +89,12 @@ describe SeeingIsBelieving::ExpressionList do
87
89
  "n1 + n2",
88
90
  "end end",
89
91
  ]
90
- result = call expressions do |line, children, completions, line_number|
91
- case line_number
92
- when 3
92
+ result, size = call expressions do |line, children, completions, offset|
93
+ case offset
94
+ when 2
93
95
  [line, children, completions].should == ["n1 + n2", [], []]
94
96
  block_invocations += 1
95
- when 4
97
+ when 3
96
98
  # not really sure what this *should* be like, but if this is the result,
97
99
  # then it will work for the use cases I need it for
98
100
  [line, *children, *completions].should == ["[1].map do |n1|",
@@ -101,7 +103,7 @@ describe SeeingIsBelieving::ExpressionList do
101
103
  'end end']
102
104
  block_invocations += 10
103
105
  else
104
- raise "line_number: #{line_number.inspect}"
106
+ raise "offset: #{offset.inspect}"
105
107
  end
106
108
  [line, *children, *completions].join("\n")
107
109
  end
@@ -109,14 +111,15 @@ describe SeeingIsBelieving::ExpressionList do
109
111
  result.should == "[1].map do |n1|\n"\
110
112
  "[2].map do |n2|\n"\
111
113
  "n1 + n2\n"\
112
- "end end"\
114
+ "end end"
115
+ size.should == 4
113
116
  end
114
117
 
115
118
  example 'example: multiline strings with valid code in them' do
116
119
  block_invocations = 0
117
- call ["'", "1", "'"] do |*expressions, line_number|
120
+ call ["'", "1", "'"] do |*expressions, offset|
118
121
  expressions.join('').should == "'1'"
119
- line_number.should == 3
122
+ offset.should == 2
120
123
  block_invocations += 1
121
124
  end
122
125
  block_invocations.should == 1
@@ -124,9 +127,9 @@ describe SeeingIsBelieving::ExpressionList do
124
127
 
125
128
  example 'example: multiline regexps with valid code in them' do
126
129
  block_invocations = 0
127
- call ['/', '1', '/'] do |*expressions, line_number|
130
+ call ['/', '1', '/'] do |*expressions, offset|
128
131
  expressions.join('').should == "/1/"
129
- line_number.should == 3
132
+ offset.should == 2
130
133
  block_invocations += 1
131
134
  end
132
135
  block_invocations.should == 1
@@ -134,9 +137,9 @@ describe SeeingIsBelieving::ExpressionList do
134
137
 
135
138
  example "example: =begin/=end comments" do
136
139
  block_invocations = 0
137
- call ['=begin', '1', '=end'] do |*expressions, line_number|
140
+ call ['=begin', '1', '=end'] do |*expressions, offset|
138
141
  expressions.join('').should == "=begin1=end"
139
- line_number.should == 3
142
+ offset.should == 2
140
143
  block_invocations += 1
141
144
  end
142
145
  block_invocations.should == 1
@@ -144,31 +147,32 @@ describe SeeingIsBelieving::ExpressionList do
144
147
 
145
148
  example "example: heredoc" do
146
149
  pending 'Not sure how to do this, for now just catch it at a higher level' do
147
- result = call ['strings = [<<A, <<-B]', '1', 'A', '2', ' B'] do |*expressions, line_number|
148
- line_number.should == 1
150
+ result, size = call ['strings = [<<A, <<-B]', '1', 'A', '2', ' B'] do |*expressions, offset|
151
+ offset.should == 1
149
152
  expressions.should == ['strings = [<<A, <<B]']
150
153
  'zomg!'
151
154
  end
152
155
  result.should == "zomg!\n1\nA\n2\n B"
156
+ size.should == 5
153
157
  end
154
158
  end
155
159
 
156
160
  example "example: method invocations on next line" do
157
161
  # example 1: consume the expression with lines after
158
- list = list_for ['a', '.b', ' .c', 'irrelevant'] do |*expressions, line_number|
159
- line_number.should == 3
162
+ list = list_for ['a', '.b', ' .c', 'irrelevant'] do |*expressions, offset|
163
+ offset.should == 2
160
164
  expressions.flatten.join('').should == 'a.b .c'
161
165
  'a.b.c'
162
166
  end
163
- list.call.should == 'a.b.c'
167
+ list.call.should == ['a.b.c', 3]
164
168
 
165
169
  # example 2: consume the expression with no lines after
166
- list = list_for ['a', '.b'] do |*expressions, line_number|
167
- line_number.should == 2
170
+ list = list_for ['a', '.b'] do |*expressions, offset|
171
+ offset.should == 1
168
172
  expressions.flatten.join('').should == 'a.b'
169
173
  'result'
170
174
  end
171
- list.call.should == 'result'
175
+ list.call.should == ['result', 2]
172
176
  end
173
177
 
174
178
  example "example: smoke test debug option" do