adding jasmine tests
This commit is contained in:
parent
32edfd4e80
commit
1ae28723eb
19 changed files with 4310 additions and 14 deletions
19
Makefile
Normal file → Executable file
19
Makefile
Normal file → Executable file
|
@ -1,3 +1,6 @@
|
||||||
|
#
|
||||||
|
# build package & update examples
|
||||||
|
#
|
||||||
|
|
||||||
build:
|
build:
|
||||||
@echo "Running jshint..."
|
@echo "Running jshint..."
|
||||||
|
@ -24,6 +27,22 @@ build:
|
||||||
@cp -r comicbook examples
|
@cp -r comicbook examples
|
||||||
@echo "Done"
|
@echo "Done"
|
||||||
|
|
||||||
|
#
|
||||||
|
# run jshint & jasmine tests
|
||||||
|
#
|
||||||
|
|
||||||
|
test:
|
||||||
|
@./node_modules/.bin/jshint lib/ComicBook.js --config lib/.jshintrc
|
||||||
|
@./node_modules/.bin/jshint lib/tests/spec/*.js --config lib/.jshintrc
|
||||||
|
@node lib/tests/server.js &
|
||||||
|
@./node_modules/.bin/phantomjs lib/tests/run-jasmine.js http://127.0.0.1:3000/lib/tests/SpecRunner.html
|
||||||
|
@kill -9 `cat lib/tests/pid.txt`
|
||||||
|
@rm lib/tests/pid.txt
|
||||||
|
|
||||||
|
#
|
||||||
|
# remove prior builds
|
||||||
|
#
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -r comicbook
|
@rm -r comicbook
|
||||||
@rm -r examples/comicbook
|
@rm -r examples/comicbook
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
- full browser test - IE9 / FF3.6+ / Chrome / Safari / Opera
|
- full browser test - IE9 / FF3.6+ / Chrome / Safari / Opera
|
||||||
|
|
||||||
Nice 2 have:
|
Nice 2 have:
|
||||||
|
- remove image inhancement lag when navigating by pre-applying enhancements to other pages
|
||||||
- jump to page?
|
- jump to page?
|
||||||
- make page draggable with the cursor
|
- make page draggable with the cursor
|
||||||
- enable menu items via config, allow for custom items
|
- enable menu items via config, allow for custom items
|
||||||
|
@ -22,7 +23,6 @@
|
||||||
- use custom event emitters instead of hacky code
|
- use custom event emitters instead of hacky code
|
||||||
- properly bind 'this' so we don't have to keep using 'self'
|
- properly bind 'this' so we don't have to keep using 'self'
|
||||||
- allow toolbar to be sticky
|
- allow toolbar to be sticky
|
||||||
- unit test / integrate with travis CI
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var ComicBook = (function ($) {
|
var ComicBook = (function ($) {
|
||||||
|
@ -218,22 +218,22 @@ var ComicBook = (function ($) {
|
||||||
this.controls = controls;
|
this.controls = controls;
|
||||||
};
|
};
|
||||||
|
|
||||||
ComicBook.prototype.getControl = function(control) {
|
ComicBook.prototype.getControl = function (control) {
|
||||||
if (typeof this.controls[control] !== 'object') {
|
if (typeof this.controls[control] !== 'object') {
|
||||||
throw ComicBookException.UNDEFINED_CONTROL + ' ' + control;
|
throw ComicBookException.UNDEFINED_CONTROL + ' ' + control;
|
||||||
}
|
}
|
||||||
return this.controls[control];
|
return this.controls[control];
|
||||||
};
|
};
|
||||||
|
|
||||||
ComicBook.prototype.showControl = function(control) {
|
ComicBook.prototype.showControl = function (control) {
|
||||||
this.getControl(control).show().addClass('open');
|
this.getControl(control).show().addClass('open');
|
||||||
};
|
};
|
||||||
|
|
||||||
ComicBook.prototype.hideControl = function(control) {
|
ComicBook.prototype.hideControl = function (control) {
|
||||||
this.getControl(control).removeClass('open').hide();
|
this.getControl(control).removeClass('open').hide();
|
||||||
};
|
};
|
||||||
|
|
||||||
ComicBook.prototype.toggleControl = function(control) {
|
ComicBook.prototype.toggleControl = function (control) {
|
||||||
this.getControl(control).toggle().toggleClass('open');
|
this.getControl(control).toggle().toggleClass('open');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -255,7 +255,7 @@ var ComicBook = (function ($) {
|
||||||
*
|
*
|
||||||
* @return Image
|
* @return Image
|
||||||
*/
|
*/
|
||||||
ComicBook.prototype.getPage = function(i) {
|
ComicBook.prototype.getPage = function (i) {
|
||||||
|
|
||||||
if (i < 0 || i > srcs.length-1) {
|
if (i < 0 || i > srcs.length-1) {
|
||||||
throw ComicBookException.INVALID_PAGE + ' ' + i;
|
throw ComicBookException.INVALID_PAGE + ' ' + i;
|
||||||
|
|
59
lib/tests/SpecRunner.html
Executable file
59
lib/tests/SpecRunner.html
Executable file
|
@ -0,0 +1,59 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Jasmine Spec Runner</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="vendor/jasmine/jasmine.css">
|
||||||
|
<script type="text/javascript" src="vendor/jasmine/jasmine.js"></script>
|
||||||
|
<script type="text/javascript" src="vendor/jasmine/jasmine-html.js"></script>
|
||||||
|
<script type="text/javascript" src="vendor/jasmine-jquery.js"></script>
|
||||||
|
|
||||||
|
<!-- include source files here... -->
|
||||||
|
<script src="../vendor/jquery-2.0.0.min.js"></script>
|
||||||
|
<script src="../vendor/pixastic/pixastic.js"></script>
|
||||||
|
<script src="../vendor/pixastic/pixastic.effects.js"></script>
|
||||||
|
<script src="../vendor/pixastic/pixastic.worker.js"></script>
|
||||||
|
<script src="../vendor/handlebars.runtime-1.0.rc.1.min.js"></script>
|
||||||
|
<script src="../templates.js"></script>
|
||||||
|
<script src="../ComicBook.js"></script>
|
||||||
|
|
||||||
|
<!-- include spec files here... -->
|
||||||
|
<script type="text/javascript" src="spec/ComicBookSpec.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
jasmine.getFixtures().fixturesPath = 'fixtures';
|
||||||
|
|
||||||
|
var jasmineEnv = jasmine.getEnv();
|
||||||
|
jasmineEnv.updateInterval = 1000;
|
||||||
|
|
||||||
|
var htmlReporter = new jasmine.HtmlReporter();
|
||||||
|
|
||||||
|
jasmineEnv.addReporter(htmlReporter);
|
||||||
|
|
||||||
|
jasmineEnv.specFilter = function(spec) {
|
||||||
|
return htmlReporter.specFilter(spec);
|
||||||
|
};
|
||||||
|
|
||||||
|
var currentWindowOnload = window.onload;
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
if (currentWindowOnload) {
|
||||||
|
currentWindowOnload();
|
||||||
|
}
|
||||||
|
execJasmine();
|
||||||
|
};
|
||||||
|
|
||||||
|
function execJasmine() {
|
||||||
|
jasmineEnv.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
lib/tests/img/1.png
Executable file
BIN
lib/tests/img/1.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
lib/tests/img/2.png
Executable file
BIN
lib/tests/img/2.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
lib/tests/img/3.png
Executable file
BIN
lib/tests/img/3.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
lib/tests/img/4.png
Executable file
BIN
lib/tests/img/4.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
lib/tests/img/5.png
Executable file
BIN
lib/tests/img/5.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
BIN
lib/tests/img/6.png
Executable file
BIN
lib/tests/img/6.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
86
lib/tests/run-jasmine.js
Executable file
86
lib/tests/run-jasmine.js
Executable file
|
@ -0,0 +1,86 @@
|
||||||
|
var system = require('system');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait until the test condition is true or a timeout occurs. Useful for waiting
|
||||||
|
* on a server response or for a ui change (fadeIn, etc.) to occur.
|
||||||
|
*
|
||||||
|
* @param testFx javascript condition that evaluates to a boolean,
|
||||||
|
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||||
|
* as a callback function.
|
||||||
|
* @param onReady what to do when testFx condition is fulfilled,
|
||||||
|
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||||
|
* as a callback function.
|
||||||
|
* @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
|
||||||
|
*/
|
||||||
|
function waitFor(testFx, onReady, timeOutMillis) {
|
||||||
|
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timeout is 3s
|
||||||
|
start = new Date().getTime(),
|
||||||
|
condition = false,
|
||||||
|
interval = setInterval(function() {
|
||||||
|
if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
|
||||||
|
// If not time-out yet and condition not yet fulfilled
|
||||||
|
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
|
||||||
|
} else {
|
||||||
|
if(!condition) {
|
||||||
|
// If condition still not fulfilled (timeout but condition is 'false')
|
||||||
|
console.log("'waitFor()' timeout");
|
||||||
|
phantom.exit(1);
|
||||||
|
} else {
|
||||||
|
// Condition fulfilled (timeout and/or condition is 'true')
|
||||||
|
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
|
||||||
|
typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
|
||||||
|
clearInterval(interval); //< Stop this interval
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 100); //< repeat check every 100ms
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
if (system.args.length !== 2) {
|
||||||
|
console.log('Usage: run-jasmine.js URL');
|
||||||
|
phantom.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var page = require('webpage').create();
|
||||||
|
|
||||||
|
// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||||
|
page.onConsoleMessage = function(msg) {
|
||||||
|
console.log(msg);
|
||||||
|
};
|
||||||
|
|
||||||
|
page.open(system.args[1], function(status){
|
||||||
|
if (status !== "success") {
|
||||||
|
console.log("Unable to access network");
|
||||||
|
phantom.exit();
|
||||||
|
} else {
|
||||||
|
waitFor(function(){
|
||||||
|
return page.evaluate(function(){
|
||||||
|
return document.body.querySelector('.symbolSummary .pending') === null
|
||||||
|
});
|
||||||
|
}, function(){
|
||||||
|
var exitCode = page.evaluate(function(){
|
||||||
|
console.log('');
|
||||||
|
console.log(document.body.querySelector('.description').innerText);
|
||||||
|
var list = document.body.querySelectorAll('.results > #details > .specDetail.failed');
|
||||||
|
if (list && list.length > 0) {
|
||||||
|
console.log('');
|
||||||
|
console.log(list.length + ' test(s) FAILED:');
|
||||||
|
for (i = 0; i < list.length; ++i) {
|
||||||
|
var el = list[i],
|
||||||
|
desc = el.querySelector('.description'),
|
||||||
|
msg = el.querySelector('.resultMessage.fail');
|
||||||
|
console.log('');
|
||||||
|
console.log(desc.innerText);
|
||||||
|
console.log(msg.innerText);
|
||||||
|
console.log('');
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
phantom.exit(exitCode);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
25
lib/tests/server.js
Executable file
25
lib/tests/server.js
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Simple connect server for phantom.js
|
||||||
|
* Adapted from Twitter Bootstrap
|
||||||
|
*/
|
||||||
|
|
||||||
|
var connect = require('connect'),
|
||||||
|
http = require('http'),
|
||||||
|
fs = require('fs'),
|
||||||
|
app = connect(),
|
||||||
|
pid_path = __dirname + '/pid.txt';
|
||||||
|
|
||||||
|
// clean up after failed test runs
|
||||||
|
if (fs.existsSync(pid_path)) {
|
||||||
|
try {
|
||||||
|
var pid = fs.readFileSync(pid_path, { encoding: 'utf-8' });
|
||||||
|
process.kill(pid, 'SIGHUP');
|
||||||
|
} catch (e) {}
|
||||||
|
fs.unlinkSync(pid_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
app.use(connect.static(__dirname + '/../../'));
|
||||||
|
|
||||||
|
http.createServer(app).listen(3000);
|
||||||
|
|
||||||
|
fs.writeFileSync(pid_path, process.pid, 'utf-8');
|
57
lib/tests/spec/ComicBookSpec.js
Executable file
57
lib/tests/spec/ComicBookSpec.js
Executable file
|
@ -0,0 +1,57 @@
|
||||||
|
/* global ComicBook: false, describe: false, beforeEach: false, setFixtures: false, it: false, expect: false */
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('ComicBook', function () {
|
||||||
|
|
||||||
|
var book;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
|
||||||
|
setFixtures('<canvas id="comic"></canvas>');
|
||||||
|
|
||||||
|
book = new ComicBook(
|
||||||
|
'comic',
|
||||||
|
['img/1.png','img/2.png','img/3.png','img/4.png','img/5.png','img/6.png'],
|
||||||
|
{ libPath: '../vendor/' }
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render all controls on draw', function () {
|
||||||
|
expect($('.cb-control, .toolbar').length).toBe(0);
|
||||||
|
book.draw();
|
||||||
|
expect($('.cb-control, .toolbar').length).toBe(5);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should navigate between pages when the navigation links are clicked', function () {
|
||||||
|
book.draw();
|
||||||
|
$('.navigate.left').click();
|
||||||
|
book.drawNextPage();
|
||||||
|
|
||||||
|
// console.log(book)
|
||||||
|
// console.log($(window))
|
||||||
|
});
|
||||||
|
|
||||||
|
// navigate on keyboard
|
||||||
|
// don't navigate if nothing left
|
||||||
|
// show current page
|
||||||
|
// customise keyboard control
|
||||||
|
// dropdown menus
|
||||||
|
// apply effects
|
||||||
|
// maximise
|
||||||
|
// minimise
|
||||||
|
// fit width
|
||||||
|
// single page / double page
|
||||||
|
// single page should allow double page spreads
|
||||||
|
// preloading
|
||||||
|
// update hash
|
||||||
|
// resume based on hash
|
||||||
|
// load from middle of page
|
||||||
|
// emit custom events based on data-attributes
|
||||||
|
// destroy
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
658
lib/tests/vendor/jasmine-jquery.js
vendored
Executable file
658
lib/tests/vendor/jasmine-jquery.js
vendored
Executable file
|
@ -0,0 +1,658 @@
|
||||||
|
/*!
|
||||||
|
Jasmine-jQuery: a set of jQuery helpers for Jasmine tests.
|
||||||
|
|
||||||
|
Version 1.5.1
|
||||||
|
|
||||||
|
https://github.com/velesin/jasmine-jquery
|
||||||
|
|
||||||
|
Copyright (c) 2010-2013 Wojciech Zawistowski, Travis Jeffery
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
var readFixtures = function() {
|
||||||
|
return jasmine.getFixtures().proxyCallTo_('read', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var preloadFixtures = function() {
|
||||||
|
jasmine.getFixtures().proxyCallTo_('preload', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var loadFixtures = function() {
|
||||||
|
jasmine.getFixtures().proxyCallTo_('load', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var appendLoadFixtures = function() {
|
||||||
|
jasmine.getFixtures().proxyCallTo_('appendLoad', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var setFixtures = function(html) {
|
||||||
|
jasmine.getFixtures().proxyCallTo_('set', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var appendSetFixtures = function() {
|
||||||
|
jasmine.getFixtures().proxyCallTo_('appendSet', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var sandbox = function(attributes) {
|
||||||
|
return jasmine.getFixtures().sandbox(attributes)
|
||||||
|
}
|
||||||
|
|
||||||
|
var spyOnEvent = function(selector, eventName) {
|
||||||
|
return jasmine.JQuery.events.spyOn(selector, eventName)
|
||||||
|
}
|
||||||
|
|
||||||
|
var preloadStyleFixtures = function() {
|
||||||
|
jasmine.getStyleFixtures().proxyCallTo_('preload', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var loadStyleFixtures = function() {
|
||||||
|
jasmine.getStyleFixtures().proxyCallTo_('load', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var appendLoadStyleFixtures = function() {
|
||||||
|
jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var setStyleFixtures = function(html) {
|
||||||
|
jasmine.getStyleFixtures().proxyCallTo_('set', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var appendSetStyleFixtures = function(html) {
|
||||||
|
jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var loadJSONFixtures = function() {
|
||||||
|
return jasmine.getJSONFixtures().proxyCallTo_('load', arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
var getJSONFixture = function(url) {
|
||||||
|
return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url]
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.spiedEventsKey = function (selector, eventName) {
|
||||||
|
return [$(selector).selector, eventName].toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.getFixtures = function() {
|
||||||
|
return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.getStyleFixtures = function() {
|
||||||
|
return jasmine.currentStyleFixtures_ = jasmine.currentStyleFixtures_ || new jasmine.StyleFixtures()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures = function() {
|
||||||
|
this.containerId = 'jasmine-fixtures'
|
||||||
|
this.fixturesCache_ = {}
|
||||||
|
this.fixturesPath = 'spec/javascripts/fixtures'
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.set = function(html) {
|
||||||
|
this.cleanUp()
|
||||||
|
this.createContainer_(html)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.appendSet= function(html) {
|
||||||
|
this.addToContainer_(html)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.preload = function() {
|
||||||
|
this.read.apply(this, arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.load = function() {
|
||||||
|
this.cleanUp()
|
||||||
|
this.createContainer_(this.read.apply(this, arguments))
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.appendLoad = function() {
|
||||||
|
this.addToContainer_(this.read.apply(this, arguments))
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.read = function() {
|
||||||
|
var htmlChunks = []
|
||||||
|
|
||||||
|
var fixtureUrls = arguments
|
||||||
|
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
|
||||||
|
htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]))
|
||||||
|
}
|
||||||
|
|
||||||
|
return htmlChunks.join('')
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.clearCache = function() {
|
||||||
|
this.fixturesCache_ = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.cleanUp = function() {
|
||||||
|
$('#' + this.containerId).remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.sandbox = function(attributes) {
|
||||||
|
var attributesToSet = attributes || {}
|
||||||
|
return $('<div id="sandbox" />').attr(attributesToSet)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.createContainer_ = function(html) {
|
||||||
|
var container
|
||||||
|
if(html instanceof $) {
|
||||||
|
container = $('<div id="' + this.containerId + '" />')
|
||||||
|
container.html(html)
|
||||||
|
} else {
|
||||||
|
container = '<div id="' + this.containerId + '">' + html + '</div>'
|
||||||
|
}
|
||||||
|
$(document.body).append(container)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.addToContainer_ = function(html){
|
||||||
|
var container = $(document.body).find('#'+this.containerId).append(html)
|
||||||
|
if(!container.length){
|
||||||
|
this.createContainer_(html)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
|
||||||
|
if (typeof this.fixturesCache_[url] === 'undefined') {
|
||||||
|
this.loadFixtureIntoCache_(url)
|
||||||
|
}
|
||||||
|
return this.fixturesCache_[url]
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
|
||||||
|
var url = this.makeFixtureUrl_(relativeUrl)
|
||||||
|
var request = $.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: url + "?" + new Date().getTime(),
|
||||||
|
async: false
|
||||||
|
})
|
||||||
|
this.fixturesCache_[relativeUrl] = request.responseText
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){
|
||||||
|
return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
|
||||||
|
return this[methodName].apply(this, passedArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
jasmine.StyleFixtures = function() {
|
||||||
|
this.fixturesCache_ = {}
|
||||||
|
this.fixturesNodes_ = []
|
||||||
|
this.fixturesPath = 'spec/javascripts/fixtures'
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.set = function(css) {
|
||||||
|
this.cleanUp()
|
||||||
|
this.createStyle_(css)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.appendSet = function(css) {
|
||||||
|
this.createStyle_(css)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.preload = function() {
|
||||||
|
this.read_.apply(this, arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.load = function() {
|
||||||
|
this.cleanUp()
|
||||||
|
this.createStyle_(this.read_.apply(this, arguments))
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.appendLoad = function() {
|
||||||
|
this.createStyle_(this.read_.apply(this, arguments))
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.cleanUp = function() {
|
||||||
|
while(this.fixturesNodes_.length) {
|
||||||
|
this.fixturesNodes_.pop().remove()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.createStyle_ = function(html) {
|
||||||
|
var styleText = $('<div></div>').html(html).text(),
|
||||||
|
style = $('<style>' + styleText + '</style>')
|
||||||
|
|
||||||
|
this.fixturesNodes_.push(style)
|
||||||
|
|
||||||
|
$('head').append(style)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.clearCache = jasmine.Fixtures.prototype.clearCache
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.read_ = jasmine.Fixtures.prototype.read
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.getFixtureHtml_ = jasmine.Fixtures.prototype.getFixtureHtml_
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.loadFixtureIntoCache_ = jasmine.Fixtures.prototype.loadFixtureIntoCache_
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.makeFixtureUrl_ = jasmine.Fixtures.prototype.makeFixtureUrl_
|
||||||
|
|
||||||
|
jasmine.StyleFixtures.prototype.proxyCallTo_ = jasmine.Fixtures.prototype.proxyCallTo_
|
||||||
|
|
||||||
|
jasmine.getJSONFixtures = function() {
|
||||||
|
return jasmine.currentJSONFixtures_ = jasmine.currentJSONFixtures_ || new jasmine.JSONFixtures()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures = function() {
|
||||||
|
this.fixturesCache_ = {}
|
||||||
|
this.fixturesPath = 'spec/javascripts/fixtures/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures.prototype.load = function() {
|
||||||
|
this.read.apply(this, arguments)
|
||||||
|
return this.fixturesCache_
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures.prototype.read = function() {
|
||||||
|
var fixtureUrls = arguments
|
||||||
|
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
|
||||||
|
this.getFixtureData_(fixtureUrls[urlIndex])
|
||||||
|
}
|
||||||
|
return this.fixturesCache_
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures.prototype.clearCache = function() {
|
||||||
|
this.fixturesCache_ = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures.prototype.getFixtureData_ = function(url) {
|
||||||
|
this.loadFixtureIntoCache_(url)
|
||||||
|
return this.fixturesCache_[url]
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
|
||||||
|
var self = this
|
||||||
|
var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
|
||||||
|
$.ajax({
|
||||||
|
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
|
||||||
|
cache: false,
|
||||||
|
dataType: 'json',
|
||||||
|
url: url,
|
||||||
|
success: function(data) {
|
||||||
|
self.fixturesCache_[relativeUrl] = data
|
||||||
|
},
|
||||||
|
error: function(jqXHR, status, errorThrown) {
|
||||||
|
throw Error('JSONFixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JSONFixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
|
||||||
|
return this[methodName].apply(this, passedArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JQuery = function() {}
|
||||||
|
|
||||||
|
jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
|
||||||
|
return $('<div/>').append(html).html()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JQuery.elementToString = function(element) {
|
||||||
|
var domEl = $(element).get(0)
|
||||||
|
if (domEl == undefined || domEl.cloneNode)
|
||||||
|
return $('<div />').append($(element).clone()).html()
|
||||||
|
else
|
||||||
|
return element.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.JQuery.matchersClass = {}
|
||||||
|
|
||||||
|
!function(namespace) {
|
||||||
|
var data = {
|
||||||
|
spiedEvents: {},
|
||||||
|
handlers: []
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace.events = {
|
||||||
|
spyOn: function(selector, eventName) {
|
||||||
|
var handler = function(e) {
|
||||||
|
data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = jasmine.util.argsToArray(arguments)
|
||||||
|
}
|
||||||
|
$(selector).on(eventName, handler)
|
||||||
|
data.handlers.push(handler)
|
||||||
|
return {
|
||||||
|
selector: selector,
|
||||||
|
eventName: eventName,
|
||||||
|
handler: handler,
|
||||||
|
reset: function(){
|
||||||
|
delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
args: function(selector, eventName) {
|
||||||
|
var actualArgs = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)];
|
||||||
|
|
||||||
|
if (!actualArgs) {
|
||||||
|
throw "There is no spy for " + eventName + " on " + selector.toString() + ". Make sure to create a spy using spyOnEvent.";
|
||||||
|
}
|
||||||
|
|
||||||
|
return actualArgs;
|
||||||
|
},
|
||||||
|
|
||||||
|
wasTriggered: function(selector, eventName) {
|
||||||
|
return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)])
|
||||||
|
},
|
||||||
|
|
||||||
|
wasTriggeredWith: function(selector, eventName, expectedArgs, env) {
|
||||||
|
var actualArgs = jasmine.JQuery.events.args(selector, eventName).slice(1);
|
||||||
|
if (Object.prototype.toString.call(expectedArgs) !== '[object Array]') {
|
||||||
|
actualArgs = actualArgs[0];
|
||||||
|
}
|
||||||
|
return env.equals_(expectedArgs, actualArgs);
|
||||||
|
},
|
||||||
|
|
||||||
|
wasPrevented: function(selector, eventName) {
|
||||||
|
var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)],
|
||||||
|
e = args ? args[0] : undefined;
|
||||||
|
return e && e.isDefaultPrevented()
|
||||||
|
},
|
||||||
|
|
||||||
|
wasStopped: function(selector, eventName) {
|
||||||
|
var e;
|
||||||
|
return (e = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]) && e.isPropagationStopped()
|
||||||
|
},
|
||||||
|
|
||||||
|
cleanUp: function() {
|
||||||
|
data.spiedEvents = {}
|
||||||
|
data.handlers = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(jasmine.JQuery)
|
||||||
|
|
||||||
|
!function(){
|
||||||
|
var jQueryMatchers = {
|
||||||
|
toHaveClass: function(className) {
|
||||||
|
return this.actual.hasClass(className)
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveCss: function(css){
|
||||||
|
for (var prop in css){
|
||||||
|
if (this.actual.css(prop) !== css[prop]) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeVisible: function() {
|
||||||
|
return this.actual.is(':visible')
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeHidden: function() {
|
||||||
|
return this.actual.is(':hidden')
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeSelected: function() {
|
||||||
|
return this.actual.is(':selected')
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeChecked: function() {
|
||||||
|
return this.actual.is(':checked')
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeEmpty: function() {
|
||||||
|
return this.actual.is(':empty')
|
||||||
|
},
|
||||||
|
|
||||||
|
toExist: function() {
|
||||||
|
return $(document).find(this.actual).length
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveLength: function(length) {
|
||||||
|
return this.actual.length === length
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveAttr: function(attributeName, expectedAttributeValue) {
|
||||||
|
return hasProperty(this.actual.attr(attributeName), expectedAttributeValue)
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveProp: function(propertyName, expectedPropertyValue) {
|
||||||
|
return hasProperty(this.actual.prop(propertyName), expectedPropertyValue)
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveId: function(id) {
|
||||||
|
return this.actual.attr('id') == id
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveHtml: function(html) {
|
||||||
|
return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html)
|
||||||
|
},
|
||||||
|
|
||||||
|
toContainHtml: function(html){
|
||||||
|
var actualHtml = this.actual.html()
|
||||||
|
var expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html)
|
||||||
|
return (actualHtml.indexOf(expectedHtml) >= 0)
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveText: function(text) {
|
||||||
|
var trimmedText = $.trim(this.actual.text())
|
||||||
|
if (text && $.isFunction(text.test)) {
|
||||||
|
return text.test(trimmedText)
|
||||||
|
} else {
|
||||||
|
return trimmedText == text
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
toContainText: function(text) {
|
||||||
|
var trimmedText = $.trim(this.actual.text())
|
||||||
|
if (text && $.isFunction(text.test)) {
|
||||||
|
return text.test(trimmedText)
|
||||||
|
} else {
|
||||||
|
return trimmedText.indexOf(text) != -1;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveValue: function(value) {
|
||||||
|
return this.actual.val() === value
|
||||||
|
},
|
||||||
|
|
||||||
|
toHaveData: function(key, expectedValue) {
|
||||||
|
return hasProperty(this.actual.data(key), expectedValue)
|
||||||
|
},
|
||||||
|
|
||||||
|
toBe: function(selector) {
|
||||||
|
return this.actual.is(selector)
|
||||||
|
},
|
||||||
|
|
||||||
|
toContain: function(selector) {
|
||||||
|
return this.actual.find(selector).length
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeDisabled: function(selector){
|
||||||
|
return this.actual.is(':disabled')
|
||||||
|
},
|
||||||
|
|
||||||
|
toBeFocused: function(selector) {
|
||||||
|
return this.actual[0] === this.actual[0].ownerDocument.activeElement
|
||||||
|
},
|
||||||
|
|
||||||
|
toHandle: function(event) {
|
||||||
|
|
||||||
|
var events = $._data(this.actual.get(0), "events")
|
||||||
|
|
||||||
|
if(!events || !event || typeof event !== "string") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var namespaces = event.split(".")
|
||||||
|
var eventType = namespaces.shift()
|
||||||
|
var sortedNamespaces = namespaces.slice(0).sort()
|
||||||
|
var namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)")
|
||||||
|
|
||||||
|
if(events[eventType] && namespaces.length) {
|
||||||
|
for(var i = 0; i < events[eventType].length; i++) {
|
||||||
|
var namespace = events[eventType][i].namespace
|
||||||
|
if(namespaceRegExp.test(namespace)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return events[eventType] && events[eventType].length > 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// tests the existence of a specific event binding + handler
|
||||||
|
toHandleWith: function(eventName, eventHandler) {
|
||||||
|
var stack = $._data(this.actual.get(0), "events")[eventName]
|
||||||
|
for (var i = 0; i < stack.length; i++) {
|
||||||
|
if (stack[i].handler == eventHandler) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasProperty = function(actualValue, expectedValue) {
|
||||||
|
if (expectedValue === undefined) return actualValue !== undefined
|
||||||
|
return actualValue == expectedValue
|
||||||
|
}
|
||||||
|
|
||||||
|
var bindMatcher = function(methodName) {
|
||||||
|
var builtInMatcher = jasmine.Matchers.prototype[methodName]
|
||||||
|
|
||||||
|
jasmine.JQuery.matchersClass[methodName] = function() {
|
||||||
|
if (this.actual
|
||||||
|
&& (this.actual instanceof $
|
||||||
|
|| jasmine.isDomNode(this.actual))) {
|
||||||
|
this.actual = $(this.actual)
|
||||||
|
var result = jQueryMatchers[methodName].apply(this, arguments)
|
||||||
|
var element
|
||||||
|
if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML")
|
||||||
|
this.actual = jasmine.JQuery.elementToString(this.actual)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
if (builtInMatcher) {
|
||||||
|
return builtInMatcher.apply(this, arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var methodName in jQueryMatchers) {
|
||||||
|
bindMatcher(methodName)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
this.addMatchers(jasmine.JQuery.matchersClass)
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenTriggeredOn: function(selector) {
|
||||||
|
this.message = function() {
|
||||||
|
return [
|
||||||
|
"Expected event " + this.actual + " to have been triggered on " + selector,
|
||||||
|
"Expected event " + this.actual + " not to have been triggered on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return jasmine.JQuery.events.wasTriggered(selector, this.actual)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenTriggered: function(){
|
||||||
|
var eventName = this.actual.eventName,
|
||||||
|
selector = this.actual.selector
|
||||||
|
this.message = function() {
|
||||||
|
return [
|
||||||
|
"Expected event " + eventName + " to have been triggered on " + selector,
|
||||||
|
"Expected event " + eventName + " not to have been triggered on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return jasmine.JQuery.events.wasTriggered(selector, eventName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenTriggeredOnAndWith: function() {
|
||||||
|
var selector = arguments[0],
|
||||||
|
expectedArgs = arguments[1],
|
||||||
|
wasTriggered = jasmine.JQuery.events.wasTriggered(selector, this.actual);
|
||||||
|
this.message = function() {
|
||||||
|
if (wasTriggered) {
|
||||||
|
var actualArgs = jasmine.JQuery.events.args(selector, this.actual, expectedArgs)[1];
|
||||||
|
return [
|
||||||
|
"Expected event " + this.actual + " to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs),
|
||||||
|
"Expected event " + this.actual + " not to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs)
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
return [
|
||||||
|
"Expected event " + this.actual + " to have been triggered on " + selector,
|
||||||
|
"Expected event " + this.actual + " not to have been triggered on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wasTriggered && jasmine.JQuery.events.wasTriggeredWith(selector, this.actual, expectedArgs, this.env);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenPreventedOn: function(selector) {
|
||||||
|
this.message = function() {
|
||||||
|
return [
|
||||||
|
"Expected event " + this.actual + " to have been prevented on " + selector,
|
||||||
|
"Expected event " + this.actual + " not to have been prevented on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return jasmine.JQuery.events.wasPrevented(selector, this.actual)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenPrevented: function() {
|
||||||
|
var eventName = this.actual.eventName,
|
||||||
|
selector = this.actual.selector
|
||||||
|
this.message = function() {
|
||||||
|
return [
|
||||||
|
"Expected event " + eventName + " to have been prevented on " + selector,
|
||||||
|
"Expected event " + eventName + " not to have been prevented on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return jasmine.JQuery.events.wasPrevented(selector, eventName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenStoppedOn: function(selector) {
|
||||||
|
this.message = function() {
|
||||||
|
return [
|
||||||
|
"Expected event " + this.actual + " to have been stopped on " + selector,
|
||||||
|
"Expected event " + this.actual + " not to have been stopped on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return jasmine.JQuery.events.wasStopped(selector, this.actual)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.addMatchers({
|
||||||
|
toHaveBeenStopped: function() {
|
||||||
|
var eventName = this.actual.eventName,
|
||||||
|
selector = this.actual.selector
|
||||||
|
this.message = function() {
|
||||||
|
return [
|
||||||
|
"Expected event " + eventName + " to have been stopped on " + selector,
|
||||||
|
"Expected event " + eventName + " not to have been stopped on " + selector
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return jasmine.JQuery.events.wasStopped(selector, eventName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
jasmine.getFixtures().cleanUp()
|
||||||
|
jasmine.getStyleFixtures().cleanUp()
|
||||||
|
jasmine.JQuery.events.cleanUp()
|
||||||
|
})
|
20
lib/tests/vendor/jasmine/MIT.LICENSE
vendored
Executable file
20
lib/tests/vendor/jasmine/MIT.LICENSE
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2008-2011 Pivotal Labs
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
681
lib/tests/vendor/jasmine/jasmine-html.js
vendored
Executable file
681
lib/tests/vendor/jasmine/jasmine-html.js
vendored
Executable file
|
@ -0,0 +1,681 @@
|
||||||
|
jasmine.HtmlReporterHelpers = {};
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
|
||||||
|
var el = document.createElement(type);
|
||||||
|
|
||||||
|
for (var i = 2; i < arguments.length; i++) {
|
||||||
|
var child = arguments[i];
|
||||||
|
|
||||||
|
if (typeof child === 'string') {
|
||||||
|
el.appendChild(document.createTextNode(child));
|
||||||
|
} else {
|
||||||
|
if (child) {
|
||||||
|
el.appendChild(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var attr in attrs) {
|
||||||
|
if (attr == "className") {
|
||||||
|
el[attr] = attrs[attr];
|
||||||
|
} else {
|
||||||
|
el.setAttribute(attr, attrs[attr]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
|
||||||
|
var results = child.results();
|
||||||
|
var status = results.passed() ? 'passed' : 'failed';
|
||||||
|
if (results.skipped) {
|
||||||
|
status = 'skipped';
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
|
||||||
|
var parentDiv = this.dom.summary;
|
||||||
|
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
|
||||||
|
var parent = child[parentSuite];
|
||||||
|
|
||||||
|
if (parent) {
|
||||||
|
if (typeof this.views.suites[parent.id] == 'undefined') {
|
||||||
|
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
|
||||||
|
}
|
||||||
|
parentDiv = this.views.suites[parent.id].element;
|
||||||
|
}
|
||||||
|
|
||||||
|
parentDiv.appendChild(childElement);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
|
||||||
|
for(var fn in jasmine.HtmlReporterHelpers) {
|
||||||
|
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter = function(_doc) {
|
||||||
|
var self = this;
|
||||||
|
var doc = _doc || window.document;
|
||||||
|
|
||||||
|
var reporterView;
|
||||||
|
|
||||||
|
var dom = {};
|
||||||
|
|
||||||
|
// Jasmine Reporter Public Interface
|
||||||
|
self.logRunningSpecs = false;
|
||||||
|
|
||||||
|
self.reportRunnerStarting = function(runner) {
|
||||||
|
var specs = runner.specs() || [];
|
||||||
|
|
||||||
|
if (specs.length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
createReporterDom(runner.env.versionString());
|
||||||
|
doc.body.appendChild(dom.reporter);
|
||||||
|
setExceptionHandling();
|
||||||
|
|
||||||
|
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
|
||||||
|
reporterView.addSpecs(specs, self.specFilter);
|
||||||
|
};
|
||||||
|
|
||||||
|
self.reportRunnerResults = function(runner) {
|
||||||
|
reporterView && reporterView.complete();
|
||||||
|
};
|
||||||
|
|
||||||
|
self.reportSuiteResults = function(suite) {
|
||||||
|
reporterView.suiteComplete(suite);
|
||||||
|
};
|
||||||
|
|
||||||
|
self.reportSpecStarting = function(spec) {
|
||||||
|
if (self.logRunningSpecs) {
|
||||||
|
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
self.reportSpecResults = function(spec) {
|
||||||
|
reporterView.specComplete(spec);
|
||||||
|
};
|
||||||
|
|
||||||
|
self.log = function() {
|
||||||
|
var console = jasmine.getGlobal().console;
|
||||||
|
if (console && console.log) {
|
||||||
|
if (console.log.apply) {
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
} else {
|
||||||
|
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
self.specFilter = function(spec) {
|
||||||
|
if (!focusedSpecName()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return spec.getFullName().indexOf(focusedSpecName()) === 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
return self;
|
||||||
|
|
||||||
|
function focusedSpecName() {
|
||||||
|
var specName;
|
||||||
|
|
||||||
|
(function memoizeFocusedSpec() {
|
||||||
|
if (specName) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var paramMap = [];
|
||||||
|
var params = jasmine.HtmlReporter.parameters(doc);
|
||||||
|
|
||||||
|
for (var i = 0; i < params.length; i++) {
|
||||||
|
var p = params[i].split('=');
|
||||||
|
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
specName = paramMap.spec;
|
||||||
|
})();
|
||||||
|
|
||||||
|
return specName;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createReporterDom(version) {
|
||||||
|
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
|
||||||
|
dom.banner = self.createDom('div', { className: 'banner' },
|
||||||
|
self.createDom('span', { className: 'title' }, "Jasmine "),
|
||||||
|
self.createDom('span', { className: 'version' }, version)),
|
||||||
|
|
||||||
|
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
|
||||||
|
dom.alert = self.createDom('div', {className: 'alert'},
|
||||||
|
self.createDom('span', { className: 'exceptions' },
|
||||||
|
self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'),
|
||||||
|
self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))),
|
||||||
|
dom.results = self.createDom('div', {className: 'results'},
|
||||||
|
dom.summary = self.createDom('div', { className: 'summary' }),
|
||||||
|
dom.details = self.createDom('div', { id: 'details' }))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function noTryCatch() {
|
||||||
|
return window.location.search.match(/catch=false/);
|
||||||
|
}
|
||||||
|
|
||||||
|
function searchWithCatch() {
|
||||||
|
var params = jasmine.HtmlReporter.parameters(window.document);
|
||||||
|
var removed = false;
|
||||||
|
var i = 0;
|
||||||
|
|
||||||
|
while (!removed && i < params.length) {
|
||||||
|
if (params[i].match(/catch=/)) {
|
||||||
|
params.splice(i, 1);
|
||||||
|
removed = true;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (jasmine.CATCH_EXCEPTIONS) {
|
||||||
|
params.push("catch=false");
|
||||||
|
}
|
||||||
|
|
||||||
|
return params.join("&");
|
||||||
|
}
|
||||||
|
|
||||||
|
function setExceptionHandling() {
|
||||||
|
var chxCatch = document.getElementById('no_try_catch');
|
||||||
|
|
||||||
|
if (noTryCatch()) {
|
||||||
|
chxCatch.setAttribute('checked', true);
|
||||||
|
jasmine.CATCH_EXCEPTIONS = false;
|
||||||
|
}
|
||||||
|
chxCatch.onclick = function() {
|
||||||
|
window.location.search = searchWithCatch();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
jasmine.HtmlReporter.parameters = function(doc) {
|
||||||
|
var paramStr = doc.location.search.substring(1);
|
||||||
|
var params = [];
|
||||||
|
|
||||||
|
if (paramStr.length > 0) {
|
||||||
|
params = paramStr.split('&');
|
||||||
|
}
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
jasmine.HtmlReporter.sectionLink = function(sectionName) {
|
||||||
|
var link = '?';
|
||||||
|
var params = [];
|
||||||
|
|
||||||
|
if (sectionName) {
|
||||||
|
params.push('spec=' + encodeURIComponent(sectionName));
|
||||||
|
}
|
||||||
|
if (!jasmine.CATCH_EXCEPTIONS) {
|
||||||
|
params.push("catch=false");
|
||||||
|
}
|
||||||
|
if (params.length > 0) {
|
||||||
|
link += params.join("&");
|
||||||
|
}
|
||||||
|
|
||||||
|
return link;
|
||||||
|
};
|
||||||
|
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);
|
||||||
|
jasmine.HtmlReporter.ReporterView = function(dom) {
|
||||||
|
this.startedAt = new Date();
|
||||||
|
this.runningSpecCount = 0;
|
||||||
|
this.completeSpecCount = 0;
|
||||||
|
this.passedCount = 0;
|
||||||
|
this.failedCount = 0;
|
||||||
|
this.skippedCount = 0;
|
||||||
|
|
||||||
|
this.createResultsMenu = function() {
|
||||||
|
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
|
||||||
|
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
|
||||||
|
' | ',
|
||||||
|
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
|
||||||
|
|
||||||
|
this.summaryMenuItem.onclick = function() {
|
||||||
|
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
|
||||||
|
};
|
||||||
|
|
||||||
|
this.detailsMenuItem.onclick = function() {
|
||||||
|
showDetails();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
this.addSpecs = function(specs, specFilter) {
|
||||||
|
this.totalSpecCount = specs.length;
|
||||||
|
|
||||||
|
this.views = {
|
||||||
|
specs: {},
|
||||||
|
suites: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 0; i < specs.length; i++) {
|
||||||
|
var spec = specs[i];
|
||||||
|
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
|
||||||
|
if (specFilter(spec)) {
|
||||||
|
this.runningSpecCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.specComplete = function(spec) {
|
||||||
|
this.completeSpecCount++;
|
||||||
|
|
||||||
|
if (isUndefined(this.views.specs[spec.id])) {
|
||||||
|
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
|
||||||
|
}
|
||||||
|
|
||||||
|
var specView = this.views.specs[spec.id];
|
||||||
|
|
||||||
|
switch (specView.status()) {
|
||||||
|
case 'passed':
|
||||||
|
this.passedCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'failed':
|
||||||
|
this.failedCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'skipped':
|
||||||
|
this.skippedCount++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
specView.refresh();
|
||||||
|
this.refresh();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.suiteComplete = function(suite) {
|
||||||
|
var suiteView = this.views.suites[suite.id];
|
||||||
|
if (isUndefined(suiteView)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
suiteView.refresh();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.refresh = function() {
|
||||||
|
|
||||||
|
if (isUndefined(this.resultsMenu)) {
|
||||||
|
this.createResultsMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
// currently running UI
|
||||||
|
if (isUndefined(this.runningAlert)) {
|
||||||
|
this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" });
|
||||||
|
dom.alert.appendChild(this.runningAlert);
|
||||||
|
}
|
||||||
|
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
|
||||||
|
|
||||||
|
// skipped specs UI
|
||||||
|
if (isUndefined(this.skippedAlert)) {
|
||||||
|
this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" });
|
||||||
|
}
|
||||||
|
|
||||||
|
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
||||||
|
|
||||||
|
if (this.skippedCount === 1 && isDefined(dom.alert)) {
|
||||||
|
dom.alert.appendChild(this.skippedAlert);
|
||||||
|
}
|
||||||
|
|
||||||
|
// passing specs UI
|
||||||
|
if (isUndefined(this.passedAlert)) {
|
||||||
|
this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" });
|
||||||
|
}
|
||||||
|
this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
|
||||||
|
|
||||||
|
// failing specs UI
|
||||||
|
if (isUndefined(this.failedAlert)) {
|
||||||
|
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
|
||||||
|
}
|
||||||
|
this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
|
||||||
|
|
||||||
|
if (this.failedCount === 1 && isDefined(dom.alert)) {
|
||||||
|
dom.alert.appendChild(this.failedAlert);
|
||||||
|
dom.alert.appendChild(this.resultsMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
// summary info
|
||||||
|
this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
|
||||||
|
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
|
||||||
|
};
|
||||||
|
|
||||||
|
this.complete = function() {
|
||||||
|
dom.alert.removeChild(this.runningAlert);
|
||||||
|
|
||||||
|
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
||||||
|
|
||||||
|
if (this.failedCount === 0) {
|
||||||
|
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
|
||||||
|
} else {
|
||||||
|
showDetails();
|
||||||
|
}
|
||||||
|
|
||||||
|
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
|
||||||
|
};
|
||||||
|
|
||||||
|
return this;
|
||||||
|
|
||||||
|
function showDetails() {
|
||||||
|
if (dom.reporter.className.search(/showDetails/) === -1) {
|
||||||
|
dom.reporter.className += " showDetails";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isUndefined(obj) {
|
||||||
|
return typeof obj === 'undefined';
|
||||||
|
}
|
||||||
|
|
||||||
|
function isDefined(obj) {
|
||||||
|
return !isUndefined(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
function specPluralizedFor(count) {
|
||||||
|
var str = count + " spec";
|
||||||
|
if (count > 1) {
|
||||||
|
str += "s"
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
|
||||||
|
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
|
||||||
|
this.spec = spec;
|
||||||
|
this.dom = dom;
|
||||||
|
this.views = views;
|
||||||
|
|
||||||
|
this.symbol = this.createDom('li', { className: 'pending' });
|
||||||
|
this.dom.symbolSummary.appendChild(this.symbol);
|
||||||
|
|
||||||
|
this.summary = this.createDom('div', { className: 'specSummary' },
|
||||||
|
this.createDom('a', {
|
||||||
|
className: 'description',
|
||||||
|
href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()),
|
||||||
|
title: this.spec.getFullName()
|
||||||
|
}, this.spec.description)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.detail = this.createDom('div', { className: 'specDetail' },
|
||||||
|
this.createDom('a', {
|
||||||
|
className: 'description',
|
||||||
|
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
|
||||||
|
title: this.spec.getFullName()
|
||||||
|
}, this.spec.getFullName())
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SpecView.prototype.status = function() {
|
||||||
|
return this.getSpecStatus(this.spec);
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
|
||||||
|
this.symbol.className = this.status();
|
||||||
|
|
||||||
|
switch (this.status()) {
|
||||||
|
case 'skipped':
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'passed':
|
||||||
|
this.appendSummaryToSuiteDiv();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'failed':
|
||||||
|
this.appendSummaryToSuiteDiv();
|
||||||
|
this.appendFailureDetail();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
|
||||||
|
this.summary.className += ' ' + this.status();
|
||||||
|
this.appendToSummary(this.spec, this.summary);
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
|
||||||
|
this.detail.className += ' ' + this.status();
|
||||||
|
|
||||||
|
var resultItems = this.spec.results().getItems();
|
||||||
|
var messagesDiv = this.createDom('div', { className: 'messages' });
|
||||||
|
|
||||||
|
for (var i = 0; i < resultItems.length; i++) {
|
||||||
|
var result = resultItems[i];
|
||||||
|
|
||||||
|
if (result.type == 'log') {
|
||||||
|
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
||||||
|
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
||||||
|
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
||||||
|
|
||||||
|
if (result.trace.stack) {
|
||||||
|
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messagesDiv.childNodes.length > 0) {
|
||||||
|
this.detail.appendChild(messagesDiv);
|
||||||
|
this.dom.details.appendChild(this.detail);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
|
||||||
|
this.suite = suite;
|
||||||
|
this.dom = dom;
|
||||||
|
this.views = views;
|
||||||
|
|
||||||
|
this.element = this.createDom('div', { className: 'suite' },
|
||||||
|
this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description)
|
||||||
|
);
|
||||||
|
|
||||||
|
this.appendToSummary(this.suite, this.element);
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
|
||||||
|
return this.getSpecStatus(this.suite);
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
|
||||||
|
this.element.className += " " + this.status();
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
|
||||||
|
|
||||||
|
/* @deprecated Use jasmine.HtmlReporter instead
|
||||||
|
*/
|
||||||
|
jasmine.TrivialReporter = function(doc) {
|
||||||
|
this.document = doc || document;
|
||||||
|
this.suiteDivs = {};
|
||||||
|
this.logRunningSpecs = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
|
||||||
|
var el = document.createElement(type);
|
||||||
|
|
||||||
|
for (var i = 2; i < arguments.length; i++) {
|
||||||
|
var child = arguments[i];
|
||||||
|
|
||||||
|
if (typeof child === 'string') {
|
||||||
|
el.appendChild(document.createTextNode(child));
|
||||||
|
} else {
|
||||||
|
if (child) { el.appendChild(child); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var attr in attrs) {
|
||||||
|
if (attr == "className") {
|
||||||
|
el[attr] = attrs[attr];
|
||||||
|
} else {
|
||||||
|
el.setAttribute(attr, attrs[attr]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
|
||||||
|
var showPassed, showSkipped;
|
||||||
|
|
||||||
|
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
|
||||||
|
this.createDom('div', { className: 'banner' },
|
||||||
|
this.createDom('div', { className: 'logo' },
|
||||||
|
this.createDom('span', { className: 'title' }, "Jasmine"),
|
||||||
|
this.createDom('span', { className: 'version' }, runner.env.versionString())),
|
||||||
|
this.createDom('div', { className: 'options' },
|
||||||
|
"Show ",
|
||||||
|
showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
|
||||||
|
this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
|
||||||
|
showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
|
||||||
|
this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
this.runnerDiv = this.createDom('div', { className: 'runner running' },
|
||||||
|
this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
|
||||||
|
this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
|
||||||
|
this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
|
||||||
|
);
|
||||||
|
|
||||||
|
this.document.body.appendChild(this.outerDiv);
|
||||||
|
|
||||||
|
var suites = runner.suites();
|
||||||
|
for (var i = 0; i < suites.length; i++) {
|
||||||
|
var suite = suites[i];
|
||||||
|
var suiteDiv = this.createDom('div', { className: 'suite' },
|
||||||
|
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
|
||||||
|
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
|
||||||
|
this.suiteDivs[suite.id] = suiteDiv;
|
||||||
|
var parentDiv = this.outerDiv;
|
||||||
|
if (suite.parentSuite) {
|
||||||
|
parentDiv = this.suiteDivs[suite.parentSuite.id];
|
||||||
|
}
|
||||||
|
parentDiv.appendChild(suiteDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.startedAt = new Date();
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
showPassed.onclick = function(evt) {
|
||||||
|
if (showPassed.checked) {
|
||||||
|
self.outerDiv.className += ' show-passed';
|
||||||
|
} else {
|
||||||
|
self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
showSkipped.onclick = function(evt) {
|
||||||
|
if (showSkipped.checked) {
|
||||||
|
self.outerDiv.className += ' show-skipped';
|
||||||
|
} else {
|
||||||
|
self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
|
||||||
|
var results = runner.results();
|
||||||
|
var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
|
||||||
|
this.runnerDiv.setAttribute("class", className);
|
||||||
|
//do it twice for IE
|
||||||
|
this.runnerDiv.setAttribute("className", className);
|
||||||
|
var specs = runner.specs();
|
||||||
|
var specCount = 0;
|
||||||
|
for (var i = 0; i < specs.length; i++) {
|
||||||
|
if (this.specFilter(specs[i])) {
|
||||||
|
specCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
|
||||||
|
message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
|
||||||
|
this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
|
||||||
|
|
||||||
|
this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
|
||||||
|
var results = suite.results();
|
||||||
|
var status = results.passed() ? 'passed' : 'failed';
|
||||||
|
if (results.totalCount === 0) { // todo: change this to check results.skipped
|
||||||
|
status = 'skipped';
|
||||||
|
}
|
||||||
|
this.suiteDivs[suite.id].className += " " + status;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
|
||||||
|
if (this.logRunningSpecs) {
|
||||||
|
this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
|
||||||
|
var results = spec.results();
|
||||||
|
var status = results.passed() ? 'passed' : 'failed';
|
||||||
|
if (results.skipped) {
|
||||||
|
status = 'skipped';
|
||||||
|
}
|
||||||
|
var specDiv = this.createDom('div', { className: 'spec ' + status },
|
||||||
|
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
|
||||||
|
this.createDom('a', {
|
||||||
|
className: 'description',
|
||||||
|
href: '?spec=' + encodeURIComponent(spec.getFullName()),
|
||||||
|
title: spec.getFullName()
|
||||||
|
}, spec.description));
|
||||||
|
|
||||||
|
|
||||||
|
var resultItems = results.getItems();
|
||||||
|
var messagesDiv = this.createDom('div', { className: 'messages' });
|
||||||
|
for (var i = 0; i < resultItems.length; i++) {
|
||||||
|
var result = resultItems[i];
|
||||||
|
|
||||||
|
if (result.type == 'log') {
|
||||||
|
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
||||||
|
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
||||||
|
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
||||||
|
|
||||||
|
if (result.trace.stack) {
|
||||||
|
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messagesDiv.childNodes.length > 0) {
|
||||||
|
specDiv.appendChild(messagesDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.suiteDivs[spec.suite.id].appendChild(specDiv);
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.log = function() {
|
||||||
|
var console = jasmine.getGlobal().console;
|
||||||
|
if (console && console.log) {
|
||||||
|
if (console.log.apply) {
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
} else {
|
||||||
|
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.getLocation = function() {
|
||||||
|
return this.document.location;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.TrivialReporter.prototype.specFilter = function(spec) {
|
||||||
|
var paramMap = {};
|
||||||
|
var params = this.getLocation().search.substring(1).split('&');
|
||||||
|
for (var i = 0; i < params.length; i++) {
|
||||||
|
var p = params[i].split('=');
|
||||||
|
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!paramMap.spec) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return spec.getFullName().indexOf(paramMap.spec) === 0;
|
||||||
|
};
|
82
lib/tests/vendor/jasmine/jasmine.css
vendored
Executable file
82
lib/tests/vendor/jasmine/jasmine.css
vendored
Executable file
|
@ -0,0 +1,82 @@
|
||||||
|
body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
||||||
|
|
||||||
|
#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
|
||||||
|
#HTMLReporter a { text-decoration: none; }
|
||||||
|
#HTMLReporter a:hover { text-decoration: underline; }
|
||||||
|
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
|
||||||
|
#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
|
||||||
|
#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
|
||||||
|
#HTMLReporter .version { color: #aaaaaa; }
|
||||||
|
#HTMLReporter .banner { margin-top: 14px; }
|
||||||
|
#HTMLReporter .duration { color: #aaaaaa; float: right; }
|
||||||
|
#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
|
||||||
|
#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
|
||||||
|
#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
|
||||||
|
#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
|
||||||
|
#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
|
||||||
|
#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
|
||||||
|
#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
|
||||||
|
#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
|
||||||
|
#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
|
||||||
|
#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
|
||||||
|
#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }
|
||||||
|
#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
|
||||||
|
#HTMLReporter .runningAlert { background-color: #666666; }
|
||||||
|
#HTMLReporter .skippedAlert { background-color: #aaaaaa; }
|
||||||
|
#HTMLReporter .skippedAlert:first-child { background-color: #333333; }
|
||||||
|
#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }
|
||||||
|
#HTMLReporter .passingAlert { background-color: #a6b779; }
|
||||||
|
#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }
|
||||||
|
#HTMLReporter .failingAlert { background-color: #cf867e; }
|
||||||
|
#HTMLReporter .failingAlert:first-child { background-color: #b03911; }
|
||||||
|
#HTMLReporter .results { margin-top: 14px; }
|
||||||
|
#HTMLReporter #details { display: none; }
|
||||||
|
#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }
|
||||||
|
#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
|
||||||
|
#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
|
||||||
|
#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
|
||||||
|
#HTMLReporter.showDetails .summary { display: none; }
|
||||||
|
#HTMLReporter.showDetails #details { display: block; }
|
||||||
|
#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
|
||||||
|
#HTMLReporter .summary { margin-top: 14px; }
|
||||||
|
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }
|
||||||
|
#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }
|
||||||
|
#HTMLReporter .summary .specSummary.failed a { color: #b03911; }
|
||||||
|
#HTMLReporter .description + .suite { margin-top: 0; }
|
||||||
|
#HTMLReporter .suite { margin-top: 14px; }
|
||||||
|
#HTMLReporter .suite a { color: #333333; }
|
||||||
|
#HTMLReporter #details .specDetail { margin-bottom: 28px; }
|
||||||
|
#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }
|
||||||
|
#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }
|
||||||
|
#HTMLReporter .resultMessage span.result { display: block; }
|
||||||
|
#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
|
||||||
|
|
||||||
|
#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }
|
||||||
|
#TrivialReporter a:visited, #TrivialReporter a { color: #303; }
|
||||||
|
#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }
|
||||||
|
#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }
|
||||||
|
#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }
|
||||||
|
#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }
|
||||||
|
#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }
|
||||||
|
#TrivialReporter .runner.running { background-color: yellow; }
|
||||||
|
#TrivialReporter .options { text-align: right; font-size: .8em; }
|
||||||
|
#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }
|
||||||
|
#TrivialReporter .suite .suite { margin: 5px; }
|
||||||
|
#TrivialReporter .suite.passed { background-color: #dfd; }
|
||||||
|
#TrivialReporter .suite.failed { background-color: #fdd; }
|
||||||
|
#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }
|
||||||
|
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }
|
||||||
|
#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }
|
||||||
|
#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }
|
||||||
|
#TrivialReporter .spec.skipped { background-color: #bbb; }
|
||||||
|
#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }
|
||||||
|
#TrivialReporter .passed { background-color: #cfc; display: none; }
|
||||||
|
#TrivialReporter .failed { background-color: #fbb; }
|
||||||
|
#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }
|
||||||
|
#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }
|
||||||
|
#TrivialReporter .resultMessage .mismatch { color: black; }
|
||||||
|
#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }
|
||||||
|
#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }
|
||||||
|
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }
|
||||||
|
#TrivialReporter #jasmine_content { position: fixed; right: 100%; }
|
||||||
|
#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }
|
2600
lib/tests/vendor/jasmine/jasmine.js
vendored
Executable file
2600
lib/tests/vendor/jasmine/jasmine.js
vendored
Executable file
File diff suppressed because it is too large
Load diff
6
lib/vendor/jquery-2.0.0.min.js
vendored
Executable file
6
lib/vendor/jquery-2.0.0.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
|
@ -5,6 +5,7 @@
|
||||||
"keywords": ["comic", "book", "reader"],
|
"keywords": ["comic", "book", "reader"],
|
||||||
"homepage": "http://reader.justforcomics.com",
|
"homepage": "http://reader.justforcomics.com",
|
||||||
"author": "Bala Clark",
|
"author": "Bala Clark",
|
||||||
|
"scripts": { "test": "make test" },
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/balaclark/HTML5-Comic-Book-Reader.git"
|
"url": "https://github.com/balaclark/HTML5-Comic-Book-Reader.git"
|
||||||
|
@ -18,6 +19,8 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"handlebars": "1.0.10",
|
"handlebars": "1.0.10",
|
||||||
"uglify-js": "1.3.4",
|
"uglify-js": "1.3.4",
|
||||||
"jshint": "1.1.0"
|
"jshint": "1.1.0",
|
||||||
|
"connect": "2.7.8",
|
||||||
|
"phantomjs": "1.9.0-3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue