Procházet zdrojové kódy

[java] unit tests-related fixes

Caue Waneck před 12 roky
rodič
revize
696c9237e3
4 změnil soubory, kde provedl 224 přidání a 206 odebrání
  1. 31 13
      std/java/_std/EReg.hx
  2. 2 2
      std/java/_std/Type.hx
  3. 86 86
      std/java/internal/Runtime.hx
  4. 105 105
      tests/unit/TestType.hx

+ 31 - 13
std/java/_std/EReg.hx

@@ -56,6 +56,7 @@ class EReg {
 	private var pattern:String;
 	private var matcher:Matcher;
 	private var cur:String;
+	private var sub:Int;
 	private var isGlobal:Bool;
 
 	/**
@@ -116,6 +117,7 @@ class EReg {
 		Updates the internal state accordingly.
 	**/
 	public function match( s : String ) : Bool {
+		sub = 0;
 		cur = s;
 		matcher = matcher.reset(s);
 		return matcher.find();
@@ -140,7 +142,7 @@ class EReg {
 	**/
 	public function matchedLeft() : String
 	{
-		return untyped cur.substring(0, matcher.start());
+		return untyped cur.substring(0, sub + matcher.start());
 	}
 
 	/**
@@ -149,7 +151,7 @@ class EReg {
 	**/
 	public function matchedRight() : String
 	{
-		return untyped cur.substring(matcher.end(), cur.length);
+		return untyped cur.substring(sub + matcher.end(), cur.length);
 	}
 
 	/**
@@ -158,13 +160,17 @@ class EReg {
 	**/
 	public function matchedPos() : { pos : Int, len : Int } {
 		var start = matcher.start();
-		return { pos : start, len : matcher.end() - start };
+		return { pos : sub + start, len : matcher.end() - start };
 	}
 
 	public function matchSub( s : String, pos : Int, len : Int = -1):Bool {
-		return throw "not implemented yet";
-	}	
-	
+		var s2 = (len < 0 ? s.substr(pos) : s.substr(pos, len));
+		sub = pos;
+		matcher = matcher.reset(s2);
+		cur = s;
+		return matcher.find();
+	}
+
 	/**
 		Split a string by using the regular expression to match
 		the separators.
@@ -212,19 +218,31 @@ class EReg {
 		and setting the [g] flag might cause some incorrect behavior on some platforms.
 	**/
 	public function map( s : String, f : EReg -> String ) : String {
+		var offset = 0;
 		var buf = new StringBuf();
-		while( true ) {
-			if( !match(s) )
+		do {
+			if (offset >= s.length)
 				break;
-			buf.add(matchedLeft());
+			else if (!matchSub(s, offset)) {
+				buf.add(s.substr(offset));
+				break;
+			}
+			var p = matchedPos();
+			buf.add(s.substr(offset, p.pos - offset));
 			buf.add(f(this));
-			s = matchedRight();
-		}
-		buf.add(s);
+			if (p.len == 0) {
+				buf.add(s.substr(p.pos, 1));
+				offset = p.pos + 1;
+			}
+			else
+				offset = p.pos + p.len;
+		} while (isGlobal);
+		if (!isGlobal && offset < s.length)
+			buf.add(s.substr(offset));
 		return buf.toString();
 	}
 
 	#if !haxe3
 	public inline function customReplace( s : String, f : EReg -> String ) : String return map(s, f)
-	#end	
+	#end
 }

+ 2 - 2
std/java/_std/Type.hx

@@ -322,7 +322,7 @@
 
 	public static function getEnumConstructs( e : Enum<Dynamic> ) : Array<String> {
 		if (Reflect.hasField(e, "constructs"))
-			return untyped e.constructs;
+			return untyped e.constructs.copy();
 		return getClassFields(cast e);
 	}
 
@@ -414,4 +414,4 @@
 		return ret;
 	}
 
-}
+}

+ 86 - 86
std/java/internal/Runtime.hx

@@ -34,32 +34,32 @@ package java.internal;
 		if (obj == null && !throwErrors) return null;
 		return obj.__hx_getField(field, throwErrors, false, false);
 	}
-	
+
 	public static double getField_f(haxe.lang.IHxObject obj, java.lang.String field, boolean throwErrors)
 	{
 		if (obj == null && !throwErrors) return 0.0;
 		return obj.__hx_getField_f(field, throwErrors, false);
 	}
-	
+
 	public static java.lang.Object setField(haxe.lang.IHxObject obj, java.lang.String field, java.lang.Object value)
 	{
 		return obj.__hx_setField(field, value, false);
 	}
-	
+
 	public static double setField_f(haxe.lang.IHxObject obj, java.lang.String field, double value)
 	{
 		return obj.__hx_setField_f(field, value, false);
 	}
-	
+
 	public static java.lang.Object callField(haxe.lang.IHxObject obj, java.lang.String field, Array<?> args)
 	{
 		return obj.__hx_invokeField(field, args);
 	}
 ')
-@:keep class Runtime 
+@:keep class Runtime
 {
 	public static var undefined:Dynamic = { };
-	
+
 	@:functionBody('
 	return new haxe.lang.Closure(obj, field);
 	')
@@ -67,18 +67,18 @@ package java.internal;
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
 			if (v1 == v2)
 				return true;
 			if (v1 == null || v2 == null)
 				return false;
-			
+
 			if (v1 instanceof java.lang.Number)
 			{
 				if (!(v2 instanceof java.lang.Number))
 					return false;
-				
+
 				java.lang.Number v1c = (java.lang.Number) v1;
 				java.lang.Number v2c = (java.lang.Number) v2;
 				if (v1 instanceof java.lang.Long || v2 instanceof java.lang.Long)
@@ -87,19 +87,19 @@ package java.internal;
 			} else if (v1 instanceof java.lang.String || v1 instanceof haxe.lang.IEquatable) { //TODO see what happens with Boolean cases
 				return v1.equals(v2);
 			}
-			
+
 			return false;
 	')
 	public static function eq(v1:Dynamic, v2:Dynamic):Bool
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 		if (v1 == v2)
 			return true;
-		
-		if (v1 instanceof java.lang.String || v1 instanceof haxe.lang.IEquatable) 
+
+		if (v1 instanceof java.lang.String || v1 instanceof haxe.lang.IEquatable)
 		{
 			return v1 != null && v1.equals(v2);
 		} else {
@@ -110,7 +110,7 @@ package java.internal;
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 		return v1 == v2 || (v1 != null && v1.equals(v2));
 	')
@@ -118,7 +118,7 @@ package java.internal;
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 		return (obj == null) ? 0.0 : ((java.lang.Number) obj).doubleValue();
 	')
@@ -126,7 +126,7 @@ package java.internal;
 	{
 		return 0.0;
 	}
-	
+
 	@:functionBody('
 		return (obj == null) ? false : ((java.lang.Boolean) obj).booleanValue();
 	')
@@ -134,7 +134,7 @@ package java.internal;
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 		return (obj == null) ? 0 : ((java.lang.Number) obj).intValue();
 	')
@@ -142,7 +142,7 @@ package java.internal;
 	{
 		return 0;
 	}
-	
+
 	@:functionBody('
 		if (obj != null && obj instanceof java.lang.Number)
 		{
@@ -155,7 +155,7 @@ package java.internal;
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 		if (obj != null && obj instanceof java.lang.Number)
 		{
@@ -169,21 +169,21 @@ package java.internal;
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 		java.lang.Class cl = null;
 		if (o instanceof java.lang.Class)
 		{
 			if (o == java.lang.String.class)
 				return field.equals("fromCharCode");
-			
+
 			cl = (java.lang.Class) o;
 		} else if (o instanceof java.lang.String) {
 			return haxe.lang.StringRefl.handleGetField( (java.lang.String) o, field, false) != null;
 		} else {
 			cl = o.getClass();
 		}
-		
+
 		try
 		{
 			java.lang.reflect.Field f = cl.getField(field);
@@ -207,16 +207,16 @@ package java.internal;
 	{
 		return false;
 	}
-	
+
 	@:functionBody('
 			if (v1 == v2)
 				return 0;
-			
-			if (v1 instanceof java.lang.Number)
+
+			if (v1 instanceof java.lang.Number || v2 instanceof java.lang.Number)
 			{
 				java.lang.Number v1c = (java.lang.Number) v1;
 				java.lang.Number v2c = (java.lang.Number) v2;
-				
+
 				if (v1 instanceof java.lang.Long || v2 instanceof java.lang.Long)
 				{
 					long l1 = (v1 == null) ? 0L : v1c.longValue();
@@ -225,7 +225,7 @@ package java.internal;
 				} else {
 					double d1 = (v1 == null) ? 0.0 : v1c.doubleValue();
 					double d2 = (v2 == null) ? 0.0 : v2c.doubleValue();
-					
+
 					return (int) (d1 - d2);
 				}
 			}
@@ -236,37 +236,37 @@ package java.internal;
 	{
 		return 0;
 	}
-	
+
 	@:functionBody('
 			if (v1 instanceof java.lang.String || v2 instanceof java.lang.String)
 				return (v1 + "") + (v2 + "");
-			
+
 			if (v1 instanceof java.lang.Number || v2 instanceof java.lang.Number)
 			{
 				java.lang.Number v1c = (java.lang.Number) v1;
 				java.lang.Number v2c = (java.lang.Number) v2;
-				
+
 				double d1 = (v1 == null) ? 0.0 : v1c.doubleValue();
 				double d2 = (v2 == null) ? 0.0 : v2c.doubleValue();
-				
+
 				return d1 + d2;
 			}
-			
+
 			throw new java.lang.IllegalArgumentException("Cannot dynamically add " + v1 + " and " + v2);
 	')
 	public static function plus(v1:Dynamic, v2:Dynamic):Dynamic
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
-	
+
 	if (obj == null)
-		if (throwErrors) 
+		if (throwErrors)
 			throw new java.lang.NullPointerException("Cannot access field \'" + field + "\' of null.");
 		else
 			return null;
-	
+
 	java.lang.Class cl = null;
 	try
 	{
@@ -274,7 +274,7 @@ package java.internal;
 		{
 			if (obj == java.lang.String.class && field.equals("fromCharCode"))
 				return new haxe.lang.Closure(haxe.lang.StringExt.class, field);
-			
+
 			cl = (java.lang.Class) obj;
 			obj = null;
 		} else if (obj instanceof java.lang.String) {
@@ -282,7 +282,7 @@ package java.internal;
 		} else {
 			cl = obj.getClass();
 		}
-		
+
 		java.lang.reflect.Field f = cl.getField(field);
 		f.setAccessible(true);
 		return f.get(obj);
@@ -300,21 +300,21 @@ package java.internal;
 			}
 		} catch (Throwable t2)
 		{
-			
+
 		}
-		
+
 		if (throwErrors)
 			throw HaxeException.wrap(t);
-		
+
 		return null;
 	}
-	
+
 	')
 	public static function slowGetField(obj:Dynamic, field:String, throwErrors:Bool):Dynamic
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
 		java.lang.Class cl = null;
 		if (obj instanceof java.lang.Class)
@@ -324,11 +324,11 @@ package java.internal;
 		} else {
 			cl = obj.getClass();
 		}
-		
+
 		try {
 			java.lang.reflect.Field f = cl.getField(field);
 			f.setAccessible(true);
-			
+
 			//FIXME we must evaluate if field to be set receives either int or double
 			if (isInt(value))
 			{
@@ -349,14 +349,14 @@ package java.internal;
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
 		java.lang.Class cl = null;
 		if (obj instanceof java.lang.Class)
 		{
 			if (obj == java.lang.String.class && field.equals("fromCharCode"))
 				return haxe.lang.StringExt.fromCharCode(toInt(args.__get(0)));
-			
+
 			cl = (java.lang.Class) obj;
 			obj = null;
 		} else if (obj instanceof java.lang.String) {
@@ -364,13 +364,13 @@ package java.internal;
 		} else {
 			cl = obj.getClass();
 		}
-		
+
 		if (args == null) args = new Array();
-	
+
 		int len = args.length;
 		java.lang.Class[] cls = new java.lang.Class[len];
 		java.lang.Object[] objs = new java.lang.Object[len];
-		
+
 		java.lang.reflect.Method[] ms = cl.getDeclaredMethods();
 		int msl = ms.length;
 		int realMsl = 0;
@@ -386,25 +386,25 @@ package java.internal;
 				realMsl++;
 			}
 		}
-		
+
 		boolean hasNumber = false;
-		
+
 		for (int i = 0; i < len; i++)
 		{
 			Object o = args.__get(i);
 			objs[i]= o;
 			cls[i] = o.getClass();
 			boolean isNum = false;
-			
+
 			if (o instanceof java.lang.Number)
 			{
 				cls[i] = java.lang.Number.class;
 				isNum = hasNumber = true;
 			}
-			
+
 			msl = realMsl;
 			realMsl = 0;
-			
+
 			for (int j = 0; j < msl; j++)
 			{
 				java.lang.Class[] allcls = ms[j].getParameterTypes();
@@ -421,17 +421,17 @@ package java.internal;
 					}
 				}
 			}
-			
+
 		}
-		
+
 		java.lang.reflect.Method found;
 		if (ms.length == 0 || (found = ms[0]) == null)
 			throw haxe.lang.HaxeException.wrap("No compatible method found for: " + field);
-		
+
 		if (hasNumber)
 		{
 			java.lang.Class[] allcls = found.getParameterTypes();
-			
+
 			for (int i = 0; i < len; i++)
 			{
 				java.lang.Object o = objs[i];
@@ -465,18 +465,18 @@ package java.internal;
 				}
 			}
 		}
-		
+
 		try {
 			found.setAccessible(true);
 			return found.invoke(obj, objs);
-		} 
-		
-		catch (java.lang.reflect.InvocationTargetException e) 
+		}
+
+		catch (java.lang.reflect.InvocationTargetException e)
 		{
 			throw haxe.lang.HaxeException.wrap(e.getCause());
 		}
-		
-		catch (Throwable t) 
+
+		catch (Throwable t)
 		{
 			throw haxe.lang.HaxeException.wrap(t);
 		}
@@ -485,77 +485,77 @@ package java.internal;
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
 		if (obj instanceof haxe.lang.IHxObject)
 		{
 			return ((haxe.lang.IHxObject) obj).__hx_invokeField(field, args);
 		}
-		
+
 		return slowCallField(obj, field, args);
 	')
 	public static function callField(obj:Dynamic, field:String, args:Array<Dynamic>):Dynamic
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
-	
+
 		if (obj instanceof haxe.lang.IHxObject)
 			return ((haxe.lang.IHxObject) obj).__hx_getField(field, throwErrors, false, false);
-		
+
 		return slowGetField(obj, field, throwErrors);
-	
+
 	')
 	public static function getField(obj:Dynamic, field:String, throwErrors:Bool):Dynamic
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
-	
+
 		if (obj instanceof haxe.lang.IHxObject)
 			return ((haxe.lang.IHxObject) obj).__hx_getField_f(field, throwErrors, false);
-		
+
 		return toDouble(slowGetField(obj, field, throwErrors));
-	
+
 	')
 	public static function getField_f(obj:Dynamic, field:String, throwErrors:Bool):Float
 	{
 		return 0.0;
 	}
-	
+
 	@:functionBody('
-	
+
 		if (obj instanceof haxe.lang.IHxObject)
 			return ((haxe.lang.IHxObject) obj).__hx_setField(field, value, false);
-		
+
 		return slowSetField(obj, field, value);
-	
+
 	')
 	public static function setField(obj:Dynamic, field:String, value:Dynamic):Dynamic
 	{
 		return null;
 	}
-	
+
 	@:functionBody('
-	
+
 		if (obj instanceof haxe.lang.IHxObject)
 			return ((haxe.lang.IHxObject) obj).__hx_setField_f(field, value, false);
-		
+
 		return toDouble(slowSetField(obj, field, value));
-	
+
 	')
 	public static function setField_f(obj:Dynamic, field:String, value:Float):Float
 	{
 		return 0.0;
 	}
-	
+
 	public static function toString(obj:Dynamic):String
 	{
 		if (obj == null)
 			return null;
-		
+
 		if (isInt(obj))
 			return (cast(obj, Int)) + "";
 		return untyped obj.toString();
@@ -565,4 +565,4 @@ package java.internal;
 @:keep @:native("haxe.lang.EmptyObject") private enum EmptyObject
 {
 	EMPTY;
-}
+}

+ 105 - 105
tests/unit/TestType.hx

@@ -11,13 +11,13 @@ class TestType extends Test {
 		return s;
 		#end
 	}
-	
+
 	@:macro static public function typedAs(actual:haxe.macro.Expr, expected:haxe.macro.Expr) {
 		var tExpected = haxe.macro.Context.typeof(expected);
 		var tActual = haxe.macro.Context.typeof(actual);
 		return haxe.macro.Context.parse("{Test.count++; eq('" +Std.string(tActual) + "', '" +Std.string(tExpected) + "');}", haxe.macro.Context.currentPos());
 	}
-	
+
 	@:macro static public function typeError(e:haxe.macro.Expr) {
 		var result = try {
 			haxe.macro.Context.typeof(e);
@@ -25,7 +25,7 @@ class TestType extends Test {
 		} catch (e:Dynamic) "true";
 		return { pos: haxe.macro.Context.currentPos(), expr: haxe.macro.Expr.ExprDef.EConst(haxe.macro.Expr.Constant.CIdent(result)) };
 	}
-	
+
 	@:macro static public function complete(e:String) : haxe.macro.Expr.ExprOf<String> {
 		var str = new String(untyped haxe.macro.Context.load("display", 1)(e.__s));
 		return { expr : EConst(CString(str)), pos : haxe.macro.Context.currentPos() };
@@ -50,22 +50,22 @@ class TestType extends Test {
 		var fl = Type.getInstanceFields(unit.MySubClass);
 		fl.sort(Reflect.compare);
 		eq( fl.join("|"), fields.join("|") );
-		
+
 		// AS3 generator will create native properties
 		#if !as3
-		
+
 		// x should not be listed since it's not a variable
 		var fl = Type.getInstanceFields(VarProps);
 		var fields = ["get_x","get_y","set_x","set_y","set_z","y","z"];
 		fl.sort(Reflect.compare);
 		eq( fl.join("|"), fields.join("|"));
-		
+
 		// same for statics
 		var fl = Type.getClassFields(VarProps);
 		var fields = ["SY", "get_SX", "get_SY", "set_SX", "set_SY"];
 		fl.sort(Reflect.compare);
 		eq( fl.join("|"), fields.join("|"));
-		
+
 		#end
 	}
 
@@ -85,46 +85,46 @@ class TestType extends Test {
 		f( Type.enumEq(D(A),D(B)) );
 
 	}
-	
+
 	function testPossibleBug() {
 		var c = Type.getEnumConstructs(MyEnum);
 		var old = c[0];
 		c[0] = "modified";
 		eq( Type.getEnumConstructs(MyEnum)[0], old );
-		
+
 		var i = Type.getInstanceFields(TestType);
 		var old = i[0];
 		i[0] = "modified";
 		eq( Type.getInstanceFields(TestType)[0], old );
-		
+
 		var i = Type.getClassFields(TestType);
 		var old = i[0];
 		i[0] = "modified";
 		eq( Type.getClassFields(TestType)[0], old );
-		
+
 		// we don't check for Type.enumParameters modifications :
 		// we want it to be as fast as possible even if it references
 		// the current enum - since it's not cachable
 	}
-	
+
 	function testAllField() {
 		eq( Type.allEnums(MyEnum).join("#"), "A#B" );
 	}
-	
+
 	function testWiderVisibility() {
 		var c = new MyClass.MyChild1();
 		eq(12, c.a());
-		
+
 		// TODO: this is also a problem
 		#if !as3
 		var mc2 = new MyChild2();
 		eq(21, mc2.test1(new MyChild1()));
 		#end
 	}
-	
+
 	function testUnifyMin() {
 		// array
-		
+
 		var ti1:Array<I1>;
 		var tbase:Array<Base>;
 		var tpbase:Array<PClassBase<Float>>;
@@ -137,7 +137,7 @@ class TestType extends Test {
 		#end
 		var tchild1:Array<Child1>;
 		var ts:Array<{s:String}>;
-		
+
 		typedAs([new Child1(), new Child2()], tbase);
 		typedAs([new Child1(), new Child2(), new Base()], tbase);
 		typedAs([new Child1(), new Child2_1(), new Base()], tbase);
@@ -147,9 +147,9 @@ class TestType extends Test {
 		typedAs([new ClassI2(), new Child2()], ti1);
 		typedAs([new CI1(), new CI2()], tbase);
 		typedAs([new CII1(), new CII2()], tbase);
-		
+
 		typedAs([new PClass1(), new PClass2(2.0)], tpbase);
-		
+
 		typedAs([null, false], tnullbool);
 		typedAs([false, null], tnullbool);
 		typedAs([null, new Base()], tnullbase);
@@ -162,7 +162,7 @@ class TestType extends Test {
 		typedAs([new Unrelated(), { s:"foo" } ], ts);
 
 		// if
-		
+
 		var tbase:Base;
 		var ti1:I1;
 		#if (flash9 || cpp || java || cs)
@@ -171,7 +171,7 @@ class TestType extends Test {
 		var tnullbool:Bool;
 		#end
 		var ts: { s:String };
-		
+
 		typedAs(if (false) new Child1(); else new Child2(), tbase);
 		typedAs(
 			if (false) new Child1();
@@ -183,26 +183,26 @@ class TestType extends Test {
 			else new Base(), tbase);
 		typedAs(if (false) new Child2(); else new Unrelated(), ti1);
 		typedAs(if (false) new Child2_1(); else new Unrelated(), ti1);
-		
+
 		typedAs(if (false) null; else false, tnullbool);
 		typedAs(if (false) true; else null, tnullbool);
 		typedAs(if (false) new Unrelated(); else {s:"foo"}, ts);
 		typedAs(if (false) { s:"foo" }; else new Unrelated(), ts);
-		
+
 		//switch
-		
+
 		typedAs(switch(false) { case true: new Child1(); case false: new Child2(); }, tbase);
 		typedAs(switch(1) { case 0: new Child1(); case 1: new Child2_1(); default: new Base(); }, tbase);
 		typedAs(switch(false) { case true: new Child2(); case false: new Unrelated(); }, ti1);
 		typedAs(switch(false) { case true: new Child2_1(); case false: new Unrelated(); }, ti1);
-		
+
 		typedAs(switch(false) { case true: null; default: false; }, tnullbool);
 		typedAs(switch(false) { case true: true; default: null; }, tnullbool);
 		typedAs(switch(false) { case true: new Unrelated(); default: {s:"foo"}; }, ts);
 		typedAs(switch(false) { case true: { s:"foo" }; default: new Unrelated(); }, ts);
-		
+
 		typedAs([ { x : new Child1() }, { x : new Child2() } ], [{ x: new Base() }]);
-		
+
 		#if flash9
 		typedAs(function() { return 0; var v:UInt = 0; return v; } (), 1);
 		#end
@@ -221,85 +221,85 @@ class TestType extends Test {
 		var tstring = function(b:String) return 0;
 
 		// all missing
-		
+
 		typedAs(callback(func), func);
 		typedAs(callback(func, _), func);
 		typedAs(callback(func, _, _), func);
 		typedAs(callback(func, _, _, _), func);
 
 		// all given
-		
+
 		typedAs(callback(func, 22, "2", 13), tvoid);
 
 		// last missing
-		
+
 		typedAs(callback(func, 22, "2"), tfloat);
 		typedAs(callback(func, 22, "2", _), tfloat);
-		
+
 		// first given
-		
+
 		typedAs(callback(func, 22), tstringfloat);
 		typedAs(callback(func, 22, _), tstringfloat);
 		typedAs(callback(func, 22, _, _), tstringfloat);
-		
+
 		// mixed
-		
+
 		typedAs(callback(func, _, _, 12), tintstring);
 		typedAs(callback(func, _, "22", _), tintfloat);
 		typedAs(callback(func, _, "22", 12), tint);
 		typedAs(callback(func, 12, _, 12), tstring);
-		
+
 		// values
-		
+
 		eq(1, callback(func)(1, "2", 3));
 		eq(2, callback(func, 2)("2", 3));
 		eq(2, callback(func, 2, "3")(3));
 		eq(2, callback(func, 2, "3", 4)());
-		
+
 		eq(1, callback(func, _, "2", 3)(1));
 		eq(1, callback(func, _, "2")(1, 3));
 		eq(1, callback(func, _)(1, "2", 3));
-		
+
 		eq(1, callback(func, _, "2", _)(1, 2));
-		
+
 		eq(1, callback(callback(func), _, "2", 3)(1));
 		eq(1, callback(callback(func, 1), "2", 3)());
 		eq(1, callback(callback(func, 1, _), "2")(3));
 		eq(1, callback(callback(func, _, "2"), 1)(3));
-		
+
 		var a = 5;
 		var b = "foo";
 		var cb = callback(func, a);
 		a = 6;
 		func = function(a,b,c):Int return throw "error";
 		eq(5, cb(b, 0));
-		
+
 		var optfunc = function(a:Int, b:Int, ?c:Int = 2) return a + b + c;
 		eq(6, callback(optfunc, 1)(3));
 		eq(6, callback(optfunc, 1, 3)());
-		
+
 		eq(7, callback(optfunc, _, _, _)(1, 2, 4));
 		eq(7, callback(optfunc, _, 2, _)(1, 4));
-		
+
 		var foo = function ( x : Int, ?p : haxe.PosInfos ) { return "foo" + x; }
 		var f : Void -> String = callback(foo, 0);
  		eq("foo0", f());
 
 		// TODO: this fails on flash 9
 		var foo = function(bar = 2) { return bar; };
-		#if (flash9 || java) //this fails too on Java, so it may be some problem with typing?
+		#if (flash9)
 		t(typeError(callback(foo, _)));
 		#else
 		var l = callback(foo, _);
 		eq(2, l());
 		#end
-		
+
 		// note that this does not
 		var foo = function(bar:Null<Int> = 2) { return bar; };
 		var l = callback(foo, _);
 		eq(2, l());
 	}
-	
+
 	function testConstantAnonCovariance()
 	{
 		var func = function (str:String, ?str1: { x:Float, y:Int }, ?str2: { w:Float, h:Int } ) { };
@@ -322,48 +322,48 @@ class TestType extends Test {
 		f(typeError(func("foo", { x:1.2, y:2 } )));
 		f(typeError(func("foo", { w:1.2, h:2 } )));
 	}
-	
+
 	function testCovariantReturn()
 	{
 		var b:Base = null;
 		var c1:Child1 = null;
 		var c2_1:Child2_1 = 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));
-		
+
 		// interface covariance
 		var c3 = new Cov3();
 		typedAs(c3.covariant(), c2_1);
 		t(Std.is(c3.covariant(), Child2_1));
 	}
-	
+
 	function testContravariantArgs()
 	{
 		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);
 	}
-	
+
 	function testInitFields()
 	{
 		var c = new InitBase();
@@ -371,22 +371,22 @@ class TestType extends Test {
 		eq(c.s, "foo");
 		eq(c.b, true);
 		eq(c.t, String);
-		
+
 		var c = new InitChild();
 		eq(c.i, 2);
 		eq(c.s, "foo");
 		eq(c.b, true);
 		eq(c.t, String);
-		
+
 		var c = new InitChildWithCtor(null);
 		eq(c.i, 2);
 		eq(c.s, "foo");
 		eq(c.b, true);
 		eq(c.t, String);
-		
+
 		var c = Type.createInstance(InitWithoutCtor, []);
 		eq(c.i, 2);
-		
+
 		var c = new InitProperties();
 		eq(c.accNull, 3);
 		eq(c.accDefault, 3);
@@ -395,7 +395,7 @@ class TestType extends Test {
 		eq(c.accDynamic, 3);
 		exc(function() c.accFunc = 4);
 	}
-	
+
 	function testReturnFlow()
 	{
 		var l = function():String
@@ -408,7 +408,7 @@ class TestType extends Test {
 		}
 		eq(l(), "foo");
 	}
-	
+
 	function testOptionalParamsSkip() {
 		function foo( a : MyEnum, ?b : Bool, ?c : MyEnum ) {
 			return "";
@@ -418,7 +418,7 @@ class TestType extends Test {
 		typedAs(foo(A, A), "");
 		typeError(foo(A, A, false));
 	}
-	
+
 	function testParamConstraints()
 	{
 		var pcc = new ParamConstraintsClass();
@@ -426,63 +426,63 @@ class TestType extends Test {
 		var c1 = new Child1();
 		var u = new Unrelated();
 		var ci1 = new CI1();
-		
+
 		eq(ParamConstraintsClass.staticSingle(b), b);
 		eq(ParamConstraintsClass.staticSingle(c1), c1);
 		// TODO: these should fail (param is constrained to Base)
 		//ParamConstraintsClass.staticSingle(u);
 		//ParamConstraintsClass.staticSingle(1);
 		//ParamConstraintsClass.staticSingle("foo");
-		
+
 		eq(pcc.memberSingle(b), b);
 		eq(pcc.memberSingle(c1), c1);
 		//typeError(pcc.memberSingle(u));
-		
+
 		eq(pcc.memberMultiple(ci1), ci1);
 		//typeError(pcc.memberMultiple(b));
 		//typeError(pcc.memberMultiple(c1));
-		
+
 		var l = new List();
 		l.push(ci1);
 		var lmono = new List();
 		eq(pcc.memberComplex(ci1, l), l);
 		eq(pcc.memberComplex(ci1, lmono), lmono);
 		//typeError(pcc.memberComplex(ci1, [ci1]));
-		
+
 		eq(pcc.memberBasic("foo", ["bar"]), "bar");
-		
+
 		eq(pcc.memberAnon( { x : 1, y : 3. } ), 4);
 		//typeError(pcc.memberAnon( { x : 1 } ));
 		//typeError(pcc.memberAnon( { y : 3. } ));
-		
+
 		#if !(java || cs)
 		pcc.memberOverload("foo", "bar");
 		#end
 		// TODO: this should not fail (overload accepts)
 		//pcc.memberOverload(1, [2]);
 		//t(typeError(pcc.memberOverload(1, ["foo"])));
-		
+
 		var pcc2 = new ParamConstraintsClass2();
 		pcc2.check([1]);
 		//typeError(pcc2.check(["foo"]));
-		
+
 		var pcc2 = new ParamConstraintsClass2();
 		pcc2.bind("foo");
 		//typeError(pcc2.check([1]));
 		pcc2.check(["foo"]);
-		
+
 		var pcc2 = new ParamConstraintsClass2<String>();
 		//t(typeError(pcc2.check([1])));
 		pcc2.check(["foo"]);
 	}
-	
+
 	function testUsing()
 	{
 		eq(UsingChild1.test(), "FOOFOOFOO");
 		eq(UsingChild2.test(), "FOO");
 		eq(UsingUnrelated.test(), "FOOFOO");
 	}
-	
+
 	function testInlineInit()
 	{
 		eq(InitBase.si, 2);
@@ -491,21 +491,21 @@ class TestType extends Test {
 		eq(InitBase.st, String);
 		eq(InitBase.sinline, 60000.);
 	}
-	
+
 	function testInline()
 	{
 		typedAs(inlineTest1([1]), var void:Void);
 		typedAs(inlineTest2([1]), var void:Void);
 	}
-	
+
 	inline function inlineTest1<T>(map:Array<T>) {
 		map[0];
 	}
-	
+
 	inline function inlineTest2(map:Array<Dynamic>) {
 		map[0];
 	}
-	
+
 	public function testMacroRest() {
 		#if !macro
 		var r = MyMacro.MyRestMacro.testRest1(1, 2, 3);
@@ -513,29 +513,29 @@ class TestType extends Test {
 		eq(r[0], 1);
 		eq(r[1], 2);
 		eq(r[2], 3);
-		
+
 		var r : Array<Dynamic> = MyMacro.MyRestMacro.testRest1(1, [2, 3]);
 		eq(r.length, 2);
 		eq(r[0], 1);
 		eq(r[1][0], 2);
 		eq(r[1][1], 3);
-		
+
 		var r = MyMacro.MyRestMacro.testRest1(1);
 		eq(r.length, 1);
 		eq(r[0], 1);
-		
+
 		var r = MyMacro.MyRestMacro.testRest2(1, 2, 3, 4);
 		eq(r.length, 4);
 		eq(r[0], 1);
 		eq(r[1], 2);
 		eq(r[2], 3);
 		eq(r[3], 4);
-		
+
 		var r = MyMacro.MyRestMacro.testRest2(1, 2);
 		eq(r.length, 2);
 		eq(r[0], 1);
 		eq(r[1], 2);
-		
+
 		var r : Array<Dynamic> = MyMacro.MyRestMacro.testRest2(1, 2, [3]);
 		eq(r.length, 3);
 		eq(r[0], 1);
@@ -543,91 +543,91 @@ class TestType extends Test {
 		eq(r[2][0], 3);
 		#end
 	}
-	
+
 	public function testGenericFunction() {
 		gf1(2);
 		gf1("foo");
 		gf1(true);
-		
+
 		#if !flash8
 		// no support for flash8
 		gf1(new haxe.Template("foo"));
 		#end
-		
+
 		gf1(new haxe.FastList<Int>());
 		hsf(TestType, "gf1_Int");
 		hsf(TestType, "gf1_String");
 		hsf(TestType, "gf1_Bool");
-		
+
 		#if !flash8
 		hsf(TestType, "gf1_haxe_Template");
 		#end
-		
+
 		hsf(TestType, #if (flash9 || cpp) "gf1_haxe_FastList_Int" #else "gf1_haxe_FastList" #end);
 		t(typeError(gf1(null))); // monos don't work
 		t(typeError(gf1( { foo:1 } ))); // structures don't work
-		
+
 		eq("foo[1,2]", gf2("foo", [1, 2]));
 		eq("foo[[1,2]]", gf2("foo", [[1, 2]]));
 		hsf(TestType, "gf2_String_Int");
 		hsf(TestType, "gf2_String_Array");
-		
+
 		var a = gf3("foo", ["bar", "baz"]);
 		eq(a[0], "bar");
 		eq(a[1], "baz");
 		eq(a[2], "foo");
 		hsf(TestType, "gf3_String_Array");
-		
+
 		#if !flash8
 		var t = new haxe.Template("foo");
 		var ta = gf3(t, [])[0];
 		f(t == ta);
 		hsf(TestType, "gf3_haxe_Template_Array");
 		#end
-		
+
 		eq(overloadFake(1), 1);
 		eq(overloadFake("bar"), "barfoo");
 	}
-	
+
 	@:generic static function gf1<T>(a:T) {
 		return a;
 	}
-	
+
 	@:generic static function gf2<A,B>(a:A, b:Array<B>) {
 		return Std.string(a) + Std.string(b);
 	}
-	
+
 	@:generic static function gf3 < A, B:Array<A> > (a:A, b:B) {
 		var clone = new A("foo");
 		b.push(clone);
 		return b;
 	}
-	
+
 	@:generic static function overloadFake<A>(a:A) {
 		return a;
 	}
-	
+
 	static function overloadFake_String(a:String) {
 		return a + "foo";
 	}
-	
+
 	function testCompletion() {
 		#if !macro
 		var s = { foo: 1 };
 		eq(complete("s.|"), "foo:Int");
 		eq(complete("var x : haxe.|"), "path(haxe)");
 		eq(complete("var x : haxe.macro.Expr.|"), "path(haxe.macro:Expr)");
-		
+
 		// could be improved by listing sub types
 		eq(complete("haxe.macro.Expr.|"), "error(haxe.macro.Expr is not a value)");
-		
+
 		// know issue : the expr optimization will prevent inferring the array content
 		eq(complete('{
 			var a = [];
 			a.push("");
 			a[0].|
 		}'),"Unknown<0>");
-		
+
 		// could be improved : expr optimization assume that variable not in scope is a member
 		// so it will eliminate the assignement that would have forced it into the local context
 		// that would be useful when you want to write some code and add the member variable afterwards
@@ -635,17 +635,17 @@ class TestType extends Test {
 			unknownVar = "";
 			unknownVar.|
 		}'),"path(unknownVar)");
-		
-		
+
+
 		for (k in [s].iterator()) {
 			eq(complete("k.|"), "foo:Int");
 		}
-		
+
 		var f = function():Iterator<{foo:Int}> {
 			return [s].iterator();
 		};
 		eq(complete("for (k in f()) k.|"), "foo:Int");
 		#end
 	}
-	
+
 }