Update mcs/class/System.Core/System/TimeZoneInfo.cs
[mono.git] / mcs / tests / gtest-variance-5.cs
1 interface ICovariant<out T>
2 {
3         T Foo { get; }
4 }
5
6 interface IContravariant<in T>
7 {
8         int Bar (T bar);
9 }
10
11 interface IBothVariants <out T1, in T2> : ICovariant<T1>, IContravariant<T2>
12 {
13 }
14
15 interface IInvariant <T> : ICovariant<T>, IContravariant<T>
16 {
17 }
18
19 class BothVariants <T1, T2> : IBothVariants <T1, T2>
20 {
21         public BothVariants (T1 foo)
22         {
23                 Foo = foo;
24         }
25
26         public T1 Foo { get; private set; }
27
28         public int Bar (T2 bar)
29         {
30                 return bar.GetHashCode () ^ Foo.GetHashCode ();
31         }
32 }
33
34 class Invariant <T> : IInvariant<T> where T : new()
35 {
36         public T Foo { get { return new T (); } }
37
38         public int Bar (T bar)
39         {
40                 return bar.GetHashCode ();
41         }
42 }
43
44 class A
45 {
46         public virtual string Fruit { get { return "Apple"; } }
47 }
48
49 class B : A
50 {
51         public override string Fruit { get { return "Banana"; } }
52 }
53
54 class C : B
55 {
56         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"; } }
57 }
58
59 public class Test
60 {
61         static int Main ()
62         {
63                 var b = new B ();
64                 var c = new C ();
65
66                 IBothVariants<A, C> both = new BothVariants<B,B> (b);
67
68                 if (both.Bar (c) != (b.GetHashCode () ^ c.GetHashCode ()))
69                         return 1;
70
71                 IInvariant<B> neither = new Invariant<B> ();
72                 ICovariant<A> co = neither;
73                 if (co.Foo.Fruit != "Banana")
74                         return 2;
75
76                 IContravariant<C> contra = neither;
77                 if (contra.Bar (c) != c.GetHashCode ())
78                         return 3;
79
80                 return 0;
81         }
82 }