06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #!/usr/local/bin/pike
|
12e727 | 1999-02-20 | Henrik Grubbström (Grubba) | |
|
7bd16b | 1997-06-01 | Henrik Grubbström (Grubba) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include <simulate.h>
|
e9361f | 1995-11-06 | Fredrik Hübinette (Hubbe) | |
|
c7dbb6 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #if !efun(_verify_internals)
#define _verify_internals()
#endif
|
12e727 | 1999-02-20 | Henrik Grubbström (Grubba) | | #define SHIFT_MAX 0 /* 2 */
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | int foo(string opt)
{
if(opt=="" || !opt) return 1;
return (int)opt;
}
|
dddccc | 1998-04-15 | Fredrik Hübinette (Hubbe) | |
mapping(string:int) cond_cache=([]);
|
bd227a | 1999-01-21 | Fredrik Hübinette (Hubbe) | | #if constant(thread_create)
#define HAVE_DEBUG
#endif
|
a9679f | 1995-11-13 | David Hedbor | | int main(int argc, string *argv)
{
|
c7dbb6 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | int e, verbose, successes, errors, t, check;
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | string *tests,tmp;
|
a9679f | 1995-11-13 | David Hedbor | | program testprogram;
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | int start, fail, mem;
int loop=1;
|
007382 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | int end=0x7fffffff;
|
bd227a | 1999-01-21 | Fredrik Hübinette (Hubbe) | | string extra_info="";
#if constant(signal) && constant(signum)
if(signum("SIGQUIT")>=0)
{
signal(signum("SIGQUIT"),lambda()
{
master()->handle_error( ({"\nSIGQUIT recived, printing backtrace and continuing.\n",backtrace() }) );
});
}
#endif
|
a9679f | 1995-11-13 | David Hedbor | |
|
086bfa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | string *args=backtrace()[0][3];
args=args[..sizeof(args)-1-argc];
|
f75182 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_constant("RUNPIKE",Array.map(args,Process.sh_quote)*" ");
|
086bfa | 1998-04-09 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | foreach(Getopt.find_all_options(argv,aggregate(
({"help",Getopt.NO_ARG,({"-h","--help"})}),
({"verbose",Getopt.NO_ARG,({"-v","--verbose"})}),
({"start",Getopt.HAS_ARG,({"-s","--start-test"})}),
|
007382 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | ({"end",Getopt.HAS_ARG,({"--end-after"})}),
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | ({"fail",Getopt.MAY_HAVE_ARG,({"-f","--fail"})}),
({"loop",Getopt.MAY_HAVE_ARG,({"-l","--loop"})}),
({"trace",Getopt.MAY_HAVE_ARG,({"-t","--trace"})}),
({"check",Getopt.MAY_HAVE_ARG,({"-c","--check"})}),
({"mem",Getopt.MAY_HAVE_ARG,({"-m","--mem","--memory"})}),
|
bd227a | 1999-01-21 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_DEBUG
({"debug",Getopt.MAY_HAVE_ARG,({"-d","--debug"})}),
#endif
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | )),array opt)
|
a9679f | 1995-11-13 | David Hedbor | | {
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | switch(opt[0])
{
case "help":
werror("Usage: "+argv[e]+" [-v | --verbose] [-h | --help] [-t <testno>] <testfile>\n");
return 0;
case "verbose": verbose+=foo(opt[1]); break;
case "start": start=foo(opt[1]); start--; break;
|
007382 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | case "end": end=foo(opt[1]); break;
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | case "fail": fail+=foo(opt[1]); break;
case "loop": loop+=foo(opt[1]); break;
case "trace": t+=foo(opt[1]); break;
case "check": check+=foo(opt[1]); break;
case "mem": mem+=foo(opt[1]); break;
|
bd227a | 1999-01-21 | Fredrik Hübinette (Hubbe) | |
#ifdef HAVE_DEBUG
case "debug":
{
object p=Stdio.Port();
p->bind(0);
werror("Debug port is: %s\n",p->query_address());
sscanf(p->query_address(),"%*s %d",int portno);
extra_info+=sprintf(" dport:%d",portno);
thread_create(lambda(object p){
while(p)
{
if(object o=p->accept())
{
object q=Stdio.FILE();
q->assign(o);
destruct(o);
Tools.Hilfe.GenericHilfe(q,q);
}
}
},p);
}
#endif
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | }
|
a9679f | 1995-11-13 | David Hedbor | | }
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | argv=Getopt.get_args(argv,1);
if(sizeof(argv)<1)
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | {
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | if(!tmp)
{
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror("No tests?\n");
|
e42eaf | 1998-01-02 | Fredrik Hübinette (Hubbe) | | exit(1);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | }
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | while(loop--)
{
successes=errors=0;
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | for(int f=1;f<sizeof(argv);f++)
|
a9679f | 1995-11-13 | David Hedbor | | {
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | tmp=read_bytes(argv[f]);
if(!tmp)
|
a9679f | 1995-11-13 | David Hedbor | | {
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror("Failed to read test file, errno="+errno()+".\n");
exit(1);
|
a9679f | 1995-11-13 | David Hedbor | | }
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | tests=tmp/"\n....\n";
tmp=0;
tests=tests[0..sizeof(tests)-2];
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror("Doing tests in %s (%d tests)\n",argv[f],sizeof(tests));
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | for(e=start;e<sizeof(tests);e++)
|
a9679f | 1995-11-13 | David Hedbor | | {
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | string test,condition;
int type;
object o;
mixed a,b;
if(check) _verify_internals();
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | test=tests[e];
if(sscanf(test,"COND %s\n%s",condition,test)==2)
|
a9679f | 1995-11-13 | David Hedbor | | {
|
dddccc | 1998-04-15 | Fredrik Hübinette (Hubbe) | | int tmp;
if(!(tmp=cond_cache[condition]))
{
tmp=!!(clone(compile_string("mixed c() { return "+condition+"; }","Cond "+(e+1)))->c());
if(!tmp) tmp=-1;
cond_cache[condition]=tmp;
}
if(tmp==-1)
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | {
if(verbose)
werror("Not doing test "+(e+1)+"\n");
successes++;
continue;
}
|
a9679f | 1995-11-13 | David Hedbor | | }
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | sscanf(test,"%s\n%s",type,test);
sscanf(type,"%*s expected result: %s",type);
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | if(verbose)
{
|
bd227a | 1999-01-21 | Fredrik Hübinette (Hubbe) | | werror("Doing test %d (%d total)%s\n",e+1,successes+errors+1,extra_info);
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | if(verbose>1)
werror(test+"\n");
}
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | |
for(int shift=0;shift <= SHIFT_MAX;shift++) {
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | if(check > 1) _verify_internals();
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | | string fname = argv[f] + ": Test " + (e + 1) +
" (shift " + shift + ")";
string widener = ([ 0:"",
1:"\nint \x30c6\x30b9\x30c8=0;\n",
2:"\nint \x10001=0;\n" ])[shift];
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | |
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | switch(type)
|
a9679f | 1995-11-13 | David Hedbor | | {
|
086bfa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | case "COMPILE":
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | | if(catch(compile_string(test + widener, fname)))
|
086bfa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | {
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(fname + " failed.\n");
|
086bfa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | werror(test+"\n");
errors++;
}else{
successes++;
}
break;
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | case "COMPILE_ERROR":
master()->set_inhibit_compile_errors(1);
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | | if(catch(compile_string(test + widener, fname)))
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | {
successes++;
}else{
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(fname + " failed.\n");
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror(test+"\n");
errors++;
}
master()->set_inhibit_compile_errors(0);
break;
case "EVAL_ERROR":
master()->set_inhibit_compile_errors(1);
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | | if(catch(clone(compile_string(test + widener, fname))->a()))
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | {
successes++;
}else{
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(fname + " failed.\n");
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror(test+"\n");
errors++;
}
master()->set_inhibit_compile_errors(0);
break;
default:
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | | o=clone(compile_string(test + widener,fname));
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | |
if(check > 1) _verify_internals();
a=b=0;
if(t) trace(t);
if(functionp(o->a)) a=o->a();
if(functionp(o->b)) b=o->b();
if(t) trace(0);
if(check > 1) _verify_internals();
switch(type)
{
case "FALSE":
|
2583b4 | 1999-02-20 | Henrik Grubbström (Grubba) | | if(a)
{
werror(fname + " failed.\n");
werror(test+"\n");
werror(sprintf("o->a(): %O\n",a));
errors++;
}else{
successes++;
}
break;
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | |
case "TRUE":
if(!a)
{
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(fname + " failed.\n");
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror(test+"\n");
|
994fe4 | 1998-04-08 | Fredrik Hübinette (Hubbe) | | werror(sprintf("o->a(): %O\n",a));
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | errors++;
}else{
successes++;
}
break;
case "RUN":
successes++;
break;
case "EQ":
if(a!=b)
{
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(fname + " failed.\n");
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror(test+"\n");
werror(sprintf("o->a(): %O\n",a));
werror(sprintf("o->b(): %O\n",b));
errors++;
}else{
successes++;
}
break;
case "EQUAL":
if(!equal(a,b))
{
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(fname + " failed.\n");
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | werror(test+"\n");
werror(sprintf("o->a(): %O\n",a));
werror(sprintf("o->b(): %O\n",b));
errors++;
}else{
successes++;
}
break;
default:
|
32a6ac | 1998-04-11 | Henrik Grubbström (Grubba) | | werror(sprintf("%s: Unknown test type (%O).\n", fname, type));
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | errors++;
}
|
a9679f | 1995-11-13 | David Hedbor | | }
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | |
if(check > 2) _verify_internals();
if(fail && errors)
exit(1);
|
007382 | 1998-04-05 | Fredrik Hübinette (Hubbe) | |
|
475a84 | 1999-02-20 | Henrik Grubbström (Grubba) | | }
|
007382 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | if(!--end) exit(0);
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | |
a=b=0;
|
a9679f | 1995-11-13 | David Hedbor | | }
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
}
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | if(mem)
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
|
73b75f | 1998-02-24 | Fredrik Hübinette (Hubbe) | | int total;
tests=0;
gc();
mapping tmp=_memory_usage();
write(sprintf("%-10s: %6s %10s\n","Category","num","bytes"));
foreach(sort(indices(tmp)),string foo)
{
if(sscanf(foo,"%s_bytes",foo))
{
write(sprintf("%-10s: %6d %10d\n",
foo+"s",
tmp["num_"+foo+"s"],
tmp[foo+"_bytes"]));
total+=tmp[foo+"_bytes"];
}
}
write(sprintf("%-10s: %6s %10d\n",
"Total",
"",
total));
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | }
|
a9679f | 1995-11-13 | David Hedbor | | }
|
b455c8 | 1998-03-20 | Fredrik Hübinette (Hubbe) | | if(errors || verbose)
{
werror("Failed tests: "+errors+".\n");
}
|
007382 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | werror("Total tests: %d\n",successes+errors);
|
a9679f | 1995-11-13 | David Hedbor | |
return errors;
}
|