@ -0,0 +1,40 @@ | |||||
class MalTestRunner | |||||
def initialize(@test_file) | |||||
end | |||||
private macro check_EOF | |||||
return if l.is_a? Iterator::Stop | |||||
end | |||||
def each_test | |||||
lines = File.open(@test_file).each_line | |||||
until (l = lines.next).is_a? Iterator::Stop | |||||
while l =~ /^\s*(;|$)/ | |||||
l = lines.next | |||||
check_EOF | |||||
end | |||||
check_EOF | |||||
input = l | |||||
output = [] of String | |||||
loop do | |||||
l = lines.next | |||||
check_EOF | |||||
if l =~ /^; / | |||||
output << l[2..-1] | |||||
else | |||||
break | |||||
end | |||||
end | |||||
if l =~ /^;=>/ | |||||
yield input, output, l[3..-1] | |||||
else | |||||
yield input, output, nil | |||||
end | |||||
end | |||||
end | |||||
end |
@ -0,0 +1,22 @@ | |||||
require "../../helper" | |||||
require "./mal_spec_runner.cr" | |||||
describe "'Make a Lisp' tests" do | |||||
it "tests step2 of mal" do | |||||
runner = MalTestRunner.new(__DIR__ + "/tests/step2_eval.mal") | |||||
i = Crisp::Interpreter.new | |||||
runner.each_test do |input, output, result| | |||||
if result | |||||
r = i.print i.eval_string(input) | |||||
else | |||||
output.empty?.should be_false | |||||
begin | |||||
i.eval_string(input) | |||||
rescue e | |||||
e.message.should match(/#{output.last.chomp}/) | |||||
end | |||||
end | |||||
end | |||||
end | |||||
end |