| // 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; |
| } |