ldmud-3.3.719/
ldmud-3.3.719/doc/
ldmud-3.3.719/doc/efun.de/
ldmud-3.3.719/doc/efun/
ldmud-3.3.719/doc/man/
ldmud-3.3.719/doc/other/
ldmud-3.3.719/mud/
ldmud-3.3.719/mud/heaven7/
ldmud-3.3.719/mud/lp-245/
ldmud-3.3.719/mud/lp-245/banish/
ldmud-3.3.719/mud/lp-245/doc/
ldmud-3.3.719/mud/lp-245/doc/examples/
ldmud-3.3.719/mud/lp-245/doc/sefun/
ldmud-3.3.719/mud/lp-245/log/
ldmud-3.3.719/mud/lp-245/obj/Go/
ldmud-3.3.719/mud/lp-245/players/lars/
ldmud-3.3.719/mud/lp-245/room/death/
ldmud-3.3.719/mud/lp-245/room/maze1/
ldmud-3.3.719/mud/lp-245/room/sub/
ldmud-3.3.719/mud/lp-245/secure/
ldmud-3.3.719/mud/sticklib/
ldmud-3.3.719/mud/sticklib/src/
ldmud-3.3.719/mudlib/deprecated/
ldmud-3.3.719/mudlib/uni-crasher/
ldmud-3.3.719/pkg/
ldmud-3.3.719/pkg/debugger/
ldmud-3.3.719/pkg/diff/
ldmud-3.3.719/pkg/misc/
ldmud-3.3.719/src/
ldmud-3.3.719/src/autoconf/
ldmud-3.3.719/src/ptmalloc/
ldmud-3.3.719/src/util/
ldmud-3.3.719/src/util/erq/
ldmud-3.3.719/src/util/indent/hosts/next/
ldmud-3.3.719/src/util/xerq/
ldmud-3.3.719/src/util/xerq/lpc/
ldmud-3.3.719/src/util/xerq/lpc/www/
ldmud-3.3.719/test/generic/
ldmud-3.3.719/test/inc/
ldmud-3.3.719/test/t-0000398/
ldmud-3.3.719/test/t-0000548/
ldmud-3.3.719/test/t-030925/
ldmud-3.3.719/test/t-040413/
ldmud-3.3.719/test/t-041124/
ldmud-3.3.719/test/t-language/
inherit "/a";
inherit "/b";

#include "/inc/msg.inc"

string sub()
{
    return "c";
}

int check_closure(string file, string name, closure cl)
{
    int errors;
    
    msg("Checking: get_type_info(%s, 3) == \"/%s\":\t\t\t", name, file);
    if(get_type_info(cl, 3) == "/"+file)
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }

    msg("Checking: funcall(%s) == \"%s\":\t\t\t\t", name, file);
    if(funcall(cl) == file)
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }

    msg("Checking: funcall(lambda(0, ({%s}))) == \"%s\": \t\t", name, file);
    if(funcall(lambda(0, ({cl}))) == file)
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }
    
    msg("Checking: restore_value(save_value(%s)) == %s:    \t", name, name);
    if(restore_value(save_value(cl)) == cl)
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }

    msg("Checking: funcall(restore_value(save_value(%s))) == \"%s\":\t", name, file);
    if(funcall(restore_value(save_value(cl))) == file)
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }
    
    return errors;
}

int run_test()
{
    int errors;

    errors += check_closure("a", "#'a::sub", #'a::sub);
    errors += check_closure("b", "#'b::sub", #'b::sub);
    errors += check_closure("a", "#'::sub", #'::sub);
    errors += check_closure("c", "#'sub", #'sub);

    msg("Checking: a::sub() == \"a\":\t\t\t\t\t");
    if(a::sub() == "a")
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }
    msg("Checking: b::sub() == \"b\":\t\t\t\t\t");
    if(b::sub() == "b")
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }
    msg("Checking: sub() == \"c\":\t\t\t\t\t\t");
    if(sub() == "c")
	msg("Success.\n");
    else
    {
	errors++;
	msg("FAILURE.\n");
    }

    return errors;
}