// RUNNABLE_PHOBOS_TEST
// PERMUTE_ARGS:

module run.module_01;

import core.memory;
import core.exception;
import core.vararg;

extern(C) void* malloc(size_t size);

/* ================================ */

struct MyStruct
{
        int i;
}

void test1()
{
        MyStruct inner()
        in{
                assert(1);
        }out (result){
                assert(result.i==1);
        }body{
                MyStruct s;
                s.i = 1;
                return s;
        }
        assert(inner.i==1);
}

/* ================================ */

void foo2()
in{
        assert(0);
}
body{
}

void test2()
{
        try{
                foo2();
        }catch(Error ie){
                return;
        }
        assert(0);
}

/* ================================ */

class MyClass3
{

        private int g() const {
                return 1;
        }

        invariant()
        {
                assert(g()==1);
        }
}

void test3()
{
        MyClass3 c = new MyClass3();
        assert(c);
}

/* ================================ */

class A
{
        int x;

        this(){
            printf("A.this()\n");
            x=3;
        }

        invariant()
        {
            printf("A.invariant\n");
            assert(x>2);
        }
}

class B : A
{
        int y;

        this(){
            printf("B.this()\n");
            y=5;
        }

        invariant()
        {
            printf("B.invariant\n");
            assert(y>4);
        }
}

void test4()
{
        B gc = new B();
}

/* ================================ */

class A5
{

        int x;

        this(){
            printf("A5.this()\n");
            x=3;
        }

        invariant()
        {
            printf("A5.invariant\n");
            assert(x>2);
        }
}

class C5 : A5 { }

class B5 : C5
{

        int y;

        this(){
            printf("B5.this()\n");
            y=5;
        }

        invariant()
        {
            printf("B5.invariant\n");
            assert(y>4);
        }
}

void test5()
{
        B5 gc = new B5();
}

/* ================================ */

void test6()
{
        long a;
        assert(a.max == 0x7FFF_FFFF_FFFF_FFFFL);
        //assert(a.min == 0xFFFF_FFFF_FFFF_FFFFL);
        assert(a.min == 0x8000_0000_0000_0000L);
        assert(a.init == 0);
        assert(a.sizeof == 8);
}

/* ================================ */

int i;

void test7()
{
        assert(run.module_01.i==0);
        run.module_01.i++;
        assert(run.module_01.i==1);
}

/* ================================ */

template mix(){
        int x;
}

mixin .mix;

void test8()
{
}

/* ================================ */

struct A9
{
    B9 next;
}

alias A9* B9;

void test9()
{
    B9 n = new A9;
}

/* ================================ */


struct TestStruct
{
        void add(...)
        {
                TestStruct other = va_arg!TestStruct(_argptr);
                foreach(int value; other)
                {
                        foo();
                }
        }

        void foo()
        {
                assert(left is null);
                bar();
        }

        void bar()
        {
                assert(left is null);
        }

        int opApply(int delegate(ref int val) dg)
        {
                return 0;
        }

        void* left;
}

void test10()
{
        TestStruct t;
        t.foo();
}

/* ================================ */

int status11;

void check(int x){
        status11++;
}

class MyClass11{
        void test(){
                assert(status11==0);
                .check(0);
                assert(status11==1);
                check();
                assert(status11==3);
        }

        void check(){
                assert(status11==1);
                status11+=2;
        }
}

void test11()
{
        MyClass11 c = new MyClass11();
        assert(status11==0);
        c.test();
        assert(status11==3);
        check(0);
        assert(status11==4);
}

/* ================================ */

int status12;

class C12{
        void foo(){
                status12='N';
        }

        static void foo(int x){
                status12=x;
        }
}

void test12()
{
        C12 m = new C12();

        C12.foo('S');
        assert(status12=='S');

        m.foo('s');
        assert(status12=='s');

        m.foo();
        assert(status12=='N');
}

/* ================================ */

void test13()
{
        wstring a="abc";
        wstring b="efg";
        wstring c=a~"d"~b;

        assert(c == "abcdefg");
}

/* ================================ */

void test14()
{
        dstring a="abc";
        dstring b="efg";
        dstring c=a~"d"~b;

        assert(c == "abcdefg");
}

/* ================================ */

class Parent15
{
        void test(int i){
        }

        int opCast(){
                return 0;
        }
}

class Child15 : Parent15
{
}

void test15()
{
        (new Child15()).test(2);
}

/* ================================ */

class Parent16
{
        void test(int i){
        }
}

class Child16 : Parent16
{
        int opCast(){
                return 0;
        }
}

void test16()
{
        (new Child16()).test=2;
}

/* ================================ */

void foo17(){
        class MyClass{
                static int x;
        }
}

void foo17(int i){
        class MyClass{
                static int x;
        }
}

void test17()
{
}

/* ================================ */

void foo18(){
        struct MyStruct{
                static int x;
        }
}

void foo18(int i){
        struct MyStruct{
                static int x;
        }
}

void test18()
{
}

/* ================================ */

class Class19 : Throwable
{
    this() { super(""); }
}

alias Class19 Alias19;

void test19()
{
        try{
                throw new Alias19();
        }catch(Throwable){
                return;
        }
        assert(0);
}

/* ================================ */

public static const uint U20 = (cast(uint)(-1)) >>> 2;

alias uint myType20;
public static const myType20 T20 = (cast(myType20)(-1)) >>> 2;

void test20()
{
        assert(U20 == 0x3FFFFFFF);
        assert(T20 == 0x3FFFFFFF);
}

/* ================================ */

class C21(T1){
        alias T1 type1;
}

class C21(T1, T2){
        alias T1 type1;
        alias .C21!(T2) type2;
}

void test21()
{
        alias C21!(int,long) CT;
        CT c = new CT();
}

/* ================================ */

scope class AutoClass{
}

void test22()
{
        scope AutoClass ac = new AutoClass();

        with(ac){
        }
}

/* ================================ */

int status23;

scope class C23{
        ~this(){
                assert(status23==0);
                status23--;
                throw new Exception("error msg");
        }
}

void foo23(){
        assert(status23==0);
        scope C23 ac = new C23();
}

void test23()
{
        try{
                foo23();
        }catch(Throwable){
        }
        assert(status23==-1);
}

/* ================================ */

int status24;

scope class C24{
        this(){
                assert(status24==0);
                status24+=2;
        }
        ~this(){
                assert(status24==2);
                status24--;
                throw new Exception("error msg");
        }
}

void check24(){
        scope C24 ac = new C24();
        throw new Exception("check error");
}

void test24()
{
        assert(status24==0);
        try{
                check24();
        }catch(Throwable){
                assert(status24==1);
                status24-=5;
        }
        assert(status24==-4);
}

/* ================================ */

struct S25{
        S25 opSub(int i) { S25 s; return s; }
}

struct GeomObject{
        S25     mesh;
        int     xlate;
}


void extractTriangles(GeomObject g)
{
    void foobar()
    {
        g.mesh - g.xlate;
        //g.mesh.opSub(g.xlate);
    }

    foobar();
}

void test25()
{
}

/* ================================ */

struct S26{
        int i;

        void display(){
                assert(i==10);
        }

        void someFunc(){
                // We never call this function
                void bug(S26[] array){
                        array[0].i = i+1;
                }

                assert(i==10);
                display();
                assert(i==10);
        }
}

void test26()
{
        S26 m;
        m.i = 10;
        assert(m.i==10);
        m.someFunc();
        assert(m.i==10);
}

/* ================================ */

template foo27(T:T[],alias S) {
        string foo(T[] a, T[] b) {
                return a ~ S ~ b;
        }
}

string comma = ", ";
alias foo27!(string,comma).foo catComma;

void test27()
{
        string a = "Heath";
        string b = "Regan";

        assert("Heath, Regan"==catComma(a,b));
}

/* ================================ */

void test28()
{
        assert((new S28!()).i==int.sizeof);
}

struct S28(){
        int i=func28(0).sizeof;
}

int func28(...){
        return 0;
}

/* ================================ */

void test29()
{
        uint u;
        u = 1 << 31;
        assert( u == 0b1000_0000__0000_0000__0000_0000__0000_0000u);
}

/* ================================ */
// Test for FinalizeError - it will be thrown if an Exception is thrown
// during the class object finalization.

int status30;

class C30
{
    this()
    {
        status30++;
    }

    ~this()
    {
        status30--;
        throw new Exception("E2");
    }
}

void test30()
{
    try
    {
        //scope C30 m = new C30();
        // It will insert one more `delete m` for the scope destruction, and it will be
        // called during stack unwinding.
        // Instead use bare memory chunk on stack to construct dummy class instance.
        void[__traits(classInstanceSize, C30)] payload =
            typeid(C30).initializer[];
        C30 m = cast(C30)payload.ptr;
        m.__ctor();

        assert(status30 == 1);

        delete m;   // _d_callfinalizer
    }
    catch (Error e) // FinalizeError
    {
        assert(status30 == 0);
        status30--;
    }

    assert(status30 == -1);
}

/* ================================ */

void test31()
{
        string str = x"F0 9D 83 93"; // utf-8 for U+1D0D3

        int count=0;
        dchar tmp;
        foreach(dchar value ; str){
                tmp=value;
                count++;
        }
        assert(count==1);
        assert(tmp==0x01D0D3);
}

/* ================================ */

import std.stdio;

union MyUnion32
{
        int i;
        byte b;
}

void test32()
{
        TypeInfo ti = typeid(MyUnion32*);
        assert(!(ti is null));
        writefln("%s %d %d", ti.toString(), ti.tsize, (MyUnion32*).sizeof);
        assert(ti.tsize==(MyUnion32*).sizeof);
        assert(ti.toString()=="run.module_01.MyUnion32*");
}

/* ================================ */

void test33()
{
        creal a=1.3L+9.7Li;
        assert(a.re == 1.3L);
        assert(a.im == 9.7L);
}

/* ================================ */

void test34()
{
        creal c = 2.7L + 0i;
        assert(c.re==2.7L);
        assert(c.im==0.0L);
}

/* ================================ */

void test35()
{
        try{
                onOutOfMemoryError();
        }catch(OutOfMemoryError e){
                return;
        }
        assert(0);
}

/* ================================ */

void test36()
{
        try{
                onOutOfMemoryError();
        }catch(OutOfMemoryError e){
                return;
        }
        assert(0);
}

/* ================================ */

struct S37{
        int a;
}

const int i37 = 15;

const S37 s1 = { i37+1 };
const S37 s2 = s1;

void test37()
{
        assert(s1.a == 16);
        assert(s2.a == 16);
}

/* ================================ */

class Foo38
{
        enum MyEnum{
                VALUE_A=1,
        }
}

class Bar38
{
        enum MyEnum{
                VALUE_B=2,
        }
}

void test38()
{
        assert(Foo38.MyEnum.VALUE_A==1);
        assert(Bar38.MyEnum.VALUE_B==2);
}

/* ================================ */

void test39()
{
        bool[] bArray;
        int[] iArray;

        bArray[]=false;

        foreach(int c; iArray){
                assert(0);
        }
}

/* ================================ */

bool checked40;

class Parent40{
        int x;

        void test(){
        }

        invariant()
        {
                assert(!checked40);
                checked40=true;
                // even number
                assert((x&1u)==0);
        }
}

class Child40 : Parent40{
}

class GrandChild40 : Child40{
        this(){
                x=5;
        }
}

void test40()
{
        try{
                assert(!checked40);
                GrandChild40 gc = new GrandChild40();
        }catch(Throwable){
                assert(checked40);
                return;
        }
        assert(0);
}

/* ================================ */

int counter41;

class C41{
        this(){
                printf("this: counter41 = %d\n", counter41);
                assert(counter41==1);
                counter41+=2;
        }

        new(size_t size){
                printf("new: size = %d\n", size);
                assert(counter41==0);
                counter41++;
                return malloc(size);
        }
}

void test41()
{
        C41 c;
        assert(counter41==0);
        c = new C41();
        assert(counter41==3);
}

/* ================================ */

struct S42{
        int y;
        void* x;
}

void test42()
{
        size_t t;
        t = S42.y.offsetof;
        assert(t == 0);
        t = S42.x.offsetof;
        assert((t % (void*).sizeof) == 0);
}

/* ================================ */

int main()
{
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    test7();
    test8();
    test9();
    test10();
    test11();
    test12();
    test13();
    test14();
    test15();
    test16();
    test17();
    test18();
    test19();
    test20();
    test21();
    test22();
    test23();
    test24();
    test25();
    test26();
    test27();
    test28();
    test29();
    test30();
    test31();
    test32();
    test33();
    test34();
    test35();
    test36();
    test37();
    test38();
    test39();
    test40();
    test41();
    test42();

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