pike.git
/
src
/
testsuite.in
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/testsuite.in:1:
-
START_MARKER
+
-
// This triggered a bug only if run sufficiently early.
-
test_compile_any([[#pike 7.6]])
-
test_compile_any([[#pike 7.8]])
-
test_compile_any([[#pike 8.0]])
-
test_compile_any([[#pike 8.1]])
-
test_compile_any([[#pike 8.2]])
-
-
ifefun(_verify_internals,
-
[[
-
test_do(_verify_internals())
-
]]);
-
test_eq(1e1,10.0);
-
test_eq(1E1,10.0);
-
test_eq(1e+1,10.0);
-
test_eq(1.1e1,11.0);
-
test_eq(1e-1,0.1);
-
test_eq('\x20',32);
-
test_eq("\x20","\040");
-
test_eq("\d32","\x20");
-
test_eq('Å',"Å"[0]);
-
test_eq('\7777',"\7777"[0]);
-
test_eq('\77777777',"\77777777"[0]);
-
test_eq("\x10000","\x10000");
-
test_eq(0x80000000-0x80000000, 0);
-
test_eq(0xf0000000-0xf0000000, 0);
-
test_eq(0x80000001-0x80000000, 1);
-
test_eq(0x80000000-0x80000001,-1);
-
test_eq(-2147483648*-1, -2147483648/-1);
-
test_eq(0x8000000000000000-0x8000000000000000, 0);
-
test_eq(0xf000000000000000-0xf000000000000000, 0);
-
test_eq(0x8000000000000001-0x8000000000000000, 1);
-
test_eq(0x8000000000000000-0x8000000000000001,-1);
-
test_eq(-9223372036854775808*-1, -9223372036854775808/-1);
-
test_true([[1.0e-40]]);
-
test_eq([[#"foo
-
bar"]],[["foo\nbar"]]);
-
test_eq([[# "foo
-
bar"]],[["foo\nbar"]]);
-
test_eq([[#"foo\
-
bar"]],[["foobar"]]);
-
test_eq([[#(foo
-
bar#) - "\r"]],[["foo\nbar"]]);
-
test_eq([[# (foo
-
bar#) - "\r"]],[["foo\nbar"]]);
-
test_eq([[#(foo\
-
bar#) - "\r"]],[["foo\\\nbar"]]);
-
test_eq([[#[foo
-
bar#] - "\r"]],[["foo\nbar"]]);
-
test_eq([[# [foo
-
bar#] - "\r"]],[["foo\nbar"]]);
-
test_eq([[#[foo\
-
bar#] - "\r"]],[["foo\\\nbar"]]);
-
test_eq([[#{foo
-
bar#} - "\r"]],[["foo\nbar"]]);
-
test_eq([[# {foo
-
bar#} - "\r"]],[["foo\nbar"]]);
-
test_eq([[#{foo\
-
bar#} - "\r"]],[["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_eq([["(" + 0x7fffffff + ")"]], "(2147483647)")
-
test_eq([["(" + -0x80000000 + ")"]], "(-2147483648)")
-
test_eq([["(" + 0x7fffffffffffffff + ")"]], "(9223372036854775807)")
-
test_eq([["(" + -0x8000000000000000 + ")"]], "(-9223372036854775808)")
-
test_eq([["(" + Int.NATIVE_MAX + ")"]], [[sprintf ("(%d)", Int.NATIVE_MAX)]])
-
test_eq([["(" + Int.NATIVE_MIN + ")"]], [[sprintf ("(%d)", Int.NATIVE_MIN)]])
-
test_eq([[Int.NATIVE_MAX]], [[(int) (Int.NATIVE_MAX + "")]])
-
test_eq([[Int.NATIVE_MIN]], [[(int) (Int.NATIVE_MIN + "")]])
-
test_eq([[(string) Int.NATIVE_MAX]], [[Int.NATIVE_MAX + ""]])
-
test_eq([[(string) Int.NATIVE_MIN]], [[Int.NATIVE_MIN + ""]])
-
test_eq([[(string) Int.NATIVE_MAX]], [[sprintf ("%d", Int.NATIVE_MAX)]])
-
test_eq([[(string) Int.NATIVE_MIN]], [[sprintf ("%d", Int.NATIVE_MIN)]])
-
-
test_any_equal([[
-
array res = ({});
-
array ops = ({ `+, `-, `*, `/, `%, `<<, `>>, `&, `|, `^ });
-
array nums_a = ({ 0, 1, -1, 0xffffffff, 0xffffffffffffffff });
-
array nums_b = ({ 0, 1, -1 });
-
-
foreach(ops;; function op)
-
foreach(nums_a;; int a)
-
foreach(nums_b;; int b)
-
{
-
mixed err = catch {
-
res += ({ op(a,b) });
-
};
-
if( err ) res += ({ "E" });
-
}
-
-
return res;
-
-
]],[[ ({
-
-
// +
-
0, 1, -1, 1, 2, 0, -1, 0, -2, 0xffffffff, 0x100000000, 0xfffffffe, 0xffffffffffffffff, 0x10000000000000000, 0xfffffffffffffffe,
-
-
// -
-
0, -1, 1, 1, 0, 2, -1, -2, 0, 0xffffffff, 0xfffffffe, 0x100000000, 0xffffffffffffffff, 0xfffffffffffffffe, 0x10000000000000000,
-
-
// *
-
0, 0, 0, 0, 1, -1, 0, -1, 1, 0, 0xffffffff, -0xffffffff, 0, 0xffffffffffffffff, -0xffffffffffffffff,
-
-
// /
-
"E", 0, 0, "E", 1, -1, "E", -1, 1, "E", 0xffffffff, -0xffffffff, "E", 0xffffffffffffffff, -0xffffffffffffffff,
-
-
// %
-
"E", 0, 0, "E", 0, 0, "E", 0, 0, "E", 0, 0, "E", 0, 0,
-
-
// <<
-
0, 0, "E", 1, 2, "E", -1, -2, "E", 0xffffffff, 0x1fffffffe, "E", 0xffffffffffffffff, 0x1fffffffffffffffe, "E",
-
-
// >>
-
0, 0, "E", 1, 0, "E", -1, -1, "E", 0xffffffff, 0x7fffffff, "E", 0xffffffffffffffff, 0x7fffffffffffffff, "E",
-
-
// &
-
0, 0, 0, 0, 1, 1, 0, 1, -1, 0, 1, 0xffffffff, 0, 1, 0xffffffffffffffff,
-
-
// |
-
0, 1, -1, 1, 1, -1, -1, -1, -1, 0xffffffff, 0xffffffff, -1, 0xffffffffffffffff, 0xffffffffffffffff, -1,
-
-
// ^
-
0, 1, -1, 1, 0, -2, -1, -2, 0, 0xffffffff, 0xfffffffe, -0x100000000, 0xffffffffffffffff, 0xfffffffffffffffe, -0x10000000000000000,
-
}) ]])
-
-
# __func__
-
test_eq(__func__, "a")
-
test_eq("b", __func__)
-
-
test_eq(8, 0b1000);
-
test_eq(-8, -0b1000);
-
test_eq(16, 0b10000);
-
test_eq(-16, -0b10000);
-
-
test_true(1e-100000000000000000000000000000000000000000000000000000000000<=1e-10000)
-
test_true(1e-10000<=1e-1000)
-
test_true(1e-1000<=1e-100)
-
test_true(1e-100<=1e-10)
-
test_true(1e-10<=1e-1)
-
test_true(1e-1<=1e1)
-
test_true(1e1<=1e10)
-
test_true(1e10<=1e100)
-
test_true(1e100<=1e1000)
-
test_true(1e1000<=1e10000)
-
test_true(1e10000<=1e100000000000000000000000000000000000000000000000000000000000)
-
-
test_compile_error('\3434523423423523423423423423')
-
test_compile_error("\3434523423423523423423423423")
-
test_compile_error("\d109827346981234561823743412654")
-
test_compile_error('\d109827346981234561823743412654')
-
test_compile_error("\x109a27bc69e256c83deaa34c26b4")
-
test_compile_error('\x109a27bc69e256c83deaa34c26b4')
-
test_compile_error('\u17fo')
-
test_compile_error("\u17fo")
-
-
test_eq('012456789abcdefghijklmnopqrstuvwxyz'->digits(256),
-
"012456789abcdefghijklmnopqrstuvwxyz")
-
test_eq('\uu117f', 0x5c7531313766)
-
test_eq("\uuuu17fo", "\\uuu17fo")
-
test_eq('\u117f', 0x117f)
-
test_eq("\u117foo", "\10577oo")
-
test_eq("\u1117foo", "\10427foo")
-
test_eq("\uuuu117foo", "\\uuu117foo")
-
test_compile_error('\U117f')
-
test_compile_error("\U117f")
-
test_compile_error("\UdEaDbEaT")
-
test_eq("\UUdEaDbEaT", "\\UdEaDbEaT")
-
test_eq('\UDeaDBeEF', -559038737)
-
test_eq("\UDeaDBeEFFF", "\33653337357FF")
-
test_eq("\UUDeaDBeEFFF", "\\UDeaDBeEFFF")
-
-
test_do([[
-
// bug 2677
-
int x;
-
if (time())
-
x = 1;
-
else
-
foo: break foo;
-
]])
-
-
test_any([[
-
// bug 2690
-
array(function) foo(void|int b)
-
{
-
int add() { return b++; };
-
return ({ add, add });
-
};
-
array(function) bar = foo();
-
return equal(({`==(@bar),@bar()}), ({ 1, 0, 1 }));
-
]], 1)
-
-
test_any([[
-
int f (int i) {i = 0; return i;};
-
return f (1);
-
]],0)
-
-
test_any([[
-
// Test that F_TAIL_RECUR and RECUR work properly.
-
class X
-
{
-
int Ack(int M, int N) {
-
if (M == 0) return( N + 1 );
-
if (N == 0) return( Ack(M - 1, 1) );
-
return( Ack(M - 1, Ack(M, (N - 1))) );
-
}
-
};
-
-
return X()->Ack(3,5);
-
]],253)
-
-
test_any([[
-
// Test that F_COND_RECUR works properly.
-
// This test forces F_COND_RECUR to fail.
-
class X
-
{
-
int Ack(int M, int N) {
-
if (M == 0) return( N + 1 );
-
if (N == 0) return( Ack(M - 1, 1) );
-
return( Ack(M - 1, Ack(M, (N - 1))) );
-
}
-
};
-
-
class Y { inherit X;
-
int Ack(int M, int N) { return ::Ack(M, N); }
-
};
-
-
return Y()->Ack(2,2);
-
]],7)
-
-
test_any([[
-
// Test that F_RECUR et al are not used for inlined functions
-
// where the scope is in use.
-
class X {
-
inline function(int:int) foo(int x, int y)
-
{
-
if (y) return foo(x+y, y-1);
-
return lambda(int z) { return x+z; };
-
}
-
};
-
return X()->foo(10, 3)(5);
-
]], 21)
-
-
test_any([[
-
// Test that loop optimizer isn't too aggressive.
-
// Thanks to Alexander Demenshin <aldem-pike@aldem.net>
-
int x,y,a;
-
for(;x<10000;x++) {
-
y += (x - a++);
-
}
-
return a;
-
]], 10000)
-
-
test_any([[
-
// Test that loop optimizer isn't too aggressive.
-
// Thanks to Alexander Demenshin <aldem-pike@aldem.net>
-
mapping m = ([]);
-
for(;m->x<10000;m->x++) {
-
m->y += (m->x - m->a++);
-
}
-
return m->a;
-
]], 10000)
-
-
test_any([[
-
// Test that loop optimizer isn't too aggressive.
-
// Thanks to me. / Marcus
-
for(int i=0; i<3.0; i++)
-
if(i>4.0)
-
return -1;
-
return 0;
-
]], 0)
-
-
test_any([[
-
// Test that optimizer notes side effects in arguments to `!=
-
// Thanks to Marcus Agehall
-
int j = 20, i;
-
string end = "17";
-
for( ; i < j ; i++)
-
if(sscanf(end, "%d%s", j, end) != 2)
-
cd(".");
-
return i;
-
]], 17)
-
-
test_any([[
-
for(int i; i<10; i++) ;
-
return 1;
-
]], 1)
-
-
test_any([[
-
// Another over-optimization test.
-
string x(string i) { return i; };
-
return x("")+1+1;
-
]], "11")
-
-
test_any([[
-
/* don't save parent */
-
// Check that parent pointers aren't added unnecessarily [bug 2672].
-
class I {};
-
-
class X
-
{
-
// Neither the inherit nor the variable type should add
-
// a parent pointer requirement.
-
inherit I;
-
I i;
-
};
-
-
X x = ((program) X)(); // Error: Parent lost, cannot clone program.
-
return 0;
-
]], 0)
-
-
test_any([[
-
/* don't save parent */
-
// Check that parent pointers aren't added unnecessarily [bug 2672].
-
class I {};
-
-
class X
-
{
-
// The cloning of I makes X need its parent usually,
-
// but note that since we're nested in a function
-
// scope by the testsuite, I will not be overloadable,
-
// and thus we won't need the parent.
-
inherit I;
-
I i = I();
-
};
-
-
X x = ((program) X)(); // Error: Parent lost, cannot clone program.
-
return 0;
-
]], 0)
-
-
test_eval_error([[
-
class Wrapper {
-
// Check that parent pointers aren't added unnecessarily [bug 2672].
-
class I {}
-
-
class X
-
{
-
// The cloning of I makes X need its parent.
-
inherit I;
-
I i = I();
-
}
-
};
-
-
object x = ((program) (Wrapper()->X))(); // Error: Parent lost, cannot clone program.
-
return 0;
-
]], 0)
-
-
test_any([[
-
// Check that parent pointers aren't added unnecessarily [LysLysKOM 18781511].
-
-
class Foo {
-
final constant const_val = 1;
-
class Bar
-
{
-
int func()
-
{
-
// parent-pointer not needed, since const_val is final.
-
return const_val;
-
};
-
}
-
};
-
-
return !Foo.Bar;
-
-
]], 0)
-
-
test_compile_any([[
-
mixed foo()
-
{
-
Stdio.File bar(int x, int y)
-
{
-
return 0;
-
};
-
return bar;
-
}
-
]])
-
-
test_compile_any([[
-
string foo (string a, string b, string c, string d, string e, string f, string g)
-
{
-
string out;
-
if (a)
-
out = "foo";
-
else
-
out = "bar";
-
return out;
-
}
-
]])
-
-
test_compile_any([[
-
mixed foo()
-
{
-
array a;
-
array b = a->f("b")?->b;
-
return b;
-
}
-
]])
-
-
define(test_string_range,[[
-
test_any([[
-
string s = (string) ({ $1, $1 });
-
if (!arrayp(String.range(s))) return "huh?"; // dont optimize this, it forces string range check
-
return search(s, $1);
-
]], 0)
-
]])
-
-
test_string_range(254);
-
test_string_range(255);
-
test_string_range((1<<16)-1);
-
test_string_range((1<<16)+1);
-
test_string_range((1<<29)-1);
-
test_string_range((1<<29)+1);
-
test_string_range((1<<31)-1);
-
test_string_range(-(1<<31));
-
-
dnl number of variables/scope, number of scopes, expect_compiler_error
-
define(test_scopes,[[
-
test_any([[
-
log_status("Testing scoped variables $1:$2%s...",
-
$3?" expecting a compilation error":"");
-
string line = sprintf("#line %d %O\n", __LINE__, __FILE__);
-
string s = "{\n" +
-
(map(indices(allocate($1)), lambda(int no) {
-
no++;
-
return sprintf(" int var_%d;\n"
-
" if (var_%d)\n"
-
" error(\"Variable var_%d not \"\n"
-
" \"initialized to zero: \"\n"
-
" \"%%O\\n\",\n"
-
" var_%d);\n"
-
" var_%d = %d;\n",
-
no, no, no, no, no, no);
-
}) +
-
map(indices(allocate($1)), lambda(int no) {
-
no++;
-
return sprintf(" if (var_%d != %d)\n"
-
" error(\"Variable var_%d was \"\n"
-
" \"clobbered with %%O.\\n\",\n"
-
" var_%d);\n",
-
no, no, no, no);
-
})) * "" +
-
"}\n";
-
program p;
-
if ($3) master()->set_inhibit_compile_errors (1);
-
mixed err = catch {
-
p = compile_string("int a() {\n" + line + (s * $2) +
-
" return 0;\n"
-
"}\n");
-
};
-
if ($3) {
-
master()->set_inhibit_compile_errors (0);
-
if (err) return 0;
-
error("Expected a compilation error for $1 variables in $2 scope%s.\n",
-
($2>1)?"s":"");
-
}
-
if (err) throw(err);
-
return p()->a();
-
]], 0)
-
]])
-
-
test_scopes(255, 1, 0)
-
test_scopes(256, 1, 1)
-
test_scopes(16, 17, 0)
-
test_scopes(17, 16, 0)
-
-
test_any([[
-
// LysLysKOM 14180500
-
if (1) {
-
string var = "Reinitialization error.";
-
}
-
sscanf("", "%d", int zero);
-
return zero;
-
]], 0);
-
-
test_any([[
-
// LysLysKOM 14189033
-
int i;
-
for (i = 0; i < 4; i++) {
-
sscanf("", "%d", int test);
-
if (test) return test;
-
test = i+1;
-
}
-
return 0;
-
]], 0)
-
-
dnl FIXME: Add test that local and local:: in combination
-
dnl with recursion works correctly.
-
-
test_eval_error([[mixed x; return mkmapping(x,x)]]);
-
-
test_eval_error([[class Foo {
-
void bar() {}
-
void foo() {destruct(this);bar();}
-
};
-
Foo()->foo();
-
]])
-
-
test_do([[
-
void foo (int i) {
-
multiset res = (<>);
-
if (i) res = res;
-
};
-
foo (1);
-
]])
-
-
test_any([[
-
array tmp=({});
-
tmp=({([])})+tmp;
-
tmp->foo=7;
-
tmp=({([])})+tmp;
-
return sizeof(tmp[0]);
-
]], 0)
-
-
test_any([[
-
// Bug 4537.
-
void fiddle(array(int) a)
-
{
-
a += ({ 2 });
-
};
-
-
array(int) a = ({ 1 });
-
fiddle(a);
-
return sizeof(a);
-
]], 1)
-
-
test_eval_error([[
-
// [Bug 5911]
-
class X {
-
string s;
-
};
-
X()->s = (mixed) X();
-
]])
-
-
test_any([[
-
// Bug 6062
-
class C { mapping options = ([ 1:1 ]); };
-
C c = C();
-
c->options[3] = 3;
-
c = C();
-
return sizeof(c->options) == 1;
-
]], 1)
-
-
test_any([[
-
// Bug 6063
-
class A { extern string s; string q() { return s; } };
-
class B { inherit A; string s = "s"; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return ({ B(), C(), D() })->q() * "";
-
]], "sss")
-
-
test_any([[
-
// bug 6065
-
class A(string s) {};
-
class B(string s) { inherit A; };
-
return B("foo")->s;
-
]], "foo")
-
-
dnl bug in for loop optimization in combination with +=
-
-
test_any([[
-
array v=({1,2,3});
-
for (int i=0; i<sizeof(v); i++)
-
for (int j=0; j<i; j++)
-
{
-
v+=({1+i});
-
if (i==17) { i=10000; break; }
-
}
-
return sizeof(v); // if buggy, will be 6 and not 140
-
]], 140);
-
-
test_any([[
-
array v=({1,2,3});
-
for (int i=0; i<sizeof(v); i++)
-
for (int j=0; j<i; j++)
-
{
-
v=v+({1+i});
-
if (i==17) { i=10000; break; }
-
}
-
return sizeof(v); // not buggy, will be 140
-
]], 140);
-
-
test_any([[int a=0xffffffff; return a+17]], 0x100000010);
-
test_any([[int a=0xffffffff; return a-17]], 0xffffffee);
-
test_any([[int a=0xffffffff; return a*17]], 0x10ffffffef);
-
test_any([[int a=0xffffffff; return a^17]], 0xffffffee);
-
test_any([[int a=0xffffffff; return a&17]], 17);
-
test_any([[int a=0xffffffff; return a|17]], 0xffffffff);
-
test_any([[int a=0xffffffff; return a<<17]], 0x1fffffffe0000);
-
-
test_any([[ int a=0xffffffff; return a/17 ]],
-
[[ (0xffffffff == -1)?-1:0x0f0f0f0f ]]);
-
test_any([[ int a=0xffffffff; return a%17 ]],
-
[[ (0xffffffff == -1)?16:0 ]]);
-
test_any([[ int a=0xffffffff; return a>>17 ]],
-
[[ (0xffffffff == -1)?-1:0x7fff ]]);
-
-
dnl Check the derived return type of sprintf().
-
test_any([[return sprintf("%O", typeof(sprintf("%1H", "foo"))); ]],
-
"string(8bit)");
-
test_any([[return sprintf("%O", typeof(sprintf("foo"))); ]],
-
"string(102..111)");
-
test_any([[return sprintf("%O", typeof(sprintf("foo%c", 17))); ]],
-
"string(17..17 | 102..111)");
-
test_any([[return sprintf("%O", typeof(sprintf("%2c\n", 'a'))); ]],
-
"string(8bit)");
-
dnl Note the following tests the return type of int2char().
-
test_any([[return sprintf("%O", typeof(sprintf("%c", 1023))); ]],
-
"string(1023..1023)");
-
test_any([[return sprintf("%O", typeof(sprintf("%c\n", 1023))); ]],
-
"string(10..10 | 1023..1023)");
-
dnl The following is due to (string & sprintf_result) == sprintf_result.
-
test_any([[return sprintf("%O", typeof(sprintf("%c\n", Stdio))); ]],
-
sprintf("%O", sprintf_result));
-
test_any([[return sprintf("%O", typeof(sprintf("%4[1]c", 17))); ]],
-
"string(8bit)");
-
test_any([[return sprintf("%O", typeof(sprintf("%[1]n", 17))); ]],
-
"string(zero)");
-
-
test_any([[return sprintf("%O", typeof(aggregate("foo")));]], "array(string(102..111))");
-
test_any([[int a; return sprintf("%O", typeof(aggregate(a)));]], "array(int)");
-
test_any([[int|string a;
-
string s = sprintf("%O", typeof(aggregate(a)));
-
return (< "array(string) | array(int)", "array(string | int)", "array(int | string)" >)[s];]], 1);
-
test_any([[return sprintf("%O", typeof(aggregate()));]], "array(zero)");
-
test_any([[int i; return (< "int", "int | zero", "zero | int" >)
-
[sprintf("%O", typeof(max(i,0)))];]], 1)
-
-
test_any([[array(string) a; return sprintf("%O", typeof(a[0])); ]], "string")
-
-
test_any([[class foo { string a; };
-
object(foo) bar;
-
return sprintf("%O", typeof(bar->a));]], "string");
-
-
test_any([[class foo { string a; };
-
array(object(foo)) bar;
-
return sprintf("%O", typeof(bar[0]->a));]], "string");
-
-
test_any([[function(:string)|function(int:int) f;
-
return sprintf("%O", typeof(f())); ]],
-
"string")
-
-
test_any([[function(:string)|function(int:int) f;
-
return sprintf("%O", typeof(f(1))); ]],
-
"int")
-
-
test_any([[function(:string)|function(mixed, mixed...:int) f;
-
return sprintf("%O", typeof(f())); ]],
-
"string")
-
-
test_any([[function(:string)|function(mixed, mixed ...:int) f;
-
return sprintf("%O", typeof(f(1))); ]],
-
"int")
-
-
test_any([[mapping(object:string)|mapping(string:int) f;
-
return sprintf("%O", typeof(f[class{}()])); ]],
-
"string")
-
-
test_any([[mapping(object:string)|mapping(string:int) f;
-
return sprintf("%O", typeof(f[""])); ]],
-
"int")
-
-
test_any([[mapping(object:string)|mapping(string:int) f;
-
return sort((sprintf("%O", typeof(f[0])) - " ")/"|")*"|"; ]],
-
"int|string")
-
-
test_any([[class Foo { string `[](mixed y) {return "";} };
-
object(Foo) foo;
-
return sprintf("%O", typeof(foo[0])); ]],
-
"string")
-
-
test_any([[class Foo { array(int) _indices() {return ({0});} };
-
object(Foo) foo;
-
return sprintf("%O", typeof(indices(foo))); ]],
-
"array(int)")
-
-
test_any([[class Foo { array(string) _values() {return ({""});} };
-
object(Foo) foo;
-
return sprintf("%O", typeof(values(foo))); ]],
-
"array(string)")
-
-
test_any([[mapping(string:int) foo;
-
array(string) bar;
-
return sprintf("%O", typeof(rows(foo, bar))); ]],
-
"array(int)")
-
-
// basic auto tests.
-
test_any([[
-
class Toplevel {
-
class Foo {
-
auto a = 10;
-
auto b = typeof(a);
-
};
-
string test() {
-
return sprintf("a%Ob%O", typeof(Foo()->a),typeof(Foo()->b));
-
};
-
};
-
return Toplevel()->test();
-
]], "aint(10..10)btype(int(10..10))");
-
-
test_any([[{
-
class Toplevel {
-
class Foo {
-
auto test(){ return 10;return 20;return 30; };
-
};
-
string test() {
-
return sprintf("%O", typeof(Foo()->test));
-
}
-
};
-
return Toplevel()->test()-" ";
-
}]], "function(:int(10..10)|int(20..20)|int(30..30))");
-
-
test_any([[{
-
class Foo
-
{
-
mixed m;
-
};
-
class Bar
-
{
-
inherit Foo;
-
string m;
-
Foo b;
-
mixed f() {
-
return typeof(b->m);
-
}
-
};
-
Foo c;
-
Bar d;
-
return sprintf("%O$%O$%O$%O",
-
Bar()->f(), typeof(c->m), typeof(d->m), typeof(d->b->m));
-
}]], "mixed$mixed$string$mixed")
-
-
// las.c:find_return_type() checks.
-
test_eq([[
-
// Test case from Robert J. Budzynski <Robert.Budzynski@fuw.edu.pl>.
-
// When broken the return type will be mixed.
-
sprintf("%O", typeof(lambda(string s){
-
return Charset.decoder("utf-8")->feed(s)->drain();
-
}))
-
]], [[ "function(string : string)" ]])
-
-
// Test implicit lambda.
-
test_eq([[
-
`()(){ return 1; }
-
]], 1)
-
-
// Argument checking
-
-
// Test new_check_call.
-
test_any([[
-
constant foo = 5;
-
-
// Test that it survives a F_ARG_LIST with CAR == CDR.
-
return foo%foo;
-
]], 0)
-
-
// Test get_all_args.
-
test_eval_error([[
-
// A trick to get some svalues to freed refcounted stuff on the stack.
-
lambda (mixed a, mixed b, mixed c) {} (({time()}), ({time()}), ({time()}));
-
// set_weak_flag is chosen since it calls get_all_args with an
-
// argument spec that contains two arguments of different types.
-
([function] set_weak_flag)();
-
]])
-
test_eval_error([[
-
lambda (mixed a, mixed b, mixed c) {} (({time()}), ({time()}), ({time()}));
-
([function] set_weak_flag) (17);
-
]])
-
test_eval_error([[
-
lambda (mixed a, mixed b, mixed c) {} (({time()}), ({time()}), ({time()}));
-
([function] set_weak_flag) ("foo");
-
]])
-
test_eval_error([[
-
lambda (mixed a, mixed b, mixed c) {} (({time()}), ({time()}), ({time()}));
-
([function] set_weak_flag) (17, "foo");
-
]])
-
-
// Check that write() and error() with one argument are not
-
// incorrectly subjected to sprintf() argument
-
test_compile([[write("%\u2323");]])
-
test_compile([[error("%\u2323");]])
-
-
// type checks
-
-
define(test_type_error, [[
-
test_compile_error([[ $1 x; x=$3; ]])
-
test_compile_error_any([[ class ErrBa { $1 x() { return $3; } } ]])
-
test_compile_error_any([[ class ErrBa { $1 x() { $2 a=$3; return a; } } ]])
-
]])
-
-
test_type_error(int,float,17.23)
-
test_type_error(int,array,({1,2,3}))
-
test_type_error(int,mapping,([1:2,3:4]))
-
test_type_error(int,multiset,(<1,2,3>))
-
test_type_error(int,function,lambda() { return 17; })
-
test_type_error(int,program,this_program)
-
test_type_error(int,object,this)
-
-
test_type_error(float,int,17)
-
test_type_error(float,array,({1,2,3}))
-
test_type_error(float,mapping,([1:2,3:4]))
-
test_type_error(float,multiset,(<1,2,3>))
-
test_type_error(float,function,lambda() { return 17; })
-
test_type_error(float,program,this_program)
-
test_type_error(float,object,this)
-
-
test_type_error(array,int,17)
-
test_type_error(array,float,17.23)
-
test_type_error(array,mapping,([1:2,3:4]))
-
test_type_error(array,multiset,(<1,2,3>))
-
test_type_error(array,function,lambda() { return 17; })
-
test_type_error(array,program,this_program)
-
test_type_error(array,object,this)
-
-
test_type_error(mapping,int,17)
-
test_type_error(mapping,float,17.23)
-
test_type_error(mapping,array,({1,2,3}))
-
test_type_error(mapping,multiset,(<1,2,3>))
-
test_type_error(mapping,function,lambda() { return 17; })
-
test_type_error(mapping,program,this_program)
-
test_type_error(mapping,object,this)
-
-
test_type_error(multiset,int,17)
-
test_type_error(multiset,float,17.23)
-
test_type_error(multiset,array,({1,2,3}))
-
test_type_error(multiset,mapping,([1:2,3:4]))
-
test_type_error(multiset,function,lambda() { return 17; })
-
test_type_error(multiset,program,this_program)
-
test_type_error(multiset,object,this)
-
-
test_type_error(function,int,17)
-
test_type_error(function,float,17.23)
-
test_type_error(function,array,({1,2,3}))
-
test_type_error(function,mapping,([1:2,3:4]))
-
test_type_error(function,multiset,(<1,2,3>))
-
-
test_type_error(program,int,17)
-
test_type_error(program,float,17.23)
-
test_type_error(program,array,({1,2,3}))
-
test_type_error(program,mapping,([1:2,3:4]))
-
test_type_error(program,multiset,(<1,2,3>))
-
-
test_type_error(object,int,17)
-
test_type_error(object,float,17.23)
-
test_type_error(object,array,({1,2,3}))
-
test_type_error(object,mapping,([1:2,3:4]))
-
test_type_error(object,multiset,(<1,2,3>))
-
-
test_any_equal([[
-
// This code caused a NULL dereference in Pike 7.8.306 and earlier.
-
indices foo;
-
return typeof(foo);
-
]], typeof(indices((mixed)0)))
-
-
// Check that complex function types survive soft casting to function.
-
ignore_warning("Soft cast of scope(0,function(*)) to function is a noop.", [[
-
test_eq(typeof([function]`+), typeof(`+))
-
]])
-
-
test_compile_error([[ static_assert(0, "Fail."); ]])
-
test_any([[ static_assert(1, "Ok."); ]], 0)
-
-
test_any([[
-
/* Detect bug in modify_shared_string().
-
*
-
* Note: For proper operation this test depends on HASH_PREFIX being
-
* <= 128, and the initial string in test having a single ref.
-
*/
-
string prefix = "A"*128;
-
string suffix = "B"*128;
-
-
string test = prefix + "C" + suffix;
-
string match = prefix + "D" + suffix;
-
-
if (test == match) return("Early match!");
-
-
test[128] = 'D';
-
-
if (test != match) return("Late mismatch!");
-
]], 0)
-
-
test_compile_error([[ string a="abcb"; a=a/"b"; ]])
-
test_compile_error([[ string a="abcb"; a/="b"; ]])
-
test_compile_error([[ string a="abcb"; string b="b"; a=a/b; ]])
-
test_compile_error([[ string a="abcb"; string b="b"; a/=b; ]])
-
test_compile_error([[ string a="x"; int b; b="x"*17; ]])
-
test_compile_error([[ string a="x"; array b; b="x"*17; ]])
-
test_compile_error([[ int b=17; string a; a=b*42; ]])
-
test_compile_error([[ int b=17; float c=42.0; b=b/c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b/=c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b=b*c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b*=c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b=b+c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b+=c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b=b-c; ]])
-
test_compile_error([[ int b=17; float c=42.0; b-=c; ]])
-
test_compile_error([[ float b=17.0; string a; a=b*42; ]])
-
test_compile_error([[ float b=17.0; string a; a=b*42.0; ]])
-
-
test_compile_error([[class F {inherit master()->dirnode;};]]);
-
-
test_any([[
-
class A {
-
constant i = -1;
-
string f() {
-
return ([1: "foo"])[i] || "bar"; // No warning here. C.f. lyslys 16630665.
-
}
-
};
-
class B {
-
inherit A;
-
constant i = 1;
-
};
-
return B()->f();
-
]], "foo")
-
-
// Warnings
-
-
test_compile_warning([[ [mixed]1 ]])
-
test_compile_warning([[
-
class A { int a = 6; };
-
class B {
-
constant a = 5;
-
inherit A;
-
};
-
]])
-
-
test_compile_warning([[
-
class A {
-
int foo;
-
protected void create(int foo)
-
{
-
// Intentional common typo below.
-
this:foo = foo;
-
}
-
};
-
]])
-
//
-
-
test_any([[
-
class Foo {
-
constant zero = 0;
-
mapping(string:array(int)) m;
-
string foo() { return sprintf("%O", typeof(m[""][zero])); }
-
};
-
return Foo()->foo();
-
]], "int")
-
-
test_compile_any([[
-
class Foo { ; }
-
]])
-
-
test_compile_any([[
-
class Foo { ; ; }
-
]])
-
-
test_compile_any([[
-
class Foo { ; constant c = 0; }
-
]])
-
-
test_compile_any([[
-
class Foo { mixed a() { constant c = 17; return c; }
-
mixed b() { constant c = 17; return c; } }
-
]])
-
-
test_compile_any([[
-
constant FOO = 0;
-
mapping(int:string) foo = ([FOO: "foo"]);
-
]])
-
-
test_compile_error([[
-
function(...:int) foo;
-
]]);
-
-
test_compile_error([[
-
function(,...:int) foo;
-
]]);
-
-
test_compile_error([[
-
function(string,...:int) foo;
-
]]);
-
-
test_compile_any([[
-
// #pragma strict_types
-
void x (void|mapping(string:string) args)
-
{
-
if (args)
-
foreach (indices (args), string a)
-
werror ("%O\n", a);
-
}
-
]])
-
-
// For some reason, the test above doesn't generate the warning (about
-
// the type from indices (args)) if it comes after the one below.
-
// Also, if it is repeated it doesn't generate the warning the second
-
// time. Not very reassuring.. /mast
-
-
test_any([[return class {
-
string bonk() { return "oiff"; }
-
-
class A
-
{
-
string bonk_me() { return bonk(); }
-
}
-
-
class B { inherit A; }
-
-
class C
-
{
-
string oiff() { return "bonk"; }
-
class D { inherit B; }
-
}
-
}()->C()->D()->bonk_me()]],"oiff")
-
-
test_any_equal([[
-
// Test hiding of inherited symbols with protected.
-
class A {
-
local mixed a() {}
-
mixed b();
-
mixed c;
-
local mixed d;
-
extern mixed e;
-
local mixed f;
-
local mixed g() {}
-
mixed h();
-
this_program get_a() { return this_program::this; }
-
};
-
class B {
-
inherit A;
-
protected mixed a() {}
-
protected mixed b() {}
-
protected mixed c = a();
-
protected mixed d = b();
-
protected mixed e = a();
-
protected local mixed f = b();
-
protected mixed g();
-
protected mixed h();
-
this_program get_b() { return this_program::this; }
-
};
-
class C {
-
inherit B;
-
this_program get_c() { return this_program::this; }
-
};
-
class D {
-
inherit C;
-
this_program get_d() { return this_program::this; }
-
};
-
object(D) d = D();
-
return ({ "A", sort(indices(d->get_a())),
-
"B", sort(indices(d->get_b())),
-
"C", sort(indices(d->get_c())),
-
"D", sort(indices(d->get_d())) });
-
]], ({ "A", ({ "a", "b", "c", "d", "e", "f", "g", "get_a", "h" }),
-
"B", ({ "get_a", "get_b" }),
-
"C", ({ "get_a", "get_b", "get_c" }),
-
"D", ({ "get_a", "get_b", "get_c", "get_d" }) }))
-
-
test_any_equal([[
-
// Test hiding of inherited symbols with private.
-
class A {
-
local mixed a() {}
-
mixed b();
-
mixed c;
-
local mixed d;
-
extern mixed e;
-
local mixed f;
-
this_program get_a() { return this_program::this; }
-
};
-
class B {
-
inherit A;
-
private mixed a() {}
-
private mixed b() {}
-
private mixed c = a();
-
private mixed d = b();
-
private mixed e = a();
-
private local mixed f = b();
-
this_program get_b() { return this_program::this; }
-
};
-
class C {
-
inherit B;
-
this_program get_c() { return this_program::this; }
-
};
-
class D {
-
inherit C;
-
this_program get_d() { return this::this; }
-
};
-
object(D) d = D();
-
return ({ "A", sort(indices(d->get_a())),
-
"B", sort(indices(d->get_b())),
-
"C", sort(indices(d->get_c())),
-
"D", sort(indices(d->get_d())) });
-
]], ({ "A", ({ "a", "b", "c", "d", "e", "f", "get_a" }),
-
"B", ({ "get_a", "get_b" }),
-
"C", ({ "get_a", "get_b", "get_c" }),
-
"D", ({ "get_a", "get_b", "get_c", "get_d" }) }))
-
-
test_any([[
-
class O {
-
string foo() { return "O"; };
-
class A { string foo() { return "A"; } };
-
class B { string foo() { return "B"; } };
-
class C {
-
inherit A;
-
inherit B;
-
string foo() {
-
return "C" + ::this_function() * ":" +
-
"C" + A::this_function() +
-
"C" + B::this_function() +
-
"C" + O::this_function() + "C"; }
-
};
-
};
-
return O()->C()->foo();
-
]], "CA:BCACBCOC")
-
-
test_any([[
-
// Test that backtraces with prototypes are rendered correctly by
-
// describe_backtrace() et al. These backtraces have caused both
-
// "Bad offset" and "Identifier reference index out of range".
-
class A { void foo(); };
-
class B { int gazonk; inherit A; void bar() { foo(); } };
-
return sizeof(describe_backtrace(catch { B()->bar(); })) > 0;
-
]], 1)
-
-
test_any([[
-
// Test that backtraces with event handlers are rendered correctly.
-
// These backtraces have caused SEGV's due to function pointers
-
// out of bounds. cf [bug 6156].
-
return sizeof(describe_backtrace(catch {
-
Builtin.__Backtrace_Tester__();
-
})) > 0;
-
]], 1)
-
-
test_any([[
-
// Test that backtraces with event handlers are rendered correctly.
-
// These backtraces have caused SEGV's due to function pointers
-
// out of bounds. cf [bug 6156].
-
return catch { Builtin.__Backtrace_Tester__(); }[1][-1][2];
-
]], Builtin.__Backtrace_Tester__)
-
-
test_compile_warning([[
-
class A { static int foo = 1; int bar() { return foo; } }
-
]])
-
-
test_any([[
-
// Test multiple inherit of same symbol,
-
// where later symbol is protected.
-
class A { constant foo = 1; };
-
class B { constant foo = 2; };
-
class C { inherit A; protected inherit B; };
-
return C()->foo;
-
]], 1)
-
-
test_any([[
-
// Test multiple inherit of same symbol,
-
// where later symbol is protected.
-
class A { constant foo = 1; };
-
class B { protected constant foo = 2; };
-
class C { inherit A; inherit B; };
-
return C()->foo;
-
]], 1)
-
-
test_any_equal([[
-
// Test that extern works as intended.
-
class A { extern mixed foo; };
-
class B { inherit A; mixed foo; object get_a() { return A::this; } };
-
object(B) b = B();
-
b->foo = 17;
-
array res = ({ b->foo, b->get_a()->foo });
-
b->get_a()->foo = 10;
-
return res + ({ b->foo, b->get_a()->foo });
-
]], ({ 17, 17, 10, 10 }))
-
-
test_eval_error([[
-
// Test that extern works as intended.
-
class A { extern mixed foo; };
-
class B { inherit A; mixed bar; };
-
object(B) b = B();
-
b->bar = 17;
-
b->foo = 10;
-
return b->foo;
-
]])
-
-
test_compile_error([[
-
class A { constant q = "x"; }
-
class B { inherit A; string z="z"; constant q="x"+z; }
-
]])
-
-
test_compile_any([[
-
class A
-
{
-
object x(int y)
-
{
-
return B(y);
-
}
-
}
-
-
class B
-
{
-
void create(int y)
-
{
-
}
-
}
-
]])
-
-
// Test that prototypes are equal() to zero.
-
test_any_equal([[
-
class Foo {int foo();};
-
return Foo()->foo;
-
]], 0)
-
test_any_equal([[
-
class Foo {int foo();};
-
return indices(Foo());
-
]], ({"foo"}))
-
test_any_equal([[
-
class Foo {int foo();};
-
return values(Foo());
-
]], ({0}))
-
test_any_equal([[
-
class Foo
-
{
-
int foo();
-
function f()
-
{
-
return foo;
-
}
-
};
-
return Foo()->f();
-
]], 0)
-
test_any([[
-
class Foo
-
{
-
int foo();
-
int(0..1) f()
-
{
-
return functionp(foo);
-
}
-
};
-
class Bar
-
{
-
inherit Foo;
-
int foo() {}
-
};
-
return Bar()->f();
-
]], 1)
-
-
test_do([[
-
class Foo
-
{
-
inherit Stdio.File;
-
-
void create() { }
-
};
-
-
class Bar
-
{
-
int y;
-
-
-
class Gazonk
-
{
-
inherit Foo;
-
-
-
void create(Stdio.File f)
-
{
-
assign(f);
-
}
-
}
-
-
void create()
-
{
-
Gazonk(Stdio.stdin);
-
}
-
};
-
-
Bar();
-
-
]])
-
-
test_any([[
-
object f = class {
-
array recursive(mixed func, array data, mixed ... args)
-
{
-
array ret=({});
-
-
foreach(data, mixed foo)
-
{
-
if(arrayp(foo))
-
{
-
ret+=({ recursive(func, foo, @args) });
-
}else{
-
ret+=({ foo });
-
}
-
}
-
-
return func(ret, @args);
-
};
-
}();
-
-
mixed x = ({ "A", ({}) });
-
x = f->recursive(replace, x, "B", ({}));
-
-
for(int i = 0; i < sizeof(x); i++) {
-
if (!stringp(x[i]) && !arrayp(x[i])) return 0;
-
}
-
return 1;
-
]], 1);
-
-
test_compile_error( [[
-
// This triggs a compiler bug on old Pike 7.3.
-
non_existant(17) {
-
return 0;
-
}
-
]])
-
-
test_compile_error( [[
-
// This triggs a segfault on Pike 7.4.
-
void f()
-
{
-
constant days =
-
([ "1" : "Sunday"
-
"2" : "Monday" ]);
-
}
-
]])
-
-
test_compile_error( [[
-
// This triggs a compiler bug on old Pike 7.5.
-
return lambda(object (([mixed]a)->syntax_error) { return 0; }(0);
-
]])
-
-
test_compile_error( [[
-
// [bug 4362] This triggs a segfault on some versions of Pike 7.7.
-
mixed x = all_constants()[undefined_identifier];
-
]])
-
-
test_compile_warning([[
-
#pragma strict_types
-
// NB: This case used to leak the type function(:string).
-
string x (string s) {return s;};
-
void y (string|int s) {x (s);};
-
]])
-
-
test_compile_any([[
-
#pragma strict_types
-
array(string) x = ({"A", "B"});
-
mixed a() {return map (x, lower_case);}
-
]])
-
-
test_compile_any([[
-
class X {
-
X bar();
-
}
-
class Y {
-
constant X = global::X;
-
X foo();
-
}
-
]])
-
-
test_any( [[
-
// bug [1996] ------------------------------------------------------------
-
// http://community/crunch/show_bug.cgi?id=1996
-
class Implementation
-
{
-
int foo() { return 1; }
-
};
-
class Prototype
-
{
-
int foo();
-
int bar() { return foo(); }
-
};
-
class Test
-
{
-
inherit Implementation;
-
inherit Prototype;
-
int test() { return bar(); }
-
};
-
return Test()->test();
-
]], 1 );
-
-
test_any( [[
-
// bug [721] -------------------------------------------------------------
-
// http://community/crunch/show_bug.cgi?id=721
-
int res=0;
-
catch
-
{
-
add_constant("test_a",compile_string("int foo();","test_a"));
-
add_constant("test_b",compile_string("int foo();","test_b"));
-
add_constant("test_c",compile_string(
-
"inherit test_a;\n"
-
"inherit test_b;\n"
-
"final int foo() { return 1; }\n","test_c"));
-
res=compile_string("inherit test_c;\n","test_d")()->foo();
-
};
-
return res;
-
]],1);
-
test_do(add_constant("test_a"))
-
test_do(add_constant("test_b"))
-
test_do(add_constant("test_c"))
-
-
test_any( [[
-
// bug [1858] ------------------------------------------------------------
-
// http://community/crunch/show_bug.cgi?id=1858
-
string s=#"
-
constant foo=({this});
-
int|string test()
-
{
-
if (!foo[0]) return sprintf(\"foo is %O\\n\",foo)-\"\\n\";
-
if (foo[0]==this) return 1;
-
return sprintf(\"foo is %O\\n\",foo)-\"\\n\";
-
}
-
";
-
class handler { void compile_error(string file, int line, string err) { }};
-
catch {
-
program p=compile_string(s,"test",handler());
-
return p()->test();
-
};
-
return 1; // compile error is ok
-
]],1);
-
-
// -----------------------------------------------------------------------
-
-
-
-
// This test checks for excessive recursion in
-
// destruct_objects_to_destruct, and also that it keeps the destruct
-
// order sane.
-
test_do([[
-
class Top
-
{
-
int count = 0;
-
-
class Foo
-
{
-
int c;
-
object foo;
-
protected void create(object o)
-
{
-
foo = o;
-
c = count++;
-
}
-
-
void destroy()
-
{
-
count--;
-
if (count != c)
-
error ("Destruct out of sequence, "
-
"%d destructed when %d should be.\n", c, count);
-
object x = foo && Foo(0);
-
x = 0;
-
// Cause call to destruct_objects_to_destruct.
-
for (int j = 0; j < 10; j++) write ("");
-
}
-
}
-
-
mixed eat_stack(int|void probe)
-
{
-
// Avoid eating as much C-stack by releasing the
-
// catch at every level.
-
if (probe) return 1;
-
if (catch(eat_stack(1))) return 1;
-
mixed err = 1;
-
if ((err = eat_stack()) != 10)
-
return intp(err) && err > 0 ? err + 1 : err;
-
if (err = catch {
-
-
Foo foo;
-
for(int i=0; i < 10000; i++)
-
foo = Foo(foo);
-
foo = 0;
-
// Cause call to destruct_objects_to_destruct.
-
for (int j = 0; j < 10; j++) write ("");
-
-
}) return err;
-
}
-
-
protected void create()
-
{
-
if (mixed err = eat_stack()) {
-
catch (err[1] = err[1][sizeof (err[1]) - 50..]);
-
throw (err);
-
}
-
}
-
};
-
-
Top();
-
]]);
-
-
// Testing stack popping wrt the various function call opcodes
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
int a()
-
{
-
object key = monitor::lock();
-
return f (1); // F_CALL_LFUN_AND_RETURN
-
};
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
mixed g = f;
-
int a()
-
{
-
object key = monitor::lock();
-
return g (1); // F_CALL_FUNCTION_AND_RETURN
-
}
-
]]);
-
test_program([[
-
Thread.Mutex monitor = Thread.Mutex();
-
int f (int x)
-
{
-
if(monitor->trylock(1))
-
return 0;
-
return x;
-
}
-
int a()
-
{
-
add_constant ("f", f);
-
add_constant ("monitor", monitor);
-
return compile_string(#"
-
int g()
-
{
-
object key = monitor->lock();
-
return f (1); // F_APPLY_AND_RETURN
-
}")()->g();
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int dummy;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
object key = monitor::lock();
-
int res = this->f (1); // F_CALL_OTHER (no `->)
-
dummy = random (res);
-
return res;
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
mixed `-> (string what) {return this[what];}
-
int dummy;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
object key = monitor::lock();
-
int res = this->f (1); // F_CALL_OTHER (with `->)
-
dummy = random (res);
-
return res;
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int res = 0;
-
void f (int x)
-
{
-
if(monitor::trylock(1))
-
res = 0;
-
else
-
res = x;
-
};
-
int a()
-
{
-
object key = monitor::lock();
-
this->f (1); // F_CALL_OTHER_AND_POP (no `->)
-
return res;
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
mixed `-> (string what) {return this[what];}
-
int res = 0;
-
void f (int x)
-
{
-
if(monitor::trylock(1))
-
res = 0;
-
else
-
res = x;
-
};
-
int a()
-
{
-
object key = monitor::lock();
-
this->f (1); // F_CALL_OTHER_AND_POP (with `->)
-
return res;
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
object key = monitor::lock();
-
return this->f (1); // F_CALL_OTHER_AND_RETURN (no `->)
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
mixed `-> (string what) {return this[what];}
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
object key = monitor::lock();
-
return this->f (1); // F_CALL_OTHER_AND_RETURN (with `->)
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (iter == 1) {
-
if (monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
else {
-
object key = monitor::lock();
-
iter = 1;
-
return a (1); // F_COND_RECUR
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
if (monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
else {
-
object key = monitor::lock();
-
iter = 2;
-
return a (1); // F_TAIL_RECUR
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
if (monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
else {
-
object key = monitor::lock();
-
iter = 2;
-
int res = a (1); // F_RECUR
-
iter = -1;
-
return res;
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
if (monitor::trylock(1))
-
iter = 0;
-
iter = x;
-
}
-
else {
-
object key = monitor::lock();
-
iter = 2;
-
a (1); // F_RECUR_AND_POP
-
return iter;
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
int a()
-
{
-
foreach (({1, monitor::lock()}), mixed m)
-
return f (m); // F_CALL_LFUN_AND_RETURN
-
};
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
mixed g = f;
-
int a()
-
{
-
foreach (({1, monitor::lock()}), mixed m)
-
return g (m); // F_CALL_FUNCTION_AND_RETURN
-
}
-
]]);
-
test_program([[
-
Thread.Mutex monitor = Thread.Mutex();
-
int f (int x)
-
{
-
if(monitor->trylock(1))
-
return 0;
-
return x;
-
}
-
int a()
-
{
-
add_constant ("f", f);
-
add_constant ("monitor", monitor);
-
return compile_string(#"
-
int g()
-
{
-
foreach (({1, monitor->lock()}), mixed m)
-
return f (m); // F_APPLY_AND_RETURN
-
}")()->g();
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int dummy;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
int res;
-
foreach (({1, monitor::lock()}), mixed m) {
-
res = this->f (m); // F_CALL_OTHER (no `->)
-
dummy = random (res);
-
return res;
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
mixed `-> (string what) {return this[what];}
-
int dummy;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
int res;
-
foreach (({1, monitor::lock()}), mixed m) {
-
res = this->f (m); // F_CALL_OTHER (with `->)
-
dummy = random (res);
-
return res;
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int res = 0;
-
void f (int x)
-
{
-
if(monitor::trylock(1))
-
res = 0;
-
else
-
res = x;
-
};
-
int a()
-
{
-
foreach (({1, monitor::lock()}), mixed m) {
-
this->f (m); // F_CALL_OTHER_AND_POP (no `->)
-
return res;
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
mixed `-> (string what) {return this[what];}
-
int res = 0;
-
void f (int x)
-
{
-
if(monitor::trylock(1))
-
res = 0;
-
else
-
res = x;
-
};
-
int a()
-
{
-
foreach (({1, monitor::lock()}), mixed m) {
-
this->f (m); // F_CALL_OTHER_AND_POP (with `->)
-
return res;
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
foreach (({1, monitor::lock()}), mixed m)
-
return this->f (m); // F_CALL_OTHER_AND_RETURN (no `->)
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
mixed `-> (string what) {return this[what];}
-
int f (int x)
-
{
-
if(monitor::trylock(1))
-
return 0;
-
return x;
-
};
-
int a()
-
{
-
foreach (({1, monitor::lock()}), mixed m)
-
return this->f (m); // F_CALL_OTHER_AND_RETURN (with `->)
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (iter == 1) {
-
if (monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
else {
-
iter = 1;
-
foreach (({1, monitor::lock()}), mixed m)
-
return a (m); // F_COND_RECUR
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
if (monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
else {
-
iter = 2;
-
foreach (({1, monitor::lock()}), mixed m)
-
return a (m); // F_TAIL_RECUR
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
if (monitor::trylock(1))
-
return 0;
-
return x;
-
}
-
else {
-
iter = 2;
-
int res;
-
foreach (({1, monitor::lock()}), mixed m) {
-
res = a (m); // F_RECUR
-
iter = random (res);
-
return res;
-
}
-
}
-
}
-
]]);
-
test_program([[
-
inherit Thread.Mutex : monitor;
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
if (monitor::trylock(1))
-
iter = 0;
-
iter = x;
-
}
-
else {
-
iter = 2;
-
foreach (({1, monitor::lock()}), mixed m) {
-
a (m); // F_RECUR_AND_POP
-
return iter;
-
}
-
}
-
}
-
]]);
-
test_do(add_constant("f"))
-
test_do(add_constant("monitor"))
-
-
// Testing scoped frames wrt the various function call opcodes
-
test_program([[
-
int f (int x)
-
{
-
return x;
-
}
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
return f (1); // F_CALL_LFUN_AND_RETURN
-
};
-
]]);
-
test_program([[
-
int f (int x)
-
{
-
return x;
-
};
-
mixed g = f;
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
return g (1); // F_CALL_FUNCTION_AND_RETURN
-
}
-
]]);
-
test_program([[
-
int f (int x)
-
{
-
return x;
-
}
-
int a()
-
{
-
add_constant ("f", f);
-
return compile_string(#"
-
int g (void|int x)
-
{
-
function s = lambda () {return x;};
-
return f (1); // F_APPLY_AND_RETURN
-
}")()->g();
-
}
-
]]);
-
test_program([[
-
int dummy;
-
int f (int x)
-
{
-
return x;
-
};
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
int res = this->f (1); // F_CALL_OTHER (no `->)
-
dummy = random (res);
-
return res;
-
}
-
]]);
-
test_program([[
-
mixed `-> (string what) {return this[what];}
-
int dummy;
-
int f (int x)
-
{
-
return x;
-
};
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
int res = this->f (1); // F_CALL_OTHER (with `->)
-
dummy = random (res);
-
return res;
-
}
-
]]);
-
test_program([[
-
int res = 0;
-
void f (int x)
-
{
-
res = x;
-
};
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
this->f (1); // F_CALL_OTHER_AND_POP (no `->)
-
return res;
-
}
-
]]);
-
test_program([[
-
mixed `-> (string what) {return this[what];}
-
int res = 0;
-
void f (int x)
-
{
-
res = x;
-
};
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
this->f (1); // F_CALL_OTHER_AND_POP (with `->)
-
return res;
-
}
-
]]);
-
test_program([[
-
int f (int x)
-
{
-
return x;
-
};
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
return this->f (1); // F_CALL_OTHER_AND_RETURN (no `->)
-
}
-
]]);
-
test_program([[
-
mixed `-> (string what) {return this[what];}
-
int f (int x)
-
{
-
return x;
-
};
-
int a (void|int x)
-
{
-
function s = lambda () {return x;};
-
return this->f (1); // F_CALL_OTHER_AND_RETURN (with `->)
-
}
-
]]);
-
test_program([[
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (iter == 1) {
-
return x;
-
}
-
else {
-
function s = lambda () {return x;};
-
iter = 1;
-
return a (1); // F_COND_RECUR
-
}
-
}
-
]]);
-
test_program([[
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
return x;
-
}
-
else {
-
function s = lambda () {return x;};
-
iter = 2;
-
return a (1); // F_TAIL_RECUR
-
}
-
}
-
]]);
-
test_program([[
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
return x;
-
}
-
else {
-
function s = lambda () {return x;};
-
iter = 2;
-
int res = a (1); // F_RECUR
-
iter = -1;
-
return res;
-
}
-
}
-
]]);
-
test_program([[
-
int iter = 0;
-
int a (void|int x)
-
{
-
if (!iter) {
-
iter = 1;
-
return a (x);
-
}
-
else if (iter == 2) {
-
iter = x;
-
}
-
else {
-
function s = lambda () {return x;};
-
iter = 2;
-
a (1); // F_RECUR_AND_POP
-
return iter;
-
}
-
}
-
]]);
-
test_do(add_constant("f"))
-
-
test_false([[object_variablep(class { int y; int z() { return 1; }}(),"foo")]])
-
test_false([[object_variablep(class { int y; int z() { return 1; }}(),"z")]])
-
test_true([[object_variablep(class { 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_any([[ int a; catch { [a]=({1,2}); return 0; }; return 1]],1)
-
test_compile_error([[ int a,b; catch { [a,b]=({1}); return 0; }; return 1]],1)
-
test_any([[ int a,b; catch { [a,b]=lambda(){ return ({1}); }(); return 0; }; return 1]],1)
-
test_any([[ mapping m=([]); m[m]=m; return stringp(sprintf("%O",m)); ]],1)
-
dnl test_any([[
-
dnl // don't know if this /should/ be valid /Mirar
-
dnl // remove if it shouldn't
-
dnl
-
dnl // I see no reason this should be allowed - Hubbe
-
dnl
-
dnl array a=({});
-
dnl []=a; return 1; ]],1)
-
-
test_any([[
-
int q() { throw(1); };
-
catch {
-
return q();
-
};
-
return 17;
-
]],17)
-
-
test_any([[
-
return class
-
{
-
int q() { throw(1); };
-
int p() {
-
catch {
-
return q();
-
};
-
return 17;
-
}
-
}()->p();
-
]],17)
-
-
test_compile_error([[
-
protected function foo(string ...:object);
-
int bar()
-
{
-
return 17;
-
}
-
]])
-
test_compile_error([[
-
array a;
-
a = path_info[..(sizeof(path_info)-2]*"/";
-
]])
-
test_compile_error([[ default ; ]])
-
test_compile_error([[ 0999; ]])
-
test_compile_error([[ int a,b; [a,b]++; ]])
-
test_compile_error([[
-
array(int) x;
-
-
string foo()
-
{
-
return "foo "+(array(string) x) * ",";
-
}
-
-
int main()
-
{
-
return 0;
-
}
-
]])
-
-
dnl
-
dnl this_program
-
dnl
-
-
test_true(this_program)
-
test_any([[int this_program; return this_program;]], 0)
-
test_any([[class A { int a() { return this_program == A; }}; return A()->a();]], 1)
-
test_program([[
-
class A (int v)
-
{
-
this_program clone() {return this_program (v);}
-
}
-
int a() {return A (4)->clone()->v == 4;}
-
]])
-
test_program([[
-
int i = 17, j = 18;
-
class A (int v)
-
{
-
this_program clone() {return this_program (i);}
-
}
-
int a() {return A (4)->clone()->v == 17;}
-
]])
-
test_program([[
-
class A (int v)
-
{
-
this_program clone() {return this_program (j);}
-
}
-
int i = 17, j = 18;
-
int a() {return A (4)->clone()->v == 18;}
-
]])
-
test_program([[
-
int i = 17, v;
-
this_program clone() {return this_program (i);}
-
void create (int v_) {v = v_;}
-
int a() {return clone()->v == 17;}
-
]])
-
test_program([[
-
this_program clone() {return this_program (i);}
-
int i = 17, v;
-
void create (int v_) {v = v_;}
-
int a() {return clone()->v == 17;}
-
]])
-
test_program([[
-
class A {this_program clone() {return this_program();}}
-
class B {inherit A;}
-
int a() {return object_program (B()->clone()) == B;}
-
]])
-
test_program([[
-
class A {this_program clone() {return this_program();}}
-
class B {inherit A;}
-
int a() {return typeof(B()->clone()) <= B;}
-
]])
-
-
test_program([[
-
class A {
-
class B {
-
mixed f() {
-
return ({global::this_program,
-
A::this_program, // Works, but not really useful.
-
B::this_program, // Ditto.
-
this_program});
-
}
-
}
-
}
-
int a() {
-
return equal (A()->B()->f(), ({object_program (this), A, A.B, A.B}));
-
}
-
]])
-
-
test_compile_error([[
-
mixed x() {
-
return ::x;
-
}
-
]])
-
-
test_program([[
-
class A {
-
class B {
-
constant this_program = "foo";
-
mixed f (int this_program) {
-
return ({A::this_program, B::this_program, this_program});
-
}
-
}
-
}
-
int a() {
-
return equal (A()->B()->f (1), ({A, "foo", 1}));
-
}
-
]])
-
-
test_program([[
-
class I {
-
string this_program = "foo";
-
}
-
class A {
-
class B {
-
inherit I;
-
mixed f (int this_program) {
-
return ({A::this_program, B::this_program, this_program});
-
}
-
}
-
}
-
int a() {
-
return equal (A()->B()->f (1), ({A, "foo", 1}));
-
}
-
]])
-
-
test_program([[
-
string this_program = "foo";
-
class A {
-
class B {
-
mixed f() {
-
return ({A::this_program, B::this_program, this_program});
-
}
-
}
-
}
-
int a() {
-
return equal (A()->B()->f(), ({A, A.B, "foo"}));
-
}
-
]])
-
-
test_compile_error_any([[
-
class A {}
-
class B {
-
inherit A:C;
-
mixed f() {return A::this_program;}
-
}
-
]])
-
-
test_any([[
-
class A {};
-
class B {
-
inherit A:C;
-
mixed f() {return C::this_program;}
-
};
-
return B()->f() == A;
-
]], 1)
-
-
test_any([[
-
class A {
-
class Nested {
-
constant nested = 1;
-
}
-
};
-
class B {
-
inherit A;
-
class Nested {
-
inherit ::this_program;
-
constant other = 2;
-
}
-
};
-
object n = B()->Nested();
-
return n->nested + n->other;
-
]], 3)
-
-
dnl test_compile_error(0())
-
test_compile_error(1())
-
test_compile_error(""())
-
test_compile_error(([])())
-
test_compile_error(([])())
-
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_any([[ class X { int y; class Z { protected void destroy() { y++; } } }; X x=X(); destruct(x->Z()); return x->y;]],1)
-
test_any([[ class X { int y; class Z { protected void create() { y++; } } }; X x=X(); destruct(x->Z()); return x->y;]],1)
-
-
ifefun(_debug,
-
[[
-
test_do(_debug(_debug(0)))
-
]])
-
test_do(indices(_static_modules))
-
test_compile_any([[import Stdio; class x { string y() { read_file("foo"); } }]])
-
-
dnl ----------------------------------------------------------------
-
dnl backtrace/linenumber tests
-
dnl ----------------------------------------------------------------
-
-
test_any([[
-
program p=compile_string(
-
"int foo()\n"
-
"{\n"
-
" error(\"test error\\n\"); // line 3\n"
-
" return 17;\n"
-
"}","test");
-
mixed err=catch { p()->foo(); };
-
if (err[1][-1][1]!=3)
-
{
-
werror("backtrace is:\n"+master()->describe_backtrace(err));
-
}
-
return err[1][-1][1];
-
]],3);
-
-
// Bug 2660
-
test_any([[
-
int foo(mixed a, mixed ... b) {
-
return sizeof(backtrace()[-1]) - (3 + 1 + sizeof(b));
-
};
-
return foo(1,2,3,4)|foo(1);
-
]], 0)
-
-
define(test_backtrace_line_charset, [[
-
test_any([[
-
program p=compile_string(
-
Charset.encoder("]]$1[[")->feed(
-
"#charset ]]$1[[\n"
-
"int foo()\n"
-
"{\n"
-
" error(\"test error\\n\"); // line 3\n"
-
" return 17;\n"
-
"}")->drain(),"test");
-
mixed err=catch { p()->foo(); };
-
if (err[1][0][1]!=3)
-
{
-
werror("backtrace is:\n"+master()->describe_backtrace(err));
-
}
-
return err[1][0][1];
-
]],3);
-
]])
-
dnl test_backtrace_line_charset(utf-7)
-
-
test_program([[
-
class X
-
{
-
protected void create (int i)
-
{
-
if (i)
-
error ("foo\n"); // Line 7
-
}
-
}
-
-
int f()
-
{
-
X (0);
-
X (1); // Line 14
-
}
-
-
int a()
-
{
-
array bt = catch (f())[1];
-
int ok = 0;
-
foreach (reverse (bt), object ent)
-
switch (functionp (ent[2]) && function_name (ent[2])) {
-
case "create": if (ent[1] == 7) ok++; break;
-
case "f": if (ent[1] == 14) ok++; break;
-
}
-
return ok == 2;
-
}
-
]])
-
-
test_program([[// [bug 3060]
-
void x (mixed val)
-
{
-
}
-
-
class X
-
{
-
void create() {error ("foo\n");} // Line 8
-
}
-
-
object rx = class {}();
-
-
int y()
-
{
-
x (rx->x);
-
rx = X(); // Line 16
-
}
-
-
int a()
-
{
-
mixed bt = catch (y())[1];
-
int ok = 0;
-
foreach (reverse (bt), object ent)
-
switch (functionp (ent[2]) && function_name (ent[2])) {
-
case "create": if (ent[1] == 8) ok++; break;
-
case "y": if (ent[1] == 16) ok++; break;
-
}
-
return ok == 2;
-
}
-
]])
-
-
test_any([[
-
// Test a lot of code without a relative pc update in it. There must
-
// not be any labels in it since the pc counting is reset then.
-
int a = 1, b = 1, c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c; c=a+b,a=b,b=c;
-
return __LINE__ == backtrace()[-1][1];
-
]], 1)
-
-
dnl Note: This line number error tend to go away with more debug.
-
test_program([[
-
int x = 0;
-
int y = [int] backtrace()[-1][1];
-
int a() {return y == 3;}
-
]])
-
-
dnl This test used to get the last line of the else block
-
test_any([[
-
int expected_line;
-
void foo(object o)
-
{
-
expected_line = __LINE__ + 1;
-
if (o->a && b) {
-
o->a = o->b;
-
} else if (o->b) {
-
o->b = o->a;
-
}
-
};
-
mixed err = catch { foo(UNDEFINED); };
-
return err[1][-1][1] - expected_line;
-
]], 0)
-
-
dnl ----------------------------------------------------------------
-
dnl scopes and stuff
-
dnl ----------------------------------------------------------------
-
-
test_program([[
-
class A {
-
string f() {return "A";}
-
}
-
class B {
-
string f() {return "B";}
-
}
-
class C {
-
inherit B;
-
}
-
class D {
-
inherit A;
-
inherit C;
-
string g() {return f();}
-
}
-
int a() {
-
return D()->g() == "B";
-
}
-
]])
-
test_program([[
-
class A {
-
string f() {return "A";}
-
}
-
class B {
-
string f() {return "B";}
-
}
-
class C {
-
inherit B;
-
}
-
class D {
-
inherit C;
-
inherit A;
-
string g() {return f();}
-
}
-
int a() {
-
return D()->g() == "A";
-
}
-
]])
-
test_program([[
-
class A {
-
string f() {return "A";}
-
}
-
class B {
-
string f() {return "B";}
-
}
-
class C {
-
inherit B;
-
}
-
class D {
-
string f() {return "D";}
-
inherit A;
-
inherit C;
-
string g() {return f();}
-
}
-
int a() {
-
return D()->g() == "D";
-
}
-
]])
-
-
test_compile_any([[
-
class Bar
-
{
-
int f() {return 17;}
-
-
class Foo {
-
int g() {return f();}
-
}
-
-
inherit Foo;
-
}
-
]])
-
test_compile_any([[
-
class Bar
-
{
-
int f() {return 17;}
-
-
class Foo {
-
int g() {return f();}
-
}
-
}
-
-
class Gnu
-
{
-
inherit Bar;
-
inherit Foo;
-
}
-
-
]])
-
-
dnl Bug 2571
-
test_any([[
-
int var;
-
void x() {var++;};
-
lambda () {x();}();
-
return var;
-
]], 1);
-
-
test_do([[
-
// Save our constants for future use...
-
add_constant("__saved_constants__", ([]) + all_constants());
-
]])
-
-
test_any([[
-
Stdio.write_file("testsuite_test.pmod",
-
#"
-
// this crashes Pike /Mirar 2001-05-19
-
// I haven't been able to minimize it futher,
-
// and it needs to be in a separate module.
-
-
mapping es=0;
-
-
string efoo(string e)
-
{
-
if (!es)
-
{
-
mapping res=([]);
-
-
string l;
-
-
if (sscanf(l,\"%s%s\",string ext,string type)==4 &&
-
ext!=\"\" && ext[0]!=\"#\") // note the type error
-
res[ext]=type;
-
-
es=res;
-
}
-
}
-
");
-
-
// Compilation handler that hides compilation errors.
-
class handler
-
{
-
void compile_error(string file, int line, string err)
-
{
-
// log_msg("file: %O, line: %O, err: %O\n", file, line, err);
-
}
-
};
-
-
// turn this on when the bug is found
-
// master()->set_inhibit_compile_errors(lambda(){});
-
-
//_optimizer_debug(2);
-
//_assembler_debug(20);
-
-
object orig_master = master();
-
replace_master(object_program(orig_master)());
-
catch {
-
compile_string("import \".\";\n"
-
"int foo() { testsuite_test.efoo; }\n",
-
"testsuite_test", handler());
-
};
-
replace_master(orig_master);
-
return 0;
-
]],0);
-
-
test_any([[
-
// infokom:350113
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
mkdir("testsuite_test_dir.pmod");
-
Stdio.write_file("testsuite_test_dir.pmod/module.pmod",
-
#"
-
.A a() {return 0;}
-
");
-
Stdio.write_file("testsuite_test_dir.pmod/A.pike",
-
#"
-
void create (.X x) {.y();}
-
");
-
-
// Compilation handler that hides compilation errors.
-
class handler
-
{
-
void handle_error(array(mixed)|object trace) { }
-
void compile_error(string file, int line, string err) { }
-
void compile_warning(string file, int line, string err) { }
-
};
-
-
object orig_master = master();
-
replace_master(object_program(orig_master)());
-
master()->set_inhibit_compile_errors(handler());
-
mixed err = catch {
-
compile_string("import \".\"; "
-
"int foo() { testsuite_test_dir.a(); }",
-
"test",handler());
-
};
-
master()->set_inhibit_compile_errors(0);
-
replace_master(orig_master);
-
if(err)
-
{
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
return 0;
-
}
-
-
return 1;
-
]],0);
-
-
test_do([[
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
mkdir("testsuite_test_dir.pmod");
-
-
Stdio.write_file("testsuite_test_dir.pmod/module.pmod",
-
#"
-
.A a();
-
class X {}
-
");
-
Stdio.write_file("testsuite_test_dir.pmod/A.pike",
-
#"
-
.X f() {return 0;}
-
");
-
-
object orig_master = master();
-
replace_master(object_program(orig_master)());
-
mixed err = catch {
-
compile_string("import \".\"; "
-
"int foo() { testsuite_test_dir.A(); }",
-
"test");
-
};
-
replace_master(orig_master);
-
if (err) throw (err);
-
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
]]);
-
-
test_do([[
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/module.pmod", #"\
-
.B b();
-
class X {}");
-
Stdio.write_file ("testsuite_test_dir.pmod/A.pike", #"\
-
int f() {return 0;}");
-
Stdio.write_file ("testsuite_test_dir.pmod/B.pike", #"\
-
inherit .A;
-
.X g() {return f() && .X();}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
mixed err = catch {
-
compile_string ("import \".\";\n"
-
"int foo() { testsuite_test_dir.B(); }",
-
"test");
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
]]);
-
-
test_do([[
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/module.pmod", #"\
-
.B.B b();
-
class X {}");
-
Stdio.write_file ("testsuite_test_dir.pmod/A.pike", #"\
-
int f() {return 0;}");
-
Stdio.write_file ("testsuite_test_dir.pmod/B.pmod", #"\
-
class B {
-
inherit .A;
-
.X g() {return f() && .X();}
-
}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
mixed err = catch {
-
compile_string ("import \".\";\n"
-
"int foo() { testsuite_test_dir.B.B(); }",
-
"test");
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
]]);
-
-
test_do([[
-
// Problem: The expression .B.c in module.pmod is resolved during
-
// compilation pass 1 of B.pike, but it's only declared then and
-
// doesn't yet have any value.
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/module.pmod", #"\
-
mixed x = .B.c;
-
class A {}");
-
Stdio.write_file ("testsuite_test_dir.pmod/B.pike", #"\
-
constant c = .A();"); // Should give a "not constant" compile error.
-
-
// Compilation handler that hides compilation errors.
-
class handler
-
{
-
void handle_error(array(mixed)|object trace) { }
-
void compile_error(string file, int line, string err) { }
-
void compile_warning(string file, int line, string err) { }
-
};
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
mixed err = catch {
-
compile_string (#"\
-
mixed foo() {return .testsuite_test_dir.A;}",
-
"test", handler());
-
};
-
replace_master (orig_master);
-
if (!err) error ("Expected compile error.\n");
-
if (!objectp (err) || !err->is_compilation_error) throw (err);
-
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
]]);
-
-
test_any_equal([[
-
// Problem: module.pmod is in pass 1 when it tries to resolve the
-
// .B.c constant and is therefore temporarily interned as a
-
// placeholder object. The (<>) in B.pike is equivalent to
-
// aggregate_multiset, which due to the import is looked up in the
-
// placeholder object and therefore resolved as a nonconstant
-
// placeholder object.
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/module.pmod", #"\
-
mixed x = .B.C;
-
mixed foo() {return x->c;}");
-
Stdio.write_file ("testsuite_test_dir.pmod/B.pike", #"\
-
import \".\";
-
class C {
-
constant c = (<>);
-
}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
mixed res;
-
mixed err = catch {
-
res = compile_string (#"\
-
mixed foo() {return .testsuite_test_dir.foo();}",
-
"test")()->foo();
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
return res;
-
]], (<>));
-
-
test_do([[
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/A.pmod", #"\
-
string pof() {return testsuite_test_dir.A.bingo();}
-
string bingo () {return \"17\";}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
master()->add_module_path (getcwd());
-
mixed err = catch {
-
compile_string (#"\
-
string foo() {
-
return testsuite_test_dir.A.pof();
-
}", "test");
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
]])
-
-
test_do([[
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/module.pmod", #"\
-
.Foo.C x;");
-
Stdio.write_file ("testsuite_test_dir.pmod/Foo.pmod", #"\
-
import \".\";
-
class C
-
{
-
int f (array x)
-
{
-
return lambda() {
-
// 'sizeof' below will be a placeholder object in
-
// pass 1. That shouldn't cause a type error.
-
int i = sizeof (x);
-
return i;
-
}();
-
}
-
}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
mixed err = catch {
-
compile_string (#"\
-
mixed foo() {return .testsuite_test_dir.x;}",
-
"test");
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
Stdio.recursive_rm("testsuite_test_dir.pmod");
-
]]);
-
-
test_do([[
-
Stdio.write_file ("testsuite_test_a.pmod", #"
-
class a {}
-
testsuite_test_b.b2 foo() {return testsuite_test_b.b2 (17);}");
-
-
Stdio.recursive_rm ("testsuite_test_b.pmod");
-
mkdir ("testsuite_test_b.pmod");
-
Stdio.write_file ("testsuite_test_b.pmod/b1.pike", #"
-
protected void create() {}");
-
Stdio.write_file ("testsuite_test_b.pmod/b2.pike", #"
-
inherit testsuite_test_b.b1;
-
constant a = testsuite_test_a.a;
-
protected void create (int i) {}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
master()->add_module_path (getcwd());
-
mixed err = catch {
-
compile_string ("inherit testsuite_test_b.b2;");
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
-
Stdio.recursive_rm ("testsuite_test_a.pmod");
-
Stdio.recursive_rm ("testsuite_test_b.pmod");
-
]])
-
-
cond(0,[[
-
test_do([[
-
// This is a case of cyclic references I think should work, but
-
// afaict it's not possible without changing the resolve methods
-
// thoroughly. /mast
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
mkdir ("testsuite_test_dir.pmod");
-
-
Stdio.write_file ("testsuite_test_dir.pmod/A.pmod", #"\
-
.B.B b() {}
-
class A {}
-
class Ab {int ai() {return 4711;}}
-
class Ad {inherit .B.Bb; int ai() {return bi() + 1;}}");
-
Stdio.write_file ("testsuite_test_dir.pmod/B.pmod", #"\
-
.A.A a() {}
-
class B {}
-
class Bb {int bi() {return 17;}}
-
class Bd {inherit .A.Ab; int bi() {return ai() - 1;}}");
-
-
object orig_master = master();
-
replace_master (object_program (orig_master)());
-
mixed err = catch {
-
compile_string (#"\
-
import \".\";
-
int foo() {
-
testsuite_test_dir.A.Ad();
-
testsuite_test_dir.B.Bd();
-
}", "test");
-
};
-
replace_master (orig_master);
-
if (err) throw (err);
-
-
Stdio.recursive_rm ("testsuite_test_dir.pmod");
-
]]);
-
]]);
-
-
test_do([[
-
// Restore constants that were zapped by the various masters used above.
-
foreach(__saved_constants__; string const_name; mixed val) {
-
add_constant(const_name, val);
-
}
-
add_constant("__saved_constants__");
-
]])
-
-
test_compile_any([[int log() { return 17; } class Greta { int hanna() { return log(); } }]])
-
test_compile_any([[int kajsa(int a,int b) { return 17; } class Jenny { int kajsa() { return 17; } class Greta { int hanna() { return kajsa(); } } }]])
-
test_any([[add_constant("kajsa",lambda(int a,int b) { return 17; }); return compile_string("int kajsa() { return 17; } class Greta { int hanna() { return kajsa(); } }")()->kajsa()]],17)
-
test_do(add_constant("kajsa"))
-
-
test_compile([[Stdio.File foo=Stdio.File();]])
-
test_compile([[ string|multiset(string) foo;
-
array(string) gazonk;
-
array(string) bar = indices(foo)-gazonk;
-
]])
-
test_compile([[class { Stdio.File foo=Stdio.File(); }]])
-
test_compile_any([[void foo(Stdio.FILE f) {}]])
-
test_compile_any([[void foo(array(Stdio.FILE) f) {}]])
-
test_compile_any([[void foo(array(Stdio.FILE) f) {}]])
-
test_compile_any([[Stdio.File foo(array(Stdio.FILE) f) { return f[0]; }]])
-
test_compile_any([[
-
class a {
-
int `== (mixed x) {
-
return 0;
-
}
-
}
-
-
class b {
-
inherit a;
-
class c {
-
int d (string x, string y) {
-
return x==y;
-
}
-
}
-
}
-
]])
-
test_compile([[Stdio.File foo=Stdio.FILE();]])
-
-
dnl variant
-
test_any([[
-
class A {
-
variant string a() { return "A:a()"; }
-
variant string a(string s) { return sprintf("A:a(%q)", s); }
-
};
-
class B {
-
inherit A;
-
variant string a(int i) { return local::a() + ":" + local::a((string)i) + ":" + ::a((string)i); }
-
variant string a(string s) { return sprintf("B:a(%q)", s); }
-
};
-
class C {
-
inherit B;
-
string a() { return "C:a()"; }
-
variant string a(string s) { return ::a(sizeof(s)) + "|" + ::a(s) + "|" + a(); }
-
};
-
return C()->a("foo");
-
]], "A:a():B:a(\"3\"):A:a(\"3\")|B:a(\"foo\")|C:a()")
-
-
test_any([[
-
class A {
-
string a() { return "A"; }
-
variant string a(int i) { return "B"+i+"B"; }
-
};
-
return A()->a() + A()->a(1);
-
]], "AB1B")
-
-
test_any([[
-
class A {
-
string a(int i) { return "B"+i+"B"; }
-
variant string a() { return "A"; }
-
};
-
return A()->a() + A()->a(1);
-
]], "AB1B")
-
-
test_compile_warning([[
-
class A {
-
string a() { return "A"; }
-
variant string a(int|void i) { return "B"+i+"B"; }
-
};
-
return A()->a() + A()->a(1);
-
]])
-
-
dnl test_any([[
-
dnl class A {
-
dnl string a(int|void i) { return "A" + i + "A"; }
-
dnl variant string a(int i) { return "B"+i+"B"; }
-
dnl };
-
dnl return A()->a() + A()->a(1);
-
dnl ]], "A0AB1B")
-
-
test_compile_warning([[
-
class A {
-
string a(int i) { return "A"+i+"A"; }
-
variant string a(int|void i) { return "B"+i+"B"; }
-
};
-
return A()->a() + A()->a(1);
-
]])
-
-
dnl test_any([[
-
dnl class A {
-
dnl string a(int|void i) { return "A" + i + "A"; }
-
dnl variant string a(int i, int|void j) { return "B"+i+"C"+j+"C"+"B"; }
-
dnl };
-
dnl return A()->a() + A()->a(1) + A()->a(2, 3);
-
dnl ]], "A0AB1C0CBB2C3CB")
-
-
test_compile_warning([[
-
class A {
-
string a(int i) { return "A"+i+"A"; }
-
variant string a(int i, int|void j) { return "B"+i+"C"+j+"C"+"B"; }
-
};
-
return A()->a(1) + A()->a(2, 3);
-
]])
-
-
test_any([[
-
class A { string a(){ return "A"; } };
-
class B { int a(){ return 17; } };
-
class C {
-
string c(A a) { return "C" + a->a() + "C"; }
-
variant string c(B b) { return "CB" + b->a() + "BC"; }
-
};
-
A a = A();
-
B b = B();
-
C c = C();
-
return c->c(a) + c->c(b);
-
]], "CACCB17BC")
-
-
test_compile_warning([[
-
// Bug 7812.
-
class A { string a(){ return "A"; } };
-
class B { int a(){ return 17; } };
-
class C {
-
string c(array(A) a) { return "C" + (a->a() * "C") + "C"; }
-
variant string c(array(B) b) { return "CB" + `+(0, @b->a()) + "BC"; }
-
};
-
A a = A();
-
B b = B();
-
C c = C();
-
return c->c(({a,a})) + c->c(({b,b}));
-
]])
-
-
test_any([[
-
// Test the __weak__ modifier.
-
class A {
-
class Q{};
-
__weak__ Q q_w = Q();
-
__weak__ mixed m_w = Q();
-
Q q = Q();
-
mixed m = Q();
-
};
-
A a = A();
-
gc();
-
return !a->q_w && !a->m_w && a->q && a->m && 1;
-
]], 1)
-
-
test_any([[
-
// Test symbol lookup for inherit in multi-pass.
-
// LysLysKOM 16472935
-
// An old pike will attempt to lookup X in the innermost X
-
// during the second pass and thus fail with a compilation error.
-
class X {
-
constant foo = "outer";
-
class X {
-
constant foo = "middle";
-
class X {
-
constant foo = "inner";
-
}
-
}
-
};
-
class Y {
-
inherit X.X;
-
};
-
return Y()->foo;
-
]], "middle")
-
-
test_any([[
-
// Test external symbol lookup in las.c:eval_low_safe_and_stupid().
-
// LysLysKOM 18285732
-
// An old pike will fail with the fatal
-
// "Identifier out of range, loc->parent_identifer=-1!"
-
// during __INIT().
-
-
class A
-
{
-
protected string foo = "bar";
-
};
-
-
string to_compile=#"
-
constant fum = \"gazonk\";
-
-
class B()
-
{
-
inherit A;
-
int fi()
-
{
-
return fum?1:0;
-
}
-
}
-
";
-
-
add_constant("A",A);
-
compile_string(to_compile);
-
add_constant("A");
-
return 0;
-
]], 0)
-
-
test_any([[
-
// Test eval_low() on seemingly constant expressions, that
-
// attempt to access variables in the fake object. [Bug 5273]
-
// An old pike (with RTL debug) will fail with the fatal
-
// "Invalid type 33896 in svalue at 891e510."
-
// during compilation.
-
-
class Test
-
{
-
protected object foo;
-
-
mixed `-> (mixed what)
-
{
-
return foo;
-
}
-
-
int bar ()
-
{
-
return (this->gazonk == "foo") ? 1 : 0;
-
}
-
};
-
-
return Test()->bar;
-
]], 0)
-
-
test_any([[string gurk="bozo"; string b(int x) { return (x?b(x-1)+gurk:""); }; return b(5)]],[["bozo"*5]])
-
-
dnl this should really work...
-
dnl test_compile_any([[void foo(int,string,...);]])
-
-
dnl This test doesn't run out of stack anymore, freaky
-
dnl test_eval_error([[class X { int create() { create(); } }();]])
-
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 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([[ float 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 {}(); ]])
-
-
test_compile_error_any([[
-
mixed foo;
-
mapping query_variables() { return ([]); };
-
mixed foo(mixed bar) { return 1/foo; }
-
]])
-
-
test_compile_error_any([[
-
class A {int wrong = "bogus"; void create() {}}
-
class B {inherit A;}
-
]])
-
-
test_any([[
-
#pragma dynamic_dot
-
// Test dynamic module indexing.
-
object protocols = Protocols;
-
return protocols.HTTP.get_url_data;
-
]], [[ Protocols.HTTP.get_url_data ]])
-
-
test_compile([[float x=(gauge { return; },1.0);]])
-
test_compile_error([[object x = Gmp.mpz(17); constant y = x;]])
-
test_any([[object(Stdio.File) f; f=Stdio.File(); return 1]],1)
-
test_compile([[float t=gauge { string foo; foo; };]])
-
test_compile_any([[class Foo { object(Stdio.FILE) f; void create() { f=Stdio.FILE(); }}]])
-
test_eq([[compile_string("#define A(X) (X)\nint x() { return A \n\t(1); }")()->x()]],1)
-
-
test_any([[class G { mapping t=([]);
-
class tO { void init(string name) { t[name]=this; }}
-
class W { inherit tO; void create() { init("foo"); }}
-
}; object x=G(); x->W(); return objectp(x->t->foo)]],1)
-
-
test_program([[class foo { program x() { return class {}; }}; class bar { inherit foo; program x() { return class {}; }} int a() { return foo()->x != bar()->x(); }]])
-
-
test_any([[
-
class A {
-
constant gurka = 2;
-
int foo = gurka;
-
};
-
class B {
-
protected inherit A;
-
constant gurka = 1;
-
int bar;
-
-
void create() { bar = foo; }
-
};
-
return B()->bar;
-
]], 1)
-
-
test_any([[
-
class A {
-
constant gurka = 2;
-
int foo = gurka;
-
};
-
class B {
-
protected inherit A;
-
constant gurka = 1;
-
int bar;
-
int baz = 3;
-
-
void create() { bar = baz + foo; }
-
};
-
return B()->bar;
-
]], 4)
-
-
test_any([[
-
class A {
-
constant gurka = 1;
-
int foo = gurka;
-
};
-
class B {
-
constant banan = 2;
-
int foo = banan;
-
};
-
class C {
-
protected inherit A;
-
protected inherit B;
-
constant gurka = 3;
-
constant banan = 4;
-
int bar;
-
int baz = 5;
-
-
void create() { bar = baz + A::foo + B::foo; }
-
};
-
return C()->bar;
-
]], 12)
-
-
test_any([[
-
class A { int a = 1; };
-
class B { int b = 2; };
-
class C {
-
inherit A;
-
inherit B;
-
int c = 4;
-
};
-
class D {
-
inherit C;
-
};
-
object d = D();
-
return d->a + d->b + d->c;
-
]], 7)
-
-
test_compile_error_any([[
-
class AScope
-
{
-
int gurka;
-
class A
-
{
-
int func() { return gurka; }
-
}
-
}
-
-
class CScope
-
{
-
string hohum;
-
class C
-
{
-
inherit AScope.A;
-
}
-
}
-
-
]])
-
-
test_program([[
-
class A
-
{
-
constant x = 1.0;
-
}
-
-
class B
-
{
-
inherit A;
-
class C
-
{
-
constant y = x+2.0;
-
}
-
}
-
-
mixed a()
-
{
-
return 3.0 == B()->C()->y;
-
}
-
]])
-
-
test_program_eq([[
-
constant x = X;
-
class X {constant c = "right";}
-
-
constant y = Y;
-
class Y {constant c = "wrong";}
-
-
string a()
-
{
-
return ::`[]("x")->c;
-
}
-
]], "right")
-
-
test_program_eq([[
-
class A {
-
string x = "x";
-
class B {
-
string f() {return x;}
-
}
-
}
-
class C {
-
inherit A;
-
constant D = A::B;
-
}
-
string a() {
-
return C()->D()->f();
-
}
-
]], "x")
-
-
test_program_eq([[
-
class A {
-
string x = "x";
-
class B {
-
string f() {return x;}
-
}
-
}
-
class C {
-
inherit A;
-
string x = "y";
-
constant D = A::B;
-
}
-
string a() {
-
return C()->D()->f();
-
}
-
]], "y")
-
-
test_program_eq([[
-
class A {
-
local string x = "x";
-
class B {
-
string f() {return x;}
-
}
-
}
-
class C {
-
inherit A;
-
string x = "y";
-
constant D = A::B;
-
}
-
string a() {
-
return C()->D()->f();
-
}
-
]], "x")
-
-
test_program_eq([[
-
class A {
-
local string x = "x";
-
class B {
-
void set (string new) {x = new;}
-
string f() {return x;}
-
}
-
}
-
class C {
-
inherit A;
-
string x = "y";
-
constant D = A::B;
-
}
-
string a() {
-
C c = C();
-
C.D d = c->D();
-
d->set ("bar");
-
c->x = "foo";
-
return d->f();
-
}
-
]], "bar")
-
-
-
dnl Come back when we decide that this should be possible
-
dnl test_do([[
-
dnl class A {
-
dnl constant i = 5;
-
dnl };
-
dnl class B {
-
dnl inherit A;
-
dnl int i = 17;
-
dnl };
-
dnl B();
-
dnl ]])
-
-
-
test_any([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return Program.inherits(D,A);
-
]],1)
-
-
test_any([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return Program.inherits(A,D);
-
]],0)
-
-
test_any([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return Program.inherits(A,C);
-
]],0)
-
-
test_any([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return Program.inherits(C,A);
-
]],1)
-
-
test_any_equal([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return Program.inherit_list(D);
-
]],[[ ({ C }) ]] )
-
-
test_any_equal([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit A; inherit B; inherit C; };
-
return Program.inherit_list(D);
-
]],[[ ({ A,B,C }) ]])
-
-
test_any_equal([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return Program.inherit_tree(D);
-
]],[[ ({D, ({C, ({B, ({A})})})}) ]])
-
-
test_any([[
-
class A {};
-
class B { inherit A; };
-
class C { inherit B; };
-
class D { inherit C; };
-
return sizeof( Program.all_inherits(D) - ({A,B,C}) );
-
]],0)
-
-
test_any_equal([[
-
class A {
-
class C {}
-
};
-
class B {
-
class C {}
-
};
-
return ({A <= B, A >= B});
-
]], ({1, 1}))
-
-
test_tests([[
-
-
int errors;
-
int tests;
-
-
int maxdepth;
-
-
class Codec {
-
string nameof(mixed x)
-
{
-
return ([ trace:"efun:trace", write:"efun:write", `+:"efun:`+" ])[x];
-
}
-
-
function functionof(string x)
-
{
-
return ([ "efun:trace":trace, "efun:write":write, "efun:`+":`+ ])[x] ||
-
0;
-
}
-
-
mixed encode_object (object o) {}
-
void decode_object (object o, mixed d) {}
-
}
-
-
void low_generate(int depth,
-
array(string) code,
-
string acc,
-
string ans,
-
int cnt)
-
{
-
mixed tmp;
-
if(--depth<0)
-
{
-
string res="None";
-
tests++;
-
-
if(!(tests & 63))
-
{
-
__signal_watchdog();
-
log_status("Testing vtables and scope access: %d:%d",maxdepth,tests);
-
}
-
-
string test=code*"\n"+"\n"
-
"mixed Q() { return "+acc+"();}\n"
-
"int main() { trace(9); write(\"%O\\n\","+acc+"()); }\n"
-
;
-
-
mixed tmp, x;
-
mixed err=catch {
-
tmp=compile_string(test)();
-
res=tmp->Q();
-
if(res != ans)
-
throw("Test failed");
-
res = "None";
-
tmp = decode_value(encode_value(tmp, Codec()), Codec());
-
res=tmp->Q();
-
if(res != ans)
-
throw("Test failed for encode/decode.");
-
x=Program.inherit_list(object_program(tmp));
-
};
-
if(err)
-
{
-
errors++;
-
log_msg("Test failed:\n"
-
"----------------------------------\n"
-
"%s\n"
-
"---------------------------------\n"
-
"expected answer: %O\n"
-
"Answer received: %O\n",test,ans,res);
-
if(!stringp(err) || !has_prefix(err, "Test failed"))
-
{
-
string tmp=master()->describe_backtrace(err);
-
array s=tmp/"\n";
-
s=s[..20];
-
log_msg("%s\n",s*"\n");
-
}
-
if (res == "None") {
-
// Probable decode error; try to get some debug.
-
catch {
-
log_msg("Encoding...\n");
-
string encoded = ((function)encode_value)(tmp, Codec(), 6);
-
log_msg("Decoding...\n");
-
tmp = ((function)decode_value)(encoded, Codec(), 6);
-
log_msg("Strange... No error thrown...\n");
-
};
-
}
-
return;
-
}
-
}else{
-
low_generate(depth,
-
code+
-
({sprintf("string F%d(){ return %s()+\"F%d\"; }",cnt,acc,cnt)}),
-
sprintf("F%d",cnt),
-
sprintf("%sF%d",ans,cnt),
-
cnt+1);
-
-
for(int e=0;e<sizeof(code);e++)
-
{
-
low_generate(depth,
-
code[..e-1]+({
-
sprintf("class C%d {\n%s\n};",cnt,code[e..]*"\n")
-
}),
-
sprintf("C%d()->%s",cnt,acc),
-
ans,cnt+1);
-
}
-
-
-
if(sscanf(acc,"%s()->%s",string classname,string rest))
-
{
-
low_generate(depth,
-
code+({sprintf("inherit %s;",classname) }),
-
rest,
-
ans,
-
cnt);
-
}
-
}
-
}
-
-
array(int) a()
-
{
-
int total_tests;
-
for(maxdepth=1;maxdepth<9 && !errors;maxdepth++)
-
{
-
low_generate(maxdepth,
-
({ "string X(){return \"X\";}" }),
-
"X",
-
"X",0);
-
-
total_tests+=tests;
-
tests=0;
-
}
-
-
return ({ total_tests-errors, errors });
-
}
-
-
]])
-
-
-
-
-
test_true([[Program.implements( class { int x; string y; void foo(int x) {} },
-
class { void foo(mixed z) {} int x; })]])
-
test_false([[Program.implements( class { int x; string y; void foo(int x) {} },
-
class { void foo(mixed z) {} string x; })]])
-
-
test_eq([[object_program(master())]],[[(program)"/master"]])
-
test_compile([[object("master") m = master();]])
-
test_any([[if(int x=1,y=2) return x;]],1)
-
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_any([[int x = 1; x = x + (x = 0, 1); return x;]], 2);
-
-
-
test_any([[
-
return class { int i=17; }()["i"]
-
]],17)
-
-
test_any([[
-
return class { int i=17; mixed `[](string foo) { return i; }}()[""]
-
]],17)
-
-
test_any([[
-
return class { int i=17; mixed `[](string foo) { return ::`[]("i"); }}()[""]
-
]],17)
-
-
test_any([[
-
return class { int i=17; mixed `[](string foo) { return ::`[]; }}()[""]("i")
-
]],17)
-
-
test_any([[
-
return class { int i=17; mixed `[](string foo) { return ::`[]; }}()[""]("y")
-
]],0)
-
-
test_any([[
-
object o=class {
-
int i=17;
-
mixed `[](string foo) { return ::`[]=; }
-
mixed `[]=(string ind, mixed foo) {}
-
}();
-
-
o[""]("i",99);
-
return o->i;
-
]],99)
-
-
test_any([[
-
object o=class {
-
int foo=7;
-
int bar=11;
-
int i=17;
-
int gazonk=12;
-
mixed `[](string foo) { return ::`[]=; }
-
mixed `[]=(string ind, mixed foo) {}
-
}();
-
-
o[""]("i",99);
-
return o->i;
-
]],99)
-
-
test_any([[
-
class Fonk {
-
int foo=1;
-
int bar=2;
-
int i=17;
-
int gazonk=3;
-
};
-
-
object o=class
-
{
-
inherit Fonk;
-
mixed `[](string foo) { return ::`[]=; }
-
mixed `[]=(string ind, mixed foo) {}
-
}();
-
-
o[""]("i",99);
-
return o->i;
-
]],99)
-
-
test_any([[
-
class Fonk {
-
int foo=1;
-
int bar=2;
-
int i=17;
-
int gazonk=3;
-
};
-
-
object o=class
-
{
-
inherit Fonk : zonk;
-
mixed `[](string foo) { return zonk::`[]=; }
-
mixed `[]=(string ind, mixed foo) {}
-
}();
-
-
o[""]("i",99);
-
return o->i;
-
]],99)
-
-
test_any([[
-
class A {int foo() {return bar();} int bar();};
-
class B {int bar() {return 1;}};
-
class C {inherit A; inherit B; int bar() {return B::bar();}};
-
return C()->foo();
-
]], 1)
-
-
test_compile_any([[
-
class X { void hej() {} }
-
class Y { inherit X:banan; void hopp() { banan::hej(); } }
-
]])
-
-
-
test_compile_any([[
-
class X { protected void hej() {} }
-
class Y { inherit X:banan; void hopp() { ::hej(); } }
-
]])
-
-
test_compile_any([[
-
class X { protected void hej() {} }
-
class Y { inherit X; void hopp() { X::hej(); } }
-
]])
-
-
test_compile_any([[
-
class X { protected void hej() {} }
-
class Y { public inherit X:banan; void hopp() { banan::hej(); } }
-
]])
-
-
test_compile_any([[
-
class X { protected void hej() {} }
-
class Y { inherit X:banan; void hopp() { banan::hej(); } }
-
]])
-
-
// Testing hidden identifier lookup with ::
-
-
test_program([[
-
class X {
-
int i = 17;
-
class Y {
-
constant i = 18;
-
mixed f (int i) {return ({i, Y::i, X::i});}
-
}
-
}
-
int a() {return equal (X()->Y()->f (19), ({19, 18, 17}));}
-
]])
-
-
-
test_compile_error_any([[
-
class X {
-
constant i = 18;
-
mixed f() {return Y::i;}
-
}
-
]])
-
-
test_program([[
-
class A {
-
int i = 17;
-
}
-
class X {
-
inherit A: Y;
-
class Y {
-
constant i = 18;
-
mixed f() {return Y::i;}
-
}
-
}
-
int a() {return X()->Y()->f() == 18;}
-
]])
-
-
ignore_warning("Attempt to override a non local variable s with a non-variable.",[[
-
test_program([[
-
class A {
-
string s = "A";
-
}
-
class B {
-
constant s = "B";
-
}
-
class X {
-
constant s = "X";
-
inherit A;
-
class Y {
-
inherit B: A;
-
constant s = "Y";
-
mixed f() {return X::s + X::A::s + Y::s + Y::A::s + A::s;}
-
}
-
}
-
-
int a() {
-
return X()->Y()->f() == "XAYBB";
-
}
-
]])
-
]])
-
-
test_program([[
-
class A {
-
string s = "A";
-
}
-
inherit A;
-
class X {
-
constant s = "X";
-
mixed f (string s) {return s + X::s + A::s;}
-
}
-
int a() {return X()->f("L") == "LXA";}
-
]])
-
-
test_program([[
-
class A {
-
string f() {return "A";}
-
string g() {return A::f();}
-
}
-
class B {
-
inherit A;
-
string f() {return "B";}
-
}
-
int a() {return B()->g() == "B";}
-
]])
-
-
test_program([[
-
class A {
-
string g() {return A::f();}
-
string f() {return "A";}
-
}
-
class B {
-
inherit A;
-
string f() {return "B";}
-
}
-
int a() {return B()->g() == "B";}
-
]])
-
-
test_program([[
-
class A {
-
string f() {return "A";}
-
string g() {return A::f();}
-
}
-
class B {
-
string f() {return "B";}
-
inherit A;
-
}
-
int a() {return B()->g() == "B";}
-
]])
-
-
test_program([[
-
class A {
-
string f() {return "A";}
-
class I {
-
string g() {return A::f();}
-
}
-
}
-
class B {
-
inherit A;
-
string f() {return "B";}
-
}
-
int a() {return B()->I()->g() == "B";}
-
]])
-
-
// Testing 'global::'
-
-
test_equal([[
-
compile_string (#"
-
string p = \"g\";
-
mixed f (string p) {return ({global::p, p});}")()->f ("l");
-
]], ({"g", "l"}))
-
-
test_compile_error([[
-
string pp = "g";
-
mixed f (string p) {return global::p;}
-
]])
-
-
test_equal([[
-
compile_string (#"
-
int x = 23;
-
class A {
-
constant x = 24;
-
}
-
inherit A;
-
class X {
-
int x = 32;
-
mixed f (int x) {return ({global::x, global::A::x, X::x, x});}
-
}")()->X()->f (33);
-
]], ({23, 24, 32, 33}))
-
-
// Testing 'global.'
-
-
test_compile([[
-
mixed a() {return global.Parser.HTML;}; a;
-
]], 0);
-
-
test_any([[
-
if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
-
return compile_string (#"
-
class Parser {constant HTML = 1;}
-
mixed foo() {return programp (Parser.HTML);}")()->foo();
-
]], 0);
-
-
test_any([[
-
if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
-
return compile_string (#"
-
mixed foo() {return programp (Parser.HTML);}
-
class Parser {constant HTML = 1;}")()->foo();
-
]], 0);
-
-
test_any([[
-
if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
-
return compile_string (#"
-
class Parser {constant HTML = 1;}
-
mixed foo() {return programp (global.Parser.HTML);}")()->foo();
-
]], 1);
-
-
test_any([[
-
if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
-
return compile_string (#"
-
mixed foo() {return programp (global.Parser.HTML);}
-
class Parser {constant HTML = 1;}")()->foo();
-
]], 1);
-
-
// testing virtual overloading
-
test_any([[
-
class fnord
-
{
-
int ber() { return 1; }
-
int goo() { return ber(); }
-
};
-
-
class blorg
-
{
-
inherit fnord;
-
int ber() { return 2; }
-
};
-
return blorg()->goo();
-
]],2)
-
-
// testing 'local'
-
test_any([[
-
class fnord
-
{
-
local int ber() { return 1; }
-
int goo() { return ber(); }
-
};
-
-
class blorg
-
{
-
inherit fnord;
-
int ber() { return 2; }
-
};
-
return blorg()->goo();
-
]],1)
-
-
// testing 'local::'
-
test_any([[
-
class fnord
-
{
-
int ber() { return 1; }
-
int goo() { return local::ber(); }
-
};
-
-
class blorg
-
{
-
inherit fnord;
-
int ber() { return 2; }
-
};
-
return blorg()->goo();
-
]],1)
-
test_any([[
-
class fnord
-
{
-
int ber() { return 1; }
-
int goo() { return local::ber()+ber(); }
-
};
-
-
class blorg
-
{
-
inherit fnord;
-
int ber() { return 2; }
-
};
-
return blorg()->goo();
-
]],3)
-
test_any([[
-
class fnord
-
{
-
int ber() { return 1; }
-
int goo() { return ber()+local::ber(); }
-
};
-
-
class blorg
-
{
-
inherit fnord;
-
int ber() { return 2; }
-
};
-
return blorg()->goo();
-
]],3)
-
-
test_compile_error_any([[class X {int x; int f() {return local::x;}}]])
-
-
// 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)
-
-
test_compile_any([[
-
class top
-
{
-
class the_class
-
{
-
}
-
}
-
-
class inherit_top
-
{
-
inherit top:top;
-
-
constant top_the_class=top::the_class;
-
-
class the_other_class
-
{
-
inherit top_the_class;
-
}
-
}
-
]])
-
-
// Identity of nested programs.
-
test_program([[
-
class A {int i; class X {int j;};}
-
class B {inherit A;}
-
int a() {return A()->X == B()->X;}
-
]])
-
test_program([[
-
class A {int i; class X {int j;};}
-
class B {inherit A;}
-
int a() {return A.X == B.X;}
-
]])
-
test_program([[
-
class A {int i; class X {int j = i;};}
-
class B {inherit A;}
-
int a() {return A()->X != B()->X;}
-
]])
-
test_program([[
-
class A {int i; class X {int j = i;};}
-
class B {inherit A;}
-
int a() {return A.X == B.X;}
-
]])
-
-
// Testing __INIT
-
test_any([[
-
class X { int x = 1; int zz = 1; int zzz=8; int xx=16; };
-
class Y { int y = 2; int xx; };
-
class Z { inherit X; inherit Y; int z = 4; int zz = 0; int zzz; };
-
object zz = Z();
-
return zz->x + zz->y + zz->z + zz->zz + zz->zzz + zz->xx;
-
]], 15)
-
-
test_any([[
-
// Test __INIT with forward references to programs needing their parents.
-
class X {
-
program y = Y;
-
local class Y {
-
program z = y;
-
};
-
};
-
object x = X();
-
return x->y == x->Y;
-
]], 1)
-
-
// Testing getter/setters
-
test_any([[
-
// Trivial case.
-
class X {
-
int `->x() { return 5; }
-
};
-
return X()->x;
-
]], 5)
-
-
test_any([[
-
// Strange behaviour getter & setter.
-
class X {
-
int y = 2;
-
int `->x() { return y*3; }
-
void `->x=(int z) { y += z*5; }
-
};
-
X x = X();
-
x->x = 2;
-
return x->x;
-
]], 36)
-
-
test_any([[
-
// Multiple inheritance.
-
class X {
-
int y = 0;
-
int `->x() { return y; }
-
void `->x=(int z) { y = z; }
-
};
-
class Y {
-
inherit X:x1;
-
inherit X:x2;
-
int `->x1() { return x1::x; }
-
void `->x1=(int z) { x1::x = z; }
-
int `->x2() { return x2::x; }
-
void `->x2=(int z) { x2::x = z; }
-
};
-
Y y = Y();
-
y->x1 = 1;
-
y->x2 = 2;
-
return (y->x1 + y->x2) * y->x;
-
]], 6)
-
-
test_any([[
-
// Triggered fatal error "Getter/setter variable outside program!".
-
class X {
-
protected int xx;
-
int `->x() { return xx; }
-
void `->x=(int xxx) { xx = xxx; }
-
protected void create(int xxx) {
-
x = xxx;
-
}
-
};
-
class Y {
-
inherit X;
-
protected void create(int yyy) {
-
X::x = yyy + 2;
-
}
-
};
-
return Y(5)->x;
-
]], 7)
-
-
test_any([[
-
// Since the addition of F_APPEND_MAPPING in set_bar below
-
// the setter is not being called anymore. Instead, the mapping
-
// _data->foo is modified in place.
-
class A(mapping _data) {
-
mapping _modified = ([]);
-
-
mixed `foo=(mixed v) {
-
return _modified["foo"] = v;
-
}
-
-
mixed `foo() {
-
return _data["foo"];
-
}
-
-
void set_bar(int v) {
-
this->foo += ([ "bar" : v ]);
-
}
-
};
-
-
object a = A(([ "foo" : ([]) ]));
-
-
a->set_bar(2);
-
-
return has_index(a->_modified, "foo");
-
]], 1)
-
-
test_any([[
-
// Since the addition of F_APPEND_MAPPING in set_bar below
-
// the setter is not being called anymore. Instead, the mapping
-
// _data->foo is modified in place.
-
class A(mapping foo) {
-
mapping _modified = ([]);
-
-
mixed `->=(string sym, mixed v) {
-
return _modified[sym] = v;
-
}
-
-
void set_bar(int v) {
-
this->foo += ([ "bar" : v ]);
-
}
-
};
-
-
object a = A(([ "foo" : ([]) ]));
-
-
a->set_bar(2);
-
-
return has_index(a->_modified, "foo");
-
]], 1)
-
-
test_any([[
-
// Since the addition of F_APPEND_ARRAY the setter is not being
-
// called anymore. Instead, the array _data is modified in place.
-
class A(array _data) {
-
int counter;
-
-
void `foo=(mixed v) {
-
counter += !!v;
-
_data = v;
-
}
-
-
mixed `foo() {
-
return _data;
-
}
-
};
-
-
object a = A(({}));
-
-
for (int i = 0; i < 6; i++) {
-
a->foo += ({ i });
-
}
-
-
return a->counter;
-
]], 6)
-
-
test_any([[
-
// Since the addition of F_APPEND_ARRAY the setter is not being
-
// called anymore. Instead, the array _data is modified in place.
-
class A(array foo) {
-
int counter;
-
-
void `->=(string sym, mixed v) {
-
counter += !!v;
-
::`->=(sym, v);
-
}
-
};
-
-
object a = A(({}));
-
-
for (int i = 0; i < 6; i++) {
-
a->foo += ({ i });
-
}
-
-
return a->counter;
-
]], 6)
-
-
test_any([[
-
// Triggered fatal since object_equal_p did not handle
-
// getter/setter identifier correctly
-
class A {
-
string `foo() { return "bar"; }
-
};
-
-
return equal(A(), A());
-
]], 1)
-
-
test_eval_error([[
-
// Triggered infinite recursion and core dump.
-
// cf LysLysKOM 18719518/Pike mailinglist 12047.
-
object o = class{}();
-
o->foo += "";
-
]])
-
-
test_compile_error([[
-
class X {
-
int x;
-
int `->x() { return 0; }
-
};
-
]])
-
-
test_compile_error([[
-
class X {
-
int `->x() { return 0; }
-
int x;
-
};
-
]])
-
-
test_compile_error([[
-
class X {
-
int x;
-
void `->x=(int z) { }
-
};
-
]])
-
-
test_compile_error([[
-
class X {
-
void `->x=(int z) { }
-
int x;
-
};
-
]])
-
-
test_compile_error([[
-
class X {
-
void `->x(int z) { }
-
};
-
]])
-
-
// Disabled for now.
-
cond([[ 0 ]], [[
-
test_compile_error([[
-
class X {
-
int `->x=() { }
-
};
-
]])
-
]])
-
-
test_compile_warning([[
-
class X {
-
protected int `->x() { return 0; }
-
private void `->x=(int x) { }
-
};
-
]])
-
-
test_compile_warning([[
-
class X {
-
protected int `->x() { return 0; }
-
void `->x=(int x) { }
-
};
-
]])
-
-
test_do([[
-
// bug 3006
-
class X {
-
constant foo = Foo;
-
class Foo {}
-
void bar()
-
{
-
foo f = Foo();
-
}
-
};
-
]])
-
-
test_program([[
-
// Another variant of [bug 3006].
-
class X {
-
constant foo = Foo;
-
class Foo {}
-
}
-
int a() {return programp (X.foo);}
-
]])
-
-
cond(0,[[
-
test_program([[
-
// This shows a case when on-demand resolving is required.
-
class X {
-
constant foo = a + 1;
-
constant a = b + 1;
-
constant b = c + 1;
-
constant c = d + 1;
-
constant d = 1;
-
};
-
int a() {return X.foo == 5;}
-
]])
-
test_program([[
-
// Reference case for the test above.
-
class X {
-
constant d = 1;
-
constant c = d + 1;
-
constant b = c + 1;
-
constant a = b + 1;
-
constant foo = a + 1;
-
};
-
int a() {return X.foo == 5;}
-
]])
-
]])
-
-
test_any([[
-
class X {
-
protected string f() { return "p"; }
-
protected class gazonk { void create() { f(); }};
-
protected class g { object e() { return gazonk(); }};
-
void create() { g()->e(); }}; return objectp(X()); ]],1)
-
test_any([[class A { int x=1; }; class B { protected inherit A; int foo() { return A::x; }}; return A()->x && !B()->x && B()->foo()==A()->x;]],1)
-
test_any([[class C { int q() { return p(); } int p() { return 17; }}; return C()->q();]],17)
-
test_any([[class C1 {
-
class D { string id() { return "foo"; } };
-
class Y { program YinD() { return D; }} };
-
class C2 { inherit C1; class D { string id() { return "bar"; } } };
-
return C2()->Y()->YinD()()->id()]],"bar")
-
test_any([[object o=class {int c;class bar{void create(){c++;};}}(); o->bar(); return o->c;]],1)
-
test_do([[add_constant("GURKA2",class { int c; class bar{void create() {c+=17;}}}()); ]])
-
test_any([[class { inherit GURKA2.bar; }(); return GURKA2->c;]],17)
-
test_any([[class { inherit GURKA2.bar; }(); return GURKA2->c;]],34)
-
-
test_do([[add_constant("GURKA2",class { int c; class bar{void create() { class { void create() {c+=17;}}(); }}}()); ]])
-
test_any([[class { inherit GURKA2.bar; }(); return GURKA2->c;]],17)
-
test_any([[class { inherit GURKA2.bar; }(); return GURKA2->c;]],34)
-
test_do([[add_constant("GURKA2");]]);
-
-
test_eq(class { protected int foo=17; }()->foo,0)
-
test_eval_error(class c { protected int foo=17; }()->foo=18;)
-
test_equal( [[ ({ (["foo":"bar"]), (<"foo">), ([]) })->foo ]], [[ ({"bar",1,0}) ]])
-
test_any([[mixed a=({([]),0}); a[1]=a; return a->foo[0];]],0)
-
test_eval_error([[return column(({0}),"foo");]])
-
-
test_equal([[ ((mixed)({ }))->foo ]], ({ }))
-
test_compile_error([[ ({})->foo; ]])
-
test_equal([[ `->(({ }), "foo") ]], ({ }))
-
test_equal([[ ((mixed)({ }))["foo"] ]], ({ }))
-
test_compile_error([[ ({})["foo"]; ]])
-
-
test_any([[
-
class A { constant a=0; int foo() { return a; } };
-
class B { inherit A; constant a=1; };
-
return B()->foo(); ]], 1)
-
-
test_any([[
-
class p1 { int foo() { return 1; }};
-
class p2 { int foo() { return 3; }};
-
class c1 { inherit p1; inherit p2; int foo() { return p1::foo()+p2::foo(); }};
-
class c2 { inherit c1; }; return c2()->foo();]],4)
-
-
test_any([[
-
class p1 { int foo() { return 1; } };
-
class p2 { int foo() { return 2; } };
-
class c1 { inherit p1; inherit p2; };
-
return c1()->foo();]],2)
-
-
test_any([[
-
mixed ret=({});
-
int a, b = 3;
-
for (a = 0; a < b; a++) {
-
ret+=({a,b});
-
if (a % 2) b += 1;
-
}
-
return equal(ret,({0,3,1,3,2,4,3,4,4,5}));
-
]],1)
-
-
test_any([[
-
mixed ret=({});
-
int a, b = 3;
-
for (a = 0; a < b; a++) {
-
ret+=({a,b});
-
if (a % 2) b ++;
-
}
-
return equal(ret,({0,3,1,3,2,4,3,4,4,5}));
-
]],1)
-
-
test_any([[
-
mixed ret=({});
-
int a, b = 3;
-
for (a = 0; a < b; a++) {
-
ret+=({a,b});
-
if (a % 2) b=b+1;
-
}
-
return equal(ret,({0,3,1,3,2,4,3,4,4,5}));
-
]],1)
-
-
test_any([[
-
mixed ret=({});
-
int a, b = 3;
-
for (a = 0; a < b; a++) {
-
ret+=({a,b});
-
if (a % 2) b-=-1;
-
}
-
return equal(ret,({0,3,1,3,2,4,3,4,4,5}));
-
]],1)
-
-
-
test_compile_error([[void foo() { 1++; }]])
-
dnl test_compile_error([[void foo() { return destruct(this); }]])
-
test_any([[class foo { constant x=17; }; class bar { inherit foo; constant x=18; }; return bar()->x;]],18)
-
test_program([[inline string foo(string s){ while(s[0] == ' ' || s[0] == '\t') s = s[1..]; return(s); } string a() { return foo(" bar"); }]])
-
-
-
// lambda function tests
-
-
test_true([[lambda(int x) { return lambda() { return x; };}]])
-
test_eq([[lambda(int x) { return lambda() { return x; };}(4)()]],4)
-
test_eq([[lambda(int x) { return lambda() { return x; };}(17)()]],17)
-
test_eq([[lambda(int x) { return lambda() { return lambda() { return x; };};}(17)()()]],17)
-
-
// trampoline tests
-
test_do([[{
-
function trampoline =
-
lambda() {
-
int i = 17;
-
return lambda () {
-
error ("Trampoline called.\n");
-
return i;
-
};
-
}();
-
-
// Now find the trampoline object. Pike tries very hard to hide
-
// it, so we have to do it the hard way..
-
object obj;
-
find_trampoline_object: {
-
for (obj = Debug.next_object();
-
objectp (obj) || // It's a normal object.
-
(intp (obj) && obj); // It's a bignum object.
-
obj = Debug.next_object (obj))
-
if (obj->`() == trampoline) break find_trampoline_object;
-
error ("Trampoline object not found.\n");
-
}
-
-
if (!obj) error ("Trampoline object false.\n");
-
if (!stringp (sprintf ("%O", obj)))
-
// The important part is to try to call the _sprintf lfun in the
-
// trampoline object, not to check what sprintf() returns.
-
error ("Failed to describe trampoline object.\n");
-
}]])
-
-
// local function tests
-
test_eq(120,
-
[[ lambda()
-
{
-
int f(int i) { return i == 0 ? 1 : i*f(i-1); };
-
return f(5);
-
}(); ]])
-
-
test_eq([[function f;
-
for(int i = 0; i < 2; i++)
-
{ {int _i = i; f = lambda(int j) { return _i+j; }; } }
-
return f(17);]],
-
[[function f;
-
for(int i = 0; i < 2; i++)
-
{ {int _i = i; f = lambda(int j) { return _i+j; }; } int FEL; FEL; }
-
return f(17);]]);
-
-
test_any([[
-
int x,y,z;
-
function p;
-
void foo() { y+=7; };
-
void bar()
-
{
-
foo();
-
void gazonk()
-
{
-
foo();
-
void quux()
-
{
-
foo();
-
y+=4711;
-
};
-
p=quux;
-
};
-
-
gazonk();
-
gazonk();
-
};
-
foo();
-
bar();
-
p();
-
return y; x; z;
-
]], 7 * 5 + 4711 )
-
-
test_any([[
-
int x=1;
-
void for10(function f) { for(int e=0;e<10;e++) f(); };
-
for10(lambda() { x++; });
-
return x;
-
]], 11)
-
-
// implicit lambda tests
-
test_any([[
-
int x=1;
-
void for10(function f) { for(int e=0;e<10;e++) f(); };
-
for10() { x++; };
-
return x;
-
]], 11)
-
-
test_compile_error([[
-
int x=1;
-
void for10(function f) { for(int e=0;e<10;e++) f(); };
-
for10() { x++; }
-
return x;
-
]])
-
-
test_any([[
-
int x;
-
for(int i=5; i < 10; i++) x++;
-
return x;
-
]], 5)
-
-
test_true([[lambda(function f) {return 1;}(this_program);]])
-
test_any([[
-
function my_lambda;
-
-
{
-
string foo = "foo", bar = "bar";
-
my_lambda = lambda() { return foo; };
-
}
-
-
int really_magic_var;
-
return my_lambda(); really_magic_var;
-
]],"foo")
-
-
test_eq([[class { int `()(){ return 4711; } }()(); ]],4711)
-
teste_eval_error(mixed foo=({}); sort(@foo); )
-
test_compile_error([[int foo() { return 1} ; constant foo=(["foo":foo]); return foo->foo();]])
-
test_compile_error([[class T{void p(object e,object f){lambda::create(f);}}]])
-
test_eval_error(array foo=({}); return mkmapping(foo,({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; } } }]])
-
-
test_true(encode_value(0)[0]=='\266')
-
define(test_encode, [[ test_equal($1, decode_value(encode_value($1)))
-
test_equal($1, decode_value(encode_value_canonic($1))) ]])
-
test_eq(replace("foobar","","X"),"fXoXoXbXaXr")
-
test_encode(0)
-
test_encode("")
-
test_encode(0.0)
-
test_encode(1.0)
-
test_encode(-1.0)
-
test_encode(12.0)
-
test_encode(100000.0)
-
test_encode(3.1875)
-
test_encode(0.0000019073486328125)
-
test_encode(({}))
-
// This should work both with and without bignums.
-
test_encode(({0xffffffff+1, 0xffffffff+2}))
-
test_encode(([]))
-
test_encode("foobar")
-
test_encode((<>))
-
test_encode("\7")
-
test_encode("\77")
-
test_encode("\777")
-
test_encode("\7777")
-
test_encode("\77777")
-
test_encode("\777777")
-
test_encode("\7777777")
-
test_encode("\77777777")
-
test_encode(({"en","sv","de"}))
-
test_encode((<"en","sv","de">))
-
test_encode((["en":1,"sv":2,"de":3]))
-
test_encode(({"s",1,0,-3.40625}))
-
test_encode((<"s",1,0,-3.40625>))
-
test_encode((["s":1,1:2,0:3,-3.40625:4]))
-
test_encode((<1, 2, 2, 3, 3, 3>))
-
test_eq(decode_value("\210\201"),1)
-
test_eq(decode_value("\210\011\001"),-1)
-
test_eq(decode_value("\206\200"),""))
-
test_equal(decode_value("\200\200"),({}))
-
test_equal(decode_value("\206\206\146\157\157\142\141\162"),"foobar")
-
test_any([[mixed a=({0}); a[0]=a; return equal(a, decode_value(encode_value(a)));]], 1)
-
test_any([[ int e; for(e=0;e<100000;e+=1+(e>>4)) if(decode_value(encode_value(e))!=e) return e; return -1;]], -1)
-
test_any([[ int e; for(e=0;e<100000;e+=1+(e>>4)) if(decode_value(encode_value(-e))!=-e) return e; return -1;]], -1)
-
-
test_eval_error([[return decode_value("\266ke0\241\346abc\b&\346de~\200\335\1\362PO\35\242")]])
-
test_eval_error([[return decode_value("\266ke0\241\346abcpf\221\337v\37\224")]])
-
test_eval_error([[return decode_value("\266ke0\241\346abc\b&\346def`\266\212\340\337\b\252\b")]])
-
test_eval_error([[return decode_value("\266ke0\241\346abc\b&\346def`\266\264\22\330\207")]])
-
test_eval_error([[return decode_value("\266ke0\241\262\266\216\213{@\333|")]])
-
test_eval_error([[return decode_value("\266ke0\241\346a\211[\266SN\313\331")]])
-
test_eval_error([[return decode_value("\266ke0\241\346ab-\266""6\227}u\320\274\251\211")]])
-
test_eval_error([[return decode_value("\266ke0\241\346abc\b&\346de\276\266\364\30\251s\233UF\362")]])
-
test_eval_error([[return decode_value("\266ke0\241\346abcv\22C\246\264\264L" )]])
-
test_eval_error([[return decode_value("\266ke0\241\260\303\rl")]])
-
-
test_equal(encode_value_canonic ((["en":1,"sv":2,"de":3])),
-
encode_value_canonic ((["en":1,"de":3,"sv":2])))
-
test_equal(encode_value_canonic ((["en":1,"sv":2,"de":3])),
-
encode_value_canonic ((["de":3,"sv":2,"en":1])))
-
test_equal(encode_value_canonic ((["en":1,"sv":2,"de":3])),
-
encode_value_canonic ((["sv":2,"en":1,"de":3])))
-
test_equal(encode_value_canonic ((<"en","sv","de">)),
-
encode_value_canonic ((<"en","de","sv">)))
-
test_equal(encode_value_canonic ((<"en","sv","de">)),
-
encode_value_canonic ((<"de","sv","en">)))
-
test_equal(encode_value_canonic ((<"en","sv","de">)),
-
encode_value_canonic ((<"sv","en","de">)))
-
-
-
test_any([[
-
// bug 3013
-
class Test
-
{
-
class Resolver (array c)
-
{
-
mixed resolv (string id)
-
{
-
if (id == "c") return c;
-
}
-
}
-
-
class Codec
-
{
-
mixed fooof (string name) {return all_constants()[name];}
-
function objectof = fooof;
-
function functionof = fooof;
-
function programof = fooof;
-
-
string nameof (mixed what)
-
{
-
if (string name = search (all_constants(), what)) return name;
-
return ([])[0];
-
}
-
-
mixed encode_object (object o) {}
-
void decode_object (object o, mixed d) {}
-
}
-
-
mixed main()
-
{
-
array c = ({"subres"});
-
object o = compile (
-
#"string res() {return `+(@((array(function(:string)))c)());}
-
string subres() {return \"foo\";}",
-
Resolver (c))();
-
for (int i = 0; i < sizeof (c); i++)
-
if (stringp (c[i])) c[i] = o[c[i] ];
-
#ifdef DEBUG
-
#define D ,1
-
#else
-
#define D
-
#endif
-
function e=encode_value;
-
function d=decode_value;
-
return d (e (o, Codec() D), Codec() D)->res();
-
}
-
};
-
return Test()->main();
-
]],"foo")
-
-
test_any([[
-
// bug 3014
-
class Test
-
{
-
class Codec
-
{
-
mixed nameof (mixed what)
-
{
-
return ([])[0];
-
}
-
mixed encode_object (object o) {}
-
void decode_object (object o, mixed d) {}
-
}
-
-
int main()
-
{
-
object o = compile_string (#"
-
constant x = ({0});
-
int f() {return 17;}
-
int g() {return ((array(function(:int)))x)[0]();}
-
")();
-
o->x[0] = o->f;
-
function e=encode_value;
-
function d=decode_value;
-
o = d (e (o, Codec()), Codec());
-
return function_object (o->x[0]) == o;
-
}
-
};
-
return Test()->main();
-
]],1);
-
-
-
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([[mapping m=([0:2]); m[0]++; return m[0]++;]], 3);
-
test_any([[mapping m=([0:2]); ++m[0]; return ++m[0];]], 4);
-
test_any([[mapping m=([0:2]); m[0]--; return m[0]--;]], 1);
-
test_any([[mapping m=([0:2]); --m[0]; return --m[0];]], 0);
-
-
test_any_equal([[
-
// Test that the type fields are cleared when the mapping is cleared.
-
mapping m = (["a":"a"]);
-
m_delete(m, "a");
-
return m;
-
]], ([]))
-
-
test_compile_error(int foo() { LJjjjjJJJ ; })
-
test_true(class { constant i=1; }()->i)
-
test_true(class { constant i=0; mixed `->(string s) { if(s=="i") return 1; }}()->i)
-
test_true(class { constant i=1; mixed `->(string s) { return 0; }}()["i"])
-
test_true(class { constant i=0; mixed `[](string s) { if(s=="i") return 1; }}()["i"])
-
test_true(class { optional constant i=0; mixed `[](string s) { if(s=="i") return 1; }}()["i"])
-
test_true(class { mixed `[]=(mixed a, mixed b) { if(a!=b) throw(1); }}()[1]=1)
-
test_true(class { mixed `->=(mixed a, mixed b) { if(a!=b) throw(1); }}()->i="i")
-
-
test_do([[
-
#pragma strict_types
-
class A { int a; optional int x; };
-
class B { int a; };
-
A a = B();
-
return a;
-
]])
-
-
test_compile_error_any([[
-
#pragma strict_types
-
class A { int a; optional int x; };
-
class B { int b; };
-
A a = B();
-
return a;
-
]])
-
-
test_eq((["static":42])->static,42)
-
test_eq((["protected":42])->protected,42)
-
-
test_compile_any(class A {}; class B { inherit A; })
-
-
test_any([[
-
// Check that indexing of objects works as expected.
-
object m = master();
-
array(mixed) val = values(m);
-
foreach(indices(m); int i; string ind) {
-
if (m[ind] != val[i]) {
-
error("Indexing error: master()[%O]:%O != %O.\n",
-
ind, m[ind], val[i]);
-
}
-
}
-
]], 0)
-
-
// Automap tests
-
-
test_equal([[ ({10,20})[*] + 30 ]], [[ ({40, 50}) ]])
-
test_equal([[ 30 + ({10,20})[*] ]], [[ ({40, 50}) ]])
-
test_equal([[ ({1,2})[*] + ({10,20})[*] ]], [[ ({11, 22}) ]])
-
-
-
test_equal([[ ({ ({10,20}), ({30,40}) })[*][*] + 5 ]],
-
[[ ({ ({15,25}), ({35,45}) }) ]])
-
-
test_equal([[ 5 + ({ ({10,20}), ({30,40}) })[*][*] ]],
-
[[ ({ ({15,25}), ({35,45}) }) ]])
-
-
test_any_equal([[
-
array a=({ ({10,20}), ({30,40}) });
-
a[*][*] += 5;
-
return a;
-
]],
-
[[ ({ ({15,25}), ({35,45}) }) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
a[*] += -2;
-
return a;
-
]], [[ ({-1,0,1}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
a[*] += -1;
-
return a;
-
]], [[ ({0,1,2}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
a[*] += 0;
-
return a;
-
]], [[ ({1,2,3}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
a[*] += 1;
-
return a;
-
]], [[ ({2,3,4}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
a[*] += 2;
-
return a;
-
]], [[ ({3,4,5}) ]])
-
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
return a[*] += -2;
-
]], [[ ({-1,0,1}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
return a[*] += -1;
-
]], [[ ({0,1,2}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
return a[*] += 0;
-
]], [[ ({1,2,3}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
return a[*] += 1;
-
]], [[ ({2,3,4}) ]])
-
-
test_any_equal([[
-
mixed a=({1,2,3});
-
return a[*] += 2;
-
]], [[ ({3,4,5}) ]])
-
-
test_equal([[ "foo"[ ({ 2,0,1,2 })[*] ] ]],
-
[[ ({ 'o', 'f', 'o', 'o' }) ]])
-
-
test_equal([[ ({ ({1}), ({2}), ({3}) })[*][0] ]],
-
[[ ({ 1,2,3 }) ]])
-
-
test_equal([[ ({ ({1,2}), ({3,4}), ({5,6}) })[*][ ({0,1,1})[*] ] ]],
-
[[ ({ 1,4,6 }) ]])
-
-
// map tests
-
test_eq(map("abc", `+, 1), "bcd")
-
test_equal(map((["a":1,"b":2]), `+, 1), (["a":2,"b":3]))
-
test_equal(map((<1,2,3>), `+, 1), (<2,3,4>))
-
test_any_equal(class A { constant a=1; constant b=2; }; return map(A, `+ ,1);, (["a":2,"b":3]))
-
test_any_equal(class A { protected mixed cast(string t) { if(t=="mapping") return (["a":1,"b":2]);}}; return map(A(), `+, 1);, (["a":2,"b":3]))
-
test_any_equal(class A { protected mixed cast(string t) { if(t=="array") return ({1,2,3});}}; return map(A(), `+, 1);, ({2,3,4}))
-
test_any_equal(class A { protected mixed cast(string t) { if(t=="multiset") return (<1,2,3>);}}; return map(A(), `+, 1);, (<2,3,4>))
-
test_any_equal(array a = ({({1,0,0}),({1,1,0}),({0,1,1})}); return map(a,`[],1);,
-
({0,1,1}))
-
test_any_equal(array a = ({({1,0,0}),({1,1,0}),({0,1,1})}); map(a,`[]=,1,0); return a;,
-
({({1,0,0}),({1,0,0}),({0,0,1})}))
-
test_any_equal(array a = ({(<1>),(<1,2>),(<2,3>),(<1,3>)}); return map(a,`[],1);,
-
({1,1,0,1}))
-
test_any_equal(array a = ({(<1>),(<1,2>),(<2,3>),(<1,3>)}); map(a,`[]=,1,0); return a;,
-
({(<>),(<2>),(<2,3>),(<3>)}))
-
test_any_equal(array a = ({(<"a">),(<"b">),(<>)}); map(a,`->=,"a",1); return a;,
-
({(<"a">),(<"a","b">),(<"a">)}))
-
test_any_equal(array a = ({([1:10]),([1:11,2:12]),([2:13])}); return map(a,`[],1);,
-
({10,11,0}))
-
test_any_equal(array a = ({([1:10]),([1:11,2:12]),([2:13])}); map(a,`[]=,1,1); return a;,
-
({([1:1]),([1:1,2:12]),([1:1,2:13])}))
-
test_any_equal(array a = ({(["a":10]),(["b":11]),([])}); map(a,`->=,"a",1); return a;,
-
({(["a":1]),(["a":1,"b":11]),(["a":1])}))
-
test_any_equal(array a = ({(["i":1]),([])}); return a["i"];,
-
({1,0}))
-
test_any_equal(array a = ({(["i":1]),([])}); a["i"] = 7; return a;,
-
({(["i":7]),(["i":7])}))
-
test_any([[
-
class A {local int i = 10; int ii(){return i;}};
-
class B {inherit A;};
-
class C {inherit A; int i = 11;};
-
array a = ({A(),B(),C()});
-
map(a,`[]=,"i",7);
-
return equal(a->i,({7,7,7})) && equal(a->ii(),({7,7,10}));
-
]],1)
-
test_any([[
-
class A {local int i = 10; int ii(){return i;}};
-
class B {inherit A;};
-
class C {inherit A; int i = 11;};
-
array a = ({A(),B(),C()});
-
a->i = 7;
-
return equal(a->i,({7,7,7})) && equal(a->ii(),({7,7,10}));
-
]],1)
-
test_any([[
-
class A {local int i = 10; int ii(){return i;}};
-
class B {inherit A;};
-
class C {inherit A; int i = 11;};
-
array a = ({A(),B(),C()});
-
map(a,`->=,"i",7);
-
return equal(a->i,({7,7,7})) && equal(a->ii(),({7,7,10}));
-
]],1)
-
test_any_equal([[
-
array a = ({({(["a":"b"]),([]),(["c":17])}),({(["a":"b"]),(["a":7])}),(["b":"d"])});
-
a->a = 1;
-
return a;
-
]], ({({(["a":1]),(["a":1]),(["a":1,"c":17])}),
-
({(["a":1]),(["a":1])}),
-
(["a":1,"b":"d"])}))
-
test_any_equal([[
-
array a = ({({(["a":"b"]),([]),(["c":17])}),({(["a":"b"]),(["a":7])}),(["b":"d"])});
-
map(a,`->=,"a",1);
-
return a;
-
]], ({({(["a":1]),(["a":1]),(["a":1,"c":17])}),
-
({(["a":1]),(["a":1])}),
-
(["a":1,"b":"d"])}))
-
-
-
test_any_equal([[
-
/* This test tests a wild program pointer in the object o. The bug can trig
-
a coredump in a later test. */
-
class A {
-
array a = ({1});
-
void `->= (string var, mixed val) {::`->= (var, val);}
-
};
-
class B {
-
inherit A;
-
void `->= (string var, mixed val) {if (var) ::`->= (var, val);}
-
};
-
object o = B();
-
o->a += ({2});
-
return o->a;
-
]], ({1,2}))
-
-
test_any_equal([[
-
class A {
-
array a = ({1});
-
void `->= (string var, mixed val) {::`->= (var, val);}
-
};
-
class B {
-
inherit A;
-
};
-
object o = B();
-
o->a += ({2});
-
return o->a;
-
]], ({1,2}))
-
-
test_any_equal([[
-
class A {
-
array a = ({1});
-
// void `->= (string var, mixed val) {::`->= (var, val);}
-
};
-
class B {
-
int z;
-
inherit A;
-
void `->= (string var, mixed val) { A::`->= (var, val);}
-
};
-
object o = B();
-
o->a += ({2});
-
return o->a;
-
]], ({1,2}))
-
-
test_any_equal([[
-
class FOO
-
{
-
int q,w,z;
-
};
-
class A {
-
array a = ({1});
-
};
-
class B {
-
inherit FOO;
-
int b,c,d,e,f,g;
-
inherit A;
-
void `->= (string var, mixed val) { A::`->= (var, val);}
-
};
-
object o = B();
-
o->a += ({2});
-
return o->a;
-
]], ({1,2}))
-
-
-
test_any_equal([[
-
class A {
-
array a = ({1});
-
};
-
class B {
-
int z;
-
inherit A : FNORD;
-
-
class Q
-
{
-
mixed `-> (string var)
-
{
-
return FNORD::`-> (var);
-
}
-
void `->= (string var, mixed val)
-
{
-
FNORD::`->= (var, val);
-
}
-
}
-
};
-
object o = B();
-
object o2=o->Q();
-
o2->a += ({2});
-
return o->a;
-
]], ({1,2}))
-
-
-
dnl // Undefined behaviour, don't do this - Hubbe
-
dnl test_any_equal([[
-
dnl class A {
-
dnl array a = ({1});
-
dnl void `->= (string var, mixed val) {::`->= (var, val); a += ({17});}
-
dnl };
-
dnl class B {
-
dnl inherit A;
-
dnl };
-
dnl object o = B();
-
dnl o->a += ({2});
-
dnl return o->a;
-
dnl ]], ({1,2,17}))
-
-
cond(0,[[
-
dnl This test is not really right, since ::`->= is defined to look up
-
dnl statically. Still, a variant of ::`->= that does a low-level dynamic
-
dnl lookup instead would be really useful in cases like this.
-
test_any_equal([[
-
class A {
-
int f;
-
void `->= (string var, mixed val) {::`->= (var, val); f = 17;}
-
};
-
class B {
-
inherit A;
-
array a = ({1});
-
};
-
object o = B();
-
o->a += ({2});
-
return o->a + ({o->f});
-
]], ({1,2,17}))
-
]])
-
-
test_true(mappingp(_memory_usage()))
-
test_any([[
-
int ret = 1;
-
foreach(_memory_usage(); string type; int value)
-
if(value<0)
-
{
-
werror("_memory_usage()->%s has value %d which is <0\n",
-
type, value);
-
ret = 0;
-
}
-
return ret;
-
]],1)
-
-
test_any([[
-
object q=class {}();
-
object o=Debug.next(this);
-
while(zero_type(o)) o=Debug.next(o); /* skip destructed */
-
catch { if(objectp(o) || object_program(o)) return 1; };
-
o=Debug.prev(this);
-
while(zero_type(o)) o=Debug.prev(o); /* skip destructed */
-
catch { if(objectp(o) || object_program(o)) return 1; };
-
return 0;
-
]],1)
-
-
test_any([[object(Stdio.File) o=Stdio.File(); return objectp(o);]],1)
-
test_any([[class Test {}; object(Test) o=Test(); return object_program(o);]],Test)
-
test_define_program(test,[[constant foo = 1; int a() { return foo; }]])
-
test_true(test()->a())
-
test_program(inherit test;)
-
test_program(inherit test; int a() { return foo; } )
-
test_define_program(test,[[class TEST { int a() { return 1; } }]])
-
test_program(inherit test; inherit TEST; )
-
test_do(add_constant("test");)
-
-
test_any([[
-
/* don't save parent */
-
class Foo { };
-
return (!function_object(object_program(Foo()))) &&
-
(function_program(object_program(Foo())) ==
-
this_program);
-
]], 1)
-
-
test_any([[
-
class Foo { };
-
return function_name(object_program(Foo()));
-
]], "Foo")
-
-
test_any([[
-
int q;
-
return stringp(function_name( lambda() { return q; }));
-
]],1)
-
-
test_any([[
-
// Named lambda.
-
int foo(){};
-
return function_name(foo);
-
]], "foo")
-
-
test_any([[
-
// Named trampoline.
-
int q;
-
int foo() { return q; };
-
return function_name(foo);
-
]], "foo")
-
-
test_any([[
-
int q;
-
return function_object( lambda() { return q; });
-
]],[[this]])
-
-
-
test_compile([[
-
class {
-
class foobar {};
-
object(Stdio.File) foo = foobar();
-
}]])
-
test_compile(class { object(Stdio.File) foo=class {} ();})
-
test_compile_error(class { object(Stdio.File) foo = class {float is_file;} ();})
-
test_compile(class { object(Stdio.File) foo = class { int is_file;} ();})
-
test_do(class { object foo; object(Stdio.File) bar=foo; })
-
test_do(class { object foo; Stdio.File bar=foo; })
-
test_do(class { object(Stdio.File) foo; object bar=foo; })
-
test_do(class { Stdio.File foo; object bar=foo; })
-
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){i;})
-
test_compile(sscanf("","%O",mixed foo);foo;)
-
test_compile_error(sscanf("","",mixed foo);)
-
test_compile_error(sscanf("","%f",float))
-
test_compile_error(sscanf("",float))
-
-
// ++
-
test_any([[int e; e++; return e;]],1)
-
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)
-
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_compile_error_any(master()->add_precompiled_program(\"/test\",compile_string(\"int foo() { return 17; }\",\"62\")))
-
-
test_any([[function f=time; int t; foreach(allocate(1),t) f(t); return 1;]],1)
-
test_compile([[while(0)if(0)continue;else;]])
-
test_compile([[do { break; } while (0);]])
-
test_program([[int b=1,c; int a() { c=b+2; return c==3; }]])
-
test_true([[ ("foobar"/"o") & ({ "foo" }) ]])
-
test_any([[ array a="foo bar"/" "; return sizeof(a & ({"foo"}))]],1)
-
-
ifefun(_verify_internals,
-
[[
-
test_do(_verify_internals())
-
]])
-
-
cond_begin([[all_constants()->thread_create]])
-
-
// thread_create
-
test_do(thread_create(lambda() { }))
-
-
// /precompiled/mutex
-
test_true(Thread.Mutex())
-
test_do(add_constant("_tmp_mutex",Thread.Mutex()))
-
test_true(_tmp_mutex->lock())
-
test_true(_tmp_mutex->lock())
-
test_true(_tmp_mutex->trylock())
-
test_true(_tmp_mutex->trylock())
-
test_do(add_constant("_tmp_mutex_lock",_tmp_mutex->lock()))
-
test_true(catch(_tmp_mutex->trylock()))
-
test_do(add_constant("_tmp_mutex_lock"))
-
test_true(_tmp_mutex->trylock())
-
test_do(add_constant("_tmp_mutex"))
-
-
test_any([[
-
object m = Thread.Mutex();
-
object k = m->lock();
-
thread_create(lambda(object k){
-
sleep(10);
-
catch { destruct(k); };
-
}, k);
-
if (catch{
-
m->lock();
-
return 0;
-
}) {
-
return 1;
-
}
-
return 0;
-
]],1)
-
-
test_any([[
-
array data=({0,Thread.Mutex(),Thread.Mutex(),0});
-
data[3]=data[2]->lock();
-
thread_create(lambda(array data) {
-
object o=data[1]->lock();
-
destruct(data[3]);
-
sleep(10);
-
data[0]=1;
-
destruct(o);
-
},data);
-
object l=data[2]->lock(1);
-
object ll=data[1]->lock();
-
return data[0];
-
]],1)
-
-
test_any([[
-
array data=({1, Thread.Mutex(), Thread.Condition(), 0});
-
object key = data[1]->lock();
-
-
for(int e=0;e<3;e++) {
-
data[3]++;
-
thread_create(lambda(array data) {
-
for(int e=0;e<1000;e++) {
-
object o=data[1]->lock();
-
data[0]*=2;
-
for(int d=0;d<5;d++) {
-
data[0]--;
-
data[0]*=2;
-
}
-
data[0]--;
-
destruct(o);
-
}
-
object o = data[1]->lock();
-
data[3]--;
-
data[2]->signal();
-
}, data);
-
}
-
-
while(data[3])
-
data[2]->wait(key);
-
return data[0];
-
]],1)
-
test_any([[
-
object lock = Thread.Mutex()->lock();
-
gc();
-
return objectp (lock);
-
]], 1)
-
-
// /precompiled/condition
-
test_true(Thread.Condition())
-
test_do(Thread.Condition()->signal())
-
test_do(Thread.Condition()->broadcast())
-
-
test_true(objectp(Thread.Fifo()))
-
test_true(objectp(Thread.Queue()))
-
-
// Check that Thread.Queue works on the basic level.
-
test_any([[
-
Thread.Queue q = Thread.Queue();
-
int to_write = 100000;
-
int to_read = 0;
-
while (to_write + to_read) {
-
if (!to_write || random(4 * to_read)) {
-
int val = q->read();
-
if (val != (to_write + to_read))
-
return val + " != " + (to_write + to_read);
-
to_read--;
-
} else {
-
q->write(to_write--);
-
to_read++;
-
}
-
}
-
return 0;
-
]], 0)
-
-
test_any([[
-
object o=Thread.Queue();
-
thread_create(lambda(object f) {
-
for(int e=0;e<10000;e++)
-
f->write(random(4711));
-
f->write(-1);
-
},o);
-
int tmp=0;
-
while(o->read() != -1)
-
tmp++;
-
return tmp;
-
]],10000)
-
-
test_any([[
-
object o=Thread.Fifo();
-
thread_create(lambda(object f) {
-
for(int e=0;e<10000;e++)
-
f->write(random(4711));
-
f->write(-1);
-
},o);
-
int tmp=0;
-
while(o->read() != -1)
-
tmp++;
-
return tmp;
-
]],10000)
-
-
dnl this will crash pike on out-of-address-space-related errors
-
dnl test_any([[ catch { allocate(10000,thread_create)(lambda() { sleep(1); })->wait(); } ]])
-
-
cond_end // thread_create
-
cond(0, [[
-
test_any([[
-
// Test that a loop relinquishes the interpreter lock every now and then.
-
//
-
// This test is unfortunately disabled since it fails too often.
-
// The subthread does really yield in the loop, but the main
-
// thread, which really is waiting, fails to run. My conclusion is
-
// that the problem is the unreliability of th_yield() - we need
-
// to replace it with something else. :(
-
// /mast
-
int count, stop, fail;
-
Thread.thread_create (lambda() {
-
int t_start = time();
-
// Note: We need sub-second precision.
-
float stop_time = 1.0 + time(t_start);
-
while (!stop) {
-
count++;
-
if (time(t_start) > stop_time) {
-
fail = 1;
-
break;
-
}
-
}
-
});
-
sleep (0.1);
-
stop = 1;
-
sleep (0.1);
-
return fail ? -1 : count > 0;
-
]], 1)
-
]])
-
cond_begin([[all_constants()->thread_create]])
-
-
// _disable_threads
-
test_any([[
-
#ifndef __NT__
-
// Using a named pipe here to make open() block. That doesn't exist on NT.
-
-
object t = class {
-
void log (function f, string msg)
-
{
-
#if 0
-
if (f == test) msg = "[T] " + msg;
-
else if (f == thread_disabler) msg = " " * 20 + "[D] " + msg;
-
else if (f == mutex_locker) msg = " " * 40 + "[L] " + msg;
-
log_msg (msg);
-
#endif
-
}
-
-
mixed err;
-
-
string fifo = "/tmp/testpipe." + getpid();
-
-
int started;
-
Thread.Mutex start_lock = Thread.Mutex();
-
Thread.Mutex locker_lock = Thread.Mutex();
-
Thread.Mutex locked_mutex = Thread.Mutex();
-
Thread.MutexKey locked_mutex_key;
-
-
void mutex_locker()
-
{
-
log (mutex_locker, "locker started\n");
-
started++;
-
Thread.MutexKey k = start_lock->lock();
-
k = 0;
-
-
k = locker_lock->lock();
-
k = 0;
-
-
log (mutex_locker, "locker running\n");
-
err = catch (k = locked_mutex->lock());
-
log (mutex_locker, "locker done, error: " + (err && describe_error (err)) + "\n");
-
k = 0;
-
}
-
-
void thread_disabler()
-
{
-
log (thread_disabler, "disabler started\n");
-
Thread.MutexKey locker_key = locker_lock->lock();
-
-
started++;
-
Thread.MutexKey k = start_lock->lock();
-
k = 0;
-
-
sleep (0.1);
-
log (thread_disabler, "disabling\n");
-
locker_key = 0;
-
// Race: Don't want mutex_locker to get the lock on locker_lock
-
// until we're in _disable_threads.
-
object disable = _disable_threads();
-
log (thread_disabler, "disabled\n");
-
sleep (0.1);
-
disable = 0;
-
log (thread_disabler, "disabler done\n");
-
}
-
-
void test()
-
{
-
locked_mutex_key = locked_mutex->lock();
-
started = 0;
-
-
Thread.MutexKey start_key = start_lock->lock();
-
object disabler = thread_create (thread_disabler);
-
object locker = thread_create (mutex_locker);
-
while (started < 2) sleep (0.1);
-
-
Process.Process writer = Process.create_process(
-
RUNPIKE_ARRAY + ({
-
"-e",
-
sprintf ("sleep(0.5); "
-
"Stdio.File f = Stdio.File(%O, \"w\"); "
-
"sleep(0.5); "
-
"f->close();", fifo)
-
}));
-
-
log (test, "opening pipe\n");
-
start_key = 0;
-
Stdio.File f = Stdio.File (fifo, "r");
-
log (test, "pipe opened\n");
-
locked_mutex_key = 0;
-
-
f->close();
-
disabler->wait();
-
locker->wait();
-
writer->wait();
-
log (test, "test done\n");
-
}
-
}();
-
-
rm (t->fifo);
-
Process.system ("mkfifo " + t->fifo);
-
for (int i = 0; i < 5; i++) {
-
t->test();
-
if (t->err) return 0;
-
t->log (0, "------------\n");
-
}
-
rm (t->fifo);
-
-
#endif
-
return 1;
-
]], 1);
-
-
test_do([[
-
object l = _disable_threads();
-
Thread.thread_create (lambda () {});
-
destruct (l);
-
]])
-
-
test_any([[
-
int run = 1;
-
-
mapping(string:int) rounds = ([]);
-
-
void imutex_locker (string id)
-
{
-
while (run) {
-
#ifdef __NT__
-
// Windows got an imutex in create_process. It doesn't have to
-
// be successful.
-
catch (Process.create_process (({""})));
-
#else
-
// Unix systems don't have an imutex in create_process, but
-
// they got the standard password functions.
-
getpwuid (0);
-
#endif
-
rounds[id]++;
-
//werror (id);
-
}
-
};
-
-
void threads_disabler (string id)
-
{
-
while (run) {
-
object l = _disable_threads();
-
rounds[id]++;
-
//werror (id);
-
l = 0;
-
}
-
};
-
-
array(Thread.Thread) t = ({
-
Thread.thread_create (imutex_locker, "0"),
-
Thread.thread_create (imutex_locker, "1"),
-
Thread.thread_create (imutex_locker, "2"),
-
Thread.thread_create (threads_disabler, "a"),
-
Thread.thread_create (threads_disabler, "b"),
-
});
-
sleep (5);
-
run = 0;
-
t->wait();
-
//werror ("%O\n", rounds);
-
-
return 1;
-
]], 1)
-
-
test_any([[
-
Stdio.write_file ("testsuite_test.pike", #"\
-
int main()
-
{
-
Thread.Mutex m = Thread.Mutex();
-
Thread.MutexKey l = m->lock();
-
Thread.thread_create (lambda () {m->lock(); exit (0);});
-
call_out (destruct, 0, l);
-
return -1;
-
}");
-
return Process.system (RUNPIKE +" testsuite_test.pike");
-
]], 0)
-
-
test_eval_error([[
-
Thread.thread_create(lambda(){
-
// NB: It's currently not possible to inhibit the
-
// backtrace (without messing with the master).
-
error("Ignore the following line.\n");
-
})->wait();
-
]])
-
-
cond_end // thread_create
-
-
cond([[0]],
-
[[
-
test_any([[
-
// test if read() hangs when fd is closed by other thread
-
object f=Stdio.File();
-
object g=f->pipe();
-
object t=thread_create(
-
lambda()
-
{
-
g->read(4);
-
});
-
sleep(0.1); // yield
-
g->close(); // close same side of pipe as we have in read above
-
sleep(0.1); // yield
-
if (!t->status()) return 0; // should be done now
-
// if not, there's no way to kill that thread
-
return 1;]],1);
-
-
]])
-
-
-
// m_delete
-
test_any_equal([[ mapping m=([1:1]); m_delete(m,0); return m; ]],[[ ([1:1]) ]])
-
test_any_equal([[ mapping m=([1:1,0:3]); m_delete(m,0); return m; ]],[[ ([1:1]) ]])
-
test_any([[mapping a=([1:1]); return m_delete(a,1)]],1)
-
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=([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_any([[
-
multiset m = set_weak_flag((<>), 1);
-
m[1] = 1;
-
return sizeof(m);
-
]], 1)
-
-
test_true([[
-
multiset m = set_weak_flag((<>), 1);
-
m[1] = 1;
-
return get_weak_flag(m);
-
]])
-
-
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_any_equal([[
-
class X (float i)
-
{
-
protected int `< (X o) {return i < o->i;}
-
protected int id = ++all_constants()->cnt;
-
protected string _sprintf() {return "X(" + i + ")[" + id + "]";}
-
};
-
X x1 = X(1.0), x2 = X(1.0);
-
multiset m = (<x1, X(2.0), X(3.0)>);
-
m[x2] = 1;
-
add_constant ("cnt");
-
return ({m[x1], m[x2], m[X(0.5)]});
-
]], [[({1, 1, 0})]])
-
-
test_any_equal([[
-
class X (float i)
-
{
-
protected int `< (X o) {return i < o->i;}
-
protected int id = ++all_constants()->cnt;
-
protected string _sprintf() {return "X(" + i + ")[" + id + "]";}
-
};
-
X x1 = X(1.0), x2 = X(1.0);
-
multiset m = (<x1, X(2.0), X(3.0)>);
-
m[x2] = 1;
-
add_constant ("cnt");
-
return ({(m[x1] = 1, sizeof (m)),
-
(m[x2] = 1, sizeof (m)),
-
(m[X(0.5)] = 1, sizeof (m))});
-
]], [[({4, 4, 5})]])
-
-
test_do(add_constant("cnt");)
-
test_eq([[sizeof(mtest_m2)]],sizeof(mtest_i2))
-
-
test_any([[
-
// Test subtraction of multisets of objects.
-
class X(int a)
-
{
-
protected int `<(mixed o) { return objectp(o) && (a < o->a); }
-
protected int `==(mixed o) { return objectp(o) && (a == o->a); }
-
};
-
multiset m = (< @map(allocate(5), X) >);
-
return sizeof(m - (<0>));
-
]], 5)
-
-
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]])
-
-
test_equal([[lambda(multiset x){return ({x[17]++,x[17]++,x[17]++});}((<>))]],
-
[[({0,1,1})]])
-
-
test_any([[
-
object o1 = class{}(), o2 = class{}(), o3 = class{}();
-
multiset m = (<o1, o2, o3, 17>);
-
destruct (o1), destruct (o2), destruct (o3);
-
return m[17];
-
]], 1);
-
-
test_any_equal([[
-
object o1 = class{}(), o2 = class{}(), o3 = class{}();
-
multiset m = (<o1, o2, o3, 17>);
-
destruct (o1), destruct (o2), destruct (o3);
-
return copy_value (m);
-
]], (<17>));
-
-
test_do([[
-
multiset a = copy_value ((<(<1,2,3>), ({5,4}), ([1:2]), 1, ({}), (<1,2>), "foo">));
-
foreach (a; mixed i;)
-
if (!a[i]) error ("Can't find multiset member in itself: %O\n", i);
-
]])
-
-
test_any_equal([[
-
multiset m=(<"Stone","2","%70">);
-
foreach(m;string k;)
-
{
-
if(k=="%70")
-
{
-
m[k]=0;
-
break;
-
}
-
}
-
return sort ((array) (m - (<>)));
-
]], ({"2", "Stone"}))
-
-
test_any([[
-
class X (int i) {
-
int `< (mixed o) {return 0;}
-
int `== (mixed o) {return 0;}
-
};
-
multiset m = (<X(2)>);
-
m[X(4)] = 1;
-
m[X(1)] = 1;
-
m[X(3)] = 1;
-
return sizeof (m);
-
]], 4)
-
-
// mapping tests
-
-
test_any([[mapping m=([]);int e;
-
for(e=0;e<1000;e++) m[e]=e;
-
for(e=0;e<1000;e++) if(m[e]!=e) return 0;
-
return 1;
-
]],1)
-
-
test_any([[mapping m=([]);int e;
-
for(e=0;e<1000;e++) m[e]=e;
-
for(e=999;e>=0;e--) if(m[e]!=e) return 0;
-
return 1;
-
]],1)
-
-
-
test_any([[mapping m=([]);int e;
-
for(e=999;e>=0;e--) m[e]=e;
-
for(e=0;e<1000;e++) if(m[e]!=e) return 0;
-
return 1;
-
]],1)
-
-
test_any([[mapping m=([]);int e;
-
for(e=999;e>=0;e--) m[e]=e;
-
for(e=999;e>=0;e--) if(m[e]!=e) return 0;
-
return 1;
-
]],1)
-
-
-
test_any([[mapping m=([]);int e;
-
for(e=0;e<1000;e++) m[reverse(e)]=e;
-
for(e=0;e<1000;e++) if(m[reverse(e)]!=e) return 0;
-
return 1;
-
]],1)
-
-
-
test_any([[mapping m=([]);int e;
-
for(e=999;e>=0;e--) m[reverse(e)]=e;
-
for(e=0;e<1000;e++) if(m[reverse(e)]!=e) return 0;
-
return 1;
-
]],1)
-
-
-
test_any([[mapping m=([]);int e;
-
for(e=0;e<1000;e++) m[reverse(e)]=e;
-
for(e=0;e<1000;e++) m_delete(m,reverse(e));
-
return sizeof(m);
-
]],0)
-
-
test_any([[mapping m=([]);int e;
-
for(e=0;e<1000;e++) m[reverse(e)]=e;
-
for(e=0;e<1000;e+=2) m_delete(m,reverse(e));
-
for(e=0;e<1000;e+=2) if(m[reverse(e)]) return 0;
-
for(e=1;e<1000;e+=2) if(m[reverse(e)]!=e) return 0;
-
return 1;
-
]],1)
-
-
test_any([[mapping m=([]);int e;
-
for(e=0;e<1000;e++) m[reverse(e)]=e;
-
for(e=0;e<1000;e++) m[reverse(e)]++;
-
for(e=0;e<1000;e++) if(m[reverse(e)]!=e+1) return 0;
-
return 1;
-
]],1)
-
-
test_any([[mapping m=([]);int e;
-
mixed a,b;
-
a=allocate(1000);
-
b=allocate(1000);
-
for(e=0;e<1000;e++)
-
{
-
m[reverse(e)]=e;
-
a[e]=reverse(e);
-
b[e]=e;
-
}
-
add_constant("mtest_m",m);
-
add_constant("mtest_i",a);
-
add_constant("mtest_v",b);
-
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(Array.sort_array(values(mtest_m)),Array.sort_array(mtest_v))
-
test_equal(mtest_m,copy_value(mtest_m))
-
test_any([[int e; for(e=0;e<1000;e++) if(!equal(mtest_m[mtest_i[e] ],mtest_v[e])) return 0; return 1;]],1)
-
-
-
test_any([[mapping m=([]);int e;
-
mixed a,b;
-
a=allocate(100);
-
b=allocate(100);
-
for(e=0;e<100;e++)
-
{
-
m[reverse(e-50)]=e-50;
-
a[e]=reverse(e-50);
-
b[e]=e-50;
-
}
-
add_constant("mtest_m2",m);
-
add_constant("mtest_i2",a);
-
add_constant("mtest_v2",b);
-
return 1;
-
]],1)
-
-
test_any([[int e;mapping q=([]),p=([]); for(e=0;e<1000;e++) { p[reverse(e)]=e; q+=([reverse(e):e]); if(!equal(sort(indices(p)),sort(indices(q)))) return 0; } return 1;]],1)
-
test_any([[mapping m=([]); m+=(["foo":"bar"]); m+=(["bar":"foo"]); m+=(["foo":"foo"]); if(sizeof(m)==3) return 1; return m["foo"]=="foo" && m["bar"]=="foo"]],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_equal(sort(values(mtest_m|mtest_m2)),sort(map(mtest_i|mtest_i2,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m&mtest_m2)),sort(map(mtest_i&mtest_i2,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m-mtest_m2)),sort(map(mtest_i-mtest_i2,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m^mtest_m2)),sort(map(mtest_i^mtest_i2,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m2|mtest_m)),sort(map(mtest_i2|mtest_i,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m2&mtest_m)),sort(map(mtest_i2&mtest_i,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m2-mtest_m)),sort(map(mtest_i2-mtest_i,mtest_m|mtest_m2)))
-
test_equal(sort(values(mtest_m2^mtest_m)),sort(map(mtest_i2^mtest_i,mtest_m|mtest_m2)))
-
-
test_do(add_constant("mtest_m"); add_constant("mtest_i"); add_constant("mtest_v");)
-
test_do(add_constant("mtest_m2"); add_constant("mtest_i2"); add_constant("mtest_v2");)
-
-
define([[MTEST]],[[test_equal([[mkmapping(indices(allocate($1)),reverse(indices(allocate($1))))]],[[mkmapping(reverse(indices(allocate($1))),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]])
-
-
test_do([[
-
-
class X {
-
mapping gurka;
-
-
class Tomat
-
{
-
int `==(mixed x)
-
{
-
/* make hash bigger */
-
for(int e=sizeof(gurka);e<1000;e++) gurka[e]=e;
-
return 0;
-
}
-
-
int __hash()
-
{
-
return 99999;
-
}
-
};
-
-
class Sallad
-
{
-
int __hash()
-
{
-
return 99999;
-
}
-
};
-
-
void create()
-
{
-
for(int x=1;x<255;x++)
-
{
-
gurka=([]);
-
for(int e=0;e<x;e++) gurka[~e]=e;
-
gurka[Sallad()]=-2;
-
gurka[Tomat()]=-3;
-
}
-
}
-
}
-
X();
-
-
]])
-
-
test_any([[
-
mapping m = ([ "foo" : 1 ]);
-
class A {
-
int __hash() { return hash_value("foo"); }
-
int `==(mixed o) { return o == "foo"; }
-
};
-
if( !m[A()] )
-
return (string)hash_value("foo");
-
return 0;
-
]], 0)
-
-
test_any([[
-
mapping m = ([ "foo" : 1 ]);
-
class A {
-
int __hash() { return hash_value("foo"); }
-
int `==(mixed o) { return o == "foo"; }
-
};
-
if( sizeof(m - ([ A() : 1 ])) )
-
return (string)hash_value("foo");
-
return 0;
-
]], 0)
-
-
test_equal([[ `+( ([1:2]) )]],[[ ([1:2]) ]])
-
test_false( `+( ([1:2]) ) == ([1:2]) )
-
test_equal([[ `+( ([1:2]), ([1:2]) )]],[[ ([1:2]) ]])
-
test_equal([[ `+( ([1:2]), ([1:2]), ([2:3,4:5]) )]],[[ ([1:2,2:3,4:5]) ]])
-
test_equal([[ `+( ([1:2]), ([1:2]), ([2:3,4:5]), ([6:7,1:2]) )]],[[ ([1:2,2:3,4:5,6:7]) ]])
-
test_equal([[ `+( ([1:2]), ([1:2]), ([2:3,4:5]), ([6:7,1:2]),([8:9]) )]],[[ ([1:2,2:3,4:5,6:7,8:9]) ]] )
-
-
test_any([[mapping m=([1:2,3:2]); return search(m,2,search(m,2))!=-1;]],1)
-
-
test_any([[mapping m=([]); for(int e=0;e<1000;e++) m[e&3]+=({e}); return sizeof(m)==4 && sizeof(m[0])==250;]],1)
-
-
test_any([[
-
mapping m = set_weak_flag (([1:1]), 1);
-
m_delete (m, 1);
-
return get_weak_flag (([]));
-
]], 0);
-
-
test_equal([[lambda(mapping x){return ({x[17]++,x[17]++,x[17]++});}(([]))]],
-
[[({0,1,2})]])
-
-
test_equal([[([1:2, 3:4]) - (<0, 1, 2>)]], ([3:4]))
-
test_equal([[([1:2, 3:4]) - ({0, 1, 2})]], ([3:4]))
-
test_equal([[([1:2, 3:4]) & (<0, 1, 2>)]], ([1:2]))
-
test_equal([[([1:2, 3:4]) & ({0, 1, 2})]], ([1:2]))
-
-
// destructed indices
-
test_any([[{
-
object o = class{}();
-
mapping m = ([o: 1]);
-
destruct (o);
-
return equal (m, ([])) && equal (m, ([]));
-
}]], 1)
-
test_any([[{
-
object o = class{}();
-
mapping m = ([o: 1]), n = ([class{}(): 1]);
-
destruct (o);
-
return !equal (m, n) && !equal (m, n);
-
}]], 1)
-
test_any([[{
-
object o = class{}();
-
mapping m = ([o: 1]);
-
destruct (o);
-
return sizeof (indices (m)) || sizeof (m);
-
}]], 0)
-
test_any([[{
-
object o = class{}();
-
mapping m = ([o: 1]);
-
destruct (o);
-
return sizeof (values (m)) || sizeof (m);
-
}]], 0)
-
-
// gc
-
-
test_true(intp(gc()));
-
test_true(mappingp (((function) Debug.gc_status)()))
-
test_any([[ array a=({0}); a[0]=a; gc(); a=0; return gc() > 0; ]],1);
-
test_any([[mapping m=([]); m[m]=m; gc(); m=0; return gc() > 0; ]],1);
-
test_any([[multiset m=(<>); m[m]=1; gc(); m=0; return gc() > 0; ]],1);
-
test_any([[{
-
#if !constant (_debug)
-
int _debug (int d) {return 0;};
-
#endif
-
// Must turn off debug in this test or else we'll get extra
-
// references to p in the backlog.
-
int dlevel = _debug (0);
-
program p=compile_string("constant a=({0});");
-
object o=p();
-
o->a[0]=p;
-
gc();
-
p=o=0;
-
_debug (dlevel);
-
return gc() > 0;
-
}]], 1);
-
-
test_any([[
-
object o = class {function f; void foo() {}}();
-
o->f = o->foo;
-
gc();
-
o = 0;
-
return gc();
-
]], 0)
-
test_any([[
-
object o = class {object o;}();
-
o->o = o;
-
gc();
-
o = 0;
-
return gc();
-
]], 0)
-
test_any([[
-
class X {function f; void foo() {}};
-
object o1 = X(), o2 = X();
-
o1->f = o2->foo;
-
o2->f = o1->foo;
-
gc();
-
o1 = o2 = 0;
-
return gc();
-
]], 2)
-
test_any([[
-
class X {object o;};
-
object o1 = X(), o2 = X();
-
o1->o = o2;
-
o2->o = o1;
-
gc();
-
o1 = o2 = 0;
-
return gc();
-
]], 2)
-
-
test_any([[gc();
-
int q=lambda() { mixed foo; foo=lambda() { return foo; }; return 1; }();
-
return gc()>0;
-
]],1)
-
-
test_true([[
-
object o = class{}();
-
mapping m = ([class{}(): o, o: class{}()]);
-
set_weak_flag (m, 1);
-
gc();
-
return !sizeof (m);
-
]])
-
test_true([[
-
object o = class{}();
-
mapping m = ([class{}(): o, o: class{}()]);
-
set_weak_flag (m, Pike.WEAK_INDICES);
-
gc();
-
return sizeof (m);
-
]])
-
test_true([[
-
object o = class{}();
-
mapping m = ([class{}(): o, o: class{}()]);
-
set_weak_flag (m, Pike.WEAK_VALUES);
-
gc();
-
return sizeof (m);
-
]])
-
test_true([[
-
object o = class{}();
-
multiset m = (<o>);
-
set_weak_flag (m, 1);
-
m[class{}()] = 1;
-
m[o] = 0;
-
gc();
-
return !sizeof (m);
-
]])
-
-
test_do([[
-
mixed eat_stack(int|void probe)
-
{
-
// Avoid eating as much C-stack by releasing the
-
// catch at every level.
-
if (probe) return 1;
-
if (catch(eat_stack(1))) return 1;
-
mixed err = 1;
-
if ((err = eat_stack()) != 10)
-
return intp(err) && err > 0 ? err + 1 : err;
-
if (err = catch {
-
class Foo
-
{
-
object foo;
-
protected void create(object o) {foo = o;}
-
};
-
Foo foo;
-
for(int i=0; i < 10000; i++)
-
foo = Foo(foo);
-
gc();
-
}) return err;
-
};
-
if (mixed err = eat_stack()) throw (err);
-
]])
-
-
test_any([[
-
mapping m=([]);
-
m->self=m;
-
-
mapping q=(["foo":"bar","gazonk":1]);
-
m->q=q;
-
-
q+=([]);
-
m=0;
-
gc();
-
return sizeof(q);
-
]],2)
-
-
test_any([[
-
int dummy;
-
gc();
-
function f = lambda() {
-
object o = class{}();
-
int i;
-
return lambda() {return i;};
-
}();
-
lambda() {dummy++;}(); // Ensure refcount garbing is done.
-
int n = gc();
-
// n should be 0; o should be refcount garbed above, the frame for f
-
// should be intact for use below.
-
dummy += f();
-
return n;
-
]], 0)
-
-
test_any([[
-
// Make sure we don't get trampoline garbage with (named) lambdas
-
// that reference variables in the parent scope.
-
gc();
-
mapping m = ([]);
-
class Refcounter()
-
{ mapping state;
-
void create(mapping m) { state = m; state->refs++;}
-
void destroy() {state->refs--;}
-
};
-
int final_res;
-
function foo()
-
{
-
object refc = Refcounter(m);
-
final_res += m->refs; // Should add 1 here.
-
int i = 1;
-
int bar()
-
{
-
return i++;
-
};
-
return bar;
-
};
-
function bar = foo();
-
final_res += m->refs; // Should add 0 here.
-
bar();
-
bar = 0;
-
final_res += m->refs; // Should add 0 here.
-
final_res += gc(); // Should add 0 here.
-
return final_res; // 1 expected.
-
]], 1)
-
-
test_true([[
-
class
-
{
-
object c;
-
class A {object b;}
-
class B {object a; void destroy() {c = class{}();}}
-
mixed test()
-
{
-
object a = A(), b = B();
-
a->b = b;
-
b->a = a;
-
a = b = 0;
-
gc();
-
return c;
-
}
-
}()->test();
-
]])
-
-
test_any([[{
-
array a = ({({0})}); a[0][0] = a;
-
gc(); a = 0; return gc() > 0;
-
}]], 1)
-
-
test_any([[{
-
object o = class {}();
-
mapping m = ([o: ({17})]);
-
gc(); destruct (o); return gc() > 0;
-
}]], 1)
-
-
test_any([[{
-
class Dead {object o;};
-
object o = Dead(); o->o = Dead(); o->o->o = o;
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
test_any([[{
-
class Live {object o; void destroy() {}};
-
object o = Live(); o->o = Live(); o->o->o = o;
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
test_any([[{
-
class Dead {object o;};
-
class Live {object o; void destroy() {}};
-
object o = Dead(); o->o = Live(); o->o->o = o;
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
test_any([[{
-
class Dead {object o;};
-
class Live {object o; void destroy() {}};
-
object o = Live(); o->o = Dead(); o->o->o = o;
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
-
test_any_equal([[{
-
class Live {object o; void destroy() {}};
-
array a = set_weak_flag(({Live()}), 1);
-
gc();
-
return set_weak_flag(a, 0);
-
}]], ({0}))
-
test_any_equal([[{
-
class Live {object o; void destroy() {}};
-
multiset l = set_weak_flag((<Live()>), 1);
-
gc();
-
return set_weak_flag(l, 0);
-
}]], (<>))
-
test_any_equal([[{
-
class Live {object o; void destroy() {}};
-
mapping m = set_weak_flag(([0: Live()]), 1);
-
gc();
-
return set_weak_flag(m, 0);
-
}]], ([]))
-
test_any_equal([[{
-
class Live {object o; void destroy() {}};
-
mapping m = set_weak_flag(([Live(): 0]), 1);
-
gc();
-
return set_weak_flag(m, 0);
-
}]], ([]))
-
test_any_equal([[{
-
array a = set_weak_flag(({4711, 0x54325827a124*0x12348795482485425}), 1);
-
gc();
-
return set_weak_flag(a, 0);
-
}]], ({4711, 0x54325827a124*0x12348795482485425}))
-
-
test_any_equal([[{
-
object o = class {
-
array g;
-
array a = ({17});
-
void create() {g = ({this});}
-
void destroy() {all_constants()->kablutt = a;}
-
}();
-
o = 0;
-
gc();
-
return all_constants()->kablutt;
-
}]], ({17}));
-
test_any([[{
-
object o = class {
-
array g;
-
array a = set_weak_flag (({({17})}), 1);
-
void create() {g = ({this});}
-
void destroy() {
-
if (!equal (a, ({({17})})))
-
error ("Contents in weak array zapped: %O.\n", a);
-
}
-
}();
-
o = 0;
-
return gc() >= 3;
-
}]], 1);
-
test_any_equal([[{
-
object o = class {
-
array g;
-
array a = set_weak_flag (({({17})}), 1);
-
void create() {g = ({this});}
-
void destroy() {all_constants()->blatinka = a;}
-
}();
-
o = 0;
-
gc();
-
if (!equal (all_constants()->blatinka, ({({17})})))
-
error ("Contents in saved weak array zapped: %O.\n",
-
all_constants()->blatinka);
-
gc();
-
return all_constants()->blatinka;
-
}]], ({0}));
-
-
test_do(add_constant("kablutt");)
-
test_do(add_constant("blatinka");)
-
-
test_any([[{
-
#if constant (_debug)
-
// Temporarily disable debug so we don't get references to p in
-
// the intepreter backlog.
-
int old_debug = _debug (0);
-
#endif
-
object o = class {program p; object o;}();
-
class Resolver (mixed x) {mixed resolv (string id) {return x;}};
-
program p = compile ("constant o = foo;", Resolver (o));
-
o->p = p;
-
o->o = p();
-
gc();
-
o = p = 0;
-
#if constant (_debug)
-
_debug (old_debug);
-
#endif
-
return gc() > 0;
-
}]], 1)
-
-
test_any([[{
-
class Dead {object o;};
-
object o = Dead(); o->o = Dead();
-
array a = set_weak_flag(({o}), 1);
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
test_any([[{
-
class Dead {object o;};
-
class Live {object o; void destroy() {}};
-
object o = Live(); o->o = Dead();
-
array a = set_weak_flag(({o}), 1);
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
test_any([[{
-
class Dead {object o;};
-
class Live {object o; void destroy() {}};
-
object o = Dead(); o->o = Live();
-
array a = set_weak_flag(({o}), 1);
-
gc(); o = 0; return gc() > 0;
-
}]], 1)
-
-
test_do([[{
-
object o = class {}();
-
array a = ({o});
-
destruct (o);
-
gc();
-
}]]);
-
-
test_any([[{
-
array a = ({0}), b = ({a, set_weak_flag (({a}), 1)});
-
array x = set_weak_flag (({a}), 1);
-
a[0] = b;
-
a = b = 0;
-
gc();
-
return !x[0];
-
}]], 1);
-
test_any([[{
-
mapping a = ([]), b = ([a:set_weak_flag (([a:a]), 1)]);
-
mapping x = set_weak_flag (([a:2]), 1);
-
a[b] = b;
-
a = b = 0;
-
gc();
-
return !sizeof (x);
-
}]], 1);
-
test_any([[{
-
multiset a = (<>), b = (<a, set_weak_flag ((<a>), 1)>);
-
multiset x = set_weak_flag ((<a>), 1);
-
a[b] = 1;
-
a = b = 0;
-
gc();
-
return !sizeof (x);
-
}]], 1);
-
-
test_any([[{
-
class Foo {
-
array(Foo) f = ({this});
-
multiset(Foo) g = set_weak_flag((<this>), 1);
-
};
-
multiset(Foo) x = set_weak_flag ((<Foo()>), 1);
-
gc();
-
return !sizeof (x);
-
}]], 1);
-
test_any([[{
-
class Foo {
-
array(Foo) f = ({this});
-
multiset(Foo) g = set_weak_flag((<this>), 1);
-
void destroy() {add_constant("beltbent_oblivion", 1);}
-
};
-
multiset(Foo) x = set_weak_flag ((<Foo()>), 1);
-
gc();
-
int res = all_constants()->beltbent_oblivion;
-
add_constant("beltbent_oblivion");
-
return res;
-
}]], 1);
-
-
test_any([[{
-
gc();
-
array x = set_weak_flag (({0}), 1);
-
x[0] = x;
-
multiset b = set_weak_flag ((<x>), 1);
-
array a = ({17});
-
b[a] = 1;
-
x = 0;
-
return gc() >= 1;
-
}]], 1);
-
-
test_any([[{
-
gc();
-
array a = set_weak_flag (({0, this}), 1);
-
a[0] = a;
-
a = 0;
-
return gc() >= 1;
-
}]], 1);
-
-
test_any([[{
-
gc();
-
array y = set_weak_flag (({0}), 1), z = set_weak_flag (({y}), 1);
-
y[0] = z;
-
y = z = 0;
-
return gc() >= 2;
-
}]], 1);
-
-
test_any([[{
-
class Live {
-
array a;
-
array g = ({this});
-
void create()
-
{
-
a = set_weak_flag (({0}), 1);
-
array b = set_weak_flag (({a}), 1);
-
a[0] = b;
-
}
-
void destroy()
-
{
-
if (!arrayp(a) || !arrayp(a[0]) || a[0][0] != a)
-
add_constant ("my_little_error", "GC garbed weak things too early.\n");
-
}
-
};
-
gc();
-
object o = Live();
-
o = 0;
-
int res = gc() >= 3;
-
if (all_constants()->my_little_error)
-
error (all_constants()->my_little_error);
-
return res;
-
}]], 1);
-
-
test_do([[{
-
class Live
-
{
-
Foo f;
-
void destroy()
-
{
-
if (!f->l || !f->a || !f->a[0] || !f->a[1])
-
add_constant ("my_little_error", "GC garbed live things.\n");
-
}
-
};
-
class Foo
-
{
-
int i;
-
class Bar
-
{
-
int j = i++; // Ensure parent pointer.
-
array a = ({j});
-
}
-
Live l;
-
void create (Live _l)
-
{
-
l = _l;
-
l->f = this;
-
}
-
array a = allocate (2, Bar)();
-
};
-
object o = Foo(Live());
-
o = 0;
-
gc(), gc();
-
if (all_constants()->my_little_error)
-
error (all_constants()->my_little_error);
-
}]]);
-
-
test_do([[{
-
object o = compile_string(#"
-
class Foo
-
{
-
int i;
-
class Bar
-
{
-
int j = i++; // Ensure parent pointer.
-
}
-
inherit Bar;
-
}")();
-
o = 0;
-
gc();
-
}]]);
-
-
test_do([[{
-
mapping a = ([1:({17}),2:3,4:5,6:7,8:9]), b = a + ([]);
-
set_weak_flag (b, 1);
-
gc();
-
}]]);
-
test_do([[{
-
mapping a = ([1:({17})]), b = a + ([]);
-
set_weak_flag (b, 1);
-
gc();
-
}]]);
-
test_any([[{
-
mapping a = ([17:({17})]);
-
for (int i = 0; i < 10; i++) a[class{}()] = i;
-
mapping b = a + ([]);
-
set_weak_flag (b, 1);
-
foreach (indices (a), mixed o) if (objectp (o)) destruct (o);
-
gc();
-
return sizeof (a) == 1 && sizeof (b) == 1;
-
}]], 1);
-
test_any([[{
-
mapping a = ([17:({17})]);
-
for (int i = 0; i < 10; i++) a[class{}()] = i;
-
mapping b = a + ([]);
-
set_weak_flag (a, 1);
-
foreach (indices (a), mixed o) if (objectp (o)) destruct (o);
-
gc();
-
return sizeof (a) == 1 && sizeof (b) == 1;
-
}]], 1);
-
test_any([[{
-
mapping a = ([17:({17})]);
-
for (int i = 0; i < 10; i++) a[class{}()] = i;
-
mapping b = a + ([]);
-
set_weak_flag (a, 1);
-
set_weak_flag (b, 1);
-
foreach (indices (a), mixed o) if (objectp (o)) destruct (o);
-
gc();
-
return !sizeof (a) && !sizeof (b);
-
}]], 1);
-
test_any([[{
-
mapping a = ([17:17]);
-
set_weak_flag (a, 1);
-
for (int i = 0; i < 10; i++) a[class{}()] = i;
-
mapping b = a + ([]);
-
foreach (indices (a), mixed o) if (objectp (o)) destruct (o);
-
gc();
-
return sizeof (a) == 1 && sizeof (b) == 1;
-
}]], 1);
-
test_any([[{
-
mapping a = set_weak_flag (([17: set_weak_flag (({({17})}), 1)]), 1);
-
return gc() >= 2 && !sizeof (a);
-
}]], 1);
-
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag ((["foo": o]), 1);
-
gc();
-
return sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: o]), 1);
-
gc();
-
return sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o1 = class{}(), o2 = class{}();
-
mapping a = set_weak_flag (([o1: o2]), 1);
-
gc();
-
return sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: o]), 1);
-
o = 0;
-
return gc() >= 1 && !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([class{}(): o]), 1);
-
return gc() >= 1 && !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: class{}()]), 1);
-
return gc() >= 1 && !sizeof (a);
-
}]], 1);
-
test_any([[{
-
mapping a = set_weak_flag (([class{}(): class{}()]), 1);
-
return gc() >= 2 && !sizeof (a);
-
}]], 1);
-
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag ((["foo": o]), 1);
-
destruct (o);
-
gc();
-
return !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: o]), 1);
-
destruct (o);
-
gc();
-
return !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([class{}(): o]), 1);
-
destruct (o);
-
return gc() >= 1 && !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: class{}()]), 1);
-
destruct (o);
-
return gc() >= 1 && !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: o]), 0);
-
destruct (o);
-
gc();
-
return !sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([class{}(): o]), 0);
-
destruct (o);
-
gc();
-
return sizeof (a);
-
}]], 1);
-
test_any([[{
-
object o = class{}();
-
mapping a = set_weak_flag (([o: class{}()]), 0);
-
destruct (o);
-
gc();
-
return !sizeof (a);
-
}]], 1);
-
-
test_any_equal([[{
-
array a = set_weak_flag (({1, "foo", 3.14}), 1);
-
gc();
-
return set_weak_flag(a, 0);
-
}]], ({1, "foo", 3.14}));
-
test_any_equal([[{
-
multiset a = set_weak_flag ((<1, "foo", 3.14>), 1);
-
gc();
-
return set_weak_flag(a, 0);
-
}]], (<1, "foo", 3.14>));
-
test_any_equal([[{
-
mapping a = set_weak_flag (([1: 1, "foo": "foo", 3.14: 3.14]), 1);
-
gc();
-
return set_weak_flag(a, 0);
-
}]], ([1: 1, "foo": "foo", 3.14: 3.14]));
-
-
test_do([[{
-
object f = class
-
{
-
object o = class {}();
-
array a = set_weak_flag (({o}), 1);
-
object this = this;
-
void create() {destruct (o);}
-
}();
-
f = 0;
-
gc();
-
}]]);
-
test_do([[{
-
object f = class
-
{
-
object o = class {}();
-
mapping m = set_weak_flag (([1:o]), 1);
-
object this = this;
-
void create() {destruct (o);}
-
}();
-
f = 0;
-
gc();
-
}]]);
-
test_do([[{
-
object f = class
-
{
-
object o = class {}();
-
mapping m = set_weak_flag (([o:1]), 1);
-
object this = this;
-
void create() {destruct (o);}
-
}();
-
f = 0;
-
gc();
-
}]]);
-
test_do([[{
-
object f = class
-
{
-
object o = class {}();
-
multiset m = set_weak_flag ((<o>), 1);
-
object this = this;
-
void create() {destruct (o);}
-
}();
-
f = 0;
-
gc();
-
}]]);
-
-
test_tests([[inherit "]]SRCDIR[[/test_gc.pike";]])
-
-
test_any([[mapping q=([ "t":class {} ()]); gc(); if(!objectp(q->t)) return -1; set_weak_flag(q,1); gc(); if(objectp(q->t)) return -2; return 0;]],0);
-
-
test_do([[class bar { object foo; void create(void|object tmp) { foo=tmp; } };
-
object o=bar(),o2=o;
-
for(int e=0;e<10000;e++) o=bar(o);
-
o2->foo=o;
-
o=o2=0;
-
gc();
-
]])
-
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_INDICES);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_VALUES);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag ((["x": o]), Pike.WEAK_INDICES);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag ((["x": o]), Pike.WEAK_VALUES);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
mapping m = set_weak_flag (([class{}(): "x"]), Pike.WEAK_INDICES);
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
mapping m = set_weak_flag (([class{}(): "x"]), Pike.WEAK_VALUES);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
mapping m = set_weak_flag ((["x": class{}()]), Pike.WEAK_INDICES);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
mapping m = set_weak_flag ((["x": class{}()]), Pike.WEAK_VALUES);
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: o]), Pike.WEAK_INDICES);
-
o = 0;
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: o]), Pike.WEAK_VALUES);
-
o = 0;
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: o]), Pike.WEAK);
-
o = 0;
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_INDICES);
-
destruct (o);
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag (([o: "x"]), Pike.WEAK_VALUES);
-
destruct (o);
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
object o = class{}();
-
mapping m = ([o: "x"]);
-
destruct (o);
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag ((["x": o]), Pike.WEAK_INDICES);
-
destruct (o);
-
gc();
-
return sizeof (m);
-
]], 1)
-
test_any([[
-
object o = class{}();
-
mapping m = set_weak_flag ((["x": o]), Pike.WEAK_VALUES);
-
destruct (o);
-
gc();
-
return sizeof (m);
-
]], 0)
-
test_any([[
-
object o = class{}();
-
mapping m = (["x": o]);
-
destruct (o);
-
gc();
-
return sizeof (m);
-
]], 1)
-
-
test_do([[
-
mapping m = set_weak_flag (([]), Pike.WEAK_INDICES);
-
object o = class {object o;}();
-
m[o] = ({1});
-
o->o = o;
-
o = 0;
-
gc();
-
]])
-
-
test_do([[
-
mapping m = set_weak_flag (([]), Pike.WEAK_INDICES);
-
object o = class {object o;}();
-
m[o] = ({1});
-
array a = set_weak_flag (({class (object o) {} (o)}), 1);
-
o = 0;
-
gc();
-
]])
-
-
test_any([[
-
return class {
-
mapping x;
-
int test()
-
{
-
object o = class {
-
mapping a = ([1: this]);
-
void destroy() {x = a;}
-
}();
-
o = 0;
-
gc();
-
return x && !x[1];
-
}
-
}()->test();
-
]], 1)
-
test_any([[
-
return class {
-
multiset x;
-
int test()
-
{
-
object o = class {
-
multiset a = (<this>);
-
void destroy() {x = a;}
-
}();
-
o = 0;
-
gc();
-
return x && !sizeof (indices (x + (<>)));
-
}
-
}()->test();
-
]], 1)
-
test_any([[
-
return class {
-
array x;
-
int test()
-
{
-
object o = class {
-
array a = ({this});
-
void destroy() {x = a;}
-
}();
-
o = 0;
-
gc();
-
return x && !x[0];
-
}
-
}()->test();
-
]], 1)
-
test_any([[
-
return class {
-
class Obj (object o) {void destroy() {}}
-
Obj x;
-
int test()
-
{
-
object o = class {
-
Obj a = Obj (this);
-
void destroy() {x = a;}
-
}();
-
o = 0;
-
gc();
-
return !x;
-
}
-
}()->test();
-
]], 1)
-
test_any([[
-
return class {
-
class Obj (object o) {}
-
Obj x;
-
int test()
-
{
-
object o = class {
-
Obj a = Obj (this);
-
void destroy() {x = a;}
-
}();
-
o = 0;
-
gc();
-
return x && !x->o;
-
}
-
}()->test();
-
]], 1)
-
-
// Pike.count_memory
-
test_do([[
-
add_constant ("count_memory_stats",
-
lambda (int|mapping opts, mixed... things) {
-
if (intp (opts))
-
opts = (["lookahead": opts, "collect_stats": 1]);
-
else
-
opts += (["collect_stats": 1]);
-
Pike.count_memory (opts, @things);
-
return sprintf ("i:%d,c:%d,e:%d,v:%d,r:%d,rnd:%d",
-
opts->internal, opts->cyclic, opts->external,
-
opts->visits, opts->revisits, opts->rounds);
-
})
-
]])
-
// time(1) is used below to avoid constants with extra refs.
-
test_true([[Pike.count_memory (-1) == 0]])
-
test_true([[Pike.count_memory (-1, ({})) > 0]])
-
test_true([[Pike.count_memory (-1, ({time(1)})) > 0]])
-
test_true([[Pike.count_memory (-1, (<>)) > 0]])
-
test_true([[Pike.count_memory (-1, (<time(1)>)) >
-
Pike.count_memory (-1, (<>))]])
-
test_true([[Pike.count_memory (-1, (<time(1)>)) >
-
Pike.count_memory (-1, (<1>))]])
-
test_true([[Pike.count_memory (-1, ([])) > 0]])
-
test_true([[Pike.count_memory (-1, ([1: time(1)])) >
-
Pike.count_memory (-1, ([]))]])
-
test_true([[Pike.count_memory (-1, ([1: time(1)])) >
-
Pike.count_memory (-1, ([1: 2]))]])
-
test_true([[Pike.count_memory (-1, class {}) > 0]])
-
test_true([[Pike.count_memory (-1, class {float f;}) >
-
Pike.count_memory (-1, class {})]])
-
test_true([[Pike.count_memory (-1, class {constant f = 0.0;}) >
-
Pike.count_memory (-1, class {})]])
-
test_true([[Pike.count_memory (-1, class {}()) > 0]])
-
test_true([[Pike.count_memory (-1, class {float f;}()) >
-
Pike.count_memory (-1, class {}())]])
-
test_true([[Pike.count_memory (-1, class {constant f = 0.0;}()) ==
-
Pike.count_memory (-1, class {}())]])
-
test_true([[Pike.count_memory (-1, "foo") > 0]])
-
test_true([[Pike.count_memory (-1, typeof (map)) > 0]])
-
test_true([[Pike.count_memory (-1, 17) == 0]])
-
test_true([[Pike.count_memory (-1, ({"some string with no other ref in memory "+
-
Standards.UUID.make_version4()->str()})) ==
-
Pike.count_memory (-1, ({""}))]])
-
test_true([[Pike.count_memory (0, ({"some string with no other ref in memory " +
-
Standards.UUID.make_version4()->str()})) >
-
Pike.count_memory (0, ({""}))]])
-
test_true([[Pike.count_memory (-1, ({time(1)})) +
-
Pike.count_memory (-1, ([1: time(1)])) ==
-
Pike.count_memory (0, ({([1: time(1)])}))]])
-
test_true([[Pike.count_memory (0, class {mapping(this_program:array(int)) x;}) >
-
Pike.count_memory (0, class {int x;})]])
-
test_true([[Pike.count_memory (0, ({compile (
-
"constant x = ([1: " + time(1) +
-
"]);")})) >
-
Pike.count_memory (0, ({([1: time(1)])}))]])
-
test_eq([[count_memory_stats (-1, ({time(1)}))]],
-
[["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_eq([[count_memory_stats (-1, (<time(1)>))]],
-
[["i:1,c:0,e:0,v:2,r:0,rnd:1"]])
-
test_eq([[count_memory_stats (-1, ([1: time(1)]))]],
-
[["i:1,c:0,e:0,v:2,r:0,rnd:1"]])
-
test_eq([[count_memory_stats (-1, class {float f;})]],
-
[["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_eq([[count_memory_stats (-1, class {float f;}())]],
-
[["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_eq([[count_memory_stats (-1, "foo")]],
-
[["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_eq([[count_memory_stats (-1, typeof(all_constants()))]],
-
[["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_any([[
-
array a1 = ({({time(1)})}), a2 = ({a1[0]});
-
return Pike.count_memory (0, a1, a2) >
-
Pike.count_memory (0, a1) + Pike.count_memory (0, a2);
-
]], 1)
-
test_any([[
-
mapping m = ([1: time(1)]);
-
return Pike.count_memory (0, ({m})) == Pike.count_memory (0, ({0}));
-
]], 1)
-
test_any([[
-
array a = ({([1: time(1)])});
-
return Pike.count_memory (0, a) > Pike.count_memory (0, ({([])}));
-
]], 1)
-
test_any([[
-
program p = class {};
-
return Pike.count_memory (0, p) > Pike.count_memory (0, p());
-
]], 1)
-
test_any([[
-
class X (void|object a) {};
-
X o = X (X());
-
return count_memory_stats (0, o);
-
]], [["i:2,c:0,e:0,v:2,r:0,rnd:1"]])
-
test_any([[
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o;
-
return count_memory_stats (0, o);
-
]], [["i:3,c:0,e:0,v:3,r:0,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
return count_memory_stats (2, o);
-
]], [["i:3,c:2,e:0,v:7,r:4,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
return count_memory_stats (1, o);
-
]], [["i:1,c:0,e:1,v:3,r:1,rnd:1"]])
-
test_any([[
-
class X (void|object a) {};
-
X o = X (X (X()));
-
int size = Pike.count_memory (0, o);
-
o->a->a->a = o->a;
-
return Pike.count_memory ((["lookahead": 2]), o) == size;
-
]], 1)
-
test_any([[
-
class X (void|object a) {};
-
X o = X (X (X()));
-
return count_memory_stats ((["block_objects": 1]), o);
-
]], [["i:3,c:0,e:0,v:3,r:0,rnd:1"]])
-
test_any([[
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
return count_memory_stats ((["lookahead": 2, "block_objects": 1]), o);
-
]], [["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
X r = o->a->a;
-
return count_memory_stats (10, o);
-
]], [["i:1,c:0,e:2,v:7,r:4,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
X r = o->a->a;
-
return count_memory_stats (2, o);
-
]], [["i:1,c:0,e:2,v:7,r:4,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
X r = o->a;
-
return count_memory_stats (2, o);
-
]], [["i:1,c:0,e:2,v:5,r:2,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
return count_memory_stats (1, o);
-
]], [["i:1,c:0,e:1,v:3,r:1,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
return count_memory_stats (2, o);
-
]], [["i:6,c:5,e:0,v:19,r:13,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
X p = o->a->a->a->a;
-
return count_memory_stats (2, o);
-
]], [["i:1,c:0,e:5,v:17,r:11,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {constant pike_cycle_depth = 2;};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
return count_memory_stats (0, o);
-
]], [["i:6,c:5,e:0,v:19,r:13,rnd:2"]])
-
test_any([[
-
class X (void|object a, void|object b) {constant pike_cycle_depth = 1;};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
return count_memory_stats (0, o);
-
]], [["i:1,c:0,e:1,v:3,r:1,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {constant pike_cycle_depth = 0;};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
return count_memory_stats (2, o);
-
]], [["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_any([[
-
class X (void|object a, void|object b) {constant pike_cycle_depth = 2;};
-
X o = X (X (X (X (X (X ())))));
-
o->a->b = o;
-
o->a->a->b = o->a;
-
o->a->a->a->b = o->a->a;
-
o->a->a->a->a->b = o->a->a->a;
-
o->a->a->a->a->a->b = o->a->a->a->a;
-
return count_memory_stats ((["block_pike_cycle_depth": 1]), o);
-
]], [["i:1,c:0,e:0,v:1,r:0,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {constant pike_cycle_depth = 4;};
-
class Y (void|object a) {constant pike_cycle_depth = 0;};
-
X o = X (X(), X());
-
o->a->a = o->b;
-
o->b->a = o->a;
-
o->a->b = o->b->b = Y (Y());
-
return count_memory_stats (0, o);
-
]], [["i:5,c:2,e:0,v:8,r:3,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {constant pike_cycle_depth = 4;};
-
class Y (void|object a) {constant pike_cycle_depth = 0;};
-
X o = X (X(), X());
-
o->a->a = o->b;
-
o->b->a = o->a;
-
o->a->b = o->b->b = Y (Y());
-
o->a->b->a->a = o->a->b;
-
return count_memory_stats (0, o);
-
]], [["i:3,c:2,e:0,v:6,r:3,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
X o2 = X();
-
o->b = o2;
-
o2->a = o->a->a;
-
o2 = 0;
-
return count_memory_stats (2, o);
-
]], [["i:4,c:2,e:0,v:7,r:3,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X (X()));
-
o->a->a->a = o->a;
-
X o2 = X();
-
o->b = o2;
-
o2->a = o->a->a;
-
return count_memory_stats (2, o);
-
]], [["i:1,c:0,e:3,v:9,r:5,rnd:1"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X(), X());
-
o->a->b = o->b;
-
o->b->a = o->a;
-
o->a->a = o->b->b = X();
-
return count_memory_stats (2, o);
-
]], [["i:4,c:3,e:0,v:8,r:4,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X(), X());
-
o->a->b = o->b;
-
o->b->a = o->a;
-
X o2 = X (X(), X());
-
o2->a->b = o2->b;
-
o2->b->a = o2->a;
-
o2->a->a = o2->b->b = X();
-
o->a->a = o->b->b = o2;
-
o2 = 0;
-
return count_memory_stats (1, o);
-
]], [["i:7,c:6,e:0,v:15,r:8,rnd:2"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|object a, void|object b) {};
-
X o = X (X(), X());
-
o->a->b = o->b;
-
o->b->a = o->a;
-
X o2 = X (X(), X());
-
o2->a->b = o2->b;
-
o2->b->a = o2->a;
-
o2->a->a = o2->b->b = X();
-
o->a->a = o->b->b = o2;
-
o2 = o2->b;
-
mapping m = (["lookahead": 1,
-
"collect_stats": 1,
-
"collect_direct_externals": 1]);
-
Pike.count_memory (m, o);
-
//werror ("%O\n", m);
-
return m->internal == 4 && m->cyclic == 3 && m->external == 3 &&
-
equal (m->collect_direct_externals, ({o2}));
-
]], 1)
-
test_any([[
-
mixed r = ([]), p = r;
-
p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = 0;
-
return count_memory_stats (1, r);
-
]], [["i:1,c:0,e:1,v:6,r:2,rnd:1"]])
-
test_any([[
-
mixed r = ([]), p = r;
-
p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = 0;
-
return count_memory_stats (2, r);
-
]], [["i:6,c:5,e:0,v:38,r:26,rnd:2"]])
-
test_any([[
-
mixed r = ([]), p = r;
-
p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = p->next; p->next = ([]); p->next->prev = p;
-
p = 0;
-
return Pike.count_memory ((["lookahead": 2, "return_count": 1]), r);
-
]], 6)
-
test_any([[
-
/* don't save parent */
-
class X (void|array|object a, void|array|object b) {};
-
array a = ({X (X())});
-
object o = a[0];
-
o->a->a = o; o->b = ({X (X())}); o = o->b[0];
-
o->a->a = o; o->b = ({X (X())}); o = o->b[0];
-
o->a->a = o; o->b = ({X (X())}); o = o->b[0];
-
o->a->a = o; o->b = ({X (X())}); o = o->b[0];
-
o->a->a = o; o = 0;
-
return count_memory_stats ((["lookahead": 2, "block_arrays": 1]), a);
-
]], [["i:15,c:10,e:0,v:35,r:20,rnd:6"]])
-
test_any([[
-
/* don't save parent */
-
class X (void|array|object a, void|array|object b) {};
-
array a = ({X (X())});
-
object o = a[0];
-
o->a->a = o; o->a->b = ({X (X())}); o = o->a->b[0];
-
o->a->a = o; o->a->b = ({X (X())}); o = o->a->b[0];
-
o->a->a = o; o->a->b = ({X (X())}); o = o->a->b[0];
-
o->a->a = o; o->a->b = ({X (X())}); o = o->a->b[0];
-
o->a->a = o; o = 0;
-
return count_memory_stats ((["lookahead": 2, "block_arrays": 1]), a);
-
]], [["i:15,c:10,e:0,v:35,r:20,rnd:6"]])
-
test_true([[Pike.count_memory (Int.NATIVE_MAX, ({master()})) ==
-
Pike.count_memory (-1, ({0}))]])
-
test_any([[
-
mapping m = (["lookahead": Int.NATIVE_MAX,
-
"block_programs": 0,
-
"collect_stats": 1]);
-
Pike.count_memory (m, master());
-
return m->rounds;
-
]], 2)
-
test_true([[Pike.count_memory (-1, Int.NATIVE_MAX + 1) >
-
Pike.count_memory (-1, 17)]])
-
test_true([[Pike.count_memory (-1, Int.NATIVE_MAX << 100) >
-
Pike.count_memory (-1, Int.NATIVE_MAX + 1)]])
-
test_do([[add_constant("count_memory_stats")]])
-
-
test_program([[
-
function ff()
-
{
-
array x;
-
array b() {return x;};
-
x = ({b});
-
return b;
-
}
-
-
int a()
-
{
-
function f = ff();
-
int s = Pike.count_memory (0, f());
-
f = 0;
-
gc();
-
return s > 0;
-
}
-
]])
-
-
// Numerical limits.
-
test_true([[Int.NATIVE_MIN <= -2147483648]])
-
test_true([[Int.NATIVE_MAX >= 2147483647]])
-
test_true([[Float.DIGITS_10 >= 6]])
-
test_true([[Float.MIN_10_EXP <= -37]])
-
test_true([[Float.MAX_10_EXP >= 37]])
-
test_true([[Float.MIN <= 1e-37]])
-
test_true([[Float.MAX >= 1e37]])
-
test_true([[Float.EPSILON <= 1e-5]])
-
test_true([[1 <= 1.0]])
-
test_true([[1 >= 1.0]])
-
test_true([[1.0 <= 1]])
-
test_true([[1.0 >= 1]])
-
-
// Test the lexer.
-
test_eq("2147483648", [[ (string)0x80000000 ]])
-
test_eq("2147483649", [[ (string)0x80000001 ]])
-
test_eq("-2147483648", [[ (string)-0x80000000 ]])
-
test_eq("-2147483649", [[ (string)-0x80000001 ]])
-
test_eq("2147483648", [[ (string)-(-0x80000000) ]])
-
test_eq("2147483649", [[ (string)-(-0x80000001) ]])
-
test_eq("9223372036854775808", [[ (string)0x8000000000000000 ]])
-
test_eq("9223372036854775809", [[ (string)0x8000000000000001 ]])
-
test_eq("-9223372036854775808", [[ (string)-0x8000000000000000 ]])
-
test_eq("-9223372036854775809", [[ (string)-0x8000000000000001 ]])
-
test_eq("9223372036854775808", [[ (string)-(-0x8000000000000000) ]])
-
test_eq("9223372036854775809", [[ (string)-(-0x8000000000000001) ]])
-
test_eq("123456789123456789", [[ (string)123456789123456789 ]])
-
test_eq("-123456789123456789", [[ (string)-123456789123456789 ]])
-
test_eq("335812727629498640265", [[ (string)0x123456789123456789 ]])
-
test_eq("-335812727629498640265", [[ (string)-0x123456789123456789 ]])
-
test_eq("718046312823", [[ (string)012345671234567 ]])
-
test_eq("-718046312823", [[ (string)-012345671234567 ]])
-
test_eq("1125899906842624", [[ (string)0b100000000000000000000000000000000000000000000000000 ]])
-
test_eq("-1125899906842624", [[ (string)-0b100000000000000000000000000000000000000000000000000 ]])
-
test_eq(500000000 * 10, 5000000000)
-
test_eq(5000000000000000000 * 10, 50000000000000000000)
-
-
// Numbers that shouldn't be native integers. Has to resort to
-
// strange methods to test this since bignums behave like native
-
// integers in almost every way.
-
test_do([[ Debug.next ((mixed) Int.NATIVE_MAX + 1) ]])
-
test_do([[ Debug.next ((mixed) Int.NATIVE_MIN - 1) ]])
-
-
// These numbers should be native integers.
-
test_eval_error([[ Debug.next ((mixed) -0x80000000) ]])
-
test_eval_error([[ Debug.next ((mixed) -0x7fffffff) ]])
-
test_eval_error([[ Debug.next ((mixed) 0x7fffffff) ]])
-
test_eval_error([[ Debug.next ((mixed) Int.NATIVE_MAX) ]])
-
test_eval_error([[ Debug.next ((mixed) Int.NATIVE_MIN) ]])
-
-
// Test incrementations (FIXME: More cases?).
-
test_eq("2147483648",
-
[[ (string)(class { int f(int x) { x++; return x; } })()->f(0x7fffffff) ]])
-
test_eq("2147483648",
-
[[ (string)(class { int f(int x) { ++x; return x; } })()->f(0x7fffffff) ]])
-
test_eq("2147483648",
-
[[ (string)(class { int x=0x7fffffff;int f() { ++x;return x; } })()->f() ]])
-
test_eq("2147483648",
-
[[ (string)(class { int x=0x7fffffff;int f() { x++;return x; } })()->f() ]])
-
test_eq("2147483648",
-
[[ (string)(class { int f() { int x=0x7fffffff;++x;return x; } })()->f() ]])
-
test_eq("2147483648",
-
[[ (string)(class { int f() { int x=0x7fffffff;x++;return x; } })()->f() ]])
-
test_eq("9223372036854775808",
-
[[ (string)(class { int f(int x) { x++; return x; } })()->f(0x7fffffffffffffff) ]])
-
test_eq("9223372036854775808",
-
[[ (string)(class { int f(int x) { ++x; return x; } })()->f(0x7fffffffffffffff) ]])
-
test_eq("9223372036854775808",
-
[[ (string)(class { int x=0x7fffffffffffffff;int f() { ++x;return x; } })()->f() ]])
-
test_eq("9223372036854775808",
-
[[ (string)(class { int x=0x7fffffffffffffff;int f() { x++;return x; } })()->f() ]])
-
test_eq("9223372036854775808",
-
[[ (string)(class { int f() { int x=0x7fffffffffffffff;++x;return x; } })()->f() ]])
-
test_eq("9223372036854775808",
-
[[ (string)(class { int f() { int x=0x7fffffffffffffff;x++;return x; } })()->f() ]])
-
-
// Test decrementations (FIXME: More cases?).
-
test_eq("-2147483649",
-
[[ (string)(class { int f(int x) { x--; return x; } })()->f(-0x80000000) ]])
-
test_eq("-2147483649",
-
[[ (string)(class { int f(int x) { --x; return x; } })()->f(-0x80000000) ]])
-
test_eq("-2147483649",
-
[[ (string)(class { int x=-0x80000000;int f() { --x;return x; } })()->f()]])
-
test_eq("-2147483649",
-
[[ (string)(class { int x=-0x80000000;int f() { x--;return x; } })()->f()]])
-
test_eq("-2147483649",
-
[[ (string)(class { int f() { int x=-0x80000000;--x;return x; } })()->f()]])
-
test_eq("-2147483649",
-
[[ (string)(class { int f() { int x=-0x80000000;x--;return x; } })()->f()]])
-
test_eq("-9223372036854775809",
-
[[ (string)(class { int f(int x) { x--; return x; } })()->f(-0x8000000000000000) ]])
-
test_eq("-9223372036854775809",
-
[[ (string)(class { int f(int x) { --x; return x; } })()->f(-0x8000000000000000) ]])
-
test_eq("-9223372036854775809",
-
[[ (string)(class { int x=-0x8000000000000000;int f() { --x;return x; } })()->f()]])
-
test_eq("-9223372036854775809",
-
[[ (string)(class { int x=-0x8000000000000000;int f() { x--;return x; } })()->f()]])
-
test_eq("-9223372036854775809",
-
[[ (string)(class { int f() { int x=-0x8000000000000000;--x;return x; } })()->f()]])
-
test_eq("-9223372036854775809",
-
[[ (string)(class { int f() { int x=-0x8000000000000000;x--;return x; } })()->f()]])
-
-
test_encode(1<<99);
-
-
// - Left shift.
-
test_eq("1073741824", [[ (string)(1<<30) ]])
-
test_eq("2147483648", [[ (string)(1<<31) ]])
-
test_eq("4294967296", [[ (string)(1<<32) ]])
-
test_eq("8589934592", [[ (string)(1<<33) ]])
-
test_eq("1267650600228229401496703205376", [[ (string)(1<<100) ]])
-
-
test_eval_error(return 1<<100000000000000000000)
-
test_eval_error(return (-1)<<100000000000000000000)
-
test_eq(0<<100000000000000000000, 0)
-
test_eval_error(return 100000000000000000000<<100000000000000000000)
-
test_eval_error(return (-100000000000000000000)<<100000000000000000000)
-
-
// - Right shift.
-
test_eq("53265209898187398182",
-
[[ (string)((int)"54543574935743895738479">>10) ]])
-
test_false([[ objectp((int)"54543574935743895738479">>60) ]])
-
test_eq(0, [[ 25>>30 ]])
-
test_eq(0, [[ 25>>31 ]])
-
test_eq(0, [[ 25>>32 ]])
-
test_eq(0, [[ 25>>33 ]])
-
-
test_eq(1>>100000000000000000000, 0)
-
test_eq(-1>>100000000000000000000, -1)
-
test_eq(0>>100000000000000000000, 0)
-
test_eq(100000000000000000000>>100000000000000000000, 0)
-
test_eq((-100000000000000000000)>>100000000000000000000, -1)
-
-
// - abs.
-
test_eq("2147483648", [[ (string)abs(-0x80000000) ]])
-
test_eq("2147483648", [[ (string)abs(0x80000000) ]])
-
test_eq("2147483649", [[ (string)abs(0x80000001) ]])
-
test_eq("2147483649", [[ (string)abs(-0x80000001) ]])
-
test_eq("9223372036854775808", [[ (string)abs(-0x8000000000000000) ]])
-
test_eq("9223372036854775808", [[ (string)abs(0x8000000000000000) ]])
-
test_eq("9223372036854775809", [[ (string)abs(0x8000000000000001) ]])
-
test_eq("9223372036854775809", [[ (string)abs(-0x8000000000000001) ]])
-
-
// - Add.
-
test_eq("2147483648", [[ (string)(0x7fffffff + 1) ]])
-
test_eq("2147483649", [[ (string)(0x7fffffff + 2) ]])
-
test_eq("-2147483648", [[ (string)((-0x80000001) + 1) ]])
-
test_eq("9223372036854775808", [[ (string)(0x7fffffffffffffff + 1) ]])
-
test_eq("9223372036854775809", [[ (string)(0x7fffffffffffffff + 2) ]])
-
test_eq("-9223372036854775808", [[ (string)((-0x8000000000000001) + 1) ]])
-
test_eq("2684354560", [[ (string)(0x50000000 + 0x50000000) ]])
-
test_eq("-2684354560", [[ (string)((-0x50000000) + (-0x50000000)) ]])
-
test_false([[ objectp((-0x80000001) + 1) ]])
-
-
// - Add-eq.
-
test_eq([[lambda() { int a=0x100000000; int b = a; a += 1; return b+a; }()]],
-
[[0x200000001]])
-
-
// - Sub.
-
test_eq("-2147483648", [[ (string)(-0x7fffffff - 1) ]])
-
test_eq("-2147483649", [[ (string)(-0x80000000 - 1) ]])
-
test_eq("2147483647", [[ (string)(0x80000000 - 1) ]])
-
test_eq("-9223372036854775808", [[ (string)(-0x7fffffffffffffff - 1) ]])
-
test_eq("-9223372036854775809", [[ (string)(-0x8000000000000000 - 1) ]])
-
test_eq("9223372036854775807", [[ (string)(0x8000000000000000 - 1) ]])
-
test_false([[ objectp(0x80000000 - 1) ]])
-
-
// - Multiplication.
-
test_eq("6442450941", [[ (string)(0x7fffffff * 3) ]])
-
test_eq("-6442450941", [[ (string)(0x7fffffff * -3) ]])
-
test_eq(-2147483648*-1,2147483648)
-
test_eq(-9223372036854775808*-1,9223372036854775808)
-
-
// Division.
-
test_eq("1073741824", [[ (string)((int)"2147483648" / 2) ]])
-
test_false([[ objectp((int)"2147483648" / 2) ]])
-
test_eq("13934998268672547360069539025",
-
[[ (string)(48324683476346278246238462784624627348 / 3467864333) ]])
-
-
// - sscanf.
-
test_eq("12345678901234567890",
-
[[ (string)array_sscanf("12345678901234567890", "%d")[0] ]])
-
test_eq("1375488932614371410344080",
-
[[ (string)array_sscanf("123456789F01234567890", "%x")[0] ]])
-
test_eq("1375488932614371410344080",
-
[[ (string)array_sscanf("0x123456789F01234567890", "%x")[0] ]])
-
test_eq("1375488932614371410344080",
-
[[ (string)array_sscanf("0X123456789F01234567890", "%x")[0] ]])
-
test_eq("1375488932614371410344080",
-
[[ (string)array_sscanf("0x123456789F01234567890", "%i")[0] ]])
-
test_eq("1375488932614371410344080",
-
[[ (string)array_sscanf("0X123456789F01234567890", "%i")[0] ]])
-
test_eq("45954944846776",
-
[[ (string)array_sscanf("1234567012345670", "%o")[0] ]])
-
test_eq("45954944846776",
-
[[ (string)array_sscanf("01234567012345670", "%i")[0] ]])
-
test_eq("11", [[ (string)array_sscanf("1011", "%b")[0] ]])
-
test_eq("1125968643114208", [[ (string)array_sscanf("100000000000001000000000001000000000100010011100000", "%b")[0] ]])
-
test_eq("11", [[ (string)array_sscanf("0b1011", "%i")[0] ]])
-
test_eq("1125968643114208", [[ (string)array_sscanf("0b100000000000001000000000001000000000100010011100000", "%i")[0] ]])
-
-
test_eq("-12345678901234567890",
-
[[ (string)array_sscanf("-12345678901234567890", "%d")[0] ]])
-
test_eq("-1375488932614371410344080",
-
[[ (string)array_sscanf("-123456789F01234567890", "%x")[0] ]])
-
test_eq("-1375488932614371410344080",
-
[[ (string)array_sscanf("-0x123456789F01234567890","%i")[0] ]])
-
test_eq("-45954944846776",
-
[[ (string)array_sscanf("-1234567012345670", "%o")[0] ]])
-
test_eq("-45954944846776",
-
[[ (string)array_sscanf("-01234567012345670", "%i")[0] ]])
-
test_eq("-11", [[ (string)array_sscanf("-1011", "%b")[0] ]])
-
test_eq("-1125968643114208", [[ (string)array_sscanf("-100000000000001000000000001000000000100010011100000", "%b")[0] ]])
-
test_eq("-11", [[ (string)array_sscanf("-0b1011", "%i")[0] ]])
-
test_eq("-1125968643114208", [[ (string)array_sscanf("-0b100000000000001000000000001000000000100010011100000", "%i")[0] ]])
-
-
test_eq([[ sprintf("%x", @array_sscanf("\0\0\0\0\1\2\3\4", "%4c")) ]], "0")
-
test_eq([[ sprintf("%x", @array_sscanf("\0\0\0\0\1\2\3\4", "%8c")) ]], "1020304")
-
test_eq([[ sprintf("%08x", @array_sscanf("\0\0\0\0\1\2\3\4", "%8c")) ]], "01020304")
-
test_eq([[ sprintf("%08x", @array_sscanf("\0\0\0\5\1\2\3\4", "%8c")) ]], "501020304")
-
test_eq([[ sprintf("%08x", @array_sscanf("\0\0\6\5\1\2\3\4", "%8c")) ]], "60501020304")
-
test_eq([[ sprintf("%08x", @array_sscanf("\0\7\6\5\1\2\3\4", "%8c")) ]], "7060501020304")
-
test_eq([[ sprintf("%08x", @array_sscanf("8\7\6\5\1\2\3\4", "%8c")) ]], "3807060501020304")
-
test_eq([[ sprintf("%08x", @array_sscanf("\010\7\6\5\1\2\3\4", "%8c")) ]], "807060501020304")
-
-
test_equal([[ ({ 118 }) ]], [[ array_sscanf("0x76", "%x") ]])
-
test_equal([[ ({42 }) ]], [[ array_sscanf("101010", "%b") ]])
-
test_equal([[ ({42 }) ]], [[ array_sscanf("0b101010", "%b") ]])
-
test_equal([[ ({42 }) ]], [[ array_sscanf("0B101010", "%b") ]])
-
test_equal([[ ({ 557239244978618154304871 }) ]],
-
[[ array_sscanf("0x76000000000001234567", "%x") ]])
-
-
test_equal([[array_sscanf("foo \12345 bar <fie>","%[^<]")]],
-
[[ ({"foo \12345 bar " }) ]])
-
-
test_equal(471100000000000000000000000000000000000000000000042,
-
(int)(mixed)471100000000000000000000000000000000000000000000042)
-
test_eq(6745697846498645967,
-
[[ (int)Gmp.mpz("6745697846498645967") ]])
-
-
test_eq(0x7fffffff, [[ decode_value(encode_value(0x7fffffff)) ]])
-
test_eq(0x7ffffffff, [[ decode_value(encode_value(0x7ffffffff)) ]])
-
test_eq(0x7fffffffff, [[ decode_value(encode_value(0x7fffffffff)) ]])
-
test_eq(0x7ffffffffff, [[ decode_value(encode_value(0x7ffffffffff)) ]])
-
test_eq(0x7fffffffffff, [[ decode_value(encode_value(0x7fffffffffff)) ]])
-
test_eq(0x7ffffffffffff, [[ decode_value(encode_value(0x7ffffffffffff)) ]])
-
test_eq(0x80000000, [[ decode_value(encode_value(0x80000000)) ]])
-
test_eq(0x800000000, [[ decode_value(encode_value(0x800000000)) ]])
-
test_eq(0x8000000000, [[ decode_value(encode_value(0x8000000000)) ]])
-
test_eq(0x80000000000, [[ decode_value(encode_value(0x80000000000)) ]])
-
test_eq(0x800000000000, [[ decode_value(encode_value(0x800000000000)) ]])
-
test_eq(0x8000000000000, [[ decode_value(encode_value(0x8000000000000)) ]])
-
test_eq(0x12345678, [[ decode_value(encode_value(0x12345678)) ]])
-
test_eq(0x123456780, [[ decode_value(encode_value(0x123456780)) ]])
-
test_eq(0x1234567801, [[ decode_value(encode_value(0x1234567801)) ]])
-
test_eq(0x12345678012, [[ decode_value(encode_value(0x12345678012)) ]])
-
test_eq(0x123456780123, [[ decode_value(encode_value(0x123456780123)) ]])
-
test_eq(0x1234567801234, [[ decode_value(encode_value(0x1234567801234)) ]])
-
-
test_eq(-0x7fffffff, [[ decode_value(encode_value(-0x7fffffff)) ]])
-
test_eq(-0x7ffffffff, [[ decode_value(encode_value(-0x7ffffffff)) ]])
-
test_eq(-0x7fffffffff, [[ decode_value(encode_value(-0x7fffffffff)) ]])
-
test_eq(-0x7ffffffffff, [[ decode_value(encode_value(-0x7ffffffffff)) ]])
-
test_eq(-0x7fffffffffff, [[ decode_value(encode_value(-0x7fffffffffff)) ]])
-
test_eq(-0x7ffffffffffff, [[ decode_value(encode_value(-0x7ffffffffffff))]])
-
test_eq(-0x80000000, [[ decode_value(encode_value(-0x80000000)) ]])
-
test_eq(-0x800000000, [[ decode_value(encode_value(-0x800000000)) ]])
-
test_eq(-0x8000000000, [[ decode_value(encode_value(-0x8000000000)) ]])
-
test_eq(-0x80000000000, [[ decode_value(encode_value(-0x80000000000)) ]])
-
test_eq(-0x800000000000, [[ decode_value(encode_value(-0x800000000000)) ]])
-
test_eq(-0x8000000000000, [[ decode_value(encode_value(-0x8000000000000))]])
-
test_eq(-0x12345678, [[ decode_value(encode_value(-0x12345678)) ]])
-
test_eq(-0x123456780, [[ decode_value(encode_value(-0x123456780)) ]])
-
test_eq(-0x1234567801, [[ decode_value(encode_value(-0x1234567801)) ]])
-
test_eq(-0x12345678012, [[ decode_value(encode_value(-0x12345678012)) ]])
-
test_eq(-0x123456780123, [[ decode_value(encode_value(-0x123456780123)) ]])
-
test_eq(-0x1234567801234, [[ decode_value(encode_value(-0x1234567801234))]])
-
-
test_eval_error([[ Debug.next ((mixed) decode_value (encode_value (Int.NATIVE_MAX))) ]])
-
test_eval_error([[ Debug.next ((mixed) decode_value (encode_value (Int.NATIVE_MIN))) ]])
-
test_do([[ Debug.next ((mixed) decode_value (encode_value (Int.NATIVE_MAX + 1))) ]])
-
test_do([[ Debug.next ((mixed) decode_value (encode_value (Int.NATIVE_MIN - 1))) ]])
-
test_eq(2147483648, -2147483648/-1)
-
test_eq(2147483648, -2147483648*-1)
-
-
test_true([[ sqrt(0x7fffffff)+1 ]])
-
test_true([[ sqrt(0x7ffffffff)+1 ]])
-
-
test_true([[ catch { destruct((mixed)0x4783647824687234628462); } ]])
-
-
test_any_equal([[
-
array a = ({4711, 0x54325827a124*0x12348795482485425});
-
set_weak_flag (a, 1);
-
gc();
-
return set_weak_flag(a, 0);
-
]], [[ ({4711, 0x54325827a124*0x12348795482485425}) ]])
-
-
test_any_equal([[
-
mapping m = ([
-
4711: 0x54325827a124*0x12348795482485425,
-
0x54325827124*0x1234879548a2485425: 1174,
-
]);
-
set_weak_flag (m, 1);
-
gc();
-
return set_weak_flag(m, 0);
-
]], [[ ([
-
4711: 0x54325827a124*0x12348795482485425,
-
0x54325827124*0x1234879548a2485425: 1174,
-
]) ]])
-
-
test_any([[int a=2147483648; a=a+17; return a]], 2147483665)
-
test_any([[int a=2147483648; a=a-17; return a]], 2147483631)
-
test_any([[int a=2147483648; a=a*17; return a]], 36507222016)
-
test_any([[int a=2147483648; a=a/17; return a]], 126322567)
-
test_any([[int a=2147483648; a=a%17; return a]], 9)
-
test_any([[int a=2147483648; a=a^17; return a]], 2147483665)
-
test_any([[int a=2147483648; a=a&17; return a]], 0)
-
test_any([[int a=2147483648; a=a|17; return a]], 2147483665)
-
test_any([[int a=2147483648; a=a<<17; return a]], 281474976710656)
-
test_any([[int a=2147483648; a=a>>17; return a]], 16384)
-
-
test_eq([[2147483648+17 ]], 2147483665)
-
test_eq([[2147483648-17 ]], 2147483631)
-
test_eq([[2147483648*17 ]], 36507222016)
-
test_eq([[2147483648/17 ]], 126322567)
-
test_eq([[2147483648%17 ]], 9)
-
test_eq([[2147483648^17 ]], 2147483665)
-
test_eq([[2147483648&17 ]], 0)
-
test_eq([[2147483648|17 ]], 2147483665)
-
test_eq([[2147483648<<17]], 281474976710656)
-
test_eq([[2147483648>>17]], 16384)
-
-
test_true([[ floatp((1<<99)/3.14) ]]);
-
test_true([[ floatp((1<<99)*3.14) ]]);
-
test_true([[ floatp((1<<99)-3.14) ]]);
-
test_true([[ floatp((1<<99)+3.14) ]]);
-
-
test_eq([[(12)+(3)]],0xf);
-
test_eq([[(12)+(3*(1<<32))]],0x30000000c);
-
test_eq([[(12)+(3*(1<<64))]],0x3000000000000000c);
-
test_eq([[(12)+(3*(1<<128))]],0x30000000000000000000000000000000c);
-
test_eq([[(12*(1<<32))+(3)]],0xc00000003);
-
test_eq([[(12*(1<<32))+(3*(1<<32))]],0xf00000000);
-
test_eq([[(12*(1<<32))+(3*(1<<64))]],0x30000000c00000000);
-
test_eq([[(12*(1<<32))+(3*(1<<128))]],0x300000000000000000000000c00000000);
-
test_eq([[(12*(1<<64))+(3)]],0xc0000000000000003);
-
test_eq([[(12*(1<<64))+(3*(1<<32))]],0xc0000000300000000);
-
test_eq([[(12*(1<<64))+(3*(1<<64))]],0xf0000000000000000);
-
test_eq([[(12*(1<<64))+(3*(1<<128))]],0x3000000000000000c0000000000000000);
-
test_eq([[(12*(1<<128))+(3)]],0xc00000000000000000000000000000003);
-
test_eq([[(12*(1<<128))+(3*(1<<32))]],0xc00000000000000000000000300000000);
-
test_eq([[(12*(1<<128))+(3*(1<<64))]],0xc00000000000000030000000000000000);
-
test_eq([[(12*(1<<128))+(3*(1<<128))]],0xf00000000000000000000000000000000);
-
test_eq([[(12)-(3)]],0x9);
-
test_eq([[(12)-(3*(1<<32))]],-0x2fffffff4);
-
test_eq([[(12)-(3*(1<<64))]],-0x2fffffffffffffff4);
-
test_eq([[(12)-(3*(1<<128))]],-0x2fffffffffffffffffffffffffffffff4);
-
test_eq([[(12*(1<<32))-(3)]],0xbfffffffd);
-
test_eq([[(12*(1<<32))-(3*(1<<32))]],0x900000000);
-
test_eq([[(12*(1<<32))-(3*(1<<64))]],-0x2fffffff400000000);
-
test_eq([[(12*(1<<32))-(3*(1<<128))]],-0x2fffffffffffffffffffffff400000000);
-
test_eq([[(12*(1<<64))-(3)]],0xbfffffffffffffffd);
-
test_eq([[(12*(1<<64))-(3*(1<<32))]],0xbfffffffd00000000);
-
test_eq([[(12*(1<<64))-(3*(1<<64))]],0x90000000000000000);
-
test_eq([[(12*(1<<64))-(3*(1<<128))]],-0x2fffffffffffffff40000000000000000);
-
test_eq([[(12*(1<<128))-(3)]],0xbfffffffffffffffffffffffffffffffd);
-
test_eq([[(12*(1<<128))-(3*(1<<32))]],0xbfffffffffffffffffffffffd00000000);
-
test_eq([[(12*(1<<128))-(3*(1<<64))]],0xbfffffffffffffffd0000000000000000);
-
test_eq([[(12*(1<<128))-(3*(1<<128))]],0x900000000000000000000000000000000);
-
-
test_eq([[(12)*(3)]],0x24);
-
test_eq([[(12)*(3*(1<<32))]],0x2400000000);
-
test_eq([[(12)*(3*(1<<64))]],0x240000000000000000);
-
test_eq([[(12)*(3*(1<<128))]],0x2400000000000000000000000000000000);
-
test_eq([[(12*(1<<32))*(3)]],0x2400000000);
-
test_eq([[(12*(1<<32))*(3*(1<<32))]],0x240000000000000000);
-
test_eq([[(12*(1<<32))*(3*(1<<64))]],0x24000000000000000000000000);
-
test_eq([[(12*(1<<32))*(3*(1<<128))]],0x240000000000000000000000000000000000000000);
-
test_eq([[(12*(1<<64))*(3)]],0x240000000000000000);
-
test_eq([[(12*(1<<64))*(3*(1<<32))]],0x24000000000000000000000000);
-
test_eq([[(12*(1<<64))*(3*(1<<64))]],0x2400000000000000000000000000000000);
-
test_eq([[(12*(1<<64))*(3*(1<<128))]],0x24000000000000000000000000000000000000000000000000);
-
test_eq([[(12*(1<<128))*(3)]],0x2400000000000000000000000000000000);
-
test_eq([[(12*(1<<128))*(3*(1<<32))]],0x240000000000000000000000000000000000000000);
-
test_eq([[(12*(1<<128))*(3*(1<<64))]],0x24000000000000000000000000000000000000000000000000);
-
test_eq([[(12*(1<<128))*(3*(1<<128))]],0x240000000000000000000000000000000000000000000000000000000000000000);
-
test_eq([[(12)/(3)]],0x4);
-
test_eq([[(12)/(3*(1<<32))]],0x0);
-
test_eq([[(12)/(3*(1<<64))]],0x0);
-
test_eq([[(12)/(3*(1<<128))]],0x0);
-
test_eq([[(12*(1<<32))/(3*(1<<32))]],0x4);
-
test_eq([[(12*(1<<32))/(3*(1<<64))]],0x0);
-
test_eq([[(12*(1<<32))/(3*(1<<128))]],0x0);
-
test_eq([[(12*(1<<64))/(3*(1<<64))]],0x4);
-
test_eq([[(12*(1<<64))/(3*(1<<128))]],0x0);
-
test_eq([[(12*(1<<128))/(3*(1<<128))]],0x4);
-
test_eq([[(17+12)%(3)]],0x2);
-
test_eq([[(17+12)%(3*(1<<32))]],0x1d);
-
test_eq([[(17+12)%(3*(1<<64))]],0x1d);
-
test_eq([[(17+12)%(3*(1<<128))]],0x1d);
-
test_eq([[(17+12*(1<<32))%(3*(1<<32))]],0x11);
-
test_eq([[(17+12*(1<<32))%(3*(1<<64))]],0xc00000011);
-
test_eq([[(17+12*(1<<32))%(3*(1<<128))]],0xc00000011);
-
test_eq([[(17+12*(1<<64))%(3*(1<<64))]],0x11);
-
test_eq([[(17+12*(1<<64))%(3*(1<<128))]],0xc0000000000000011);
-
test_eq([[(17+12*(1<<128))%(3*(1<<128))]],0x11);
-
-
test_eq([[Gmp.mpz(68719476736)/Gmp.mpz(12884901888)]],5);
-
test_eq([[Gmp.mpz(123456789012345678901234567890)/Gmp.mpz(12884901888)]],
-
Gmp.mpz(9581507883061474724));
-
test_eq([[Gmp.mpz(123456789012345678901234567890)/
-
Gmp.mpz(67890123456789012345)]],1818479371);
-
test_eq([[Gmp.mpz(123456789012345678901234567890)/
-
Gmp.mpz(67890123456789)]],Gmp.mpz(1818479371169857));
-
-
test_any([[int a=10->pow(30); int b=1000000000000000000000000000000;
-
return ([a:1])[b]]],1);
-
test_any([[int a=10->pow(30); int b=1000000000000000000000000000000;
-
return (<a>)[b]]],1);
-
test_any([[int a=10->pow(30); int b=1000000000000000000000000000000;
-
return sizeof( ({a})-({b}) )]],0);
-
test_any([[int a=10->pow(30); int b=1000000000000000000000000000000;
-
return sizeof( ({a})&({b}) )]],1);
-
test_any([[int k=10->pow(30);
-
array a=({k+17,k+16,k+13,k+14,k+12,k,k+9});
-
return sort(a)[0]==k && sort(a)[-1]==k+17]],1)
-
-
test_do([[
-
// This is a memleak test
-
rm("testsuite_test.pike");
-
Stdio.write_file("testsuite_test.pike",
-
"constant Q=10000000000000000;\n"
-
"int main() {}\n");
-
Process.system(RUNPIKE +" testsuite_test.pike");
-
rm("testsuite_test.pike");
-
]])
-
-
// test the corresponding integer operations first
-
test_any([[int k=100; int j=k+1;
-
array a=({k+17,k+16,k+13,k+14,k+12,k,k+9});
-
array b=({j+16,j+15,j+12,j+13,j+11,j-1,j+8});
-
return sizeof( a&b )]],7);
-
test_any([[int k=100; int j=k+1;
-
array a=({k+17,k+16,k+13,k+14,k+12,k,k+9});
-
array b=({j+13,j+11,j-1,j+8,j+16,j+15,j+12});
-
return sizeof( a-b )]],0);
-
-
// now the bignum ones
-
test_any([[int k=10->pow(30); int j=k+1;
-
array a=({k+17,k+16,k+13,k+14,k+12,k,k+9});
-
array b=({j+16,j+15,j+12,j+13,j+11,j-1,j+8});
-
return sizeof( a&b )]],7);
-
test_any([[int k=10->pow(30); int j=k+1;
-
array a=({k+17,k+16,k+13,k+14,k+12,k,k+9});
-
array b=({j+13,j+11,j-1,j+8,j+16,j+15,j+12});
-
return sizeof( a-b )]],0);
-
-
ifefun(_verify_internals,
-
[[
-
test_do(_verify_internals())
-
]])
-
-
test_eq("\377"[0],255)
-
test_do(add_constant("foo",class {int i;}()))
-
test_eq(foo->i,0)
-
test_do(foo->i=17)
-
test_eq(foo->i,17)
-
test_do(add_constant("foo"));
-
test_do(add_constant("foo",class {array(int) i=({0});}()))
-
test_eq(foo->i[0],0)
-
test_do(foo->i[0]=17)
-
test_eq(foo->i[0],17)
-
test_do(add_constant("foo"));
-
-
// signum, signame
-
test_true(intp(signum("SIGKILL")))
-
-
// kill, signal, getpid
-
test_true(intp(getpid()))
-
cond([[all_constants()->kill && (cpp("__NT__")/"\n")[1]=="__NT__" ]],
-
[[
-
test_do(signal(signum("SIGFPE"),lambda() { add_constant("AFJLLAF",17); }))
-
test_do(kill(getpid(),signum("SIGFPE")))
-
test_do(sleep(2))
-
test_eq(AFJLLAF,17)
-
test_do(add_constant("AFJLLAF"))
-
test_do(signal(signum("SIGFPE"), 0))
-
test_do(signal(signum("SIGFPE")))
-
]])
-
-
// typeof
-
test_eq(sprintf("%O", typeof(1)),"int(1..1)")
-
test_eq(sprintf("%O", typeof("")),"string(zero)")
-
ignore_warning("Indexing the empty string.", [[
-
test_aq([[ sprintf("%O", typeof(""[0])) ]], "zero")
-
]])
-
test_eq(sprintf("%O", typeof(0.0)),"float")
-
test_eq(sprintf("%O", typeof(all_constants()["all_constants"])),"mixed")
-
-
// _typeof
-
test_eq(sprintf("%O", _typeof(1)),"int(1..1)")
-
test_eq(sprintf("%O", _typeof("")),"string(zero)")
-
test_eq(sprintf("%O", _typeof("x"[0])),"int(120..120)")
-
test_eq(sprintf("%O", _typeof(0.0)),"float")
-
test_eq([[sscanf(sprintf("%Ox", _typeof(this_object))-" ",
-
"function(void|int(0..%*[0-9]):object)%*c")]], 2)
-
-
-
// class
-
test_true(programp(class {}))
-
test_true(functionp(class { int foo() { return 1; }}()->foo))
-
test_true(class { int foo() { return 1; }}()->foo())
-
test_true(class { int i=1; }()->i)
-
test_false(class { int foo() { return 1; }}()->bar)
-
test_eq(class { program foo = class { int i=20; }; }()->foo()->i,20)
-
-
// class()
-
test_true(programp(class (){}))
-
test_equal(indices(class (string a,protected int b){}("foo",0)), ({"a"}))
-
test_equal(values(class (string a,protected int b){}("foo",0)), ({"foo"}))
-
test_true(programp(class (string ... a){}))
-
test_equal(indices(class (string a,protected int ... b){}("foo",0)), ({"a"}))
-
test_equal(values(class (protected string a, int ... b){}("foo",0)), ({({0})}))
-
-
test_do([[
-
class A (int i) {};
-
class B (int i, int j) {inherit A;};
-
class C {inherit B;};
-
C (1,1);
-
]])
-
-
// type checks
-
test_compile_error([[} int foo() { return]]);
-
test_compile_error([[} void foo() { return 1]]);
-
test_compile([[mapping a; int b; a = b = 0;]]);
-
test_compile_error([[mapping a; int b; a = b = 1;]]);
-
test_compile_any([[void a(int q){} void b(function(int:void) f){} void c(){b(a);}]]);
-
test_compile_error_any([[void a(int i){} void b(function(:void) f){} void c(){b(a);}]]);
-
test_compile_any([[void a(){} function(int:void) b = a;]]);
-
test_compile_error_any([[void a(int i){} function(:void) b = a;]]);
-
-
// Duplicate local variable
-
test_compile_error([[void f() {int i; int i;}]]);
-
test_compile_error([[void f() {int i; mapping i;}]]);
-
test_compile_error([[void f() {int i; void i() {};}]]);
-
test_compile_error([[void f (int i) {string i;}]]);
-
-
// Not yet cataloged
-
test_any(int i=10; { int i=0; } return i, 10)
-
test_program(void foo(int a, int b){} function(int,int:void) a() { return foo; })
-
test_program(void foo(int a, int ... b){} function(int,int ...:void) a() { return foo; })
-
test_program(void foo(){} function(:void) a() { return foo; })
-
test_compile_error([[} void foo(){} function(:string) a() { return foo;]])
-
-
test_do(lambda(){return;}())
-
test_equal( ({ lambda() { return 3; } , lambda() { return 7; }, lambda() { return 9; } })(), ({ 3,7,9 }))
-
test_any(array(int) a=({10}); a[0]++; return a[0], 11)
-
test_any(mapping a=([10:11]); a[10]++; return a[10], 12)
-
test_equal(mkmapping( ({3,6,2}), ({"3","6","2"})), ([3:"3", 6:"6", 2:"2"]))
-
test_equal(`+(([3:"3", 6:"6", 2:"2"])), ([3:"3", 6:"6", 2:"2"]))
-
test_true(`+(([3:"3", 6:"6", 2:"2"])) != ([3:"3", 6:"6", 2:"2"]))
-
-
test_true(predef::stringp(""))
-
test_equal([["a,b,4,7,8s,asfd,a,d,f" / ","]],[["a,b,4,7,8s,asfd,a,d,f" / ","]])
-
test_any([[array(string) a="a,b"/","; a[0]="c"; return equal(a,({"c","b"}))]],1)
-
test_true(0||1)
-
test_true(1||0)
-
test_true(!0||!0)
-
test_true(!0&&!0)
-
test_any(mixed a=1; a+=1; return a,2)
-
test_any(mixed a=1; a-=1; return a,0)
-
test_equal("abcd"/"" - indices("abcd"),({"a","b","c","d"}))
-
test_equal("abcd"/"" & indices("abcd"),({}))
-
test_eq(sizeof("abcd"/"" & "de"/""),1)
-
test_equal( ({0,0,0,0,0}), ({0,0,0,0,0}))
-
test_equal( ({"object","object","object","object","object"}), allocate(5,"object"))
-
test_equal(mkmapping("abcd"/"","jklm"/"") | mkmapping("jclm"/"","alcd"/""),
-
mkmapping("abcdjlm"/"","jklmacd"/""))
-
test_program(int foo() { return 17;} mixed a() { return foo() == 17; })
-
test_any([[mixed a; a=2; a=a*3; return a]],6)
-
test_any([[mixed a = ({1}); a=a+({2}); return equal(a,({1,2}))]],1)
-
test_define_program(test,[[int foo() { return 17; }]])
-
test_any(function bar=test()->foo; return bar(),17)
-
test_do(add_constant("test"))
-
-
// sscanf
-
test_any([[mixed a; return sscanf("11","%d",a)]],1)
-
test_any([[return sscanf("11","%*d")]],1)
-
test_any([[mixed a; return sscanf("11","_%d",a)]],0)
-
test_any([[mixed a,b,c; return sscanf("11","%1d%1d%1d",a,b,c)]],2)
-
-
test_any([[mixed a; sscanf("11","%b",a); return a]],0b11)
-
test_any([[mixed a; sscanf("11","%d",a); return a]],11)
-
test_any([[mixed a; sscanf("11","%o",a); return a]],011)
-
test_any([[mixed a; sscanf("11","%x",a); return a]],0x11)
-
test_any([[mixed a; sscanf("11","%D",a); return a]],11)
-
-
test_any([[mixed a; sscanf("11","%2b",a); return a]],0b11)
-
test_any([[mixed a; sscanf("11","%2d",a); return a]],11)
-
test_any([[mixed a; sscanf("11","%2o",a); return a]],011)
-
test_any([[mixed a; sscanf("11","%2x",a); return a]],0x11)
-
test_any([[mixed a; sscanf("11","%2D",a); return a]],11)
-
-
test_any([[mixed a; sscanf("11","%4711b",a); return a]],0b11)
-
test_any([[mixed a; sscanf("11","%4711d",a); return a]],11)
-
test_any([[mixed a; sscanf("11","%4711o",a); return a]],011)
-
test_any([[mixed a; sscanf("11","%4711x",a); return a]],0x11)
-
test_any([[mixed a; sscanf("11","%4711D",a); return a]],11)
-
-
test_any([[mixed a; sscanf("11","%1b",a); return a]],1)
-
test_any([[mixed a; sscanf("11","%1d",a); return a]],1)
-
test_any([[mixed a; sscanf("11","%1o",a); return a]],1)
-
test_any([[mixed a; sscanf("11","%1x",a); return a]],1)
-
test_any([[mixed a; sscanf("11","%1D",a); return a]],1)
-
-
test_any([[mixed a; sscanf("0x11","%D",a); return a]],0x11)
-
test_any([[mixed a; sscanf("011","%D",a); return a]],011)
-
test_any([[mixed a; return sscanf("11foo","%dfoo",a)]],1)
-
test_any([[mixed a; sscanf("11foo","%dfoo",a); return a]],11)
-
test_any([[mixed a,b; return sscanf("11foo","%d%s",a,b)]],2)
-
test_any([[mixed a,b; sscanf("11foo","%d%s",a,b); return b]],"foo")
-
test_any([[mixed a,b; return sscanf("foo","%c%s",b,a)]],2)
-
test_any([[mixed a,b; sscanf("foo","%c%s",b,a); return b]],'f')
-
test_any([[mixed a,b; sscanf("foo","%c%s",b,a); return a]],"oo")
-
test_any([[mixed a; return sscanf("1.0","%f",a),a]],1.0)
-
test_any([[mixed a; return sscanf("-1.0","%f",a),a]],-1.0)
-
test_any([[mixed a; return sscanf("1.25","%f",a),a]],1.25)
-
test_any([[mixed a; return sscanf("-1.25","%f",a),a]],-1.25)
-
test_any([[mixed a; return sscanf("1.25e3","%f",a),a]],1.25e3)
-
test_any([[mixed a; return sscanf("-1.25e3","%f",a),a]],-1.25e3)
-
test_any([[mixed a; return sscanf("1.25e-3","%f",a),a]],1.25e-3)
-
test_any([[mixed a; return sscanf("-1.25e-3","%f",a),a]],-1.25e-3)
-
test_any([[mixed a; sscanf("1.0","%f",a); return a]],1.0)
-
test_any([[mixed a,b; sscanf("-z ","%[-z]%s",a,b); return a]],"-z")
-
test_any([[mixed a,b; sscanf("-z ","%[z-]%s",a,b); return a]],"-z")
-
test_any([[mixed a,b; sscanf("abcdeFGji","%[a-z]%s",a,b); return a]],"abcde")
-
test_any([[mixed a,b; sscanf("abcdeFGji","%[a-z]%s",a,b); return b]],"FGji")
-
-
test_any([[mixed a,b; return sscanf("foo-%-bar","%s-%%-%s",a,b);]],2)
-
test_any([[mixed a,b; sscanf("foo-%-bar","%s-%%-%s",a,b); return a]],"foo")
-
test_any([[mixed a,b; sscanf("foo-%-bar","%s-%%-%s",a,b); return b]],"bar")
-
test_any([[mixed a; sscanf("ab","%2c",a); return a]],'a'*256+'b')
-
test_any([[mixed a; sscanf("abc","%3c",a); return a]],'a'*256*256+'b'*256+'c')
-
test_any([[mixed a; sscanf("abc","%2c",a); return a]],'a'*256+'b')
-
test_any([[mixed a; sscanf("ac","%3c",a); return a]],0)
-
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_any([[
-
string y = "32";
-
{
-
string foo = "bar";
-
}
-
if (1 || sscanf(y, "%d", int x)) return !x;
-
]], 1)
-
-
define(test_sscanf, [[
-
test_any([[$1 a = $3, b; string s = sprintf($2, a); sscanf(s, $2, b); return s == sprintf($2, b);]], 1)
-
]])
-
define(test_sscanf_F, [[
-
test_sscanf(float, "%8F", $1)
-
test_sscanf(float, "%-8F", $1)
-
test_sscanf(float, "%4F", $1)
-
test_sscanf(float, "%-4F", $1)
-
]])
-
test_sscanf_F(Math.e)
-
test_sscanf_F(Math.pi)
-
test_sscanf_F(Math.nan)
-
test_sscanf_F(Math.inf)
-
-
test_any([[mixed a; sscanf("\102\052\100\000","%F",a); return a]],42.5625)
-
test_any([[mixed a; sscanf("\102\052\100\000","%4F",a); return a]],42.5625)
-
test_any([[mixed a; sscanf("\100\105\110\000\0\0\0\0","%8F",a); return a]],42.5625)
-
test_any([[mixed a; sscanf("\275\007\053\002","%4F",a); return a]],-0.032999999821186065673828125)
-
test_any([[mixed a; sscanf("\277\240\345\140\100\0\0\0","%8F",a); return a]],-0.032999999821186065673828125)
-
-
// Inf
-
test_any([[mixed a; sscanf("\177\200\0\0","%4F",a); return a>0.0]],1)
-
test_any([[mixed a; sscanf("\177\200\0\0","%4F",a); return (a/2)==a]],1)
-
// -Inf
-
test_any([[mixed a; sscanf("\377\200\0\0","%4F",a); return a<0.0]],1)
-
test_any([[mixed a; sscanf("\377\200\0\0","%4F",a); return (a/2)==a]],1)
-
// NaN
-
test_any([[mixed a; sscanf("\177\300\0\0","%4F",a); return a>0.0]],0)
-
test_any([[mixed a; sscanf("\177\300\0\0","%4F",a); return a<0.0]],0)
-
test_any([[mixed a; sscanf("\177\300\0\0","%4F",a); return a==0.0]],0)
-
// -NaN
-
test_any([[mixed a; sscanf("\377\300\0\0","%4F",a); return a>0.0]],0)
-
test_any([[mixed a; sscanf("\377\300\0\0","%4F",a); return a<0.0]],0)
-
test_any([[mixed a; sscanf("\377\300\0\0","%4F",a); return a==0.0]],0)
-
-
// Inf
-
test_any([[mixed a; sscanf("\177\360\0\0\0\0\0\0","%8F",a); return a>0.0]],1)
-
test_any([[mixed a; sscanf("\177\360\0\0\0\0\0\0","%8F",a); return(a/2)==a]],1)
-
// -Inf
-
test_any([[mixed a; sscanf("\377\360\0\0\0\0\0\0","%8F",a); return a<0.0]],1)
-
test_any([[mixed a; sscanf("\377\360\0\0\0\0\0\0","%8F",a); return(a/2)==a]],1)
-
// NaN
-
test_any([[mixed a; sscanf("\177\370\0\0\0\0\0\0","%8F",a); return a>0.0]],0)
-
test_any([[mixed a; sscanf("\177\370\0\0\0\0\0\0","%8F",a); return a<0.0]],0)
-
test_any([[mixed a; sscanf("\177\370\0\0\0\0\0\0","%8F",a); return a==0.0]],0)
-
// -NaN
-
test_any([[mixed a; sscanf("\377\370\0\0\0\0\0\0","%8F",a); return a>0.0]],0)
-
test_any([[mixed a; sscanf("\377\370\0\0\0\0\0\0","%8F",a); return a<0.0]],0)
-
test_any([[mixed a; sscanf("\377\370\0\0\0\0\0\0","%8F",a); return a==0.0]],0)
-
-
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"})]])
-
test_equal([[array_sscanf("abc","%{%c%}")]],[[ ({ ({ ({'a'}), ({'b'}), ({'c'}) }) }) ]])
-
-
test_equal([[array_sscanf("\x7fffffab#", "%c%c")]], [[ ({ 0x7fffffab, '#' }) ]])
-
test_equal([[array_sscanf("\x7fffffab#", "%1c%1c")]], [[ ({ }) ]])
-
-
test_true([[array_sscanf("(02323) 23455 344","%{%*[^0-9]%[0-9]%}")]])
-
-
test_eq([[ array_sscanf(sprintf("%4c",16909060),"%4c")[0] ]],16909060)
-
test_eq([[ array_sscanf(sprintf("%-4c",16909060),"%-4c")[0] ]],16909060)
-
test_eq([[ array_sscanf(sprintf("%4c",16909060),"%+4c")[0] ]],16909060)
-
test_eq([[ array_sscanf(sprintf("%-4c",16909060),"%+-4c")[0] ]],16909060)
-
test_eq([[ array_sscanf(sprintf("%4c",-16909060),"%+4c")[0] ]],-16909060)
-
test_eq([[ array_sscanf(sprintf("%-4c",-16909060),"%+-4c")[0] ]],-16909060)
-
-
test_equal([[array_sscanf("\1000\1001\2000","%[\1000-\1111]%s")]],
-
[[ ({ "\1000\1001", "\2000" }) ]])
-
-
test_equal([[array_sscanf("foo\1000\1001\1111\1110\2000","%s%[\1000-\1111]%s")]],
-
[[ ({ "foo", "\1000\1001\1111\1110", "\2000" }) ]])
-
-
test_equal([[array_sscanf("\2000\1000\1111\1001\1110foo","%s%[\1000-\1111]%s")]],
-
[[ ({ "\2000", "\1000\1111\1001\1110", "foo"}) ]])
-
-
test_equal([[ array_sscanf("02 00 DC 00 0B","%{%x%*[\0-/:-@]%}")[0] ]],
-
[[ ({ ({2}), ({0}), ({220}),({0}), ({11}) }) ]])
-
-
test_equal([[ array_sscanf("\51726\30212\66610\30131", "%*[ \t]%s")[0] ]],
-
[[ "\51726\30212\66610\30131" ]])
-
-
test_equal([[ array_sscanf("hej","%s") ]], [[ ({ "hej" }) ]])
-
test_equal([[ array_sscanf("hej","%s%n") ]], [[ ({ "hej", 3 }) ]])
-
test_equal([[ array_sscanf("hejhopp", "%*!3s%s%n") ]], [[ ({ "hopp", 4 }) ]])
-
test_eval_error([[ function f=array_sscanf; f("hej","%s% ") ]])
-
-
test_equal([[ array_sscanf("\x304b\x3066\x3044\x308a\x3087\x3046\x308a", "%[^\x3042\x3044\x3046\x3048\x304a]")[0] ]],
-
[[ "\x304b\x3066" ]])
-
-
test_equal( array_sscanf("xfoox", "%sfoo%s"), ({ "x", "x" }) )
-
test_equal( array_sscanf("xfoox", "%sfo\400%s"), ({}) )
-
test_equal( array_sscanf("xfoox", "%sfo\200000%s"), ({}) )
-
test_equal( array_sscanf("xfo\400x", "%sfoo%s"), ({}) )
-
test_equal( array_sscanf("xfo\400x", "%sfo\400%s"), ({ "x", "x" }) )
-
test_equal( array_sscanf("xfo\400x", "%sfo\200000%s"), ({}) )
-
test_equal( array_sscanf("xfo\200000x", "%sfoo%s"), ({}) )
-
test_equal( array_sscanf("xfo\200000x", "%sfo\400%s"), ({}) )
-
test_equal( array_sscanf("xfo\200000x", "%sfo\200000%s"), ({ "x", "x" }) )
-
-
test_any([[mixed a; sscanf("","%H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0","%H",a); return a]],"")
-
test_any([[mixed a; sscanf("\4","%H",a); return a]],0)
-
test_any([[mixed a; sscanf("\4hello","%H",a); return a]],"hell")
-
test_eval_error([[mixed a; sscanf("","%0H",a); return a]])
-
test_eval_error([[mixed a; sscanf("\0","%0H",a); return a]])
-
test_eval_error([[mixed a; sscanf("\4","%0H",a); return a]])
-
test_eval_error([[mixed a; sscanf("\4hello","%0H",a); return a]])
-
test_any([[mixed a; sscanf("","%1H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0","%1H",a); return a]],"")
-
test_any([[mixed a; sscanf("\4","%1H",a); return a]],0)
-
test_any([[mixed a; sscanf("\4hello","%1H",a); return a]],"hell")
-
test_any([[mixed a; sscanf("","%-1H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0","%-1H",a); return a]],"")
-
test_any([[mixed a; sscanf("\4","%-1H",a); return a]],0)
-
test_any([[mixed a; sscanf("\4hello","%-1H",a); return a]],"hell")
-
test_any([[mixed a; sscanf("","%2H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0\0","%2H",a); return a]],"")
-
test_any([[mixed a; sscanf("\0","%2H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0\4","%2H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0\4hello","%2H",a); return a]],"hell")
-
test_any([[mixed a; sscanf("","%-2H",a); return a]],0)
-
test_any([[mixed a; sscanf("\0\0","%-2H",a); return a]],"")
-
test_any([[mixed a; sscanf("\4","%-2H",a); return a]],0)
-
test_any([[mixed a; sscanf("\4\0","%-2H",a); return a]],0)
-
test_any([[mixed a; sscanf("\4\0hello","%-2H",a); return a]],"hell")
-
-
test_any([[
-
class Bar {
-
string sum = "";
-
void bar(string s) {
-
sum += s;
-
}
-
string foo()
-
{
-
foreach(({ "foo ", "bar ", "baz " }), string s) {
-
sscanf(s, "%*[\t ]%[^ \t]", s);
-
switch(foo) {
-
default:
-
bar(s);
-
break;
-
}
-
}
-
return sum;
-
}
-
};
-
return Bar()->foo()
-
]], "foobarbaz")
-
-
test_equal( array_sscanf("^^;|", "%[^-|]%s"), ({ "^^", ";|" }) )
-
test_any([[mixed a; sscanf("^^;|","%[^-|]",a); return a]],"^^")
-
-
// sscanf %O -------------------------------------------------------------
-
-
define(test_percent_o_raw, [[
-
test_equal(array_sscanf(]]$3[[,]]$1[[),[[$2]])
-
]])
-
define(test_percent_o_fmt, [[
-
test_percent_o_raw(]]$1[[,]]$2[[,sprintf(]]$1[[,@]]$2[[))
-
]])
-
define(test_percent_o_char, [[
-
dnl patsubst doesn't exist on all m4's (it's a gnuism?)
-
ifdef(patsubst,[[
-
test_percent_o_raw("%O",({']]$1[['}),"']]patsubst($1,\\,\\\\)[['"))
-
test_percent_o_raw("%O%s",({']]$1[[',"abc"}),"']]patsubst($1,\\,\\\\)[['abc"))
-
]])]])
-
ifdef(patsubst,[[
-
define(test_percent_o_string, [[
-
test_percent_o_raw("%O",({"]]$1[["}),"\"]]patsubst($1,\\,\\\\)[[\""))
-
test_percent_o_raw("%O%s",({"]]$1[[","abc"}),"\"]]patsubst($1,\\,\\\\)[[\"abc"))
-
]])]])
-
-
test_percent_o_fmt("%O",({10}))
-
test_percent_o_fmt("%O%s",({10,"abc"}))
-
-
test_percent_o_char([[a]])
-
test_percent_o_char([[\a]])
-
test_percent_o_char([[\123]])
-
test_percent_o_char([[\x4711]])
-
test_percent_o_char([[\d4711]])
-
-
test_percent_o_string([[a]])
-
test_percent_o_string([[\a]])
-
test_percent_o_string([[\123]])
-
test_percent_o_string([[\x4711]])
-
test_percent_o_string([[\d4711]])
-
-
test_percent_o_fmt("%O %O %O",({10,20,30}))
-
test_percent_o_fmt("%O %O %s",({10,20,"30"}))
-
-
// -------------------------------------------------------------
-
-
-
-
// Basics
-
test_true(1)
-
test_true("")
-
test_true(!0)
-
test_true(!(!1))
-
test_true(this)
-
test_true(a) // a is the test function
-
test_true(0.0)
-
test_true(([]))
-
test_true(({}))
-
test_true((<>))
-
test_true(this_program)
-
-
// testing !
-
test_equal(!"",0)
-
test_equal(!this,0)
-
-
// testing ==
-
test_true(1==1)
-
test_true(!(1==2))
-
test_true(""=="")
-
test_true(!(""=="foo"))
-
test_true(this==this)
-
test_true(2.0==2.0)
-
test_true(({})==({}))
-
-
// testing !=
-
test_true(({1})!=({1}))
-
test_true(1!=2)
-
test_true(!(1==2))
-
test_true(!(""!=""))
-
test_true(""!="foo")
-
-
test_cmp3(1,2,3)
-
test_cmp3(1.0,2.0,3.0)
-
test_cmp3(1,2.0,3.6)
-
test_cmp3(1.0,2,4)
-
test_cmp3("a","b","c")
-
test_cmp3("","b","cc")
-
test_cmp3("\x0","\x100","\x10000")
-
test_cmp3("a\x10000","b\x100","c\x100")
-
-
// hex construction
-
test_eq(0,0x0)
-
test_eq(1,0x1)
-
test_eq(10,0xa)
-
test_eq(16,0x10)
-
test_eq(65535,0xffff)
-
test_eq(17*257*65537,0x11111111)
-
-
// octal construction
-
test_eq(0,00)
-
test_eq(1,01)
-
test_eq(8,010)
-
test_eq(64,0100)
-
test_eq(1073741824,010000000000)
-
test_eq((8+1)*(8*8+1)*(8*8*8*8+1),011111111)
-
-
// string construction tests
-
test_eq(16,"\20"[0])
-
test_eq(16,"\020"[0])
-
test_eq(255,"\377"[0])
-
test_eq(4,'\4')
-
test_eq('a',0x61)
-
test_eq('ab',0x6162)
-
test_eq('abc',0x616263)
-
test_eq('abcd',0x61626364)
-
test_true("\r"[-1]!='r')
-
test_eq("\r"[0],'\r')
-
test_eq("\n"[0],'\n')
-
-
// testing +
-
test_eq(1+1,2)
-
test_eq(1+(-2),-1)
-
test_eq((-2)+(-2),-4)
-
test_eq("hi"+"there","hithere")
-
test_eq("human"+"number"+666,"humannumber666")
-
test_eq("human"+("number"+666),"humannumber666")
-
test_eq(("human"+"number")+666,"humannumber666")
-
test_eq(("human"+"number")+666+111,"humannumber666111")
-
test_eq("humannumber"+(666+111),"humannumber777")
-
test_eq("a"+"b"+"c"+"d"+"e"+"f"+"g"+"h"+"i"+"j"+"k"+"l"+"m"+"n"+"o"+"p"+"q"+"r"+"s"+"t"+"u"+"v"+"x"+"y","abcdefghijklmnopqrstuvxy")
-
test_eq(1.0+1.0,2.0)
-
test_eq(1.0+(-1.0),0.0)
-
test_eq((-1.0)+(-1.0),-2.0)
-
test_eq(1.0+1,2.0)
-
test_eq(1+1.0,2.0)
-
test_eq(1+(-1.0),0.0)
-
test_eq(1.0+(-1),0.0)
-
test_eq((-1)+(-1.0),-2.0)
-
test_eq((-1.0)+(-1),-2.0)
-
test_equal(({1,2,3})+({4,5,6}),({1,2,3,4,5,6}))
-
test_equal((<1,2,3,4>)+(<4,5,6>),(<1,2,3,4,4,5,6>))
-
test_equal(([0:1,3:6])+([5:2,3:6]),([0:1,3:6,3:6,5:2]))
-
test_eval_error(return this + this)
-
test_any(return((1+2+3)-(1+2-3)), 6)
-
-
// testing F_APPEND_MAPPING
-
test_any([[
-
// F_APPEND_MAPPING is not used when adding constant mappings
-
string index = "foo";
-
mapping m = ([ "foo" : 1 ]);
-
m += ([ index : 2 ]);
-
return m->foo;
-
]], 2)
-
-
-
// testing -
-
test_eq(10-3,7)
-
test_eq(3-10,-7)
-
test_eq(10.0-3.0,7.0)
-
test_eq(3.0-10.0,-7.0)
-
test_eq(10-3.0,7.0)
-
test_eq(3-10.0,-7.0)
-
test_eq(10.0-3,7.0)
-
test_eq(3.0-10,-7.0)
-
test_eq(034567 - 10000,4711)
-
test_eq("foobargazonk"-"o","fbargaznk")
-
test_equal(({"foo","bar","gazonk"})-({"foo","gazonk"}),({"bar"}))
-
test_equal(({"c","foo","bar","gazonk","a","b",})-({"foo","gazonk"}),({"c","bar","a","b"}))
-
test_equal((<"foo","bar","gazonk">)-(<"foo","gazonk">),(<"bar">))
-
test_equal((["foo":3,"bar":4,"gazonk":5])-(["foo":3,"gazonk":8]),(["bar":4]))
-
-
test_any([[string s="\57070 abcdefghijklmnopqrstuvwxyz012345678"; return strlen(s-s[1..35])]],37-35)
-
-
// 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)
-
test_eq(4*3,12)
-
test_eq(2*2*2*2*2,32)
-
test_eq(3.0*4.0,12.0)
-
test_eq(4.0*3.0,12.0)
-
test_eq(2.0*2.0*2.0*2.0*2.0,32.0)
-
test_eq(3*4.0,12.0)
-
test_eq(4*3.0,12.0)
-
test_eq(2*2.0*2.0*2.0*2.0,32.0)
-
test_eq(3.0*4,12.0)
-
test_eq(4.0*3,12.0)
-
test_eq(2.0*2*2.0*2*2.0,32.0)
-
-
test_eq([[({})*""]],"")
-
test_eq([[({"foo",0,"bar"})*"-"]],"foo-bar")
-
test_eq([[({"f","o","o"})*""]],"foo")
-
-
test_eq(({"foo","bar","gazonk"})*"-","foo-bar-gazonk")
-
test_eq(({"f\777\777","bar","gaz\777nk"})*"-","f\777\777-bar-gaz\777nk")
-
test_eq(({"f\7777777\7777777","bar","gaz\7777777nk"})*"-","f\7777777\7777777-bar-gaz\7777777nk")
-
-
test_eq(({"foo","bar","gazonk"})*"\777","foo\777bar\777gazonk")
-
test_eq(({"f\777\777","bar","gaz\777nk"})*"\777","f\777\777\777bar\777gaz\777nk")
-
test_eq(({"f\7777777\7777777","bar","gaz\7777777nk"})*"\777","f\7777777\7777777\777bar\777gaz\7777777nk")
-
-
test_eq(({"foo","bar","gazonk"})*"\7777777","foo\7777777bar\7777777gazonk")
-
test_eq(({"f\777\777","bar","gaz\777nk"})*"\7777777","f\777\777\7777777bar\7777777gaz\777nk")
-
test_eq(({"f\7777777\7777777","bar","gaz\7777777nk"})*"\7777777","f\7777777\7777777\7777777bar\7777777gaz\7777777nk")
-
-
-
test_equal( ({ ({1}), ({2}), ({3}) })*({8}), ({1,8,2,8,3}))
-
test_equal( ({ 1 })*3, ({1,1,1}) )
-
test_equal( "foo"*3, "foofoofoo" )
-
test_equal( "foo"*2.5, "foofoofo" )
-
test_equal( "\1234oo"*2.5, "\1234oo\1234oo\1234o" )
-
-
test_equal( ({1,2,3})*1.5, ({1,2,3,1,2}))
-
test_equal( ({1,2,3})*1.4, ({1,2,3,1}))
-
test_equal( ({1,2,3})*0.0, ({}))
-
test_equal( ({})*3.0, ({}))
-
-
-
-
// testing /
-
test_eq(12/3,4)
-
test_eq(13/3,4)
-
test_eq(14/3,4)
-
test_eq(15/3,5)
-
test_eq(-2/4,-1)
-
test_eq(-12/3,-4)
-
test_eq(-13/3,-5)
-
test_eq(-14/3,-5)
-
test_eq(-15/3,-5)
-
test_eval_error(return 15/0)
-
test_eq(12.0/3.0,4.0)
-
test_eq(14.0/4.0,3.5)
-
test_eq(15.0/3.0,5.0)
-
test_eq(12/3.0,4.0)
-
test_eq(14/4.0,3.5)
-
test_eq(15/3.0,5.0)
-
test_eq(12.0/3,4.0)
-
test_eq(14.0/4,3.5)
-
test_eq(15.0/3,5.0)
-
test_eval_error(return 15.0/0.0)
-
test_equal("foo-bar-gazonk"/"-",({"foo","bar","gazonk"}))
-
test_equal("foobargazonk"/"",({"f","o","o","b","a","r","g","a","z","o","n","k"}))
-
test_equal(({1,0,1,2,1,2,2,2,1,1,1})/({2}),({ ({1,0,1}), ({1}), ({}), ({}), ({1,1,1}) }))
-
test_equal(({1,2,3,4})/({}),({ ({1}), ({2}), ({3}), ({4}) }))
-
test_eq(sizeof(allocate(119)/({})), 119)
-
test_eq(sizeof(allocate(120)/({})), 120)
-
test_eq(sizeof(allocate(121)/({})), 121)
-
test_eq(sizeof(allocate(122)/({})), 122)
-
test_equal(({1,0,1,2,1,2,2,2,1,1,1})/({2,1}),({ ({1,0,1}), ({2,2}), ({1,1}) }))
-
test_equal( ({1,2,3})/({2,3}), ({ ({1}), ({}) }) )
-
test_eq([[`/(20,2,2)]],5)
-
test_eq([[`/(13,2,3)]],2)
-
test_equal("foobargazonk"/1,"foobargazonk"/"")
-
test_equal("foobargazonk"/2,({"fo","ob","ar","ga","zo","nk"}))
-
test_equal("foobargazonk"/3,({"foo","bar","gaz","onk"}))
-
test_equal("foobargazonk"/4,({"foob","arga","zonk"}))
-
test_equal("foobargazonk"/5,({"fooba","rgazo"}))
-
test_equal("foobargazonk"/-6,({"foobar","gazonk"}))
-
test_equal("foobargazonk"/-7,({"rgazonk"}))
-
test_eq(({})/100.0, ({}));
-
test_eq(({})/100, ({}));
-
-
test_equal("foobargazonk"/5.0,({"fooba","rgazo","nk"}))
-
test_equal("foobargazonk"/-5.0,({"fo","obarg","azonk"}))
-
test_equal("foobargazonk"/2.5,({"foo","ba","rga","zo","nk"}))
-
test_equal("foo"/2.6,({"foo",""}))
-
test_equal("\1233oo"/2.6,({"\1233oo",""}))
-
-
test_equal("f\777\777bargaz\777nk"/1,"f\777\777bargaz\777nk"/"")
-
test_equal("f\777\777bargaz\777nk"/2,({"f\777","\777b","ar","ga","z\777","nk"}))
-
test_equal("f\777\777bargaz\777nk"/3,({"f\777\777","bar","gaz","\777nk"}))
-
test_equal("f\777\777bargaz\777nk"/4,({"f\777\777b","arga","z\777nk"}))
-
test_equal("f\777\777bargaz\777nk"/5,({"f\777\777ba","rgaz\777"}))
-
test_equal("f\777\777bargaz\777nk"/-6,({"f\777\777bar","gaz\777nk"}))
-
test_equal("f\777\777bargaz\777nk"/-7,({"rgaz\777nk"}))
-
-
test_equal("f\777\777bargaz\777nk"/5.0,({"f\777\777ba","rgaz\777","nk"}))
-
test_equal("f\777\777bargaz\777nk"/-5.0,({"f\777","\777barg","az\777nk"}))
-
test_equal("f\777\777bargaz\777nk"/2.5,({"f\777\777","ba","rga","z\777","nk"}))
-
-
test_equal(""/"hej", ({""}))
-
test_equal("hej"/"hej", ({"",""}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/1,"f\7777777\7777777bargaz\7777777nk"/"")
-
test_equal("f\7777777\7777777bargaz\7777777nk"/2,({"f\7777777","\7777777b","ar","ga","z\7777777","nk"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/3,({"f\7777777\7777777","bar","gaz","\7777777nk"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/4,({"f\7777777\7777777b","arga","z\7777777nk"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/5,({"f\7777777\7777777ba","rgaz\7777777"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/-6,({"f\7777777\7777777bar","gaz\7777777nk"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/-7,({"rgaz\7777777nk"}))
-
-
test_equal("f\7777777\7777777bargaz\7777777nk"/5.0,({"f\7777777\7777777ba","rgaz\7777777","nk"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/-5.0,({"f\7777777","\7777777barg","az\7777777nk"}))
-
test_equal("f\7777777\7777777bargaz\7777777nk"/2.5,({"f\7777777\7777777", "ba","rga","z\7777777","nk"}))
-
-
test_equal(({1,2,3})/1,({ ({1}), ({2}), ({3}) }))
-
test_equal(({1,2,3})/2,({ ({1,2}) }))
-
test_equal(({1,2,3})/-2,({ ({2,3}) }))
-
-
test_equal(({1,2,3})/2.0,({ ({1,2}), ({3}) }))
-
test_equal(({1,2,3})/-2.0,({ ({1}), ({2,3}) }))
-
test_equal(({1,2,3})/1.5,({ ({1, 2}), ({3}) }))
-
-
// testing %
-
test_eq(12%3,0)
-
test_eq(13%3,1)
-
test_eq(14%3,2)
-
test_eq(15%3,0)
-
test_eq(2%17,2)
-
test_eq(2%-17,-15)
-
test_eq(-2%17,15)
-
test_eq(-2%-17,-2)
-
test_eq(-10%10,0)
-
test_eq(10%-10,0)
-
test_eq(-10%-10,0)
-
test_eq(10%10,0)
-
test_eval_error(return 15 % 0)
-
test_eq(12.0 % 3.0,0.0)
-
test_eq(13.0 % 3.0,1.0)
-
test_eq(14.0 % 3.0,2.0)
-
test_eq(14.5 % 3.0,2.5)
-
test_eq(15.0 % 3.0,0.0)
-
test_eq(13 % 3.0,1.0)
-
test_eq(14 % 3.0,2.0)
-
test_eq(13.0 % 3,1.0)
-
test_eq(14.0 % 3,2.0)
-
test_eq(14.5 % 3,2.5)
-
test_eval_error(return 15.0 % 0.0)
-
-
test_eq("foobargazonk"%5,"nk")
-
test_eq("foobargazonk"%-5,"fo")
-
test_eq("f\777\777bargaz\777nk"%5,"nk")
-
test_eq("f\777\777bargaz\777nk"%-5,"f\777")
-
test_eq("f\7777777\7777777bargaz\7777777nk"%5,"nk")
-
test_eq("f\7777777\7777777bargaz\7777777nk"%-5,"f\7777777")
-
test_equal(({1,2,3})%2,({3}))
-
test_equal(({1,2,3})%-2,({1}))
-
-
-
// testing &&
-
test_eq(0 && 1,0)
-
test_eq(1 && 0,0)
-
test_eq(0 && 0,0)
-
test_eq(1 && 1,1)
-
test_eq(78 && 1,1)
-
test_eq(78 && 99,99)
-
test_eq(78 && 99,99)
-
-
// testing ||
-
test_eq(0 || 1,1)
-
test_eq(1 || 0,1)
-
test_eq(0 || 0,0)
-
test_eq(1 || 1,1)
-
test_eq(78 || 1,78)
-
test_eq(78 || 0,78)
-
-
// testing |
-
test_eq(0 | 0,0)
-
test_eq(1 | 1,1)
-
test_eq(4 | 1,5)
-
test_eq(1 | 9,9)
-
test_eq([[ "\007" | "\023"]],"\027")
-
test_eq([[ "\177777x" | "ab" ]], "\177777z")
-
test_equal( ({1,2,3,4,4}) | ({3,5,6}), ({1,2,3,4,4,5,6}))
-
test_equal( (<4,5,6>) | (<5,5,5>), (<4,5,5,5,6>) )
-
test_equal( ([-4:8,8:7]) | ([3:3,8:3]), ([-4:8,8:3,3:3]) )
-
test_any([[
-
class Foo {int `< (object o) {return 0;}};
-
return sizeof (({Foo()}) | ({Foo()}));
-
]], 2)
-
-
// testing &
-
test_eq(0 & 0,0)
-
test_eq(1 & 1,1)
-
test_eq(4 & 1,0)
-
test_eq(1 & 9,1)
-
test_eq([[ "\007" & "\023"]],"\003")
-
test_eq([[ "\177777x" & "ab" ]], "a`")
-
test_equal( ({1,2,3,4,4}) & ({3,5,6}), ({3}))
-
test_equal( (<4,5,6>) & (<5,5,5>), (<5>) )
-
test_equal( ([-4:8,8:7]) & ([3:3,8:3]), ([8:3]) )
-
test_equal(({1,2,1}) & ({1,2}), ({1,2}))
-
test_equal(({2,1,2}) & ({1,2}), ({2,1}))
-
test_equal(({1,2,1,2,2}) & ({1,2}), ({1,2}))
-
test_equal(({2,1,2,1,2}) & ({1,2}), ({2,1}))
-
-
// testing ^
-
test_eq(0 ^ 0,0)
-
test_eq(1 ^ 1,0)
-
test_eq(4 ^ 1,5)
-
test_eq(1 ^ 9,8)
-
test_eq([[ "\007" ^ "\023"]],"\024")
-
test_eq([[ "\177777x" ^ "ab" ]], "\177636\32")
-
test_equal( ({1,2,3,4,4}) ^ ({3,5,6}) , ({1,2,4,4,5,6}))
-
test_equal( (<4,5,6>) ^ (<5,5,5>), (<4,5,5,6>) )
-
test_equal( ([-4:8,8:7]) ^ ([3:3,8:3]), ([-4:8,3:3]) )
-
test_equal(({1,3,3,3,4}) ^ ({2,3,3,5}), ({1,3,4,2,5}))
-
test_equal(({1,3,3,4}) ^ ({2,3,3,3,5}), ({1,4,2,3,5}))
-
-
// testing <<
-
test_eq(1<<0,1)
-
test_eq(1<<1,2)
-
test_eq(1<<10,1024)
-
test_eq(5<<3,40)
-
test_eval_error(return 17<<-10)
-
-
// testing >>
-
test_eq(9>>2,2)
-
test_eq(1>>1,0)
-
test_eq(1024>>10,1)
-
test_eq(47>>3,5)
-
test_eq(-10>>10000,-1)
-
test_eval_error(return 17>>-10)
-
-
// testing ? :
-
test_true(0?0:1)
-
test_true(1?1:0)
-
test_true(""?1:0)
-
test_true(!0?1:0)
-
test_true(!(!1)?1:0)
-
test_true(this?1:0)
-
test_true(a?1:0) // a is the test function
-
test_true(0.0?1:0)
-
test_true(([])?1:0)
-
test_true(({})?1:0)
-
test_true((<>)?1:0)
-
test_true(this_program?1:0)
-
test_eq(1 ? "a" : 1 ? "b" : 1, "a")
-
test_eq(0 ? "a" : 1 ? "b" : 1 ? "c" : 1, "b")
-
test_eq(0 ? "a" : 0 ? "b" : 1 ? "c" : 1, "c")
-
-
// testing overflow checks
-
test_eq(-1 - 0x7fffffff, -0x80000000)
-
test_eq(Int.NATIVE_MIN % -1, 0)
-
test_eq(Int.NATIVE_MAX % Int.NATIVE_MIN, -1)
-
-
// testing indexing
-
test_eq("foo"[0],'f')
-
test_eq("foo"[1],'o')
-
test_eq("foo"[2],'o')
-
test_eq("foo"[-1],'o')
-
test_eq("foo"[-2],'o')
-
test_eq("foo"[-3],'f')
-
-
test_eq("f\777\777"[0],'f')
-
test_eq("f\777\777"[1],'\777')
-
test_eq("f\777\777"[2],'\777')
-
test_eq("f\777\777"[-1],'\777')
-
test_eq("f\777\777"[-2],'\777')
-
test_eq("f\777\777"[-3],'f')
-
-
test_eq("f\77777777\77777777"[0],'f')
-
test_eq("f\77777777\77777777"[1],'\77777777')
-
test_eq("f\77777777\77777777"[2],'\77777777')
-
test_eq("f\77777777\77777777"[-1],'\77777777')
-
test_eq("f\77777777\77777777"[-2],'\77777777')
-
test_eq("f\77777777\77777777"[-3],'f')
-
-
test_eq(({'f','o','o'})[0],'f')
-
test_eq(({'f','o','o'})[1],'o')
-
test_eq(({'f','o','o'})[2],'o')
-
test_eq(({'f','o','o'})[-1],'o')
-
test_eq(({'f','o','o'})[-2],'o')
-
test_eq(({'f','o','o'})[-3],'f')
-
test_eq(([0:'f',1:'o',2:'o'])[0],'f')
-
test_eq(([0:'f',1:'o',2:'o'])[1],'o')
-
test_eq(([0:'f',1:'o',2:'o'])[2],'o')
-
test_eq(([0:'f',1:'o',2:'o'])[random(0)+3],0)
-
test_eq(([0:'f',1:'o',2:'o'])[random(0)-1],0)
-
test_eq((<'f','o','o'>)['o'],1)
-
test_eq((<'f','o','o'>)['f'],1)
-
test_eq((<'f','o','o'>)[random(0)+'b'],0)
-
test_eq((<'f','o','o'>)[ [int](mixed)-1],0)
-
-
test_eq([[class { mixed `->(mixed x) { return this[x]; } int foo() { return 1; }}()->foo()]],1)
-
-
// Test some indexing opcodes.
-
test_eval_error([[return ({1})[1];]])
-
test_eval_error([[int i = 1; return ({1})[i];]])
-
test_eval_error([[array a = ({ 1 }); return a[1];]])
-
test_eval_error([[array a = ({ 1 }); int i = 1; return a[i];]])
-
-
// index assigning
-
test_any(mixed a=({1}); a[0]=2; return equal(a,({2})),1)
-
test_any(mixed a=(<1>); a[1]=2; return equal(a,(<1>)),1)
-
test_any(mixed a=(<1>); a[0]=2; return equal(a,(<1,0>)),1)
-
test_any(mixed a=(<1>); a[1]=0; return equal(a,(<>)),1)
-
test_any(mixed a=(<1>); a[0]=0; return equal(a,(<1>)),1)
-
test_any(mixed a=([1:1]); a[0]=0; return equal(a,([1:1,0:0])),1)
-
test_any(mixed a=([1:1]); a[1]=0; return equal(a,([1:0])),1)
-
test_any(mixed a="hej"; a[1]='o'; return a,"hoj")
-
test_do( string x=" "*73; x[64]=1; x[65]=1; )
-
-
test_define_program(test,[[public int q,w,e,r; mixed t; mixed getw() { return w; } void setw(int _) { w=_; }]])
-
test_eq(test()->q,0)
-
test_eq(test()->w,0)
-
test_eq(test()->e,0)
-
test_eq(test()->r,0)
-
test_eq(test()->getw(),0)
-
test_any(object o=test(); o->setw(17); return o->w,17)
-
test_any(object o=test(); o->w=17; return o->getw(),17)
-
-
test_eq(test()["q"],0)
-
test_eq(test()["w"],0)
-
test_eq(test()["e"],0)
-
test_eq(test()["r"],0)
-
test_eq(test()["getw"](),0)
-
test_any(object o=test(); o["setw"](17); return o["w"],17)
-
test_any(object o=test(); o["w"]=17; return o["getw"](),17)
-
test_do(add_constant("test");)
-
-
// testing range
-
test_eq("foObar"[0..0],"f")
-
test_eq("foobargazonk"[3..5],"bar")
-
test_eq("foo"[1..10],"oo")
-
test_eq("foo"[-100..0],"f")
-
test_eq("foo"[-100..100],"foo")
-
ignore_warning("Range is always empty.", [[
-
test_any(return "foo"[1..0];,"")
-
]])
-
test_any(int u=-100; return "foo"[0..u];,"") dnl Use variable to avoid warning.
-
test_eq("foobargazonk"[0..],"foobargazonk")
-
test_eq("foobargazonk"[1..],"oobargazonk")
-
test_eq("foobargazonk"[5..],"rgazonk")
-
test_eq("foobargazonk"[..2],"foo")
-
test_eq("foobargazonk"[..5],"foobar")
-
test_eq("1234"[..Int.NATIVE_MAX], "1234")
-
test_eq("1234"[..Int.NATIVE_MAX - 1], "1234")
-
test_eq("1234"[Int.NATIVE_MIN..], "1234")
-
test_eq("1234"[Int.NATIVE_MIN + 1..], "1234")
-
-
test_eq("f\7777\7777bargaz\7777nk"[0..],"f\7777\7777bargaz\7777nk")
-
test_eq("f\7777\7777bargaz\7777nk"[1..],"\7777\7777bargaz\7777nk")
-
test_eq("f\7777\7777bargaz\7777nk"[5..],"rgaz\7777nk")
-
test_eq("f\7777\7777bargaz\7777nk"[..2],"f\7777\7777")
-
test_eq("f\7777\7777bargaz\7777nk"[..5],"f\7777\7777bar")
-
-
test_eq("f\77777777\77777777bargaz\77777777nk"[0..],"f\77777777\77777777bargaz\77777777nk")
-
test_eq("f\77777777\77777777bargaz\77777777nk"[1..],"\77777777\77777777bargaz\77777777nk")
-
test_eq("f\77777777\77777777bargaz\77777777nk"[5..],"rgaz\77777777nk")
-
test_eq("f\77777777\77777777bargaz\77777777nk"[..2],"f\77777777\77777777")
-
test_eq("f\77777777\77777777bargaz\77777777nk"[..5],"f\77777777\77777777bar")
-
-
test_eq("ABCD\u2019"[1..][1..], "ABCD\u2019"[2..])
-
-
test_any_equal([[
-
// Bug 7780
-
string s1 = "aaaaa";
-
string s2 = "BBBBBBBB";
-
s2 = (s2 + s1)[..sizeof(s1) - 1];
-
return (array)s2;
-
]], ({ 66, 66, 66, 66, 66 }))
-
-
test_equal(({1,2,3})[0..0],({1}))
-
test_equal(({1,2,3})[1..2],({2,3}))
-
test_equal(({1,2,3})[2..10],({3}))
-
test_equal(({1,2,3})[-100..0],({1}))
-
test_equal(({1,2,3})[-100..100],({1,2,3}))
-
ignore_warning("Range is always empty.", [[
-
test_any_equal(return ({1,2,3})[1..0];,({}))
-
]])
-
test_any_equal(int u=-100; return ({1,2,3})[0..u];,({})) dnl Use variable to avoid warning.
-
-
test_eq("abcdef"[1..3], "bcd")
-
test_eq("abcdef"[1..<3], "bc")
-
test_eq("abcdef"[1..], "bcdef")
-
test_eq("abcdef"[<1..3], "")
-
test_eq("abcdef"[<1..<3], "")
-
test_eq("abcdef"[<1..], "ef")
-
test_eq("abcdef"[<3..3], "cd")
-
test_eq("abcdef"[<3..<3], "c")
-
test_eq("abcdef"[<3..], "cdef")
-
test_eq("abcdef"[..3], "abcd")
-
test_eq("abcdef"[..<3], "abc")
-
ignore_warning("Redundant range operator.", [[
-
test_eq("abcdef"[..], "abcdef")
-
]])
-
-
test_equal(`[..] ("abcdef"/"", 1, Pike.INDEX_FROM_BEG, 3, Pike.INDEX_FROM_BEG), "bcd"/"");
-
test_equal(`[..] ("abcdef"/"", 1, Pike.INDEX_FROM_BEG, 3, Pike.INDEX_FROM_END), "bc"/"");
-
test_equal(`[..] ("abcdef"/"", 1, Pike.INDEX_FROM_BEG, 3, Pike.OPEN_BOUND), "bcdef"/"");
-
test_equal(`[..] ("abcdef"/"", 3, Pike.INDEX_FROM_END, 3, Pike.INDEX_FROM_BEG), "cd"/"");
-
test_equal(`[..] ("abcdef"/"", 3, Pike.INDEX_FROM_END, 3, Pike.INDEX_FROM_END), "c"/"");
-
test_equal(`[..] ("abcdef"/"", 3, Pike.INDEX_FROM_END, 3, Pike.OPEN_BOUND), "cdef"/"");
-
test_equal(`[..] ("abcdef"/"", 1, Pike.OPEN_BOUND, 3, Pike.INDEX_FROM_BEG), "abcd"/"");
-
test_equal(`[..] ("abcdef"/"", 1, Pike.OPEN_BOUND, 3, Pike.INDEX_FROM_END), "abc"/"");
-
test_equal(`[..] ("abcdef"/"", 1, Pike.OPEN_BOUND, 3, Pike.OPEN_BOUND), "abcdef"/"");
-
-
define(test_new_style, [[
-
test_any_equal([[
-
object new_style = class {
-
array(int) `[..] (int... args) {return args;}
-
}();
-
return new_style $1;
-
]], $2)
-
]])
-
test_new_style([1..3], ({1, Pike.INDEX_FROM_BEG, 3, Pike.INDEX_FROM_BEG}))
-
test_new_style([1..<3], ({1, Pike.INDEX_FROM_BEG, 3, Pike.INDEX_FROM_END}))
-
test_new_style([1..], ({1, Pike.INDEX_FROM_BEG, 0, Pike.OPEN_BOUND}))
-
test_new_style([<1..3], ({1, Pike.INDEX_FROM_END, 3, Pike.INDEX_FROM_BEG}))
-
test_new_style([<1..<3], ({1, Pike.INDEX_FROM_END, 3, Pike.INDEX_FROM_END}))
-
test_new_style([<1..], ({1, Pike.INDEX_FROM_END, 0, Pike.OPEN_BOUND}))
-
test_new_style([..3], ({0, Pike.OPEN_BOUND, 3, Pike.INDEX_FROM_BEG}))
-
test_new_style([..<3], ({0, Pike.OPEN_BOUND, 3, Pike.INDEX_FROM_END}))
-
test_new_style([..], ({0, Pike.OPEN_BOUND, 0, Pike.OPEN_BOUND}))
-
undefine([[test_new_style]])
-
-
define(test_old_style, [[
-
test_any_equal([[
-
object old_style = class {
-
int _sizeof() {return 6;}
-
array(int) `[] (int... args) {return args;}
-
}();
-
return old_style $1;
-
]], $2)
-
]])
-
test_old_style([1..3], ({1, 3}))
-
test_old_style([1..<3], ({1, 2}))
-
test_old_style([1..], ({1, Int.NATIVE_MAX})) dnl Upper bound might become larger.
-
test_old_style([<1..3], ({4, 3}))
-
test_old_style([<1..<3], ({4, 2}))
-
test_old_style([<1..], ({4, Int.NATIVE_MAX})) dnl Upper bound might become larger.
-
test_old_style([..3], ({0, 3}))
-
test_old_style([..<3], ({0, 2}))
-
test_old_style([..], ({0, Int.NATIVE_MAX})) dnl Upper bound might become larger.
-
undefine([[test_old_style]])
-
-
// casting
-
test_eq([[(int)1]],[[1]])
-
test_eq([[(int)-1]],[[-1]])
-
test_eq([[(int)1.0]],[[1]])
-
test_eq([[(int)-1.0]],[[-1]])
-
test_eq([[(int)"1"]],[[1]])
-
test_eq([[(int)"-1"]],[[-1]])
-
test_eq([[(int)"0x1"]],[[0]])
-
test_eq([[(int)"010"]],[[10]])
-
test_eq((int)Gmp.mpz(5), 5)
-
test_eq((int)class { mixed cast(string x) { return x=="int" && 7; } }(), 7)
-
test_eval_error([[ return (int)class { mixed cast(string x) {
-
return 1.0; } }(); ]]);
-
test_eval_error([[ return (int)class { mixed cast(string x) {
-
return ADT.Heap(); } }(); ]]);
-
test_any([[ return (int)class { mixed cast(string x) {
-
return Gmp.mpz(7); } }(); ]], Gmp.mpz(7));
-
test_eq([[(float)"1"]],[[1.0]])
-
test_eq([[(float)"-1"]],[[-1.0]])
-
test_eq([[(float)"1.0"]],[[1.0]])
-
test_eq([[(float)"-1.0"]],[[-1.0]])
-
test_eq([[(float)1.0]],[[1.0]])
-
test_eq([[(float)-1.0]],[[-1.0]])
-
test_eq([[(float)1]],[[1.0]])
-
test_eq([[(float)-1]],[[-1.0]])
-
test_eq([[(string)1]],[["1"]])
-
test_eq([[(string)-1]],[["-1"]])
-
test_eq([[(string)1.0]],[["1.0"]])
-
test_eq([[(string)-1.0]],[["-1.0"]])
-
test_eq((string)Gmp.mpz(5), "5")
-
test_eq((string)class { mixed cast(string x) {
-
return x=="string" && "7"; } }(), "7")
-
test_eval_error((string)class { mixed cast(string x) { return 1.0; }}();)
-
test_eval_error((string)class { mixed cast(string x) {
-
return ADT.Heap(); }}();)
-
test_any([[
-
class A { int q=9; int _is_type(string x) { return x=="string"; } };
-
mixed o = (string)class { mixed cast(string x) { return A(); } }();
-
return o->q;]], 9)
-
// Note: 32-bit floats overflow at ~3.4e38.
-
test_true([[has_value ((string)1e38, ".") ||
-
has_value ((string)1e38, "e")]])
-
test_true([[has_value ((string)-1e38, ".") ||
-
has_value ((string)-1e38, "e")]])
-
test_true([[has_value ((string)1e-38, ".") ||
-
has_value ((string)1e-38, "e")]])
-
test_true([[has_value ((string)-1e-38, ".") ||
-
has_value ((string)-1e-38, "e")]])
-
cond([[Float.DIGITS_10 >= 15]], [[ // Usual size with 64 bit IEEE floats.
-
// Note: 1e100 overflows to infinity with 32 bit floats.
-
test_true([[has_value ((string)1e100, ".") ||
-
has_value ((string)1e100, "e")]])
-
test_true([[has_value ((string)-1e100, ".") ||
-
has_value ((string)-1e100, "e")]])
-
]])
-
// Note: 1e-100 underflows to 0.0 with 32 bit IEEE floats, but that's ok.
-
test_true([[has_value ((string)1e-100, ".") ||
-
has_value ((string)1e-100, "e")]])
-
test_true([[has_value ((string)-1e-100, ".") ||
-
has_value ((string)-1e-100, "e")]])
-
test_true([[has_value ((string)124354236143512312334562453624.1, ".") ||
-
has_value ((string)124354236143512312334562453624.1, "e")]])
-
test_eq([[(string) 0.8]], [["0.8"]])
-
cond([[Float.DIGITS_10 >= 6]], [[ // Usual size with 32 bit IEEE floats.
-
test_eq([[(string) 0.811113]], [["0.811113"]])
-
test_eq([[(string) 0.811114]], [["0.811114"]])
-
test_true([[Regexp ("^8\\.11113e\\+0*19$")->match ((string) 0.811113e20)]])
-
test_true([[Regexp ("^8\\.11114e\\+0*19$")->match ((string) 0.811114e20)]])
-
]])
-
cond([[Float.DIGITS_10 >= 15]], [[ // Usual size with 64 bit IEEE floats.
-
test_eq([[(string) 0.811111111111113]], [["0.811111111111113"]])
-
test_eq([[(string) 0.811111111111114]], [["0.811111111111114"]])
-
test_true([[Regexp ("^8\\.11111111111113e\\+0*19$")->match ((string) 0.811111111111113e20)]])
-
test_true([[Regexp ("^8\\.11111111111114e\\+0*19$")->match ((string) 0.811111111111114e20)]])
-
]])
-
test_do(return (string)1e308)
-
test_do(return (string)1e200)
-
test_do(return (string)1e-200)
-
test_do(return (string)1e-307)
-
test_any([[
-
array foo=({ 1 });
-
return (string)sizeof(foo);
-
]], [["1"]])
-
test_any([[
-
array foo=({ -1 });
-
return (string)-sizeof(foo);
-
]], [["-1"]])
-
test_equal([[(array)(["1":1])]],[[ ({ ({"1", 1}) }) ]])
-
test_equal([[(array(int)) ({"1","4711",2.0,4})]],[[({1,4711,2,4})]])
-
test_equal([[(array(array))({({})})]],[[({({})})]])
-
test_equal([[ (array(array(int))) ({ ({"1","4711",2.0,4}) }) ]],[[ ({ ({1,4711,2,4}) }) ]])
-
test_equal([[ (array(array(array(int)))) ({ ({ ({"1","4711",2.0,4}) }) }) ]],[[ ({ ({ ({1,4711,2,4}) }) }) ]])
-
test_equal([[ (array(array(array(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>) )]])
-
test_equal([[sort(column((array)([1:2,3:4]),0))]],[[ sort(indices(([1:2,3:4])) )]])
-
test_equal([[sort(column((array)([1:2,3:4]),1))]],[[ sort(values(([1:2,3:4])))]])
-
test_true([[(array(array))([]) ]])
-
test_true([[(array(array))([1:2]) ]])
-
test_true([[(array(array))([1:2,3:4]) ]])
-
test_true([[(array(array))([1:2,3:4,5:6]) ]])
-
test_equal( [[ (multiset) ({1})]], [[ (< 1 >) ]] )
-
test_equal( [[ (multiset(string)) ({1})]], [[ (< "1" >) ]] )
-
test_eval_error([[return (mapping)""]])
-
test_equal([[ (mapping)({({1,2}),({3,4})})]], [[([1:2,3:4]) ]])
-
test_equal([[ ({({1,2})})]], [[(array)([1:2]) ]])
-
test_equal([[ (mapping)({})]], [[ ([]) ]])
-
test_equal([[ ({}) ]], [[ (array)([]) ]])
-
test_eval_error([[ mapping m=(mapping)({ ({1,2,3}), ({4,5,6}) }); ]])
-
-
test_equal([[ (mapping)class{int i=3;}() ]],[[ (["i":3]) ]])
-
test_equal([[ (mapping(string:string))class{int i=3;}() ]],[[ (["i":"3"]) ]])
-
-
test_any([[
-
object x = class {
-
mixed cast (string t) {return t == "string" && "foo";}
-
}();
-
destruct (x);
-
return (string) x;
-
]], "0")
-
-
test_eq([[(string) ({0,1,2})]], "\0\1\2")
-
test_eq([[(string) ({'z', 0xff, '.'})]], "z\xff.")
-
test_eq([[(string) ({'z', 0x100, '.'})]], "z\x100.")
-
test_eq([[(string) ({'z', 0xffff, '.'})]], "z\xffff.")
-
test_eq([[(string) ({'z', 0x10000, '.'})]], "z\x10000.")
-
test_eq([[(string) ({'z', -1, '.'})]], "z\xffffffff.")
-
test_eq([[(string) ({'z', 0x7fffffff, '.'})]], "z\x7fffffff.")
-
test_eval_error([[(string) ({0x80000000})]])
-
test_eq([[(string) ({'z', -0x80000000, '.'})]], "z\x80000000.")
-
test_eval_error([[(string) ({-0x80000001})]])
-
test_eval_error([[(int)class { mixed cast() { return UNDEFINED; } }();]])
-
test_eval_error([[(string)class { mixed cast() { return UNDEFINED; } }();]])
-
test_eval_error([[(mapping)class { mixed cast() { return UNDEFINED; } }();]])
-
-
// testing @
-
test_equal(({1,2,3}),lambda(mixed ... x) { return x; }(@a()))
-
test_equal("foo"/"",lambda(mixed ... x) { return x; }(@a()))
-
test_any([[array a=({1,2,3}); return lambda(mixed ... x) { return x; }(@a) !=a]],1)
-
test_any([[array z=({lambda(mixed x){return x;},17});return `()(@z);]],17)
-
-
// testing ++
-
test_any([[ class A(void|int i){}; object a = A(); a->i++; return undefinedp(a->i); ]], 0)
-
test_any([[ class A(void|int i){}; object a = A(); ++a->i; return undefinedp(a->i); ]], 0)
-
-
// testing --
-
test_any([[ class A(void|int i){}; object a = A(); a->i--; return undefinedp(a->i); ]], 0)
-
test_any([[ class A(void|int i){}; object a = A(); --a->i; return undefinedp(a->i); ]], 0)
-
-
// testing +=
-
test_any(int a=1; a+=10; return a,11)
-
test_any_equal(mapping m=([]); m->x+=([]); return m->x, ([]))
-
test_any_equal(mapping m=([]); m->x+=(<>); return m->x, (<>))
-
test_any_equal(mapping m=([]); m->x+=({}); return m->x, ({}))
-
test_any_equal([[
-
array a = ({});
-
catch {
-
a += Array.reduce(`+,({}));
-
};
-
return a;
-
]],({}))
-
-
// testing -=
-
test_any(int a=1; a-=10; return a,-9)
-
test_do([[ add_constant("FOO", class {
-
array(string) arr = ({ "a", "b", "c" });
-
}()); ]])
-
test_any_equal([[
-
// LysLysKOM 20983743.
-
compile_string("void x() {string z=\"a\"; FOO->arr-=({z});}")()->x();
-
compile_string("void x() {string z=\"b\"; FOO->arr=FOO->arr-({z});}")()->x();
-
compile_string("void x() {FOO->arr-=({\"c\"});}")()->x();
-
return FOO->arr;
-
]], ({}))
-
test_do([[ add_constant("FOO"); ]])
-
// testing &=
-
test_any(int a=3; a&=10; return a,2)
-
// testing |=
-
test_any(int a=3; a|=10; return a,11)
-
test_any(int a = UNDEFINED; a|=1; return zero_type(a), 0)
-
test_any_equal(array a=({ "x" }); a|=({"x","y"}); return a, ({"x","y"}))
-
test_any_equal(array a=({ "x" }); a|=({"y"}); return a, ({"x","y"}))
-
test_any_equal(array a=({ "x" }); a|=({"x"}); return a, ({"x"}))
-
test_any_equal(array a=({ "x" }); a|=a; return a, ({"x"}))
-
test_any_equal(array a=({ "x" }); mapping m=(["a":a]); a|=({"x","y"}); return a, ({"x","y"}))
-
test_any_equal(array a=({ "x" }); mapping m=(["a":a]); a|=({"y"}); return a, ({"x","y"}))
-
test_any_equal(array a=({ "x" }); mapping m=(["a":a]); a|=({"x"}); return a, ({"x"}))
-
test_any_equal(array a=({ "x" }); mapping m=(["a":a]); a|=a; return a, ({"x"}))
-
// testing ^=
-
test_any(int a=3; a^=10; return a,9)
-
// testing <<=
-
test_any(int a=3; a<<=2; return a,12)
-
// testing <<=
-
test_any(int a=12; a>>=2; return a,3)
-
// testing *=
-
test_any(int a=12; a*=2; return a,24)
-
// testing /=
-
test_any(int a=12; a/=2; return a,6)
-
// testing %=
-
test_any(int a=12; a%=7; return a,5)
-
-
// testing control structs
-
test_any(return 1,1)
-
test_any(return lambda(){return 1;} (),1 )
-
test_any(if(0) return 0; else return 1,1)
-
test_any(if(0) return 0; return 1,1)
-
test_any(if(1) return 1; else return 0,1)
-
test_any(if("") return 1; else return 0,1)
-
test_any(if(!0) return 1; else return 0,1)
-
test_any(if(!(!1)) return 1; else return 0,1)
-
test_any(if(this) return 1; else return 0,1)
-
test_any(if(a) return 1; else return 0,1) dnl a is the test function
-
test_any(if(0.0) return 1; else return 0,1)
-
test_any(if(([])) return 1; else return 0,1)
-
test_any(if(({})) return 1; else return 0,1)
-
test_any(if((<>)) return 1; else return 0,1)
-
test_any(if(this_program) return 1; else return 0,1)
-
-
// break
-
test_any(while(1) break; return 1,1)
-
test_any(while(1) if(1) break; return 1,1)
-
-
// for
-
test_program(
-
array(int) ia=({1,2,3,4,5,6});
-
-
int a()
-
{
-
int i;
-
for (i=0; i<sizeof(ia); i++)
-
{
-
if (ia[i]==3)
-
{
-
ia=ia[..i-1]+ia[i+1..];
-
--i;
-
}
-
}
-
return 1;
-
}
-
)
-
test_any(int e; for(e=0;e<10;e++) break; return e,0)
-
test_any(int e; for(e=0;e<10;e++) continue; return e,10)
-
test_any(int e;string t=""; for(e=0;e<10;e++) t+=e; return t,"0123456789")
-
test_any(int e;string t=""; for(e=0;e<=10;e++) t+=e; return t,"012345678910")
-
test_any(int e;string t=""; for(e=9;e>0;e--) t+=e; return t,"987654321")
-
test_any(int e;string t=""; for(e=9;e>=0;e--) t+=e; return t,"9876543210")
-
test_any(int e;string t=""; for(e=9;e!=0;e--) t+=e; return t,"987654321")
-
test_any(int e;string t=""; for(e=2;e!=10;e++) t+=e; return t,"23456789")
-
test_any(int e;string t=""; for(e=0;e>-10;e--) t+=e; return t,"0-1-2-3-4-5-6-7-8-9")
-
-
// foreach
-
test_any([[int e;string t=""; foreach(({7,6,3,8}),e) t+=e; return t]],"7638")
-
test_any([[
-
/* FIXME: This test needs to be proofed against the optimizer. */
-
string s;if(1) foreach(({}),s); else foreach(({}),s); return 1
-
]],1)
-
-
test_any([[
-
// Bug 7426.
-
array a = ({});
-
foreach(a[1..], mixed e) return 0;
-
return 1;
-
]], 1)
-
-
test_any([[
-
int ret;
-
foreach( ([1:2,3:5,7:11,13:17]) ; int a ; int b) ret+=a*b;
-
return ret;
-
]],315)
-
-
test_any([[
-
int ret;
-
foreach( ([1:2,3:5,7:11,13:17]) ; ; int b) ret+=b;
-
return ret;
-
]],35)
-
-
test_any([[
-
int ret;
-
foreach( ([1:2,3:5,7:11,13:17]) ; int a; ) ret+=a;
-
return ret;
-
]],24)
-
-
test_any([[
-
int ret;
-
foreach( (<1,3,7,13>) ; ; int b) ret+=b;
-
return ret;
-
]],4)
-
-
test_any([[
-
int ret;
-
foreach( (<1,3,7,13>) ; int a; ) ret+=a;
-
return ret;
-
]],24)
-
-
test_any([[
-
int ret;
-
foreach( (<1,3,7,13>) ; ; ) ret++;
-
return ret;
-
]],4)
-
-
-
test_any([[
-
int ret;
-
foreach( (<1,3,7,13>) ; int a; int b) ret+=a+b;
-
return ret;
-
]],24+4)
-
-
test_any([[
-
int ret;
-
foreach( ({2,5,11,17}) ; int a; ) ret+=a;
-
return ret;
-
]],6)
-
-
test_any([[
-
int ret;
-
foreach( ({2,5,11,17}) ; ; int b) ret+=b;
-
return ret;
-
]],35)
-
-
test_any([[
-
int ret;
-
foreach( ({2,5,11,17}) ; int a; int b) ret+=a*b;
-
return ret;
-
]],78)
-
-
test_any([[
-
int ret;
-
foreach( ({2,5,11,17}) ; ; ) ret++;
-
return ret;
-
]],4)
-
-
test_any([[
-
int ret;
-
foreach( "foobar" ; int a; int b) ret+=a*b;
-
return ret;
-
]],1585)
-
-
test_any([[
-
int ret;
-
foreach( "foobar" ; int a;) ret+=a;
-
return ret;
-
]],15)
-
-
test_any([[
-
int ret;
-
foreach( "foobar" ; ; int b) ret+=b;
-
return ret;
-
]],633)
-
-
test_any([[
-
mapping m=([1:2,3:5,7:11,13:17]);
-
foreach(m; int a; int b) if (m_delete(m,a) != b) return -1;
-
return sizeof(m);
-
]],0)
-
-
test_any([[
-
mapping m=([1:2,3:5,7:11,13:17]);
-
int ret;
-
foreach(m ; int a ; int b) { m_delete(m,a); ret+=a*b; }
-
return ret;
-
]],315)
-
-
test_eval_error([[
-
int i;
-
foreach (class{}(); mixed a; mixed b) i++;
-
return i;
-
]])
-
-
test_any([[
-
String.Iterator iter = String.Iterator ("foo");
-
foreach (iter; int idx;)
-
if (idx != iter->index()) return 1;
-
return 0;
-
]], 0)
-
-
test_any([[
-
mapping(object:int) x = ([]);
-
object o = class {}();
-
x[o] = 1;
-
destruct (o);
-
int i;
-
foreach (x;;) i++;
-
return i;
-
]], 0)
-
-
test_any([[
-
multiset(object) x = (<>);
-
object o = class {}();
-
x[o] = 1;
-
destruct (o);
-
int i;
-
foreach (x;;) i++;
-
return i;
-
]], 0)
-
-
test_any([[
-
// Check foreach with negative ranges [bug 7216]/[LysLysKOM 20892964].
-
array a = ({ -2, -1, 0, 1, 2 });
-
int total;
-
foreach(a, int start) {
-
foreach(a[start..], int val) {
-
if (!intp(val)) error("Invalid svalue!\n");
-
total += (val + 3)*(start + 3);
-
}
-
}
-
return total;
-
]], 15 + 30 + 45 + 56 + 60)
-
-
// do-while
-
test_any(int e;string t=""; e=0; do{ t+=e; }while(++e<6); return t,"012345";)
-
-
// while
-
test_any(int e;string t=""; e=8; while(--e) t+=e; return t,"7654321";)
-
test_any(int e;string t=""; e=8; while(e--) t+=e; return t,"76543210";)
-
test_any(int e;string t=""; e=0; while(++e<6) t+=e; return t,"12345";)
-
test_any(int e=1;string t=""; while(e<20){t+=e;e*=2;} return t,"124816";)
-
-
// Switch
-
test_any(switch((mixed)"") { case -1: case "gazonk": return 0; } return 1,1)
-
test_any(switch((mixed)"") { case -2: case "gazonk": return 0; } return 1,1)
-
test_any(switch((mixed)"") { case 0: case "gazonk": return 0; } return 1,1)
-
test_any(switch((mixed)"") { case "gazonk": case 0: return 0; } return 1,1)
-
test_any(switch((mixed)0) { case 0: case "gazonk": return 0; } return 1,0)
-
test_any(switch((mixed)"gazonk") { case "gazonk": case 0: return 0; } return 1,0)
-
test_any(switch((mixed)0) { case "": } return 1,1)
-
test_any(switch((mixed)1) { case 1: return 1; default: } return 0,1)
-
test_any(switch((mixed)2) { case 1: return 0; default: return 1;} return 0,1)
-
test_any(switch((mixed)1) { default: return 0; case 1: return 1; } return 0,1)
-
test_any(switch((mixed)2) { default: return 1; case 1: return 0; } return 0,1)
-
test_any(switch((mixed)0) { case "apa": case 1.0: return 0; } return 1,1)
-
test_any(switch((mixed)"apa") { case "apa": return 1; case 1.0: } return 0,1)
-
test_any(switch((mixed)1.0) { case "apa": return 0; case 1.0: return 1; } return 0,1)
-
test_any(switch((mixed)"sune") { case "gunnel": return 0; case "gunnar": return 1; case "sune": case "gusten": return 0; } return 0,0)
-
test_any(switch((mixed)"a") { case "a": return 1; case "b": case "c": case "d": case 'a': case '1': case '0': default: } return 0,1)
-
test_any(switch((mixed)"b") { case "a": return 0; case "b": return 1; case "c": case "d": case 'a': case '1': case '0': default: } return 0,1)
-
test_any(switch((mixed)"c") { case "a": case "b": return 0; case "c": return 1; case "d": case 'a': case '1': case '0': default: } return 0,1)
-
test_any(switch((mixed)"d") { case "a": case "b": case "c": return 0; case "d": return 1; case 'a': case '1': case '0': default: } return 0,1)
-
test_any(switch((mixed)'a') { case "a": case "b": case "c": case "d": return 0; case 'a': return 1; case '1': case '0': default: } return 0,1)
-
test_any(switch((mixed)'1') { case "a": case "b": case "c": case "d": case 'a': return 0; case '1': return 1; case '0': default: } return 0,1)
-
test_any(switch((mixed)'0') { case "a": case "b": case "c": case "d": case 'a': case '1': return 0; case '0': return 1; default: } return 0,1)
-
test_any(switch((mixed)"a") { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,1)
-
test_any(switch((mixed)"b") { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,2)
-
test_any(switch((mixed)"c") { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,3)
-
test_any(switch((mixed)"d") { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,4)
-
test_any(switch((mixed)'a') { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,5)
-
test_any(switch((mixed)'1') { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,6)
-
test_any(switch((mixed)'0') { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,7)
-
test_any(switch((mixed)'9') { case "a": return 1; case "b": return 2; case "c": return 3; case "d": return 4; case 'a': return 5; case '1': return 6; case '0': return 7; default: return 8; } return 9,8)
-
-
test_program([[
-
void bar() {}
-
int a()
-
{
-
foreach( ({1}), int n)
-
{
-
switch(n)
-
{
-
default:
-
bar();
-
break;
-
}
-
}
-
return 1;
-
}
-
]])
-
-
-
define(test_switch0,[[
-
test_any(switch((mixed)$1) { $2; $3; $4; $5; } return 0,$6)
-
test_any(switch((mixed)$1) { default: return 0; $2; $3; $4; $5; } return -1,$6)
-
test_any(switch((mixed)$1) { $2; default: return 0; $3; $4; $5; } return -1,$6)
-
test_any(switch((mixed)$1) { $2; $3; default: return 0; $4; $5; } return -1,$6)
-
test_any(switch((mixed)$1) { $2; $3; $4; default: return 0; $5; } return -1,$6)
-
test_any(switch((mixed)$1) { $2; $3; $4; $5; default: return 0; } return -1,$6)
-
]])
-
-
define(test_switch1,[[
-
test_switch0($1, $2,$3,$4,$5, $6)
-
test_switch0($1, $2,$3,$5,$4, $6)
-
]])
-
-
define(test_switch2,[[
-
test_switch1($1, $2,$3,$4,$5, $6)
-
test_switch1($1, $2,$4,$3,$5, $6)
-
test_switch1($1, $2,$5,$4,$3, $6)
-
]])
-
-
define(test_switch3,[[
-
test_switch2($1,case $2:return 2,case $3:return 3,case $4:return 4,case $5:return 5,$6)
-
test_switch2($1,case $3:return 3,case $2:return 2,case $4:return 4,case $5:return 5,$6)
-
test_switch2($1,case $4:return 4,case $3:return 3,case $2:return 2,case $5:return 5,$6)
-
test_switch2($1,case $5:return 5,case $3:return 3,case $4:return 4,case $2:return 2,$6)
-
]])
-
-
define(test_switch4,[[
-
test_switch3($1,$2,$3,$4,$5,0)
-
test_switch3($2,$2,$3,$4,$5,2)
-
test_switch3($3,$2,$3,$4,$5,3)
-
test_switch3($4,$2,$3,$4,$5,4)
-
test_switch3($5,$2,$3,$4,$5,5)
-
]])
-
-
test_switch4(17,18,19,20,21)
-
test_switch4("a","b","c","d","e")
-
test_switch4("a",0,"c","d","e")
-
test_switch4(1.0,2.0,3.0,4.0,5.0)
-
test_switch4(this,"",0,4.0,1)
-
-
test_any(int e;string t=""; for(e=0;e<10;e++) switch(e) { default: t+=e; case 4..8: } return t,"01239")
-
-
// use sprintf here; the sums aren't totally equal for doubles (error~=1e-16)
-
test_any([[float e,q; q=0.0; for(e=0.1;e<10.0;e+=1.0) switch(e) { default: q+=e; case 4.0..8.0: } return sprintf("%.6f",q)]],[[sprintf("%.6f",0.1+1.1+2.1+3.1+8.1+9.1)]])
-
-
test_compile_error([[switch (1) {case 1: break; case 1: break;}]])
-
test_compile_error([[switch (1) {case 1: break; case 0..2: break;}]])
-
test_compile_error([[switch (1) {case 1..2: break; case 0..3: break;}]])
-
test_compile_error([[switch (1) {case 1..3: break; case 0..2: break;}]])
-
test_compile_error([[switch (1) {case 1..2: break; case 0..: break;}]])
-
test_compile_error([[switch (1) {case 1..2: break; case ..3: break;}]])
-
test_compile_error([[switch (1) {case 1..: break; case ..3: break;}]])
-
test_compile_error([[switch (1) {case ..: break;}]])
-
test_compile_error([[switch (1) {case "x"..: break;}]])
-
test_compile_error([[switch (1) {case .."y": break;}]])
-
test_compile_error([[switch (1) {case "x".."y": break;}]])
-
-
define(test_switch_ranges,[[
-
test_any_equal([[
-
int f (int i) {{$1;} return 0;};
-
array res = ({});
-
for (int i = -3; i <= 3; i++) res += ({f (i)});
-
return res;
-
]], $2)
-
]])
-
-
test_switch_ranges([[
-
switch (i) {case 1..2: return 2; case -2..-1: return 1;}
-
]], ({0, 1, 1, 0, 2, 2, 0}))
-
test_switch_ranges([[
-
switch (i) {case 1..2: return 2; case -2..0: return 1;}
-
]], ({0, 1, 1, 1, 2, 2, 0}))
-
test_switch_ranges([[
-
switch (i) {case 1..2: return 2; case -2..-1: return 1; case 0: return 3;}
-
]], ({0, 1, 1, 3, 2, 2, 0}))
-
test_switch_ranges([[
-
switch (i) {case 1..2: return 2; case ..-1: return 1; case 0: return 3;}
-
]], ({1, 1, 1, 3, 2, 2, 0}))
-
test_switch_ranges([[
-
switch (i) {case 1..: return 2; case -2..-1: return 1; case 0: return 3;}
-
]], ({0, 1, 1, 3, 2, 2, 2}))
-
test_switch_ranges([[
-
switch (i) {case 1..: return 2; case ..-1: return 1; case 0: return 3;}
-
]], ({1, 1, 1, 3, 2, 2, 2}))
-
-
test_any([[
-
#pragma strict_types
-
int(-1..1) i = [int(0..1)]random(1);
-
switch(i)
-
{
-
case 0: return 3;
-
case 1: return 3;
-
case -1: return 3;
-
}
-
return 0;
-
]], 3)
-
-
-
// Breaks and continues with labels
-
test_compile_error([[break;]])
-
test_compile_error([[continue;]])
-
test_compile_error([[foo: break;]])
-
test_compile_error([[foo: continue;]])
-
test_compile_error([[break foo;]])
-
test_compile_error([[continue foo;]])
-
test_any([[foo: break foo; return 1;]], 1)
-
test_compile_error([[foo: continue foo;]])
-
test_compile_error([[int a; foo: if (a++) a++; else foo: a++;]])
-
test_compile_error([[int a; foo: foo: if (a++) a++; else a++;]])
-
ignore_warning("Label foo not used.", [[
-
test_compile([[int a; foo: if (a++) a++; foo: a++;]])
-
]])
-
test_compile_error([[int a; do if (a++) break foo; while (0);]])
-
test_compile([[int a; do foo: if (a++) break foo; while (0);]])
-
test_compile([[int a; foo: do if (a++) break foo; while (0);]])
-
test_compile_error([[int a; do foo: if (a++) continue foo; while (0);]])
-
test_compile([[int a; foo: do if (a++) continue foo; while (0);]])
-
ignore_warning("Label foo not used.", [[
-
test_any([[
-
int i;
-
for (i = 1; i <= 4; i++)
-
foo: break;
-
return i;
-
]], 1)
-
test_any([[
-
int i;
-
for (int j = 1; j <= 4; j++) {
-
foo: continue;
-
i = j;
-
}
-
return i;
-
]], 0)
-
]])
-
test_any([[
-
int i;
-
for (i = 1; i <= 4; i++)
-
foo: {
-
if (i > 5) break foo;
-
break;
-
}
-
return i;
-
]], 1)
-
test_any_equal([[
-
int a, b;
-
foo:
-
for (int i = 1; i <= 4; i++) {
-
a = i;
-
switch (1) {
-
case 1:
-
if (i >= 3) break foo;
-
if (i >= 2) continue foo;
-
}
-
b = i;
-
}
-
return ({a, b});
-
]], ({3, 1}))
-
test_any_equal([[
-
int a, b;
-
foo: {
-
for (int i = 1; i <= 4; i++) {
-
a = i;
-
switch (1) {
-
case 1:
-
if (i >= 3) break foo;
-
}
-
b = i;
-
}
-
}
-
return ({a, b});
-
]], ({3, 2}))
-
test_any_equal([[
-
array res = ({});
-
foreach (({1, 2, 3}), int x) {
-
res += ({-x});
-
foo:
-
foreach (({1, 2, 3, 4}), int i) {
-
res += ({i});
-
foreach (({1, 2}), int y) {
-
if (i >= 3) break foo;
-
if (i >= 2) continue foo;
-
y;
-
}
-
res += ({i});
-
}
-
}
-
return res;
-
]], ({-1, 1, 1, 2, 3, -2, 1, 1, 2, 3, -3, 1, 1, 2, 3}))
-
test_any_equal([[
-
int a, b;
-
foo:
-
for (int i = 1; i <= 4; i++) {
-
a = i;
-
catch {
-
catch {
-
if (i >= 3) break foo;
-
if (i >= 2) continue foo;
-
};
-
};
-
b = i;
-
}
-
return ({a, b});
-
]], ({3, 1}))
-
ignore_warning("Label foo not used.", [[
-
test_any_equal([[
-
int a, b;
-
foo:
-
for (int i = 1; i <= 4; i++) {
-
a = i;
-
catch {
-
catch {
-
if (i >= 3) break;
-
if (i >= 2) continue;
-
};
-
};
-
b += i;
-
}
-
return ({a, b})
-
]], ({4, 8}));
-
]])
-
test_any([[
-
foo:
-
if (stringp (catch {int q=1; break foo;}) + 1) return 1;
-
else return 2;
-
return 3;
-
]], 3)
-
test_any([[
-
foo:
-
do {
-
if ((3*time() + 5) + stringp (catch {int q=1; break foo;})) return 1;
-
else return 2;
-
} while (0);
-
return 3;
-
]], 3)
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (1,2,3, gauge {break foo;},4,5);
-
]])
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (@indices (all_constants()), gauge {break foo;});
-
]])
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (1,2,3, catch {int q=1; break foo;},4,5);
-
]])
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (@indices (all_constants()), catch {int q=1; break foo;});
-
]])
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (@({1,2,3,4,5}), catch {int q=1; break foo;});
-
]])
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (@indices (all_constants()), @allocate (511, 1), catch {int q=1; break foo;});
-
]])
-
test_do([[
-
void gnu (mixed... args) {};
-
foo:
-
gnu (@allocate (511, 1), @indices (all_constants()), catch {int q=1; break foo;});
-
]])
-
test_compile_error([[
-
foo: {
-
@indices (all_constants());
-
break foo;
-
}
-
]])
-
test_do([[
-
// Note: This is valid <= 7.0 code.
-
foreach (({1,2,3}), int j)
-
do
-
if (17 + j + gauge {break;}) return 0;
-
while (0);
-
]])
-
test_do([[
-
// Note: This is valid <= 7.0 code.
-
foreach (({1,2,3}), int j)
-
do
-
if (17 - j - gauge {break;}) return 0;
-
while (0);
-
]])
-
test_do([[
-
int gnu (mixed... args) {};
-
gnu(@indices (all_constants()), gauge {
-
foreach (({1,2,3}), int j)
-
do
-
if (j && gnu(@indices (all_constants()),
-
17 + gauge {break;}))
-
return 0;
-
while (0);
-
});
-
]])
-
test_do([[
-
int gnu (mixed... args) {};
-
foo:
-
gnu(@indices (all_constants()), gauge {
-
foreach (({1,2,3}), int j)
-
do
-
if (j && gnu(@indices (all_constants()),
-
17 + gauge {break foo;}))
-
return 0;
-
while (0);
-
});
-
]])
-
-
ifefun(_verify_internals,
-
[[
-
test_do(_verify_internals())
-
]])
-
-
test_compile_any([[import Stdio.Readline; mapping x=([]);]])
-
-
// testing preprocessor
-
test_eq([[cpp("#define FOO(X,Y) (X) (Y)\nFOO( (A),(B) )")]],"#line 1 \"-\"\n\n( (A) ) ( (B) )")
-
test_eq([[cpp("#define FOO(X)\nFOO BAR")]],"#line 1 \"-\"\n\nFOO BAR")
-
test_eq([[cpp("#define F 'F'\nF")]],"#line 1 \"-\"\n\n'F'")
-
test_eq([[cpp("#define MAX(X,Y) ((X)>(Y)?(X):(Y))\n#define MAX3(X,Y,Z) MAX(MAX(X,Y),Z)\nMAX3(1,2,3)")]],"#line 1 \"-\"\n\n\n(( (( 1 )>( 2 )?( 1 ):( 2 )) )>( 3 )?( (( 1 )>( 2 )?( 1 ):( 2 )) ):( 3 ))")
-
test_eq([[cpp("foo\xfeff""bar \xfeff gazonk")]],[[cpp("foobar gazonk")]])
-
test_eq([[cpp("#define A(X) #X\n#define B(Y) A(Y)\nB(foo)")]],
-
"#line 1 \"-\"\n\n\n \"foo\" ")
-
test_eq([[cpp("#define FOO(X) X\nFOO(\"\\\n\")\n")]], "#line 1 \"-\"\n\n\n \"\" \n");
-
test_eq([[cpp("#define FOO(X) X\r\nFOO(\"\\\r\n\")\r\n")]], "#line 1 \"-\"\n\n\n \"\" \n" /* Note: Added extra spaces for \r. */);
-
test_equal([[compile_string("#define FOO(X) X\nstring s=FOO(\"\\\n\\\n\");\nmixed f() {return ({__LINE__, backtrace()[-1][1]});}\n")()->f()]], ({5, 5}));
-
test_equal([[compile_string("#define FOO(X) X\nstring s=FOO(#\"\n\n\");\nmixed f() {return ({__LINE__, backtrace()[-1][1]});}\n")()->f()]], ({5, 5}));
-
test_equal([[
-
compile_string("#define FOO BAR\n"
-
"#define TOSTR(X) #X\n"
-
"#define TOSTR2(X) TOSTR(X)\n"
-
"constant val = TOSTR2(FOO);\n")()->val;
-
]], "BAR")
-
test_equal([[
-
compile_string("#define FOO\n"
-
"#define TOSTR(X) #X\n"
-
"#define TOSTR2(X) TOSTR(X)\n"
-
"constant val = TOSTR2(FOO);\n")()->val;
-
]], "")
-
test_eq([[cpp("foo _Pragma(\"strict_types \\\\back \\\"str\\\"\") bar")]],
-
"#line 1 \"-\"\nfoo \n#pragma strict_types \\back \"str\"\n#line 1 \"-\"\n bar")
-
test_equal([[
-
compile_string(Charset.encoder("ebcdic-us")->
-
feed("#charset ebcdic-us\n"
-
"constant val = \"abc\";\n")->drain())()->val;
-
]], "abc")
-
test_eq([[cpp("\\\n")]], "#line 1 \"-\"\n\n")
-
test_eq([[cpp("#if 1\\\n-1\nfoo\n#endif\n")]], "#line 1 \"-\"\n\n\n\n\n")
-
test_any([[
-
#define TOSTR(X) #X
-
return TOSTR(FOO "String with \\ and \" and space" BAR);
-
]], "FOO \"String with \\\\ and \\\" and space\" BAR")
-
test_any([[
-
Stdio.write_file("testsuite_test.h", "");
-
return compile_string(#"
-
#include \"\\
-
testsuite_test.h\"
-
int line = __LINE__;
-
")()->line;
-
]], 4)
-
test_do([[cpp(#"
-
#define FOO(X) X
-
FOO(// Pike 7.6 and earlier don't seem to like single
-
/* quotes (') in comments in macro arguments. */
-
arg)")]])
-
-
// The following three tests are in triplicate to force testing in all shifts.
-
test_do([[
-
#define FOO(X) X
-
string s = FOO (#"a
-
b
-
c");
-
]]);
-
test_do([[
-
#define FOO(X) X
-
string s = FOO (#"a
-
b
-
c");
-
]]);
-
test_do([[
-
#define FOO(X) X
-
string s = FOO (#"a
-
b
-
c");
-
]]);
-
test_do([[
-
#define FOO(X) X
-
string s = FOO (#"
-
-
");
-
]]);
-
test_do([[
-
#define FOO(X) X
-
string s = FOO (#"
-
-
");
-
]]);
-
test_do([[
-
#define FOO(X) X
-
string s = FOO (#"
-
-
");
-
]]);
-
test_any([[
-
#define FOO(X) X
-
FOO ("\
-
\
-
");
-
return __LINE__;
-
]], 6);
-
test_any([[
-
#define FOO(X) X
-
FOO ("\
-
\
-
");
-
return __LINE__;
-
]], 6);
-
test_any([[
-
#define FOO(X) X
-
FOO ("\
-
\
-
");
-
return __LINE__;
-
]], 6);
-
-
test_any([[
-
#define ab\u0063
-
#ifdef \u0061\
-
bc
-
return 1;
-
#else
-
return 0;
-
#endif
-
]], 1)
-
-
test_any([[
-
#define \U00010330(\U00010331) #\U00010331
-
#define \U00010332(\U00010333) \U00010330 (\U00010333)
-
#define \U00010334 qth
-
return \U00010332 (\U00010334)
-
]], "qth")
-
test_any([[
-
#define \U00010330(\U00010331) #\U00010331
-
#define \U00010332(\U00010333) \U00010330 (\U00010333)
-
#define \U00010334 \u0220qt\u0222h
-
return \U00010332 (\U00010334)
-
]], "\x220qt\x222h")
-
test_any([[
-
#define \U00010330(\U00010331) #\U00010331
-
#define \U00010332(\U00010333) \U00010330 (\U00010333)
-
#define \U00010334 \U00010330qt\u0222h
-
return \U00010332 (\U00010334)
-
]], "\x10330qt\x222h")
-
test_program([[
-
typedef \u0069n\u0074 \u02222;
-
\u0222\u0032 my_\u0223 (\u02222 \u0220) {re\u0074urn \u0220+1\u0031;}
-
int a() {return m\u0079_\u0223 (17) == 28;}
-
]])
-
-
test_eq([[compile_string(#"
-
#define Y(y) #y
-
#define X(x) x(z)
-
string a() {return X(Y);}
-
")()->a()]], "z")
-
test_eq([[compile_string(#"
-
#define Y() \"z\"
-
#define X(x) x()
-
string a() {return X(Y);}
-
")()->a()]], "z")
-
test_compile([[
-
#define Y(y) y
-
#define X(x) x()
-
X(Y)
-
]])
-
test_compile_error([[
-
#define Y(y,z) y
-
#define X(x) x()
-
X(Y)
-
]])
-
test_compile_error([[
-
#define Y() y
-
#define X(x) x(z)
-
X(Y)
-
]])
-
test_true([[compile_string(#"
-
#define Y() z
-
#define X(x) x()
-
int z() {return 0;}
-
mixed a() {return functionp(X(Y));}
-
")()->a()]])
-
test_false([[compile_string(#"
-
#define Y z
-
#define X(x) x()
-
int z() {return 0;}
-
mixed a() {return functionp(X(Y));}
-
")()->a()]])
-
-
test_do([[
-
Stdio.write_file("testsuite_test.pmod", "syntax error");
-
object orig_master = master();
-
replace_master(object_program(orig_master)());
-
mixed err = catch {
-
compile_string(#"
-
#ifdef NONEXISTING_DEFINE
-
#error Not expected
-
#if constant (.testsuite_test)
-
#error Not expected either
-
#endif
-
#endif", "testsuite_test");
-
};
-
replace_master(orig_master);
-
if (err) throw (err);
-
]]);
-
-
test_do([[
-
Stdio.write_file("testsuite_test.pmod", "syntax error");
-
object orig_master = master();
-
replace_master(object_program(orig_master)());
-
mixed err = catch {
-
compile_string(#"
-
#if defined (NONEXISTING_DEFINE) && constant (.testsuite_test)
-
#error Not expected
-
#endif", "testsuite_test");
-
};
-
replace_master(orig_master);
-
if (err) throw (err);
-
]]);
-
-
test_any([[
-
class handler {mapping get_predefines() {return (["x": "1", "y": "", "z": 0]);}};
-
return cpp ("x y z p", "-", 0, handler());
-
]], "#line 1 \"-\"\n1 p");
-
test_eval_error([[
-
class handler {mixed get_predefines() {return (<"x">);}};
-
cpp ("x y z", "-", 0, handler());
-
]]);
-
test_eval_error([[
-
class handler {mapping get_predefines() {return ([0: 0]);}};
-
cpp ("x y z", "-", 0, handler());
-
]]);
-
test_eval_error([[
-
class handler {mapping get_predefines() {return (["": 1]);}};
-
cpp ("x y z", "-", 0, handler());
-
]]);
-
test_eval_error([[
-
class handler {mapping get_predefines() {return (["x": 1]);}};
-
cpp ("x y z", "-", 0, handler());
-
]]);
-
-
test_true( Stdio.write_file("conftest.h", "return 17;\n") )
-
-
test_any([[
-
#include "conftest.h"
-
]],17)
-
dnltest_any([[
-
dnl#include <conftest.h>
-
dnl]],17)
-
-
test_any([[
-
// bug 2440 (a)
-
#define FILENAME "conftest.h"
-
return #string FILENAME;
-
]], "return 17;\n")
-
-
test_any([[
-
// bug 2440 (b)
-
#define FILENAME "conftest.h"
-
#include FILENAME
-
]], 17)
-
-
test_any([[
-
// Double expansion
-
string FILENAME = "";
-
#define FILENAME "conftest.h" + FILENAME
-
return #string FILENAME;
-
]], "return 17;\n")
-
-
test_true( rm("conftest.h") )
-
-
test_true(intp(__LINE__))
-
test_true(stringp(__FILE__))
-
test_eq(dirname(__FILE__),__DIR__)
-
test_true(stringp(__DATE__))
-
test_true([[ sscanf(__DATE__, "%3s %d %d", string m, int d, int y) == 3 &&
-
search(({"Jan", "Feb", "Mar", "Apr", "May", "Jun",
-
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}), m) != -1 &&
-
intp(d) && d>0 && d<32 && intp(y) ]])
-
test_true(stringp(__TIME__))
-
test_true([[ sscanf(__TIME__, "%d:%d:%d", int h, int m, int s) == 3 &&
-
intp(h) && intp(m) && intp(s) &&
-
h>=0 && m>=0 && s>=0 &&
-
h<24 && m<60 && s<61 ]])
-
test_true(floatp(__VERSION__))
-
test_true(floatp(__REAL_VERSION__))
-
test_true(intp(__MAJOR__))
-
test_true(intp(__REAL_MAJOR__))
-
test_true(intp(__MINOR__))
-
test_true(intp(__REAL_MINOR__))
-
test_true(intp(__BUILD__))
-
test_true(intp(__REAL_BUILD__))
-
test_eq(__PIKE__,1)
-
-
test_any_equal([[
-
int base = __COUNTER__;
-
#define X __COUNTER__
-
return map( ({ __COUNTER__, X, __COUNTER__ }), `-, base);
-
]], [[ ({ 1,2,3 }) ]])
-
test_any_equal([[
-
int base = __COUNTER__;
-
#define X __COUNTER__
-
return map( ({ __COUNTER__, X, __COUNTER__ }), `-, base);
-
]], [[ ({ 1,2,3 }) ]])
-
test_do(add_constant("COUNTER",__COUNTER__))
-
test_eq(__COUNTER__-1,COUNTER)
-
test_do(add_constant("COUNTER"))
-
-
test_eq( compile_string("string a=#\"a\nb\";")()->a, "a\nb" )
-
test_eq( compile_string("string a=#\"a\r\nb\";")()->a, "a\nb" )
-
test_eq( compile_string("string a=#\"a\n\rb\";")()->a, "a\nb" )
-
-
// #define
-
test_any([[
-
#define FOOa 1
-
return FOOa;
-
]],1)
-
-
test_any([[
-
#define FOOa array
-
FOOa(int) b = ({0});
-
return sizeof(b);
-
]],1)
-
-
test_any([[
-
#define FOOb 17
-
#undef FOOb
-
#define FOOb 1
-
return FOOb;
-
]],1)
-
-
test_compile_error([[
-
#define FOOc FOOc FOO
-
FOO
-
]])
-
-
test_any([[
-
#define FOOa(X) (X)
-
return FOOa(2);
-
]],2)
-
-
test_any([[
-
#define FOOa(X) \
-
(X)
-
return FOOa(2);
-
]],2)
-
-
test_any([[
-
#define FOOa(X) \
-
(X)
-
return FOOa(3);
-
]],3)
-
-
test_any_equal([[
-
#define FOOa(X,Y...) ({X,Y})
-
return FOOa(3);
-
]],({3}))
-
-
test_any_equal([[
-
#define FOOa(X,Y...) ({X,Y})
-
return FOOa(3,4);
-
]],({3,4}))
-
-
test_any_equal([[
-
#define FOOa(X,Y...) ({X,Y})
-
return FOOa(3,4,5);
-
]],({3,4,5}))
-
-
test_any_equal([[
-
#define FOOa(X,Y...) ({X,Y})
-
return FOOa(3,4,5,6);
-
]],({3,4,5,6}))
-
-
test_any([[
-
#define FOOa(X) "bar\
-
gazonk"
-
return FOOa(3);
-
]],"bargazonk")
-
-
test_any([[
-
#define FOOa(X) "bar\
-
gazonk"
-
return FOOa(3);
-
]],"bargazonk")
-
-
-
// /* */
-
test_any([[
-
/* return 99; * / /* */
-
return 1;
-
]],1)
-
-
test_any([[
-
/* return 99; // */
-
return 1;
-
]],1)
-
-
// //
-
test_any([[
-
// return 99;
-
return 1; // return 47;
-
]],1)
-
-
// #!
-
test_any([[
-
#! int i=4;
-
int i=3;
-
#! i=5;
-
return i;
-
]],3)
-
-
// #if
-
define(test_if_true,[[test_any([[
-
#if $1
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)]])
-
define(test_if_false,[[test_any([[
-
#if $1
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],0)]])
-
-
test_if_true(1)
-
test_if_false(0)
-
-
test_if_true('n' == 110)
-
-
// #if ==
-
test_if_true(1==1)
-
test_if_false(1==2)
-
-
// #if !=
-
test_if_true(1!=2)
-
test_if_false(1!=1)
-
-
// #if ( )
-
test_if_true( (((1))==1) )
-
test_if_false( ((1)==(2)) )
-
-
// #if -1
-
test_if_true( -1 )
-
test_if_true( (-1) )
-
test_if_true( (-1==0-1) )
-
-
// #if ~
-
test_if_true( (-1-1==~1) )
-
-
// #if ?:
-
test_if_true( 17 == ( 1 ? 17 : 18 ) )
-
test_if_true( 18 == ( 0 ? 17 : 18 ) )
-
-
// #if ||
-
test_if_true( 10 == ( 10 || 20 ) )
-
test_if_true( 20 == ( 0 || 20 ) )
-
-
// #if &&
-
test_if_true( 0 == ( 0 && 20 ) )
-
test_if_true( 20 == ( 10 && 20 ) )
-
-
// #if |
-
test_if_true( 3 == ( 1 | 2 ) )
-
test_if_true( 2 == ( 2 | 2 ) )
-
-
// #if ^
-
test_if_true( 0 == ( 2 ^ 2 ) )
-
test_if_true( 3 == ( 1 ^ 2 ) )
-
-
// #if &
-
test_if_true( 0 == ( 1 & 2 ) )
-
test_if_true( 2 == ( 2 & 7 ) )
-
-
// #if <= >= < > ! strings, floats
-
-
define(test_if_cmp,[[
-
test_if_true($1<$2)
-
test_if_true(!($1>$2))
-
test_if_true($2>$1)
-
test_if_true(!($2<$1))
-
test_if_true($1<=$2)
-
test_if_true(!($1>=$2))
-
test_if_true($2>=$1)
-
test_if_true(!($2<=$1))
-
test_if_true($2<=$2)
-
test_if_true($1>=$1) ]])
-
-
test_if_cmp(1,2)
-
test_if_cmp(1.0,2.0)
-
test_if_cmp("a","b")
-
-
// #if <<
-
test_if_true(1<<10==1024)
-
test_if_true(5<<3==40)
-
-
// #if >>
-
test_if_true(1024>>10==1)
-
test_if_true(47>>3==5)
-
-
// #if +
-
test_if_true(1024+10==1034)
-
test_if_true(47+3==50)
-
-
// #if -
-
test_if_true(1024-10==1014)
-
test_if_true(47-3==44)
-
-
// #if *
-
test_if_true(1024*10==10240)
-
-
// #if /
-
test_if_true(47/3==15)
-
-
test_compile_error([[
-
#if 1/0
-
return 1;
-
#else
-
return 0;
-
#endif
-
]])
-
-
// #if %
-
test_if_true(47%3==2)
-
test_compile_error([[
-
#if 1%0
-
return 1;
-
#else
-
return 0;
-
#endif
-
]])
-
-
// #if [ ]
-
test_if_true("foo"[0]=='f')
-
-
// #if defined
-
test_any([[
-
#define FOOe 0
-
#if defined(FOOe)
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #if define < x
-
test_any([[
-
#define FOOf 1
-
#if FOOf < 2
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #if define < x
-
test_any([[
-
#define FOOg 1
-
#if FOOg < 0
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
// #if x < define
-
test_any([[
-
#define FOOh 1
-
#if 0 < FOOh
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #if x < define
-
test_any([[
-
#define FOOi 1
-
#if 2 < FOOi
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#if 0
-
#blahong
-
#endif
-
return 1;
-
]],1)
-
-
// #if efun
-
// see test for add_constant()
-
-
// #if /* */
-
test_any([[
-
#if 1 /* trying to be mean // * / */ /* /* */
-
return 1; /* */
-
#define foo
-
# 1 "---"
-
#undef foo
-
#else /* trying to be mean // * / */ /* /* */
-
return 0; //
-
#endif /* trying to be mean // * / */ /* /* */
-
]],1)
-
-
test_any([[
-
#if 0 /* trying to be mean // * / */ /* /* */
-
return 0; /* */
-
#define foo
-
# 1 "---"
-
#undef foo
-
#else /* trying to be mean // * / */ /* /* */
-
return 1; //
-
#endif /* trying to be mean // * / */ /* /* */
-
]],1)
-
-
// #if //
-
test_any([[
-
#if 1 //* trying to be mean // */ */
-
return 1;
-
#else //* trying to be mean // */ */
-
return 0;
-
#endif //* trying to be mean // */ */
-
]],1)
-
-
test_any([[
-
#if 0 //* trying to be mean // */ */
-
return 0;
-
#else //* trying to be mean // */ */
-
return 1;
-
#endif //* trying to be mean // */ */
-
]],1)
-
-
test_any([[
-
#define FOOj
-
#if defined(FOOj)
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
test_any([[
-
#if defined(FOOk)
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
// #if constant
-
test_any([[
-
#if constant(Foo.Bar)
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#if constant(Foo) && constant(Bar)
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#if constant(String.Buffer)
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
test_any([[
-
#if constant(String.Bar)
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#if constant(String) && constant(String.Bar)
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_compile_error([[
-
#if constant()
-
constant foo=1;
-
#endif
-
]])
-
-
// #ifdef
-
test_any([[
-
#ifdef FOOl
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#define FOOm
-
#ifdef FOOm
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #ifndef
-
test_any([[
-
#define FOOo
-
#ifndef FOOo
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#ifndef FOOp
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #else
-
test_any([[
-
#if 1
-
return 1;
-
#else
-
FEL
-
#if 0
-
FEL
-
#else
-
FEL
-
#endif
-
return 0;
-
#endif
-
]],1)
-
-
test_any([[
-
#if 0
-
FEL
-
#if 0
-
FEL
-
#else
-
FEL
-
#if 1
-
FEL
-
#else
-
FEL
-
#endif
-
#endif
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
// #elif
-
test_any([[
-
#if 0
-
return 0;
-
#elif 0
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#if 0
-
return 0;
-
#elif 1
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
test_any([[
-
#if 1
-
return 1;
-
#elif 1
-
return 0;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #elseif
-
test_any([[
-
#if 0
-
return 0;
-
#elseif 0
-
return 0;
-
#else
-
return 1;
-
#endif
-
]],1)
-
-
test_any([[
-
#if 0
-
return 0;
-
#elseif 0
-
return 0;
-
#elseif 1
-
return 1;
-
#elseif 0
-
return 0;
-
#elseif 0
-
return 0;
-
#else
-
FEL
-
#endif
-
]],1)
-
-
test_any([[
-
#if 0
-
return 0;
-
#elseif 1
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
test_any([[
-
#if 1
-
return 1;
-
#elseif 1
-
return 0;
-
#else
-
return 0;
-
#endif
-
]],1)
-
-
// #pragma
-
// FIXME: add tests for real pragmas
-
test_compile_warning([[
-
#pragma whatever
-
return 1;
-
]])
-
-
// #error
-
test_compile_error([[
-
#error Gurgel
-
]])
-
-
// #warning
-
test_compile_warning([[
-
#warning Gurgel
-
]])
-
-
// <<<<<<<
-
test_any([[
-
master()->set_inhibit_compile_errors(1);
-
int x = !!catch(cpp("<<<<<<<"));
-
master()->set_inhibit_compile_errors(0);
-
return x;
-
]], 1)
-
test_compile_error([[
-
#if 0
-
<<<<<<<
-
#endif
-
]])
-
-
-
-
define(do_test_cpp_string,[[
-
test_eq([[ (({""}) + (string)indices("."*256)/"" + ({""})) * $1]],
-
[[ Stdio.write_file("testsuite.tmp",a()),compile_string("string s=#string \"testsuite.tmp\";")()->s ]])
-
]])
-
-
do_test_cpp_string([["0"]])
-
do_test_cpp_string([["1"]])
-
do_test_cpp_string([["2"]])
-
do_test_cpp_string([["3"]])
-
do_test_cpp_string([["4"]])
-
do_test_cpp_string([["5"]])
-
do_test_cpp_string([["6"]])
-
do_test_cpp_string([["7"]])
-
do_test_cpp_string([["8"]])
-
do_test_cpp_string([["9"]])
-
do_test_cpp_string([["a"]])
-
do_test_cpp_string([["A"]])
-
do_test_cpp_string([["\\"]])
-
do_test_cpp_string([["\\\\"]])
-
do_test_cpp_string([["\\\\\\"]])
-
do_test_cpp_string([["\""]])
-
-
// #undef inside an evaluation of the macro.
-
test_compile_error([[
-
#define LOCALE(X,Y) (Y)
-
#define DEFVAR(X, Y) ret[(X)]=my_defvar((X),(Y),vars)
-
-
DEFVAR("cm_wa",
-
Sitebuilder.SBConnect()->
-
ChooseWorkareaVariable(LOCALE(0, "Work area") + LOCALE(0, "Work area"),
-
LOCALE(0, "the"));
-
-
DEFVAR("cr_startpage",
-
Variable.URLList(LOCALE(0, "Crawling behaviour") + LOCALE(0, "Start pages"), ""));
-
-
#undef DEFVAR
-
-
constant cif_defines = #"
-
<input align='&_.img-align;' type='image' name='&_.name;' value='&_.contents;' src='&var.url;' border='0' />
-
</define>";
-
]])
-
-
// foop
-
define(do_test_foop,[[
-
test_eq($1 (17), !($2))
-
test_eq($1 (1.7), !($2-1))
-
test_eq($1 ("17"), !($2-2))
-
test_eq($1 (this), !($2-3))
-
test_eq($1 (a), !($2-4)) // a is the test function
-
test_eq($1 (({})), !($2-5))
-
test_eq($1 (([])), !($2-6))
-
test_eq($1 ((<>)), !($2-7))
-
test_eq($1 (this_program), !($2-8))
-
test_eq($1 (typeof(1)), 0)
-
]])
-
-
do_test_foop(intp,0)
-
do_test_foop(floatp,1)
-
do_test_foop(stringp,2)
-
do_test_foop(objectp,3)
-
do_test_foop(functionp,4)
-
do_test_foop(arrayp,5)
-
do_test_foop(mappingp,6)
-
do_test_foop(multisetp,7)
-
do_test_foop(programp,8)
-
-
// add_constant
-
test_do(add_constant("foobar",lambda() { return 1; }))
-
test_any([[
-
#if constant(foobar)
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],1)
-
test_eq(foobar(),1)
-
test_do(add_constant("foobar"))
-
test_any([[
-
#if constant(foobar)
-
return 1;
-
#else
-
return 0;
-
#endif
-
]],0)
-
-
-
// #### Test everything in all_constants.
-
-
// - __automap__
-
// - __empty_program
-
// - __null_program
-
// - __parse_pike_type
-
// - __placeholder_object
-
// - _describe_program
-
// - _disable_threads
-
// - _do_call_outs
-
// - _exit
-
// - _memory_usage
-
// - _static_modules
-
// - _typeof
-
-
// - _verify_internals
-
ifefun(_verify_internals,
-
[[
-
test_do(_verify_internals())
-
]])
-
-
// - `!
-
// - `!=
-
// - `%
-
-
test_do([[
-
class A (int x) { mixed `%(mixed y) { return this_program(x % (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`%(A(13),A(5))->x, 3)
-
test_eval_error([[
-
class B {}
-
`%(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``%(mixed y) { return this_program((objectp(y)?y->x:y) % x); } };
-
add_constant("A",A);
-
]])
-
test_eq(`%(A(13),A(5))->x, 3)
-
test_eq(`%(13,A(5))->x, 3)
-
test_do(add_constant("A"));
-
-
test_eq(`%(Gmp.mpz(4), 1.5), Gmp.mpz(0))
-
test_eq(`%(4.5, Gmp.mpz(2)), Gmp.mpz(0))
-
-
-
// - `&
-
-
test_do([[
-
class A (int x) { mixed `&(mixed y) { return this_program(x & (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`&(A(7),A(5))->x, 5)
-
test_eq(`&(A(7),5)->x, 5)
-
test_eq(`&(A(7),A(5),A(4))->x, 4)
-
test_eq(`&(A(7),A(5),4)->x, 4)
-
test_eval_error([[
-
class B {}
-
`&(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``&(mixed y) { return this_program(x & (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`&(A(7),A(5))->x, 5)
-
test_eq(`&(7,A(5))->x, 5)
-
test_eq(`&(A(7),A(5),A(4))->x, 4)
-
test_eq(`&(7,A(5),A(4))->x, 4)
-
test_do(add_constant("A"));
-
-
-
// - `()
-
test_eq(1,`()(a))
-
test_eq(1,`()(lambda(int a){ return a; },1))
-
test_eq(1,`()(intp,1))
-
-
// - `*
-
-
test_do([[
-
class A (int x) { mixed `*(mixed y) { return this_program(x * (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`*(A(3),A(2))->x, 6)
-
test_eq(`*(A(3),2)->x, 6)
-
test_eq(`*(A(3),A(2),A(5))->x, 30)
-
test_eq(`*(A(3),A(2),5)->x, 30)
-
test_eval_error([[
-
class B {}
-
`*(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``*(mixed y) { return this_program(x * (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`*(A(3),A(2))->x, 6)
-
test_eq(`*(3,A(2))->x, 6)
-
test_eq(`*(A(3),A(2),A(5))->x, 30)
-
test_eq(`*(3,A(2),A(5))->x, 30)
-
test_do(add_constant("A"));
-
-
// - `+
-
test_eq(`+(1,1),2)
-
test_eq(`+(1,-2),-1)
-
test_eq(`+(-2,-2),-4)
-
test_eq(`+("hi","there"),"hithere")
-
-
test_eq(`+("hi\777","there"),"hi\777there")
-
test_eq(`+("hi","there\777"),"hithere\777")
-
-
test_eq(`+("hi\7777777","there"),"hi\7777777there")
-
test_eq(`+("hi","there\7777777"),"hithere\7777777")
-
-
test_eq(`+(5,6,"q"), "11q")
-
test_eq(`+(5,"q",6), "5q6")
-
test_eq(`+("",""), "")
-
test_eq(`+("","","a",""), "a")
-
test_eq(`+("a",UNDEFINED), "a0")
-
test_eq(`+("human","number",666),"humannumber666")
-
test_eq(`+("human","number",666),"humannumber666")
-
test_eq(`+("human","number",666),"humannumber666")
-
test_eq(`+("human","number",666,111),"humannumber666111")
-
test_eq(`+("humannumber",`+(666+111)),"humannumber777")
-
test_eq(`+("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","x","y"),"abcdefghijklmnopqrstuvxy")
-
test_eq(`+(1.0,1.0),2.0)
-
test_eq(`+(1.0,-1.0),0.0)
-
test_eq(`+(-1.0,-1.0),-2.0)
-
test_equal(`+(({1,2,3}),({4,5,6})),({1,2,3,4,5,6}))
-
test_equal(`+(UNDEFINED,({1}),({2})), ({1,2}))
-
test_equal(`+(({1}),UNDEFINED,({2})), ({1,2}))
-
test_equal(`+((<1,2,3,4>),(<4,5,6>)),(<1,2,3,4,4,5,6>))
-
test_equal(`+(UNDEFINED,(<1>),(<2>)), (<1,2>))
-
test_equal(`+((<1>),UNDEFINED,(<2>)), (<1,2>))
-
test_equal(`+(([0:1,3:6]),([5:2,3:6])),([0:1,3:6,3:6,5:2]))
-
test_equal(`+(UNDEFINED,([1:2]),([3:4])), ([1:2,3:4]))
-
test_equal(`+(([1:2]),UNDEFINED,([3:4])), ([1:2,3:4]))
-
-
test_equal(17+class{mixed ``+(mixed n){return (<n>);}}(),(<17>))
-
test_equal(1700000000000000000000+class{mixed ``+(mixed n){return (<n>);}}(),(<1700000000000000000000>))
-
-
test_eval_error(Gmp.mpz(1700000000000000000000)+class{mixed ``+(mixed n){return (<n>);}}())
-
-
test_do([[
-
class A (int x) { mixed `+(mixed y) { return this_program(x + (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`+(A(3),A(2))->x, 5)
-
test_eq(`+(A(3),2)->x, 5)
-
test_eq(`+(A(3),A(2),A(5))->x, 10)
-
test_eval_error([[
-
class B {}
-
`+(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``+(mixed y) { return this_program(x + (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`+(A(3),A(2))->x, 5)
-
test_eq(`+(3,A(2))->x, 5)
-
test_eq(`+(A(3),A(2),A(5))->x, 10)
-
test_eq(`+(3,A(2),A(5))->x, 10)
-
test_do(add_constant("A"));
-
-
test_eq(`+(1.0,2,3.0), 6.0)
-
test_eq(`+(1,2.0,3), 6.0)
-
-
test_do([[
-
class A {
-
mixed `+(string s) { return "`+"+s; }
-
mixed ``+(string s) { return s+"``+"; }
-
mixed `+=(string s) { return "`+="+s; }
-
};
-
add_constant("A",A);
-
]])
-
test_eq(`+(A(),"e"), "`+=e")
-
test_any([[
-
array a=({ A() });
-
return `+(a[0],"e");
-
]], "`+e")
-
test_eq(`+("e",A()), "e``+")
-
dnl test_eq(`+(UNDEFINED,"x"), "x")
-
test_eq(`+(UNDEFINED,"x",A()), "x``+")
-
dnl test_eq(`+("x",UNDEFINED), "x")
-
test_eq(`+("x",UNDEFINED,A()), "x``+")
-
test_eq(`+(0,"x"), "0x")
-
test_eq(`+(0,"x",A()), "0x``+")
-
test_eq(`+("x",0), "x0")
-
test_eq(`+("x",0,A()), "x0``+")
-
test_eq(`+(1,2.0,A()), "3.0``+")
-
test_eq(`+(1.0,2,A()), "3.0``+")
-
test_eq(`+(1,2,A()), "3``+")
-
test_eq(`+(1.0,2.0,A()), "3.0``+")
-
test_eq(`+("a","b",A()), "ab``+")
-
test_do(add_constant("A"))
-
-
test_do([[
-
class A { mixed ``+(mixed x) { return sprintf("%O",x)-" "-"\n"; } };
-
add_constant("A",A);
-
]])
-
test_eq(`+(({1}),({2}),A()), "({/*2elements*/1,2})")
-
test_eq(`+((<1>),(<2>),A()), "(</*2elements*/1,2>)")
-
test_eq(`+(([1:2]),([3:4]),A()), "([/*2elements*/1:2,3:4])")
-
test_do(add_constant("A"))
-
-
test_do([[
-
class A {
-
mixed `+(mixed x) { return UNDEFINED; }
-
mixed ``+(mixed x) { return UNDEFINED; }
-
};
-
add_constant("A",A);
-
]])
-
test_eval_error(`+(A(), ({1}), ({2})), ({1,2}))
-
test_eval_error(`+(({1}), A(), ({2})), ({1,2}))
-
test_do(add_constant("A"))
-
-
// - `-
-
-
test_do([[
-
class A (int x) {
-
mixed `-(mixed y) { return this_program(x - (objectp(y)?y->x:y)); }
-
// Optimizer will modify the code which requires `+.
-
mixed `+(int y) { return this_program(x+y); }
-
};
-
add_constant("A",A);
-
]])
-
test_eq(`-(A(5),A(2))->x, 3)
-
test_eq(`-(A(5),2)->x, 3)
-
test_eq(`-(A(5),A(2),A(1))->x, 2)
-
test_eq(`-(A(5),A(2),1)->x, 2)
-
test_eval_error([[
-
class B {}
-
`-(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) {
-
mixed ``-(mixed y) { return this_program((objectp(y)?y->x:y) - x); }
-
// Optimizer will modify the code which requires `+.
-
//mixed `+(int y) { return this_program(x+y); }
-
};
-
add_constant("A",A);
-
]])
-
test_eq(`-(A(5),A(2))->x, 3)
-
test_eq(`-(5,A(2))->x, 3)
-
test_eq(`-(A(5),A(2),A(1))->x, 2)
-
test_eq(`-(5,A(2),A(1))->x, 2)
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed `-(mixed y) { return this_program(-x); } };
-
add_constant("A",A);
-
]])
-
test_eq(`-(A(5))->x, -5)
-
test_eval_error([[
-
class B {};
-
return `-(B());
-
]])
-
test_do(add_constant("A"));
-
-
test_eq(`-(4.5, Gmp.mpz(1)), Gmp.mpz(3))
-
test_eq(`-(Gmp.mpz(1), 4.5), Gmp.mpz(-3))
-
-
// - `->
-
// - `->=
-
// - `/
-
-
test_do([[
-
class A (int x) { mixed `/(mixed y) { return this_program(x / (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`/(A(8),A(2))->x, 4)
-
test_eq(`/(A(8),2)->x, 4)
-
test_eq(`/(A(8),A(2),A(2))->x, 2)
-
test_eq(`/(A(8),A(2),2)->x, 2)
-
test_eval_error([[
-
class B {}
-
`/(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``/(mixed y) { return this_program((objectp(y)?y->x:y) / x); } };
-
add_constant("A",A);
-
]])
-
test_eq(`/(A(8),A(2))->x, 4)
-
test_eq(`/(8,A(2))->x, 4)
-
test_eq(`/(A(8),A(2),A(2))->x, 2)
-
test_eq(`/(8,A(2),A(2))->x, 2)
-
test_do(add_constant("A"));
-
-
test_eq(`/(4.5, Gmp.mpz(2)), 2.25)
-
test_eq(`/(Gmp.mpz(2), 4.0), 0.5))
-
-
// - `<
-
// - `<<
-
// - `<=
-
// - `==
-
// - `>
-
// - `>=
-
// - `>>
-
// - `[]
-
// - `[]=
-
// - `^
-
-
test_do([[
-
class A (int x) { mixed `^(mixed y) { return this_program(x ^ (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`^(A(7),A(1))->x, 6)
-
test_eq(`^(A(7),1)->x, 6)
-
test_eq(`^(A(7),A(1),A(7))->x, 1)
-
test_eq(`^(A(7),A(1),7)->x, 1)
-
test_eval_error([[
-
class B {}
-
`^(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``^(mixed y) { return this_program(x ^ (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`^(A(7),A(1))->x, 6)
-
test_eq(`^(7,A(1))->x, 6)
-
test_eq(`^(A(7),A(1),A(7))->x, 1)
-
test_eq(`^(7,A(1),A(7))->x, 1)
-
test_do(add_constant("A"));
-
-
// - `|
-
-
test_do([[
-
class A (int x) { mixed `|(mixed y) { return this_program(x | (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`|(A(3),A(6))->x, 7)
-
test_eq(`|(A(3),6)->x, 7)
-
test_eq(`|(A(3),A(6),A(9))->x, 15)
-
test_eq(`|(A(3),A(6),9)->x, 15)
-
test_eval_error([[
-
class B {}
-
`|(B(),A(5));
-
]])
-
test_do(add_constant("A"));
-
-
test_do([[
-
class A (int x) { mixed ``|(mixed y) { return this_program(x | (objectp(y)?y->x:y)); } };
-
add_constant("A",A);
-
]])
-
test_eq(`|(A(3),A(6))->x, 7)
-
test_eq(`|(3,A(6))->x, 7)
-
test_eq(`|(A(3),A(6),A(9))->x, 15)
-
test_eq(`|(3,A(6),A(9))->x, 15)
-
test_do(add_constant("A"));
-
-
// - `~
-
-
test_do([[
-
class A (int x) { mixed `~() { return this_program(~x); } };
-
add_constant("A",A);
-
]])
-
test_eq(`~(A(5))->x, -6)
-
test_eval_error([[
-
class B {};
-
return `-(B());
-
]])
-
test_do(add_constant("A"));
-
-
// - abs
-
// - acos
-
// Tested in _math
-
-
// - add_constant
-
test_compile_error(int a=grunk(5);)
-
test_do(add_constant("grunk",abs))
-
test_do(int a=grunk(5);)
-
test_do(add_constant("grunk"))
-
test_compile_error(int a=grunk(5);)
-
-
// - add_include_path
-
// - add_module_path
-
// - add_program_path
-
// Tested in lib
-
-
// - aggregate
-
test_equal(aggregate(),({}))
-
test_equal(aggregate(1,2,3,4),({1,2,3,4}))
-
test_equal(aggregate(1,2)+aggregate(3,4),({1,2,3,4}))
-
test_equal(aggregate(@({1,2,3,4})),({1,2,3,4}))
-
test_equal(aggregate(@({7})*50),({7})*50)
-
-
// - aggregate_multiset
-
test_equal(aggregate_multiset(), (<>))
-
test_equal(aggregate_multiset(1,1), (<1,1>))
-
test_equal(aggregate_multiset(1,2,"3"), (<1,2,"3">))
-
-
// - aggregate_mapping
-
test_equal(aggregate_mapping(), ([]))
-
test_equal(aggregate_mapping(1,2,3,4), ([1:2,3:4]))
-
test_eval_error(aggregate_mapping(1,2,3))
-
-
// - alarm
-
-
// - all_constants
-
test_true(mappingp(all_constants()))
-
test_eq(all_constants()["all_constants"],all_constants)
-
-
// - all_threads
-
ifefun(thread_create,
-
[[
-
test_true(arrayp(all_threads()))
-
test_true(sizeof(all_threads()))
-
test_true(objectp(all_threads()[0]))
-
]])
-
-
// - allocate
-
test_equal(allocate(0),({}))
-
test_equal(allocate(2),({0,0}))
-
test_false(allocate(2)==({0,0}))
-
test_equal(allocate(2,2),({2,2}))
-
test_true(allocate(65536,random))
-
-
// - array_sscanf
-
-
// - arrayp
-
// Tested in foop
-
-
// - asin
-
// - atan
-
// - atan2
-
// Tested in _math
-
-
// - atexit
-
-
// - backtrace
-
test_true(arrayp(backtrace()))
-
test_eq(backtrace()[-1][2],a)
-
-
// - basename
-
// Tested in lib
-
-
// - basetype
-
test_eq(basetype(0),"int")
-
test_eq(basetype(0.0),"float")
-
test_eq(basetype(""),"string")
-
test_eq(basetype(({})),"array")
-
test_eq(basetype(({1})),"array")
-
test_eq(basetype((<>)),"multiset")
-
test_eq(basetype(([])),"mapping")
-
test_eq(basetype(class {}),"program")
-
test_eq(basetype(class {}()),"object")
-
test_eq(basetype(abs),"function")
-
test_eq(basetype(lambda(){}),"function")
-
test_eq(basetype(typeof(0)),"type")
-
-
// - call_function
-
test_eq(1,#pragma no_deprecation_warnings
-
call_function(a))
-
test_eq(1,#pragma no_deprecation_warnings
-
call_function(lambda(int a){ return a; },1))
-
test_eq(1,#pragma no_deprecation_warnings
-
call_function(intp,1))
-
-
// - call_out
-
// - call_out_info
-
-
// - callablep
-
define(test_callablep,[[
-
test_eq( callablep($1), $2)
-
test_any([[
-
mixed x = $1;
-
mixed e = catch { x(); };
-
return $2 ^ !!e;
-
]], 1)
-
]])
-
-
test_callablep(time, 1)
-
test_callablep(String.Buffer, 1)
-
test_callablep( class { void `()() { } }(), 1)
-
test_callablep(String.Buffer(), 0)
-
test_callablep( ({}), 1 )
-
test_callablep( ({ 0,0 }), 1 )
-
test_callablep( ({ 0,1 }), 1 )
-
test_callablep( ({ time }), 1 )
-
test_callablep( ({ time, 0 }), 1 )
-
test_callablep( ({ "a", time }), 0 )
-
test_callablep( ({ "" }), 0 )
-
test_callablep( "", 0 )
-
test_callablep( 3.14, 0 )
-
test_callablep( (< time >), 0 )
-
test_callablep( 0, 0 )
-
test_callablep( 7, 0 )
-
test_callablep( ({ ({ 0, 1, time }) }), 1 )
-
test_callablep( ({ ({ 0, "" }) }), 0 )
-
test_any([[
-
array a = ({ 0, 0 });
-
a[1] = a;
-
return callablep(a);
-
]], 1)
-
test_any([[
-
array a = ({ 0, 0 });
-
a[1] = a;
-
return equal(a(), a);
-
]], 1)
-
-
// - cd
-
-
// - ceil
-
// Tested in _math
-
-
// - chmod
-
// - chown
-
// - chroot
-
// - cleargroups
-
// - closelog
-
-
// - column
-
test_equal([[column(({({1,2,3}),({5,6,7}),({8,9,0})}),0)]],[[({1,5,8})]])
-
test_equal([[column(({({1,2,3}),({5,6,7}),({8,9,0})}),1)]],[[({2,6,9})]])
-
test_equal([[column(({({1,2,3}),({5,6,7}),({8,9,0})}),2)]],[[({3,7,0})]])
-
test_any_equal([[
-
array a = ({({(["foo": 17])})});
-
mixed res = column (a, "foo"); // Avoid constant optimization.
-
return res && a[0][0];
-
]], (["foo": 17]))
-
-
// - combine_path
-
test_eq([[combine_path("/foo/bar/gazonk/","..")]],"/foo/bar")
-
test_eq([[combine_path("/foo/bar/gazonk","..")]],"/foo/bar")
-
test_eq([[combine_path("/foo/bar/", "gazonk")]],"/foo/bar/gazonk")
-
test_eq([[combine_path("/foo/bar", "gazonk")]],"/foo/bar/gazonk")
-
test_eq([[combine_path("/.../","sune")]],"/.../sune")
-
test_eq([[combine_path("/",".")]],"/")
-
test_eq([[combine_path("/","foo/.../sune")]],"/foo/.../sune")
-
test_eq([[combine_path("/./foo/bar//gazonk/","../")]],"/foo/bar/")
-
test_eq([[combine_path("/","/foo/./bar/gazonk/..")]],"/foo/bar")
-
test_eq([[combine_path("/","/foo/bar/gazonk/../../")]],"/foo/")
-
test_eq([[combine_path("/","/foo//bar/gazonk/../..")]],"/foo")
-
test_eq([[combine_path("/","/foo/bar/./gazonk/../../..")]],"/")
-
test_eq([[combine_path("/","/foo/../bar//./gazonk/../..")]],"/")
-
test_eq([[combine_path("/","/foo/././/bar/gazonk/../../../..")]],"/")
-
test_eq([[combine_path("/","..")]],"/")
-
test_eq([[combine_path("./","..")]],"..")
-
test_eq([[combine_path("./.","..")]],"..")
-
test_eq([[combine_path("/","../../foo")]],"/foo")
-
test_eq([[combine_path("./foobar/.","..")]],".")
-
test_eq([[combine_path("/","foo","bar","gazonk")]],"/foo/bar/gazonk")
-
test_eq([[combine_path("/", "foo", "")]], "/foo/")
-
-
test_eq([[combine_path("/","/foo/bar/ga\11111zonk/../../")]],"/foo/")
-
test_eq([[combine_path("/","/fo\1111/bar/ga\11111zonk/../../")]],"/fo\1111/")
-
test_eq([[combine_path("/","/fo\1111/bar/gazonk/../../")]],"/fo\1111/")
-
-
test_eq([[combine_path("foo", "../bar")]],"bar")
-
test_eq([[combine_path("foo/", "../bar")]],"bar")
-
test_eq([[combine_path("foo/", "../bar/")]],"bar/")
-
test_eq([[combine_path("foo/.", "../bar")]],"bar")
-
test_eq([[combine_path("foo", "..")]],".")
-
test_eq([[combine_path("foo/", "..")]],".")
-
test_eq([[combine_path("foo/.", "..")]],".")
-
test_eq([[combine_path(".", "bar")]],"bar")
-
test_eq([[combine_path("./", "bar")]],"bar")
-
test_eq([[combine_path(".", "../bar")]],"../bar")
-
test_eq([[combine_path("./", "../bar")]],"../bar")
-
-
// - combine_path_nt
-
test_eq([[combine_path_nt("/","/fo\1111/bar/gazonk/../../")]],"/fo\1111/")
-
test_eq([[combine_path_nt("a:/","/fo\1111/bar/gazonk/../../")]],"a:/fo\1111/")
-
test_eq([[combine_path_nt("a:/", "/foo","bar")+combine_path_nt("/foo","bar")]],
-
"a:/foo/bar/foo/bar")
-
-
// - combine_path_unix
-
test_eq([[combine_path_unix("/","/fo\1111/bar/gazonk/../../")]],"/fo\1111/")
-
-
// - append_path_nt
-
test_any([[
-
// Bug 7723.
-
int i;
-
for (i = 0; i < 1000; i++) {
-
array(string) a = (array(string))(({""}) + allocate(5, random)(10000));
-
string ret = Stdio.append_path_nt("/", a*"/");
-
if (ret != (a*"/")) {
-
return sprintf("%d: %O != %O\n", i, ret, a*"/");
-
}
-
}
-
return "";
-
]], "")
-
-
// - compile
-
// - compile_file
-
-
// - compile_string
-
// see test for clone()
-
-
cond_begin([[all_constants()->thread_create]])
-
-
test_any([[
-
string file = #"
-
/*
-
* Attempt to trig the lex.current_file == NULL bug.
-
*
-
* Henrik Grubbström 1999-07-01
-
*/
-
-
string file = Stdio.File(__FILE__, \"r\")->read();
-
-
void thread_func()
-
{
-
int i;
-
-
for (i=0; i < 1000; i++) {
-
compile_string(file);
-
}
-
}
-
-
int main(int argc, array(string) argv)
-
{
-
array(object) a = allocate(10, thread_create)(thread_func);
-
-
a->wait();
-
-
return 0;
-
}
-
-
";
-
allocate(10, thread_create)(lambda() {
-
int i;
-
for(i = 0; i < 1000; i++) {
-
compile_string(file);
-
// These watchdog calls shouldn't be necessary - the timeframe
-
// is at least 20 minutes between two calls, so doing these can
-
// extend the test time to up to 20000 minutes before the
-
// watchdog kicks in.. /mast
-
//if (!(i%10))
-
// __signal_watchdog();
-
if (!(i % 100))
-
log_status ("%s: %O at %d", ctime (time())[..<1], this_thread(), i);
-
}
-
} )->wait();
-
-
return 0;
-
]], 0)
-
-
cond_end // thread_create
-
-
// - copy_value
-
test_eq(copy_value(1),1)
-
test_eq(copy_value(""),"")
-
test_eq(copy_value(1.0),1.0)
-
test_eq(copy_value(this),this)
-
test_eq(copy_value(a),a)
-
test_eq(copy_value(typeof(true)),typeof(true))
-
define(do_test_copy_value,[[
-
test_any([[mixed x=$1; return x==x]],1)
-
test_any([[mixed x=$1; return copy_value(x)!=x]],1)
-
test_any([[mixed x=$1; return equal(copy_value(x),x)]],1)]])
-
do_test_copy_value( ({1}) )
-
do_test_copy_value( ([]) )
-
do_test_copy_value( (<>) )
-
do_test_copy_value( (< ([]), ({1}) ,"" , 1.0 >) )
-
test_true(get_weak_flag(copy_value(set_weak_flag(({17}), 1))))
-
test_true(get_weak_flag(copy_value(set_weak_flag((<17>), 1))))
-
test_true(get_weak_flag(copy_value(set_weak_flag(([17:17]), 1))))
-
test_true(get_weak_flag(copy_value(set_weak_flag(([17:({17})]), 1))))
-
test_any([[
-
array x = ({0});
-
x[0] = x;
-
return equal (copy_value (x), x);
-
]], 1)
-
test_any([[
-
mapping x = ([]);
-
x[x] = x;
-
return equal (copy_value (x), x);
-
]], 1)
-
test_any([[
-
multiset x = (<>);
-
x[x] = 1;
-
return equal (copy_value (x), x);
-
]], 1)
-
test_any([[
-
array a=({0,0,0});
-
array b=copy_value(a); b[0]=17; b[1]=42; b[2]=128;
-
return equal( ({0,0,0}), a) && equal( ({17,42,128}), b);
-
]], 1)
-
test_any([[
-
// Bug 3693
-
array(mapping) a = ({([])})*2;
-
return a[0] == a[1];
-
]], 1)
-
test_any([[
-
mapping m = ([]);
-
multiset l = (<>);
-
m->foo = ({l});
-
m->bar = ({l});
-
mapping copy = copy_value (m);
-
return copy->foo != copy->bar && copy->foo[0] == copy->bar[0];
-
]], 1)
-
-
test_any([[
-
class X {int __hash() {return 17;}};
-
mixed c = copy_value (X());
-
return objectp (c) && object_program (c) == X;
-
]], 1)
-
-
// - cos
-
// Tested in _math
-
-
// - cpp
-
-
// - crypt
-
test_do(add_constant("random",Random.Deterministic(17)->random))
-
test_eq(crypt("hello"),"yWUNYFIhtQEg6")
-
test_eq(crypt("hello"),"tB0k4A51tkBFI")
-
test_eq(crypt("hello"),"qLKH6pE54iDM.")
-
test_do(add_constant("random_string",Random.Deterministic(17)->random_string))
-
test_eq(crypt(), "SQn8XrmeKKetI");
-
test_eq(crypt(), "WkF1H7X4pX7YA");
-
test_do(add_constant("random",Random.System()->random))
-
test_do(add_constant("random_string",Random.System()->random_string))
-
test_true(crypt("hej",crypt("hej")))
-
test_true(crypt("hej","Oz5i0K.16qkgA"))
-
test_true(crypt("hej","buf8/Z7taE6qs"))
-
test_true(crypt("123456789", crypt("123456780")))
-
test_false(crypt("hej","hej"))
-
test_false(crypt("h","hej"))
-
test_false(crypt("hej","buf8/Z7taE6qst"))
-
test_false(crypt("hej","buf8/Z7taE6q"))
-
-
// - ctime
-
test_eq(ctime(0)[-1],'\n')
-
test_do([[int t = -1; catch(ctime(t));]])
-
-
// - decode_value
-
// - delay
-
// - describe_backtrace
-
// - describe_error
-
-
// - destruct
-
test_do(add_constant("PROG",compile_string("int foo() { return 1; }")));
-
test_any([[object o=PROG(); destruct(o); return o]],0);
-
test_any([[object o=PROG(); destruct(o); return objectp(o)]],0);
-
test_any([[array(object) o=({PROG()}); destruct(o[0]); return o-({0}) ]],({}));
-
test_any([[mapping o=(["foo":PROG()]); destruct(o["foo"]); return o["foo"]; ]],0);
-
dnl test_any([[object t; mapping o=([t=PROG():"foo"]); destruct(t); return sizeof(o)]],0);
-
test_do([[object t; array(object) o=({}); o+=({t=PROG()}); destruct(t); o=({});]]);
-
test_do(add_constant("PROG"))
-
-
// - dirname
-
// Tested in lib
-
-
// - encode_value
-
// - encode_value_canonic
-
// - endgrent
-
// - endpwent
-
-
// - enumerate
-
// Tested in lib
-
-
// - equal
-
// equal is already tested a lot in this script
-
-
test_any([[
-
class X (string s) {};
-
return equal (({X ("foo")}), ({X (0)}));
-
]], 0)
-
test_any([[
-
class X (string s) {};
-
return equal (({X (0)}), ({X ("foo")}));
-
]], 0)
-
test_any([[
-
class X (string s) {};
-
return equal (({X ("foo")}), ({X ("foo")}));
-
]], 1)
-
-
// - errno
-
-
// - error
-
// Tested in lib
-
-
// - exece
-
// - exit
-
-
// - exp
-
// Tested in _math
-
-
// - explode_path
-
// - file_stat
-
// - file_truncate
-
// - filesystem_stat
-
-
// - filter
-
// Tested in lib/modules
-
-
// - find_call_out
-
-
// - floatp
-
// Tested in foop
-
-
// - floor
-
// Tested in _math
-
-
// - fork
-
-
// - function_name
-
test_eq(function_name(a),"a")
-
test_eq(function_name(function_name),0)
-
-
// - function_object
-
test_eq(function_object(a),this)
-
test_eq(function_name(function_object),0)
-
-
// - function_program
-
-
// - functionp
-
// Tested in foop
-
-
// - gc
-
// gc is already tested above
-
-
// - get_all_groups
-
ifefun(get_all_groups,[[
-
test_true(arrayp(get_all_groups()))
-
test_any([[
-
foreach(get_all_groups(), array group)
-
foreach(group; int pos; array(string)|int|string value)
-
switch(pos) {
-
case 0: case 1:
-
if(!stringp(value)) return 0;
-
break;
-
case 2:
-
if(!intp(value)) return 0;
-
break;
-
case 3:
-
if(!arrayp(value)) return 0;
-
foreach(value, string user)
-
if(!stringp(user)) return 0;
-
break;
-
}
-
return 1;
-
]], 1)
-
]])
-
-
// - get_all_users
-
ifefun(get_all_users,[[
-
test_true(arrayp(get_all_users()))
-
test_any([[
-
foreach(get_all_users(), array user)
-
foreach(user; int pos; int|string value)
-
switch(pos) {
-
case 0: case 1: case 4: case 5: case 6:
-
if(!stringp(value)) return 0;
-
break;
-
case 2: case 3:
-
if(!intp(value)) return 0;
-
break;
-
}
-
return 1;
-
]], 1)
-
]])
-
-
// - get_dir
-
test_do(Stdio.recursive_rm("get_dir_test"))
-
test_do(mkdir("get_dir_test"))
-
test_equal(get_dir("get_dir_test"),({}))
-
test_do(Stdio.write_file("get_dir_test/x", "x"));
-
test_equal(get_dir("get_dir_test"),({"x"}))
-
test_do(Stdio.recursive_rm("get_dir_test"))
-
test_true(arrayp(get_dir()))
-
-
// - get_groups_for_user
-
// - get_weak_flag
-
-
// - getcwd
-
test_true(stringp(getcwd()))
-
test_true(sizeof(getcwd()))
-
test_do(Stdio.recursive_rm("getcwd_test"))
-
test_do(mkdir("getcwd_test"))
-
test_any([[
-
string a = getcwd();
-
cd("getcwd_test");
-
string b = getcwd();
-
cd("..");
-
#ifdef __NT__
-
return a==getcwd() && b==a+"\\getcwd_test";
-
#else
-
return a==getcwd() && b==a+"/getcwd_test";
-
#endif
-
]], 1)
-
test_do(Stdio.recursive_rm("getcwd_test"))
-
-
// - getegid
-
ifefun(getegid,[[
-
test_true(intp(getegid()))
-
test_true(getegid()==getegid())
-
]])
-
-
// - getenv
-
-
// - geteuid
-
ifefun(geteuid,[[
-
test_true(intp(geteuid()))
-
test_true(geteuid()==geteuid())
-
]])
-
-
// - getgid
-
ifefun(getgid,[[
-
test_true(intp(getgid()))
-
test_true(getgid()==getgid())
-
]])
-
-
// - getgrent
-
// - getgrgid
-
// - getgrnam
-
// - getgroups
-
// - gethostbyaddr
-
// - gethostbyname
-
-
// - gethostname
-
test_true(stringp(gethostname()))
-
test_true(sizeof(gethostname()))
-
-
// - gethrtime
-
// See time
-
-
// - gethrvtime
-
-
// - getpgrp
-
ifefun(getpgrp,[[
-
test_true(intp(getpgrp()))
-
test_true(getpgrp()==getpgrp())
-
]])
-
-
// - getpid
-
ifefun(getpid,[[
-
test_true(intp(getpid()))
-
test_true(getpid()==getpid())
-
]])
-
-
// - getppid
-
ifefun(getppid,[[
-
test_true(intp(getppid()))
-
test_true(getppid()==getppid())
-
]])
-
-
// - getpwent
-
// - getpwnam
-
// - getpwuid
-
-
// - getsid
-
ifefun(getsid,[[
-
test_true(intp(getsid()))
-
test_true(getsid()==getsid())
-
]])
-
-
// - getuid
-
ifefun(getuid,[[
-
test_true(intp(getuid()))
-
test_true(getuid()==getuid())
-
]])
-
-
// - glob
-
test_false(glob("","a"))
-
test_false(glob("a",""))
-
test_false(glob("?",""))
-
test_true(glob("*",""))
-
test_false(glob("foo","bar"))
-
test_true(glob("foo","foo"))
-
test_true(glob("f?o","foo"))
-
test_true(glob("f??","foo"))
-
test_true(glob("?o?","foo"))
-
test_true(glob("f*","foo"))
-
test_true(glob("*o","foo"))
-
test_true(glob("*<<<*","<<<"))
-
test_true(glob("*<<<*","<<<foo"))
-
test_false(glob("*f","foo"))
-
test_false(glob("o*","foo"))
-
test_false(glob("?f?","foo"))
-
test_equal([[glob("?f?",({"ff","ffff","off","fff",""}))]],[[({"off","fff"})]])
-
test_equal([[glob("foo*bar",({"foobar","foobargazonk","","foofoobar","fobar","fooar"}))]],[[({"foobar","foofoobar"})]])
-
test_eval_error([[
-
array a=({"a","b",3});
-
return glob("*", a);
-
]])
-
test_equal([[glob("foo", ({}))]], ({}))
-
test_false( glob( ({ "a*", "b*" }), "foo" ) )
-
test_eq( glob( ({ "a*", "b*" }), "bar" ), "b*" )
-
test_false( glob( "\\**", "a*") )
-
test_true( glob( "\\**", "*a") )
-
test_false( glob( "[abc]*", "[abc]d") )
-
test_true( glob( "\\[abc\\]*", "[abc]d") )
-
test_true( glob( "[abc]*", "ad") )
-
-
// - gmtime
-
cond([[all_constants()->localtime && all_constants()->mktime]],[[
-
test_do([[int t = -1; catch(gmtime(t));]])
-
]])
-
-
// - hardlink
-
-
// - has_index
-
define(test_has_index,[[test_any([[mixed foo=$1; return has_index(foo,$2)==$3;]], 1)]])
-
test_has_index([[ ({}) ]],0,0)
-
test_has_index([[ ({}) ]],"foo",0)
-
test_has_index([[ ({ "a" }) ]],-1,0)
-
test_has_index([[ ({ "a" }) ]],"a",0)
-
test_has_index([[ ({ "a" }) ]],0,1)
-
test_has_index([[ ({ "a" }) ]],1,0)
-
test_has_index([[ ({ "a", "b" }) ]],1,1)
-
test_has_index([[ ([ "a":"A" ]) ]],4711,0)
-
test_has_index([[ ([ "a":"A" ]) ]],"a",1)
-
test_has_index([[ ([ "a":"A" ]) ]],"A",0)
-
test_has_index([[ ([ "a":"A", "b":"B", "c":"C" ]) ]],"b",1)
-
test_has_index([[ ([ "a":"A", "b":"B", "c":"C" ]) ]],"B",0)
-
test_has_index([[ (< "a" >) ]],4711,0)
-
test_has_index([[ (< "a" >) ]],"a",1)
-
test_has_index([[ (< "a" >) ]],"A",0)
-
test_has_index([[ (< "a", "b", "c" >) ]],"b",1)
-
test_has_index([[ (< "a", "b", "c" >) ]],"B",0)
-
test_has_index([[ class {}() ]],"foo",0)
-
test_has_index([[ (class{array _indices(){return({"a","b"});}})() ]],"b",1)
-
-
// - has_prefix
-
test_true(has_prefix("abc","a"))
-
test_false(has_prefix("abc","b"))
-
test_true(has_prefix("abc",""))
-
test_true(has_prefix("",""))
-
test_false(has_prefix("","abc"))
-
test_true(has_prefix("\666abc","\666a"))
-
-
// - has_suffix
-
test_true(has_suffix("cba","a"))
-
test_false(has_suffix("cba","b"))
-
test_true(has_suffix("abc",""))
-
test_true(has_suffix("",""))
-
test_false(has_suffix("","abc"))
-
test_true(has_suffix("cba\666","a\666"))
-
-
// - has_value
-
define(test_has_value,[[test_true([[mixed foo=$1; return has_value(foo,$2)==$3;]])]])
-
test_has_value([[ ({}) ]],0,0)
-
test_has_value([[ ({}) ]],"foo",0)
-
test_has_value([[ ({ "a" }) ]],-1,0)
-
test_has_value([[ ({ "a" }) ]],"a",1)
-
test_has_value([[ ({ "a" }) ]],0,0)
-
test_has_value([[ ({ "a", "b" }) ]],"b",1)
-
test_has_value([[ ([ "a":"A" ]) ]],4711,0)
-
test_has_value([[ ([ "a":"A" ]) ]],"a",0)
-
test_has_value([[ ([ "a":"A" ]) ]],"A",1)
-
test_has_value([[ ([ "a":"A", "b":"B", "c":"C" ]) ]],"B",1)
-
test_has_value([[ ([ "a":"A", "b":"B", "c":"C" ]) ]],"b",0)
-
test_has_value([[ class {}() ]],"foo",0)
-
test_has_value([[ (class{array _values(){return({"a","b"});}})() ]],"b",1)
-
-
// - hash
-
test_eq(hash("foo"),246314004)
-
test_eq(hash("foo",10),4)
-
test_eq(hash("bar"),134531432)
-
test_eq(hash("bar",10),2)
-
test_eq(hash("b\666arqwerty1234"),312063732)
-
test_eq(hash(""),1937178839)
-
test_eq(hash("\12345678"*10), 1294053961);
-
test_eq(hash("\12345"*10), 2138088857);
-
test_eval_error( return hash("foo",0) )
-
test_eval_error( return hash("foo",-1) )
-
-
// - hash_8_0
-
ignore_warning("Calling a deprecated value.", [[
-
test_eq(hash_8_0("foo"),2091538203)
-
test_eq(hash_8_0("foo",10),3)
-
test_eq(hash_8_0("bar"),2091518428)
-
test_eq(hash_8_0("bar",10),8)
-
test_eq(hash_8_0("b\666arqwerty1234"),1829582221)
-
test_eq(hash_8_0(""),0)
-
test_eval_error( return hash_8_0("foo",0) )
-
test_eval_error( return hash_8_0("foo",-1) )
-
]])
-
-
// - hash_7_4
-
define(test_hash_7_4, [[
-
test_any([[
-
int i = hash_7_4($1);
-
return ]]dnl
-
ifelse([[$3]],,, [[((i==$2)||(i==$3))?$2:]])dnl
-
[[i;
-
]], $2)
-
]])
-
ignore_warning("Calling a deprecated value.", [[
-
test_hash_7_4("foo",2091538203)
-
test_hash_7_4([["foo",10]],3)
-
test_hash_7_4("bar",2091518428)
-
test_hash_7_4([["bar",10]],8)
-
test_hash_7_4("b\666arqwerty1234", 2142487018, 1858424874)
-
test_hash_7_4("",0)
-
test_eval_error( return 7.4::hash("foo",0) )
-
]])
-
-
// - hash_7_0
-
ignore_warning("Calling a deprecated value.", [[
-
test_eq([[ hash_7_0("foo") ]],27734)
-
test_eq([[ hash_7_0("foo",10) ]],4)
-
test_eq([[ hash_7_0("bar") ]],26689)
-
test_eq([[ hash_7_0("bar",10) ]],9)
-
test_eq([[ hash_7_0("b\666arqwerty1234") ]], [[(Pike.get_runtime_info().native_byteorder == 4321? 2142487018 : 1858424874)]])
-
test_eq([[ hash_7_0("") ]],0)
-
test_eval_error( return hash_7_0("foo",0) )
-
]])
-
-
// - hash_value
-
define(test_hash_value, [[
-
test_true(intp(hash_value($1)))
-
dnl Make sure the value to hash has a chance at surviving the optimizer...
-
test_do(add_constant("test_value", $1))
-
test_eq(hash_value($1),hash_value($1))
-
test_do(add_constant("test_value"))
-
]])
-
test_hash_value(77)
-
test_hash_value(5.0)
-
test_hash_value("hello")
-
test_hash_value(({}))
-
dnl (<>) is mutable.
-
test_true(intp(hash_value((<>))))
-
dnl ([]) is mutable.
-
test_true(intp(hash_value(([]))))
-
test_hash_value(time)
-
test_hash_value(ADT.Stack)
-
dnl test_hash_value(String)
-
test_hash_value(typeof(true))
-
test_any([[
-
int v = 0;
-
-
void trampoline() {
-
v = 1;
-
};
-
-
int(0..1) check_hash()
-
{
-
function f1 = trampoline;
-
function f2 = trampoline;
-
return hash_value(f1) == hash_value(f2);
-
};
-
-
return check_hash();
-
]], 1)
-
-
-
// - indices
-
test_equal(indices("foo"),({0,1,2}))
-
test_equal(indices(({'f','o','o'})),({0,1,2}))
-
test_equal(Array.sort_array(indices(([7:3,8:9,99:12]))),({7,8,99}))
-
test_equal(Array.sort_array(indices((<7,8,99>))),({7,8,99}))
-
test_equal(mkmultiset(indices(class{constant a="a"; constant b="b";}())),
-
(<"a","b">))
-
-
// - initgroups
-
// - innetgrp
-
-
// - int2char
-
// - int2hex
-
// Tested in String
-
-
// - intp
-
// Tested in foop
-
-
// - is_absolute_path
-
// Tested in lib
-
-
// - kill
-
// - load_module
-
-
// - localtime
-
ifefun(localtime,[[
-
test_true(mappingp(localtime(0)))
-
test_do([[int t = -1; catch(localtime(t));]])
-
]])
-
cond([[all_constants()->localtime && all_constants()->mktime]],
-
[[
-
test_any([[int x=time(); return mktime(localtime(x)) == x;]], 1)
-
test_any([[int x=time(); for(int y=0;y<100;y++) if(mktime(localtime(x+y)) != x+y) return x+y; return 0;]], 0)
-
]])
-
-
-
// - log
-
// Tested in _math
-
-
// - lower_case
-
test_equal(lower_case("foo"),"foo")
-
test_equal(lower_case("Foo"),"foo")
-
test_equal(lower_case("Foo1234-*~\n"),"foo1234-*~\n")
-
test_equal(lower_case("foo\x3000"),"foo\x3000")
-
test_equal(lower_case("Foo\x3000"),"foo\x3000")
-
test_equal(lower_case("Foo1234-*~\n\x3000"),"foo1234-*~\n\x3000")
-
test_equal(lower_case("foo\x13000"),"foo\x13000")
-
test_equal(lower_case("Foo\x13000"),"foo\x13000")
-
test_equal(lower_case("Foo1234-*~\n\x13000"),"foo1234-*~\n\x13000")
-
test_equal(lower_case("Foo\x178"),"foo\xff")
-
test_equal(lower_case("Foo\x39c"),"foo\x3bc")
-
test_equal(lower_case((string) ({
-
// These characters correspond to the cases in case_info.h
-
// Please update this and the corresponding upper_case table
-
// when UnicodeData.txt is changed.
-
// Part 1: 0x0000 - 0x0FFF
-
0x0000, 0x0041, 0x005b, 0x0061, 0x007b, 0x00b5, 0x00b6, 0x00c0,
-
0x00d7, 0x00d8, 0x00df, 0x00e0, 0x00f7, 0x00f8, 0x00ff, 0x0100,
-
0x0130, 0x0131, 0x0132, 0x0138, 0x0139, 0x0149, 0x014a, 0x0178,
-
0x0179, 0x017f, 0x0180, 0x0181, 0x0182, 0x0186, 0x0187, 0x0189,
-
0x018b, 0x018d, 0x018e, 0x018f, 0x0190, 0x0191, 0x0193, 0x0194,
-
0x0195, 0x0196, 0x0197, 0x0198, 0x019a, 0x019b, 0x019c, 0x019d,
-
0x019e, 0x019f, 0x01a0, 0x01a6, 0x01a7, 0x01a9, 0x01aa, 0x01ac,
-
0x01ae, 0x01af, 0x01b1, 0x01b3, 0x01b7, 0x01b8, 0x01ba, 0x01bc,
-
0x01be, 0x01bf, 0x01c0, 0x01c4, 0x01c5, 0x01c7, 0x01c8, 0x01ca,
-
0x01cb, 0x01dd, 0x01de, 0x01f0, 0x01f1, 0x01f2, 0x01f6, 0x01f7,
-
0x01f8, 0x0220, 0x0221, 0x0222, 0x0234, 0x023a, 0x023b, 0x023d,
-
0x023e, 0x023f, 0x0241, 0x0243, 0x0244, 0x0245, 0x0246, 0x0250,
-
0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0258, 0x0259,
-
0x025a, 0x025b, 0x025c, 0x025d, 0x0260, 0x0261, 0x0262, 0x0263,
-
0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026a, 0x026b,
-
0x026c, 0x026d, 0x026f, 0x0270, 0x0271, 0x0272, 0x0273, 0x0275,
-
0x0276, 0x027d, 0x027e, 0x0280, 0x0281, 0x0283, 0x0284, 0x0287,
-
0x0288, 0x0289, 0x028a, 0x028c, 0x028d, 0x0292, 0x0293, 0x029d,
-
0x029e, 0x029f, 0x0345, 0x0346, 0x0370, 0x0374, 0x0376, 0x0378,
-
0x037b, 0x037e, 0x037f, 0x0380, 0x0386, 0x0387, 0x0388, 0x038b,
-
0x038c, 0x038d, 0x038e, 0x0390, 0x0391, 0x03a0, 0x03a2, 0x03a3,
-
0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03c0, 0x03c2, 0x03c3, 0x03cc,
-
0x03cd, 0x03cf, 0x03d0, 0x03d1, 0x03d2, 0x03d5, 0x03d6, 0x03d7,
-
0x03d8, 0x03f0, 0x03f1, 0x03f2, 0x03f3, 0x03f4, 0x03f5, 0x03f6,
-
0x03f7, 0x03f9, 0x03fa, 0x03fc, 0x03fd, 0x0400, 0x0410, 0x0420,
-
0x0430, 0x0440, 0x0450, 0x0460, 0x0482, 0x048a, 0x04c0, 0x04c1,
-
0x04cf, 0x04d0, 0x0530, 0x0531, 0x0557, 0x0561, 0x0587, })), (string) ({
-
0x0000, 0x0061, 0x005b, 0x0061, 0x007b, 0x00b5, 0x00b6, 0x00e0,
-
0x00d7, 0x00f8, 0x00df, 0x00e0, 0x00f7, 0x00f8, 0x00ff, 0x0101,
-
0x0069, 0x0131, 0x0133, 0x0138, 0x013a, 0x0149, 0x014b, 0x00ff,
-
0x017a, 0x017f, 0x0180, 0x0253, 0x0183, 0x0254, 0x0188, 0x0256,
-
0x018c, 0x018d, 0x01dd, 0x0259, 0x025b, 0x0192, 0x0260, 0x0263,
-
0x0195, 0x0269, 0x0268, 0x0199, 0x019a, 0x019b, 0x026f, 0x0272,
-
0x019e, 0x0275, 0x01a1, 0x0280, 0x01a8, 0x0283, 0x01aa, 0x01ad,
-
0x0288, 0x01b0, 0x028a, 0x01b4, 0x0292, 0x01b9, 0x01ba, 0x01bd,
-
0x01be, 0x01bf, 0x01c0, 0x01c6, 0x01c6, 0x01c9, 0x01c9, 0x01cc,
-
0x01cc, 0x01dd, 0x01df, 0x01f0, 0x01f3, 0x01f3, 0x0195, 0x01bf,
-
0x01f9, 0x019e, 0x0221, 0x0223, 0x0234, 0x2c65, 0x023c, 0x019a,
-
0x2c66, 0x023f, 0x0242, 0x0180, 0x0289, 0x028c, 0x0247, 0x0250,
-
0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0258, 0x0259,
-
0x025a, 0x025b, 0x025c, 0x025d, 0x0260, 0x0261, 0x0262, 0x0263,
-
0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026a, 0x026b,
-
0x026c, 0x026d, 0x026f, 0x0270, 0x0271, 0x0272, 0x0273, 0x0275,
-
0x0276, 0x027d, 0x027e, 0x0280, 0x0281, 0x0283, 0x0284, 0x0287,
-
0x0288, 0x0289, 0x028a, 0x028c, 0x028d, 0x0292, 0x0293, 0x029d,
-
0x029e, 0x029f, 0x0345, 0x0346, 0x0371, 0x0374, 0x0377, 0x0378,
-
0x037b, 0x037e, 0x03f3, 0x0380, 0x03ac, 0x0387, 0x03ad, 0x038b,
-
0x03cc, 0x038d, 0x03cd, 0x0390, 0x03b1, 0x03c0, 0x03a2, 0x03c3,
-
0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03c0, 0x03c2, 0x03c3, 0x03cc,
-
0x03cd, 0x03d7, 0x03d0, 0x03d1, 0x03d2, 0x03d5, 0x03d6, 0x03d7,
-
0x03d9, 0x03f0, 0x03f1, 0x03f2, 0x03f3, 0x03b8, 0x03f5, 0x03f6,
-
0x03f8, 0x03f2, 0x03fb, 0x03fc, 0x037b, 0x0450, 0x0430, 0x0440,
-
0x0430, 0x0440, 0x0450, 0x0461, 0x0482, 0x048b, 0x04cf, 0x04c2,
-
0x04cf, 0x04d1, 0x0530, 0x0561, 0x0557, 0x0561, 0x0587, }))
-
test_equal(lower_case((string) ({
-
// These characters correspond to the cases in case_info.h
-
// Please update this and the corresponding upper_case table
-
// when UnicodeData.txt is changed.
-
// Part 2: 0x1000 -
-
0x10a0, 0x10c6, 0x10c7, 0x10c8, 0x10cd, 0x10ce, 0x13a0, 0x13f0,
-
0x13f6, 0x13f8, 0x13fe, 0x1d79, 0x1d7a, 0x1d7d, 0x1d7e, 0x1e00,
-
0x1e96, 0x1e9b, 0x1e9c, 0x1e9e, 0x1e9f, 0x1ea0, 0x1f00, 0x1f08,
-
0x1f10, 0x1f16, 0x1f18, 0x1f1e, 0x1f20, 0x1f28, 0x1f30, 0x1f38,
-
0x1f40, 0x1f46, 0x1f48, 0x1f4e, 0x1f51, 0x1f52, 0x1f53, 0x1f54,
-
0x1f55, 0x1f56, 0x1f57, 0x1f58, 0x1f59, 0x1f5a, 0x1f5b, 0x1f5c,
-
0x1f5d, 0x1f5e, 0x1f5f, 0x1f60, 0x1f68, 0x1f70, 0x1f72, 0x1f76,
-
0x1f78, 0x1f7a, 0x1f7c, 0x1f7e, 0x1f80, 0x1f88, 0x1f90, 0x1f98,
-
0x1fa0, 0x1fa8, 0x1fb0, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb8, 0x1fba,
-
0x1fbc, 0x1fbd, 0x1fbe, 0x1fbf, 0x1fc3, 0x1fc4, 0x1fc8, 0x1fcc,
-
0x1fcd, 0x1fd0, 0x1fd2, 0x1fd8, 0x1fda, 0x1fdc, 0x1fe0, 0x1fe2,
-
0x1fe5, 0x1fe6, 0x1fe8, 0x1fea, 0x1fec, 0x1fed, 0x1ff3, 0x1ff4,
-
0x1ff8, 0x1ffa, 0x1ffc, 0x1ffd, 0x2126, 0x2127, 0x212a, 0x212b,
-
0x212c, 0x2132, 0x2133, 0x214e, 0x214f, 0x2160, 0x2180, 0x2183,
-
0x2185, 0x24b6, 0x24d0, 0x24ea, 0x2c00, 0x2c2f, 0x2c30, 0x2c5f,
-
0x2c60, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c6d,
-
0x2c6e, 0x2c6f, 0x2c70, 0x2c71, 0x2c72, 0x2c74, 0x2c75, 0x2c77,
-
0x2c7e, 0x2c80, 0x2ce4, 0x2ceb, 0x2cef, 0x2cf2, 0x2cf4, 0x2d00,
-
0x2d26, 0x2d27, 0x2d28, 0x2d2d, 0x2d2e, 0xa640, 0xa66e, 0xa680,
-
0xa69c, 0xa722, 0xa730, 0xa732, 0xa770, 0xa779, 0xa77d, 0xa77e,
-
0xa788, 0xa78b, 0xa78d, 0xa78e, 0xa790, 0xa794, 0xa796, 0xa7aa,
-
0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7b0, 0xa7b1, 0xa7b2, 0xa7b3,
-
0xa7b4, 0xa7b8, 0xab53, 0xab54, 0xab70, 0xabc0, 0xff21, 0xff3b,
-
0xff41, 0xff5b, 0x10400, 0x10428, 0x10450, 0x10c80, 0x10cb3, 0x10cc0,
-
0x010cf3, 0x0118a0, 0x0118e0, })), (string) ({
-
0x2d00, 0x10c6, 0x2d27, 0x10c8, 0x2d2d, 0x10ce, 0xab70, 0x13f8,
-
0x13f6, 0x13f8, 0x13fe, 0x1d79, 0x1d7a, 0x1d7d, 0x1d7e, 0x1e01,
-
0x1e96, 0x1e9b, 0x1e9c, 0x00df, 0x1e9f, 0x1ea1, 0x1f00, 0x1f00,
-
0x1f10, 0x1f16, 0x1f10, 0x1f1e, 0x1f20, 0x1f20, 0x1f30, 0x1f30,
-
0x1f40, 0x1f46, 0x1f40, 0x1f4e, 0x1f51, 0x1f52, 0x1f53, 0x1f54,
-
0x1f55, 0x1f56, 0x1f57, 0x1f58, 0x1f51, 0x1f5a, 0x1f53, 0x1f5c,
-
0x1f55, 0x1f5e, 0x1f57, 0x1f60, 0x1f60, 0x1f70, 0x1f72, 0x1f76,
-
0x1f78, 0x1f7a, 0x1f7c, 0x1f7e, 0x1f80, 0x1f80, 0x1f90, 0x1f90,
-
0x1fa0, 0x1fa0, 0x1fb0, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb0, 0x1f70,
-
0x1fb3, 0x1fbd, 0x1fbe, 0x1fbf, 0x1fc3, 0x1fc4, 0x1f72, 0x1fc3,
-
0x1fcd, 0x1fd0, 0x1fd2, 0x1fd0, 0x1f76, 0x1fdc, 0x1fe0, 0x1fe2,
-
0x1fe5, 0x1fe6, 0x1fe0, 0x1f7a, 0x1fe5, 0x1fed, 0x1ff3, 0x1ff4,
-
0x1f78, 0x1f7c, 0x1ff3, 0x1ffd, 0x03c9, 0x2127, 0x006b, 0x00e5,
-
0x212c, 0x214e, 0x2133, 0x214e, 0x214f, 0x2170, 0x2180, 0x2184,
-
0x2185, 0x24d0, 0x24d0, 0x24ea, 0x2c30, 0x2c2f, 0x2c30, 0x2c5f,
-
0x2c61, 0x026b, 0x1d7d, 0x027d, 0x2c65, 0x2c66, 0x2c68, 0x0251,
-
0x0271, 0x0250, 0x0252, 0x2c71, 0x2c73, 0x2c74, 0x2c76, 0x2c77,
-
0x023f, 0x2c81, 0x2ce4, 0x2cec, 0x2cef, 0x2cf3, 0x2cf4, 0x2d00,
-
0x2d26, 0x2d27, 0x2d28, 0x2d2d, 0x2d2e, 0xa641, 0xa66e, 0xa681,
-
0xa69c, 0xa723, 0xa730, 0xa733, 0xa770, 0xa77a, 0x1d79, 0xa77f,
-
0xa788, 0xa78c, 0x0265, 0xa78e, 0xa791, 0xa794, 0xa797, 0x0266,
-
0x025c, 0x0261, 0x026c, 0xa7ae, 0x029e, 0x0287, 0x029d, 0xab53,
-
0xa7b5, 0xa7b8, 0xab53, 0xab54, 0xab70, 0xabc0, 0xff41, 0xff3b,
-
0xff41, 0xff5b, 0x10428, 0x10428, 0x10450, 0x10cc0, 0x10cb3, 0x10cc0,
-
0x10cf3, 0x118c0, 0x118e0, }))
-
-
// - m_delete
-
// - map
-
-
// - mappingp
-
// Tested in foop
-
-
// - master
-
-
// - max
-
// - min
-
// Tested in _math
-
-
// - mkdir
-
-
// - mkmapping
-
test_equal(mkmapping(({}),({})), ([]))
-
test_equal(mkmapping(({0}),({0})), ([0:0]))
-
test_any_equal([[
-
array a=({"a"});
-
return mkmapping(a,a);
-
]], (["a":"a"]))
-
test_equal(mkmapping( ({({})}),({({})}) )[ ({}) ], ({}))
-
-
// - mkmultiset
-
test_equal(mkmultiset(({})), (<>))
-
test_equal(mkmultiset(({0})), (<0>))
-
test_equal(mkmultiset(({(<>)})), (<(<>)>))
-
-
// - mktime
-
ifefun(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,
-
]) ) ]])
-
-
test_any([[foreach(({1075550400,94691300,220921700,347152100,473382500,
-
599612900,725843300,852073700,978304100,1104534500,
-
1230764900,1356995300,1483225700,1609456100,1735686500,
-
1861916900,1988147300,2114377700
-
}),int t) {
-
int res = mktime (gmtime (t));
-
if(res!=t) return ({t, res});
-
}
-
return 0;]], 0)
-
-
test_eq(mktime (0, 0, 0, -200, -6, 101, 0, 0), 945043200);
-
test_eq(mktime (0, 0, 0, -1, 2, 107, 0, 0), 1172534400);
-
test_eq(mktime (0, 0, 0, 200, 1, 107, 0, 0), 1187481600);
-
test_eq(mktime (200, 200, 200, 200, 1, 107, 0, 0), 1188213800);
-
test_eq(mktime (-200, -200, -200, 200, 1, 107, 0, 0), 1186749400);
-
-
test_any( [[
-
// bug [2861] ------------------------------------------------------------
-
// http://community/crunch/show_bug.cgi?id=2861
-
return mktime(0,0,0,1,0,70,0,0);
-
]], 0)
-
-
test_any( [[
-
// bug [3270] ------------------------------------------------------------
-
// http://community/crunch/show_bug.cgi?id=3270
-
// Tue, 15 Oct 2002 09:38:32 GMT
-
return mktime(32, 38, 9, 15, 9, 102, 0, 0);
-
]], 1034674712)
-
]])
-
-
// - multisetp
-
// Tested in foop
-
-
// - mv
-
-
// - normalize_path
-
// Tested in lib
-
-
// - object_program
-
test_true(programp(object_program(this_object())))
-
test_true(object_program(this)==this_program)
-
-
// - object_variablep
-
// - openlog
-
-
// - pow
-
// Tested in _math
-
-
// - programp
-
// Tested in foop
-
-
// - putenv
-
// Tested in lib
-
-
// - query_num_arg
-
test_eq(lambda(int ... q) { return query_num_arg(); }(),0)
-
test_eq(lambda(int ... q) { return query_num_arg(); }(1),1)
-
test_eq(lambda(int ... q) { return query_num_arg(); }(1,1),2)
-
test_eq(lambda(int ... q) { return query_num_arg(); }(1,1,1),3)
-
test_eq(lambda(int ... q) { return query_num_arg(); }(1,1,1,1),4)
-
-
// - random
-
// Tested in Random
-
-
// - random_string
-
// Tested in Random
-
-
// - readlink
-
// - remove_call_out
-
-
// - remove_include_path
-
// - remove_module_path
-
// - remove_program_path
-
// Tested in lib
-
-
// - replace
-
test_eq(replace("foo","f","\x9999"),"\x9999oo")
-
test_eq(replace("foo",({"f"}),({"\x9999"})),"\x9999oo")
-
test_eq([[replace("11013",({"1","100","108","13","1069","1067","106","10"}),
-
({"A","B","C","D","E","F","G","H"}))]],"AHD")
-
test_eq([[replace("1264412124",({"126","124","12","122","1260"}),
-
({"13333","13335","883","13329","226709"}))]],"133334488313335")
-
test_eq(replace("foobargazonk","o","-"),"f--bargaz-nk")
-
test_eq(replace("foobargazonk",({"o","a"}),({"()","<>"})),"f()()b<>rg<>z()nk")
-
test_eq(replace("f--barf--",({"f--","f--bar"}),({"f--bar","f--"})),"f--f--bar")
-
test_eq(replace("f--barf--",({"f--bar","f--"}),({"f--","f--bar"})),"f--f--bar")
-
test_eq(replace("test\ntest\n\ntest\ntest",({"\n","\n\n"}),({" ","<p>"})),"test test<p>test test")
-
test_eq(replace("test\ntest\n\ntest\ntest",({"\n\n","\n"}),({"<p>"," "})),"test test<p>test test")
-
test_eq(replace("\xfffffff0", ({ "\xfffffff0" }), ({ "" })), "")
-
test_eq([[ replace("abcdefg", ([ "a":"x", "d":"y", "h":"z" ])) ]], "xbcyefg")
-
-
test_eq("123\000456""890"-"\0", "123\456""890")
-
test_eq("123\456000""890"-"\0", "123\456000""890")
-
-
test_any([[
-
array a=({ 1 });
-
replace(a,1,2);
-
return a[0];
-
]], 2)
-
-
test_any([[
-
mapping a=([ 1:1 ]);
-
replace(a,1,2);
-
return a[1];
-
]], 2)
-
-
test_any([[
-
function reference=lambda(string x, array(string) a, array(string) b)
-
{
-
string ret="";
-
for(int pos=0;pos<strlen(x);)
-
{
-
int best=-1;
-
int bestlen=-1;
-
for(int e=0;e<sizeof(a);e++)
-
{
-
if(strlen(a[e])>bestlen)
-
{
-
if(x[pos..pos+strlen(a[e])-1] == a[e])
-
{
-
best=e;
-
bestlen=strlen(a[e]);
-
}
-
}
-
}
-
-
if(best==-1)
-
{
-
ret+=x[pos..pos];
-
pos++;
-
}else{
-
ret+=b[best];
-
pos+=bestlen;
-
}
-
}
-
return ret;
-
};
-
-
for(int e=0;e<10000;e++)
-
{
-
array(string) base=(array(string)) ( (({random})*(1+random(10)))(20) );
-
-
for(int d=0;d<random(random(40));d++)
-
base+=({ base[ random(sizeof(base))] + random(10) });
-
-
base=Array.uniq(base);
-
array(string) to=(array(string))Array.map(base,hash);
-
-
string text="";
-
for(int d=0;d<1+random(random(50));d++)
-
{
-
if(random(2))
-
text+=base[ random(sizeof(base))];
-
else
-
text+=sprintf("%2d",random(100));
-
}
-
-
string r1=replace(text,base,to);
-
string r2=reference(text,base,to);
-
-
if(r1 != r2)
-
{
-
werror("\nFailure:\n");
-
werror("Text: %O\n",text);
-
werror("From: %O\n",base);
-
werror("To : %O\n",to);
-
werror("Builtin: %O\n",r1);
-
werror("Ref : %O\n",r2);
-
return -1;
-
}
-
}
-
return 1;
-
]],1)
-
-
test_eq(replace("f\777\777bargaz\777nk","\777","-"),"f--bargaz-nk")
-
test_eq(replace("f\777\777bargaz\777nk",({"\777","a"}),({"()","<>"})),"f()()b<>rg<>z()nk")
-
test_eq(replace("f\777\777barf\777\777",({"f\777\777","f\777\777bar"}),({"f\777\777bar","f\777\777"})),"f\777\777f\777\777bar")
-
test_eq(replace("f\777\777barf\777\777",({"f\777\777bar","f\777\777"}),({"f\777\777","f\777\777bar"})),"f\777\777f\777\777bar")
-
-
test_eq(replace("f\7777777\7777777bargaz\7777777nk","\7777777","-"),"f--bargaz-nk")
-
test_eq(replace("f\7777777\7777777bargaz\7777777nk",({"\7777777","a"}),({"()","<>"})),"f()()b<>rg<>z()nk")
-
test_eq(replace("f\7777777\7777777barf\7777777\7777777",({"f\7777777\7777777","f\7777777\7777777bar"}),({"f\7777777\7777777bar","f\7777777\7777777"})),"f\7777777\7777777f\7777777\7777777bar")
-
test_eq(replace("f\7777777\7777777barf\7777777\7777777",({"f\7777777\7777777bar","f\7777777\7777777"}),({"f\7777777\7777777","f\7777777\7777777bar"})),"f\7777777\7777777f\7777777\7777777bar")
-
-
test_equal(replace(({1,2,3,4,5,1,2,3,4}),3,-1),({1,2,-1,4,5,1,2,-1,4}))
-
test_equal(replace(([1:2,3:4,5:1,2:3]),3,-1),([1:2,3:4,5:1,2:-1]))
-
-
test_eval_error([[
-
mapping a = ([ "a":"b", 3:"c" ]);
-
return replace("bar", a);
-
]])
-
test_eval_error([[
-
mapping a = ([ "a":"b", "c":3 ]);
-
return replace("bar", a);
-
]])
-
test_eval_error([[
-
return replace("bar", ({"a"}), ({"b","c"}));
-
]])
-
-
// - replace_master
-
-
// - reverse
-
test_eq(reverse("reverse"),"esrever")
-
test_eq(reverse("r\777v\777rs\777"),"\777sr\777v\777r")
-
test_eq(reverse("r\7777777v\7777777rs\7777777"),"\7777777sr\7777777v\7777777r")
-
test_eq(reverse(""),"")
-
test_eq(reverse("a"),"a")
-
test_equal(reverse(({1,5,9})),({9,5,1}))
-
test_equal(reverse(({})),({}))
-
test_equal(reverse(({42})),({42}))
-
test_equal(reverse(({42,4711})),({4711,42}))
-
test_equal(reverse(0x12345678),0x1e6a2c48)
-
-
// - rm
-
-
// - round
-
// Tested in _math
-
-
// - rows
-
test_equal([[rows(({1,2,3,4,5,6,7,8,9}),({6,7,2}))]],[[({7,8,3})]])
-
test_equal([[rows(({1,2,3,4,5,6,7,8,9}),({0,4,1}))]],[[({1,5,2})]])
-
test_equal([[rows(({1,2,3,4,5,6,7,8,9}),({8,3,5}))]],[[({9,4,6})]])
-
-
// - search
-
test_eval_error(return search("foolbar","o",-10))
-
test_eval_error(return search("foolbar","o",2983742))
-
test_eq(search("foolbar","gazonk"),-1)
-
test_eq(search("qowiueproqiuweproiwqueoplkjljlklksjjriwueproiuwerowieu","lkjljlklksjj"),24)
-
test_eq(search("lkjljlklksjjriwueproiuwerlskjdvlaskjfowieu","lkjljlklksjj"),0)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj","lkjljlklksjj"),24)
-
-
// Search cache is initialized with 10 slots.
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj1","lkjljlklksjj1"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj2","lkjljlklksjj2"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj3","lkjljlklksjj3"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj4","lkjljlklksjj4"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj5","lkjljlklksjj5"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj6","lkjljlklksjj6"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj7","lkjljlklksjj7"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj8","lkjljlklksjj8"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj9","lkjljlklksjj9"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj0","lkjljlklksjj0"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjjx","lkjljlklksjjx"),24)
-
test_eq(search("aaaaaaaaaaaaaaaaaaaaaaaalkjljlklksjj","lkjljlklksjj"),24)
-
-
test_eq(search("foobargazonk","oo"),1)
-
test_eq(search("foobargazonk","o",3),9)
-
test_eq(search("foobargazonk","o",9),9)
-
test_eq(search("foobargazonk","o",10),-1)
-
test_eq(search("foobargazonk","x",9),-1)
-
test_eq(search(({56,8,2,6,2,7,3,56,7}),8),1)
-
test_eq(search(({56,8,2,6,2,7,3,56,7}),56,0),0)
-
test_eq(search(({56,8,2,6,2,7,3,56,7}),56,1),7)
-
test_eq(search(({56,8,2,6,2,7,3,56,7}),56,7),7)
-
test_eq(search(({56,8,2,6,2,7,3,56,7}),56,8),-1)
-
test_eq(search(({"foo"}),"foo"),0)
-
test_eq(search("fo-obar|gazonk"/"|","fo-obar"),0)
-
test_eq(search("fo-obar|gazonk"/"|","gazonk"),1)
-
test_eq(search(([1:2,3:4,5:6,7:8]),4),3)
-
test_true(zero_type(search(([1:2,3:4,5:6,7:8]),(int)3)))
-
test_eq(search(([1:2,3:4,5:6,7:8]),8),7)
-
test_eq(search("foo",""),0)
-
test_any([[
-
mapping m=([]);
-
m+=(["x":([])]);
-
m->x->y++;
-
m=([]);
-
m+=(["x":([])]);
-
return m->x->y;
-
]], 0)
-
-
test_do([[
-
class C
-
{
-
mapping m;
-
-
int `==()
-
{
-
foreach(indices(m), mixed x)
-
m_delete(m, x);
-
return 0;
-
}
-
-
void create(mapping _m)
-
{
-
m = _m;
-
}
-
};
-
-
mapping m = ([ ]);
-
C o = C(m);
-
-
for(int i = 0; i < 100; i++)
-
m[i] = o;
-
-
return search(m, 4711);
-
]])
-
-
test_any_equal([[
-
mapping m = (["foo": "bar", "bar": "gnu", "gnu": "bar"]);
-
array a = ({});
-
a += ({search (m, "bar")});
-
a += ({search (m, "bar", a[-1])});
-
a += ({search (m, "bar", a[-1])});
-
return sort (a);
-
]], sort(({0, "foo", "gnu"})))
-
-
test_equal([[
-
sort(({"\Uffffffff","\0", "", "\177", "\377", "\U7fffffff"}));
-
]], ({ "", "\Uffffffff", "\0", "\177", "\377", "\U7fffffff" }))
-
-
// test large searches (find string, size, pattern)
-
define(test_search,[[
-
test_eq(sprintf($1+"%'"+$3+"'*n",$2)[..strlen($1)-1],$1)
-
test_eq(search(sprintf($1+"%'"+$3+"'*n",$2),$1),0)
-
test_eq(search(sprintf("%'"+$3+"'*n" ,$2),$1),-1)
-
test_eq(search(sprintf("%'"+$3+"'*n"+$1,$2),$1),$2)
-
test_eq(search(sprintf("%'"+$3+"'*n"+$1+"%'"+$3+"'*n",$2,$2),$1),$2)
-
]])
-
-
define(test_search2,[[dnl
-
test_search($1,$2,$3)
-
test_search($1,$2+1,$3)
-
test_search($1,$2+2,$3)
-
test_search($1,$2+3,$3)
-
test_search($1,$2+4,$3)
-
test_search($1,$2+5,$3)
-
]])
-
-
define(test_search3,[[dnl
-
test_search2($1,10,$2)
-
test_search2($1,1000,$2)
-
test_search2($1,100000,$2)
-
]])
-
-
define(test_search4,[[dnl
-
test_search3($1,"+-*")
-
test_search3($1,($1[..strlen($1)-2]))
-
test_search3($1,($1[..strlen($1)-3]))
-
test_search3($1,($1[1..]))
-
]])
-
-
dnl some m4's don't handle 8 bit characters...
-
test_search4("SUNE")
-
test_search4("kapit\344l>")
-
test_search4("-------------------+")
-
test_search4("\345-------------------")
-
test_search4(sprintf("%'argel-bargel glop-glyf?'2000n"))
-
test_search4("\34567-------------------")
-
test_search4("\345677777-------------------")
-
test_search4("kapit\3333l>")
-
test_search4("kapit\3333333l>")
-
-
// - set_priority
-
// - set_weak_flag
-
// - setegid
-
// - seteuid
-
// - setgid
-
// - setgrent
-
// - setgroups
-
// - setpgrp
-
// - setpwent
-
// - setresgid
-
// - setresuid
-
// - setsid
-
// - setuid
-
-
// - sgn
-
// Tested in _math
-
-
// - signal
-
// - signame
-
// - signum
-
-
// - sin
-
// Tested in _math
-
-
// - sizeof
-
test_eq(sizeof("felbar"),6)
-
test_eq(sizeof(({"fulbar","gazonk",7})),3)
-
test_eq(sizeof(([8:3,6:6,7:0])),3)
-
test_eq(sizeof((<8,7,6,5,4,7>)),6)
-
test_eq([[ sizeof( class { int _sizeof() { return 17; } }() ) ]], 17)
-
-
// - sleep
-
test_do(sleep(1))
-
test_do(sleep(0.5))
-
test_any([[int x=time(); sleep(2); return x!=time()]],1)
-
test_any([[int x=time(); sleep(2); return x!=time()]],1)
-
-
// - sort
-
test_equal(sort(({1,3,2,4})),({1,2,3,4}))
-
test_equal(sort(({4,3,2,1})),({1,2,3,4}))
-
test_equal(sort(({({1, 4}), ({3, 2}), ({2, 3}), ({4, 1})})),
-
({({1, 4}), ({2, 3}), ({3, 2}), ({4, 1})}))
-
test_equal(sort(({({4, 1}), ({2, 3}), ({3, 2}), ({1, 4})})),
-
({({1, 4}), ({2, 3}), ({3, 2}), ({4, 1})}))
-
test_equal([[lambda() {array(int) a=({1,2,3,4}); sort(({4,3,2,1}),a); return a; }()]],[[({4,3,2,1})]] )
-
test_equal([[lambda() {array(int) a=({1,2,3,4}), b=a+({}); sort(({4,3,2,1}),a,b); return b; }()]],[[({4,3,2,1})]] )
-
test_equal([[sort("a,A,å,Å,ä,*A,[A"/",")]],[["*A,A,[A,a,Å,ä,å"/","]])
-
test_equal([[sort(sprintf("%c",enumerate(256)[*]))]],
-
[[sprintf("%c",enumerate(256)[*])]])
-
test_equal([[sort(sprintf("%c",enumerate(1024)[*]))]],
-
[[sprintf("%c",enumerate(1024)[*])]])
-
test_equal(sort(({})),({}))
-
test_equal(sort(({1.0,2.0,4.0,3.0})),({1.0,2.0,3.0,4.0}))
-
test_any_equal([[
-
// sort() on one arg should be stable.
-
class C (int id) {int `< (mixed x) {return 0;}};
-
return sort (({C(2), C(6), C(1), C(4), C(3), C(5)}))->id;
-
]], ({2, 6, 1, 4, 3, 5}))
-
test_any_equal([[
-
// sort() on several args should be stable.
-
array a = ({2, 6, 1, 4, 3, 5});
-
sort (({1, 1, 1, 1, 1, 1}), a);
-
return a;
-
]], ({2, 6, 1, 4, 3, 5}))
-
test_any_equal([[
-
// sort() on several args should be stable.
-
array a = ({2, 6, 1, 4, 3, 5});
-
sort (({1, 2, 1, 2, 1, 2}), a);
-
return a;
-
]], ({2, 1, 3, 6, 4, 5}))
-
test_any([[
-
class foo {
-
int x=random(100);
-
int `<(object o) {return x < o->x;}
-
};
-
array(object) o=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_equal(sort (({(<2>), (<1>)})), ({(<1>), (<2>)}))
-
test_any_equal([[
-
function pike_fun = lambda() {};
-
function c_fun = sleep;
-
return ({equal (sort (({pike_fun, pike_fun})), ({pike_fun, pike_fun})),
-
equal (sort (({c_fun, c_fun})), ({c_fun, c_fun})),
-
equal (sort (({pike_fun, c_fun})), ({pike_fun, c_fun})),
-
equal (sort (({c_fun, pike_fun})), ({pike_fun, c_fun}))});
-
]], [[({1, 1, 1, 1})]])
-
-
dnl missing tests for objects, arrays, multisets and mappings
-
-
// - sprintf
-
// Tested in sprintf
-
-
// - sqrt
-
// Tested in _math
-
-
// - strerror
-
test_true(stringp(strerror(0)))
-
test_true(stringp(strerror(1)))
-
test_true(stringp(strerror(-1)))
-
-
// - string_to_unicode, unicode_to_string
-
dnl string, utf16, utf16le
-
define(test_unicode, [[
-
test_eq(string_to_unicode($1), $2)
-
test_eq(string_to_unicode($1, 0), $2)
-
test_eq(string_to_unicode($1, 1), $3)
-
test_eq(string_to_unicode($1, 2),
-
((Pike.get_runtime_info()->native_byteorder == 1234)?$3:$2))
-
test_eq(unicode_to_string($2), $1)
-
test_eq(unicode_to_string($2, 0), $1)
-
test_eq(unicode_to_string($3, 1), $1)
-
test_eq(unicode_to_string(((Pike.get_runtime_info()->native_byteorder == 1234)?$3:$2), 2), $1)
-
test_eq(unicode_to_string("\xfe\xff" $2), $1)
-
test_eq(unicode_to_string("\xfe\xff" $2, 0), $1)
-
test_eq(unicode_to_string("\xfe\xff" $2, 1), $1)
-
test_eq(unicode_to_string("\xfe\xff" $2, 2), $1)
-
test_eq(unicode_to_string("\xff\xfe" $3), $1)
-
test_eq(unicode_to_string("\xff\xfe" $3, 0), $1)
-
test_eq(unicode_to_string("\xff\xfe" $3, 1), $1)
-
test_eq(unicode_to_string("\xff\xfe" $3, 2), $1)
-
]])
-
test_unicode("", "", "")
-
test_unicode("foo", "\0f\0o\0o", "f\0o\0o\0")
-
test_unicode("blä", "\0b\0l\0ä", "b\0l\0ä\0")
-
test_unicode("\77077", "\176\77", "\77\176")
-
test_unicode("\777077", "\330\277\336\77", "\277\330\77\336")
-
test_unicode("\777077foo\77077\777077blä\777077",
-
"\330\277\336\77\0f\0o\0o\176\77\330\277\336\77\0b\0l\0ä\330\277\336\77",
-
"\277\330\77\336f\0o\0o\0\77\176\277\330\77\336b\0l\0ä\0\277\330\77\336")
-
-
test_eval_error(return string_to_unicode("\7077077"))
-
test_eval_error(return string_to_unicode("\xffff\x10000"))
-
test_eval_error(return unicode_to_string(" "))
-
-
// - string_to_utf8, utf8_to_string
-
test_eq(string_to_utf8("foo"), "foo")
-
test_eq(string_to_utf8("blä"), "bl\303\244")
-
test_eq(string_to_utf8("\77077"), "\347\270\277")
-
test_eq(string_to_utf8("\7077077", 1), "\367\207\270\277")
-
test_eq(string_to_utf8("\77077077", 1), "\370\277\207\270\277")
-
test_eq(string_to_utf8("\7077077077", 1), "\374\270\277\207\270\277")
-
-
// 077077077077 has 33 bits unsigned. The escape sequence parser used
-
// to silently truncate too long char values, but not anymore.
-
dnl test_eq(string_to_utf8("\77077077077", 1), "\376\203\270\277\207\270\277")
-
dnl test_eq(utf8_to_string("\376\203\270\277\207\270\277", 1), "\77077077077")
-
// The following uses the char that actually got tested.
-
test_eq(string_to_utf8("\37077077077", 1), "\376\203\270\277\207\270\277")
-
test_eq(utf8_to_string("\376\203\270\277\207\270\277", 1), "\37077077077")
-
-
test_eq(utf8_to_string("\374\270\277\207\270\277", 1), "\7077077077")
-
test_eq(utf8_to_string("\370\277\207\270\277", 1), "\77077077")
-
test_eq(utf8_to_string("\367\207\270\277", 1), "\7077077")
-
test_eq(utf8_to_string("\347\270\277"), "\77077")
-
test_eq(utf8_to_string("bl\303\244"), "blä")
-
test_eq(utf8_to_string("foo"), "foo")
-
-
test_eval_error(return string_to_utf8("\77077077077"))
-
test_eval_error(return utf8_to_string("\376\203\270\277\207\270\277"))
-
test_eval_error(return utf8_to_string("\277"));
-
test_eval_error(return utf8_to_string("\377"));
-
test_eval_error(return utf8_to_string("\376\203\270\277\207\270", 1));
-
test_eval_error(return utf8_to_string("\374\270\277\207\270"));
-
test_eval_error(return utf8_to_string("\370\277\207\270"));
-
test_eval_error(return utf8_to_string("\367\207\270"));
-
test_eval_error(return utf8_to_string("\347\270"));
-
test_eval_error(return utf8_to_string("\303"));
-
test_eval_error(return utf8_to_string("\376\203\270\277\207\270a"));
-
test_eval_error(return utf8_to_string("\374\270\277\207\270a"));
-
test_eval_error(return utf8_to_string("\370\277\207\270a"));
-
test_eval_error(return utf8_to_string("\367\207\270a"));
-
test_eval_error(return utf8_to_string("\347\270a"));
-
test_eval_error(return utf8_to_string("\303a"));
-
-
// Invalid ranges
-
test_eq(string_to_utf8 ("\ud7ff"), "\u00ed\u009f\u00bf")
-
test_eval_error(return string_to_utf8 ("\ud800"))
-
test_eq(string_to_utf8 ("\ud800", 1), "\u00ed\u00a0\u0080")
-
test_eq(string_to_utf8 ("\udfff", 1), "\u00ed\u00bf\u00bf")
-
test_eval_error(return string_to_utf8 ("\udfff"))
-
test_eq(string_to_utf8 ("\ue000"), "\u00ee\u0080\u0080")
-
test_eq(string_to_utf8 ("\U0010ffff"), "\u00f4\u008f\u00bf\u00bf")
-
test_eval_error(return string_to_utf8 ("\U00110000"))
-
test_eq(string_to_utf8 ("\U00110000", 1), "\u00f4\u0090\u0080\u0080")
-
-
test_eq(utf8_to_string ("\u00ed\u009f\u00bf"), "\ud7ff")
-
test_eval_error(return utf8_to_string ("\u00ed\u00a0\u0080"))
-
test_eq(utf8_to_string ("\u00ed\u00a0\u0080", 1), "\ud800")
-
test_eq(utf8_to_string ("\u00ed\u00bf\u00bf", 1), "\udfff")
-
test_eval_error(return utf8_to_string ("\u00ed\u00bf\u00bf"))
-
test_eq(utf8_to_string ("\u00ee\u0080\u0080"), "\ue000")
-
test_eq(utf8_to_string ("\u00f4\u008f\u00bf\u00bf"), "\U0010ffff")
-
test_eval_error(return utf8_to_string ("\u00f4\u0090\u0080\u0080"))
-
test_eq(utf8_to_string ("\u00f4\u0090\u0080\u0080", 1), "\U00110000")
-
test_eval_error(return utf8_to_string ("\u00f8\u0088\u0080\u0080\u0080"))
-
test_eval_error(return utf8_to_string ("\u00fc\u0084\u0080\u0080\u0080\u0080"))
-
test_eval_error(return utf8_to_string ("\u00fe\u0082\u0080\u0080\u0080\u0080\u0080"))
-
test_eq(utf8_to_string ("\u00fe\u0083\u00bf\u00bf\u00bf\u00bf\u00bf", 1), "\Uffffffff")
-
test_eval_error(return utf8_to_string ("\u00fe\u0084\u0080\u0080\u0080\u0080\u0080", 1))
-
test_eval_error(return utf8_to_string ("\u00ff"))
-
test_eval_error(return utf8_to_string ("\u00ff", 1))
-
-
// Non-shortest forms
-
test_eval_error(return utf8_to_string ("\u00c0\u0080"))
-
test_eval_error(return utf8_to_string ("\u00c1\u00bf"))
-
test_eq(utf8_to_string ("\u00c2\u0080"), "\u0080")
-
test_eval_error(return utf8_to_string ("\u00e0\u0080\u0080"))
-
test_eval_error(return utf8_to_string ("\u00e0\u009f\u00bf"))
-
test_eq(utf8_to_string ("\u00e0\u00a0\u0080"), "\u0800"))
-
test_eval_error(return utf8_to_string ("\u00f0\u0080\u0080\u0080"))
-
test_eval_error(return utf8_to_string ("\u00f0\u008f\u00bf\u00bf"))
-
test_eq(utf8_to_string ("\u00f0\u0090\u0080\u0080"), "\U00010000")
-
test_eval_error(return utf8_to_string ("\u00f8\u0080\u0080\u0080\u0080", 1))
-
test_eval_error(return utf8_to_string ("\u00f8\u0087\u00bf\u00bf\u00bf", 1))
-
test_eq(utf8_to_string ("\u00f8\u0088\u0080\u0080\u0080", 1), "\U00200000")
-
test_eval_error(return utf8_to_string ("\u00fc\u0080\u0080\u0080\u0080\u0080", 1))
-
test_eval_error(return utf8_to_string ("\u00fc\u0083\u00bf\u00bf\u00bf\u00bf", 1))
-
test_eq(utf8_to_string ("\u00fc\u0084\u0080\u0080\u0080\u0080", 1), "\U04000000")
-
test_eval_error(return utf8_to_string ("\u00fe\u0080\u0080\u0080\u0080\u0080\u0080", 1))
-
test_eval_error(return utf8_to_string ("\u00fe\u0081\u00bf\u00bf\u00bf\u00bf\u00bf", 1))
-
test_eq(utf8_to_string ("\u00fe\u0082\u0080\u0080\u0080\u0080\u0080", 1), "\U80000000")
-
-
// - stringp
-
// Tested in foop
-
-
// - strlen
-
test_compile_error(strlen( ({}) ))
-
-
// - symlink
-
// - syslog
-
-
// - tan
-
// Tested in _math
-
-
// - this_object and this
-
test_true(objectp(this_object()))
-
test_true(objectp(this))
-
test_true(objectp(global::this))
-
test_true(this_object() == this)
-
test_true([[typeof(this) == typeof(this_object())]])
-
test_true([[typeof(this) == typeof(global::this)]])
-
test_true([[typeof(this_program) == typeof(object_program(this_object()))]])
-
test_true([[typeof(this_program) == typeof(object_program(global::this))]])
-
-
test_program_eq([[
-
string _sprintf() {return "g";}
-
class A {
-
string _sprintf() {return "A";}
-
class B {
-
string _sprintf() {return "B";}
-
mixed f() {
-
return sprintf ("%O%O%O%O%O%O",
-
global::this, A::this, B::this, this_program::this, this::this, this);
-
}
-
}
-
}
-
string a() {return A()->B()->f();}
-
]], "gABBBB")
-
-
test_program_eq([[
-
string _sprintf() {return "g";}
-
class A {
-
string _sprintf() {return "A";}
-
class B {
-
string _sprintf() {return "B";}
-
mixed f() {
-
return sprintf ("%O%O%O%O%O",
-
this_object (2), this_object (1), this_object (0), this_object(), this);
-
}
-
}
-
}
-
string a() {return A()->B()->f();}
-
]], "gABBB")
-
-
test_program_eq([[
-
string _sprintf() {return "g";}
-
class A {
-
string _sprintf() {return "A";}
-
class B {
-
string _sprintf() {return "B";}
-
mixed f() {
-
return map (({2, 1, 0}), lambda (int l) {
-
return sprintf ("%O", this_object (l));
-
}) * "";
-
}
-
}
-
}
-
string a() {return A()->B()->f();}
-
]], "gAB")
-
-
test_program_eq([[
-
string _sprintf() {return "g";}
-
class A {
-
string _sprintf() {return "A";}
-
class B {
-
string _sprintf() {return "B";}
-
mixed f() {
-
return sprintf ("%O%O%O%O%O%O",
-
global::this, A::this, B::this, this_program::this, this::this, this);
-
}
-
}
-
constant this = 7;
-
}
-
string a() {return A()->B()->f();}
-
]], "g7BBB7")
-
-
test_compile_error([[
-
this = 17;
-
]])
-
-
test_compile_error([[
-
class A {
-
class B {
-
void f() {A::this = 17;}
-
}
-
};
-
]])
-
-
test_any([[
-
class A {
-
class B {
-
A parent() {return A::this;}
-
}
-
};
-
A a = A();
-
A.B b = a->B();
-
destruct (a);
-
return zero_type (b->parent());
-
]], 2)
-
-
test_eval_error([[
-
class A {
-
class B {
-
class C {
-
A grandparent() {return A::this;}
-
}
-
}
-
};
-
A.B b = A()->B();
-
A.B.C c = b->C();
-
destruct (b);
-
b->grandparent();
-
]], 2)
-
-
test_program_eq([[
-
string _sprintf() {return "g";}
-
class A {
-
string _sprintf() {return "A";}
-
mixed f() {
-
return sprintf ("%O%O", global::this, A::this);
-
}
-
}
-
class B {
-
string _sprintf() {return "B";}
-
class C {
-
inherit A;
-
string _sprintf() {return "C";}
-
mixed f() {
-
return A::f() + sprintf ("%O%O%O%O",
-
global::this, B::this, this_program::this, this);
-
}
-
}
-
}
-
string a() {return B()->C()->f();}
-
]], "gCgBCC")
-
-
test_program_eq([[
-
string _sprintf() {return "g";}
-
class A {
-
string _sprintf() {return "A";}
-
mixed f() {
-
return sprintf ("%O%O%O%O",
-
global::this, A::this, this_program::this, this);
-
}
-
}
-
class B {
-
string _sprintf() {return "B";}
-
class C {
-
inherit A;
-
string _sprintf() {return "C";}
-
mixed f() {
-
return A::f() + "|" +
-
sprintf ("%O%O%O%O%O",
-
global::this, B::this, C::this, this_program::this, this);
-
}
-
}
-
}
-
string a() {return B()->C()->f();}
-
]], "gCCC|gBCCC")
-
-
test_program([[
-
class A {
-
class B {
-
mixed f() {
-
return typeof (A::this) != typeof (B::this);
-
}
-
}
-
}
-
int a() {return A()->B()->f();}
-
]])
-
-
test_program([[
-
class A {
-
class B {
-
mixed f() {
-
return typeof (this_object (1)) != typeof (this_object (0));
-
}
-
}
-
}
-
int a() {return A()->B()->f();}
-
]])
-
-
test_program([[
-
class A {
-
class B {
-
mixed f() {
-
return typeof (A::this_program) != typeof (B::this_program);
-
}
-
}
-
}
-
int a() {return A()->B()->f();}
-
]])
-
-
test_any([[
-
// Test disambiguation order with multiple inherit and ::this_program.
-
class A {
-
class Foo {
-
string foo() { return "A"; }
-
}
-
};
-
class B {
-
class Foo {
-
string foo() { return "B"; }
-
}
-
};
-
class C {
-
inherit A;
-
inherit B;
-
class Foo {
-
// We expect this to inherit B::Foo and not A::Foo.
-
inherit ::this_program;
-
}
-
};
-
return C()->Foo()->foo();
-
]], "B")
-
-
// Names of inherits
-
test_program_eq([[
-
// 1: Direct inherit in the current class.
-
class A { local constant foo = 1; };
-
inherit A;
-
class B { inherit A; local constant foo = 2; };
-
class C { inherit B:A; local constant foo = 4;
-
int get_foo() {
-
return A::foo;
-
}
-
};
-
int a() { return C()->get_foo(); }
-
]],[[2]])
-
test_program_eq([[
-
// 2: The name of the current class.
-
class A { local constant foo = 1; };
-
inherit A:C;
-
class B { inherit A:C; local constant foo = 2; };
-
class C { inherit B; local constant foo = 4;
-
int get_foo() {
-
return C::foo;
-
}
-
};
-
int a() { return C()->get_foo(); }
-
]],[[4]])
-
test_program_eq([[
-
// 3.1: Direct inherit in a surrounding parent class.
-
class A { local constant foo = 1; };
-
class B { inherit A; local constant foo = 2; };
-
inherit B:A;
-
class C { inherit B; local constant foo = 4;
-
int get_foo() {
-
return A::foo;
-
}
-
};
-
int a() { return C()->get_foo(); }
-
]],[[2]])
-
test_program_eq([[
-
// 3.2: The name of a surrounding parent class.
-
class D {
-
class A { local constant foo = 1; };
-
inherit A;
-
class B { inherit A; local constant foo = 2; };
-
class C { inherit B; local constant foo = 4;
-
int get_foo() {
-
return D::foo;
-
}
-
};
-
int get_foo() {
-
return C()->get_foo();
-
}
-
};
-
int a() { return D()->get_foo(); }
-
]],[[1]])
-
test_program_eq([[
-
// 4: Indirect inherit in the current class.
-
class A { local constant foo = 1; };
-
class B { inherit A; local constant foo = 2; };
-
class C { inherit B; local constant foo = 4;
-
int get_foo() {
-
return A::foo;
-
}
-
};
-
int a() { return C()->get_foo(); }
-
]],[[1]])
-
test_program_eq([[
-
// 5: Indirect inherit in a surrounding parent class.
-
class A { local constant foo = 1; };
-
class B { inherit A; local constant foo = 2; };
-
class C { inherit B; local constant foo = 4;
-
class D {
-
local constant foo = 8;
-
int get_foo() {
-
return A::foo;
-
}
-
}
-
int get_foo() { return D()->get_foo(); }
-
};
-
int a() { return C()->get_foo(); }
-
]],[[1]])
-
-
test_program_eq([[
-
object ao = compile_string(#"
-
string id() {return \"A\";}
-
class B {
-
string id() {return \"B\";}
-
string foo()
-
{
-
return this->id() + id() + local::id() + global::this->id() + global::id();
-
}
-
}")();
-
-
class Handler
-
{
-
mixed resolv (string id, void|string file, void|object handler)
-
{
-
if (id == "B") return ao->B;
-
return master()->resolv (id, file, handler);
-
}
-
}
-
-
string a()
-
{
-
object c = compile_string(#"
-
string id() {return \"C\";}
-
class D {
-
inherit B;
-
string id() {return \"D\";}
-
string foo()
-
{
-
return ::foo() + \"|\" +
-
this->id() + id() + B::id() + global::this->id() + global::id();
-
}
-
}", 0, Handler())();
-
-
return c->D()->foo();
-
}
-
]], "DDBAA|DDBCC")
-
-
test_program_eq([[
-
class X
-
{
-
object parent() {return global::this;}
-
}
-
-
class Handler
-
{
-
mixed resolv (string id, void|string file, void|object handler)
-
{
-
if (id == "X") return X;
-
return master()->resolv (id, file, handler);
-
}
-
}
-
-
object a()
-
{
-
object o = compile_string ("inherit X;", 0, Handler())();
-
return o->parent();
-
}
-
]], this)
-
-
-
// - this_thread
-
// - thread_create
-
// - thread_local
-
-
// - throw
-
test_eq(20,catch(throw(a())))
-
-
// - time
-
test_true(time())
-
test_true(time(1))
-
test_true(intp(time()))
-
test_true(intp(time(1)))
-
test_true(floatp(time(2)))
-
-
// gethrtime() may gethrtime(), RDTSC or gettimeofday
-
// sleep uses a combination of select/poll and the above
-
// time() uses gettimeofday
-
test_any([[
-
float tts=2.0;
-
-
int t0=time();
-
float t1=time(t0);
-
int hrt1=gethrtime();
-
sleep(tts);
-
int hrt2=gethrtime();
-
float t2=time(t0);
-
-
float e=(hrt2-hrt1)*1e-6;
-
float f=t2-t1;
-
-
array r=({});
-
if (e<tts-0.1 || e>tts+0.1)
-
r+=({sprintf("hrtime %.6f, %+.6f",e,e-tts)});
-
-
if (f<tts-0.1 || f>tts+0.1)
-
r+=({sprintf("timeofday %.6f, %+.6f",f,f-tts)});
-
-
if (sizeof(r)) return r*" / ";
-
return "no error";
-
]],"no error")
-
-
// - trace
-
test_do(trace(0))
-
test_eq(trace(0),0)
-
-
// - ualarm
-
-
// - umask
-
test_true(intp(System.umask()))
-
test_eq(System.umask(System.umask()),System.umask())
-
-
// - uname
-
test_true(mappingp(uname()))
-
-
// - unicode_to_string
-
// See string_to_unicode
-
-
// - upper_case
-
test_equal(upper_case("fooq"),"FOOQ")
-
test_equal(upper_case("FooR"),"FOOR")
-
test_equal(upper_case("Foo1234-*~\n"),"FOO1234-*~\n")
-
test_equal(upper_case("fooq\x3000"),"FOOQ\x3000")
-
test_equal(upper_case("FooR\x3000"),"FOOR\x3000")
-
test_equal(upper_case("Foo1234-*~\n\x3000"),"FOO1234-*~\n\x3000")
-
test_equal(upper_case("fooq\x13000"),"FOOQ\x13000")
-
test_equal(upper_case("FooR\x13000"),"FOOR\x13000")
-
test_equal(upper_case("Foo1234-*~\n\x13000"),"FOO1234-*~\n\x13000")
-
test_equal(upper_case("Foo\xff"),"FOO\x178")
-
test_equal(upper_case("Foo\xb5"),"FOO\x39c")
-
test_equal(upper_case((string) ({
-
// These characters correspond to the cases in case_info.h
-
// Please update this and the corresponding lower_case table
-
// when UnicodeData.txt is changed.
-
// Part 1: 0x0000 - 0x0FFF
-
0x0000, 0x0041, 0x005b, 0x0061, 0x007b, 0x00b5, 0x00b6, 0x00c0,
-
0x00d7, 0x00d8, 0x00df, 0x00e0, 0x00f7, 0x00f8, 0x00ff, 0x0100,
-
0x0130, 0x0131, 0x0132, 0x0138, 0x0139, 0x0149, 0x014a, 0x0178,
-
0x0179, 0x017f, 0x0180, 0x0181, 0x0182, 0x0186, 0x0187, 0x0189,
-
0x018b, 0x018d, 0x018e, 0x018f, 0x0190, 0x0191, 0x0193, 0x0194,
-
0x0195, 0x0196, 0x0197, 0x0198, 0x019a, 0x019b, 0x019c, 0x019d,
-
0x019e, 0x019f, 0x01a0, 0x01a6, 0x01a7, 0x01a9, 0x01aa, 0x01ac,
-
0x01ae, 0x01af, 0x01b1, 0x01b3, 0x01b7, 0x01b8, 0x01ba, 0x01bc,
-
0x01be, 0x01bf, 0x01c0, 0x01c4, 0x01c5, 0x01c7, 0x01c8, 0x01ca,
-
0x01cb, 0x01dd, 0x01de, 0x01f0, 0x01f1, 0x01f2, 0x01f6, 0x01f7,
-
0x01f8, 0x0220, 0x0221, 0x0222, 0x0234, 0x023a, 0x023b, 0x023d,
-
0x023e, 0x023f, 0x0241, 0x0243, 0x0244, 0x0245, 0x0246, 0x0250,
-
0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0258, 0x0259,
-
0x025a, 0x025b, 0x025c, 0x025d, 0x0260, 0x0261, 0x0262, 0x0263,
-
0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026a, 0x026b,
-
0x026c, 0x026d, 0x026f, 0x0270, 0x0271, 0x0272, 0x0273, 0x0275,
-
0x0276, 0x027d, 0x027e, 0x0280, 0x0281, 0x0283, 0x0284, 0x0287,
-
0x0288, 0x0289, 0x028a, 0x028c, 0x028d, 0x0292, 0x0293, 0x029d,
-
0x029e, 0x029f, 0x0345, 0x0346, 0x0370, 0x0374, 0x0376, 0x0378,
-
0x037b, 0x037e, 0x037f, 0x0380, 0x0386, 0x0387, 0x0388, 0x038b,
-
0x038c, 0x038d, 0x038e, 0x0390, 0x0391, 0x03a0, 0x03a2, 0x03a3,
-
0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03c0, 0x03c2, 0x03c3, 0x03cc,
-
0x03cd, 0x03cf, 0x03d0, 0x03d1, 0x03d2, 0x03d5, 0x03d6, 0x03d7,
-
0x03d8, 0x03f0, 0x03f1, 0x03f2, 0x03f3, 0x03f4, 0x03f5, 0x03f6,
-
0x03f7, 0x03f9, 0x03fa, 0x03fc, 0x03fd, 0x0400, 0x0410, 0x0420,
-
0x0430, 0x0440, 0x0450, 0x0460, 0x0482, 0x048a, 0x04c0, 0x04c1,
-
0x04cf, 0x04d0, 0x0530, 0x0531, 0x0557, 0x0561, 0x0587, })), (string) ({
-
0x0000, 0x0041, 0x005b, 0x0041, 0x007b, 0x039c, 0x00b6, 0x00c0,
-
0x00d7, 0x00d8, 0x00df, 0x00c0, 0x00f7, 0x00d8, 0x0178, 0x0100,
-
0x0130, 0x0049, 0x0132, 0x0138, 0x0139, 0x0149, 0x014a, 0x0178,
-
0x0179, 0x0053, 0x0243, 0x0181, 0x0182, 0x0186, 0x0187, 0x0189,
-
0x018b, 0x018d, 0x018e, 0x018f, 0x0190, 0x0191, 0x0193, 0x0194,
-
0x01f6, 0x0196, 0x0197, 0x0198, 0x023d, 0x019b, 0x019c, 0x019d,
-
0x0220, 0x019f, 0x01a0, 0x01a6, 0x01a7, 0x01a9, 0x01aa, 0x01ac,
-
0x01ae, 0x01af, 0x01b1, 0x01b3, 0x01b7, 0x01b8, 0x01ba, 0x01bc,
-
0x01be, 0x01f7, 0x01c0, 0x01c4, 0x01c5, 0x01c7, 0x01c8, 0x01ca,
-
0x01cb, 0x018e, 0x01de, 0x01f0, 0x01f1, 0x01f2, 0x01f6, 0x01f7,
-
0x01f8, 0x0220, 0x0221, 0x0222, 0x0234, 0x023a, 0x023b, 0x023d,
-
0x023e, 0x2c7e, 0x0241, 0x0243, 0x0244, 0x0245, 0x0246, 0x2c6f,
-
0x2c6d, 0x2c70, 0x0181, 0x0186, 0x0255, 0x0189, 0x0258, 0x018f,
-
0x025a, 0x0190, 0xa7ab, 0x025d, 0x0193, 0xa7ac, 0x0262, 0x0194,
-
0x0264, 0xa78d, 0xa7aa, 0x0267, 0x0197, 0x0196, 0x026a, 0x2c62,
-
0xa7ad, 0x026d, 0x019c, 0x0270, 0x2c6e, 0x019d, 0x0273, 0x019f,
-
0x0276, 0x2c64, 0x027e, 0x01a6, 0x0281, 0x01a9, 0x0284, 0xa7b1,
-
0x01ae, 0x0244, 0x01b1, 0x0245, 0x028d, 0x01b7, 0x0293, 0xa7b2,
-
0xa7b0, 0x029f, 0x0399, 0x0346, 0x0370, 0x0374, 0x0376, 0x0378,
-
0x03fd, 0x037e, 0x037f, 0x0380, 0x0386, 0x0387, 0x0388, 0x038b,
-
0x038c, 0x038d, 0x038e, 0x0390, 0x0391, 0x03a0, 0x03a2, 0x03a3,
-
0x0386, 0x0388, 0x03b0, 0x0391, 0x03a0, 0x03a3, 0x03a3, 0x038c,
-
0x038e, 0x03cf, 0x0392, 0x0398, 0x03d2, 0x03a6, 0x03a0, 0x03cf,
-
0x03d8, 0x039a, 0x03a1, 0x03f9, 0x037f, 0x03f4, 0x0395, 0x03f6,
-
0x03f7, 0x03f9, 0x03fa, 0x03fc, 0x03fd, 0x0400, 0x0410, 0x0420,
-
0x0410, 0x0420, 0x0400, 0x0460, 0x0482, 0x048a, 0x04c0, 0x04c1,
-
0x04c0, 0x04d0, 0x0530, 0x0531, 0x0557, 0x0531, 0x0587, }))
-
test_equal(upper_case((string) ({
-
// These characters correspond to the cases in case_info.h
-
// Please update this and the corresponding lower_case table
-
// when UnicodeData.txt is changed.
-
// Part 2: 0x1000 -
-
0x10a0, 0x10c6, 0x10c7, 0x10c8, 0x10cd, 0x10ce, 0x13a0, 0x13f0,
-
0x13f6, 0x13f8, 0x13fe, 0x1d79, 0x1d7a, 0x1d7d, 0x1d7e, 0x1e00,
-
0x1e96, 0x1e9b, 0x1e9c, 0x1e9e, 0x1e9f, 0x1ea0, 0x1f00, 0x1f08,
-
0x1f10, 0x1f16, 0x1f18, 0x1f1e, 0x1f20, 0x1f28, 0x1f30, 0x1f38,
-
0x1f40, 0x1f46, 0x1f48, 0x1f4e, 0x1f51, 0x1f52, 0x1f53, 0x1f54,
-
0x1f55, 0x1f56, 0x1f57, 0x1f58, 0x1f59, 0x1f5a, 0x1f5b, 0x1f5c,
-
0x1f5d, 0x1f5e, 0x1f5f, 0x1f60, 0x1f68, 0x1f70, 0x1f72, 0x1f76,
-
0x1f78, 0x1f7a, 0x1f7c, 0x1f7e, 0x1f80, 0x1f88, 0x1f90, 0x1f98,
-
0x1fa0, 0x1fa8, 0x1fb0, 0x1fb2, 0x1fb3, 0x1fb4, 0x1fb8, 0x1fba,
-
0x1fbc, 0x1fbd, 0x1fbe, 0x1fbf, 0x1fc3, 0x1fc4, 0x1fc8, 0x1fcc,
-
0x1fcd, 0x1fd0, 0x1fd2, 0x1fd8, 0x1fda, 0x1fdc, 0x1fe0, 0x1fe2,
-
0x1fe5, 0x1fe6, 0x1fe8, 0x1fea, 0x1fec, 0x1fed, 0x1ff3, 0x1ff4,
-
0x1ff8, 0x1ffa, 0x1ffc, 0x1ffd, 0x2126, 0x2127, 0x212a, 0x212b,
-
0x212c, 0x2132, 0x2133, 0x214e, 0x214f, 0x2160, 0x2180, 0x2183,
-
0x2185, 0x24b6, 0x24d0, 0x24ea, 0x2c00, 0x2c2f, 0x2c30, 0x2c5f,
-
0x2c60, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c6d,
-
0x2c6e, 0x2c6f, 0x2c70, 0x2c71, 0x2c72, 0x2c74, 0x2c75, 0x2c77,
-
0x2c7e, 0x2c80, 0x2ce4, 0x2ceb, 0x2cef, 0x2cf2, 0x2cf4, 0x2d00,
-
0x2d26, 0x2d27, 0x2d28, 0x2d2d, 0x2d2e, 0xa640, 0xa66e, 0xa680,
-
0xa69c, 0xa722, 0xa730, 0xa732, 0xa770, 0xa779, 0xa77d, 0xa77e,
-
0xa788, 0xa78b, 0xa78d, 0xa78e, 0xa790, 0xa794, 0xa796, 0xa7aa,
-
0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7b0, 0xa7b1, 0xa7b2, 0xa7b3,
-
0xa7b4, 0xa7b8, 0xab53, 0xab54, 0xab70, 0xabc0, 0xff21, 0xff3b,
-
0xff41, 0xff5b, 0x10400, 0x10428, 0x10450, 0x10c80, 0x10cb3, 0x10cc0,
-
0x10cf3, 0x118a0, 0x118e0, })), (string) ({
-
0x10a0, 0x10c6, 0x10c7, 0x10c8, 0x10cd, 0x10ce, 0x13a0, 0x13f0,
-
0x13f6, 0x13f0, 0x13fe, 0xa77d, 0x1d7a, 0x2c63, 0x1d7e, 0x1e00,
-
0x1e96, 0x1e60, 0x1e9c, 0x1e9e, 0x1e9f, 0x1ea0, 0x1f08, 0x1f08,
-
0x1f18, 0x1f16, 0x1f18, 0x1f1e, 0x1f28, 0x1f28, 0x1f38, 0x1f38,
-
0x1f48, 0x1f46, 0x1f48, 0x1f4e, 0x1f59, 0x1f52, 0x1f5b, 0x1f54,
-
0x1f5d, 0x1f56, 0x1f5f, 0x1f58, 0x1f59, 0x1f5a, 0x1f5b, 0x1f5c,
-
0x1f5d, 0x1f5e, 0x1f5f, 0x1f68, 0x1f68, 0x1fba, 0x1fc8, 0x1fda,
-
0x1ff8, 0x1fea, 0x1ffa, 0x1f7e, 0x1f88, 0x1f88, 0x1f98, 0x1f98,
-
0x1fa8, 0x1fa8, 0x1fb8, 0x1fb2, 0x1fbc, 0x1fb4, 0x1fb8, 0x1fba,
-
0x1fbc, 0x1fbd, 0x0399, 0x1fbf, 0x1fcc, 0x1fc4, 0x1fc8, 0x1fcc,
-
0x1fcd, 0x1fd8, 0x1fd2, 0x1fd8, 0x1fda, 0x1fdc, 0x1fe8, 0x1fe2,
-
0x1fec, 0x1fe6, 0x1fe8, 0x1fea, 0x1fec, 0x1fed, 0x1ffc, 0x1ff4,
-
0x1ff8, 0x1ffa, 0x1ffc, 0x1ffd, 0x2126, 0x2127, 0x212a, 0x212b,
-
0x212c, 0x2132, 0x2133, 0x2132, 0x214f, 0x2160, 0x2180, 0x2183,
-
0x2185, 0x24b6, 0x24b6, 0x24ea, 0x2c00, 0x2c2f, 0x2c00, 0x2c5f,
-
0x2c60, 0x2c62, 0x2c63, 0x2c64, 0x023a, 0x023e, 0x2c67, 0x2c6d,
-
0x2c6e, 0x2c6f, 0x2c70, 0x2c71, 0x2c72, 0x2c74, 0x2c75, 0x2c77,
-
0x2c7e, 0x2c80, 0x2ce4, 0x2ceb, 0x2cef, 0x2cf2, 0x2cf4, 0x10a0,
-
0x2d26, 0x10c7, 0x2d28, 0x10cd, 0x2d2e, 0xa640, 0xa66e, 0xa680,
-
0xa69c, 0xa722, 0xa730, 0xa732, 0xa770, 0xa779, 0xa77d, 0xa77e,
-
0xa788, 0xa78b, 0xa78d, 0xa78e, 0xa790, 0xa794, 0xa796, 0xa7aa,
-
0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7b0, 0xa7b1, 0xa7b2, 0xa7b3,
-
0xa7b4, 0xa7b8, 0xa7b3, 0xab54, 0x13a0, 0xabc0, 0xff21, 0xff3b,
-
0xff21, 0xff5b, 0x10400, 0x10400, 0x10450, 0x10c80, 0x10cb3, 0x10c80,
-
0x10cf3, 0x118a0, 0x118e0, }))
-
-
// - utf8_to_string
-
// See string_to_utf8
-
-
// - utime
-
-
// - values
-
test_equal(values("foo"),({'f','o','o'}))
-
test_equal(values(({'f','o','o'})),({'f','o','o'}))
-
test_equal(Array.sort_array(values(([7:3,8:9,99:12]))),({3,9,12}))
-
test_equal(values((<7,8,99>)),({1,1,1}))
-
test_equal(mkmultiset(values(class{ constant a="a"; constant b="b";}())),
-
(<"a","b">))
-
-
// - version
-
test_equal(version(), "Pike v"+__REAL_MAJOR__+"."+__REAL_MINOR__+" release "+__REAL_BUILD__)
-
-
// - werror
-
// - write
-
-
// - zero_type
-
test_eq(zero_type(0),0)
-
test_eq(zero_type(([])[7]),1)
-
test_eq(zero_type(([7: 0])[7]),0)
-
test_eq(zero_type(([7: UNDEFINED])[7]),0)
-
test_eq(zero_type(UNDEFINED), 1)
-
test_eq(zero_type (m_delete (([]), 1)), 1)
-
-
test_eq(zero_type (allocate (5, UNDEFINED)[2]), 1);
-
test_eq(zero_type (allocate (5, 0)[2]), 0);
-
test_eq(zero_type (allocate (5)[2]), 0);
-
-
test_true([[lambda (int|void a) { return zero_type(a); }()]])
-
test_true([[lambda () {mixed a; return zero_type(a = ([])[0]);}()]])
-
test_true([[lambda () {mapping a=([]); return zero_type(a[0] = ([])[0]);}()]])
-
test_true([[zero_type (lambda () {return ([])[0];}())]])
-
-
test_any([[
-
class A {
-
int j = 0;
-
int k = UNDEFINED;
-
int l;
-
};
-
A a = A();
-
return "" + zero_type(a->j) + zero_type(a->k) + zero_type(a->l) + zero_type(a->m) + " " + has_index(a, "j") + has_index(a, "k") + has_index(a, "l") + has_index(a, "m");
-
]], "0101 1110")
-
test_any([[
-
mapping m = ([
-
"x" : 0,
-
"y" : UNDEFINED,
-
]);
-
return "" + zero_type(m->x) + zero_type(m->y) + zero_type(m->z) + " " + has_index(m, "x") + has_index(m, "y") + has_index(m, "z");
-
]], "001 110")
-
-
test_any([[
-
int i = lambda() {return UNDEFINED;}();
-
lambda (int x) {} (i += 17);
-
return zero_type (i);
-
]], 0)
-
test_any([[
-
int i = lambda() {return UNDEFINED;}();
-
lambda (int x) {} (i -= 17);
-
return zero_type (i);
-
]], 0)
-
test_any([[
-
int i = lambda() {return UNDEFINED;}();
-
lambda (int x) {} (i++);
-
i++;
-
return zero_type (i);
-
]], 0)
-
test_any([[
-
int i = lambda() {return UNDEFINED;}();
-
lambda (int x) {} (i--);
-
return zero_type (i);
-
]], 0)
-
test_any([[
-
int i = lambda() {return UNDEFINED;}();
-
return zero_type (-i);
-
]], 0)
-
-
test_any([[
-
// Preserve zero_type in call.
-
return lambda (mixed a) {return zero_type (a);} (UNDEFINED);
-
]], 1);
-
test_true([[zero_type (({UNDEFINED})[0])]], 1); // Preserve zero_type in array.
-
test_true([[zero_type (map (({1}), ([]))[0])]], 1); // Produce zero_type in map().
-
test_any([[
-
// Preserve zero_type in foreach.
-
foreach (({UNDEFINED}), mixed e)
-
if (zero_type (e)) return 1;
-
return 0;
-
]], 1);
-
-
test_program(int b=10; mixed a() { return 1; })
-
test_program(mixed b=10; mixed a() { return 1;})
-
test_define_program(test,[[int q,w,e,r,t; mixed foo() { return 10; }]])
-
-
test_program(inherit test; mixed a() { return foo()==10; })
-
test_program(inherit test; mixed a() { return test::foo()==10; })
-
test_program(inherit test : bar; mixed a() { return bar::foo()==10; })
-
-
test_define_program(test2,[[int z,x,c,v,b; mixed bar() { return 11; }]])
-
test_program(inherit test; inherit test2; mixed a() { return foo()==10 && bar()==11; })
-
test_program(inherit test2; inherit test; mixed a() { return foo()==10 && bar()==11; })
-
-
test_define_program(test,[[int q,w,e,r; mixed t; mixed getw() { return w; } void setw(int _) { w=_; }]])
-
test_define_program(test2,[[int z,x,c,v,b; mixed getb() { return b; } void setb(int _) { b=_; }]])
-
-
test_program(inherit test; inherit test2; mixed a() { w=20; b=22; return getw()==20 && getb()==22; })
-
test_program(inherit test; inherit test2; mixed a() { setw(20); setb(22); return w==20 && b==22; })
-
test_program(inherit test2; inherit test; mixed a() { w=20; b=22; return getw()==20 && getb()==22; })
-
test_program(inherit test2; inherit test; mixed a() { setw(20); setb(22); return w==20 && b==22; })
-
-
test_do(add_constant("test"))
-
test_do(add_constant("test2"))
-
-
test_eval_error(return class c{int i;void foo(){ destruct(this_object());i=0;return i;}}()->foo())
-
test_eq(a,this_object()->a)
-
-
// - catch
-
test_false([[class { string test(string foo) { catch { return lower_case(foo); }; return foo; }}()->test(0); ]])
-
test_true([[catch (1.0 / 0.0)]])
-
test_true([[catch {float f = 1.0 / 0.0;}]])
-
-
-
// Pike modules
-
-
// - this failed in Calendar.Timezone
-
-
test_compile(
-
[[
-
array tz_ux(int ux)
-
{
-
if (ux<-0x80000000 || ux>0x7fffffff)
-
error("bah\n");
-
return ({});
-
};
-
tz_ux(0);
-
]]);
-
-
// string[]=
-
test_any([[string s="foo"; s[2]='t'; s[0]--; return s;]],"eot")
-
test_any([[string s="foo"; s[2]=0777; s[1]--; return s;]],"fn\777")
-
test_any([[string s="foo"; s[2]=07777777; s[1]--; return s;]],"fn\7777777")
-
test_any([[string s="foo"; s[2]='t'; catch (s[10]='x'); return s;]], "fot")
-
-
ifefun(_verify_internals,
-
[[
-
test_do(_verify_internals())
-
]])
-
-
test_tests([[
-
array a()
-
{
-
return Tools.Testsuite.run_script ("]]SRCDIR[[/test_resolve.pike");
-
}
-
]])
-
-
// enum and typedef
-
-
test_compile_error_any([[enum X {A, B}; enum(X) x;]])
-
test_compile_error_any([[enum {intern : extern};]])
-
-
// - modifiers, compile time type checks
-
-
test_compile_any(class A {int v;} class B {inherit A; int v;})
-
test_compile_error_any(class A {int v;} class B {inherit A; float v;})
-
dnl test_compile_error_any(class A {int v;} class B {inherit A; mixed v;})
-
dnl test_compile_error_any(class A {mixed v;} class B {inherit A; int v;})
-
dnl test_compile_error_any(class A {public int v;} class B {inherit A; mixed v;})
-
dnl test_compile_error_any(class A { public { int v; } } class B {inherit A; mixed v;})
-
dnl test_compile_error_any(class A {public mixed v;} class B {inherit A; int v;})
-
test_compile_error_any(class A {protected int v;} class B {inherit A; float v;})
-
dnl test_compile_error_any(class A {protected int v;} class B {inherit A; mixed v;})
-
dnl test_compile_error_any(class A {protected mixed v;} class B {inherit A; int v;})
-
test_compile_any(class A {private int v; int q=v;} class B {inherit A; float v;})
-
dnl test_compile_any(class A {private int v; int q=v;} class B {inherit A; mixed v;})
-
dnl test_compile_any(class A {private mixed v; mixed q=v;} class B {inherit A; int v;})
-
test_compile_error_any(class A {final int v;} class B {inherit A; int v;})
-
test_compile_error_any(class A {final int v;} class B {inherit A; final int v;})
-
test_compile_any(class A {local int v;} class B {inherit A; float v;})
-
test_compile_any(class A {local int v;} class B {inherit A; mixed v;})
-
test_compile_any(class A {local mixed v;} class B {inherit A; int v;})
-
test_compile_any(class A {inline int v;} class B {inherit A; float v;})
-
test_compile_any(class A {inline int v;} class B {inherit A; mixed v;})
-
test_compile_any(class A {inline mixed v;} class B {inherit A; int v;})
-
-
test_compile_any(class A {int f(){}} class B {inherit A; int f(){}})
-
test_compile_any(class A {int f(){}} class B {inherit A; float f(){}})
-
test_compile_any(class A {int f(){}} class B {inherit A; mixed f(){}})
-
test_compile_any(class A {mixed f(){}} class B {inherit A; int f(){}})
-
test_compile_any(class A {void f(){}} class B {inherit A; void f(int a){}})
-
test_compile_any(class A {void f(int a){}} class B {inherit A; void f(float a){}})
-
test_compile_any(class A {void f(int a){}} class B {inherit A; void f(mixed a){}})
-
test_compile_any(class A {void f(mixed a){}} class B {inherit A; void f(int a){}})
-
test_compile_error_any(class A {final int f(){}} class B {inherit A; int f(){}})
-
test_compile_error_any(class A {final int f(){}} class B {inherit A; final int f(){}})
-
-
test_compile_warning(class A {int v;}; class B {inherit A; int v(){}})
-
test_compile_warning(class A {public int v;}; class B {inherit A; int v(){}})
-
test_compile_warning(class A {protected int v;}; class B {inherit A; int v(){}})
-
test_compile_any(class A {private int v; int q=v;} class B {inherit A; int v(){}})
-
test_compile_error_any(class A {final int v;} class B {inherit A; int v(){}})
-
test_compile_any(class A {local int v;} class B {inherit A; int v(){}})
-
test_compile_any(class A {inline int v;} class B {inherit A; int v(){}})
-
-
test_compile_error_any(class A {int f(){}} class B {inherit A; int f;})
-
test_compile_error_any(class A {public int f(){}} class B {inherit A; int f;})
-
test_compile_error_any(class A {protected int f(){}} class B {inherit A; int f;})
-
test_compile_any(class A {private int f(){} int q=f();} class B {inherit A; int f;})
-
test_compile_error_any(class A {final int f(){}} class B {inherit A; int f;})
-
test_compile_any(class A {local int f(){}} class B {inherit A; int f;})
-
test_compile_any(class A {inline int f(){}} class B {inherit A; int f;})
-
-
test_any([[
-
// Test code generation for local (aka inline) constants.
-
class Foo {
-
constant A = "c";
-
local constant B = "d";
-
class Bar {
-
local constant C = "e";
-
-
string bar()
-
{
-
return A + B + C + B + A;
-
}
-
}
-
};
-
-
class Test {
-
inherit Foo;
-
constant B = "a";
-
-
class Bar {
-
inherit Foo::Bar;
-
-
local constant C = "b";
-
-
string bar()
-
{
-
return C + ::bar() + C;
-
}
-
}
-
-
string test()
-
{
-
return B + Bar()->bar() + B;
-
}
-
};
-
-
return Test()->test();
-
]], "abcdedcba")
-
-
test_any_equal([[
-
// Test code generation for private global variables.
-
// Derived from [LysLysKOM 20929878].
-
class Test {
-
private multiset ds = (< >);
-
private mapping dcv = ([ ]);
-
-
private void foo(string what)
-
{
-
what-="\r";
-
foreach(replace(what, "\\\n", " ")/"\n"-({""}), string line)
-
{
-
array(string) sups =
-
replace(line, ({"\t",","}), ({" "," "}))/" " -({ "" });
-
-
if(line[0] != '#') {
-
if(sups[0] == "d") {
-
array(multiset|mapping) tmp = ({(<>), (<>), ([])});
-
ds = tmp[0] - tmp[1];
-
dcv = tmp[2];
-
}
-
}
-
}
-
}
-
-
public array(multiset|string) test()
-
{
-
foo("\nd\t\tu, t, c, b\n");
-
-
return ({ ds, dcv });
-
}
-
};
-
-
return Test()->test();
-
]], ({ (<>), ([]) }))
-
-
// - attributes
-
test_compile_any(
-
class A { __deprecated__ int foo(int x) { return x; } };
-
)
-
test_compile_warning(
-
class A { __deprecated__ int foo(int x) { return x; } };
-
A()->foo(0);
-
)
-
test_compile_warning(
-
class A { __deprecated__ int foo(int x) { return x; } };
-
function bar = A()->foo;
-
)
-
test_compile_warning(
-
class A { __deprecated__(int) foo(int x) { return x; } };
-
)
-
test_compile_any(
-
class A { __deprecated__(int) foo(int x) { return (__deprecated__(int))x; } };
-
)
-
test_compile_warning(
-
class A { int foo(__deprecated__(int)|void x) { return x; } };
-
)
-
test_compile_any(
-
class A { int foo(__deprecated__(int)|void x) { return (int)x; } };
-
)
-
test_compile_warning(
-
class A { int foo(__deprecated__(int)|void x) { return (int)x; } };
-
A()->foo(1);
-
)
-
test_compile_any(
-
class A { int foo(__deprecated__(int)|void x) { return (int)x; } };
-
mixed bar = A()->foo();
-
)
-
-
// - modifiers, compile time access properties
-
-
test_compile_error_any(class A {} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {public int v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {protected int v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_error_any(class A {private int v; int q=v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {final int v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {local int v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {inline int v;} class B {inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int f(){}} class B {inherit A; void g(){f();}})
-
test_compile_any(class A {public int f(){}} class B {inherit A; void g(){f();}})
-
test_compile_any(class A {protected int f(){}} class B {inherit A; void g(){f();}})
-
test_compile_error_any(class A {private int f(){} int q=f();} class B {inherit A; void g(){f();}})
-
test_compile_any(class A {final int f(){}} class B {inherit A; void g(){f();}})
-
test_compile_any(class A {local int f(){}} class B {inherit A; void g(){f();}})
-
test_compile_any(class A {inline int f(){}} class B {inherit A; void g(){f();}})
-
-
test_compile_any(class A {int v;} class B {public inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int v;} class B {protected inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int v;} class B {private inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int v;} class B {final inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int v;} class B {local inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int v;} class B {inline inherit A; int q; void g(){q=v;}})
-
test_compile_any(class A {int f(){}} class B {public inherit A; void g(){f();}})
-
test_compile_any(class A {int f(){}} class B {protected inherit A; void g(){f();}})
-
test_compile_any(class A {int f(){}} class B {private inherit A; void g(){f();}})
-
test_compile_any(class A {int f(){}} class B {final inherit A; void g(){f();}})
-
test_compile_any(class A {int f(){}} class B {local inherit A; void g(){f();}})
-
test_compile_any(class A {int f(){}} class B {inline inherit A; void g(){f();}})
-
-
test_compile_error_any(class A {} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {public int v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {protected int v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_error_any(class A {private int v; int q=v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {final int v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {local int v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {inline int v;} class B {inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int f(){}} class B {inherit A; void g(){A::f();}})
-
test_compile_any(class A {public int f(){}} class B {inherit A; void g(){A::f();}})
-
test_compile_any(class A {protected int f(){}} class B {inherit A; void g(){A::f();}})
-
test_compile_error_any(class A {private int f(){} int q=f();} class B {inherit A; void g(){A::f();}})
-
test_compile_any(class A {final int f(){}} class B {inherit A; void g(){A::f();}})
-
test_compile_any(class A {local int f(){}} class B {inherit A; void g(){A::f();}})
-
test_compile_any(class A {inline int f(){}} class B {inherit A; void g(){A::f();}})
-
-
test_compile_any(class A {int v;} class B {public inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int v;} class B {protected inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int v;} class B {private inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int v;} class B {final inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int v;} class B {local inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int v;} class B {inline inherit A; int q; void g(){q=A::v;}})
-
test_compile_any(class A {int f(){}} class B {public inherit A; void g(){A::f();}})
-
test_compile_any(class A {int f(){}} class B {protected inherit A; void g(){A::f();}})
-
test_compile_any(class A {int f(){}} class B {private inherit A; void g(){A::f();}})
-
test_compile_any(class A {int f(){}} class B {final inherit A; void g(){A::f();}})
-
test_compile_any(class A {int f(){}} class B {local inherit A; void g(){A::f();}})
-
test_compile_any(class A {int f(){}} class B {inline inherit A; void g(){A::f();}})
-
-
test_compile_error_any(class A {} class B {inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int v;} class B {inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int v;} class B {public inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int v;} class B {protected inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_error_any(class A {int v;} class B {private inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int v;} class B {final inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int v;} class B {local inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int v;} class B {inline inherit A;} class C {inherit B; int q; void g(){q=B::v;}})
-
test_compile_any(class A {int f(){}} class B {inherit A;} class C {inherit B; void g(){B::f();}})
-
test_compile_any(class A {int f(){}} class B {public inherit A;} class C {inherit B; void g(){B::f();}})
-
test_compile_any(class A {int f(){}} class B {protected inherit A;} class C {inherit B; void g(){B::f();}})
-
test_compile_error_any(class A {int f(){}} class B {private inherit A;} class C {inherit B; void g(){B::f();}})
-
test_compile_any(class A {int f(){}} class B {final inherit A;} class C {inherit B; void g(){B::f();}})
-
test_compile_any(class A {int f(){}} class B {local inherit A;} class C {inherit B; void g(){B::f();}})
-
test_compile_any(class A {int f(){}} class B {inline inherit A;} class C {inherit B; void g(){B::f();}})
-
-
// - modifiers, run time access properties
-
-
test_eval_error(return class {}()->f())
-
test_do(class {int f(){}}()->f())
-
test_do(class {public int f(){}}()->f())
-
test_eval_error(return class {protected int f(){}}()->f())
-
test_eval_error(return class {private int f(){} int q=f();}()->f())
-
test_do(class {final int f(){}}()->f())
-
test_do(class {local int f(){}}()->f())
-
test_do(class {inline int f(){}}()->f())
-
test_do(class {class A {}}()->A())
-
test_do(class {public class A {}}()->A())
-
test_eval_error(return class {protected class A {}}()->A())
-
test_eval_error(return class {private class A {} object q=A();}()->A())
-
test_do(class {final class A {}}()->A())
-
test_do(class {local class A {}}()->A())
-
test_do(class {inline class A {}}()->A())
-
-
test_equal(indices(class {}()), ({}))
-
test_equal(indices(class {int v;}()), ({"v"}))
-
test_equal(indices(class {public int v;}()), ({"v"}))
-
test_equal(indices(class {protected int v;}()), ({}))
-
test_equal(indices(class {private int v; protected int q=v;}()), ({}))
-
test_equal(indices(class {final int v;}()), ({"v"}))
-
test_equal(indices(class {local int v;}()), ({"v"}))
-
test_equal(indices(class {inline int v;}()), ({"v"}))
-
test_equal(indices(class {int f(){}}()), ({"f"}))
-
test_equal(indices(class {public int f(){}}()), ({"f"}))
-
test_equal(indices(class {protected int f(){}}()), ({}))
-
test_equal(indices(class {private int f(){} protected int q=f();}()), ({}))
-
test_equal(indices(class {final int f(){}}()), ({"f"}))
-
test_equal(indices(class {local int f(){}}()), ({"f"}))
-
test_equal(indices(class {inline int f(){}}()), ({"f"}))
-
-
test_equal(indices(class {class A {} class B {inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {int v;} class B {inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {public int v;} class B {inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {protected int v;} class B {inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {private int v; protected int q=v;} class B {inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {final int v;} class B {inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {local int v;} class B {inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {inline int v;} class B {inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {int f(){}} class B {inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {public int f(){}} class B {inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {protected int f(){}} class B {inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {private int f(){} protected int q=f();} class B {inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {final int f(){}} class B {inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {local int f(){}} class B {inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {inline int f(){}} class B {inherit A;}}()->B()), ({"f"}))
-
-
test_equal(indices(class {class A {int v;} class B {public inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {protected inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {int v;} class B {private inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {int v;} class B {final inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {local inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {inline inherit A;}}()->B()), ({"v"}))
-
test_equal(indices(class {class A {int f(){}} class B {public inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {protected inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {int f(){}} class B {private inherit A;}}()->B()), ({}))
-
test_equal(indices(class {class A {int f(){}} class B {final inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {local inherit A;}}()->B()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {inline inherit A;}}()->B()), ({"f"}))
-
-
test_equal(indices(class {class A {} class B {inherit A;} class C {inherit B;}}()->C()), ({}))
-
test_equal(indices(class {class A {int v;} class B {inherit A;} class C {inherit B;}}()->C()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {public inherit A;} class C {inherit B;}}()->C()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {protected inherit A;} class C {inherit B;}}()->C()), ({}))
-
test_equal(indices(class {class A {int v;} class B {private inherit A;} class C {inherit B;}}()->C()), ({}))
-
test_equal(indices(class {class A {int v;} class B {final inherit A;} class C {inherit B;}}()->C()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {local inherit A;} class C {inherit B;}}()->C()), ({"v"}))
-
test_equal(indices(class {class A {int v;} class B {inline inherit A;} class C {inherit B;}}()->C()), ({"v"}))
-
test_equal(indices(class {class A {int f(){}} class B {inherit A;} class C {inherit B;}}()->C()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {public inherit A;} class C {inherit B;}}()->C()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {protected inherit A;} class C {inherit B;}}()->C()), ({}))
-
test_equal(indices(class {class A {int f(){}} class B {private inherit A;} class C {inherit B;}}()->C()), ({}))
-
test_equal(indices(class {class A {int f(){}} class B {final inherit A;} class C {inherit B;}}()->C()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {local inherit A;} class C {inherit B;}}()->C()), ({"f"}))
-
test_equal(indices(class {class A {int f(){}} class B {inline inherit A;} class C {inherit B;}}()->C()), ({"f"}))
-
-
// - modifiers, binding and redefinition properties with compile time access
-
-
test_any(class A {int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {public int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {protected int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {private int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_compile_error_any(class A {final int v=1;}; class B {inherit A; int v=2;};)
-
test_any(class A {local int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {inline int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {public int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {protected int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {private int f(){return 1;} int q=f();}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_compile_error_any(class A {final int f(){return 1;}}; class B {inherit A; int f(){return 2;}};)
-
test_any(class A {local int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {inline int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
-
test_any(class A {int v=1;}; class B {public inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {protected inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {private inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_compile_error_any(class A {int v=1;}; class B {final inherit A; int v=2;};)
-
test_any(class A {int v=1;}; class B {local inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inline inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {public inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {protected inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {private inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_compile_error_any(class A {int f(){return 1;}}; class B {final inherit A; int f(){return 2;}};)
-
test_any(class A {int f(){return 1;}}; class B {local inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inline inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
-
test_any(class A {int v=1;}; class B {inherit A; int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inherit A; public int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inherit A; protected int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inherit A; private int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inherit A; final int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inherit A; local int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int v=1;}; class B {inherit A; inline int v=2; int t(){return v;}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; public int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; protected int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; private int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; final int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; local int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; int f(){return 2;} int t(){return local::f();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; inline int f(){return 2;} int t(){return f();}}; return B()->t(), 2)
-
-
test_any(class A {int v=1; int t(){return v;}}; class B {inherit A; int v=2;}; return B()->t(), 2)
-
test_any(class A {public int v=1; int t(){return v;}}; class B {inherit A; int v=2;}; return B()->t(), 2)
-
test_any(class A {protected int v=1; int t(){return v;}}; class B {inherit A; int v=2;}; return B()->t(), 2)
-
test_any(class A {private int v=1; int t(){return v;}}; class B {inherit A; int v=2;}; return B()->t(), 1)
-
test_any(class A {local int v=1; int t(){return v;}}; class B {inherit A; int v=2;}; return B()->t(), 1)
-
test_any(class A {inline int v=1; int t(){return v;}}; class B {inherit A; int v=2;}; return B()->t(), 1)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 2)
-
test_any(class A {public int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 2)
-
test_any(class A {protected int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 2)
-
test_any(class A {private int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 1)
-
test_any(class A {local int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 1)
-
test_any(class A {int f(){return 1;} int t(){return local::f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 1)
-
test_any(class A {inline int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;}}; return B()->t(), 1)
-
-
test_any(class A {int v=1; int t(){return v;}}; class B {inherit A; int v=2; int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int v=1; int t(){return v;}}; class B {public inherit A; int v=2; int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int v=1; int t(){return v;}}; class B {protected inherit A; int v=2; int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int v=1; int t(){return v;}}; class B {private inherit A; int v=2; int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int v=1; int t(){return v;}}; class B {local inherit A; int v=2; int t(){return A::t();}}; return B()->t(), 1)
-
test_any(class A {int v=1; int t(){return v;}}; class B {inline inherit A; int v=2; int t(){return A::t();}}; return B()->t(), 1)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {inherit A; int f(){return 2;} int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {public inherit A; int f(){return 2;} int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {protected inherit A; int f(){return 2;} int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {private inherit A; int f(){return 2;} int t(){return A::t();}}; return B()->t(), 2)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {local inherit A; int f(){return 2;} int t(){return A::t();}}; return B()->t(), 1)
-
test_any(class A {int f(){return 1;} int t(){return f();}}; class B {inline inherit A; int f(){return 2;} int t(){return A::t();}}; return B()->t(), 1)
-
-
test_any([[
-
class A {int v=0x100; int a(){return v;}}; class B {inherit A; int v=0x010; int b(){return v;}}; class C {inherit B; int v=0x001; int c(){return v;}};
-
object c=C(); return c->a()+c->b()+c->c();
-
]], 0x003)
-
test_any([[
-
class A {int v=0x100; int a(){return v;}}; class B {inherit A; public int v=0x010; int b(){return v;}}; class C {inherit B; int v=0x001; int c(){return v;}};
-
object c=C(); return c->a()+c->b()+c->c();
-
]], 0x003)
-
test_any([[
-
class A {int v=0x100; int a(){return v;}}; class B {inherit A; private int v=0x010; int b(){return v;}}; class C {inherit B; int v=0x001; int c(){return v;}};
-
object c=C(); return c->a()+c->b()+c->c();
-
]], 0x021)
-
test_any([[
-
class A {int v=0x100; int a(){return v;}}; class B {inherit A; protected int v=0x010; int b(){return v;}}; class C {inherit B; int v=0x001; int c(){return v;}};
-
object c=C(); return c->a()+c->b()+c->c();
-
]], 0x003)
-
test_any([[
-
class A {int v=0x100; int a(){return v;}}; class B {inherit A; local int v=0x010; int b(){return v;}}; class C {inherit B; int v=0x001; int c(){return v;}};
-
object c=C(); return c->a()+c->b()+c->c();
-
]], 0x021)
-
test_any([[
-
class A {int v=0x100; int a(){return v;}}; class B {inherit A; inline int v=0x010; int b(){return v;}}; class C {inherit B; int v=0x001; int c(){return v;}};
-
object c=C(); return c->a()+c->b()+c->c();
-
]], 0x021)
-
-
// - modifiers, binding and redefinition properties with run time access
-
-
test_any(class A {int v=1;}; class B {inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {public int v=1;}; class B {inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {protected int v=1;}; class B {inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {private int v=1;}; class B {inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {local int v=1;}; class B {inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {inline int v=1;}; class B {inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {public int f(){return 1;}}; class B {inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {protected int f(){return 1;}}; class B {inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {private int f(){return 1;} int q=f();}; class B {inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {local int f(){return 1;}}; class B {inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {inline int f(){return 1;}}; class B {inherit A; int f(){return 2;}}; return B()->f(), 2)
-
-
test_any(class A {int v=1;}; class B {public inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {protected inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {private inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {local inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {inline inherit A; int v=2;}; return B()->v, 2)
-
test_any(class A {int f(){return 1;}}; class B {public inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {protected inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {private inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {local inherit A; int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inline inherit A; int f(){return 2;}}; return B()->f(), 2)
-
-
test_any(class A {int v=1;}; class B {inherit A; public int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {inherit A; protected int v=2;}; return B()->v, 0)
-
test_any(class A {int v=1;}; class B {inherit A; private int v=2;}; return B()->v, 0)
-
test_any(class A {int v=1;}; class B {inherit A; final int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {inherit A; local int v=2;}; return B()->v, 2)
-
test_any(class A {int v=1;}; class B {inherit A; inline int v=2;}; return B()->v, 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; public int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; protected int f(){return 2;}}; return B()->f, 0)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; private int f(){return 2;} int q=f();}; return B()->f, 0)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; final int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; local int f(){return 2;}}; return B()->f(), 2)
-
test_any(class A {int f(){return 1;}}; class B {inherit A; inline int f(){return 2;}}; return B()->f(), 2)
-
-
// test masking of lfuns using an empty declaration
-
-
test_any([[
-
// F_LFUN vs F_GLOBAL
-
class A {
-
void a() {}
-
int(0..1) b() {
-
return this->a == a;
-
}
-
};
-
class B {
-
inherit A;
-
-
void a();
-
};
-
return B()->b();
-
]], 1)
-
-
test_any([[
-
class A {
-
void a();
-
int(0..1) b() {
-
return this->a == a;
-
}
-
};
-
class B {
-
inherit A;
-
-
void a() {}
-
};
-
class C {
-
inherit B;
-
void a();
-
};
-
return B()->b();
-
]], 1)
-
-
// - modifiers, misc checks
-
-
test_program([[
-
class A {int i = 17;}
-
class B {
-
private inherit A;
-
class C {
-
int f() {return i;}
-
}
-
}
-
int a() {return B()->C()->f() == 17;}
-
]])
-
-
test_any([[
-
class Fnord
-
{
-
array gnzpp() { }
-
constant fNord = 4711;
-
-
class Bzonk
-
{
-
int xxxxx=17;
-
int yyyyy=17;
-
int zzzzz=17;
-
-
}
-
-
class Zboink
-
{
-
int pphfiztzz=1;
-
inherit Bzonk;
-
constant floingngg=fNord;
-
array Zpfoooinginoooo() {}
-
-
int t()
-
{
-
return fNord + fNord;
-
}
-
int z()
-
{
-
return floingngg + floingngg;
-
}
-
}
-
};
-
return Fnord()->Zboink()->t() + Fnord()->Zboink()->z();
-
]],4711 * 4)
-
-
test_any([[
-
class Foo
-
{
-
string s = "a";
-
-
int|string foo()
-
{
-
int i;
-
for (; i < strlen(s); i++) {
-
if (!strlen(s) && i) {
-
return "Optimizer error!";
-
}
-
s = "";
-
i = 0;
-
}
-
return 0;
-
}
-
};
-
return Foo()->foo();
-
]], 0)
-
-
// - call_out, call_out_info, remove_call_out, find_call_out
-
test_do(add_constant("call_out_cb", a))
-
test_do(call_out(call_out_cb,100000))
-
test_true(call_out(lambda() {},1000.0))
-
test_true(remove_call_out(call_out(lambda() {},1000.0)) != -1)
-
test_true(find_call_out(call_out(lambda() {},1000.0)) != -1)
-
test_true(find_call_out(call_out(lambda() {},1000.0)) > 990)
-
test_false(zero_type(remove_call_out(call_out(lambda() {},1000.0))))
-
test_true(arrayp(call_out_info()))
-
test_true(sizeof(call_out_info()) > 0)
-
test_true(call_out_info()[-1][0] > 1)
-
test_eq(find_call_out(call_out_info()[-1][2]), call_out_info()[-1][0])
-
test_eq(find_call_out(a),-1)
-
test_eq(zero_type(find_call_out(a)),1)
-
test_true(zero_type(find_call_out(a)))
-
test_true(!sizeof(call_out_info()) || function_name(call_out_info()[-1][2])!="call_out_cb")
-
test_do(remove_call_out(call_out_info()[-1][2]))
-
test_do(add_constant("call_out_cb"))
-
test_do(_do_call_outs())
-
test_any([[
-
object pid = Process.create_process(RUNPIKE_ARRAY +
-
({ "]]SRCDIR[[/test_co.pike" }));
-
int i;
-
for (i=0; i < 120; i++) {
-
if (pid->status()>0) break;
-
__signal_watchdog();
-
sleep(1);
-
}
-
if (pid->status() <= 0) {
-
pid->kill(9);
-
return "Killed";
-
}
-
return pid->wait();
-
]], 0)
-
test_do_([[ catch { _do_call_outs(); }]])
-
-
// - varargs
-
test_any_equal([[
-
mixed test(int a, mixed ... b) {
-
return b;
-
};
-
return test(1);
-
]],[[ ({}) ]])
-
test_any_equal([[
-
mixed test(int a, mixed ... b) {
-
return b;
-
};
-
return test(1,2);
-
]],[[ ({2}) ]])
-
test_any_equal([[
-
mixed test(int a, mixed ... b) {
-
return b;
-
};
-
return test(1,2,3);
-
]],[[ ({2,3}) ]])
-
test_any_equal([[
-
mixed test(int a, mixed ... b) {
-
return b;
-
};
-
return test(1,2,3);
-
]],[[ ({2,3}) ]])
-
test_compile_error([[
-
mixed test(int a, mixed ... b) {
-
return b;
-
};
-
return test();
-
]])
-
test_any_equal([[
-
mixed test(void|int a, mixed ... b) {
-
return b;
-
};
-
return test();
-
]],[[ ({}) ]])
-
test_any_equal([[
-
mixed test(int a, mixed ... b) {
-
if(a) return test(0);
-
return b;
-
};
-
return test(1,2);
-
]],[[ ({}) ]])
-
test_any_equal([[
-
class X {
-
mixed test(int a, mixed ... b) {
-
if(a) return test(0);
-
return b;
-
}
-
};
-
return X()->test(1,2);
-
]],[[ ({}) ]])
-
-
-
// sprintf
-
-
dnl This really belongs to sscanf, but...
-
test_eq([[ array_sscanf(sprintf("%1c", -1), "%1c")[0] ]], 255)
-
test_eq([[ array_sscanf(sprintf("%2c", -1), "%2c")[0] ]], 65535)
-
test_eq([[ array_sscanf(sprintf("%3c", -1), "%3c")[0] ]], 16777215)
-
-
test_eq([[ sprintf("%4c",16909060) ]],"\1\2\3\4")
-
test_eq([[ sprintf("%-4c",16909060) ]],"\4\3\2\1")
-
test_eq([[ sprintf("%2c",16909060) ]],"\3\4")
-
test_eq([[ sprintf("%-2c",16909060) ]],"\4\3")
-
test_eq([[ sprintf("%4c",2147483648) ]],"\200\0\0\0")
-
test_eq([[ sprintf("%-4c",2147483648) ]],"\0\0\0\200")
-
test_eq([[ sprintf("%2c",2147483648) ]],"\0\0")
-
test_eq([[ sprintf("%-2c",2147483648) ]],"\0\0")
-
-
test_eq([[ sprintf("%1c", 0x1abcd7893) ]], "\223")
-
test_eq([[ sprintf("%2c", 0x1abcd7893) ]], "x\223")
-
test_eq([[ sprintf("%3c", 0x1abcd7893) ]], "\315x\223")
-
test_eq([[ sprintf("%4c", 0x1abcd7893) ]], "\253\315x\223")
-
test_eq([[ sprintf("%5c", 0x1abcd7893) ]], "\1\253\315x\223")
-
test_eq([[ sprintf("%6c", 0x1abcd7893) ]], "\0\1\253\315x\223")
-
test_eq([[ sprintf("%7c", 0x1abcd7893) ]], "\0\0\1\253\315x\223")
-
-
test_eq([[ sprintf("%1c", -0x1abcd7893) ]], "m")
-
test_eq([[ sprintf("%2c", -0x1abcd7893) ]], "\207m")
-
test_eq([[ sprintf("%3c", -0x1abcd7893) ]], "2\207m")
-
test_eq([[ sprintf("%4c", -0x1abcd7893) ]], "T2\207m")
-
test_eq([[ sprintf("%5c", -0x1abcd7893) ]], "\376T2\207m")
-
test_eq([[ sprintf("%6c", -0x1abcd7893) ]], "\377\376T2\207m")
-
test_eq([[ sprintf("%7c", -0x1abcd7893) ]], "\377\377\376T2\207m")
-
-
test_eq([[ array_sscanf(sprintf("%4c", -1), "%4c")[0] ]], 4294967295)
-
test_eq([[ array_sscanf(sprintf("%5c",