import core.vararg;

extern(C) int printf(const char*, ...);

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

class A1
{
    union
    {
        struct
        {
            int x;
            public int y;
        }
        protected int z;
    }
}

class A2
{
    struct
    {
        int x;
        public int y;
    }
}

class A3
{
    union
    {
        int x;
        public int y;
    }
}

void test1()
{
    A1 a1 = new A1();
    A2 a2 = new A2();
    A3 a3 = new A3();

    a1.x = 1;
    a1.y = 2;
    a1.z = 3;
    assert(a1.x == 3);
    assert(a1.y == 2);

    a2.x = 1;
    a2.y = 2;
    assert(a2.x == 1);

    a3.x = 1;
    a3.y = 2;
    assert(a3.x == 2);
}

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

struct A4
{
    union
    {
        struct
        {
            int x = 13;
        }
        int y;
    }
}

void test4()
{
    printf("A4.sizeof = %zd\n", A4.sizeof);
    assert(A4.sizeof == 1 * int.sizeof);

    A4 q;
    assert(q.y == 13);
}

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

class A5
{
     union {
         struct {
             int x;
         }
         public int y;
     }
}

void test5()
{
     A5 a = new A5;

     a.x = 3;
     a.y = 4;
     assert(a.x == 4);
}

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

int i6 = 5;

float m6 = 5.0;

void test6()
{
  void f()
  {
    void i6(float j)
    {
        m6 = j;
    }

    void g()
    {
        i6 = 1;
    }
    g();
  }

  f();

  printf( "%d %f\n", i6, m6);
  assert(i6 == 5);
  assert(m6 == 1);
}

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

const int a1 = 50;
const int a2 = 50;
const int a3 = a1 * a2;

const int b1 = a1 - 1;
const int b2 = a2 - 1;

const int c1 = 50*50;
const int c2 = (a1-1)*(a2-1);
const int c3 = b1*b2;

int[4*c1]  array1;  // illegal!
int[4*c2]  array2;  // illegal!
int[4*c3]  array3;  // illegal!

int[a3]    array4;  // valid! no error!

void test7()
{
    assert(a1 == 50);
    assert(a2 == 50);
    assert(a3 == 2500);

    assert(b1 == 49);
    assert(b2 == 49);

    assert(c1 == 2500);
    assert(c2 == 2401);
    assert(c3 == 2401);

    assert(array1.length == 10000);
    assert(array2.length == 9604);
    assert(array3.length == 9604);
}

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

struct Foo8
{
    static Foo8 bar()
    {
        Foo8 res;
        return res;
    }
}

void test8()
{
    Foo8[8] x;
    x[] = Foo8.bar;
}


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

void test9()
{
     try {
     } catch (Exception e) {
         debug printf("Exception happened\n");
     }
}

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

struct Foo10 {
  const bool opEquals(const ref Foo10 x) {
    return this.normalize is x.normalize;
  }
  const Foo10 normalize() {
    Foo10 res;
    return res;
  }
}

void test10()
{
}


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

class T11
{
    this(){}
    ~this(){}
}

void test11()
{
    scope T11 t=new T11();
    int i=1;
    switch(i)
    {
        case 1:
            break;

        default:
            break;
    }
}

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

void test12()
{
        char[] s;
        char[] t;

        if (true)
            s = null;
        s = (true) ? null : t;
        t = (true) ? s : null;
}

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

class Foo13
{
       int init (int x) { return 1; }

       static int init (long y) { return 2; }
}

void test13()
{
    Foo13 f = new Foo13();
    int i;

    i = f.init(1);
    assert(i == 1);
    i = f.init(1L);
    assert(i == 2);
}

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

void write14(bool[] c)
{
    printf("[%2zd]: ", c.length);
    foreach (bool x; c)
        printf("%d,", x);
    printf("\n");
}

void test14()
{
     static bool[] a = [ 1, 1, 0, 1, 0 ];
     static bool[] b = [ 1, 0, 0, 1 ];
     bool[] c = a ~ b;

     static bool[] r1 = [1,1,0,1,0,1,0,0,1];
     static bool[] r2 = [1,1,0,1,0,1,0,0,1,1,1,0,1,0];
     static bool[] r3 = [1,1,0,1,0,1,0,0,1,1,1,0,1,0,0];
     static bool[] r4 = [1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,1];


     write14(c);
     assert(c == r1);

     c ~= a;
     write14(c);
     assert(c == r2);

     c ~= 0;
     write14(c);
     assert(c == r3);

     c ~= 1;
     write14(c);
     assert(c == r4);
}

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

void test15()
{
        bool[] b;
        bool[] c;

        b.length = 10;
        c = b[0..4];
        c[] = true;

        assert(b[0] == true);
        assert(b[1] == true);
        assert(b[2] == true);
        assert(b[3] == true);

        assert(b[4] == false);
        assert(b[5] == false);
        assert(b[6] == false);
        assert(b[7] == false);
        assert(b[8] == false);
        assert(b[9] == false);
}

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

int y16;

class C16
{
        int x;
        this()
        {
            x = 4;
        }
}

void test16()
{
    C16 c = new C16();
    assert(c.x == 4);
}

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

ubyte* ptr17;

void test17()
{
    ubyte[16] foo;

    printf("foo = %p\n", foo.ptr);
    ptr17 = foo.ptr;
    abc17(foo);
}

void abc17(ref ubyte[16] bar)
{
    printf("bar = %p\n", bar.ptr);
    assert(bar.ptr == ptr17);
}

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

struct Iterator18(T)
{
   T* m_ptr;

   const bool opEquals(const ref Iterator18 iter)
   {
     return (m_ptr == iter.m_ptr);
   }

   const int opCmp(const ref Iterator18 iter)
   {
     return cast(int)(m_ptr - iter.m_ptr);
   }
}

void test18()
{
    Iterator18!(int) iter;
}

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

struct S29(T)
{
   const bool opEquals(const ref S29!(T) len2)
   {
     return 0;
   }

   const int opCmp(const ref S29!(T) len2)
   {
     return 0;
   }
}


void test19()
{
   TypeInfo info = typeid(S29!(int));
}


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

class Mapped : Buffer
{
        this()
        {
        }

        ~this()
        {
        }
}

class Buffer
{
        private uint limit;
        private uint capacity;
        private uint position;

        invariant()
        {
               assert (position <= limit);
               assert (limit <= capacity);
        }
}

void test20()
{
    Buffer b = new Buffer();
    destroy(b);
}

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

class T21
{
 char[1] p1;
 char[1] p2;
public:
 char[] P() {return p1~p2;}
}

void test21()
{
    T21 t = new T21;
    t.p1[0] = 'a';
    t.p2[0] = 'b';
    assert(t.P() == "ab");
}

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

void test22()
{
    struct foo1 { int a; int b; int c; }

    class foo2
    {
        foo1[] x;

        foo1 fooret(foo1 foo2)
        {
            x.length = 9;
            return x[0] = foo2; // Here

            // x[0] = foo2; --- This version does not
            // return x[0]; --- cause the error.
        }
    }
}


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

interface I24 { }

void test24()
{
}

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

interface D25{}
interface C25:D25{}
interface B25:C25{}
interface A25:B25{}

void test25()
{
}

class     A26:B26{}
interface B26:C26{}
interface C26:D26{}
interface D26{}

void test26()
{
}

interface A27:B27{}
interface B27:C27{}
interface C27:D27{}
interface D27{}

void test27()
{
}

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

void test28()
{
    const double d = -1.0;
    int i = cast(int)d;
    printf("i = %d\n", i);
    assert(-1 == i);
}

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

static int[1][5] array = [[1],[2],[3],[4],[5] ];

void Lookup( int which )
{
   switch( which )
   {
     case 0 : return cast(void)array[which];
     default: assert(0);
   }
}

void test29()
{
}

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

void foo31(...)
{
    byte b = va_arg!byte(_argptr);
    assert(b == 8);
}

void test31()
{
    byte x = 9;
    foo31(--x);
    --x;
    foo31(++x);
}

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

template Foo33(T, int L)
{
        T[L] arr;
        class Bar {
                int before = 6;
                T[L] arr;
                int after = 7;
        }
}

void test33()
{
        alias Foo33!(int, 100) foo;
        foreach (int x; foo.arr)
                assert(x == int.init);

        foo.Bar bar = new foo.Bar();
        foreach (int x; bar.arr)
        {       //printf("%d\n", x);
                assert(x == int.init);
        }
}


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

void test34()
{
        bool[1] a;
        bool[1] b;

        bool[] concat() {
                return a~b;
        }

        a[]=0;
        b[]=1;

        bool[] arr=concat();

        assert(arr.length==2);
        assert(arr[0]==0);
        assert(arr[1]==1);
}

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

void dummy35(...) {}

void test35()
{
    byte x = 9;
    dummy35(x);
    int y = --x;
    assert (y == 8);
    assert (x == 8);
}

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

void test36()
{
        int[] a;
        a.length = 2;
        a[0]=1;
        a[1]=2;

        int[] b;
        b.length = 1;
        b[0]=3;

        a~=b;

        assert(a.length==3);
        assert(a[0]==1);
        assert(a[1]==2);
        assert(a[2]==3);

        assert(b.length==1);
        assert(b[0]==3);
}

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

struct Range{
        int width(){
                return 1;
        }
}

class Container {
        Range opIndex(int i){
                return data[i];
        }

        Range[2] data;
}

void test37()
{
        Container ranges=new Container;

// fails with -inline
//      assert(ranges[0].width() == 1);
}

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

void test38()
{
        uint mask = (uint.max >> 1);
        assert(mask == (uint.max >> 1));
}



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

void test41()
{
    assert(new void[40] == new void[40]);
}

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

void test42()
{
        static ubyte[] master = [
                0xE3u, 0x83u, 0xAFu, 0xE3u, 0x83u, 0xADu, 0xE3u, 0x82u,
                0xB9u, 0xEFu, 0xBDu, 0x97u
        ];

        string string1 =  "ワロスｗ";
        string string2 = r"ワロスｗ";
        string string3 =  `ワロスｗ`;
        string string4 = "\xE3\x83\xAF\xE3\x83\xAD\xE3\x82\xB9\xEF\xBD\x97";

        assert(string1.length==master.length);

        for(int i=0; i<master.length; i++){
                assert(string1[i]==master[i]);
        }

        assert(string2.length==master.length);

        for(int i=0; i<master.length; i++){
                assert(string2[i]==master[i]);
        }

        assert(string3.length==master.length);

        for(int i=0; i<master.length; i++){
                assert(string3[i]==master[i]);
        }

        assert(string4.length==master.length);

        for(int i=0; i<master.length; i++){
                assert(string4[i]==master[i]);
        }
}

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

struct S43
{
        int i=1;
}

static S43[3] s= [ 1: { 2 } ];

void test43()
{
        assert(s[0].i==1);
        assert(s[1].i==2);
        assert(s[2].i==1);
}

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

struct S44
{
  int i;
}

static S44[12] S44s = [];

void test44()
{
}


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

struct S45
{
    double x = 0, y = 0;
    static S45 opCall(int i) { S45 r; r.x = i; return r; }
    S45 opBinary(string op)(S45 s) if (op == "*")
    {
        S45 r;
        r.x = x * s.x;
        r.y = y * s.y;
        return r;
    }
}

template sqr(F) { F sqr(F x) { return x * x; } }

template pow(F)
{
    F pow(F x, int i) {
        if (i < 1)
        {
            static if (is(F : real))
                return 1;
            else
                return F(1);
        }
        if (i & 1)
        {
            if (i == 1)
                return x;
            else
                return x * pow(x,i-1);
        }
        return sqr!(F)(pow(x,i/2));
    }
}

void test45()
{
    S45 s = S45(10);
    S45 val = pow!(S45)(s,2);
    printf("x = %2.2f, y = %2.2f\n", val.x, val.y);
    assert(val.x == 100);
    assert(val.y == 0);
    double d = pow!(double)(10,3);
    printf("%2.2f\n", d);
    assert(d == 1000);
}

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

struct Node46
{
  Node46* left,right,parent;
  int color = 5;
  char[] key;
  char[] value;
}

void test46()
{
  Node46* x = new Node46;
  assert( x.left is null );
  assert( x.right is null );
  assert( x.parent is null );
  assert( x.color is 5 );
  assert( x.key is null );
  assert( x.value is null );
}

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

string foo48(string s)
{
    return s;
}

void test48()
{
    char c = '?';
    string s;

    s = foo48("is this it" ~ c ~ " yep!");
    assert(s == "is this it? yep!");

    s = foo48("is this it" ~ c);
    assert(s == "is this it?");

    s = foo48(c ~ "is this it");
    assert(s == "?is this it");
}


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

char[10] foo49 = void;

void test49()
{
    int i = void;
    //printf("i = %d\n", i);
    int[10] a;
    foreach (int x; a)
    {
        printf("\tx = %d\n", x);
    }
}

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

void foo50(string s) { assert(s == "is this it? yep!"); }

void test50()
{
    char c = '?';
    foo50("is this it"~c~" yep!");
}

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

void test51()
{
    bool[9][3] qwert;

    printf("qwert.sizeof = %zd\n", qwert.sizeof);

    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 9; j++)
            assert(qwert[i][j] == false);

    version (D_Bits)
        assert(qwert.sizeof == 12);
    else
        assert(qwert.sizeof == 27);

    qwert[0][3] = true;
    qwert[0][5] = true;
    qwert[0][7] = true;

    qwert[1..3] = qwert[0];

    for (int i = 0; i < 3; i++)
    {
        assert(qwert[i][0] == false);
        assert(qwert[i][1] == false);
        assert(qwert[i][2] == false);
        assert(qwert[i][3] == true);
        assert(qwert[i][4] == false);
        assert(qwert[i][5] == true);
        assert(qwert[i][6] == false);
        assert(qwert[i][7] == true);
        assert(qwert[i][8] == false);
    }
}


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

void test52()
{
    size_t vsize = void.sizeof;
    assert(vsize == 1);
}

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

const char[3][13] month = [
     1: "Jan", "Feb", "Mar", "Apr", "May", "Jun",
     8: "Aug", "Sep", "Oct", "Nov", "Dec"
];

void test53()
{
    printf("%.*s\n", cast(int)month[1].length, month[1].ptr);
    printf("%.*s\n", cast(int)month[2].length, month[2].ptr);
    printf("%.*s\n", cast(int)month[3].length, month[3].ptr);
    printf("%.*s\n", cast(int)month[4].length, month[4].ptr);
    printf("%.*s\n", cast(int)month[5].length, month[5].ptr);
    printf("%.*s\n", cast(int)month[6].length, month[6].ptr);
    printf("%.*s\n", cast(int)month[8].length, month[8].ptr);

    assert(month[1] == "Jan");
    assert(month[2] == "Feb");
    assert(month[3] == "Mar");
    assert(month[4] == "Apr");
    assert(month[5] == "May");
    assert(month[6] == "Jun");
    assert(month[8] == "Aug");
    assert(month[9] == "Sep");
    assert(month[10] == "Oct");
    assert(month[11] == "Nov");
    assert(month[12] == "Dec");

    assert(month[0][0] == 0xFF);
    assert(month[0][1] == 0xFF);
    assert(month[0][2] == 0xFF);

    assert(month[7][0] == 0xFF);
    assert(month[7][1] == 0xFF);
    assert(month[7][2] == 0xFF);
}

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

struct S54
{
    static S54 foo()
    {
        S54 s;
        with (s) {} // bug
        return s;
    }

    static S54 bar()
    {
        return S54.foo() * S54.foo();
    }

    S54 opBinary(string op)(S54 s) if (op == "*")
    {
        return s;
    }
}

void test54()
{
    S54.bar();
}

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

void test55()
{
  char c = 'a';
  char[] str, uvw;
  str = str ~ c;
  uvw = c ~ uvw;

  printf("%.*s\n", cast(int)str.length, str.ptr);
  assert(str == "a");
  assert(uvw == "a");

  c = 'b';
  printf("%.*s\n", cast(int)str.length, str.ptr);
  assert(str == "a");
  assert(uvw == "a");
}

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

void test56()
{
    char[4] a, b;
    a[] = 'a'; b[] = 'a';

    for (int i = 0; i < 4; i++)
    {
        assert(a[i] == 'a');
        assert(b[i] == 'a');
    }

    a[] = b[] = 'b';

    for (int i = 0; i < 4; i++)
    {
        assert(a[i] == 'b');
        assert(b[i] == 'b');
    }

}


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

void test57()
{
        char[] a;
        char[] b;

        a = a ~ 'x';
        assert(a == "x");
        b = 'c' ~ a ~ 'b';
        assert(b == "cxb");
}


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

struct Foo58
{
    ubyte a, b, c;
}

void test58()
{
    Foo58 d;
    foobar58(d);
    return cast(void)0;
}

void foobar58(Foo58 e) {}


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

void foo59(string s)
{
    assert(s == "hello");
}

void foo59(wstring s)
{
    assert(s == "baby");
}

void foo59(dstring s)
{
    assert(s == "jane");
}

void test59()
{
    string h = "hello"c;
    wstring b = "baby"w;
    dstring j = "jane"d;

    //writefln("%s %s %s", h, b, j);

    foo59(h);
    foo59("hello"c);
    foo59(b);
    foo59("baby"w);
    foo59(j);
    foo59("jane"d);
}

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

class C60
{
    static const int x;
    const int y;

    void foo()
    {
    }

    static this()
    {
        x = 5;
    }

    this()
    {
        y = 7;
    }
}

const int z60;

static this()
{
    z60 = 3;
}

void test60()
{
    C60 c = new C60();

    assert(c.x == 5);
    assert(c.y == 7);
    assert(z60 == 3);
}

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

void foo61(real[] arr)
{
    // i = 0 doesn't trigger the bug, everything bigger seems to
    // also, making this const fixes the bug
    size_t i = 1;

    for (size_t j = i; j >= i; j -= i)
    {
        // interesting results follow from this:
        printf("%zd ", i);
        // it prints a _lot_ of ones

        arr[j] = arr[j - i];
    }
}

void test61()
{
    real[] array;
    array.length = 2; // whatever, as long as it's more than 1

    foreach (ref real i; array)
        i = 1; // just something

    foo61(array);
}

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

void bug7493()
{
    string str = "abcde";
    const(void) [][1] arr = [str];
    assert(arr[0].length == str.length);
    const(void) [][1] arr2;
    arr2 = [str];
    assert(arr[0].length == str.length);
}

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

int main()
{
    test1();
    test4();
    test5();
    test6();
    test7();
    test8();
    test9();
    test10();
    test11();
    test12();
    test13();
    test14();
    test15();
    test16();
    test17();
    test18();
    test19();
    test20();
    test21();
    test22();
    test24();
    test25();
    test26();
    test27();
    test28();
    test29();
    test31();
    test33();
    test34();
    test35();
    test36();
    test37();
    test38();
    test41();
    test42();
    test43();
    test44();
    test45();
    test46();
    test48();
    test49();
    test50();
    test51();
    test52();
    test53();
    test54();
    test55();
    test56();
    test57();
    test58();
    test59();
    test60();
    test61();
    bug7493();

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