// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
//
//
///
///
///
///
var globTest:any = {};
module WinJSTests {
"use strict";
function testDefaultSurfaceChaining(flipView) {
var element = flipView.element,
surface = element.querySelector(".win-surface");
// Verify if win-surface class was applied
LiveUnit.Assert.isNotNull(surface, "win-surface class was not set");
// Verify the value of scrollChaining when touch is supported
if (flipView._environmentSupportsTouch) {
var style = document.defaultView.getComputedStyle(surface, null)[WinJS.Utilities._browserStyleEquivalents["scroll-chaining"].scriptName];
LiveUnit.Assert.areEqual(style, "none", "Default value is not set to none");
}
}
export class FlipperInstantiationTests {
testNavigationWithSizeInPercent = function (complete) {
var elem = document.createElement("div");
elem.id = "flipper";
elem.style.width = "50%";
elem.style.height = "50%";
document.body.appendChild(elem);
function template(itemPromise) {
return itemPromise.then(function (item) {
var root = document.createElement("div");
root.innerHTML = "Microsoft " + item.data;
return root;
});
}
var ds = new WinJS.Binding.List([1, 2, 3, 4, 5, 6, 7]);
var flipView = new WinJS.UI.FlipView(elem, {
itemTemplate: template,
itemDataSource: ds.dataSource
});
waitForFlipViewReady(flipView).
then(function () {
var promiseChain = WinJS.Promise.timeout();
var i = 0;
Helper.asyncWhile(
function () { return i < 6; },
function () {
promiseChain = promiseChain.then(function () {
return waitForFlipViewReady(flipView, function () {
flipView.next();
});
});
i++;
}
);
return promiseChain;
}).
done(function () {
// Cleanup
WinJS.Utilities.disposeSubTree(elem);
document.body.removeChild(elem);
complete();
});
};
testSimpleTemplate = function (complete) {
var host = document.createElement("div");
host.style.width = "400px";
host.style.height = "400px";
document.body.appendChild(host);
function template(itemPromise) {
var root = document.createElement("div");
root.innerHTML = "Microsoft";
return root;
}
var ds = new WinJS.Binding.List([1, 2, 3, 4, 5, 6, 7]);
var flipView = new WinJS.UI.FlipView(host, {
itemTemplate: template,
itemDataSource: ds.dataSource
});
flipView.addEventListener("pagecompleted", function (ev) {
WinJS.Utilities.disposeSubTree(host);
document.body.removeChild(host);
complete();
});
};
testNoNavigationOnResize = function (complete) {
var flipperElement = document.createElement('div'),
startPage = 0,
flipper;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
flipperElement.removeEventListener("pagecompleted", onComplete);
// Attach another handler
var afterComplete = function (ev) {
LiveUnit.Assert.fail("Pagecompleted shouldn't have fired after resize");
};
flipperElement.addEventListener("pagecompleted", afterComplete);
// Resize flipview
flipperElement.style.width = "600px";
// Wait and then complete the test
WinJS.Promise.timeout(WinJS.UI._animationTimeAdjustment(500)).then(function () {
// Check the currentPage is same as before
LiveUnit.Assert.areEqual(startPage, flipper.currentPage, "Current Page should not have changed");
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
});
};
flipperElement.addEventListener("pagecompleted", onComplete);
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: Helper.createBindingList(10).dataSource,
itemTemplate: Helper.syncJSTemplate
});
};
testNoNavigationOnFocus = function (complete) {
var flipperElement = document.createElement('div'),
startPage = 0,
flipper;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
flipperElement.removeEventListener("pagecompleted", onComplete);
// Attach another handler
var afterComplete = function (ev) {
LiveUnit.Assert.fail("Pagecompleted shouldn't have fired after resize");
};
flipperElement.addEventListener("pagecompleted", afterComplete);
// Set the focus on the flipview
flipperElement.focus();
// Wait and then complete the test
WinJS.Promise.timeout(WinJS.UI._animationTimeAdjustment(500)).then(function () {
// Check the currentPage is same as before
LiveUnit.Assert.areEqual(startPage, flipper.currentPage, "Current Page should not have changed");
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
});
};
flipperElement.addEventListener("pagecompleted", onComplete);
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: Helper.createBindingList(10).dataSource,
itemTemplate: Helper.syncJSTemplate
});
};
testDeleteItemAndOrientationChange = function (complete) {
var flipperElement = document.createElement('div'),
flipper;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
flipperElement.removeEventListener("pagecompleted", onComplete);
// Attach another handler
var afterComplete = function (ev) {
// Item has been deleted and orientation changed
// Verify the item is displayed on screen
var expectedText = "title1",
currentText = flipper._pageManager._currentPage.element.textContent.trim();
LiveUnit.Assert.areEqual(expectedText, currentText, "FlipView is not displaying the expected page");
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
};
flipperElement.addEventListener("datasourcecountchanged", afterComplete);
// Delete item
flipper.itemDataSource.itemFromIndex(0).then(function (item) {
flipper.itemDataSource.remove(item.key);
// Change orientation without waiting for pagecompleted
flipper.orientation = "vertical";
});
};
flipperElement.addEventListener("pagecompleted", onComplete);
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: Helper.createBindingList(10).dataSource,
itemTemplate: Helper.syncJSTemplate
});
};
testFlipperInstantiation = function (signalTestCaseCompleted) {
var flipperElement = document.createElement('div');
document.body.appendChild(flipperElement);
LiveUnit.LoggingCore.logComment("Attempt to Instantiate the flipper element");
var flipper = new WinJS.UI.FlipView(flipperElement);
LiveUnit.LoggingCore.logComment("Flipper has been instantiated.");
LiveUnit.Assert.isNotNull(flipper, "Flipper element should not be null when instantiated.");
testDefaultSurfaceChaining(flipper);
function verifyFunction(functionName) {
LiveUnit.LoggingCore.logComment("Verifying that function " + functionName + " exists");
if (flipper[functionName] === undefined) {
LiveUnit.Assert.fail(functionName + " missing from flipper");
}
LiveUnit.Assert.isNotNull(flipper[functionName]);
LiveUnit.Assert.isTrue(typeof (flipper[functionName]) === "function", functionName + " exists on flipper, but it isn't a function");
}
verifyFunction("next");
verifyFunction("previous");
verifyFunction("count");
verifyFunction("forceLayout");
verifyFunction("setCustomAnimations");
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
signalTestCaseCompleted();
}
// Test Flipper Instantiation with null element
testFlipperNullInstantiation = function (signalTestCaseCompleted) {
LiveUnit.LoggingCore.logComment("Attempt to Instantiate the flipper with null element");
var flipper = new WinJS.UI.FlipView(null);
LiveUnit.Assert.isNotNull(flipper.element, "should have created an element");
document.body.appendChild(flipper.element);
testDefaultSurfaceChaining(flipper);
WinJS.Utilities.disposeSubTree(flipper.element);
document.body.removeChild(flipper.element);
signalTestCaseCompleted();
}
testEmptyFlipperFunctions = function (signalTestCaseCompleted) {
var flipperElement = document.createElement("div");
document.body.appendChild(flipperElement);
LiveUnit.LoggingCore.logComment("Attempt to Instantiate the flipper element");
var flipper = new WinJS.UI.FlipView(flipperElement);
LiveUnit.LoggingCore.logComment("Flipper has been instantiated.");
LiveUnit.Assert.isNotNull(flipper, "Flipper element should not be null when instantiated.");
testDefaultSurfaceChaining(flipper);
LiveUnit.Assert.areEqual(flipper.currentPage, 0, "Verifying that currentPage is 0");
LiveUnit.Assert.isFalse(flipper.next(), "Verifying that we can't flip to next");
LiveUnit.Assert.areEqual(flipper.currentPage, 0, "Verifying that currentPage is 0");
LiveUnit.Assert.isFalse(flipper.previous(), "Verifying that we can't flip to previous");
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
signalTestCaseCompleted();
}
testFlipperParams = function (signalTestCaseCompleted) {
function testGoodInitOption(paramName, value) {
LiveUnit.LoggingCore.logComment("Testing creating a flipper using good parameter " + paramName + "=" + value);
var div = document.createElement("div");
var options = {};
options[paramName] = value;
document.body.appendChild(div);
var flipper = new WinJS.UI.FlipView(div, options);
LiveUnit.Assert.isNotNull(flipper);
testDefaultSurfaceChaining(flipper);
WinJS.Utilities.disposeSubTree(div);
document.body.removeChild(div);
}
testGoodInitOption("orientation", "horizontal");
testGoodInitOption("orientation", "vertical");
testGoodInitOption("orientation", "HoRiZONTal");
testGoodInitOption("orientation", "verTical");
testGoodInitOption("currentPage", 0);
signalTestCaseCompleted();
}
testFlipperElement = function (signalTestCaseCompleted) {
var flipperElement = document.createElement('div');
flipperElement.id = "myFlipViewDiv";
document.body.appendChild(flipperElement);
LiveUnit.LoggingCore.logComment("Attempt to Instantiate the flipper element");
var flipper = new WinJS.UI.FlipView(flipperElement);
LiveUnit.LoggingCore.logComment("Verify that the element property is correct");
LiveUnit.Assert.areEqual(flipperElement, flipper.element);
testDefaultSurfaceChaining(flipper);
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
signalTestCaseCompleted();
}
testFlipperEventsInConstructorOptions = function (signalTestCaseCompleted) {
var flipperElement = document.createElement('div');
flipperElement.id = "myFlipViewDiv";
document.body.appendChild(flipperElement);
var pageVisiblityChangedCalled = false;
var pageSelectedCalled = false;
var testData = createArraySource(1, ["400px"], ["400px"]),
rawData = testData.rawData,
options = {
itemDataSource: testData.dataSource,
itemTemplate: basicInstantRenderer,
onpagevisibilitychanged: function () {
pageVisiblityChangedCalled = true;
},
onpageselected: function () {
pageSelectedCalled = true;
},
onpagecompleted: function () {
LiveUnit.Assert.isTrue(pageVisiblityChangedCalled);
LiveUnit.Assert.isTrue(pageSelectedCalled);
document.body.removeChild(flipperElement);
signalTestCaseCompleted();
}
};
var flipView = new WinJS.UI.FlipView(flipperElement, options);
};
testFlipViewDispose = function (complete) {
var flipperElement = document.createElement('div');
flipperElement.id = "myFlipViewDiv";
document.body.appendChild(flipperElement);
var dispose = function () {
if (this.disposed) {
LiveUnit.Assert.fail("Disposed was called again.");
}
this.disposed = true;
itemsAlive--;
};
var data = [1, 2, 3, 4, 5, 6, 7];
var list = new WinJS.Binding.List(data);
var itemsAlive = 0;
var fv = new WinJS.UI.FlipView(flipperElement);
fv.itemTemplate = function (itemPromise) {
return itemPromise.then(function (item) {
var div = document.createElement("div");
div.textContent = item.data;
WinJS.Utilities.addClass(div, "win-disposable");
div.dispose = dispose.bind(div);
itemsAlive++;
return div;
});
};
fv.addEventListener("pagecompleted", function () {
LiveUnit.Assert.isTrue(itemsAlive > 0);
fv.dispose();
LiveUnit.Assert.areEqual(itemsAlive, 0, "At least one element wasn't cleaned up.");
document.body.removeChild(flipperElement);
complete();
});
fv.itemDataSource = list.dataSource;
};
testFlipViewDisposeDuringVirtualization = function (complete) {
var dispose = function () {
if (this.disposed) {
LiveUnit.Assert.fail("Disposed was called again.");
}
this.disposed = true;
itemsAlive--;
if (!disposing && this.textContent != "1") {
LiveUnit.Assert.fail("An unexpected item was released.");
}
firstItemDisposed = true;
};
var data = [1, 2, 3, 4, 5, 6, 7];
var list = new WinJS.Binding.List(data);
var itemsAlive = 0;
var fv = new WinJS.UI.FlipView();
fv.element.id = "fv";
document.body.appendChild(fv.element);
fv.itemTemplate = function (itemPromise) {
return itemPromise.then(function (item) {
var div = document.createElement("div");
div.textContent = item.data;
WinJS.Utilities.addClass(div, "win-disposable");
div.dispose = dispose.bind(div);
itemsAlive++;
return div;
});
};
var firstItemDisposed = false;
var disposing = false;
var call = 0;
fv.addEventListener("pagecompleted", function () {
if (call === 0) {
// Initialized, should be in this state: [1], 2, 3. (This notation means that
// pages 1, 2, and 3 are realized and page 1 is the current page.)
LiveUnit.Assert.isFalse(firstItemDisposed, "The first page shouldn't have been disposed.");
fv.next();
} else if (call === 1) {
// First next was called, should be in this state: 1, [2], 3, 4
LiveUnit.Assert.isFalse(firstItemDisposed, "The first page shouldn't have been disposed.");
fv.next();
} else if (call === 2) {
// Second next was called, should be in this state: 1, 2, [3], 4, 5
LiveUnit.Assert.isFalse(firstItemDisposed, "The first page shouldn't have been disposed.");
fv.next();
} else if (call === 3) {
// Third next was called, should be in this state: 2, 3, [4], 5, 6. Verify that page 1 has been unrealized.
LiveUnit.Assert.isTrue(firstItemDisposed, "The first page should have been disposed, but was not.");
disposing = true;
fv.dispose();
document.body.removeChild(fv.element);
complete();
}
call++;
});
fv.itemDataSource = list.dataSource;
};
}
(function () {
function generateTest(ds) {
return function (complete) {
var flipperElement = document.createElement('div'),
flipper;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
flipperElement.removeEventListener("pagecompleted", onComplete);
flipperElement.addEventListener("pagecompleted", function (ev) {
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
});
// Move a non-current item in datasource
flipper.itemDataSource.itemFromIndex(4).then(function (item) {
// Move the item to end
flipper.itemDataSource.moveToEnd(item.key).then(function () {
// Jump to the end
flipper.currentPage = 9;
});
});
};
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: ds,
onpagecompleted: onComplete,
itemTemplate: Helper.syncJSTemplate
});
}
}
var bl = Helper.createBindingList(10).dataSource;
FlipperInstantiationTests.prototype["testMoveItemAndJumpBL"] = generateTest(bl);
})();
(function () {
function generateTest(fromDS, toDS) {
return function (complete) {
var flipperElement = document.createElement('div'),
flipper;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
flipperElement.removeEventListener("pagecompleted", onComplete);
flipperElement.addEventListener("pagecompleted", function (ev) {
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
});
// Update the itemDataSource
flipper.itemDataSource = toDS;
};
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: fromDS,
onpageselected: onComplete,
itemTemplate: Helper.syncJSTemplate
});
}
}
var bl = Helper.createBindingList(10).dataSource,
vds = Helper.createTestDataSource(10),
emptyBL = Helper.createBindingList(0).dataSource,
emptyVDS = Helper.createTestDataSource(0);
FlipperInstantiationTests.prototype["testUpdateToEmptyBindingList"] = generateTest(vds, emptyBL);
FlipperInstantiationTests.prototype["testUpdateToEmptyVDS"] = generateTest(bl, emptyVDS);
})();
(function () {
function generateTest(currentPage) {
return function (complete) {
var element = document.createElement('div');
globTest.vds = Helper.createTestDataSource(20);
document.body.appendChild(element);
element.innerHTML = '
' +
'';
globTest.onComplete = WinJS.Utilities.markSupportedForProcessing(function (ev) {
// Verify
var flipper = element.querySelector(".flipperDiv").winControl;
LiveUnit.Assert.areEqual(flipper.currentPage, currentPage, "Flipper didn't instantiate at the expected page");
// Done
WinJS.Utilities.disposeSubTree(element);
document.body.removeChild(element);
complete();
});
WinJS.UI.processAll(element);
}
}
FlipperInstantiationTests.prototype["testHTMLInstantiationWithCurrentPageAtStart"] = generateTest(0);
FlipperInstantiationTests.prototype["testHTMLInstantiationWithCurrentPageAtMiddle"] = generateTest(10);
FlipperInstantiationTests.prototype["testHTMLInstantiationWithCurrentPageAtEnd"] = generateTest(19);
})();
(function () {
function generateTest(ds) {
return function (complete) {
var flipperElement = document.createElement('div'),
flipper;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
// Verify
flipper.count().then(function (count) {
LiveUnit.Assert.areEqual(0, count, "Unexpected flipper count");
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
}, function (er) {
LiveUnit.Assert.fail("Flipper failed to return count");
});
};
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: ds,
onpageselected: onComplete,
itemTemplate: Helper.syncJSTemplate
});
}
}
// Disabling the tests for now, as pageselected is never fired.
// Win8: 901271
FlipperInstantiationTests.prototype["xtestFlipViewEmptyBindingList"] = generateTest(Helper.createBindingList(0).dataSource);
FlipperInstantiationTests.prototype["xtestFlipViewEmptyVDS"] = generateTest(Helper.createTestDataSource(0));
})();
(function () {
function generateTest(ds, action) {
return function (complete) {
var flipperElement = document.createElement('div'),
flipper,
before,
after;
document.body.appendChild(flipperElement);
var onComplete = function (ev) {
flipperElement.removeEventListener("pagecompleted", onComplete);
// Grab the currently visible element
before = flipper._pageManager._currentPage.element.innerHTML;
flipperElement.addEventListener("pagecompleted", function (ev) {
// Grab the currently visible element and compare to the previously current element
after = flipper._pageManager._currentPage.element.innerHTML;
// Verify
LiveUnit.Assert.areEqual(after, before, "Current Page elements are different");
// Done
WinJS.Utilities.disposeSubTree(flipperElement);
document.body.removeChild(flipperElement);
complete();
});
// Perform action
action();
};
flipperElement.addEventListener("pagecompleted", onComplete);
flipper = new WinJS.UI.FlipView(flipperElement, {
itemDataSource: ds,
itemTemplate: Helper.syncJSTemplate
});
}
}
// I should be able to use datasources across tests
var bl = Helper.createBindingList(10),
vds = Helper.createTestDataSource(10),
setItemTemplate = function () {
var flipperElement = document.getElementsByClassName("win-flipview")[0],
flipper = flipperElement.winControl;
flipper.itemTemplate = flipper.itemTemplate;
},
setItemDataSource = function () {
var flipperElement = document.getElementsByClassName("win-flipview")[0],
flipper = flipperElement.winControl;
flipper.itemDataSource = flipper.itemDataSource;
};
FlipperInstantiationTests.prototype["testBindingListSetItemDataSource"] = generateTest(bl.dataSource, setItemDataSource);
FlipperInstantiationTests.prototype["testBindingListSetItemTemplate"] = generateTest(bl.dataSource, setItemTemplate);
FlipperInstantiationTests.prototype["testVDSSetItemDataSource"] = generateTest(vds, setItemDataSource);
FlipperInstantiationTests.prototype["testVDSSetItemTemplate"] = generateTest(vds, setItemTemplate);
})();
}
LiveUnit.registerTestClass("WinJSTests.FlipperInstantiationTests");