// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. // /// /// /// /// module WinJSTests { "use strict"; var COUNT = 6; var FlipView = WinJS.UI.FlipView; function navigateAndSpliceTwiceInDataSource(element, flipView, rawData, complete) { var data = [ { title: "New Delhi", data1: "India" }, { title: "Redmond", data1: "America" } ]; var list = new WinJS.Binding.List(data); var tests = [ function () { var ds = list.dataSource; flipView.itemDataSource = ds; }, function () { flipView.next(); list.splice(2, 1); list.splice(1, 1); flipView._pageManager._notificationsEndedSignal.promise.then(function () { LiveUnit.Assert.areEqual("New DelhiIndia", flipView._pageManager._currentPage.element.textContent); complete(); }); } ]; runFlipViewTests(flipView, tests); } function insertJumpAndChangeInDataSource(element, flipView, rawData, complete) { var data = [ { title: "New Delhi", data1: "India" }, { title: "Redmond", data1: "America" }, { title: "Seattle", data1: "America" } ]; var list = new WinJS.Binding.List(data); var tests = [ function () { var ds = list.dataSource; flipView.itemDataSource = ds; }, function () { // Insert list.unshift({ title: "Bellevue", data1: "America" }); // Jump flipView.currentPage = 0; flipView._pageManager._notificationsEndedSignal.promise.then(function () { // Change list.setAt(0, { title: "Tampa", data1: "America" }); LiveUnit.Assert.areEqual("TampaAmerica", flipView._pageManager._currentPage.element.textContent); complete(); }); } ]; runFlipViewTests(flipView, tests); } function insertAndChangeInDatasource(element, flipView, rawData, complete) { var data = [ { title: "New Delhi", data1: "India" }, { title: "Redmond", data1: "America" } ]; var list = new WinJS.Binding.List(data); var tests = [ function () { var ds = list.dataSource; flipView.itemDataSource = ds; }, function () { list.push({ title: "Tampa", data1: "US" }); list.setAt(2, { title: "Boston", data1: "US" }); list.setAt(2, { title: "Seattle", data1: "US" }); flipView.currentPage = 2; }, function () { LiveUnit.Assert.areEqual("SeattleUS", flipView._pageManager._currentPage.element.textContent); complete(); } ]; runFlipViewTests(flipView, tests); } function shiftAndChangeInDatasource(element, flipView, rawData, complete) { var data = [ { title: "Tokio", data1: "Japan" }, { title: "Paris", data1: "France" } ]; var list = new WinJS.Binding.List(data); var tests = [ function () { var ds = list.dataSource; flipView.itemDataSource = ds; }, function () { list.shift(); list.setAt(0, { title: "Miami", data1: "US" }); list.setAt(0, { title: "San Jose", data1: "US" }); return true; }, function () { LiveUnit.Assert.areEqual("San JoseUS", flipView._pageManager._currentPage.element.textContent); complete(); } ]; runFlipViewTests(flipView, tests); } function verifyDisplayedItem(flipView, rawData) { LiveUnit.LoggingCore.logComment("Verifying displayed page is correct"); LiveUnit.Assert.isTrue(currentPageInView(flipView)); flipView.itemTemplate.verifyOutput(getDisplayedElement(flipView), rawData); } function verifyNoOldDataRemains(element, className) { LiveUnit.Assert.areEqual(0, element.querySelectorAll(className).length); } function datasourceTest(element, flipView, rawData, complete) { var otherSource = createArraySource(COUNT * 2, ["400px"], ["400px"], "newData"), otherRawData = otherSource.rawData, pageInvisible, pageVisible, oldCurrentPage; flipView.addEventListener("pagevisibilitychanged", function (e) { if (e.detail.visible) { pageVisible = e.target; } else { pageInvisible = e.target; } }, false); var tests = [ function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyDisplayedItem(flipView, rawData[0]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(1, flipView.currentPage); verifyDisplayedItem(flipView, rawData[1]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(2, flipView.currentPage); verifyDisplayedItem(flipView, rawData[2]); flipView.currentPage = 5; }, function () { LiveUnit.Assert.areEqual(5, flipView.currentPage); verifyDisplayedItem(flipView, rawData[5]); oldCurrentPage = getDisplayedElement(flipView); pageVisible = null; pageInvisible = null; flipView.itemDataSource = otherSource.dataSource; }, function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyDisplayedItem(flipView, otherRawData[0]); LiveUnit.Assert.areEqual(pageInvisible, oldCurrentPage); LiveUnit.Assert.areEqual(pageVisible, getDisplayedElement(flipView)); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(1, flipView.currentPage); verifyDisplayedItem(flipView, otherRawData[1]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(2, flipView.currentPage); verifyDisplayedItem(flipView, otherRawData[2]); flipView.currentPage = 11; }, function () { LiveUnit.Assert.areEqual(11, flipView.currentPage); verifyDisplayedItem(flipView, otherRawData[11]); LiveUnit.Assert.isFalse(flipView.next()); complete(); }, ]; runFlipViewTests(flipView, tests); } function rendererTest(element, flipView, rawData, complete) { var pageInvisible, pageVisible, oldCurrentPage; flipView.addEventListener("pagevisibilitychanged", function (e) { if (e.detail.visible) { pageVisible = e.target; } else { pageInvisible = e.target; } }, false); var tests = [ function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyDisplayedItem(flipView, rawData[0]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(1, flipView.currentPage); verifyDisplayedItem(flipView, rawData[1]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(2, flipView.currentPage); verifyDisplayedItem(flipView, rawData[2]); flipView.currentPage = 5; }, function () { LiveUnit.Assert.areEqual(5, flipView.currentPage); verifyDisplayedItem(flipView, rawData[5]); pageInvisible = null; pageVisible = null; oldCurrentPage = getDisplayedElement(flipView); flipView.itemTemplate = alternateBasicInstantRenderer; }, function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyDisplayedItem(flipView, rawData[0]); LiveUnit.Assert.areEqual(pageInvisible, oldCurrentPage); LiveUnit.Assert.areEqual(pageVisible, getDisplayedElement(flipView)); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(1, flipView.currentPage); verifyDisplayedItem(flipView, rawData[1]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(2, flipView.currentPage); verifyDisplayedItem(flipView, rawData[2]); flipView.currentPage = 5; }, function () { LiveUnit.Assert.areEqual(5, flipView.currentPage); verifyDisplayedItem(flipView, rawData[5]); LiveUnit.Assert.isFalse(flipView.next()); complete(); }, ]; runFlipViewTests(flipView, tests); } function changeDuringAnimationTest(element, flipView, rawData, complete) { var otherSource = createArraySource(COUNT * 2, ["400px"], ["400px"], "newData"), otherRawData = otherSource.rawData; var tests = [ function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyDisplayedItem(flipView, rawData[0]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { flipView.itemDataSource = otherSource.dataSource; }, function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyDisplayedItem(flipView, otherRawData[0]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(1, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyDisplayedItem(flipView, otherRawData[1]); flipView.currentPage = 5; }, function () { verifyNoOldDataRemains(element, rawData[0].className); LiveUnit.Assert.areEqual(5, flipView.currentPage); verifyDisplayedItem(flipView, otherRawData[5]); flipView.currentPage = 0; }, function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyDisplayedItem(flipView, otherRawData[0]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { flipView.itemTemplate = alternateBasicInstantRenderer; }, function () { LiveUnit.Assert.areEqual(0, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyNoOldDataRemains(element, otherRawData[0].className); verifyDisplayedItem(flipView, otherRawData[0]); LiveUnit.Assert.isTrue(flipView.next()); }, function () { LiveUnit.Assert.areEqual(1, flipView.currentPage); verifyNoOldDataRemains(element, rawData[0].className); verifyNoOldDataRemains(element, otherRawData[0].className); verifyDisplayedItem(flipView, otherRawData[1]); complete(); } ]; runFlipViewTests(flipView, tests); } function changeToNullDataSource(element, flipView, rawData, complete) { var tests = [ function () { var refreshHandler = flipView._refreshHandler; flipView._refreshHandler = function () { refreshHandler.call(flipView); flipView.count().done(function (count) { LiveUnit.Assert.areEqual(0, count); complete(); }); }; flipView.itemDataSource = null; } ]; runFlipViewTests(flipView, tests); } export class FlipViewDatasourceTests { setUp() { LiveUnit.LoggingCore.logComment("In setup"); var newNode = document.createElement("div"); newNode.id = "BasicFlipView"; newNode.style.width = "400px"; newNode.style.height = "400px"; document.body.appendChild(newNode); } tearDown() { LiveUnit.LoggingCore.logComment("In tearDown"); var element = document.getElementById("BasicFlipView"); if (element) { WinJS.Utilities.disposeSubTree(element); document.body.removeChild(element); } } testBatchNotificationMoveThenRemove = function (complete) { Helper.initUnhandledErrors(); var element = document.createElement("div"); document.body.appendChild(element); var bl = new WinJS.Binding.List(); var currentCount = 1; for (var i = 0; i < 6; i++) { bl.push({ title: i }); currentCount++; } var fv = new WinJS.UI.FlipView(element, { itemDataSource: bl.dataSource, currentPage: 3, itemTemplate: function (itemPromise) { return itemPromise.then(function (value) { var el = document.createElement("div"); el.textContent = value.data.title; el.style.height = el.style.width = "100px"; el.style.backgroundColor = "teal"; return el; }); } }); var dsChanged = false; fv.addEventListener("pagecompleted", function updateDS() { if (!dsChanged) { bl.dataSource.beginEdits(); // move index 4 to 1 bl.move(4, 1); //remove at 4 bl.splice(4, 1); bl.dataSource.endEdits(); dsChanged = true; } else { Helper.validateUnhandledErrors(); validateInternalBuffers(fv); WinJS.Utilities.disposeSubTree(element); document.body.removeChild(element); complete(); } }); }; testReleasedItemAfterInsertAtIndexOne = function (complete) { Helper.initUnhandledErrors(); var element = document.createElement("div"); document.body.appendChild(element); var bl = new WinJS.Binding.List(); var currentCount = 1; for (var i = 0; i < 6; i++) { bl.push({ title: i }); currentCount++; } var fv = new FlipView(element, { itemDataSource: bl.dataSource, currentPage: 0, itemTemplate: function (itemPromise) { return itemPromise.then(function (value) { var el = document.createElement("div"); el.textContent = value.data.title; el.style.height = el.style.width = "100px"; el.style.backgroundColor = "teal"; return el; }); } }); fv.addEventListener("pagecompleted", function updateDS() { bl.splice(1, 0, { title: "new" }); fv._pageManager._notificationsEndedSignal.promise.then(function () { Helper.validateUnhandledErrors(); validateInternalBuffers(fv); WinJS.Utilities.disposeSubTree(element); document.body.removeChild(element); complete(); }); }); }; testBatchOfRandomChanges = function (complete) { Helper.initUnhandledErrors(); var element = document.createElement("div"); document.body.appendChild(element); var bl = new WinJS.Binding.List(); for (var i = 0; i < 20; i++) { bl.push({ title: String.fromCharCode(97 + i) }); } var fv = new FlipView(element, { itemDataSource: bl.dataSource, currentPage: 4, itemTemplate: function (itemPromise) { return itemPromise.then(function (value) { var el = document.createElement("div"); el.textContent = value.data.title; el.style.height = el.style.width = "100px"; return el; }); } }); fv.addEventListener("pagecompleted", function () { bl.dataSource.beginEdits(); //add item at index 3 bl.splice(3, 0, { title: "new1" }); //remove at 5 bl.splice(5, 1); // move index 4 to 1 bl.move(4, 1); //remove at 4 bl.splice(4, 1); //add item at index 3 bl.splice(3, 0, { title: "new2" }); bl.dataSource.endEdits(); fv._pageManager._notificationsEndedSignal.promise.then(function () { Helper.validateUnhandledErrors(); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.element.textContent, "f"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.element.textContent, "g"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.next.element.textContent, "h"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.element.textContent, "c"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.prev.element.textContent, "new2"); document.body.removeChild(element); complete(); }); }); }; testBatchOfMoveThenDeleteAtSameIndex = function (complete) { Helper.initUnhandledErrors(); var element = document.createElement("div"); document.body.appendChild(element); var bl = new WinJS.Binding.List(); for (var i = 0; i < 20; i++) { bl.push({ title: String.fromCharCode(97 + i) }); } var fv = new FlipView(element, { itemDataSource: bl.dataSource, currentPage: 2, itemTemplate: function (itemPromise) { return itemPromise.then(function (value) { var el = document.createElement("div"); el.textContent = value.data.title; el.style.height = el.style.width = "100px"; return el; }); } }); fv.addEventListener("pagecompleted", function () { bl.dataSource.beginEdits(); // move index 4 to 1 bl.move(4, 1); //remove at 4 bl.splice(4, 1); bl.dataSource.endEdits(); fv._pageManager._notificationsEndedSignal.promise.then(function () { Helper.validateUnhandledErrors(); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.element.textContent, "c"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.element.textContent, "f"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.next.element.textContent, "g"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.element.textContent, "b"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.prev.element.textContent, "e"); document.body.removeChild(element); complete(); }); }); }; testUpdateCurrentElementThenBatchOfRandomChanges = function (complete) { Helper.initUnhandledErrors(); var element = document.createElement("div"); document.body.appendChild(element); var bl = new WinJS.Binding.List(); for (var i = 0; i < 20; i++) { bl.push({ title: String.fromCharCode(97 + i) }); } var fv = new FlipView(element, { itemDataSource: bl.dataSource, currentPage: 1, itemTemplate: function (itemPromise) { return itemPromise.then(function (value) { var el = document.createElement("div"); el.textContent = value.data.title; el.style.height = el.style.width = "100px"; return el; }); } }); fv.addEventListener("pagecompleted", function () { bl.setAt(1, { title: "changed" }); bl.dataSource.beginEdits(); //add item at index 3 bl.splice(3, 0, { title: "new 1" }); //remove at 5 bl.splice(5, 1); // move index 4 to 1 bl.move(4, 1); //remove at 4 bl.splice(4, 1); //add item at index 3 bl.splice(3, 0, { title: "new2" }); bl.dataSource.endEdits(); fv._pageManager._notificationsEndedSignal.promise.then(function () { Helper.validateUnhandledErrors(); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.element.textContent, "changed"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.element.textContent, "new2"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.next.element.textContent, "c"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.element.textContent, "d"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.prev.element.textContent, "a"); document.body.removeChild(element); complete(); }); }); }; testChangesMovingCurrentViewportThenDeleteItem = function (complete) { Helper.initUnhandledErrors(); var element = document.createElement("div"); document.body.appendChild(element); var bl = new WinJS.Binding.List(); for (var i = 0; i < 20; i++) { bl.push({ title: String.fromCharCode(97 + i) }); } var fv = new FlipView(element, { itemDataSource: bl.dataSource, currentPage: 1, itemTemplate: function (itemPromise) { return itemPromise.then(function (value) { var el = document.createElement("div"); el.textContent = value.data.title; el.style.height = el.style.width = "100px"; return el; }); } }); fv.addEventListener("pagecompleted", function () { bl.dataSource.beginEdits(); // move index 3 to 1 bl.move(3, 1); //remove at 3 bl.splice(3, 1); bl.dataSource.endEdits(); //remove at 1 bl.splice(1, 1); fv._pageManager._notificationsEndedSignal.promise.then(function () { Helper.validateUnhandledErrors(); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.element.textContent, "b"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.element.textContent, "e"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.next.next.element.textContent, "f"); LiveUnit.Assert.areEqual(fv._pageManager._currentPage.prev.element.textContent, "a"); LiveUnit.Assert.isTrue(!fv._pageManager._currentPage.prev.prev.element); document.body.removeChild(element); complete(); }); }); }; } function generate(name, testFunction) { function generateTest(orientation) { FlipViewDatasourceTests.prototype[name + "_" + orientation] = function (complete) { var element = document.getElementById("BasicFlipView"), testData = createArraySource(COUNT, ["400px"], ["400px"]), rawData = testData.rawData, flipView = new WinJS.UI.FlipView(element, { itemDataSource: testData.dataSource, itemTemplate: basicInstantRenderer, orientation: orientation }); setupQuickAnimations(flipView); testFunction(element, flipView, rawData, complete); }; } generateTest("horizontal"); generateTest( "vertical"); } generate("testFlipViewDatasourceProperty", datasourceTest); generate("testFlipViewRendererProperty", rendererTest); generate("testFlipViewDSAndRendererDuringAnimation", changeDuringAnimationTest); generate("testFlipViewChangeToNullDataSource", changeToNullDataSource); generate("testFlipViewInsertAndChangeInDataSource", insertAndChangeInDatasource); generate("testFlipViewShiftAndChangeInDataSource", shiftAndChangeInDatasource); generate("testFlipViewNavigateAndSpliceTwiceInDataSource", navigateAndSpliceTwiceInDataSource); generate("testFlipViewInsertJumpAndChangeInDataSource", insertJumpAndChangeInDataSource); } LiveUnit.registerTestClass("WinJSTests.FlipViewDatasourceTests");