#! /usr/bin/env ruby # -*- coding: us-ascii -*- $testnum=0 $ntest=0 $failed = 0 class Progress def initialize @color = nil @quiet = nil ARGV.each do |arg| case arg when /\A--color(?:=(?:always|(auto)|(never)|(.*)))?\z/ warn "unknown --color argument: #$3" if $3 @color = $1 ? nil : !$2 when /\A-(q|-quiet)\z/ @quiet = true end end @tty = STDERR.tty? && !STDOUT.tty? && /dumb/ !~ ENV["TERM"] case @color when nil @color = @tty end if @color # dircolors-like style colors = (colors = ENV['TEST_COLORS']) ? Hash[colors.scan(/(\w+)=([^:]*)/)] : {} @passed = "\e[#{colors["pass"] || "32"}m" @failed = "\e[#{colors["fail"] || "31"}m" @reset = "\e[m" else @passed = @failed = @reset = "" end extend(Rotator) if @tty end def passed_string "." end def failed_string "#{@failed}F#{@reset}" end def init_string end def finish_string if @quiet "\n" else "#{@passed}#{@ok ? 'OK' : ''} #{$testnum}#{@reset}\n" end end def pass STDERR.print passed_string end def fail @ok = false STDERR.print failed_string end def init @ok = true STDERR.print init_string end def finish STDERR.print finish_string end module Rotator ROTATOR = %w[- \\ | /] BS = "\b" * ROTATOR[0].size def passed_string "#{BS}#{ROTATOR[(@count += 1) % ROTATOR.size]}" end def failed_string "#{BS}#{super}#{ROTATOR[@count % ROTATOR.size]}" end def init_string @count = 0 " " end def finish_string s = "#{BS}#{' ' * BS.size}#{BS}#{super}" s.gsub!(/\n/, "\r\e[2K\r") if @quiet s end end end PROGRESS = Progress.new def test_check(what) unless $ntest.zero? PROGRESS.finish end STDERR.print "sample/test.rb:#{what} " PROGRESS.init $what = what $testnum = 0 end def test_ok(cond,n=1) $testnum+=1 $ntest+=1 where = (st = caller(n)) ? st[0] : "caller error! (n=#{n}, trace=#{caller(0).join(', ')}" if cond PROGRESS.pass printf "ok %d (%s)\n", $testnum, where else PROGRESS.fail printf "not ok %s %d -- %s\n", $what, $testnum, where $failed+=1 end STDOUT.flush STDERR.flush end # make sure conditional operators work test_check "assignment" a=[]; a[0] ||= "bar"; test_ok(a[0] == "bar") h={}; h["foo"] ||= "bar"; test_ok(h["foo"] == "bar") aa = 5 aa ||= 25 test_ok(aa == 5) bb ||= 25 test_ok(bb == 25) cc &&=33 test_ok(cc == nil) cc = 5 cc &&=44 test_ok(cc == 44) a = nil; test_ok(a == nil) a = 1; test_ok(a == 1) a = []; test_ok(a == []) a = [1]; test_ok(a == [1]) a = [nil]; test_ok(a == [nil]) a = [[]]; test_ok(a == [[]]) a = [1,2]; test_ok(a == [1,2]) a = [*[]]; test_ok(a == []) a = [*[1]]; test_ok(a == [1]) a = [*[1,2]]; test_ok(a == [1,2]) a = *[]; test_ok(a == []) a = *[1]; test_ok(a == [1]) a = *[nil]; test_ok(a == [nil]) a = *[[]]; test_ok(a == [[]]) a = *[1,2]; test_ok(a == [1,2]) a = *[*[]]; test_ok(a == []) a = *[*[1]]; test_ok(a == [1]) a = *[*[1,2]]; test_ok(a == [1,2]) a, = nil; test_ok(a == nil) a, = 1; test_ok(a == 1) a, = []; test_ok(a == nil) a, = [1]; test_ok(a == 1) a, = [nil]; test_ok(a == nil) a, = [[]]; test_ok(a == []) a, = 1,2; test_ok(a == 1) a, = [1,2]; test_ok(a == 1) a, = [*[]]; test_ok(a == nil) a, = [*[1]]; test_ok(a == 1) a, = *[1,2]; test_ok(a == 1) a, = [*[1,2]]; test_ok(a == 1) a, = *[]; test_ok(a == nil) a, = *[1]; test_ok(a == 1) a, = *[nil]; test_ok(a == nil) a, = *[[]]; test_ok(a == []) a, = *[1,2]; test_ok(a == 1) a, = *[*[]]; test_ok(a == nil) a, = *[*[1]]; test_ok(a == 1) a, = *[*[1,2]]; test_ok(a == 1) *a = nil; test_ok(a == [nil]) *a = 1; test_ok(a == [1]) *a = []; test_ok(a == []) *a = [1]; test_ok(a == [1]) *a = [nil]; test_ok(a == [nil]) *a = [[]]; test_ok(a == [[]]) *a = [1,2]; test_ok(a == [1,2]) *a = [*[]]; test_ok(a == []) *a = [*[1]]; test_ok(a == [1]) *a = [*[1,2]]; test_ok(a == [1,2]) *a = *[]; test_ok(a == []) *a = *[1]; test_ok(a == [1]) *a = *[nil]; test_ok(a == [nil]) *a = *[[]]; test_ok(a == [[]]) *a = *[1,2]; test_ok(a == [1,2]) *a = *[*[]]; test_ok(a == []) *a = *[*[1]]; test_ok(a == [1]) *a = *[*[1,2]]; test_ok(a == [1,2]) a,b,*c = nil; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = 1; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = []; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = [1]; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = [nil]; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = [[]]; test_ok([a,b,c] == [[],nil,[]]) a,b,*c = [1,2]; test_ok([a,b,c] == [1,2,[]]) a,b,*c = [*[]]; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = [*[1]]; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = [*[1,2]]; test_ok([a,b,c] == [1,2,[]]) a,b,*c = *[]; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = *[1]; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = *[nil]; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = *[[]]; test_ok([a,b,c] == [[],nil,[]]) a,b,*c = *[1,2]; test_ok([a,b,c] == [1,2,[]]) a,b,*c = *[*[]]; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = *[*[1]]; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = *[*[1,2]]; test_ok([a,b,c] == [1,2,[]]) def f; yield nil; end; f {|a| test_ok(a == nil)} def f; yield 1; end; f {|a| test_ok(a == 1)} def f; yield []; end; f {|a| test_ok(a == [])} def f; yield [1]; end; f {|a| test_ok(a == [1])} def f; yield [nil]; end; f {|a| test_ok(a == [nil])} def f; yield [[]]; end; f {|a| test_ok(a == [[]])} def f; yield [*[]]; end; f {|a| test_ok(a == [])} def f; yield [*[1]]; end; f {|a| test_ok(a == [1])} def f; yield [*[1,2]]; end; f {|a| test_ok(a == [1,2])} def f; yield *[]; end; f {|a| test_ok(a == nil)} def f; yield *[1]; end; f {|a| test_ok(a == 1)} def f; yield *[nil]; end; f {|a| test_ok(a == nil)} def f; yield *[[]]; end; f {|a| test_ok(a == [])} def f; yield *[*[]]; end; f {|a| test_ok(a == nil)} def f; yield *[*[1]]; end; f {|a| test_ok(a == 1)} def f; yield *[*[1,2]]; end; f {|a| test_ok(a == 1)} def f; yield; end; f {|a,| test_ok(a == nil)} def f; yield nil; end; f {|a,| test_ok(a == nil)} def f; yield 1; end; f {|a,| test_ok(a == 1)} def f; yield []; end; f {|a,| test_ok(a == nil)} def f; yield [1]; end; f {|a,| test_ok(a == 1)} def f; yield [nil]; end; f {|a,| test_ok(a == nil)} def f; yield [[]]; end; f {|a,| test_ok(a == [])} def f; yield [*[]]; end; f {|a,| test_ok(a == nil)} def f; yield [*[1]]; end; f {|a,| test_ok(a == 1)} def f; yield [*[1,2]]; end; f {|a,| test_ok(a == 1)} def f; yield *[]; end; f {|a,| test_ok(a == nil)} def f; yield *[1]; end; f {|a,| test_ok(a == 1)} def f; yield *[nil]; end; f {|a,| test_ok(a == nil)} def f; yield *[[]]; end; f {|a,| test_ok(a == nil)} def f; yield *[*[]]; end; f {|a,| test_ok(a == nil)} def f; yield *[*[1]]; end; f {|a,| test_ok(a == 1)} def f; yield *[*[1,2]]; end; f {|a,| test_ok(a == 1)} def f; yield; end; f {|*a| test_ok(a == [])} def f; yield nil; end; f {|*a| test_ok(a == [nil])} def f; yield 1; end; f {|*a| test_ok(a == [1])} def f; yield []; end; f {|*a| test_ok(a == [[]])} def f; yield [1]; end; f {|*a| test_ok(a == [[1]])} def f; yield [nil]; end; f {|*a| test_ok(a == [[nil]])} def f; yield [[]]; end; f {|*a| test_ok(a == [[[]]])} def f; yield [1,2]; end; f {|*a| test_ok(a == [[1,2]])} def f; yield [*[]]; end; f {|*a| test_ok(a == [[]])} def f; yield [*[1]]; end; f {|*a| test_ok(a == [[1]])} def f; yield [*[1,2]]; end; f {|*a| test_ok(a == [[1,2]])} def f; yield *[]; end; f {|*a| test_ok(a == [])} def f; yield *[1]; end; f {|*a| test_ok(a == [1])} def f; yield *[nil]; end; f {|*a| test_ok(a == [nil])} def f; yield *[[]]; end; f {|*a| test_ok(a == [[]])} def f; yield *[*[]]; end; f {|*a| test_ok(a == [])} def f; yield *[*[1]]; end; f {|*a| test_ok(a == [1])} def f; yield *[*[1,2]]; end; f {|*a| test_ok(a == [1,2])} def f; yield; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield nil; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield 1; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])} def f; yield []; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield [1]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])} def f; yield [nil]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield [[]]; end; f {|a,b,*c| test_ok([a,b,c] == [[],nil,[]])} def f; yield [*[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield [*[1]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])} def f; yield [*[1,2]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,2,[]])} def f; yield *[]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield *[1]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])} def f; yield *[nil]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield *[[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield *[*[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])} def f; yield *[*[1]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])} def f; yield *[*[1,2]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,2,[]])} def r; return; end; a = r(); test_ok(a == nil) def r; return nil; end; a = r(); test_ok(a == nil) def r; return 1; end; a = r(); test_ok(a == 1) def r; return []; end; a = r(); test_ok(a == []) def r; return [1]; end; a = r(); test_ok(a == [1]) def r; return [nil]; end; a = r(); test_ok(a == [nil]) def r; return [[]]; end; a = r(); test_ok(a == [[]]) def r; return [*[]]; end; a = r(); test_ok(a == []) def r; return [*[1]]; end; a = r(); test_ok(a == [1]) def r; return [*[1,2]]; end; a = r(); test_ok(a == [1,2]) def r; return *[]; end; a = r(); test_ok(a == []) def r; return *[1]; end; a = r(); test_ok(a == [1]) def r; return *[nil]; end; a = r(); test_ok(a == [nil]) def r; return *[[]]; end; a = r(); test_ok(a == [[]]) def r; return *[*[]]; end; a = r(); test_ok(a == []) def r; return *[*[1]]; end; a = r(); test_ok(a == [1]) def r; return *[*[1,2]]; end; a = r(); test_ok(a == [1,2]) def r; return *[[]]; end; a = *r(); test_ok(a == [[]]) def r; return *[*[1,2]]; end; a = *r(); test_ok(a == [1,2]) def r; return; end; *a = r(); test_ok(a == [nil]) def r; return nil; end; *a = r(); test_ok(a == [nil]) def r; return 1; end; *a = r(); test_ok(a == [1]) def r; return []; end; *a = r(); test_ok(a == []) def r; return [1]; end; *a = r(); test_ok(a == [1]) def r; return [nil]; end; *a = r(); test_ok(a == [nil]) def r; return [[]]; end; *a = r(); test_ok(a == [[]]) def r; return [1,2]; end; *a = r(); test_ok(a == [1,2]) def r; return [*[]]; end; *a = r(); test_ok(a == []) def r; return [*[1]]; end; *a = r(); test_ok(a == [1]) def r; return [*[1,2]]; end; *a = r(); test_ok(a == [1,2]) def r; return *[]; end; *a = r(); test_ok(a == []) def r; return *[1]; end; *a = r(); test_ok(a == [1]) def r; return *[nil]; end; *a = r(); test_ok(a == [nil]) def r; return *[[]]; end; *a = r(); test_ok(a == [[]]) def r; return *[1,2]; end; *a = r(); test_ok(a == [1,2]) def r; return *[*[]]; end; *a = r(); test_ok(a == []) def r; return *[*[1]]; end; *a = r(); test_ok(a == [1]) def r; return *[*[1,2]]; end; *a = r(); test_ok(a == [1,2]) def r; return *[[]]; end; *a = *r(); test_ok(a == [[]]) def r; return *[1,2]; end; *a = *r(); test_ok(a == [1,2]) def r; return *[*[1,2]]; end; *a = *r(); test_ok(a == [1,2]) def r; return; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return nil; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return 1; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]]) def r; return []; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return [1]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]]) def r; return [nil]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return [[]]; end; a,b,*c = r(); test_ok([a,b,c] == [[],nil,[]]) def r; return [1,2]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]]) def r; return [*[]]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return [*[1]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]]) def r; return [*[1,2]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]]) def r; return *[]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return *[1]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]]) def r; return *[nil]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return *[[]]; end; a,b,*c = r(); test_ok([a,b,c] == [[],nil,[]]) def r; return *[1,2]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]]) def r; return *[*[]]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]]) def r; return *[*[1]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]]) def r; return *[*[1,2]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]]) f = lambda {|r,| test_ok([] == r)} f.call([], *[]) f = lambda {|r,*l| test_ok([] == r); test_ok([1] == l)} f.call([], *[1]) f = lambda{|x| x} test_ok(f.call(42) == 42) test_ok(f.call([42]) == [42]) test_ok(f.call([[42]]) == [[42]]) test_ok(f.call([42,55]) == [42,55]) f = lambda{|x,| x} test_ok(f.call(42) == 42) test_ok(f.call([42]) == [42]) test_ok(f.call([[42]]) == [[42]]) test_ok(f.call([42,55]) == [42,55]) f = lambda{|*x| x} test_ok(f.call(42) == [42]) test_ok(f.call([42]) == [[42]]) test_ok(f.call([[42]]) == [[[42]]]) test_ok(f.call([42,55]) == [[42,55]]) test_ok(f.call(42,55) == [42,55]) f = lambda { |a, b=42, *c| [a,b,c] } test_ok(f.call(1 ) == [1,42,[ ]] ) test_ok(f.call(1,43 ) == [1,43,[ ]] ) test_ok(f.call(1,43,44) == [1,43,[44]] ) f = lambda { |a, b=(a|16), *c, &block| [a,b,c,block&&block[]] } test_ok(f.call(8 ) == [8,24,[ ],nil] ) test_ok(f.call(8,43 ) == [8,43,[ ],nil] ) test_ok(f.call(8,43,44) == [8,43,[44],nil] ) test_ok(f.call(8 ){45} == [8,24,[ ],45 ] ) test_ok(f.call(8,43 ){45} == [8,43,[ ],45 ] ) test_ok(f.call(8,43,44){45} == [8,43,[44],45 ] ) f = lambda { |a, b=42, *c, d| [a,b,c,d] } test_ok(f.call(1 ,99) == [1,42,[ ],99] ) test_ok(f.call(1,43 ,99) == [1,43,[ ],99] ) test_ok(f.call(1,43,44,99) == [1,43,[44],99] ) f = lambda { |a, b=(a|16), &block| [a,b,block&&block[]] } test_ok(f.call(8 ) == [8,24,nil] ) test_ok(f.call(8,43) == [8,43,nil] ) test_ok(f.call(8,43) == [8,43,nil] ) test_ok(f.call(8 ){45} == [8,24,45 ] ) test_ok(f.call(8,43){45} == [8,43,45 ] ) test_ok(f.call(8,43){45} == [8,43,45 ] ) f = lambda { |a, b=42, d| [a,b,d] } test_ok(f.call(1 ,99) == [1,42,99] ) test_ok(f.call(1,43,99) == [1,43,99] ) test_ok(f.call(1,43,99) == [1,43,99] ) f = lambda { |b=42, *c, &block| [b,c,block&&block[]] } test_ok(f.call( ) == [42,[ ],nil] ) test_ok(f.call(43 ) == [43,[ ],nil] ) test_ok(f.call(43,44) == [43,[44],nil] ) test_ok(f.call( ){45} == [42,[ ],45 ] ) test_ok(f.call(43 ){45} == [43,[ ],45 ] ) test_ok(f.call(43,44){45} == [43,[44],45 ] ) f = lambda { |b=42, *c, d| [b,c,d] } test_ok(f.call( 99) == [42,[ ],99] ) test_ok(f.call(43 ,99) == [43,[ ],99] ) test_ok(f.call(43,44,99) == [43,[44],99] ) f = lambda { |b=42, &block| [b,block&&block[]] } test_ok(f.call( ) == [42,nil] ) test_ok(f.call(43) == [43,nil] ) test_ok(f.call(43) == [43,nil] ) test_ok(f.call( ){45} == [42,45 ] ) test_ok(f.call(43){45} == [43,45 ] ) test_ok(f.call(43){45} == [43,45 ] ) f = lambda { |b=42, d| [b,d] } test_ok(f.call( 99) == [42,99] ) test_ok(f.call(43,99) == [43,99] ) test_ok(f.call(43,99) == [43,99] ) a,=*[1] test_ok(a == 1) a,=*[[1]] test_ok(a == [1]) a,=*[[[1]]] test_ok(a == [[1]]) x, (y, z) = 1, 2, 3 test_ok([1,2,nil] == [x,y,z]) x, (y, z) = 1, [2,3] test_ok([1,2,3] == [x,y,z]) x, (y, z) = 1, [2] test_ok([1,2,nil] == [x,y,z]) a = loop do break; end; test_ok(a == nil) a = loop do break nil; end; test_ok(a == nil) a = loop do break 1; end; test_ok(a == 1) a = loop do break []; end; test_ok(a == []) a = loop do break [1]; end; test_ok(a == [1]) a = loop do break [nil]; end; test_ok(a == [nil]) a = loop do break [[]]; end; test_ok(a == [[]]) a = loop do break [*[]]; end; test_ok(a == []) a = loop do break [*[1]]; end; test_ok(a == [1]) a = loop do break [*[1,2]]; end; test_ok(a == [1,2]) a = loop do break *[]; end; test_ok(a == []) a = loop do break *[1]; end; test_ok(a == [1]) a = loop do break *[nil]; end; test_ok(a == [nil]) a = loop do break *[[]]; end; test_ok(a == [[]]) a = loop do break *[*[]]; end; test_ok(a == []) a = loop do break *[*[1]]; end; test_ok(a == [1]) a = loop do break *[*[1,2]]; end; test_ok(a == [1,2]) *a = loop do break; end; test_ok(a == [nil]) *a = loop do break nil; end; test_ok(a == [nil]) *a = loop do break 1; end; test_ok(a == [1]) *a = loop do break []; end; test_ok(a == []) *a = loop do break [1]; end; test_ok(a == [1]) *a = loop do break [nil]; end; test_ok(a == [nil]) *a = loop do break [[]]; end; test_ok(a == [[]]) *a = loop do break [1,2]; end; test_ok(a == [1,2]) *a = loop do break [*[]]; end; test_ok(a == []) *a = loop do break [*[1]]; end; test_ok(a == [1]) *a = loop do break [*[1,2]]; end; test_ok(a == [1,2]) *a = loop do break *[]; end; test_ok(a == []) *a = loop do break *[1]; end; test_ok(a == [1]) *a = loop do break *[nil]; end; test_ok(a == [nil]) *a = loop do break *[[]]; end; test_ok(a == [[]]) *a = loop do break *[1,2]; end; test_ok(a == [1,2]) *a = loop do break *[*[]]; end; test_ok(a == []) *a = loop do break *[*[1]]; end; test_ok(a == [1]) *a = loop do break *[*[1,2]]; end; test_ok(a == [1,2]) *a = *loop do break *[[]]; end; test_ok(a == [[]]) *a = *loop do break *[1,2]; end; test_ok(a == [1,2]) *a = *loop do break *[*[1,2]]; end; test_ok(a == [1,2]) a,b,*c = loop do break; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break nil; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break 1; end; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = loop do break []; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break [1]; end; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = loop do break [nil]; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break [[]]; end; test_ok([a,b,c] == [[],nil,[]]) a,b,*c = loop do break [1,2]; end; test_ok([a,b,c] == [1,2,[]]) a,b,*c = loop do break [*[]]; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break [*[1]]; end; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = loop do break [*[1,2]]; end; test_ok([a,b,c] == [1,2,[]]) a,b,*c = loop do break *[]; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break *[1]; end; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = loop do break *[nil]; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break *[[]]; end; test_ok([a,b,c] == [[],nil,[]]) a,b,*c = loop do break *[1,2]; end; test_ok([a,b,c] == [1,2,[]]) a,b,*c = loop do break *[*[]]; end; test_ok([a,b,c] == [nil,nil,[]]) a,b,*c = loop do break *[*[1]]; end; test_ok([a,b,c] == [1,nil,[]]) a,b,*c = loop do break *[*[1,2]]; end; test_ok([a,b,c] == [1,2,[]]) def r(val); a = yield(); test_ok(a == val, 2); end r(nil){next} r(nil){next nil} r(1){next 1} r([]){next []} r([1]){next [1]} r([nil]){next [nil]} r([[]]){next [[]]} r([]){next [*[]]} r([1]){next [*[1]]} r([1,2]){next [*[1,2]]} r([]){next *[]} r([1]){next *[1]} r([nil]){next *[nil]} r([[]]){next *[[]]} r([]){next *[*[]]} r([1]){next *[*[1]]} r([1,2]){next *[*[1,2]]} def r(val); *a = yield(); test_ok(a == val, 2); end r([nil]){next} r([nil]){next nil} r([1]){next 1} r([]){next []} r([1]){next [1]} r([nil]){next [nil]} r([[]]){next [[]]} r([1,2]){next [1,2]} r([]){next [*[]]} r([1]){next [*[1]]} r([1,2]){next [*[1,2]]} def r(val); *a = *yield(); test_ok(a == val, 2); end r([[]]){next *[[]]} r([1,2]){next *[1,2]} r([1,2]){next *[*[1,2]]} def r(val); a,b,*c = yield(); test_ok([a,b,c] == val, 2); end r([nil,nil,[]]){next} r([nil,nil,[]]){next nil} r([1,nil,[]]){next 1} r([nil,nil,[]]){next []} r([1,nil,[]]){next [1]} r([nil,nil,[]]){next [nil]} r([[],nil,[]]){next [[]]} r([1,2,[]]){next [1,2]} r([nil,nil,[]]){next [*[]]} r([1,nil,[]]){next [*[1]]} r([1,2,[]]){next [*[1,2]]} def r(val); a,b,*c = *yield(); test_ok([a,b,c] == val, 2); end r([[],nil,[]]){next *[[]]} r([1,2,[]]){next *[1,2]} r([1,2,[]]){next *[*[1,2]]} test_check "condition" $x = '0'; $x == $x && test_ok(true) $x != $x && test_ok(false) $x == $x || test_ok(false) $x != $x || test_ok(true) # first test to see if we can run the tests. test_check "if/unless"; $x = 'test'; test_ok(if $x == $x then true else false end) $bad = false unless $x == $x $bad = true end test_ok(!$bad) test_ok(unless $x != $x then true else false end) test_check "case" case 5 when 1, 2, 3, 4, 6, 7, 8 test_ok(false) when 5 test_ok(true) end case 5 when 5 test_ok(true) when 1..10 test_ok(false) end case 5 when 1..10 test_ok(true) else test_ok(false) end case 5 when 5 test_ok(true) else test_ok(false) end case "foobar" when /^f.*r$/ test_ok(true) else test_ok(false) end test_check "while/until"; tmp = open("while_tmp", "w") tmp.print "tvi925\n"; tmp.print "tvi920\n"; tmp.print "vt100\n"; tmp.print "Amiga\n"; tmp.print "paper\n"; tmp.close # test break tmp = open("while_tmp", "r") test_ok(tmp.kind_of?(File)) while line = tmp.gets() break if /vt100/ =~ line end test_ok(!tmp.eof? && /vt100/ =~ line) tmp.close # test next $bad = false tmp = open("while_tmp", "r") while line = tmp.gets() next if /vt100/ =~ line $bad = 1 if /vt100/ =~ line end test_ok(!(!tmp.eof? || /vt100/ =~ line || $bad)) tmp.close # test redo $bad = false tmp = open("while_tmp", "r") while line = tmp.gets() lastline = line line = line.gsub(/vt100/, 'VT100') if lastline != line line.gsub!('VT100', 'Vt100') redo end $bad = 1 if /vt100/ =~ line $bad = 1 if /VT100/ =~ line end test_ok(tmp.eof? && !$bad) tmp.close sum=0 for i in 1..10 sum += i i -= 1 if i > 0 redo end end test_ok(sum == 220) # test interval $bad = false tmp = open("while_tmp", "r") while line = tmp.gets() break if 3 case line when /vt100/, /Amiga/, /paper/ $bad = true end end test_ok(!$bad) tmp.close File.unlink "while_tmp" or `/bin/rm -f "while_tmp"` test_ok(!File.exist?("while_tmp")) i = 0 until i>4 i+=1 end test_ok(i>4) # exception handling test_check "exception"; begin raise "this must be handled" test_ok(false) rescue test_ok(true) end $bad = true begin raise "this must be handled no.2" rescue if $bad $bad = false retry test_ok(false) end end test_ok(true) # exception in rescue clause $string = "this must be handled no.3" begin begin raise "exception in rescue clause" rescue raise $string end test_ok(false) rescue => e test_ok($! == e) test_ok(e.message == $string) test_ok(e != $string) end # exception in ensure clause begin begin raise "this must be handled no.4" ensure raise "exception in ensure clause" end test_ok(false) rescue test_ok(true) end $bad = true begin begin raise "this must be handled no.5" ensure $bad = false end rescue end test_ok(!$bad) $bad = true begin begin raise "this must be handled no.6" ensure $bad = false end rescue end test_ok(!$bad) $bad = true while true begin break ensure $bad = false end end test_ok(!$bad) test_ok(catch(:foo) { loop do loop do throw :foo, true break end break test_ok(false) # should no reach here end false }) test_check "array" test_ok([1, 2] + [3, 4] == [1, 2, 3, 4]) test_ok([1, 2] * 2 == [1, 2, 1, 2]) test_ok([1, 2] * ":" == "1:2") test_ok([1, 2].hash == [1, 2].hash) test_ok([1,2,3] & [2,3,4] == [2,3]) test_ok([1,2,3] | [2,3,4] == [1,2,3,4]) test_ok([1,2,3] - [2,3] == [1]) $x = [0, 1, 2, 3, 4, 5] test_ok($x[2] == 2) test_ok($x[1..3] == [1, 2, 3]) test_ok($x[1,3] == [1, 2, 3]) $x[0, 2] = 10 test_ok($x[0] == 10 && $x[1] == 2) $x[0, 0] = -1 test_ok($x[0] == -1 && $x[1] == 10) $x[-1, 1] = 20 test_ok($x[-1] == 20 && $x.pop == 20) # array and/or test_ok(([1,2,3]&[2,4,6]) == [2]) test_ok(([1,2,3]|[2,4,6]) == [1,2,3,4,6]) # compact $x = [nil, 1, nil, nil, 5, nil, nil] $x.compact! test_ok($x == [1, 5]) # uniq $x = [1, 1, 4, 2, 5, 4, 5, 1, 2] $x.uniq! test_ok($x == [1, 4, 2, 5]) # empty? test_ok(!$x.empty?) $x = [] test_ok($x.empty?) # sort $x = ["it", "came", "to", "pass", "that", "..."] $x = $x.sort.join(" ") test_ok($x == "... came it pass that to") $x = [2,5,3,1,7] $x.sort!{|a,b| a<=>b} # sort with condition test_ok($x == [1,2,3,5,7]) $x.sort!{|a,b| b-a} # reverse sort test_ok($x == [7,5,3,2,1]) # split test $x = "The Book of Mormon" test_ok($x.split(//).reverse!.join == $x.reverse) test_ok($x.reverse == $x.reverse!) test_ok("1 byte string".split(//).reverse.join(":") == "g:n:i:r:t:s: :e:t:y:b: :1") $x = "a b c d" test_ok($x.split == ['a', 'b', 'c', 'd']) test_ok($x.split(' ') == ['a', 'b', 'c', 'd']) test_ok(defined? "a".chomp) test_ok("abc".scan(/./) == ["a", "b", "c"]) test_ok("1a2b3c".scan(/(\d.)/) == [["1a"], ["2b"], ["3c"]]) # non-greedy match test_ok("a=12;b=22".scan(/(.*?)=(\d*);?/) == [["a", "12"], ["b", "22"]]) $x = [1] test_ok(($x * 5).join(":") == '1:1:1:1:1') test_ok(($x * 1).join(":") == '1') test_ok(($x * 0).join(":") == '') *$x = *(1..7).to_a test_ok($x.size == 7) test_ok($x == [1, 2, 3, 4, 5, 6, 7]) $x = [1,2,3] $x[1,0] = $x test_ok($x == [1,1,2,3,2,3]) $x = [1,2,3] $x[-1,0] = $x test_ok($x == [1,2,1,2,3,3]) $x = [1,2,3] $x.concat($x) test_ok($x == [1,2,3,1,2,3]) test_check "hash" $x = {1=>2, 2=>4, 3=>6} test_ok($x[1] == 2) test_ok(begin for k,v in $x raise if k*2 != v end true rescue false end) test_ok($x.length == 3) test_ok($x.has_key?(1)) test_ok($x.has_value?(4)) test_ok($x.values_at(2,3) == [4,6]) test_ok($x == {1=>2, 2=>4, 3=>6}) $z = $x.keys.sort.join(":") test_ok($z == "1:2:3") $z = $x.values.sort.join(":") test_ok($z == "2:4:6") test_ok($x == $x) $x.shift test_ok($x.length == 2) $z = [1,2] $x[$z] = 256 test_ok($x[$z] == 256) $x = Hash.new(0) $x[1] = 1 test_ok($x[1] == 1) test_ok($x[2] == 0) $x = Hash.new([]) test_ok($x[22] == []) test_ok($x[22].equal?($x[22])) $x = Hash.new{[]} test_ok($x[22] == []) test_ok(!$x[22].equal?($x[22])) $x = Hash.new{|h,k| $z = k; h[k] = k*2} $z = 0 test_ok($x[22] == 44) test_ok($z == 22) $z = 0 test_ok($x[22] == 44) test_ok($z == 0) $x.default = 5 test_ok($x[23] == 5) $x = Hash.new def $x.default(k) $z = k self[k] = k*2 end $z = 0 test_ok($x[22] == 44) test_ok($z == 22) $z = 0 test_ok($x[22] == 44) test_ok($z == 0) test_check "iterator" test_ok(!iterator?) def ttt test_ok(iterator?) end ttt{} # yield at top level test_ok(!defined?(yield)) $x = [1, 2, 3, 4] $y = [] # iterator over array for i in $x $y.push i end test_ok($x == $y) # nested iterator def tt 1.upto(10) {|i| yield i } end i=0 tt{|i| break if i == 5} test_ok(i == 0) def tt2(dummy) yield 1 end def tt3(&block) tt2(raise(ArgumentError,""),&block) end $x = false begin tt3{} rescue ArgumentError $x = true rescue Exception end test_ok($x) def tt4 &block tt2(raise(ArgumentError,""),&block) end $x = false begin tt4{} rescue ArgumentError $x = true rescue Exception end test_ok($x) # iterator break/redo/next/retry done = true loop{ break done = false # should not reach here } test_ok(done) done = false $bad = false loop { break if done done = true next $bad = true # should not reach here } test_ok(!$bad) done = false $bad = false loop { break if done done = true redo $bad = true # should not reach here } test_ok(!$bad) $x = [] for i in 1 .. 7 $x.push i end test_ok($x.size == 7) test_ok($x == [1, 2, 3, 4, 5, 6, 7]) # append method to built-in class class Array def iter_test1 collect{|e| [e, yield(e)]}.sort{|a,b|a[1]<=>b[1]} end def iter_test2 a = collect{|e| [e, yield(e)]} a.sort{|a,b|a[1]<=>b[1]} end end $x = [[1,2],[3,4],[5,6]] test_ok($x.iter_test1{|x|x} == $x.iter_test2{|x|x}) class IterTest def initialize(e); @body = e; end def each0(&block); @body.each(&block); end def each1(&block); @body.each {|*x| block.call(*x) } end def each2(&block); @body.each {|*x| block.call(x) } end def each3(&block); @body.each {|x| block.call(*x) } end def each4(&block); @body.each {|x| block.call(x) } end def each5; @body.each {|*x| yield(*x) } end def each6; @body.each {|*x| yield(x) } end def each7; @body.each {|x| yield(*x) } end def each8; @body.each {|x| yield(x) } end def f(a) a end end test_ok(IterTest.new(nil).method(:f).to_proc.call([1]) == [1]) m = /\w+/.match("abc") test_ok(IterTest.new(nil).method(:f).to_proc.call([m]) == [m]) IterTest.new([0]).each0 {|x| test_ok(x == 0)} IterTest.new([1]).each1 {|x| test_ok(x == 1)} IterTest.new([2]).each2 {|x| test_ok(x == [2])} #IterTest.new([3]).each3 {|x| test_ok(x == 3)} IterTest.new([4]).each4 {|x| test_ok(x == 4)} IterTest.new([5]).each5 {|x| test_ok(x == 5)} IterTest.new([6]).each6 {|x| test_ok(x == [6])} #IterTest.new([7]).each7 {|x| test_ok(x == 7)} IterTest.new([8]).each8 {|x| test_ok(x == 8)} IterTest.new([[0]]).each0 {|x| test_ok(x == [0])} IterTest.new([[1]]).each1 {|x| test_ok(x == [1])} IterTest.new([[2]]).each2 {|x| test_ok(x == [[2]])} IterTest.new([[3]]).each3 {|x| test_ok(x == 3)} IterTest.new([[4]]).each4 {|x| test_ok(x == [4])} IterTest.new([[5]]).each5 {|x| test_ok(x == [5])} IterTest.new([[6]]).each6 {|x| test_ok(x == [[6]])} IterTest.new([[7]]).each7 {|x| test_ok(x == 7)} IterTest.new([[8]]).each8 {|x| test_ok(x == [8])} IterTest.new([[0,0]]).each0 {|*x| test_ok(x == [[0,0]])} IterTest.new([[8,8]]).each8 {|*x| test_ok(x == [[8,8]])} def m0(v) v end def m1 m0(block_given?) end test_ok(m1{p 'test'}) test_ok(!m1) def m m0(block_given?,&Proc.new{}) end test_ok(m1{p 'test'}) test_ok(!m1) class C include Enumerable def initialize @a = [1,2,3] end def each(&block) @a.each(&block) end end test_ok(C.new.collect{|n| n} == [1,2,3]) test_ok(Proc == lambda{}.class) test_ok(Proc == Proc.new{}.class) lambda{|a|test_ok(a==1)}.call(1) def block_test(klass, &block) test_ok(klass === block) end block_test(NilClass) block_test(Proc){} def call_argument_test(state, proc, *args) x = state begin proc.call(*args) rescue ArgumentError x = !x end test_ok(x,2) end call_argument_test(true, lambda{||}) call_argument_test(false, lambda{||}, 1) call_argument_test(true, lambda{|a,|}, 1) call_argument_test(false, lambda{|a,|}) call_argument_test(false, lambda{|a,|}, 1,2) call_argument_test(true, Proc.new{||}) call_argument_test(true, Proc.new{||}, 1) call_argument_test(true, Proc.new{|a,|}, 1) call_argument_test(true, Proc.new{|a,|}) call_argument_test(true, Proc.new{|a,|}, 1,2) def block_get(&block) block end test_ok(Proc == block_get{}.class) call_argument_test(true, block_get{||}) call_argument_test(true, block_get{||}, 1) call_argument_test(true, block_get{|a,|}, 1) call_argument_test(true, block_get{|a,|}) call_argument_test(true, block_get{|a,|}, 1,2) call_argument_test(true, block_get(&lambda{||})) call_argument_test(false, block_get(&lambda{||}),1) call_argument_test(true, block_get(&lambda{|a,|}),1) call_argument_test(false, block_get(&lambda{|a,|}),1,2) blk = block_get{11} test_ok(blk.class == Proc) test_ok(blk.to_proc.class == Proc) test_ok(blk.clone.call == 11) test_ok(block_get(&blk).class == Proc) lmd = lambda{44} test_ok(lmd.class == Proc) test_ok(lmd.to_proc.class == Proc) test_ok(lmd.clone.call == 44) test_ok(block_get(&lmd).class == Proc) test_ok(Proc.new{|a,| a}.yield(1,2,3) == 1) call_argument_test(true, Proc.new{|a,|}, 1,2) test_ok(Proc.new{|&b| b.call(10)}.call {|x| x} == 10) test_ok(Proc.new{|a,&b| b.call(a)}.call(12) {|x| x} == 12) def test_return1 Proc.new { return 55 }.yield + 5 end test_ok(test_return1() == 55) def test_return2 lambda { return 55 }.call + 5 end test_ok(test_return2() == 60) def proc_call(&b) b.call end def proc_yield() yield end def proc_return1 lambda{return 42}.call+1 end test_ok(proc_return1() == 43) def proc_return2 ->{return 42}.call+1 end test_ok(proc_return2() == 43) def proc_return3 proc_call{return 42}+1 end test_ok(proc_return3() == 42) def proc_return4 proc_yield{return 42}+1 end test_ok(proc_return4() == 42) def ljump_test(state, proc, *args) x = state begin proc.call(*args) rescue LocalJumpError x = !x end test_ok(x,2) end ljump_test(false, block_get{break}) ljump_test(true, lambda{break}) def exit_value_test(&block) block.call rescue LocalJumpError $!.exit_value end test_ok(45 == exit_value_test{break 45}) test_ok(55 == begin block_get{break 55}.call rescue LocalJumpError $!.exit_value end) def block_call(&block) block.call end def test_b1 block_call{break 11} end test_ok(test_b1() == 11) def ljump_rescue(r) begin yield rescue LocalJumpError => e r if /from proc-closure/ =~ e.message end end def test_b2 ljump_rescue(22) do block_get{break 21}.call end end test_ok(test_b2() == 22) def test_b3 ljump_rescue(33) do Proc.new{break 31}.yield end end test_ok(test_b3() == 33) def test_b4 lambda{break 44}.call end test_ok(test_b4() == 44) def test_b5 ljump_rescue(55) do b = block_get{break 54} block_call(&b) end end test_ok(test_b5() == 55) def test_b6 b = lambda{break 67} block_call(&b) 66 end test_ok(test_b6() == 66) def util_r7 block_get{break 78} end def test_b7 b = util_r7() ljump_rescue(77) do block_call(&b) end end test_ok(test_b7() == 77) def util_b8(&block) block_call(&block) end def test_b8 util_b8{break 88} end test_ok(test_b8() == 88) def util_b9(&block) lambda{block.call; 98}.call end def test_b9 util_b9{break 99} end test_ok(test_b9() == 99) def util_b10 util_b9{break 100} end def test_b10 util_b10() end test_ok(test_b10() == 100) def test_b11 ljump_rescue(111) do loop do Proc.new{break 110}.yield break 112 end end end test_ok(test_b11() == 111) def test_b12 loop do break lambda{break 122}.call break 121 end end test_ok(test_b12() == 122) def test_b13 ljump_rescue(133) do while true Proc.new{break 130}.yield break 131 end end end test_ok(test_b13() == 133) def test_b14 while true break lambda{break 144}.call break 143 end end test_ok(test_b14() == 144) def test_b15 [0].each {|c| yield 1 } 156 end test_ok(test_b15{|e| break 155 } == 155) def marity_test(m) method = method(m) test_ok(method.arity == method.to_proc.arity, 2) end marity_test(:test_ok) marity_test(:marity_test) marity_test(:p) lambda(&method(:test_ok)).call(true) lambda(&block_get{|a,n| test_ok(a,n)}).call(true, 2) class ITER_TEST1 def a block_given? end end class ITER_TEST2 < ITER_TEST1 def a test_ok(super) super end end test_ok(ITER_TEST2.new.a {}) class ITER_TEST3 def foo x return yield if block_given? x end end class ITER_TEST4 < ITER_TEST3 def foo x test_ok(super == yield) test_ok(super(x, &nil) == x) end end ITER_TEST4.new.foo(44){55} class ITER_TEST5 def tt(aa) aa end def uu(a) class << self define_method(:tt) do |sym| super(sym) end end end def xx(*x) x.size end end a = ITER_TEST5.new a.uu(12) test_ok(a.tt(1) == 1) class ITER_TEST6 < ITER_TEST5 def xx(*a) a << 12 super end end test_ok(ITER_TEST6.new.xx([24]) == 2) test_check "float" test_ok(2.6.floor == 2) test_ok((-2.6).floor == -3) test_ok(2.6.ceil == 3) test_ok((-2.6).ceil == -2) test_ok(2.6.truncate == 2) test_ok((-2.6).truncate == -2) test_ok(2.6.round == 3) test_ok((-2.4).truncate == -2) test_ok((13.4 % 1 - 0.4).abs < 0.0001) nan = 0.0/0 def nan_test(x,y) test_ok(x != y) test_ok((x < y) == false) test_ok((x > y) == false) test_ok((x <= y) == false) test_ok((x >= y) == false) end nan_test(nan, nan) nan_test(nan, 0) nan_test(nan, 1) nan_test(nan, -1) nan_test(nan, 1000) nan_test(nan, -1000) nan_test(nan, 1_000_000_000_000) nan_test(nan, -1_000_000_000_000) nan_test(nan, 100.0); nan_test(nan, -100.0); nan_test(nan, 0.001); nan_test(nan, -0.001); nan_test(nan, 1.0/0); nan_test(nan, -1.0/0); #s = "3.7517675036461267e+17" #test_ok(s == sprintf("%.16e", s.to_f)) f = 3.7517675036461267e+17 test_ok(f == sprintf("%.16e", f).to_f) test_check "bignum" def fact(n) return 1 if n == 0 f = 1 while n>0 f *= n n -= 1 end return f end $x = fact(40) test_ok($x == $x) test_ok($x == fact(40)) test_ok($x < $x+2) test_ok($x > $x-2) test_ok($x == 815915283247897734345611269596115894272000000000) test_ok($x != 815915283247897734345611269596115894272000000001) test_ok($x+1 == 815915283247897734345611269596115894272000000001) test_ok($x/fact(20) == 335367096786357081410764800000) $x = -$x test_ok($x == -815915283247897734345611269596115894272000000000) test_ok(2-(2**32) == -(2**32-2)) test_ok(2**32 - 5 == (2**32-3)-2) $good = true; for i in 1000..1014 $good = false if ((1 << i) != (2**i)) end test_ok($good) $good = true; n1= 1 << 1000 for i in 1000..1014 $good = false if ((1 << i) != n1) n1 *= 2 end test_ok($good) $good = true; n2=n1 for i in 1..10 n1 = n1 / 2 n2 = n2 >> 1 $good = false if (n1 != n2) end test_ok($good) $good = true; for i in 4000..4096 n1 = 1 << i; if (n1**2-1) / (n1+1) != (n1-1) $good = false end end test_ok($good) b = 10**80 a = b * 9 + 7 test_ok(7 == a.modulo(b)) test_ok(-b + 7 == a.modulo(-b)) test_ok(b + -7 == (-a).modulo(b)) test_ok(-7 == (-a).modulo(-b)) test_ok(7 == a.remainder(b)) test_ok(7 == a.remainder(-b)) test_ok(-7 == (-a).remainder(b)) test_ok(-7 == (-a).remainder(-b)) test_ok(10**40+10**20 == 10000000000000000000100000000000000000000) test_ok(10**40/10**20 == 100000000000000000000) a = 677330545177305025495135714080 b = 14269972710765292560 test_ok(a % b == 0) test_ok(-a % b == 0) def shift_test(a) b = a / (2 ** 32) c = a >> 32 test_ok(b == c) b = a * (2 ** 32) c = a << 32 test_ok(b == c) end shift_test(-4518325415524767873) shift_test(-0xfffffffffffffffff) test_check "string & char" test_ok("abcd" == "abcd") test_ok("abcd" =~ /abcd/) test_ok("abcd" === "abcd") # compile time string concatenation test_ok("ab" "cd" == "abcd") test_ok("#{22}aa" "cd#{44}" == "22aacd44") test_ok("#{22}aa" "cd#{44}" "55" "#{66}" == "22aacd445566") test_ok("abc" !~ /^$/) test_ok("abc\n" !~ /^$/) test_ok("abc" !~ /^d*$/) test_ok(("abc" =~ /d*$/) == 3) test_ok("" =~ /^$/) test_ok("\n" =~ /^$/) test_ok("a\n\n" =~ /^$/) test_ok("abcabc" =~ /.*a/ && $& == "abca") test_ok("abcabc" =~ /.*c/ && $& == "abcabc") test_ok("abcabc" =~ /.*?a/ && $& == "a") test_ok("abcabc" =~ /.*?c/ && $& == "abc") test_ok(/(.|\n)*?\n(b|\n)/ =~ "a\nb\n\n" && $& == "a\nb") test_ok(/^(ab+)+b/ =~ "ababb" && $& == "ababb") test_ok(/^(?:ab+)+b/ =~ "ababb" && $& == "ababb") test_ok(/^(ab+)+/ =~ "ababb" && $& == "ababb") test_ok(/^(?:ab+)+/ =~ "ababb" && $& == "ababb") test_ok(/(\s+\d+){2}/ =~ " 1 2" && $& == " 1 2") test_ok(/(?:\s+\d+){2}/ =~ " 1 2" && $& == " 1 2") $x = <') == "") # character constants(assumes ASCII) test_ok("a"[0] == ?a) test_ok(?a == ?a) test_ok(?\C-a == "\1") test_ok(?\M-a == "\341") test_ok(?\M-\C-a == "\201") test_ok("a".upcase![0] == ?A) test_ok("A".downcase![0] == ?a) test_ok("abc".tr!("a-z", "A-Z") == "ABC") test_ok("aabbcccc".tr_s!("a-z", "A-Z") == "ABC") test_ok("abcc".squeeze!("a-z") == "abc") test_ok("abcd".delete!("bc") == "ad") $x = "abcdef" $y = [ ?a, ?b, ?c, ?d, ?e, ?f ] $bad = false $x.each_byte {|i| if i.chr != $y.shift $bad = true break end } test_ok(!$bad) s = "a string" s[0..s.size]="another string" test_ok(s == "another string") s = < Object) == -1) test_ok((Object <=> String) == 1) test_ok((Array <=> String) == nil) test_check "clone" foo = Object.new def foo.test "test" end bar = foo.clone def bar.test2 "test2" end test_ok(bar.test2 == "test2") test_ok(bar.test == "test") test_ok(foo.test == "test") begin foo.test2 test_ok false rescue NoMethodError test_ok true end module M001; end module M002; end module M003; include M002; end module M002; include M001; end module M003; include M002; end test_ok(M003.ancestors == [M003, M002, M001]) test_check "marshal" $x = [1,2,3,[4,5,"foo"],{1=>"bar"},2.5,fact(30)] $y = Marshal.dump($x) test_ok($x == Marshal.load($y)) StrClone=String.clone; test_ok(Marshal.load(Marshal.dump(StrClone.new("abc"))).class == StrClone) [[1,2,3,4], [81, 2, 118, 3146]].each { |w,x,y,z| a = (x.to_f + y.to_f / z.to_f) * Math.exp(w.to_f / (x.to_f + y.to_f / z.to_f)) ma = Marshal.dump(a) b = Marshal.load(ma) test_ok(a == b) } test_check "pack" $format = "c2x5CCxsdils_l_a6"; # Need the expression in here to force ary[5] to be numeric. This avoids # test2 failing because ary2 goes str->numeric->str and ary does not. ary = [1,-100,127,128,32767,987.654321098 / 100.0,12345,123456,-32767,-123456,"abcdef"] $x = ary.pack($format) ary2 = $x.unpack($format) test_ok(ary.length == ary2.length) test_ok(ary.join(':') == ary2.join(':')) test_ok($x =~ /def/) $x = [-1073741825] test_ok($x.pack("q").unpack("q") == $x) test_check "math" test_ok(Math.sqrt(4) == 2) include Math test_ok(sqrt(4) == 2) test_check "struct" struct_test = Struct.new("Test", :foo, :bar) test_ok(struct_test == Struct::Test) test = struct_test.new(1, 2) test_ok(test.foo == 1 && test.bar == 2) test_ok(test[0] == 1 && test[1] == 2) a, b = test.to_a test_ok(a == 1 && b == 2) test[0] = 22 test_ok(test.foo == 22) test.bar = 47 test_ok(test.bar == 47) test_check "variable" test_ok($$.instance_of?(Fixnum)) # read-only variable begin $$ = 5 test_ok false rescue NameError test_ok true end foobar = "foobar" $_ = foobar test_ok($_ == foobar) class Gods @@rule = "Uranus" # private to Gods def ruler0 @@rule end def self.ruler1 # <= per method definition style @@rule end class << self # <= multiple method definition style def ruler2 @@rule end end end module Olympians @@rule ="Zeus" def ruler3 @@rule end end class Titans < Gods @@rule = "Cronus" # do not affect @@rule in Gods include Olympians def ruler4 @@rule end end test_ok(Gods.new.ruler0 == "Cronus") test_ok(Gods.ruler1 == "Cronus") test_ok(Gods.ruler2 == "Cronus") test_ok(Titans.ruler1 == "Cronus") test_ok(Titans.ruler2 == "Cronus") atlas = Titans.new test_ok(atlas.ruler0 == "Cronus") test_ok(atlas.ruler3 == "Zeus") test_ok(atlas.ruler4 == "Cronus") test_check "trace" $x = 1234 $y = 0 trace_var :$x, Proc.new{$y = $x} $x = 40414 test_ok($y == $x) untrace_var :$x $x = 19660208 test_ok($y != $x) trace_var :$x, Proc.new{$x *= 2} $x = 5 test_ok($x == 10) untrace_var :$x test_check "defined?" test_ok(defined?($x)) # global variable test_ok(defined?($x) == 'global-variable')# returns description foo=5 test_ok(defined?(foo)) # local variable test_ok(defined?(Array)) # constant test_ok(defined?(Object.new)) # method test_ok(!defined?(Object.print))# private method test_ok(defined?(1 == 2)) # operator expression class Foo def foo p :foo end protected :foo def bar(f) test_ok(defined?(self.foo)) test_ok(defined?(f.foo)) end end f = Foo.new test_ok(defined?(f.foo) == nil) f.bar(f) def defined_test return !defined?(yield) end test_ok(defined_test) # not iterator test_ok(!defined_test{}) # called as iterator test_check "alias" class Alias0 def foo; "foo" end end class Alias1 0 printf "not ok/test: %d failed %d\n", $ntest, $failed else printf "end of test(test: %d)\n", $ntest end