<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Swarm QUnit Test Runner</title>
<link rel="stylesheet" href="/vendor/qunit-1.14.0.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="/vendor/qunit-1.14.0.js"></script>
<script src="/vendor/jquery/jquery-1.11.1.min.js"></script>
<!-- @TODO: Use dependency injection for tests -->
<script src="/vendor/bootstrap/js/bootstrap.js"></script>
<script src="/vendor/jsrender/jsrender.js"></script>
<script src="/swarm/js/application.js"></script>
<script src="/libs/utils.js"></script>
<script src="/libs/testConfig.js"></script>
<script>
/* PHANTOMJS PATCH */
// detect partial history support and add History.state property
if (swarm.has.partialHistorySupport()) {
swarm.history.patchPartialSuppport();
}
/* "swarm.history" TEST MODULE */
(function() {
// define the module
module('swarm.history', {
setup: function() {
this.url = document.location.href;
this.stateLength = 0;
this.pushState = swarm.history.pushState;
var environment = this;
swarm.history.pushState = function() {
environment.pushState.apply(this, arguments);
environment.stateLength++;
};
// start tests in a known state
$(window).off('beforeSetState');
window.history.replaceState(null, null, this.url);
swarm.history.init();
},
teardown: function() {
swarm.history.pushState = this.pushState;
$(window).off('popstate');
$(window).off('beforeSetState');
swarm.test.reset();
// clear out any previous state
if (this.stateLength) {
var url = this.url;
$(window).one('popstate', function() {
setTimeout(function() {
swarm.history.pushState(null, null, url, true);
start();
}, 0);
});
stop();
window.history.go(this.stateLength * -1);
} else {
swarm.history.replaceState(null, null, this.url, true);
}
delete this.url;
delete this.stateLength;
delete this.pushState;
}
});
// define scoped helper functions for ease of use in tests
var go = function(distance, callback) {
swarm.test.push(function(distance, callback) {
this.testEnvironment.stateLength = this.testEnvironment.stateLength + distance;
// leave time for navigation
var testEnvironment = this.testEnvironment;
$(window).one('popstate', function() {
setTimeout(function() {
callback.call(testEnvironment, QUnit.assert);
swarm.test.nextQueued();
}, 0);
});
window.history.go(distance);
}, [distance, callback]);
};
// write our tests
test('supported', 1, function() {
ok(swarm.history.supported);
});
test('initialized', 1, function() {
swarm.history.initialized = false;
swarm.history.init();
ok(swarm.history.initialized);
});
test('replaceState', 7, function() {
var url = document.location.href,
initial = { step: 1, value1: true },
default1 = { step: 2, value2: false },
state1 = { step: 2, value2: false, value3: true },
default2 = { step: 4, value3: false },
state2 = { step: 4, value2: false, value3: false };
// test just setting the state
swarm.history.replaceState(initial, null, null);
deepEqual(window.history.state, initial);
equal(document.location.href, url);
// test setting path
swarm.history.replaceState(default1, null, '#extra');
deepEqual(window.history.state, default1);
equal(document.location.hash, '#extra');
// test using default state
$(window).on('beforeSetState', function(e, defaults) { $.extend(defaults, default1); });
swarm.history.replaceState({step: 2, value3: true}, null, null);
deepEqual(window.history.state, state1);
// test multiple default state
$(window).on('beforeSetState', function(e, defaults) { $.extend(defaults, default2); });
swarm.history.replaceState(null, null, null);
deepEqual(window.history.state, state2);
// test clearing the current state
swarm.history.clearState();
equal(window.history.state, null);
});
test('pushState', 12, function() {
// stop to test async code
stop();
var url = document.location.href,
initial = { step: 1, value1: true },
default1 = { step: 2, value1: false },
state1 = { step: 2, value1: false, value3: true };
// test just setting the state
swarm.history.pushState(initial, null, null);
deepEqual(window.history.state, initial);
equal(document.location.href, url);
// test setting the path
swarm.history.pushState(default1, null, '#extra');
deepEqual(window.history.state, default1);
equal(document.location.hash, '#extra');
// test using default state
$(window).on('beforeSetState', function(e, defaults) { $.extend(defaults, default1); });
swarm.history.pushState({step: 2, value3: true}, null, '#moreExtra');
deepEqual(window.history.state, state1);
equal(document.location.hash, '#moreExtra');
// test clearing the current state
swarm.history.clearState();
equal(window.history.state, null);
equal(document.location.hash, '#moreExtra');
// test back navigation
go(-2, function() {
deepEqual(window.history.state, initial);
equal(document.location.hash, '');
});
// test forward nav
go(1, function() {
deepEqual(window.history.state, default1);
equal(document.location.hash, '#extra');
});
// start only after queued items are finished
queueStart();
});
test('popstate', 2, function() {
// stop to test async code
stop();
var popped = false,
knownState = {key:'value'};
swarm.history.replaceState(knownState);
swarm.history.pushState(null, null, null);
swarm.history.onPopState(function() {
popped = true;
});
go(-1, function() {
deepEqual(window.history.state, knownState);
equal(popped, true);
});
// start only after queued items are finished
queueStart();
});
}());
/* End OF "swarm.history" TEST MODULE */
</script>
</body>
</html>