diff options
Diffstat (limited to 'ext/ripper/test')
-rw-r--r-- | ext/ripper/test/check-event-arity.rb | 24 | ||||
-rwxr-xr-x | ext/ripper/test/check-event-coverage.sh | 15 | ||||
-rw-r--r-- | ext/ripper/test/check-scanner-event-coverage.rb | 18 | ||||
-rw-r--r-- | ext/ripper/test/list-called-events.rb | 12 | ||||
-rw-r--r-- | ext/ripper/test/src_rb | 363 | ||||
-rw-r--r-- | ext/ripper/test/validate.rb | 68 |
6 files changed, 500 insertions, 0 deletions
diff --git a/ext/ripper/test/check-event-arity.rb b/ext/ripper/test/check-event-arity.rb new file mode 100644 index 0000000000..00e1b98dbc --- /dev/null +++ b/ext/ripper/test/check-event-arity.rb @@ -0,0 +1,24 @@ +def main + invalid = false + table = {} + ARGF.each do |line| + next if /\A\#\s*define\s+s?dispatch\d/ === line + next if /ripper_dispatch\d/ === line + line.scan(/dispatch(\d)\((\w+)/) do |num, ev| + num = num.to_i + if data = table[ev] + locations, arity = data + unless num == arity + invalid = true + puts "arity differ [#{ev}]: #{ARGF.lineno}->#{num}; #{locations.join(',')}->#{arity}" + end + locations.push ARGF.lineno + else + table[ev] = [[ARGF.lineno], num.to_i] + end + end + end + exit 1 if invalid +end + +main diff --git a/ext/ripper/test/check-event-coverage.sh b/ext/ripper/test/check-event-coverage.sh new file mode 100755 index 0000000000..727c3b9837 --- /dev/null +++ b/ext/ripper/test/check-event-coverage.sh @@ -0,0 +1,15 @@ +# $Id$ + +RUBY=${RUBY:-ruby} +status=0 + +$RUBY tools/list-parse-event-ids.rb parse.y | awk '{print "on__" $1}' > list_a +$RUBY test/list-called-events.rb | sort -u > list_b +diff -u list_a list_b | grep '^-on' | sed 's/^-on__//' > list_diff +if [ -s list_diff ] +then + cat list_diff + status=1 +fi +rm -f list_a list_b list_diff +exit $status diff --git a/ext/ripper/test/check-scanner-event-coverage.rb b/ext/ripper/test/check-scanner-event-coverage.rb new file mode 100644 index 0000000000..4de01e35f4 --- /dev/null +++ b/ext/ripper/test/check-scanner-event-coverage.rb @@ -0,0 +1,18 @@ +def main + not_tested = eventids() - tested_ids() + unless not_tested.empty? + puts not_tested + exit 1 + end + exit 0 +end + +def eventids + File.read('eventids2.c').scan(/on__(\w+)/).flatten.uniq +end + +def tested_ids + File.read('test/test_scanner_events.rb').scan(/def test_(\S+)/).flatten.uniq +end + +main diff --git a/ext/ripper/test/list-called-events.rb b/ext/ripper/test/list-called-events.rb new file mode 100644 index 0000000000..d799efc979 --- /dev/null +++ b/ext/ripper/test/list-called-events.rb @@ -0,0 +1,12 @@ +require 'ripper.so' + +class R < Ripper + def method_missing(mid, *args) + puts mid + args[0] + end + undef :warn +end + +fname = (ARGV[0] || 'test/src_rb') +R.new(File.read(fname), fname, 1).parse diff --git a/ext/ripper/test/src_rb b/ext/ripper/test/src_rb new file mode 100644 index 0000000000..e7894362f3 --- /dev/null +++ b/ext/ripper/test/src_rb @@ -0,0 +1,363 @@ +# comment +=begin + embedded document +=end + +# literal +1 +1000000000000000000000 +1.0 +1.234e5 +1..2 +1...3 +:symbol +:"dynamic #{sym_embexpr} symbol" +[1,2,3] +{1 => 2} +'string' +"string" +"before #{str_embexpr} after" +"str #@ivar str" +"str #$gvar str" +"string" "concat" +`/bin/true` +{1, 2, 3, 4} +/regexp/ +/regexp_with_opt/mioe +/regexp #{regexp_embexpr} after/ +%q[string] +%Q[str#{str_embexpr}ing] +%r[regexp] +%w( a b c ) +%W( a#{w_emb}b c d ) +<<HERE +heredoc line 1 +heredoc line 2 +heredoc line 3 +HERE + +# special variables +true +false +nil +self + +# def +def a +end +def b() +end +def c(a) +end +def d(a,*rest) +end +def e(a,&block) +end +def f(a,*rest,&block) +end +def g(*rest) +end +def h(&block) +end +def i(*rest,&block) +end +def j(CONST) +end +def k(@ivar) +end +def l($gvar) +end +def n(@@cvar) +end + +# alias +alias x b +alias $rest $' # error +alias $nth $1 # error + +# undef +undef warn + +# class, module +class C +end +module M +end +class cname +end +class << Object.new + def self.a + end +end + +# field +$a = 1 +$' = 0 # error +$1 = 0 # error +@a = 2 +@@a = 3 +a = 4 +a += 1 +a -= 1 +a *= 1 +a /= 1 +a &&= 1 +a ||= 1 +m.a = 5 +m.a += 1 +m.a &&= 1 +m.a ||= 1 +a[1] = 2 +a[1] += 1 +a[1] &&= 1 +a[1] ||= 1 +C = 1 +C::C = 1 +::C = 1 +def m + C = 1 # dynamic const assignment + C::C = 1 # dynamic const assignment + ::C = 1 # dynamic const assignment +end + +# ref +lvar = $a +lvar = @a +lvar = @@a +lvar = Object +lvar = C +lvar = C::C +lvar = ::C +lvar = a[1] + +# unary operator ++1 +-1 +not 1 +!1 +~str + +# binary operator +1 + 1 +1 - 1 +1 * 1 +1 / 1 +1 ** 1 +1 ^ 1 +1 & 1 +1 | 1 +1 && 1 +1 || 1 + +# mlhs, mrhs +a, b, c = list +a, = list +a, * = list +a, *b = list +a, (b, c), d, *e = list +mlhs = 1, 2 +mlhs = 1, 2, 3, *list +mlhs = *list + +# method call +m +m() +m(a) +m(a,a) +m(*a) +m(&b) +m(a,*a) +m(a,&b) +m(a,*a,&b) +m(1=>2) +m(1=>2,*a) +m(1=>2,&b) +m(1=>2,*a,&b) +m () +m (a) +m (a,a) +m (*a) +m (&b) +m (a,*a) +m (a,&b) +m (a,*a,&b) +m (1=>2) +m (1=>2,*a) +m (1=>2,&b) +m (1=>2,*a,&b) +m a +m a,a +m *a +m &b +m a,*a +m a,&b +m a,*a,&b +m 1=>2 +m 1=>2,*a +m 1=>2,&b +m 1=>2,*a,&b +obj.m +obj.m() +obj.m(a) +obj.m(a,a) +obj.m(*a) +obj.m(&b) +obj.m(a,*a) +obj.m(a,&b) +obj.m(a,*a,&b) +obj.m(1=>2) +obj.m(1=>2,*a) +obj.m(1=>2,&b) +obj.m(1=>2,*a,&b) +obj.m () +obj.m (a) +obj.m (a,a) +obj.m (*a) +obj.m (&b) +obj.m (a,*a) +obj.m (a,&b) +obj.m (a,*a,&b) +obj.m (1=>2) +obj.m (1=>2) +obj.m (1=>2,*a) +obj.m (1=>2,&b) +obj.m (1=>2,*a,&b) +obj.m a +obj.m a,a +obj.m *a +obj.m &b +obj.m a,*a +obj.m a,&b +obj.m a,*a,&b +obj.m 1=>2 +obj.m 1=>2,*a +obj.m 1=>2,&b +obj.m 1=>2,*a,&b + +# ambiguous argument +m +1 +m /r/ + +# iterator +[1,2,3].each do |i| + print i +end +{1=>true}.each do |k,v| + puts k +end +[1,2,3].each {|i| print i } +[1].each {|a,| } +[1].each {|*b| } +[1].each {|a,*b| } +[1].each {|&block| } +[1].each {|a,&block| } +[1].each {|a,*b,&block| } +a = lambda() {|n| n * n } +a = lambda () {|n| n * n } +a = lambda (a) {|n| n * n } +a = lambda (a,b) {|n| n * n } + +# BEGIN, END +BEGIN { } +END { } + +# if, unless +1 if true +2 unless false +if false + 5 +elsif false + 6 +elsif false then 7 +else + 8 +end +if m +end +unless 1 + 2 +end +unless m +end +0 ? 1 : 2 + +# case +case 'a' +when 'b' + ; +when 'c' then 1 +else + 2 +end +case +when 1 +when 2 +when 3 +else +end +case 1 +else +end +case +else +end + +# while, until, for +while true + break + next + redo +end +begin + break +end while true +until false + break + next + redo +end +begin + break +end until false +for x in m() + break + next + redo +end +0 until true +1 while false + +# begin, rescue, else, ensure +begin + 1 +rescue StandardError => er + 2 +rescue => er + 3 + retry +else + 4 +ensure + 5 +end +a = 1 rescue 2 + +# jumps +def m + redo + yield + yield nil + super + super 1 + return + return nil +end + +# defined +defined? f +defined?(f) + +n = 1 \ ++ 1 + +__END__ diff --git a/ext/ripper/test/validate.rb b/ext/ripper/test/validate.rb new file mode 100644 index 0000000000..808d321043 --- /dev/null +++ b/ext/ripper/test/validate.rb @@ -0,0 +1,68 @@ +require 'ripper.so' + +class R < Ripper + def initialize(*args) + super + @lineno = 0 + end + + def parse + result = super + puts "#{@lineno}:result: #{rawVALUE(result)}" + validate_object result + p result + result + end + + def on__nl(str) + @lineno += 1 + end + + def on__ignored_nl(str) + @lineno += 1 + end + + def on__comment(cmt) + @lineno += 1 + end + + def on__embdoc_beg(str) + @lineno += 1 + end + + def on__embdoc(str) + @lineno += 1 + end + + def on__embdoc_end(str) + @lineno += 1 + end + + def method_missing(mid, *args) + puts mid + args.each_with_index do |a,idx| + puts "#{@lineno}:#{mid}\##{idx+1}: #{rawVALUE(a)}" + validate_object a + p a + end + args[0] + end + + def warn(*args) + end + + def warning(*args) + end + + unless respond_to?(:validate_object) + def validate_object(x) + x + end + def rawVALUE(x) + x.object_id + end + end +end + +fname = (ARGV[0] || 'test/src_rb') +R.new(File.read(fname), fname, 1).parse |