// RUNNABLE_PHOBOS_TEST module test; import core.vararg; import std.stdio; import std.string; extern(C) int printf(const char*, ...); /*******************************************/ struct S1 { void* function(void*) fn; } template M1() { S1 s; } void test1() { S1 s2; mixin M1; assert(s.fn == null); } /*******************************************/ enum Qwert { yuiop } int asdfg(Qwert hjkl) { return 1; } int asdfg(uint zxcvb) { return 2; } void test2() { int nm = 2; assert(asdfg(nm) == 2); assert(asdfg(cast(int) nm) == 2); assert(asdfg(3) == 2); assert(asdfg(cast(int) 3) == 2); assert(asdfg(3L) == 2); assert(asdfg(cast(int) 3L) == 2); assert(asdfg(3 + 2) == 2); assert(asdfg(cast(int) (3 + 2)) == 2); assert(asdfg(nm + 2) == 2); assert(asdfg(cast(int) (nm + 2)) == 2); assert(asdfg(3 + nm) == 2); assert(asdfg(cast(int) (3 + nm)) == 2); } /*******************************************/ template Qwert3(string yuiop) { immutable string Qwert3 = cast(string)yuiop; } template Asdfg3(string yuiop) { immutable string Asdfg3 = cast(string)Qwert3!(cast(string)(cast(string)yuiop ~ cast(string)"hjkl")); } void test3() { string zxcvb = Asdfg3!(null); assert(zxcvb == "hjkl"); assert(zxcvb == "hjkl" ~ null); } /*******************************************/ template Qwert4(string yuiop) { immutable string Qwert4 = cast(string)(yuiop ~ "asdfg" ~ yuiop); } void test4() { string hjkl = Qwert4!(null); assert(hjkl == "asdfg"); } /*******************************************/ void test6() { struct Foo { void foo() { } } alias Foo Bar; Bar a; a.foo(); } /*******************************************/ void test7() { struct Foo { alias typeof(this) ThisType; alias typeof(this) ThatType; } assert(is(Foo.ThisType == Foo)); assert(is(Foo.ThatType == Foo)); } /*******************************************/ void test8() { int[] test; test.length = 10; // Show address of array start and its length (10) writefln("%s %s", cast(uint)test.ptr, test.length); test.length = 1; // Show address of array start and its length (1) writefln("%s %s", cast(uint)test.ptr, test.length); test.length = 8; // Show address of array start and its length (8) writefln("%s %s", cast(uint)test.ptr, test.length); test.length = 0; // Shows 0 and 0! writefln("%s %s", cast(uint)test.ptr, test.length); assert(test.length == 0); assert(test.ptr != null); } /*******************************************/ cdouble y9; cdouble f9(cdouble x) { return (y9 = x); } void test9() { f9(1.0+2.0i); assert(y9 == 1.0+2.0i); } /*******************************************/ class CBase10 { this() { } } void foo10( CBase10 l ) { } void test10() { if (1) { foo10( new class() CBase10 { this() { super(); } } ); } return; } /*******************************************/ struct Foo11 { static int func(T)(T a) { assert(a == 1); return 0; } } void test11() { auto a = Foo11.init.func(1); a = Foo11.init.func!(int)(1); a = Foo11.func(1); a = Foo11.func!(int)(1); } /*******************************************/ void test12() { class ExceptioN { } class ExceptioX { } static assert(ExceptioN.mangleof[0 ..$-1] == ExceptioX.mangleof[0 .. $-1]); } /*******************************************/ template check( char ch1, char ch2) { const bool check = ch1 == ch2; } void test13() { const char[] s = "123+456" ; assert(check!( '+', s[3] ) == true); } /*******************************************/ void test14() { static const char[] test=['a','b','c','d']; static assert(test==['a','b','c','d']); static assert(['a','b','c','d']== test); } /*******************************************/ void func15(...) in { writefln("Arguments len = %d\n", _arguments.length); assert(_arguments.length == 2); } body { } void test15() { func15(1, 2); } /*******************************************/ void test17() { void delegate() y = { }; y(); } /*******************************************/ abstract class Pen { int foo(); } class Penfold : Pen { override int foo() { return 1; } } class Pinky : Pen { override int foo() { return 2; } } class Printer { void vprint(Pen obj) { assert(obj.foo() == 1 || obj.foo() == 2); } C print(C)(C obj) { assert(obj.foo() == 1 || obj.foo() == 2); return obj; } } void test18() { Printer p = new Printer; p.print(new Pinky); p.print(new Penfold); with (p) { vprint(new Pinky); vprint(new Penfold); print!(Pinky)(new Pinky); print!(Penfold)(new Penfold); p.print(new Pinky); p.print(new Penfold); print(new Pinky); print(new Penfold); } } /*******************************************/ class A19 { void s() {} } class B19 : A19 { alias A19.s s; static void s(int i) {} override void s() {} } class C19 { void f() { B19.s(0); } } void test19() { } /*******************************************/ class U {} class T : U {} void test20() { T* ptr; T[2] sar; T[] dar; // all of the following should work according to the "Implicit // Conversions" section of the spec tPtr(ptr); tPtr(sar.ptr); tPtr(dar.ptr); tDar(sar); // uPtr(ptr); // T* => U* // uPtr(sar); // T[2] => U* // uPtr(dar); // T[] => U* // uSar(sar); // T[2] => U[2] // uDar(sar); // T[2] => U[] uDar(dar); // T[] => const(U)[] vPtr(ptr); // T* => void* vPtr(sar.ptr); vPtr(dar.ptr); vDar(sar); vDar(dar); // works, but T[] => void[] isn't mentioned in the spec } void tPtr(T*t){} void tDar(T[]t){} void uPtr(U*u){} void uSar(U[2]u){} void uDar(const(U)[]u){} void vPtr(void*v){} void vDar(void[]v){} /*******************************************/ struct Foo21 { int i; } template some_struct_instance(T) { static Foo21 some_struct_instance = { 5, }; } void test21() { alias some_struct_instance!(int) inst; assert(inst.i == 5); } /*******************************************/ struct Foo22(T) {} void test22() { int i; if ((Foo22!(char)).init == (Foo22!(char)).init) i = 1; assert(i == 1); } /*******************************************/ void test23() { auto t=['a','b','c','d']; writeln(typeid(typeof(t))); assert(is(typeof(t) == char[])); const t2=['a','b','c','d','e']; writeln(typeid(typeof(t2))); assert(is(typeof(t2) == const(const(char)[]))); } /*******************************************/ int foo24(int i ...) { return i; } void test24() { assert(foo24(3) == 3); } /*******************************************/ void test25() { ireal x = 4.0Li; ireal y = 4.0Li; ireal z = 4Li; creal c = 4L + 0Li; } /*******************************************/ struct Foo26 { int a; static Foo26 opCall(int i) { Foo26 f; f.a += i; return f; } } void test26() { Foo26 f; f = cast(Foo26)3; assert(f.a == 3); Foo26 g = 3; assert(g.a == 3); } /*******************************************/ struct S27 { int x; void opAssign(int i) { x = i + 1; } } void test27() { S27 s; s = 1; assert(s.x == 2); } /*******************************************/ class C28 { int x; void opAssign(int i) { x = i + 1; } } void test28() { // No longer supported for 2.0 // C28 s = new C28; // s = 1; // assert(s.x == 2); } /*******************************************/ struct S29 { static S29 opCall(int v) { S29 result; result.v = v; return result; } int a; int v; int x,y,z; } int foo29() { auto s = S29(5); return s.v; } void test29() { int i = foo29(); printf("%d\n", i); assert(i == 5); } /*******************************************/ struct S30 { static S30 opCall(int v) { S30 result; void bar() { result.v += 1; } result.v = v; bar(); return result; } int a; int v; int x,y,z; } int foo30() { auto s = S30(5); return s.v; } void test30() { int i = foo30(); printf("%d\n", i); assert(i == 6); } /*******************************************/ struct S31 { static void abc(S31 *r) { r.v += 1; } static S31 opCall(int v) { S31 result; void bar() { abc(&result); } result.v = v; bar(); return result; } int a; int v; int x,y,z; } int foo31() { auto s = S31(5); return s.v; } void test31() { int i = foo31(); printf("%d\n", i); assert(i == 6); } /*******************************************/ struct T32 { int opApply(int delegate(ref int i) dg) { int i; return dg(i); } } struct S32 { static void abc(S32 *r) { r.v += 1; } static S32 opCall(int v) { S32 result; T32 t; result.v = v; foreach (i; t) { result.v += 1; break; } return result; } int a; int v; int x,y,z; } int foo32() { auto s = S32(5); return s.v; } void test32() { int i = foo32(); printf("%d\n", i); assert(i == 6); } /*******************************************/ class Confectionary { this(int sugar) { //if (sugar < 500) // tastiness = 200; //for (int i = 0; i < 10; ++i) // tastiness = 300; //int[] tastinesses_array; //foreach (n; tastinesses_array) // tastiness = n; //int[int] tastinesses_aa; //foreach (n; tastinesses_aa) // tastiness = n; tastiness = 1; } const int tastiness; } void test33() { } /*******************************************/ template a34(string name, T...) { string a34(string name,T t) { string localchar; foreach (a34; T) { writefln(`hello`); localchar ~= a34.mangleof; } return localchar; } } void test34() { writeln(a34!("Adf"[], typeof("adf"),uint)("Adf"[],"adf",1234)); } /*******************************************/ template a35(string name, T...) { int a35(M...)(M m) { return 3; } } void test35() { assert(a35!("adf")() == 3); } /*******************************************/ template a36(AnotherT,string name,T...){ AnotherT a36(M...)(M){ AnotherT localchar; foreach(a;T) { writefln(`hello`); localchar~=a.mangleof; } return cast(AnotherT)localchar; } } void test36() { string b="adf"; uint i=123; char[3] c="Adf"; writeln(a36!(typeof(b),"Adf")()); } /*******************************************/ struct Q37 { Y37 opCast() { return Y37.init; } } struct Y37 { Q37 asdfg() { return Q37.init; } void hjkl() { Q37 zxcvb = asdfg(); // line 13 } } void test37() { } /*******************************************/ class C38 { } const(Object)[] foo38(C38[3] c) @system { const(Object)[] x = c; return x; } void test38() { } /*******************************************/ void test39() { void print(string[] strs) { writeln(strs); assert(format("%s", strs) == `["Matt", "Andrew"]`); } print(["Matt", "Andrew"]); } /*******************************************/ void test40() { class C { Object propName() { return this; } } auto c = new C; with (c.propName) { writeln(toString()); } auto foo = c.propName; } /*******************************************/ void test41() { auto test = new char [2]; int x1, x2, x3; char[] foo1() { x1++; return test; } int foo2() { x2++; return 0; } int foo3() { x3++; return 1; } test [] = 'a'; test = test [0 .. 1]; foo1() [foo2() .. foo3()] = 'b'; assert(x1 == 1); assert(x2 == 1); assert(x3 == 1); //test [0 .. 2] = 'b'; // this line should assert writef ("%s\n", test.ptr [0 .. 2]); } /*******************************************/ void test42() { struct X { int x; } X x; assert(x.x == 0); x = x.init; assert(x.x == 0); } /*******************************************/ struct A43 { static const MY_CONST_STRING = "hello"; void foo() { // This will either print garbage or throw a UTF exception. // But if never_called() is commented out, then it will work. writefln("%s", MY_CONST_STRING); } } void never_called43() { // This can be anything; there just needs to be a reference to // A43.MY_CONST_STRING somewhere. writefln("%s", A43.MY_CONST_STRING); } void test43() { A43 a; a.foo(); } /*******************************************/ class A44 { static const MY_CONST_STRING = "hello"; this() { // This will either print garbage or throw a UTF exception. // But if never_called() is commented out, then it will work. writefln("%s", MY_CONST_STRING); } } void never_called44() { // This can be anything; there just needs to be a reference to // A44.MY_CONST_STRING somewhere. writefln("%s", A44.MY_CONST_STRING); } void test44() { A44 a = new A44(); } /*******************************************/ class C45 { void func(lazy size_t x) { (new C45).func(super.toHash()); } } void test45() { } /*******************************************/ template T46(double v) { double T46 = v; } void test46() { double g = T46!(double.nan) + T46!(-double.nan); } /*******************************************/ void test47() { uint* where = (new uint[](5)).ptr; where[0 .. 5] = 1; assert(where[2] == 1); where[0 .. 0] = 0; assert(where[0] == 1); assert(where[2] == 1); } /*******************************************/ void test48() { Object o = new Object(); printf("%.*s\n", typeof(o).classinfo.name.length, typeof(o).classinfo.name.ptr); printf("%.*s\n", (typeof(o)).classinfo.name.length, (typeof(o)).classinfo.name.ptr); printf("%.*s\n", (Object).classinfo.name.length, (Object).classinfo.name.ptr); } /*******************************************/ void test49() { foo49(); } void foo49() { char[] bar; assert(true, bar ~ "foo"); } /*******************************************/ void test50() { foo50("foo"); } void foo50(string bar) { assert(true, bar ~ "foo"); } /*******************************************/ struct Foo51 { static Foo51 opCall() { return Foo51.init; } private char[] _a; private bool _b; } void test51() { } /*******************************************/ template A52(T ...) { } mixin A52!(["abc2", "def"]); void test52() { } /*******************************************/ enum: int { AF_INET53 = 2, PF_INET53 = AF_INET53, } enum: int { SOCK_STREAM53 = 1, } struct sockaddr_in53 { int sin_family = AF_INET53; } enum AddressFamily53: int { INET = AF_INET53, } enum SocketType53: int { STREAM = SOCK_STREAM53, } class Socket53 { this(AddressFamily53 af, SocketType53 type) { } } void test53() { new Socket53(AddressFamily53.INET, SocketType53.STREAM); } /*******************************************/ void test54() { int[2][] a; a ~= [1,2]; assert(a.length == 1); assert(a[0][0] == 1); assert(a[0][1] == 2); } /*******************************************/ void test55() { float[][] a = new float [][](1, 1); if((a.length != 1) || (a[0].length != 1)){ assert(0); } if (a[0][0] == a[0][0]){ assert(0); } } /*******************************************/ void test58() { struct S { int i; int[4] bar = 4; float[4] abc; } static S a = {i: 1}; static S b; writefln("a.bar: %s, %s", a.bar, a.abc); assert(a.i == 1); assert(a.bar[0] == 4); assert(a.bar[1] == 4); assert(a.bar[2] == 4); assert(a.bar[3] == 4); writefln("b.bar: %s, %s", b.bar, b.abc); assert(b.i == 0); assert(b.bar[0] == 4); assert(b.bar[1] == 4); assert(b.bar[2] == 4); assert(b.bar[3] == 4); } /*******************************************/ void bug59(string s)() { writeln(s); writeln(s.length); } void test59() { bug59!("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234")(); } /*******************************************/ class Foo60(T) { this() { unknown_identifier; } } void test60() { bool foobar = is( Foo60!(int) ); assert(!foobar); } /*******************************************/ void repeat( int n, void delegate() dg ) { printf("n = %d\n", n); if( n&1 ) dg(); if( n/2 ) repeat( n/2, {dg();dg();} ); } void test61() { repeat( 10, {printf("Hello\n");} ); } /*******************************************/ void test62() { Vector62 a; a.set(1,2,24); a = a * 2; writeln(a.x, a.y, a.z); assert(a.x == 2); assert(a.y == 4); assert(a.z == 48); } struct Vector62 { float x,y,z; // constructor void set(float _x, float _y, float _z) { x = _x; y = _y; z = _z; } Vector62 opMul(float s) { Vector62 ret; ret.x = x*s; ret.y = y*s; ret.z = z*s; return ret; } } /*******************************************/ struct Data63 { int x, y; /// To make size > 8 so NRVO is used. /// Program runs correctly with this line commented out: byte filler; } Data63 frob(ref Data63 d) { Data63 ret; ret.y = d.x - d.y; ret.x = d.x + d.y; return ret; } void test63() { Data63 d; d.x = 1; d.y = 2; d = frob(d); writeln(d.x); writeln(d.y); assert(d.x == 3 && d.y == -1); } /*******************************************/ class Foo64 { this() { writefln("Foo64 created"); } ~this() { writefln("Foo64 destroyed"); } } template Mix64() { void init() { ptr = new Foo64; } Foo64 ptr; } class Container64 { this() { init(); } mixin Mix64; } void test64() { auto x = new Container64; assert(!(x.classinfo.flags & 2)); } /*******************************************/ struct Vector65(T, uint dim) { T[dim] data; } T dot65(T, uint dim)(Vector65!(T,dim) a, Vector65!(T,dim) b) { T tmp; for ( int i = 0; i < dim; ++i ) tmp += a.data[i] * b.data[i]; return tmp; } void test65() { Vector65!(double,3u) a,b; auto t = dot65(a,b); } /*******************************************/ void main() { printf("Start\n"); test1(); test2(); test3(); test4(); test6(); test7(); test8(); test9(); test10(); test11(); test12(); test13(); test14(); test15(); 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(); test43(); test44(); test45(); test46(); test47(); test48(); test49(); test50(); test51(); test52(); test53(); test54(); test55(); test58(); test59(); test60(); test61(); test62(); test63(); test64(); test65(); printf("Success\n"); }