class Test

Public Class Methods

new() click to toggle source
# File lib/pre/generate-spec.rb, line 11
def initialize
  time_out = 1
  results = do_test(time_out)
  @spec_file = "spec/regression_spec.rb"
  puts_spec(@spec_file, results)
  
end

Public Instance Methods

append_to_csv(results = @results) click to toggle source
# File lib/tst-reg-test.rb, line 28
def append_to_csv(results = @results)
  results2 = []
  results.each do | key, values |
    values.each do | value |
      value[:reason] = key
      results2.push value
    end
  end
  results2.sort!{|x, y| x[:index] <=> y[:index]}
  if FileTest.exist?(@csv_file)
    old_data = CSV.read(@csv_file, "rb:UTF-8")
    CSV.open(@csv_file, "wb:UTF-8") do |csv|
      csv << (old_data.shift) + [Time.now.to_s]
      results2.each do | result |
        old_row = old_data.shift
        break if !old_row || old_row.size == 0
        regex = result[:test] || result[:reg]
        if old_row[0].to_i != result[:index]
          raise "regex not matched. csv: #{old_row}, new: #{result}"
        end
        csv << old_row + [result[:reason]]
      end
    end
  else
    CSV.open(@csv_file, "wb:UTF-8") do |csv|
      csv << ["ID", "REGEXP", Time.now.to_s]
      results2.each do | result |
        regex = result[:test] || result[:reg]
        csv << [result[:index], regex, result[:reason]]
      end
    end
  end
end
check_normal_test(reg, results, timeout_seconds) click to toggle source
# File lib/pre/generate-spec.rb, line 78
def check_normal_test(reg, results, timeout_seconds)
  result = nil
  a_test = eval("/#{reg}/")
  timeout(timeout_seconds) do
    10.times do | i |
      md = a_test.match_data(seed: i)
      if(md)
        # print "OK md:#{md},"
        result = {
          explain: "can parse (#{reg}) and generate match-data",
          expect:  "/#{reg}/.match_data",
          to_be:   "MatchData"
        }
      else
        warn "Failed. reg='#{a_test}', reason=#{obj.reason}"
        result = {
          explain: "cannot parse / generate (#{reg})",
          expect:  "/#{reg}/.match_data",
          to_be:   "Nil"
        }
        break
      end
    end
  end
  results.push result
rescue => ex
  warn "GOO: #{ex} #{ex.class}"
  results.push({
    explain: "raises #{ex}, when parse / generate (#{reg})",
    expect:  "/#{reg}/.match_data",
    raises:   "#{ex.class}"
  })
end
do_test(timeout_seconds) click to toggle source
# File lib/pre/generate-spec.rb, line 19
def do_test(timeout_seconds)
  results = []
  get_lines(timeout_seconds).each_with_index do | line, i |
    begin
      warn line
      eval(line)
    rescue SyntaxError => ex
      warn "EVAL ERROR: #{ex}, #{line}"
      #results.push({
      #  explain: "raises #{ex}, when eval (#{line})",
      #  expect:  "eval('#{line}')",
      #  raises:   "#{ex.class}"
      #})
    end
  end
  results
end
get_lines(timeout_seconds) click to toggle source
# File lib/pre/generate-spec.rb, line 58
def get_lines(timeout_seconds)
  lines = []
  # py_source = IO.read("./contrib/Onigmo/testpy.py")
  File::open("./contrib/Onigmo/testpy.py") do |f|
    f.each.with_index do |line, line_num|
      # break if line_num > 800
      line.force_encoding("utf-8")
      if !line.match(/ONIG_SYNTAX_PERL/)
        if(md = line.match(/^\s*(?:x|x2|n)\s*\(.+?$/u) rescue nil)
          line.sub!(/,\s*\".+?$/, ", results, timeout_seconds)") rescue nil
          lines.push line if line
        end
      else
        warn "Perl syntax. \nline:#{line}"
      end
    end
  end
  lines
end
n(reg, *params) click to toggle source
# File lib/pre/generate-spec.rb, line 120
def n(reg, *params)
  check_normal_test(reg, *params)
end
print_results(results = @results) click to toggle source
puts_spec(spec_file, results) click to toggle source
# File lib/pre/generate-spec.rb, line 37
def puts_spec(spec_file, results)
  File.open(spec_file, "w") do |fp|
    fp.puts "require 'spec_helper'"
    fp.puts "describe Regextest do"
    results.each do | result |
      explain = result[:explain].gsub("'", "\\\\'")
      expect = result[:expect]   # .gsub("'", "\\\\'")
      fp.puts "  it '#{explain}' do"
      if result[:to_be]
        fp.puts "    expect(#{expect}).to be_a(#{result[:to_be]})"
      elsif result[:raises]
        fp.puts "    expect {#{expect}}.to raise_error(#{result[:raises]})"
      else
        raise "Invalid result: #{result}"
      end
      fp.puts "  end"
    end
    fp.puts "end"
  end
end
x(reg, *params) click to toggle source
# File lib/pre/generate-spec.rb, line 112
def x(reg, *params)
  check_normal_test(reg, *params)
end
x2(reg, *params) click to toggle source
# File lib/pre/generate-spec.rb, line 116
def x2(reg, *params)
  check_normal_test(reg, *params)
end