From 203e604f46e2adc95676014a8a437201f8a65bb3 Mon Sep 17 00:00:00 2001 From: hsbt Date: Sat, 16 Jan 2016 01:37:47 +0000 Subject: * common.mk: test-sample was changed to test-basic. [Feature #11982][ruby-core:72823] * basictest/runner.rb: ditto. rename from tool/rubytest.rb. * basictest/test.rb: ditto. rename from sample/test.rb. * defs/gmake.mk: picked from r53540 * sample/test.rb: backword compatibility for chkbuild. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53551 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- basictest/runner.rb | 30 + basictest/test.rb | 2369 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2399 insertions(+) create mode 100644 basictest/runner.rb create mode 100644 basictest/test.rb (limited to 'basictest') diff --git a/basictest/runner.rb b/basictest/runner.rb new file mode 100644 index 0000000000..2997f3af48 --- /dev/null +++ b/basictest/runner.rb @@ -0,0 +1,30 @@ +#! ./miniruby + +exit if defined?(CROSS_COMPILING) and CROSS_COMPILING +ruby = ENV["RUBY"] +unless ruby + load './rbconfig.rb' + ruby = "./#{RbConfig::CONFIG['ruby_install_name']}#{RbConfig::CONFIG['EXEEXT']}" +end +unless File.exist? ruby + print "#{ruby} is not found.\n" + print "Try `make' first, then `make test', please.\n" + exit false +end +ARGV[0] and opt = ARGV[0][/\A--run-opt=(.*)/, 1] and ARGV.shift + +$stderr.reopen($stdout) +error = '' + +srcdir = File.expand_path('..', File.dirname(__FILE__)) +`#{ruby} #{opt} #{srcdir}/basictest/test.rb #{ARGV.join(' ')}`.each_line do |line| + if line =~ /^end of test/ + print "\ntest succeeded\n" + exit true + end + error << line if %r:^(basictest/test.rb|not): =~ line +end +puts +print error +print "test failed\n" +exit false diff --git a/basictest/test.rb b/basictest/test.rb new file mode 100644 index 0000000000..734525ce3b --- /dev/null +++ b/basictest/test.rb @@ -0,0 +1,2369 @@ +#! /usr/bin/env ruby +# -*- coding: us-ascii -*- + +$testnum=0 +$ntest=0 +$failed = 0 +class Progress + def initialize + @color = nil + @tty = nil + @quiet = nil + @verbose = 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--tty(=(?:yes|(no)|(.*)))?\z/ + warn "unknown --tty argument: #$3" if $3 + @tty = !$1 || !$2 + true + when /\A-(q|-quiet)\z/ + @quiet = true + when /\A-(v|-verbose)\z/ + @verbose = true + end + end + @tty = STDERR.tty? && !STDOUT.tty? && /dumb/ !~ ENV["TERM"] if @tty.nil? + @eol = @tty && !@verbose ? "\r\e[K\r" : "\n" + case @color + when nil + @color = @tty + end + if @color + # dircolors-like style + colors = (colors = ENV['TEST_COLORS']) ? Hash[colors.scan(/(\w+)=([^:\n]*)/)] : {} + begin + File.read(File.join(__dir__, "../test/colors")).scan(/(\w+)=([^:\n]*)/) do |n, c| + colors[n] ||= c + end + rescue + end + @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 + @eol + else + "#{@passed}#{@ok ? 'OK' : ''} #{$testnum}#{@reset}#{@eol}" + 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 "#{$0}:#{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"; + +while_tmp = "while_tmp.#{$$}" +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 not 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 -- cgit v1.2.3