From eb77573c45bb38481386564f143692fdc2d3d1f2 Mon Sep 17 00:00:00 2001 From: "Josep M. Bach" Date: Fri, 8 Apr 2011 14:49:42 +0200 Subject: [PATCH] Clean up tests --- .../acceptance/interpreter_acceptance_test.rb | 20 +++++ test/schemer/interpreter/stdlib_test.rb | 89 ++++++++++++++++++- test/test_helper.rb | 1 - 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 test/acceptance/interpreter_acceptance_test.rb diff --git a/test/acceptance/interpreter_acceptance_test.rb b/test/acceptance/interpreter_acceptance_test.rb new file mode 100644 index 0000000..9d8d6b4 --- /dev/null +++ b/test/acceptance/interpreter_acceptance_test.rb @@ -0,0 +1,20 @@ +require 'test_helper' + +module Schemer + class InterpreterAcceptanceTest < MiniTest::Unit::TestCase + def test_interpreter_acceptance + lexer = Lexer.new + + Dir["examples/equality.scm", + "examples/func.scm", + "examples/simple_func.scm"].each do |filename| + file = File.read(filename) + begin + refute_nil lexer.parse(file) + rescue Parslet::ParseFailed + flunk "Interpreter could not run #{filename}." + end + end + end + end +end diff --git a/test/schemer/interpreter/stdlib_test.rb b/test/schemer/interpreter/stdlib_test.rb index 590ec57..2b12fdd 100644 --- a/test/schemer/interpreter/stdlib_test.rb +++ b/test/schemer/interpreter/stdlib_test.rb @@ -30,13 +30,100 @@ def test_write_prints_to_stdout ast = @parser.apply(@lexer.parse "(write 4)") evaluated = Schemer::Interpreter.new(ast).walk - assert_equal nil, evaluated + assert_nil evaluated end def test_inspect_returns_the_object_as_string assert_evaluates "#", "(inspect (1 3))" end + def test_define_declares_a_variable + ast = @parser.apply(@lexer.parse "(define number 3)") + interpreter = Schemer::Interpreter.new(ast) + assert_nil interpreter.walk + assert_equal 3, interpreter.env.get_binding(:number) + end + + def test_define_declares_from_an_expression + ast = @parser.apply(@lexer.parse "(define number (* 3 2))") + interpreter = Schemer::Interpreter.new(ast) + assert_nil interpreter.walk + assert_equal 6, interpreter.env.get_binding(:number) + end + + def test_define_declares_a_function + assert_evaluates 25, "(define (square x) (* x x))(square 5)" + end + + def test_define_declares_a_function_edge_case + ast = @parser.apply(@lexer.parse "(define (make-list x) (list 3 x))(make-list 5)") + evaluated = Schemer::Interpreter.new(ast).walk + + assert_kind_of AST::List, evaluated + assert_equal 3, evaluated.elements.first + assert_equal 5, evaluated.elements.last + end + + def test_define_declares_a_function_from_a_lambda + assert_evaluates 25, "(define square (lambda (x) (* x x)))(square 5)" + end + + def test_car_returns_the_first_element_of_a_list + assert_evaluates 8, "(car (8 3))" + end + + def test_cdr_returns_the_last_element_of_a_list + assert_evaluates 3, "(cdr (9 3))" + end + + def test_cadr_returns_the_first_of_the_last_element_of_a_list + assert_evaluates 3, "(cadr (1 (3 2)))" + end + + def test_caddr_returns_the_first_of_the_last_element_of_the_last_element_of_a_list + assert_evaluates 1, "(caddr (8 (3 (1 2))))" + end + + def test_list_converts_elements_to_a_list + ast = @parser.apply(@lexer.parse "(list 3 4 x y)") + evaluated = Schemer::Interpreter.new(ast).walk + + assert_kind_of AST::List, evaluated + assert_equal 4, evaluated.elements.size + end + + def test_null_returns_whether_the_object_is_nil + assert_evaluates false, "(null? 3)" + end + + def test_null_returns_whether_the_object_is_not_nil + assert_evaluates true, "(null? ())" + end + + def test_eq_operator_checks_for_equality + assert_evaluates true, "(= 3 (+ 1 2))" + end + + def test_eqv_operator_checks_for_equivalence + assert_evaluates true, "(eqv? 3 (+ 1 2))" + end + + def test_lower_than + assert_evaluates true, "(< 3 (+ 2 2))" + end + + def test_greater_than + assert_evaluates false, "(> 3 (+ 2 2))" + end + + def test_cond_returns_the_first_truthy_condition + assert_evaluates 7, "(cond ((< 3 1) 9) ((>3 1) 7) )" + end + + def test_cond_returns_the_first_truthy_condition_even_if_it_is_an_expression + assert_evaluates 12, "(cond ((< 3 1) 9) ((>3 8) 7) ((= 3 3) (+ 3 9)) )" + end + private def assert_evaluates(expected, expression) diff --git a/test/test_helper.rb b/test/test_helper.rb index 58e658f..d9895d5 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,6 @@ gem 'minitest' require 'minitest/unit' require 'minitest/autorun' -require 'minitest/pride' require 'mocha' require 'schemer'