require 'open3' require 'test/code/testcases' require 'test/code/rubylexervsruby' SEP=''; 'caleb clausen'.each_byte{|ch| SEP<<ch.to_s(2).gsub('0','-').gsub('1','+')} SEP<<'(0)' #require 'test/code/rubyoracle' class<<RubyLexerVsRuby def progress ruby,input; end =begin oracular version was just a bad idea.... def ruby_parsedump(input,output,ruby) #todo: use ruby's md5 lib #recursive ruby call here is unavoidable because -y flag has to be set @oracle||= Open3.popen3("#{ruby} -w -y -c") @oracle[0].write IO.read(input) @oracle[0].flush #timeout=Time.now+0.1 data='' while data.empty? # and Time.now<timeout begin data<< chunk=@oracle[2].read_nonblock(1024) timeout=Time.now+0.02 rescue EOFError # data<<"\nError: premature eof...\n" break rescue Errno::EAGAIN break if data[/^Reading a token: \Z/] and Time.now>=timeout end while chunk end status=0 lines=data.split("\n") File.open(output,"w") { |outfd| lines.each{|line| outfd.puts(line) if /^Shifting/===line if /^#{DeleteWarns::WARNERRREX}|^Error|^(Now at end of input\.)/o===line outfd.puts(line) if status.zero? and $2!="warning" status=1 unless $4 #unless end of input seen @oracle.each{|fd| fd.close} if @oracle @oracle=nil end end } } return status end =end end if __FILE__==$0 require 'test/unit' class LexerTests<Test::Unit::TestCase class LexerTestFailure<RuntimeError; end class DifferencesFromMRILex<LexerTestFailure; end i=-1 test_code= TestCases::TESTCASES.map{|tc| i+=1 name="testcase_#{i}__" esctc=tc.gsub(/['\\]/){"\\"+$&} %[ define_method '#{name}' do difflines=[] begin res=RubyLexerVsRuby.rubylexervsruby('__#{name}','#{esctc}',difflines) difflines.empty? or raise DifferencesFromMRILex, difflines res or raise LexerTestFailure, '' rescue Interrupt: exit rescue Exception=>e: e.message<<"\n"+'while lexing: #{esctc}' raise e end end ] }.to_s illegal_test_code= TestCases::ILLEGAL_TESTCASES.map{|tc| i+=1 name="testcase_#{i}__" esctc=tc.gsub(/['\\]/){"\\"+$&} %[ define_method '#{name}' do difflines=[] begin res=RubyLexerVsRuby.rubylexervsruby('__#{name}','#{esctc}',difflines) difflines.empty? or raise DifferencesFromMRILex, difflines res or raise LexerTestFailure, '' rescue LexerTestFailure: puts 'warning: test failure lexing "#{esctc}"' rescue Interrupt: exit rescue Exception=>e: e.message<<"\n"+'while lexing: #{esctc}' raise e end end ] }.to_s # puts test_code+illegal_test_code eval test_code+illegal_test_code end end