From f72d79e65a70b9368c4e8ff38be4ba7a161be4ee Mon Sep 17 00:00:00 2001 From: hshristov Date: Thu, 22 Oct 2015 10:26:59 +0300 Subject: [PATCH] iOS owner pattern changed to use WeakRef in order to prevent memory leaks. Optimized list-view-tests. Added time per test. --- apps/tests/TKUnit.ts | 29 +- apps/tests/testRunner.ts | 13 +- apps/tests/ui/list-view/list-view-tests.ts | 758 +++++++++--------- .../tests/ui/scroll-view/scroll-view-tests.ts | 8 +- fps-meter/fps-native.ios.ts | 21 +- ui/action-bar/action-bar.ios.ts | 26 +- ui/button/button.ios.ts | 20 +- ui/date-picker/date-picker.ios.ts | 31 +- ui/frame/frame.ios.ts | 53 +- ui/gestures/gestures.ios.ts | 31 +- ui/label/label.ios.ts | 52 +- ui/list-picker/list-picker.ios.ts | 50 +- ui/list-view/list-view.ios.ts | 148 ++-- ui/page/page.ios.ts | 75 +- ui/search-bar/search-bar.ios.ts | 40 +- ui/segmented-bar/segmented-bar.ios.ts | 21 +- ui/slider/slider.ios.ts | 23 +- ui/switch/switch.ios.ts | 19 +- ui/tab-view/tab-view.ios.ts | 61 +- ui/text-field/text-field.ios.ts | 100 ++- ui/time-picker/time-picker.ios.ts | 33 +- ui/web-view/web-view.ios.ts | 42 +- 22 files changed, 863 insertions(+), 791 deletions(-) diff --git a/apps/tests/TKUnit.ts b/apps/tests/TKUnit.ts index c27906a67..f8ecf7cfe 100644 --- a/apps/tests/TKUnit.ts +++ b/apps/tests/TKUnit.ts @@ -29,12 +29,23 @@ export interface TestInfoEntry { testTimeout: number; } +export function time(): number { + if (global.android) { + return java.lang.System.nanoTime() / 1000000; // 1 ms = 1000000 ns + } + else { + return CACurrentMediaTime() * 1000; + } +} + export var write = function write(message: string, type?: number) { //console.log(message); trace.write(message, trace.categories.Test, type); } var runTest = function (testInfo: TestInfoEntry) { + let start = time(); + let duration; try { if (testInfo.instance) { testInfo.testFunc.apply(testInfo.instance); @@ -44,13 +55,15 @@ var runTest = function (testInfo: TestInfoEntry) { } if (testInfo.isTest) { - write("--- [" + testInfo.testName + "] OK", trace.messageType.info); + duration = time() - start; + write("--- [" + testInfo.testName + "] OK, duration: " + duration, trace.messageType.info); testInfo.isPassed = true; } } catch (e) { if (testInfo.isTest) { - write("--- [" + testInfo.testName + "] FAILED: " + e.message, trace.messageType.error); + duration = time() - start; + write("--- [" + testInfo.testName + "] FAILED: " + e.message + ", duration: " + duration, trace.messageType.error); testInfo.isPassed = false; testInfo.errorMessage = e.message; } @@ -78,7 +91,7 @@ function runAsync(testInfo: TestInfoEntry, recursiveIndex: number, testTimeout?: var error; var isDone = false; var handle; - var testStartTime = new Date().getTime(); + var testStartTime = time(); //write("--- [" + testInfo.testName + "] Started at: " + testStartTime, trace.messageType.info); var doneCallback = function (e: Error) { if (e) { @@ -93,23 +106,25 @@ function runAsync(testInfo: TestInfoEntry, recursiveIndex: number, testTimeout?: testTimeout = defaultTimeout; } + let duration; var checkFinished = function () { + duration = time() - testStartTime; if (isDone) { - write("--- [" + testInfo.testName + "] OK", trace.messageType.info); + write("--- [" + testInfo.testName + "] OK, duration: " + duration, trace.messageType.info); //write("--- [" + testInfo.testName + "] took: " + (new Date().getTime() - testStartTime), trace.messageType.info); testInfo.isPassed = true; runTests(testsQueue, recursiveIndex + 1); } else if (error) { - write("--- [" + testInfo.testName + "] FAILED: " + error.message, trace.messageType.error); + write("--- [" + testInfo.testName + "] FAILED: " + error.message + ", duration: " + duration, trace.messageType.error); //write("--- [" + testInfo.testName + "] took: " + (new Date().getTime() - testStartTime), trace.messageType.info); testInfo.errorMessage = error.message; runTests(testsQueue, recursiveIndex + 1); } else { - var testEndTime = new Date().getTime(); + var testEndTime = time(); if (testEndTime - testStartTime > testTimeout) { - write("--- [" + testInfo.testName + "] TIMEOUT", trace.messageType.error); + write("--- [" + testInfo.testName + "] TIMEOUT, duration: " + duration, trace.messageType.error); //write("--- [" + testInfo.testName + "] took: " + (testEndTime - testStartTime), trace.messageType.info); testInfo.errorMessage = "Test timeout."; runTests(testsQueue, recursiveIndex + 1); diff --git a/apps/tests/testRunner.ts b/apps/tests/testRunner.ts index fa559f3a6..ebc64e184 100644 --- a/apps/tests/testRunner.ts +++ b/apps/tests/testRunner.ts @@ -128,24 +128,15 @@ function printRunTestStats() { } } -function time(): number { - if (platform.device.os === platform.platformNames.android) { - return java.lang.System.nanoTime() / 1000000; // 1 ms = 1000000 ns - } - else if (platform.device.os === platform.platformNames.ios) { - return CACurrentMediaTime() * 1000; - } -} - function startLog(): void { let testsName: string = this.name; TKUnit.write("START " + testsName + " TESTS.", trace.messageType.info); - this.start = time(); + this.start = TKUnit.time(); } function log(): void { let testsName: string = this.name; - let duration = time() - this.start; + let duration = TKUnit.time() - this.start; TKUnit.write(testsName + " COMPLETED for " + duration, trace.messageType.info); } diff --git a/apps/tests/ui/list-view/list-view-tests.ts b/apps/tests/ui/list-view/list-view-tests.ts index 8ffe378c9..730b24f39 100644 --- a/apps/tests/ui/list-view/list-view-tests.ts +++ b/apps/tests/ui/list-view/list-view-tests.ts @@ -1,4 +1,5 @@ -import TKUnit = require("../../TKUnit"); +import testModule = require("../../ui-test"); +import TKUnit = require("../../TKUnit"); import testRunner = require("../../testRunner"); import app = require("application"); import helper = require("../helper"); @@ -68,39 +69,32 @@ import labelModule = require("ui/label"); var ASYNC = 0.2; var FEW_ITEMS = [0, 1, 2]; -var MANY_ITEMS = []; +var MANY_ITEMS = new Array(100); for (var i = 0; i < 100; i++) { - MANY_ITEMS[i] = i; + MANY_ITEMS.push(i); } -export function test_default_TNS_values() { - // - // ### Creating a ListView - // ``` JavaScript - var listView = new listViewModule.ListView(); - // ``` - // +export class ListViewTest extends testModule.UITest { + + public create(): listViewModule.ListView { + return new listViewModule.ListView(); + } + + public test_default_TNS_values() { + // + // ### Creating a ListView + // ``` JavaScript + var listView = new listViewModule.ListView(); + // ``` + // - function testAction(views: Array) { TKUnit.assertEqual(listView.isScrolling, false, "Default listView.isScrolling"); TKUnit.assert(types.isUndefined(listView.items), "Default listView.items should be undefined"); + } - if (app.android) { - TKUnit.assert(listView.android instanceof android.widget.ListView, "android property is android.widget.ListView"); - } - else if (app.ios) { - TKUnit.assert(listView.ios instanceof UITableView, "ios property is UITableView"); - } + public test_set_items_to_array_loads_all_items(done) { + var listView = this.testView; - }; - - helper.buildUIAndRunTest(listView, testAction); -} - -export function test_set_items_to_array_loads_all_items() { - var listView = new listViewModule.ListView(); - - function testAction(views: Array) { var indexes = {}; // // ### Using ListView with Array @@ -117,26 +111,35 @@ export function test_set_items_to_array_loads_all_items() { // indexes[args.index] = true; + if (args.index === (colors.length - 1)) { + try { + if (app.android) { + TKUnit.assert(listView.android instanceof android.widget.ListView, "android property is android.widget.ListView"); + } + else if (app.ios) { + TKUnit.assert(listView.ios instanceof UITableView, "ios property is UITableView"); + } + + TKUnit.assert(indexes[0], "itemLoading not called for index 0"); + TKUnit.assert(indexes[1], "itemLoading not called for index 1"); + TKUnit.assert(indexes[2], "itemLoading not called for index 2"); + done(null); + } + catch (e) { + done(e); + } + } // }); // ``` // + } - TKUnit.wait(ASYNC); - TKUnit.assert(indexes[0], "itemLoading not called for index 0"); - TKUnit.assert(indexes[1], "itemLoading not called for index 1"); - TKUnit.assert(indexes[2], "itemLoading not called for index 2"); - }; + public test_set_native_item_exposed() { + let listView = this.testView; - helper.buildUIAndRunTest(listView, testAction); -} - -export function test_set_native_item_exposed() { - var listView = new listViewModule.ListView(); - - function testAction(views: Array) { - var indexes = {}; - var colors = ["red", "green", "blue"]; + let indexes = {}; + let colors = ["red", "green", "blue"]; listView.items = colors; listView.on(listViewModule.ListView.itemLoadingEvent, function (args: listViewModule.ItemEventData) { if (platform.device.os === platform.platformNames.ios) { @@ -146,7 +149,8 @@ export function test_set_native_item_exposed() { } }); - TKUnit.wait(ASYNC); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + for (var item in indexes) { if (platform.device.os === platform.platformNames.ios) { TKUnit.assert(indexes[item] instanceof UITableViewCell, "itemLoading not called for index " + item); @@ -154,36 +158,27 @@ export function test_set_native_item_exposed() { TKUnit.assert(indexes[item] instanceof android.view.ViewGroup, "itemLoading not called for index " + item); } } - }; + } - helper.buildUIAndRunTest(listView, testAction); -} - -export function test_set_items_to_array_creates_native_views() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { + public test_set_items_to_array_creates_native_views() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); listView.items = FEW_ITEMS; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), FEW_ITEMS.length, "Native views count."); - }; + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), FEW_ITEMS.length, "Native views count."); + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_refresh_after_adding_items_to_array_loads_new_items() { -export function test_refresh_after_adding_items_to_array_loads_new_items() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { var colors = ["red", "green", "blue"]; listView.items = colors; + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), colors.length, "Native views count."); - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), colors.length, "Native views count."); // // > Note, that changing the array after the list view is shown will not update the UI. // You can force-update the UI using the refresh() method. @@ -193,19 +188,14 @@ export function test_refresh_after_adding_items_to_array_loads_new_items() { listView.refresh(); // ``` // - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), colors.length, "Native views count."); - }; + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), colors.length, "Native views count."); + } - helper.buildUIAndRunTest(listView, testAction); -} - -export function test_refresh_reloads_all_items() { - var listView = new listViewModule.ListView(); - - function testAction(views: Array) { - var indexes = {}; - var testStarted = false; + public test_refresh_reloads_all_items() { + let listView = this.testView; + let indexes = {}; + let completed = false; listView.items = FEW_ITEMS; listView.on(listViewModule.ListView.itemLoadingEvent, function (args: listViewModule.ItemEventData) { if (!args.view) { @@ -213,79 +203,66 @@ export function test_refresh_reloads_all_items() { } (args.view).text = "item " + args.index; - if (testStarted) { - indexes[args.index] = true; - } + indexes[args.index] = indexes[args.index] ? indexes[args.index] + 1 : 1; + completed = args.index === (listView.items.length - 1); }); - TKUnit.wait(ASYNC); - testStarted = true; + TKUnit.waitUntilReady(() => { return completed; }, ASYNC); + TKUnit.assertEqual(indexes[0], 1, "itemLoading called more than once"); + TKUnit.assertEqual(indexes[1], 1, "itemLoading called more than once"); + TKUnit.assertEqual(indexes[2], 1, "itemLoading called more than once"); + + completed = false; listView.refresh(); - TKUnit.wait(ASYNC); - TKUnit.assert(indexes[0], "itemLoading not called for index 0"); - TKUnit.assert(indexes[1], "itemLoading not called for index 1"); - TKUnit.assert(indexes[2], "itemLoading not called for index 2"); - }; + TKUnit.waitUntilReady(() => { return completed; }, ASYNC); + TKUnit.assertEqual(indexes[0], 2, "itemLoading not called for index 0"); + TKUnit.assertEqual(indexes[1], 2, "itemLoading not called for index 1"); + TKUnit.assertEqual(indexes[2], 2, "itemLoading not called for index 2"); + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_set_itmes_to_null_clears_native_items() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); -export function test_set_itmes_to_null_clears_native_items() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { listView.items = FEW_ITEMS; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), FEW_ITEMS.length, "Native views count."); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), FEW_ITEMS.length, "Native views count."); listView.items = null; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 0, "Native views count."); - }; + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === 0; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 0, "Native views count."); + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_set_itmes_to_undefiend_clears_native_items() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); -export function test_set_itmes_to_undefiend_clears_native_items() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { listView.items = FEW_ITEMS; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), FEW_ITEMS.length, "Native views count."); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), FEW_ITEMS.length, "Native views count."); listView.items = undefined; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 0, "Native views count."); - }; + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === 0; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 0, "Native views count."); + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_set_itmes_to_different_source_loads_new_items() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); -export function test_set_itmes_to_different_source_loads_new_items() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { listView.items = [1, 2, 3]; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 3, "Native views count."); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 3, "Native views count."); listView.items = ["a", "b", "c", "d"]; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 4, "Native views count."); - }; + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 4, "Native views count."); + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_set_items_to_observable_array_loads_all_items() { + var listView = this.testView; -export function test_set_items_to_observable_array_loads_all_items() { - var listView = new listViewModule.ListView(); - - function testAction(views: Array) { var indexes = {}; // // ### Using ListView with ObservableArray @@ -304,25 +281,21 @@ export function test_set_items_to_observable_array_loads_all_items() { // ``` // - TKUnit.wait(ASYNC); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); TKUnit.assert(indexes[0], "itemLoading not called for index 0"); TKUnit.assert(indexes[1], "itemLoading not called for index 1"); TKUnit.assert(indexes[2], "itemLoading not called for index 2"); - }; + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_add_to_observable_array_refreshes_the_listview() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); -export function test_add_to_observable_array_refreshes_the_listview() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { var colors = new observableArray.ObservableArray(["red", "green", "blue"]); listView.items = colors; - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 3, "getNativeViewCount"); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 3, "getNativeViewCount"); // // > When using ObservableArray the list view will be automatically updated when items are added or removed form the array. @@ -331,60 +304,46 @@ export function test_add_to_observable_array_refreshes_the_listview() { //// The ListView will be updated automatically. // ``` // - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 4, "getNativeViewCount"); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 4, "getNativeViewCount"); + } - }; + public test_remove_from_observable_array_refreshes_the_listview() { + var listView = this.testView; + var data = new observableArray.ObservableArray([1, 2, 3]); - helper.buildUIAndRunTest(listView, testAction); -} - -export function test_remove_from_observable_array_refreshes_the_listview() { - var listView = new listViewModule.ListView(); - var data = new observableArray.ObservableArray([1, 2, 3]); - - function testAction(views: Array) { listView.items = data; - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 3, "getNativeViewCount"); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 3, "getNativeViewCount"); data.pop(); - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 2, "getNativeViewCount"); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 2, "getNativeViewCount"); + } - }; + public test_splice_observable_array_refreshes_the_listview() { + var listView = this.testView; + var data = new observableArray.ObservableArray(["a", "b", "c"]); - helper.buildUIAndRunTest(listView, testAction); -} - -export function test_splice_observable_array_refreshes_the_listview() { - var listView = new listViewModule.ListView(); - var data = new observableArray.ObservableArray(["a", "b", "c"]); - - function testAction(views: Array) { listView.items = data; - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 3, "getNativeViewCount"); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 3, "getNativeViewCount"); // Remove the first 2 elements and add data.splice(0, 2, "d", "e", "f"); - TKUnit.wait(ASYNC); - TKUnit.assertEqual(getNativeViewCount(listView), 4, "getNativeViewCount"); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + TKUnit.assertEqual(this.getNativeViewCount(listView), 4, "getNativeViewCount"); + } - }; + public test_nativeTap_is_raised() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); + listView.items = FEW_ITEMS; - helper.buildUIAndRunTest(listView, testAction); -} -export function test_nativeTap_is_raised() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - listView.items = FEW_ITEMS; - - function testAction(views: Array) { var nativeTapRaised = false; var itemIndex = -1; /* tslint:disable:no-unused-variable */ @@ -405,23 +364,19 @@ export function test_nativeTap_is_raised() { // ``` // /* tslint:enable:no-unused-variable */ - TKUnit.wait(ASYNC); - performNativeItemTap(listView, 1); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); + this.performNativeItemTap(listView, 1); TKUnit.assert(nativeTapRaised, "itemTap not raised."); TKUnit.assertEqual(itemIndex, 1, "tappedItemIndex"); - }; + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_loadMoreItems_raised_when_showing_few_items() { + var listView = this.testView; -export function test_loadMoreItems_raised_when_showing_few_items() { - var listView = new listViewModule.ListView(); - - function testAction(views: Array) { var loadMoreItemsCount = 0; listView.items = FEW_ITEMS; - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); // // ### LoadMoreItems event // The event will be raised when the ListView is scrolled so that the last item is visible. @@ -435,36 +390,35 @@ export function test_loadMoreItems_raised_when_showing_few_items() { }); // ``` // - TKUnit.wait(ASYNC); + TKUnit.waitUntilReady(() => { return this.getNativeViewCount(listView) === listView.items.length; }, ASYNC); TKUnit.assertEqual(loadMoreItemsCount, 1, "loadMoreItemsCount"); - }; + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_loadMoreItems_not_raised_when_showing_many_items() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); -export function test_loadMoreItems_not_raised_when_showing_many_items() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { var loadMoreItemsCount = 0; listView.items = MANY_ITEMS; listView.on(listViewModule.ListView.loadMoreItemsEvent, function (data: observable.EventData) { loadMoreItemsCount++; }); - TKUnit.wait(ASYNC); + // We can't use waitUntilReady because we don't know what to wait for. + if (platform.device.os === platform.platformNames.android) { + this.waitUntilTestElementLayoutIsValid(); + } + else { + TKUnit.wait(ASYNC); + } + TKUnit.assertEqual(loadMoreItemsCount, 0, "loadMoreItemsCount"); - }; + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_loadMoreItems_is_raised_when_scroll_to_last_item() { + var listView = this.testView; + listView.on(listViewModule.ListView.itemLoadingEvent, this.loadViewWithItemNumber); -export function test_loadMoreItems_is_raised_when_scroll_to_last_item() { - var listView = new listViewModule.ListView(); - listView.on(listViewModule.ListView.itemLoadingEvent, loadViewWithItemNumber); - - function testAction(views: Array) { var loadMoreItemsCount = 0; listView.items = MANY_ITEMS; listView.on(listViewModule.ListView.loadMoreItemsEvent, function (data: observable.EventData) { @@ -473,89 +427,82 @@ export function test_loadMoreItems_is_raised_when_scroll_to_last_item() { listView.scrollToIndex(MANY_ITEMS.length - 1); - TKUnit.wait(ASYNC); + // We can't use waitUntilReady because we don't know what to wait for. + if (platform.device.os === platform.platformNames.android) { + this.waitUntilTestElementLayoutIsValid(); + } + else { + TKUnit.wait(ASYNC); + } + TKUnit.assert(loadMoreItemsCount > 0, "loadMoreItemsCount"); - }; + } - helper.buildUIAndRunTest(listView, testAction); -} + public test_usingAppLevelConvertersInListViewItems() { + var listView = this.testView; -export function test_usingAppLevelConvertersInListViewItems() { - var listView = new listViewModule.ListView(); + var dateConverter = function (value, format) { + var result = format; + var day = value.getDate(); + result = result.replace("DD", day < 10 ? "0" + day : day); + var month = value.getMonth() + 1; + result = result.replace("MM", month < 10 ? "0" + month : month); + result = result.replace("YYYY", value.getFullYear()); + return result; + }; - var dateConverter = function (value, format) { - var result = format; - var day = value.getDate(); - result = result.replace("DD", day < 10 ? "0" + day : day); - var month = value.getMonth() + 1; - result = result.replace("MM", month < 10 ? "0" + month : month); - result = result.replace("YYYY", value.getFullYear()); - return result; - }; + app.resources["dateConverter"] = dateConverter; - app.resources["dateConverter"] = dateConverter; + var data = new observableArray.ObservableArray(); + data.push({ date: new Date(2020, 2, 7) }); - var data = new observableArray.ObservableArray(); - data.push({ date: new Date(2020, 2, 7) }); - - function testAction(views: Array) { listView.itemTemplate = "