Class: Lisp::Testing
Class Method Summary collapse
- .binary_check(name, sexpr_1, sexpr_2, env, inverted) ⇒ Object
- .check_impl(args, env, inverted = false) ⇒ Object
- .check_not_impl(args, env) ⇒ Object
- .check_star_impl(args, env) ⇒ Object
- .describe_impl(args, env) ⇒ Object
- .do_comparison(c1, c2) ⇒ Object
- .dump_messages(header, messages) ⇒ Object
- .eval_check(code, c1, c2, inverted) ⇒ Object
- .init ⇒ Object
- .print_test_results ⇒ Object
- .register ⇒ Object
- .run_tests ⇒ Object
- .unary_check(name, sexpr, env, inverted) ⇒ Object
Class Method Details
.binary_check(name, sexpr_1, sexpr_2, env, inverted) ⇒ Object
52 53 54 55 56 57 58 59 |
# File 'lib/rubylisp/testing.rb', line 52 def self.binary_check(name, sexpr_1, sexpr_2, env, inverted) print " (#{name} " print "#{sexpr_1.print_string} " print "#{sexpr_2.print_string}) - " c1 = sexpr_1.evaluate(env) c2 = sexpr_2.evaluate(env) self.eval_check(sexpr_1, c1, c2, inverted) end |
.check_impl(args, env, inverted = false) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/rubylisp/testing.rb', line 62 def self.check_impl(args, env, inverted=false) @@number_of_tests += 1 name = inverted ? "check!" : "check" Lisp::Boolean.with_value(case (args.length) when 1 self.unary_check(name, args.car, env, inverted) when 2 self.binary_check(name, args.car, args.cadr, env, inverted) else raise "check takes 1 or 2 arguments, received #{args.length}" end) end |
.check_not_impl(args, env) ⇒ Object
76 77 78 |
# File 'lib/rubylisp/testing.rb', line 76 def self.check_not_impl(args, env) self.check_impl(args, env, true) end |
.check_star_impl(args, env) ⇒ Object
81 82 83 84 85 86 87 88 89 |
# File 'lib/rubylisp/testing.rb', line 81 def self.check_star_impl(args, env) raise "check* needs 2 arguments, received #{args.length}" if args.length != 2 @@number_of_tests += 1 print " (check* #{args.car.print_string} #{args.cadr.print_string}) - " c1 = args.car.evaluate(env) c2 = args.cadr self.eval_check(args.car, c1, c2, false) end |
.describe_impl(args, env) ⇒ Object
13 14 15 16 17 18 19 20 21 |
# File 'lib/rubylisp/testing.rb', line 13 def self.describe_impl(args, env) raise "First arg to describe must be a string or symbol" if !args.car.symbol? && !args.car.string? return if args.cdr.nil? puts puts " #{args.car.to_s}" args.cdr.each do |clause| clause.evaluate(env) end end |
.do_comparison(c1, c2) ⇒ Object
23 24 25 26 27 |
# File 'lib/rubylisp/testing.rb', line 23 def self.do_comparison(c1, c2) return Lisp::TRUE if c1.nil? && c2.nil? return Lisp::FALSE if c1.nil? || c2.nil? Lisp::Boolean.with_value(c1.eq?(c2)) end |
.dump_messages(header, messages) ⇒ Object
100 101 102 103 104 105 106 107 |
# File 'lib/rubylisp/testing.rb', line 100 def self.(header, ) return if .empty? puts " #{header}:" .each do || puts " #{}" end puts "" end |
.eval_check(code, c1, c2, inverted) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/rubylisp/testing.rb', line 29 def self.eval_check(code, c1, c2, inverted) check_result = self.do_comparison(c1, c2) passed = inverted ? check_result.negate : check_result if passed.true? @@number_of_passes += 1 puts "ok" else @@number_of_fails += 1 = "failed: #{code.print_string} is #{c1.print_string}, expected #{inverted ? 'not ' : ''}#{c2.print_string}" puts @@failure_messages << end end |
.init ⇒ Object
91 92 93 94 95 96 97 98 |
# File 'lib/rubylisp/testing.rb', line 91 def self.init @@number_of_tests = 0 @@number_of_fails = 0 @@number_of_passes = 0 @@number_of_errors = 0 @@failure_messages = [] @@error_messages = [] end |
.print_test_results ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/rubylisp/testing.rb', line 109 def self.print_test_results puts "" puts " Done." puts "" ("Errors", @@error_messages) ("Failures", @@failure_messages) puts " #{@@number_of_tests} Lisp tests" puts " #{@@number_of_passes} passes, #{@@number_of_fails} fails, #{@@number_of_errors} errors" end |
.register ⇒ Object
6 7 8 9 10 11 |
# File 'lib/rubylisp/testing.rb', line 6 def self.register Primitive.register("describe") {|args, env| Lisp::Testing::describe_impl(args, env) } Primitive.register("check") {|args, env| Lisp::Testing::check_impl(args, env) } Primitive.register("check!") {|args, env| Lisp::Testing::check_not_impl(args, env) } Primitive.register("check*") {|args, env| Lisp::Testing::check_star_impl(args, env) } end |
.run_tests ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/rubylisp/testing.rb', line 121 def self.run_tests register init Dir[File.dirname(__FILE__) + '/../../lisptest/*_test.lsp'].each do |test_filename| puts "\nLoading #{test_filename}" File.open(test_filename) do |f| code_string = f.read() Parser.new.parse_and_eval_all(code_string) end end print_test_results @@number_of_errors == 0 && @@number_of_fails == 0 end |