소스 검색

[php] fix NativeArray.iterator() for non-sequential keys

Alexander Kuzmenko 6 년 전
부모
커밋
f414e6cc7d
2개의 변경된 파일63개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      std/php/NativeArray.hx
  2. 62 0
      tests/unit/src/unit/TestPhp.hx

+ 1 - 1
std/php/NativeArray.hx

@@ -42,7 +42,7 @@ using php.Global;
 	@:arrayAccess function setByBool(key:Bool, val:Dynamic):Dynamic;
 
 	public inline function iterator()
-		return (this:NativeIndexedArray<Dynamic>).iterator();
+		return Global.array_values(this).iterator();
 
 	public inline function keyValueIterator():NativeArrayKeyValueIterator
 		return new NativeArrayKeyValueIterator(this);

+ 62 - 0
tests/unit/src/unit/TestPhp.hx

@@ -225,6 +225,68 @@ class TestPhp extends Test
 		var enm = Annotation;
 		eq("unit\\Annotation", Syntax.nativeClassName(enm));
 	}
+
+	function testNativeArray() {
+		var keys:Array<Dynamic> = ['hello', 12];
+		var values:Array<Dynamic> = [10, 'world'];
+		var a = new php.NativeArray();
+		for(i in 0...keys.length) {
+			a[keys[i]] = values[i];
+		}
+
+		var actualValues = [for(v in a) v];
+		aeq(values, actualValues);
+
+		var actualKeys:Array<Dynamic> = [];
+		var actualValues:Array<Dynamic> = [];
+		for(k => v in a) {
+			actualKeys.push(k);
+			actualValues.push(v);
+		}
+		aeq(keys, actualKeys);
+		aeq(values, actualValues);
+	}
+
+	function testNativeIndexedArray() {
+		var expected = [10, 20, 30];
+		var a = new NativeIndexedArray<Int>();
+		for(v in expected) {
+			a.push(v);
+		}
+
+		var actual = [for(v in a) v];
+		aeq(expected, actual);
+
+		var indexes = [];
+		var values = [];
+		for(i => v in a) {
+			indexes.push(i);
+			values.push(v);
+		}
+		aeq([for(i in 0...expected.length) i], indexes);
+		aeq(expected, values);
+	}
+
+	function testNativeAssocArray() {
+		var keys = ['one', 'two'];
+		var values = [1, 2];
+		var a = new NativeAssocArray<Int>();
+		for(i in 0...keys.length) {
+			a[keys[i]] = values[i];
+		}
+
+		var actualValues = [for(v in a) v];
+		aeq(values, actualValues);
+
+		var actualKeys = [];
+		var actualValues = [];
+		for(k => v in a) {
+			actualKeys.push(k);
+			actualValues.push(v);
+		}
+		aeq(keys, actualKeys);
+		aeq(values, actualValues);
+	}
 }
 
 private class ClosureDummy {