Skip to content

Commit

Permalink
added failing unit tests for contravariant arguments/covariant return…
Browse files Browse the repository at this point in the history
… types

git-svn-id: http://haxe.googlecode.com/svn/trunk@4671 f16182fa-f095-11de-8f43-4547254af6c6
  • Loading branch information
simon.krajewski@simn.de committed May 19, 2012
1 parent a0f5a76 commit 84215b0
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
26 changes: 25 additions & 1 deletion tests/unit/MyClass.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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) { }
}
41 changes: 40 additions & 1 deletion tests/unit/TestType.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

0 comments on commit 84215b0

Please sign in to comment.