QUnit Testsuite
This commit is contained in:
parent
cc0aa25232
commit
8194590dcc
20
Tests/Backbone.Undo.Tests.html
Normal file
20
Tests/Backbone.Undo.Tests.html
Normal 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>
|
204
Tests/Backbone.Undo.Tests.js
Normal file
204
Tests/Backbone.Undo.Tests.js
Normal 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
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
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
244
Tests/resources/qunit.css
Normal 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
2152
Tests/resources/qunit.js
Normal file
File diff suppressed because it is too large
Load Diff
1227
Tests/resources/underscore.js
Normal file
1227
Tests/resources/underscore.js
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user