97cf5e5bea
comes from finally tightning the root and not allowing random expression code ala ruby
88 lines
2.4 KiB
Ruby
88 lines
2.4 KiB
Ruby
require_relative "setup"
|
|
require "parslet/convenience"
|
|
|
|
|
|
|
|
# Older test harness
|
|
module ParserHelper
|
|
|
|
def self.included(base)
|
|
base.send :include, InstanceMethods #provides helpers and setup
|
|
base.send :include, AST::true_statements
|
|
base.send :extend, ClassMethods #gets the method creation going
|
|
end
|
|
|
|
module InstanceMethods
|
|
def setup
|
|
@parser = Parser::Salama.new
|
|
@transform = Parser::Transform.new
|
|
end
|
|
|
|
# check that @string_input parses correctly to @parse_output
|
|
def check_parse
|
|
is = @parser.parse_with_debug(@string_input)
|
|
assert_equal @parse_output , is
|
|
end
|
|
|
|
#check that @parse_output transforms to @transform_output
|
|
def check_transform
|
|
is = @transform.apply @parse_output
|
|
#puts is.transform
|
|
assert_equal @transform_output , is
|
|
end
|
|
|
|
# check that @string_input parses and transforms to @transform_output
|
|
def check_ast
|
|
syntax = @parser.parse(@string_input)
|
|
is = @transform.apply(syntax)
|
|
puts is.inspect
|
|
assert_equal @transform_output , is
|
|
end
|
|
|
|
def check_write test
|
|
dirname = decamelize(self.class.name)[10 .. -1]
|
|
test = test[5 .. -1]
|
|
syntax = @parser.parse_with_debug(@string_input)
|
|
out = Parser::Transform.new.apply(syntax).inspect
|
|
dir = File.dirname(__FILE__) + "/" + dirname
|
|
FileUtils.mkdir_p(dir) unless File.exists?(dir)
|
|
out_file = File.new(dir + "/" + test + ".tst", "w")
|
|
out_file.puts @string_input
|
|
out_file.puts "-- -- --"
|
|
out_file.puts out
|
|
out_file.close
|
|
end
|
|
|
|
def decamelize str
|
|
str.gsub(/(^|[a-z])([A-Z])/) do
|
|
($1.empty?)? $2 : "#{$1}_#{$2}"
|
|
end.downcase
|
|
end
|
|
|
|
def camelize str
|
|
str.gsub(/(^|_)([a-z])/) { $2.upcase }
|
|
end
|
|
end
|
|
|
|
|
|
module ClassMethods
|
|
# this creates test methods dynamically. For each test_* method we create
|
|
# three test_*[ast/parse/transf] methods that in turn check the three phases.
|
|
# runnable_methods is called by minitest to determine which tests to run
|
|
def runnable_methods
|
|
tests = []
|
|
public_instance_methods(true).grep(/^test_/).map(&:to_s).each do |test|
|
|
["write"].each do |what|
|
|
name = "#{test}_#{what}"
|
|
tests << name
|
|
self.send(:define_method, name ) do
|
|
send(test)
|
|
send("check_#{what}" , test)
|
|
end
|
|
end
|
|
end
|
|
tests
|
|
end
|
|
end
|
|
end
|