using System; using System.Collections.Generic; public class ClassA {} public class ClassB {} public class ClassC {} public class GenExc : Exception {} public class NonGen { public static int field = 123; public static void doThrow () { throw new GenExc (); } } public class GenA { public static T[] arr; public static GenA () { arr = new T [3]; } public GenA () {} public GenA newGen () { return new GenA (); } public GenA newGenInt () { return new GenA (); } public int getGenField () { return GenB.field; } public int getNonGenField () { return NonGen.field; } public T[] getArr () { return arr; } public T[] newArr () { return new T [3]; } public GenA[] newSelfArr () { return new GenA [3]; } public GenB>[] newArrNested () { /* GenB>[] arr = null; for (int i = 0; i < 10000000; ++i) arr = new GenB> [3]; */ return new GenB> [3]; } public int hash (T obj) { return obj.GetHashCode (); } public T ident (T obj) { return obj; } public T cast (Object obj) { return (T)obj; } public void except () { try { NonGen.doThrow(); } catch (GenExc) { //Console.WriteLine("exception thrown"); } } } public class GenB { public static int field = 123; } public class GenC { public static int field ; public static GenC () { field = 1234; } } public class StaticTest { static int stat; public StaticTest (int x) { stat = x; } public int getStat () { return stat; } public int getOtherStat () { return StaticTest.stat; } public int getGenCStat () { return GenC.field; } } public class GenADeriv : GenA { public static int otherField = 123; } public class GenABDeriv : GenA> { public T[] newDerivArr () { return new T [3]; } } public class NonGenUser where T : NonGen { public int getNonGenField () { return T.field; } } public class AccessTest { private static int field = 123; public int getOtherField () { return AccessTest.field; } } public class VirtualTest { public virtual T[] newArr () { return new T [3]; } } public class VirtualTestDeriv : VirtualTest { public override T[] newArr () { return new T [4]; } } public class VirtualTestCaller { public T[] doCall (VirtualTest vt) { return vt.newArr (); } } public class MyCons { public T car; public MyCons cdr; public static void printCar (T _car) { Console.WriteLine ("car " + _car.ToString () /* + " cdr " + _cdr.ToString () */); } public MyCons (T _car, MyCons _cdr) { //printCar (_car); car = _car; cdr = _cdr; } public static MyCons returnList (MyCons l) { return l; } public static MyCons returnCdr (MyCons cons) { return returnList(cons.cdr); } } public class MyPair { public N n; public M m; public MyPair (N _n, M _m) { n = _n; m = _m; } } public class MyDict { public MyPair p; public MyDict (N n, M m) { p = new MyPair (n, m); } } public class RGCTXTest { public GenA[] newAArr () { return new GenA [3]; } } public class RGCTXTestSubA : RGCTXTest { public GenB[] newBArr () { return new GenB [3]; } } public class RGCTXTestSubB : RGCTXTest { public GenC[] newCArr () { return new GenC [3]; } } public class RGCTXTestSubASub : RGCTXTestSubA { } public class RGCTXTestSubASubSub : RGCTXTestSubASub { public GenC[] newCArr () { return new GenC [3]; } } public class main { static bool haveError = false; public static void error (string message) { haveError = true; Console.WriteLine (message); } public static void typeCheck (String method, Object obj, Type t) { if (obj.GetType () != t) error ("object from " + method + " should have type " + t.ToString () + " but has type " + obj.GetType ().ToString ()); } public static void work (T obj, bool mustCatch) { EqualityComparer comp = EqualityComparer.Default; GenA ga = new GenA (); typeCheck ("newGen", ga.newGen (), typeof (GenA)); typeCheck ("newGenInt", ga.newGenInt (), typeof (GenA)); typeCheck ("getArr", ga.getArr (), typeof (T[])); typeCheck ("newArr", ga.newArr (), typeof (T[])); typeCheck ("newSelfArr", ga.newSelfArr (), typeof (GenA[])); //ga.newArrNested (); typeCheck ("newArrNested", ga.newArrNested (), typeof (GenB>[])); if (ga.getGenField () != 123) error ("getGenField"); if (ga.getNonGenField () != 123) error ("getNonGenField"); ga.hash (obj); if (!comp.Equals (ga.ident (obj), obj)) error ("ident"); if (!comp.Equals (ga.cast (obj), obj)) error ("cast"); new GenADeriv (); if (mustCatch) { bool didCatch = false; try { ga.except (); } catch (GenExc) { didCatch = true; } if (!didCatch) error ("except"); } else ga.except (); MyDict dtb = new MyDict (obj, new ClassB ()); typeCheck ("MyPair", dtb.p, typeof (MyPair)); GenABDeriv gabd = new GenABDeriv (); typeCheck ("GenABDeriv.newArr", gabd.newArr (), typeof (GenB[])); typeCheck ("GenABDeriv.newDerivArr", gabd.newDerivArr (), typeof (T[])); RGCTXTest rt = new RGCTXTest (); RGCTXTestSubA rtsa = new RGCTXTestSubA (); RGCTXTestSubB rtsb = new RGCTXTestSubB (); RGCTXTestSubASub rtsas = new RGCTXTestSubASub (); RGCTXTestSubASubSub rtsass = new RGCTXTestSubASubSub (); typeCheck ("rtsass.newCArr", rtsass.newCArr (), typeof (GenC[])); typeCheck ("rgsa.newBArr", rtsa.newBArr (), typeof (GenB[])); typeCheck ("rg.newAArr", rt.newAArr (), typeof (GenA[])); typeCheck ("rgsb.newCArr", rtsb.newCArr (), typeof (GenC[])); /* repeat all for each class */ typeCheck ("rtsass.newCArr", rtsass.newCArr (), typeof (GenC[])); typeCheck ("rtsass.newBArr", rtsass.newBArr (), typeof (GenB[])); typeCheck ("rtsass.newAArr", rtsass.newAArr (), typeof (GenA[])); typeCheck ("rtsas.newBArr", rtsas.newBArr (), typeof (GenB[])); typeCheck ("rtsas.newAArr", rtsas.newAArr (), typeof (GenA[])); typeCheck ("rtsa.newBArr", rtsa.newBArr (), typeof (GenB[])); typeCheck ("rtsa.newAArr", rtsa.newAArr (), typeof (GenA[])); typeCheck ("rtsb.newCArr", rtsb.newCArr (), typeof (GenC[])); typeCheck ("rtsb.newAArr", rtsb.newAArr (), typeof (GenA[])); typeCheck ("rt.newAArr", rt.newAArr (), typeof (GenA[])); } public static void virtualTest (VirtualTest vt, int len) { VirtualTestCaller vtc = new VirtualTestCaller (); T[] arr = vtc.doCall (vt); typeCheck ("virtualTest", arr, typeof (T[])); if (arr.Length != len) error ("virtualTest length"); } public static void listTest () { MyCons ls = new MyCons ("abc", null); MyCons cdr = MyCons.returnCdr (ls); if (cdr != null) error ("cdr is not null"); } public static int Main () { work (new ClassA (), false); work (new ClassB (), true); work (new ClassC (), true); work> (new GenA (), true); work (new int[3], true); work (123, true); StaticTest sa = new StaticTest (1234); StaticTest sb = new StaticTest (2345); if (sa.getStat () != 1234) error ("getStat"); if (sb.getStat () != 2345) error ("getStat"); if (sa.getOtherStat () != 0) error ("getOtherStat"); if (sa.getGenCStat () != 1234) error ("getGenCStat A"); if (sb.getGenCStat () != 1234) error ("getGenCStat B"); NonGenUser ngu = new NonGenUser (); if (ngu.getNonGenField () != 123) error ("getNonGenField"); AccessTest ata = new AccessTest (); if (ata.getOtherField () != 123) error ("getOtherField"); VirtualTest vta = new VirtualTest (); VirtualTest vtb = new VirtualTestDeriv (); virtualTest (vta, 3); virtualTest (vtb, 4); listTest (); if (haveError) return 1; return 0; } }