summaryrefslogtreecommitdiff
path: root/sample/test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'sample/test.rb')
-rw-r--r--sample/test.rb1043
1 files changed, 1039 insertions, 4 deletions
diff --git a/sample/test.rb b/sample/test.rb
index 9c422cc94a..7f26433181 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -1,5 +1,1040 @@
-index = 1
-for argument in $ARGV
- printf("%d:%s\n", index, argument)
- index = index + 1
+#! /usr/local/bin/ruby
+
+$testnum=0
+
+def check(what)
+ printf "%s\n", what
+ $what = what
+ $testnum = 0
end
+
+def ok
+ $testnum+=1
+ printf "ok %d\n", $testnum
+end
+
+def notok
+ $testnum+=1
+ printf "not ok %s %d\n", $what, $testnum
+ $failed = TRUE
+end
+
+# make sure conditional operators work
+
+check "condition"
+
+$x = '0';
+
+$x == $x && ok
+$x != $x && notok
+$x == $x || notok
+$x != $x || ok
+
+# first test to see if we can run the tests.
+
+check "if";
+
+$x = 'test';
+if $x == $x then ok else notok end
+if $x != $x then notok else ok end
+
+check "case"
+
+case 5
+when 1, 2, 3, 4, 6, 7, 8
+ notok
+when 5
+ ok
+end
+
+case 5
+when 5
+ ok
+when 1..10
+ notok
+end
+
+case 5
+when 5
+ ok
+else
+ notok
+end
+
+case "foobar"
+when /^f.*r$/
+ ok
+else
+ notok
+end
+
+check "while";
+
+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")
+
+while tmp.gets()
+ break if /vt100/
+end
+
+if !tmp.eof && /vt100/ then
+ ok
+else
+ notok
+end
+tmp.close
+
+# test continue
+$bad = FALSE
+tmp = open("while_tmp", "r")
+while tmp.gets()
+ continue if /vt100/;
+ $bad = 1 if /vt100/;
+end
+if !tmp.eof || /vt100/ || $bad
+ notok
+else
+ ok
+end
+tmp.close
+
+# test redo
+$bad = FALSE
+tmp = open("while_tmp", "r")
+while tmp.gets()
+ if gsub!('vt100', 'VT100')
+ gsub!('VT100', 'Vt100')
+ redo;
+ end
+ $bad = 1 if /vt100/;
+ $bad = 1 if /VT100/;
+end
+if !tmp.eof || $bad
+ notok
+else
+ ok
+end
+tmp.close
+
+# test interval
+$bad = FALSE
+tmp = open("while_tmp", "r")
+while tmp.gets()
+ break if not 1..2
+ if /vt100/ || /Amiga/ || /paper/
+ $bad = TRUE
+ notok
+ break
+ end
+end
+ok if not $bad
+tmp.close
+
+File.unlink "while_tmp" or `/bin/rm -f "while_tmp"`
+
+# exception handling
+check "exception";
+
+begin
+ fail "this must be handled"
+ notok
+rescue
+ ok
+end
+
+$bad = TRUE
+begin
+ fail "this must be handled no.2"
+rescue
+ if $bad
+ $bad = FALSE
+ retry
+ notok
+ end
+end
+ok
+
+$bad = TRUE
+$string = "this must be handled no.3"
+begin
+ fail $string
+rescue
+ensure
+ $bad = FALSE
+ ok
+end
+notok if $bad || $! != $string
+
+# exception in rescue clause
+begin
+ begin
+ fail "this must be handled no.4"
+ rescue
+ fail "exception in rescue clause"
+ end
+ notok
+rescue
+ ok
+end
+
+check "array"
+$x = [0, 1, 2, 3, 4, 5]
+if $x[2] == 2
+ ok
+else
+ notok
+end
+
+if $x[1..3] == [1, 2, 3]
+ ok
+else
+ notok
+end
+
+if $x[1,3] == [1, 2, 3]
+ ok
+else
+ notok
+end
+
+if [1, 2] + [3, 4] == [1, 2, 3, 4]
+ ok
+else
+ notok
+end
+
+$x[0, 2] = 10
+if $x[0] == 10 && $x[1] == 2
+ ok
+else
+ notok
+end
+
+$x[0, 0] = -1
+if $x[0] == -1 && $x[1] == 10
+ ok
+else
+ notok
+end
+
+$x[-1, 1] = 20
+if $x[-1] == 20 && $x.pop == 20
+ ok
+else
+ notok
+end
+
+$x = ["it", "came", "to", "pass", "that", "..."]
+$x = $x.sort.join(" ")
+if $x == "... came it pass that to"
+ ok
+else
+ notok
+end
+
+# split test
+if "1 byte string".split(//).reverse.join(":") == "g:n:i:r:t:s: :e:t:y:b: :1"
+ ok
+else
+ notok
+end
+
+$x = [1]
+if ($x * 5).join(":") == '1:1:1:1:1' then ok else notok end
+if ($x * 1).join(":") == '1' then ok else notok end
+if ($x * 0).join(":") == '' then ok else notok end
+
+check "hash"
+$x = {1=>2, 2=>4, 3=>6}
+$y = {1, 2, 2, 4, 3, 6}
+
+if $x[1] == 2
+ ok
+else
+ notok
+end
+
+begin
+ for k,v in $y
+ fail if k*2 != v
+ end
+ ok
+rescue
+ notok
+end
+
+if $x.length == 3
+ ok
+else
+ notok
+end
+
+if $x.has_key?(1)
+ ok
+else
+ notok
+end
+
+if $x.has_value?(4)
+ ok
+else
+ notok
+end
+
+if $x.indexes(2,3) == [4,6]
+ ok
+else
+ notok
+end
+
+$z = $y.keys.join(":")
+if $z == "1:2:3"
+ ok
+else
+ notok
+end
+
+$z = $y.values.join(":")
+if $z == "2:4:6"
+ ok
+else
+ notok
+end
+
+if $x == $y
+ ok
+else
+ notok
+end
+
+$y.shift
+if $y.length == 2
+ ok
+else
+ notok
+end
+
+check "iterator"
+
+if iterator? then notok else ok end
+
+def ttt
+ if iterator? then ok else notok end
+end
+ttt{}
+
+# yield at top level
+begin
+ yield
+ notok
+rescue
+ ok
+end
+
+$x = [1, 2, 3, 4]
+$y = []
+
+# iterator over array
+for i in $x
+ $y.push i
+end
+if $x == $y
+ ok
+else
+ notok
+end
+
+# nested iterator
+def tt
+ 1.upto(10) {|i|
+ yield i
+ }
+end
+
+tt{|i| break if i == 5}
+if i == 5
+ ok
+else
+ notok
+end
+
+# iterator break/redo/continue/retry
+done = TRUE
+loop{
+ break
+ done = FALSE
+ notok
+}
+ok if done
+
+done = TRUE
+$bad = FALSE
+loop {
+ break if not done
+ done = FALSE
+ continue
+ $bad = TRUE
+}
+if $bad
+ notok
+else
+ ok
+end
+
+done = TRUE
+$bad = FALSE
+loop {
+ break if not done
+ done = FALSE
+ redo
+ $bad = TRUE
+}
+if $bad
+ notok
+else
+ ok
+end
+
+$x = []
+for i in 1 .. 7
+ $x.push(i)
+end
+if $x.size == 7
+ ok
+else
+ notok
+end
+# $x == [1, 2, 3, 4, 5, 6, 7]
+$done = FALSE
+$x = []
+for i in 1 .. 7 # see how retry works in iterator loop
+ if i == 4 and not $done
+ $done = TRUE
+ retry
+ end
+ $x.push(i)
+end
+# $x == [1, 2, 3, 1, 2, 3, 4, 5, 6, 7]
+if $x.size == 10
+ ok
+else
+ notok
+end
+
+check "bignum"
+def fact(n)
+ return 1 if n == 0
+ return n*fact(n-1)
+end
+if fact(40) == 815915283247897734345611269596115894272000000000
+ ok
+else
+ notok
+end
+if fact(40) == 815915283247897734345611269596115894272000000001
+ notok
+else
+ ok
+end
+
+check "string & char"
+
+if "abcd" == "abcd"
+ ok
+else
+ notok
+end
+
+if "abcd" =~ "abcd"
+ ok
+else
+ notok
+end
+
+$foo = "abc"
+if "#$foo = abc" == "abc = abc"
+ ok
+else
+ notok
+end
+
+if "#{$foo} = abc" == "abc = abc"
+ ok
+else
+ notok
+end
+
+foo = "abc"
+if "#{foo} = abc" == "abc = abc"
+ ok
+else
+ notok
+end
+
+if '-' * 5 == '-----' then ok else notok end
+if '-' * 1 == '-' then ok else notok end
+if '-' * 0 == '' then ok else notok end
+
+foo = '-'
+if foo * 5 == '-----' then ok else notok end
+if foo * 1 == '-' then ok else notok end
+if foo * 0 == '' then ok else notok end
+
+# character constants(assumes ASCII)
+if "a"[0] == ?a
+ ok
+else
+ notok
+end
+
+if ?a == ?a
+ ok
+else
+ notok
+end
+
+if ?\C-a == 1
+ ok
+else
+ notok
+end
+
+if ?\M-a == 225
+ ok
+else
+ notok
+end
+
+if ?\M-\C-a == 129
+ ok
+else
+ notok
+end
+
+$x = "abcdef"
+$y = [ ?a, ?b, ?c, ?d, ?e, ?f ]
+$bad = FALSE
+$x.each_byte {|i|
+ if i != $y.shift
+ $bad = TRUE
+ break
+ end
+}
+if not $bad
+ ok
+else
+ notok
+end
+
+check "asignment"
+a = nil
+if a == nil
+ ok
+else
+ notok
+end
+
+a, b = 1, 2
+if a == 1 and b == 2 then
+ ok
+else
+ notok
+end
+
+a, *b = 1, 2, 3
+if a == 1 and b == [2, 3] then
+ ok
+else
+ notok
+end
+
+check "call"
+def aaa(a, b=100, *rest)
+ res = [a, b]
+ res += rest if rest
+ return res
+end
+
+begin
+ aaa()
+ notok
+rescue
+ ok
+end
+
+begin
+ aaa
+ notok
+rescue
+ ok
+end
+
+begin
+ if aaa(1) == [1, 100]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+begin
+ if aaa(1, 2) == [1, 2]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+begin
+ if aaa(1, 2, 3, 4) == [1, 2, 3, 4]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+begin
+ if aaa(1, *[2, 3, 4]) == [1, 2, 3, 4]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+check "proc"
+$proc = proc{|i| i}
+if $proc.call(2) == 2
+ ok
+else
+ notok
+end
+
+$proc = proc{|i| i*2}
+if $proc.call(2) == 4
+ ok
+else
+ notok
+end
+
+proc{
+ iii=5 # dynamic local variable
+ $proc = proc{ |i|
+ iii = i
+ }
+ $proc2 = proc {
+ $x = iii # dynamic variables shared by procs
+ }
+ if defined?(iii) # dynamic variables' scope
+ ok
+ else
+ notok
+ end
+}.call
+if defined?(iii) # out of scope
+ notok
+else
+ ok
+end
+$x=0
+$proc.call(5)
+$proc2.call
+if $x == 5
+ ok
+else
+ notok
+end
+
+check "signal"
+begin
+ kill "SIGINT", $$
+ sleep 1
+ notok
+rescue
+ ok
+end
+
+$x = 0
+trap "SIGINT", proc{|sig| $x = sig;fail}
+begin
+ kill "SIGINT", $$
+ sleep 1
+ notok
+rescue
+ if $x == 2
+ ok
+ else
+ notok
+ end
+end
+
+$x = FALSE
+trap "SIGINT", "$x = TRUE;fail"
+begin
+ kill "SIGINT", $$
+ sleep 1
+ notok
+rescue
+ if $x
+ ok
+ else
+ notok
+ end
+end
+
+check "eval"
+$bad=FALSE
+eval 'while FALSE; $bad = TRUE; print "foo\n" end
+if not $bad then ok else notok end'
+
+$foo = 'ok'
+begin
+ eval $foo
+rescue
+ notok
+end
+
+check "system"
+if `echo foobar` == "foobar\n"
+ ok
+else
+ notok
+end
+
+if `./ruby -e 'print "foobar"'` == 'foobar'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+tmp.print "print $zzz\n";
+tmp.close
+
+if `./ruby -s script_tmp -zzz` == 't'
+ ok
+else
+ notok
+end
+
+if `./ruby -s script_tmp -zzz=555` == '555'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+tmp.print "#! /usr/local/bin/ruby -s\n";
+tmp.print "print $zzz\n";
+tmp.close
+
+if `./ruby script_tmp -zzz=678` == '678'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+tmp.print "this is a leading junk\n";
+tmp.print "#! /usr/local/bin/ruby -s\n";
+tmp.print "print $zzz\n";
+tmp.print "__END__\n";
+tmp.print "this is a trailing junk\n";
+tmp.close
+
+if `./ruby -x script_tmp` == 'nil'
+ ok
+else
+ notok
+end
+
+if `./ruby -x script_tmp -zzz=555` == '555'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+for i in 1..5
+ tmp.print i, "\n"
+end
+tmp.close
+
+`./ruby -i.bak -pe 'sub(/^[0-9]+$/){$&.to_i * 5}' script_tmp`
+done = TRUE
+tmp = open("script_tmp", "r")
+while tmp.gets
+ if $_.to_i % 5 != 0
+ done = FALSE
+ notok
+ break
+ end
+end
+ok if done
+
+File.unlink "script_tmp" or `/bin/rm -f "script_tmp"`
+File.unlink "script_tmp.bak" or `/bin/rm -f "script_tmp.bak"`
+
+check "const"
+TEST1 = 1
+TEST2 = 2
+
+module Const
+ TEST3 = 3
+ TEST4 = 4
+end
+
+module Const2
+ TEST3 = 6
+ TEST4 = 8
+end
+
+include Const
+
+if [TEST1,TEST2,TEST3,TEST4] == [1,2,3,4]
+ ok
+else
+ notok
+end
+
+include Const2
+
+if [TEST1,TEST2,TEST3,TEST4] == [1,2,6,8]
+ ok
+else
+ notok
+end
+
+check "clone"
+foo = Object.new
+def foo.test
+ "test"
+end
+bar = foo.clone
+def bar.test2
+ "test2"
+end
+
+if bar.test2 == "test2"
+ ok
+else
+ notok
+end
+
+if bar.test == "test"
+ ok
+else
+ notok
+end
+
+if foo.test == "test"
+ ok
+else
+ notok
+end
+
+begin
+ foo.test2
+ notok
+rescue
+ ok
+end
+
+check "pack"
+
+$format = "c2x5CCxsdila6";
+# Need the expression in here to force ary[5] to be numeric. This avoids
+# test2 failing because ary2 goes str->numeric->str and ary doesn't.
+ary = [1,-100,127,128,32767,987.654321098 / 100.0,12345,123456,"abcdef"]
+$x = ary.pack($format)
+ary2 = $x.unpack($format)
+
+if ary.length == ary2.length then ok else notok end
+
+if ary.join(':') == ary2.join(':') then ok else notok end
+
+if $x =~ /def/ then ok else notok end
+
+check "math"
+if Math.sqrt(4) == 2
+ ok
+else
+ notok
+end
+
+include Math
+if sqrt(4) == 2
+ ok
+else
+ notok
+end
+
+check "struct"
+struct_test = Struct.new("Test", :foo, :bar)
+if struct_test == Struct::Test
+ ok
+else
+ notok
+end
+test = struct_test.new(1, 2)
+if test.foo == 1 && test.bar == 2
+ ok
+else
+ notok
+end
+if test[0] == 1 && test[1] == 2
+ ok
+else
+ notok
+end
+a, b = test
+if a == 1 && b == 2
+ ok
+else
+ notok
+end
+test[0] = 22
+if test.foo == 22
+ ok
+else
+ notok
+end
+test.bar = 47
+if test.bar == 47
+ ok
+else
+ notok
+end
+
+check "variable"
+if $$.is_instance_of? Fixnum
+ ok
+else
+ notok
+end
+
+begin
+ $$ = 5
+ notok
+rescue
+ ok
+end
+
+foobar = "foobar"
+$_ = foobar
+if $_ == foobar
+ ok
+else
+ notok
+end
+
+check "trace"
+$x = 1234
+$y = 0
+trace_var :$x, proc{$y = $x}
+$x = 40414
+if $y == $x
+ ok
+else
+ notok
+end
+
+untrace_var :$x
+$x = 19660208
+if $y != $x
+ ok
+else
+ notok
+end
+
+trace_var :$x, proc{$x *= 2}
+$x = 5
+if $x == 10
+ ok
+else
+ notok
+end
+untrace_var :$x
+
+check "defined?"
+if defined? $x
+ ok
+else
+ notok
+end
+
+foo=5
+if defined? foo
+ ok
+else
+ notok
+end
+
+if defined? Array
+ ok
+else
+ notok
+end
+
+if defined? Object.new
+ ok
+else
+ notok
+end
+
+if defined? 1 == 2
+ ok
+else
+ notok
+end
+
+if defined? fail
+ ok
+else
+ notok
+end
+
+def defined_test
+ return defined?(yield)
+end
+
+if defined_test
+ notok
+else
+ ok
+end
+
+if defined_test{}
+ ok
+else
+ notok
+end
+
+check "gc"
+begin
+ 1.upto(10000) {
+ tmp = [0,1,2,3,4,5,6,7,8,9]
+ }
+ tmp = nil
+ ok
+rescue
+ notok
+end
+
+print "end of test\n" if not $failed