diff --git a/src/modules/Gmp/testsuite.in b/src/modules/Gmp/testsuite.in
index 6defa22c0cf35847148f2338cef26c84d1c41d93..baf2a84d5983b1c5baad1b22de42a403fc49ea3a 100644
--- a/src/modules/Gmp/testsuite.in
+++ b/src/modules/Gmp/testsuite.in
@@ -1,10 +1,11 @@
-// $Id: testsuite.in,v 1.12 1998/03/28 14:50:26 grubba Exp $
+// $Id: testsuite.in,v 1.13 1998/04/26 11:46:26 hubbe Exp $
 
 // mpz
 cond( [[ master()->resolv("Gmp")->mpz ]],
 [[
   test_true(programp(Gmp.mpz))
   test_false(clone(Gmp.mpz))
+  test_false(!Gmp.mpz(1))
   test_do(destruct(clone(Gmp.mpz)))
 
   test_eq(Gmp.mpz(10),10)
@@ -38,6 +39,7 @@ cond( [[ master()->resolv("Gmp")->mpz ]],
   test_binop(17,|,7,23)
   test_binop(17,&,18,16)
 
+  test_eq([[`+(1,1,1,Gmp.mpz(1),1,1)]],6)
   test_eq(-clone(Gmp.mpz,17),-17)
   test_eq((~clone(Gmp.mpz,17)) & 255,238)
   test_true(stringp((string)clone(Gmp.mpz,17)))
diff --git a/src/testsuite.in b/src/testsuite.in
index d521e705606763dc84db554f5e8e26f57af50a02..7ec2840f58c7748787183a800adf92b3c3600779 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -1,4 +1,4 @@
-test_true([["$Id: testsuite.in,v 1.97 1998/04/24 18:29:04 hubbe Exp $"]])
+stest_true([["$Id: testsuite.in,v 1.98 1998/04/26 11:38:50 hubbe Exp $"]])
 cond([[all_constants()->_verify_internals]],
 [[
   test_do(_verify_internals())
@@ -17,6 +17,25 @@ bar"]],[["foo\nbar"]])
 test_true([[stringp(#string "Makefile")]])
 test_any([[class Bar { array(int) foo = ({}); }; class Foo { inherit Bar; array(int) foo = ({1}); }; return sizeof(Foo()->foo);]],1)
 
+test_false([[object_variablep(class X { int y; int z() { return 1; }}(),"foo")]])
+test_false([[object_variablep(class X { int y; int z() { return 1; }}(),"z")]])
+test_true([[object_variablep(class X { int y; int z() { return 1; }}(),"y")]])
+
+test_any([[ int a,b; [a,b]=({1,2}); return a]],1)
+test_any([[ int a,b; [a,b]=({1,2}); return b]],2)
+test_any([[ int a,b; [ [a],b]=({ ({ 1 }) ,2}); return a]],1)
+test_any([[ int a,b; [ [a],b]=({ ({ 1 }) ,2}); return b]],2)
+test_compile_error([[ default ; ]])
+test_compile_error([[ int a,b; [a,b]++; ]])
+test_compile_eror(0())
+test_compile_eror(1())
+test_compile_eror(""())
+test_compile_eror(([])())
+test_compile_eror(([])())
+test_any([[ class X { int y; class Z { void destroy() { y++; } } }; X x=X(); destruct(x->Z()); return x->y;]],1)
+test_eval_error([[ class Z { int destroy() { return 1/y; } }(); ]])
+
+test_do(_debug(_debug(0)))
 test_do(_static_modules())
 test_compile_any([[import Stdio; class x { string y() { read_file("foo"); } }]])
 test_compile([[Stdio.File foo=Stdio.File();]])
@@ -27,6 +46,49 @@ test_compile_any([[void foo(array(Stdio.FILE) f) {}]])
 test_compile_any([[Stdio.File foo(array(Stdio.FILE) f) { return f[0]; }]])
 test_compile([[Stdio.File foo=Stdio.FILE();]])
 
+dnl this should really work...
+dnl test_compile_any([[void foo(int,string,...);]])
+
+test_compile_error([[ int float; ]])
+test_compile_error([[ int array; ]])
+test_compile_error([[ int function; ]])
+test_compile_error([[ int int; ]])
+test_compile_error([[ int mapping; ]])
+test_compile_error([[ int multiset; ]])
+test_compile_error([[ int object; ]])
+test_compile_error([[ int string; ]])
+test_compile_error([[ int void; ]])
+test_compile_error([[ int inline; ]])
+test_compile_error([[ int local; ]])
+test_compile_error([[ int nomask; ]])
+test_compile_error([[ int predef; ]])
+test_compile_error([[ int private; ]])
+test_compile_error([[ int protected; ]])
+test_compile_error([[ int public; ]])
+test_compile_error([[ int static; ]])
+test_compile_error([[ int final; ]])
+test_compile_error([[ int do; ]])
+test_compile_error([[ int else; ]])
+test_compile_error([[ int return; ]])
+test_compile_error([[ int constant; ]])
+test_compile_error([[ int import; ]])
+test_compile_error([[ int inherit; ]])
+test_compile_error([[ int catch; ]])
+test_compile_error([[ int gauge; ]])
+test_compile_error([[ int lambda; ]])
+test_compile_error([[ int sscanf; ]])
+test_compile_error([[ int switch; ]])
+test_compile_error([[ int typeof; ]])
+test_compile_error([[ int break; ]])
+test_compile_error([[ int case; ]])
+test_compile_error([[ int continue; ]])
+test_compile_error([[ int default; ]])
+test_compile_error([[ int for; ]])
+test_compile_error([[ int foreach; ]])
+test_compile_error([[ int if; ]])
+test_compile_error([[ int float = 0; ]])
+test_eval_error([[ return 0.0[0]; ]])
+test_eval_error([[ return 0[0]; ]])
 test_compile_error([[constant x=class {}(); ]])
 cond( [[ master()->resolv("Gmp")->mpz ]],
 [[
@@ -46,6 +108,19 @@ test_eq([[cpp("#define MAX(X,Y) ((X)>(Y)?(X):(Y))\n#define MAX3(X,Y,Z) MAX(MAX(X
 
 test_program([[class foo { program x() { return class {}; }}; class bar { inherit foo; program x() { return class {}; }} int a() { return foo()->x != bar()->x(); }]])
 
+test_eq([[object_program(master())]],[[(program)"/master"]])
+test_compile([[object("master") m = master();]])
+test_any([[int x; x++; if(x) return x; return -1;]],1)
+test_any([[int x; if(x) return x; return -1;]],-1)
+test_any([[int x,y; if(x==y || x==1) return 2; return 0;]],2);
+test_any([[int x,y; if(x==y && x==0) return 2; return 0;]],2);
+test_any([[int x,y=1; if(x==y || x==1) return 2; return 0;]],0);
+test_any([[int x,y=1; if(x==y && x==0) return 2; return 0;]],0);
+
+test_eq([[ "\007" & "\023"]],"\003")
+test_eq([[ "\007" | "\023"]],"\027")
+test_eq([[ "\007" ^ "\023"]],"\024")
+
 // Testing the 'inline' keyword
 test_program([[class foo { inline int c() { return time(); } int d() { return c(); } }; class bar { inherit foo; int c() { return 0; } } int a() { return bar()->d(); }]],0)
 
@@ -123,7 +198,7 @@ test_any([[
 class p1 { int foo() { return 1; } };
 class p2 { int foo() { return 2; } };
 class c1 { inherit p1; inherit p2; };
-return c1()->foo();]],2);
+return c1()->foo();]],2)
 
 test_any([[class foo { int x=random(100); int `<(object o) { return x < o->x; } }; object *o=Array.map(allocate(100),foo); sort(o); for(int e=1;e<100;e++) if(o[e-1]->x > o[e]->x) return e; return -1;]],-1)
 test_compile_error([[void foo() { 1++; }]])
@@ -137,6 +212,7 @@ test_compile_error([[int foo() { return 1} ; constant foo=(["foo":foo]); return
 test_compile_error([[class T{void p(object e,object f){lambda::create(f);}}]])
 test_eval_error(mixed *foo=({}); return mkmapping(foo,({1})); )
 test_true(time())
+test_true(time(1))
 test_compile_error([[mapping (string:array(string:string)) foo=([]); ]])
 test_compile_error([[int a() { switch(random(2)) { case 3: if(random(2)) { case 0: return 1; } else { case 1: return 2; } } }]])
 
@@ -170,8 +246,8 @@ test_any([[mixed s="foo"; return s++;]],"foo")
 test_any([[mixed s="foo"; s++; return s;]],"foo1")
 test_any([[mixed s="foo"; return ++s;]],"foo1")
 test_any([[float p=2.0; return p--;]],2.0);
-test_any([[float p=2.0; p--; return p;]],1.0);
-test_any([[float p=2.0; return --p;]],1.0);
+test_any([[float p=2.0; p--; return p;]],1.0)
+test_any([[float p=2.0; return --p;]],1.0)
 
 test_compile_error(int foo() { LJjjjjJJJ ; })
 test_true(clone(class c { constant i=1; })->i)
@@ -184,10 +260,14 @@ test_true(clone(class c { mixed `->=(mixed a, mixed b) { if(a!=b) throw(1); }})-
 test_compile_any(class A {}; class B { inherit A; })
 
 test_true(mappingp(_memory_usage()))
+test_true(_refs(""));
+test_true(_refs(({})));
+test_true(_refs(([])));
+test_true(_refs(this_object()))
 test_true(objectp( _next(this_object()) || _prev(this_object())))
 test_true(arrayp( _next(({})) || _prev(({}))))
-test_any(object o=this_object(); while(o=_next(o)));
-test_any(object o=this_object(); while(o=_prev(o)));
+test_any(object o=this_object(); while(o=_next(o)))
+test_any(object o=this_object(); while(o=_prev(o)))
 
 test_any([[object(Stdio.File) o=Stdio.File(); return objectp(o);]],1)
 test_any([[object o=Regexp("foo"); return objectp(o);]],1)
@@ -210,6 +290,8 @@ test_any(if(int i=1) return i; return 0;,1)
 test_compile(for(int i=0;i<100;i++) return 0;)
 test_compile(foreach(({}),mixed i){})
 test_compile(sscanf("","",mixed foo))
+test_compile_error(sscanf("","",float))
+test_compile_error(sscanf("",float))
 
 // ++
 test_any([[int e; e++; return e;]],1)
@@ -217,6 +299,7 @@ test_any([[int e; ++e; return e;]],1)
 test_any([[int e; return e++;]],0)
 test_any([[int e; return ++e;]],1)
 test_any([[int e; if(e++) return 0; return e;]],1)
+test_any([[string e=""; e++; return e;]],"1")
 
 // --
 test_any([[int e; e--; return e;]],-1)
@@ -224,6 +307,7 @@ test_any([[int e; --e; return e;]],-1)
 test_any([[int e; return e--;]],0)
 test_any([[int e; return --e;]],-1)
 test_any([[int e; if(e--) return 0; return e;]],-1)
+test_any([[string e=""; e--; return e;]],"-1")
 
 test_compile_error_low(master()->add_precompiled_program(\"/test\",compile_string(\"int foo() { return 17; }\",\"62\")))
 
@@ -255,6 +339,36 @@ cond([[all_constants()->localtime]],
 test_true(mappingp(localtime(0)))
 ]])
 
+cond([[all_constants()->mktime]],
+[[
+  test_true([[mktime( ([
+  "sec":58,
+  "isdst":1,
+  "year":98,
+  "mon":3,
+  "mday":26,
+  "hour":1,
+  "min":51
+]))]])
+
+  test_eq([[mktime(58,51,1,26,3,98,1,0)]],[[mktime( ([
+  "sec":58,
+  "isdst":1,
+  "year":98,
+  "mon":3,
+  "mday":26,
+  "hour":1,
+  "min":51,
+  "timezone":0,
+]) ) ]])
+
+]])
+
+cond([[all_constants()->localtime && all_constants()->mktime]],
+[[
+  test_any([[ int x=time(); return mktime(localtime(x)) == x;]], 1)
+]])
+
 cond([[all_constants()->_verify_internals]],
 [[
   test_do(_verify_internals())
@@ -336,6 +450,134 @@ test_any([[mapping m=([]); m[1]++; return m[1];]],1)
 test_any([[mapping m=([1:1]); m[1]++; return m[1];]],2)
 test_any([[mapping m=([]); m[1]++; m[1]++; return m[1];]],2)
 
+// multiset tests
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[e]=1;
+  for(e=0;e<1000;e++) if(!m[e]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[e]++;
+  for(e=0;e<1000;e++) if(!m[e]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[e]=1;
+  for(e=999;e>=0;e--) if(!m[e]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=999;e>=0;e--) m[e]=1;
+  for(e=0;e<1000;e++) if(!m[e]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=999;e>=0;e--) m[e]=1;
+  for(e=999;e>=0;e--) if(!m[e]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[reverse(e)]=1;
+  for(e=0;e<1000;e++) if(!m[reverse(e)]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=999;e>=0;e--) m[reverse(e)]=1;
+  for(e=0;e<1000;e++) if(!m[reverse(e)]) return e;
+  return -1;
+]],-1)
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[reverse(e)]=1;
+  for(e=0;e<1000;e++) m[reverse(e)]=0;
+  return sizeof(m);
+]],0)
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[reverse(e)]=1;
+  for(e=0;e<1000;e+=2) m[reverse(e)]=0;
+  for(e=0;e<1000;e+=2) if(m[reverse(e)]) return e;
+  for(e=1;e<1000;e+=2) if(!m[reverse(e)]) return e;
+  return -1;
+]],-1)
+
+
+test_any([[multiset m=(<>);int e;
+  for(e=0;e<1000;e++) m[reverse(e)]=1;
+  for(e=0;e<1000;e++) m[reverse(e)]++;
+  for(e=0;e<1000;e++) if(m[reverse(e)]!=1) return e;
+  return -1;
+]],-1)
+
+
+test_any([[multiset m=(<>);int e;
+  mixed a;
+  a=allocate(1000);
+  for(e=0;e<1000;e++)
+  {
+    m[reverse(e)]=1;
+    a[e]=reverse(e);
+  }
+  add_constant("mtest_m",m);
+  add_constant("mtest_i",a);
+  return 1;
+]],1)
+
+test_eq([[sizeof(mtest_m)]],sizeof(mtest_i))
+test_equal(Array.sort_array(indices(mtest_m)),Array.sort_array(mtest_i))
+test_equal(mtest_m,copy_value(mtest_m))
+
+test_any([[multiset m=(<>);int e;
+  mixed a;
+  a=allocate(100);
+  for(e=0;e<100;e++)
+  {
+    m[reverse(e-50)]=1;
+    a[e]=reverse(e-50);
+    if(sizeof(m)!=e+1) return e;
+  }
+  add_constant("mtest_m2",m);
+  add_constant("mtest_i2",a);
+  return -1;
+]],-1)
+
+test_eq([[sizeof(mtest_m2)]],sizeof(mtest_i2))
+test_any([[int e;multiset q=(<>),p=(<>); for(e=0;e<1000;e++) { p[reverse(e)]=1; q+=(<reverse(e)>); if(!equal(sort(indices(p)),sort(indices(q)))) return 0; } return 1;]],1)
+
+test_equal(sort(indices(mtest_m|mtest_m2)),sort(mtest_i|mtest_i2))
+test_equal(sort(indices(mtest_m&mtest_m2)),sort(mtest_i&mtest_i2))
+test_equal(sort(indices(mtest_m-mtest_m2)),sort(mtest_i-mtest_i2))
+test_equal(sort(indices(mtest_m^mtest_m2)),sort(mtest_i^mtest_i2))
+test_equal(sort(indices(mtest_m2|mtest_m)),sort(mtest_i2|mtest_i))
+test_equal(sort(indices(mtest_m2&mtest_m)),sort(mtest_i2&mtest_i))
+test_equal(sort(indices(mtest_m2-mtest_m)),sort(mtest_i2-mtest_i))
+test_equal(sort(indices(mtest_m2^mtest_m)),sort(mtest_i2^mtest_i))
+
+test_do(add_constant("mtest_m"); add_constant("mtest_i"); )
+test_do(add_constant("mtest_m2"); add_constant("mtest_i2"); )
+
+define(MTEST,[[test_equal([[mkmultiset(indices(allocate($1)))]],[[mkmultiset(reverse(indices(allocate($1))))]])]])
+
+MTEST(0)
+MTEST(1)
+MTEST(2)
+MTEST(3)
+MTEST(5)
+MTEST(8)
+MTEST(13)
+MTEST(21)
+MTEST(34)
+MTEST(55)
+
+define([[MTEST]])
+
 // mapping tests
 
 test_any([[mapping m=([]);int e;
@@ -631,6 +873,13 @@ test_any([[mixed a; sscanf("ab","%2s",a); return a]],"ab")
 test_any([[mixed a; sscanf("abc","%3s",a); return a]],"abc")
 test_any([[mixed a; sscanf("abc","%2s",a); return a]],"ab")
 test_any([[mixed a; sscanf("ac","%3s",a); return a]],0)
+test_any([[mixed a; sscanf("a3","%*s%d",a); return a]],3)
+test_any([[mixed a; sscanf("a3","%s%*d",a); return a]],"a")
+test_any([[mixed a; sscanf("a93","%s%*o",a); return a]],"a9")
+test_any([[mixed a; sscanf("a93","%*s%o",a); return a]],3)
+test_any([[mixed a; sscanf("a93","%s%*x",a); return a]],"")
+test_any([[mixed a; sscanf("a93","%*s%x",a); return a]],0xa93)
+test_any([[mixed a; sscanf("f","f%n",a); return a]],1)
 
 test_equal([[array_sscanf("10 20 30","%d %d %d")]],[[({10,20,30})]])
 test_equal([[array_sscanf("1 2 3 4 5 6 7 8 9","%d %d %d %d %d %d %d %d %s")]],[[({1,2,3,4,5,6,7,8,"9"})]])
@@ -746,6 +995,8 @@ test_equal((["foo":3,"bar":4,"gazonk":5])-(["foo":3,"gazonk":8]),(["bar":4]))
 // testing ~
 test_eq(-1-4,~4)
 test_eq(-1-627893874,~627893874)
+test_eq(~1.0,-2.0)
+test_eq(~"\x55","\xaa")
 
 // testing *
 test_eq(3*4,12)
@@ -998,6 +1249,8 @@ test_eq([[(string)1]],[["1"]])
 test_equal([[(array)(["1":1])]],[[ ({ ({"1", 1}) }) ]])
 test_equal([[(array(int)) ({"1","4711",2.0,4})]],[[({1,4711,2,4})]])
 
+test_equal([[(array)"foo"]],[[ values("foo") ]])
+test_equal([[(array)(<1,2,3>)]],[[ indices( (<1,2,3>) )]])
 
 // testing @
 test_equal(({1,2,3}),lambda(mixed ... x) { return x; }(@a()))
@@ -1726,6 +1979,8 @@ do_test_copy_value( (< ([]), ({1}) ,"" , 1.0 >) )
 // - crypt
 test_true(stringp(crypt("hej")))
 test_true(crypt("hej",crypt("hej")))
+test_false(crypt("hej","hej"))
+test_false(crypt("h","hej"))
 
 // - ctime
 test_true(stringp(ctime(0)))
@@ -2062,8 +2317,10 @@ test_equal(Array.everynth("0123456789"/"",3),
 test_equal(Array.everynth("0123456789"/"",3,4),
   ({ "4", "7"}))
 
+
+test_equal(Array.transpose( ({ ({ 1,2,3}), ({4,5,6}) }) ),
+	({ ({1,4}), ({2,5}), ({3,6}) }))
 cond([[all_constants()->_verify_internals]],
 [[
   test_do(_verify_internals())
 ]])
-