[xbuild] ToolTask - make error column check a little non-specific.
[mono.git] / mcs / tests / gtest-variance-5.cs
1 // Compiler options: -langversion:future
2
3 interface ICovariant<out T>
4 {
5         T Foo { get; }
6 }
7
8 interface IContravariant<in T>
9 {
10         int Bar (T bar);
11 }
12
13 interface IBothVariants <out T1, in T2> : ICovariant<T1>, IContravariant<T2>
14 {
15 }
16
17 interface IInvariant <T> : ICovariant<T>, IContravariant<T>
18 {
19 }
20
21 class BothVariants <T1, T2> : IBothVariants <T1, T2>
22 {
23         public BothVariants (T1 foo)
24         {
25                 Foo = foo;
26         }
27
28         public T1 Foo { get; private set; }
29
30         public int Bar (T2 bar)
31         {
32                 return bar.GetHashCode () ^ Foo.GetHashCode ();
33         }
34 }
35
36 class Invariant <T> : IInvariant<T> where T : new()
37 {
38         public T Foo { get { return new T (); } }
39
40         public int Bar (T bar)
41         {
42                 return bar.GetHashCode ();
43         }
44 }
45
46 class A
47 {
48         public virtual string Fruit { get { return "Apple"; } }
49 }
50
51 class B : A
52 {
53         public override string Fruit { get { return "Banana"; } }
54 }
55
56 class C : B
57 {
58         public override string Fruit { get { return "Carrot which I know is not a fruit but you better shut up about it before I cut you"; } }
59 }
60
61 public class Test
62 {
63         static int Main ()
64         {
65                 var b = new B ();
66                 var c = new C ();
67
68                 IBothVariants<A, C> both = new BothVariants<B,B> (b);
69
70                 if (both.Bar (c) != (b.GetHashCode () ^ c.GetHashCode ()))
71                         return 1;
72
73                 IInvariant<B> neither = new Invariant<B> ();
74                 ICovariant<A> co = neither;
75                 if (co.Foo.Fruit != "Banana")
76                         return 2;
77
78                 IContravariant<C> contra = neither;
79                 if (contra.Bar (c) != c.GetHashCode ())
80                         return 3;
81
82                 return 0;
83         }
84 }