diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj
index a4157466d..7568e227f 100644
--- a/CrossPlatformModules.csproj
+++ b/CrossPlatformModules.csproj
@@ -89,6 +89,7 @@
modal-page.xml
+
@@ -726,8 +727,8 @@
-
-
+
+
@@ -2089,9 +2090,7 @@
-
- PreserveNewest
-
+
@@ -2154,7 +2153,7 @@
False
-
+
\ No newline at end of file
diff --git a/apps/tests/testRunner.ts b/apps/tests/testRunner.ts
index c5f896464..4d9da1006 100644
--- a/apps/tests/testRunner.ts
+++ b/apps/tests/testRunner.ts
@@ -25,6 +25,7 @@ export function isRunningOnEmulator(): boolean {
}
export var allTests = {};
+allTests["PROXY-VIEW-CONTAINER"] = require("./ui/proxy-view-container/proxy-view-container-tests")
allTests["SCROLL-VIEW"] = require("./ui/scroll-view/scroll-view-tests");
allTests["ACTION-BAR"] = require("./ui/action-bar/action-bar-tests");
allTests["XML-DECLARATION"] = require("./xml-declaration/xml-declaration-tests");
diff --git a/apps/tests/ui/proxy-view-container/proxy-view-container-tests.ts b/apps/tests/ui/proxy-view-container/proxy-view-container-tests.ts
new file mode 100644
index 000000000..1d2601331
--- /dev/null
+++ b/apps/tests/ui/proxy-view-container/proxy-view-container-tests.ts
@@ -0,0 +1,160 @@
+import TKUnit = require("../../TKUnit");
+import helper = require("../helper");
+import viewModule = require("ui/core/view");
+import observable = require("data/observable");
+import color = require("color");
+import platform = require("platform");
+
+import {ProxyViewContainer} from "ui/proxy-view-container";
+import {View, Button, StackLayout} from "ui";
+
+export function test_add_children_to_attached_proxy() {
+ var outer = new StackLayout();
+ var proxy = new ProxyViewContainer();
+
+ function testAction(views: Array) {
+ outer.addChild(createBtn("1"));
+ outer.addChild(proxy);
+ proxy.addChild(createBtn("2"));
+ proxy.addChild(createBtn("3"));
+ proxy.addChild(createBtn("4"));
+
+ outer.addChild(createBtn("5"));
+
+ assertNativeChildren(outer, ["1", "2", "3", "4", "5"]);
+ };
+
+ helper.buildUIAndRunTest(outer, testAction);
+}
+
+export function test_add_children_to_detached_proxy() {
+ var outer = new StackLayout();
+ var proxy = new ProxyViewContainer();
+
+ function testAction(views: Array) {
+ outer.addChild(createBtn("1"));
+
+ proxy.addChild(createBtn("2"));
+ proxy.addChild(createBtn("3"));
+ proxy.addChild(createBtn("4"));
+ outer.addChild(proxy);
+
+ outer.addChild(createBtn("5"));
+
+ assertNativeChildren(outer, ["1", "2", "3", "4", "5"]);
+ };
+
+ helper.buildUIAndRunTest(outer, testAction);
+}
+
+export function test_remove_proxy() {
+ var outer = new StackLayout();
+ var proxy = new ProxyViewContainer();
+
+ outer.addChild(createBtn("1"));
+
+ outer.addChild(proxy);
+ proxy.addChild(createBtn("2"));
+ proxy.addChild(createBtn("3"));
+ proxy.addChild(createBtn("4"));
+
+ outer.addChild(createBtn("5"));
+
+ function testAction(views: Array) {
+ assertNativeChildren(outer, ["1", "2", "3", "4", "5"]);
+ outer.removeChild(proxy);
+ assertNativeChildren(outer, ["1", "5"]);
+ };
+
+ helper.buildUIAndRunTest(outer, testAction);
+}
+
+export function test_remove_child_of_attached_proxy() {
+ var outer = new StackLayout();
+ var proxy = new ProxyViewContainer();
+
+ outer.addChild(createBtn("1"));
+
+ outer.addChild(proxy);
+ proxy.addChild(createBtn("2"));
+ var testBtn = createBtn("3")
+ proxy.addChild(testBtn);
+ proxy.addChild(createBtn("4"));
+
+ outer.addChild(createBtn("5"));
+
+ function testAction(views: Array) {
+ assertNativeChildren(outer, ["1", "2", "3", "4", "5"]);
+ proxy.removeChild(testBtn);
+ assertNativeChildren(outer, ["1", "2", "4", "5"]);
+ };
+
+ helper.buildUIAndRunTest(outer, testAction);
+}
+
+export function test_insert_inside_porxy() {
+ var outer = new StackLayout();
+ var proxy = new ProxyViewContainer();
+
+ outer.addChild(createBtn("1"));
+
+ outer.addChild(proxy);
+ proxy.addChild(createBtn("2"));
+ proxy.addChild(createBtn("4"));
+
+ outer.addChild(createBtn("5"));
+
+ function testAction(views: Array) {
+ assertNativeChildren(outer, ["1", "2", "4", "5"]);
+ proxy.insertChild(createBtn("3"), 1);
+ assertNativeChildren(outer, ["1", "2", "3", "4", "5"]);
+ };
+
+ helper.buildUIAndRunTest(outer, testAction);
+}
+
+export function test_insert_after_porxy() {
+ var outer = new StackLayout();
+ var proxy = new ProxyViewContainer();
+
+ outer.addChild(createBtn("1"));
+
+ outer.addChild(proxy);
+ proxy.addChild(createBtn("2"));
+ proxy.addChild(createBtn("3"));
+ proxy.addChild(createBtn("4"));
+
+ function testAction(views: Array) {
+ assertNativeChildren(outer, ["1", "2", "3", "4"]);
+ outer.insertChild(createBtn("5"), 2);
+ assertNativeChildren(outer, ["1", "2", "3", "4", "5"]);
+ };
+
+ helper.buildUIAndRunTest(outer, testAction);
+}
+
+function createBtn(text: string): Button {
+ var b = new Button();
+ b.text = text;
+ return b;
+}
+
+function assertNativeChildren(stack: StackLayout, arr: Array) {
+ if (stack.android) {
+ let android: org.nativescript.widgets.StackLayout = stack.android;
+ TKUnit.assertEqual(android.getChildCount(), arr.length, "Native children");
+ for (let i = 0; i < arr.length; i++) {
+ let nativeBtn = android.getChildAt(i);
+ TKUnit.assertEqual(nativeBtn.getText(), arr[i]);
+ }
+ } else if (stack.ios) {
+ let ios: UIView = stack.ios;
+ TKUnit.assertEqual(ios.subviews.count, arr.length, "Native children");
+ for (let i = 0; i < arr.length; i++) {
+ let nativeBtn = ios.subviews[i];
+ TKUnit.assertEqual(nativeBtn.titleLabel.text, arr[i]);
+ }
+ } else {
+ TKUnit.assert(false, "No native view to assert");
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
index e4cc8567a..db6ff7be7 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -265,6 +265,7 @@
"apps/tests/ui/page/test-page-module.ts",
"apps/tests/ui/placeholder/placeholder-tests.ts",
"apps/tests/ui/progress/progress-tests.ts",
+ "apps/tests/ui/proxy-view-container/proxy-view-container-tests.ts",
"apps/tests/ui/repeater/repeater-tests.ts",
"apps/tests/ui/repeater/repeaterItems-bindingToGestures.ts",
"apps/tests/ui/scroll-view/scroll-view-tests.ts",
@@ -594,6 +595,8 @@
"ui/progress/progress.android.ts",
"ui/progress/progress.d.ts",
"ui/progress/progress.ios.ts",
+ "ui/proxy-view-container/proxy-view-container.d.ts",
+ "ui/proxy-view-container/proxy-view-container.ts",
"ui/repeater/repeater.d.ts",
"ui/repeater/repeater.ts",
"ui/scroll-view/scroll-view-common.ts",
@@ -664,8 +667,6 @@
"ui/ui.ts",
"ui/utils.d.ts",
"ui/utils.ios.ts",
- "ui/view-container/proxy-view-container.d.ts",
- "ui/view-container/proxy-view-container.ts",
"ui/web-view/web-view-common.ts",
"ui/web-view/web-view.android.ts",
"ui/web-view/web-view.d.ts",
diff --git a/ui/view-container/package.json b/ui/proxy-view-container/package.json
similarity index 100%
rename from ui/view-container/package.json
rename to ui/proxy-view-container/package.json
diff --git a/ui/view-container/proxy-view-container.d.ts b/ui/proxy-view-container/proxy-view-container.d.ts
similarity index 100%
rename from ui/view-container/proxy-view-container.d.ts
rename to ui/proxy-view-container/proxy-view-container.d.ts
diff --git a/ui/view-container/proxy-view-container.ts b/ui/proxy-view-container/proxy-view-container.ts
similarity index 100%
rename from ui/view-container/proxy-view-container.ts
rename to ui/proxy-view-container/proxy-view-container.ts