зеркало из https://github.com/github/ruby.git
[ruby/irb] Improve RubyLex's tests
(https://github.com/ruby/irb/pull/484) * Improve assert_indenting helper Instead of putting assertions inside the `auto_indent` block, we can just make `auto_indent` return the calculated space count, and use it for assertion outside of the `auto_indent` block call. This simplifies the setup code and makes the intention easier to understand. * Introduce assert_row_indenting helper 1. Helper users shouldn't need to write 2 assertions for the current and the next line's indentation. 2. With this new approach, we can generate clearer error message for both cases: When the current line's space count doesn't match ``` Incorrect spaces calculation for line: ``` > def each_top_level_statement ``` All lines: ``` def each_top_level_statement ``` <0> expected but was <nil> ``` When the next line's space count doesn't match ``` Incorrect spaces calculation for line after the current line: ``` def each_top_level_statement > ``` All lines: ``` def each_top_level_statement ``` <3> expected but was <2> ``` * Replace assert_indenting with assert_row_indenting
This commit is contained in:
Родитель
5baef07506
Коммит
50e77b6a9c
|
@ -10,14 +10,15 @@ module TestIRB
|
|||
Row = Struct.new(:content, :current_line_spaces, :new_line_spaces, :nesting_level)
|
||||
|
||||
class MockIO_AutoIndent
|
||||
def initialize(params, &assertion)
|
||||
attr_reader :calculated_indent
|
||||
|
||||
def initialize(*params)
|
||||
@params = params
|
||||
@assertion = assertion
|
||||
@calculated_indent
|
||||
end
|
||||
|
||||
def auto_indent(&block)
|
||||
result = block.call(*@params)
|
||||
@assertion.call(result)
|
||||
@calculated_indent = block.call(*@params)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -29,20 +30,56 @@ module TestIRB
|
|||
restore_encodings
|
||||
end
|
||||
|
||||
def assert_indenting(lines, correct_space_count, add_new_line)
|
||||
def calculate_indenting(lines, add_new_line)
|
||||
lines = lines + [""] if add_new_line
|
||||
last_line_index = lines.length - 1
|
||||
byte_pointer = lines.last.length
|
||||
|
||||
context = build_context
|
||||
context.auto_indent_mode = true
|
||||
|
||||
ruby_lex = RubyLex.new(context)
|
||||
io = MockIO_AutoIndent.new([lines, last_line_index, byte_pointer, add_new_line]) do |auto_indent|
|
||||
error_message = "Calculated the wrong number of spaces for:\n #{lines.join("\n")}"
|
||||
assert_equal(correct_space_count, auto_indent, error_message)
|
||||
end
|
||||
ruby_lex.set_input(io)
|
||||
mock_io = MockIO_AutoIndent.new(lines, last_line_index, byte_pointer, add_new_line)
|
||||
|
||||
ruby_lex.set_input(mock_io)
|
||||
ruby_lex.set_auto_indent
|
||||
mock_io.calculated_indent
|
||||
end
|
||||
|
||||
def assert_row_indenting(lines, row)
|
||||
actual_current_line_spaces = calculate_indenting(lines, false)
|
||||
|
||||
error_message = <<~MSG
|
||||
Incorrect spaces calculation for line:
|
||||
|
||||
```
|
||||
> #{lines.last}
|
||||
```
|
||||
|
||||
All lines:
|
||||
|
||||
```
|
||||
#{lines.join("\n")}
|
||||
```
|
||||
MSG
|
||||
assert_equal(row.current_line_spaces, actual_current_line_spaces, error_message)
|
||||
|
||||
error_message = <<~MSG
|
||||
Incorrect spaces calculation for line after the current line:
|
||||
|
||||
```
|
||||
#{lines.last}
|
||||
>
|
||||
```
|
||||
|
||||
All lines:
|
||||
|
||||
```
|
||||
#{lines.join("\n")}
|
||||
```
|
||||
MSG
|
||||
actual_next_line_spaces = calculate_indenting(lines, true)
|
||||
assert_equal(row.new_line_spaces, actual_next_line_spaces, error_message)
|
||||
end
|
||||
|
||||
def assert_nesting_level(lines, expected, local_variables: [])
|
||||
|
@ -108,8 +145,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -124,8 +160,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -143,8 +178,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -157,8 +191,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -177,8 +210,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -253,8 +285,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -266,8 +297,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -279,8 +309,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -292,8 +321,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -319,8 +347,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -350,8 +377,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -366,8 +392,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -387,8 +412,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -436,8 +460,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -452,8 +475,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -468,8 +490,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -485,8 +506,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -501,8 +521,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -517,8 +536,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -533,8 +551,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -549,8 +566,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -575,8 +591,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -592,8 +607,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
@ -611,8 +625,7 @@ module TestIRB
|
|||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
assert_row_indenting(lines, row)
|
||||
assert_nesting_level(lines, row.nesting_level)
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче