2005-03-30 Geoff Norton <gnorton@customerdna.com>
[mono.git] / mcs / tests / gen-40.cs
index d1ba08b69a9b782ca309e3ea29f21615b94533bd..bcaeef3d0c901ce2108bd5f5cc2e25863ec438d5 100644 (file)
@@ -1,11 +1,22 @@
+public interface INode<T>
+{
+       void Hello (T t);
+}
+
 public class Stack<T>
 {
-       public Stack ()
-       { }
+       public T TheData;
+       public readonly Foo<T> TheFoo;
 
-       public Node GetNode (T t)
+       public Stack (T t)
        {
-               return new Node (t);
+               this.TheData = t;
+               this.TheFoo = new Foo<T> (t);
+       }
+
+       public INode<T> GetNode ()
+       {
+               return new Node (this);
        }
 
        public Foo<T> GetFoo (T t)
@@ -18,13 +29,17 @@ public class Stack<T>
                return new Bar<T> (t);
        }
 
-       public class Node
+       protected class Node : INode<T>
        {
-               public readonly T Data;
+               public readonly Stack<T> Stack;
 
-               public Node (T t)
+               public Node (Stack<T> stack)
+               {
+                       this.Stack = stack;
+               }
+
+               public void Hello (T t)
                {
-                       this.Data = t;
                }
        }
 
@@ -32,6 +47,11 @@ public class Stack<T>
        {
                public readonly T Data;
 
+               public Bar<T> GetBar ()
+               {
+                       return new Bar<T> (Data);
+               }
+
                public Foo (T t)
                {
                        this.Data = t;
@@ -46,6 +66,42 @@ public class Stack<T>
                {
                        this.Data = u;
                }
+
+               public Foo<T> GetFoo (Stack<T> stack)
+               {
+                       return stack.TheFoo;
+               }
+
+               public class Baz<V>
+               {
+                       public readonly V Data;
+
+                       public Foo<T> GetFoo (Stack<T> stack)
+                       {
+                               return new Foo<T> (stack.TheData);
+                       }
+
+                       public Bar<V> GetBar ()
+                       {
+                               return new Bar<V> (Data);
+                       }
+
+                       public Baz (V v)
+                       {
+                               this.Data = v;
+                       }
+               }
+       }
+
+       public void Test ()
+       {
+               Stack<T>.Foo<T> foo1 = GetFoo (TheData);
+               Foo<T> foo2 = GetFoo (TheData);
+
+               Stack<long>.Foo<T> foo3 = new Stack<long>.Foo<T> (TheData);
+               Stack<long>.Foo<float> foo4 = new Stack<long>.Foo<float> (3.14F);
+
+               Foo<double> foo5 = new Foo<double> (3.14);
        }
 }
 
@@ -53,8 +109,8 @@ class X
 {
        static void Main ()
        {
-               Stack<int> stack = new Stack<int> ();
-               Stack<int>.Node node = stack.GetNode (9);
+               Stack<int> stack = new Stack<int> (1);
+               INode<int> node = stack.GetNode ();
                Stack<int>.Foo<int> foo = stack.GetFoo (7);
                Stack<int>.Bar<int> bar = stack.GetBar (8);
        }