Browse Source

added failing unit tests for contravariant arguments/covariant return types

Simon Krajewski 13 năm trước cách đây
mục cha
commit
4df671e60f
2 tập tin đã thay đổi với 65 bổ sung2 xóa
  1. 25 1
      tests/unit/MyClass.hx
  2. 40 1
      tests/unit/TestType.hx

+ 25 - 1
tests/unit/MyClass.hx

@@ -60,4 +60,28 @@ class CII2 extends CI2 { public function new() { super(); } }
 
 class PClassBase<T> { public function new() {  } }
 class PClass1<T> extends PClassBase<Float> { public function new() { super(); } }
-class PClass2<T> extends PClassBase<T> { public function new(t:T) { super(); } }
+class PClass2<T> extends PClassBase<T> { public function new(t:T) { super(); } }
+
+interface CovI {
+	public function covariant():Base;
+}
+
+class Cov1 {
+	public function new() { }
+	public function covariant():Base { return new Base(); }
+}
+
+class Cov2 extends Cov1, implements CovI {
+	public function new() { super(); }
+	public override function covariant():Child1 { return new Child1(); }
+}
+
+class Ctrv1 {
+	public function new() { }
+	public function contravariant(arg:Child1) { }
+}
+
+class Ctrv2 extends Ctrv1 {
+	public function new() { super(); }
+	public override function contravariant(arg:Base) { }
+}

+ 40 - 1
tests/unit/TestType.hx

@@ -284,4 +284,43 @@ class TestType extends Test {
 		t(typeError( { var b: { v:Int } = { v: 1.2 };} ));
 		#end
 	}
-}
+	
+	function testCovariantReturn()
+	{
+		#if !macro
+		var b:Base = null;
+		var c1:Child1 = null;
+		
+		var c = new Cov2();
+		typedAs(c.covariant(), c1);
+		t(Std.is(c.covariant(), Child1));
+		t(Std.is(cast(c, Cov1).covariant(), Child1));
+		
+		// base class reference
+		var br:Cov1 = c;
+		typedAs(br.covariant(), b);
+		t(Std.is(br.covariant(), Child1));
+		
+		// interface reference
+		var ir:CovI = c;
+		typedAs(ir.covariant(), b);
+		t(Std.is(ir.covariant(), Child1));
+		
+		// dynamic
+		var dr:Dynamic = c;
+		t(Std.is(dr.covariant(), Child1));		
+		#end
+	}
+	
+	function testContravariantArgs()
+	{
+		#if !macro
+		var b = function(arg:Base):Void { };
+		var c1 = function(arg:Child1):Void { };
+		
+		var c = new Ctrv2();
+		typedAs(c.contravariant, b);
+		typedAs(cast (c, Ctrv1).contravariant, c1);
+		#end
+	}
+}