// RUNNABLE_PHOBOS_TEST
import core.vararg;
import std.stdio;

/*********************************************************/

void ifthen(bool cond, lazy void dg)
{
    if (cond)
        dg();
}

void ifthen(bool cond, lazy void dgthen, lazy void dgelse)
{
    if (cond)
        dgthen();
    else
        dgelse();
}

void dotimes(int i, lazy int dg)
{
    for (int j = 0; j < i; j++)
        dg();
}

void switcher(bool delegate()[] cases...)
{
    foreach (c; cases)
    {
        if (c())
            break;
    }
}

bool scase(bool b, lazy void dg)
{
    if (b)
    {
        dg();
        return true;
    }
    return false;
}

bool sdefault(lazy void dg)
{
    dg();
    return true;
}

void whiler(lazy bool cond, lazy void bdy)
{
    while (cond())
        bdy();
}

void test1()
{
    int x = 3;
    dotimes(5, printf("%d\n", ++x));

    ifthen(true, printf("yes\n"));
    ifthen(false, printf("no\n"));

    ifthen(true, printf("yes\n"), printf("no\n"));
    ifthen(false, printf("yes\n"), printf("no\n"));

    int v = 2;
    switcher(
        scase(v == 1, printf("it is 1\n")),
        scase(v == 2, printf("it is 2\n")),
        scase(v == 3, printf("it is 3\n")),
        sdefault( printf("it is default\n"))
    );

    whiler( x < 100,
        (){ printf("%d\n", x); x *= 2; }()
    );
}

/*********************************************************/

void fooa(lazy void dg)
{
    dg();
}

void test2()
{
    fooa(cast(void)null);
}

/*********************************************************/

void dotimes3(int count, lazy void exp)
{
    for (int i = 0; i < count; i++)
       exp;
}

void bar3(...)
{
    assert(_arguments.length == 1);
    assert(va_arg!int(_argptr) == 14);
}

void abc3(int* p)
{
    writeln(*p);
    assert(*p == 3);
}

void test3()
{
    int x = 3;
    dotimes3(10, abc3(&x));
    dotimes3(10, write(++x));
    writeln();
    dotimes3(1, bar3(++x));

    int[10] a = new int[10];
    a[0] = 1;
    a[$ - 1] = 9;
    dotimes3(3, write(a[0..$]));
    writeln();
}

/*********************************************************/

int p4;

void foo4(void* delegate()[] dgs...)
{
    assert(dgs.length == 4);
    writefln("%s %s", dgs[0](), cast(void*)&p4);
    assert(dgs[0]() == cast(void*)&p4);
    assert(dgs[1]() == cast(void*)&p4);
    assert(dgs[2]() == null);
    assert(dgs[3] == null);
}

void test4()
{
    void *abc()
    {
        writeln(cast(void*)&p4);
        return cast(void*)&p4;
    }

    foo4(&abc, cast(void* delegate())&abc, null, cast(void* delegate())null);
}

/*********************************************************/

bool nextis(void delegate() dgpositive = {})
{
    return true;
}

bool looping(lazy bool condition)
{
    return true;
}

void test5()
{
    looping(nextis({}));
    looping(nextis({}));
}

/*********************************************************/

void foo6(lazy int expr, ...)
{
    char[] tmp_msg = va_arg!(char[])(_argptr);
    if (cast(int)(tmp_msg.ptr)=="food_for_thought".length)
         assert(0, "length is in the pointer!");
    assert(tmp_msg=="food_for_thought");
}

int bar6() { return 3; }

void test6()
{
    foo6(bar6(),"food_for_thought");
}

/*********************************************************/

void foo7(long delegate()[] dg...)
{
    assert(dg[0]() == 1024);
    assert(dg[1]() == 1024);
}

void bar7(lazy long n)
{
    assert(n == 1024);
}

void test7()
{
    int n = 1024;
    foo7(n, n);
    bar7(n);
}

/*********************************************************/

struct Bug5750 { int a, b; }
pure Bug5750 bug5750(lazy int y) {
    Bug5750 retval;
    retval.a = y;
    retval.b = y;
    return retval;
}

pure void test5750a() {
    auto z1 = bug5750(3);
    assert(z1 == Bug5750(3, 3));
    auto z2 = bug5750(z1.a);
    assert(z2 == Bug5750(3, 3));
    auto z3 = bug5750(z1.a+z2.a+3);
    assert(z3 == Bug5750(9, 9));
    auto z4 = bug5750(++z1.a);    // expected???
    assert(z4 == Bug5750(4, 5));
    assert(z1 == Bug5750(5, 3));
}

int bug5750Global = 7;
void test5750b() {
    auto z4 = bug5750(bug5750Global);
    assert(z4 == Bug5750(7, 7));
    auto z5 = bug5750(++bug5750Global);
    assert(z5 == Bug5750(8, 9));  // expected???
    assert(bug5750Global == 9);
}
// Note: also need to make up some fail-compilation tests.

/*********************************************************/

T calcLazy6682(T)(lazy T n)
{
    return n;
}
int purefunc6682() pure
{
    return calcLazy6682(1);
}
void test6682()
{
    assert(purefunc6682() == 1);
}

/*********************************************************/
// 9109

void test9109()
{
    void foo(int delegate()[] dgs ...)
    {
        assert(dgs[0]() + dgs[1]() == 1 + 13);
    }

    int x = 10;
    int delegate() dg;
    foo({ return 1; }, { return 3+x; }, dg, null);
}

/*********************************************************/
// 15835

class C15835 {}

string fun15835(lazy string s)
{
    return s;
}

void test15835()
{
    auto c = new C15835;
    auto s = typeid(c).name;
    assert(fun15835(typeid(c).name) == s);

    auto a = [c];
    assert(fun15835(typeid(a[0]).name) == s);
}

/*********************************************************/

int main()
{
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    test7();

    test5750a();
    test5750b();
    test6682();
    test9109();
    test15835();

    printf("Success\n");
    return 0;
}
