Class: Lisp::Testing

Inherits:
Object show all
Defined in:
lib/rubylisp/testing.rb

Class Method Summary collapse

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.dump_messages(header, messages)
  return if messages.empty?
  puts "  #{header}:"
  messages.each do |message|
    puts "    #{message}"
  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
    message = "failed: #{code.print_string} is #{c1.print_string}, expected #{inverted ? 'not ' : ''}#{c2.print_string}"
    puts message
    @@failure_messages << message
  end
end

.initObject



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


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 ""
  
  dump_messages("Errors", @@error_messages)
  dump_messages("Failures", @@failure_messages)
  
  puts "  #{@@number_of_tests} Lisp tests"
  puts "  #{@@number_of_passes} passes, #{@@number_of_fails} fails, #{@@number_of_errors} errors"
end

.registerObject



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_testsObject



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

.unary_check(name, sexpr, env, inverted) ⇒ Object



45
46
47
48
49
# File 'lib/rubylisp/testing.rb', line 45

def self.unary_check(name,sexpr, env, inverted)
  print "    (#{name} #{sexpr.print_string}) - "
  c1 = sexpr.evaluate(env)
  self.eval_check(sexpr, c1, inverted ? Lisp::FALSE : Lisp::TRUE, false)
end