From dd97e96aca5c405c4cf0efda710d62cd3eddffd3 Mon Sep 17 00:00:00 2001 From: alpha Date: Fri, 22 Jul 2022 23:39:39 +0000 Subject: [PATCH] run lox tests from the book's repo, inspired by @hparker FossilOrigin-Name: f477507f650934b9117cce181e4cdc50dda31c1126651319132feb7c768a1a93 --- ruby/test/test_helper.rb | 32 ++++++++++++++++++++++++++++++++ ruby/test/test_lox.rb | 1 - 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ruby/test/test_helper.rb b/ruby/test/test_helper.rb index 2b59721..4ed7277 100644 --- a/ruby/test/test_helper.rb +++ b/ruby/test/test_helper.rb @@ -2,5 +2,37 @@ require "minitest" module Lox class Test < Minitest::Test + LOX_BIN = File.expand_path("../bin/lox", __dir__) + + def assert_lox(path) + src = File.read(path) + + expected_out = src.scan(/(?<=\/\/ expect: )(?~\n)/).join("\n") + + out, _err, _status = Open3.capture3(LOX_BIN, path) + + assert_equal expected_out, out + end + end + + book_src = File.expand_path(ENV.fetch("CRAFTING_INTERPRETERS_SRC")) + Dir.chdir(book_src) do + lox_tests = Dir["./test/**/*.lox"] + .group_by {|path| path.rpartition(?/).first.sub(/\.\/test\/?/, "") } + + lox_tests.each do |dir, paths| + klass = Class.new(Test) do + paths.each do |path| + name = File.basename(path, ".lox") + define_method("test_#{name}") do + assert_lox File.expand_path(path, book_src) + end + end + end + + suite = dir.split(?/).map(&:capitalize).join + suite = "Root" if suite.empty? + Object.const_set("Test#{suite}", klass) + end end end diff --git a/ruby/test/test_lox.rb b/ruby/test/test_lox.rb index 21b62d6..afdff93 100644 --- a/ruby/test/test_lox.rb +++ b/ruby/test/test_lox.rb @@ -34,4 +34,3 @@ class TestRunner < Lox::Test runner.run("src") end end -