M
Massimiliano Mirra - bard
I was documenting a class and found myself often copying unit tests
and pasting them as examples. I think I also read something about
tests embedded in doc strings in Python. So in the interest of DRY I
figured something like this could be desirable:
class Calculator
extend Literate
example
# Addition
add(2, 8) == 10
end
def add(a, b)
return a + b
end
end
I then came up with a stupid but working proof of concept:
class Calculator
extend Literate
example(__FILE__, __LINE__) do |calc|
# Addition
calc.add(2, 8) == 10
end
def add(a, b)
return a + b
end
example(__FILE__, __LINE__) do |calc|
# Integer division
calc.div(10, 2) == 5
end
def div(a, b)
return a / b + 1
end
end
When examples are run as tests and a test does not pass (as the div
example above), this is the output:
Test passed at line 17.
Test failed at line 27:
# Integer division
calc.div(10, 2) == 5
This is the rest:
module Literate
def examples
@examples ||= []
end
def example(file, line, &example)
@examples ||= []
@examples << [file, line, example]
end
end
Calculator.examples.each do |file, line, example|
c = Calculator.new
if example.call(c)
puts "Test passed at line #{line}."
else
puts "Test failed at line #{line}:"
puts File.readlines(file)[line, 2]
end
end
What do you think?
Massimiliano
and pasting them as examples. I think I also read something about
tests embedded in doc strings in Python. So in the interest of DRY I
figured something like this could be desirable:
class Calculator
extend Literate
example
# Addition
add(2, 8) == 10
end
def add(a, b)
return a + b
end
end
I then came up with a stupid but working proof of concept:
class Calculator
extend Literate
example(__FILE__, __LINE__) do |calc|
# Addition
calc.add(2, 8) == 10
end
def add(a, b)
return a + b
end
example(__FILE__, __LINE__) do |calc|
# Integer division
calc.div(10, 2) == 5
end
def div(a, b)
return a / b + 1
end
end
When examples are run as tests and a test does not pass (as the div
example above), this is the output:
Test passed at line 17.
Test failed at line 27:
# Integer division
calc.div(10, 2) == 5
This is the rest:
module Literate
def examples
@examples ||= []
end
def example(file, line, &example)
@examples ||= []
@examples << [file, line, example]
end
end
Calculator.examples.each do |file, line, example|
c = Calculator.new
if example.call(c)
puts "Test passed at line #{line}."
else
puts "Test failed at line #{line}:"
puts File.readlines(file)[line, 2]
end
end
What do you think?
Massimiliano