QUnit Testsuite

This commit is contained in:
Oliver Sartun 2013-05-27 17:53:06 +02:00
parent cc0aa25232
commit 8194590dcc
7 changed files with 15015 additions and 0 deletions

View File

@ -0,0 +1,20 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UndoManager Tests</title>
<link rel="stylesheet" href="resources/qunit.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="resources/jquery-1.9.1.js"></script>
<script src="resources/underscore.js"></script>
<script src="resources/backbone.js"></script>
<script src="../Backbone.Undo.js"></script>
<script src="resources/qunit.js"></script>
<script src="Backbone.Undo.Tests.js"></script>
</body>
</html>

View File

@ -0,0 +1,204 @@
var deferQueue = [];
function defer(fn) {
var args = [].slice.call(arguments);
deferQueue.push(fn, args);
}
function flushDeferQueue() {
_.defer(function () {
var fn = deferQueue.shift(),
args = deferQueue.shift();
if (fn) {
fn.apply(null, args);
flushDeferQueue();
}
})
}
test("Start and stop tracking", function () {
var UndoManager = new Backbone.UndoManager;
var model = new Backbone.Model({
"foo": "bar"
})
var collection = new Backbone.Collection([{"a": "b"}, {"c": "d"}]);
UndoManager.register(model, collection);
var before = UndoManager.stack.length;
model.set("hello", "world");
collection.add({"e": "f"});
strictEqual(UndoManager.stack.length, before, "Actions weren't added to the stack, because tracking hasn't strated yet");
UndoManager.startTracking();
model.set("hello", "you");
collection.remove(collection.last());
var after = UndoManager.stack.length;
strictEqual(after, 2, "Two actions have been added to the stack, because tracking has started");
UndoManager.stopTracking();
model.set("hello", "jude");
collection.add({"e": "f"});
model.set("hello", "you");
collection.remove(collection.last());
UndoManager.startTracking();
strictEqual(UndoManager.stack.length, after, "No actions were added, because tracking was paused");
})
asyncTest("Undo Redo Model-Changes", 7, function () {
var UndoManager = new Backbone.UndoManager,
model = new Backbone.Model({
"t": 1
}), i;
UndoManager.register(model);
UndoManager.startTracking();
model.set("t", 2);
deepEqual(model.toJSON(), {"t": 2}, "The model wasn't changed by the UndoManager yet");
UndoManager.undo();
deepEqual(model.toJSON(), {"t": 1}, "Undoing the last action changed the model expectedly");
UndoManager.redo();
deepEqual(model.toJSON(), {"t": 2}, "Redoing the last action changed the model expectedly")
defer(function () {
start();
// Undo / Redo several changes
for (i = 3; i < 10; i++) {
model.set("t", i);
}
UndoManager.undo();
equal(model.get("t"), 2, "Undoing all actions of one cycle succeeded");
UndoManager.redo();
equal(model.get("t"), 9, "Redoing all actions of one cycle succeeded");
stop();
})
defer(function () {
start();
// Undo newly set model-attributes
var before = model.toJSON();
model.set("new attribute", "Hi, what's up?");
var after = model.toJSON();
UndoManager.undo();
deepEqual(model.toJSON(), before, "Unsetting a new attribute by undoing its initial set succeeded");
UndoManager.redo();
deepEqual(model.toJSON(), after, "Setting a new attribute by redoing its unsetting succeeded");
})
flushDeferQueue();
});
asyncTest("Undo Redo Collection-Manipulation", 9, function () {
var UndoManager = new Backbone.UndoManager({"log":true}),
collection = new Backbone.Collection([{"t": 1}, {"t": 2}, {"t": 3}]);
function isSortOrderCorrect(c) {
for (var i = 1, l = c.length; i < l; i++) {
if (c.at(i).get("t") < c.at(i - 1).get("t")) {
return false;
}
}
return true;
}
UndoManager.register(collection);
UndoManager.startTracking();
collection.add({"t": 4});
equal(collection.length, 4, "The collection wasn't changed by the UndoManager");
UndoManager.undo();
equal(collection.length, 3, "Undoing adding a single model succeeded");
UndoManager.redo();
equal(collection.length, 4, "Redoing adding a single model succeeded");
defer(function () {
start();
collection.add([{"t": 5}, {"t": 6}]);
UndoManager.undo();
equal(collection.length, 4, "Undoing adding several models succeeded");
UndoManager.redo();
equal(collection.length, 6, "Redoing adding several models succeeded");
stop();
})
defer(function () {
start();
collection.add({"t": 7});
UndoManager.undo();
collection.add({"t": 8});
var length = collection.length;
UndoManager.redo();
equal(collection.length, length, "Redoing an action after the collection was changed had no effect");
stop();
})
defer(function () {
start();
var current = collection.toJSON();
collection.remove(collection.at(3));
UndoManager.undo();
deepEqual(collection.toJSON(), current, "The removed model was put back at the index where it was");
stop();
})
defer(function () {
start();
var before = collection.toJSON();
collection.reset([{"x": 1}, {"x": 2}]);
var after = collection.toJSON();
UndoManager.undo();
deepEqual(collection.toJSON(), before, "Undoing a reset succeeded");
UndoManager.redo();
deepEqual(collection.toJSON(), after, "Redoing a reset succeeded");
})
flushDeferQueue();
})

1571
Tests/resources/backbone.js Normal file

File diff suppressed because it is too large Load Diff

9597
Tests/resources/jquery-1.9.1.js vendored Normal file

File diff suppressed because it is too large Load Diff

244
Tests/resources/qunit.css Normal file
View File

@ -0,0 +1,244 @@
/**
* QUnit v1.11.0 - A JavaScript Unit Testing Framework
*
* http://qunitjs.com
*
* Copyright 2012 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*/
/** Font Family and Sizes */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
}
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
#qunit-tests { font-size: smaller; }
/** Resets */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
/** Header */
#qunit-header {
padding: 0.5em 0 0.5em 1em;
color: #8699a4;
background-color: #0d3349;
font-size: 1.5em;
line-height: 1em;
font-weight: normal;
border-radius: 5px 5px 0 0;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-top-right-radius: 5px;
-webkit-border-top-left-radius: 5px;
}
#qunit-header a {
text-decoration: none;
color: #c2ccd1;
}
#qunit-header a:hover,
#qunit-header a:focus {
color: #fff;
}
#qunit-testrunner-toolbar label {
display: inline-block;
padding: 0 .5em 0 .1em;
}
#qunit-banner {
height: 5px;
}
#qunit-testrunner-toolbar {
padding: 0.5em 0 0.5em 2em;
color: #5E740B;
background-color: #eee;
overflow: hidden;
}
#qunit-userAgent {
padding: 0.5em 0 0.5em 2.5em;
background-color: #2b81af;
color: #fff;
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
}
#qunit-modulefilter-container {
float: right;
}
/** Tests: Pass/Fail */
#qunit-tests {
list-style-position: inside;
}
#qunit-tests li {
padding: 0.4em 0.5em 0.4em 2.5em;
border-bottom: 1px solid #fff;
list-style-position: inside;
}
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
display: none;
}
#qunit-tests li strong {
cursor: pointer;
}
#qunit-tests li a {
padding: 0.5em;
color: #c2ccd1;
text-decoration: none;
}
#qunit-tests li a:hover,
#qunit-tests li a:focus {
color: #000;
}
#qunit-tests li .runtime {
float: right;
font-size: smaller;
}
.qunit-assert-list {
margin-top: 0.5em;
padding: 0.5em;
background-color: #fff;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
.qunit-collapsed {
display: none;
}
#qunit-tests table {
border-collapse: collapse;
margin-top: .2em;
}
#qunit-tests th {
text-align: right;
vertical-align: top;
padding: 0 .5em 0 0;
}
#qunit-tests td {
vertical-align: top;
}
#qunit-tests pre {
margin: 0;
white-space: pre-wrap;
word-wrap: break-word;
}
#qunit-tests del {
background-color: #e0f2be;
color: #374e0c;
text-decoration: none;
}
#qunit-tests ins {
background-color: #ffcaca;
color: #500;
text-decoration: none;
}
/*** Test Counts */
#qunit-tests b.counts { color: black; }
#qunit-tests b.passed { color: #5E740B; }
#qunit-tests b.failed { color: #710909; }
#qunit-tests li li {
padding: 5px;
background-color: #fff;
border-bottom: none;
list-style-position: inside;
}
/*** Passing Styles */
#qunit-tests li li.pass {
color: #3c510c;
background-color: #fff;
border-left: 10px solid #C6E746;
}
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
#qunit-tests .pass .test-name { color: #366097; }
#qunit-tests .pass .test-actual,
#qunit-tests .pass .test-expected { color: #999999; }
#qunit-banner.qunit-pass { background-color: #C6E746; }
/*** Failing Styles */
#qunit-tests li li.fail {
color: #710909;
background-color: #fff;
border-left: 10px solid #EE5757;
white-space: pre;
}
#qunit-tests > li:last-child {
border-radius: 0 0 5px 5px;
-moz-border-radius: 0 0 5px 5px;
-webkit-border-bottom-right-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
}
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
#qunit-tests .fail .test-name,
#qunit-tests .fail .module-name { color: #000000; }
#qunit-tests .fail .test-actual { color: #EE5757; }
#qunit-tests .fail .test-expected { color: green; }
#qunit-banner.qunit-fail { background-color: #EE5757; }
/** Result */
#qunit-testresult {
padding: 0.5em 0.5em 0.5em 2.5em;
color: #2b81af;
background-color: #D2E0E6;
border-bottom: 1px solid white;
}
#qunit-testresult .module-name {
font-weight: bold;
}
/** Fixture */
#qunit-fixture {
position: absolute;
top: -10000px;
left: -10000px;
width: 1000px;
height: 1000px;
}

2152
Tests/resources/qunit.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff