Updates Jasmine version.
This commit is contained in:
parent
df7afcf004
commit
0a700fa29d
20
external/jasmine/MIT.LICENSE
vendored
20
external/jasmine/MIT.LICENSE
vendored
@ -1,20 +0,0 @@
|
||||
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.
|
676
external/jasmine/jasmine-html.js
vendored
676
external/jasmine/jasmine-html.js
vendored
@ -1,676 +0,0 @@
|
||||
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);
|
||||
|
||||
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
|
||||
reporterView.addSpecs(specs, self.specFilter);
|
||||
};
|
||||
|
||||
self.reportRunnerResults = function(runner) {
|
||||
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 = doc.location.search.substring(1).split('&');
|
||||
|
||||
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'}),
|
||||
dom.results = self.createDom('div', {className: 'results'},
|
||||
dom.summary = self.createDom('div', { className: 'summary' }),
|
||||
dom.details = self.createDom('div', { id: 'details' }))
|
||||
);
|
||||
}
|
||||
};
|
||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);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.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: "?", 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: "?", 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: "?", 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: '?spec=' + encodeURIComponent(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: '?spec=' + encodeURIComponent(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;
|
||||
};
|
81
external/jasmine/jasmine.css
vendored
81
external/jasmine/jasmine.css
vendored
@ -1,81 +0,0 @@
|
||||
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 .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; }
|
2469
external/jasmine/jasmine.js
vendored
2469
external/jasmine/jasmine.js
vendored
File diff suppressed because it is too large
Load Diff
BIN
external/jasmine/jasmine_favicon.png
vendored
BIN
external/jasmine/jasmine_favicon.png
vendored
Binary file not shown.
Before Width: | Height: | Size: 776 B |
@ -4,6 +4,7 @@
|
||||
"devDependencies": {
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-util": "^3.0.7",
|
||||
"jasmine-core": "^2.4.1",
|
||||
"jsdoc": "^3.3.0-alpha9",
|
||||
"jshint": "~2.8.0",
|
||||
"node-ensure": "^0.0.0",
|
||||
|
@ -3,15 +3,13 @@
|
||||
describe('font1', function() {
|
||||
var font1_1 = decodeFontData('T1RUTwAJAIAAAwAQQ0ZGIP/t0rAAAACcAAADKU9TLzJDxycMAAADyAAAAGBjbWFwwFIBcgAABCgAAABUaGVhZKsnTJ4AAAR8AAAANmhoZWEDHvxTAAAEtAAAACRobXR4AAAAAAAABNgAAAA4bWF4cAAOUAAAAAUQAAAABm5hbWX8Fq+xAAAFGAAAAfhwb3N0AAMAAAAABxAAAAAgAQAEAgABAQEMS0hQRkxFK01UU1kAAQEBOfgeAPgfAfggAvghA/gXBIv+Tvqn+bAFHQAAAMgPHQAAAL0QHQAAANsRHQAAACcdAAADARL4IAwWAAcBAQgUGx5TV19yYWRpY2FsY2lyY2xlY29weXJ0c2ltaWxhcjEuMUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBUaGUgVGVYcGxvcmF0b3JzIENvcnBvcmF0aW9uTVRTWU1hdGhUaW1lAAAAAAkAAg0YQ0RmZ3AAAKYAqAGIAYkADAAeAFwAXgGHAAoCAAEAAwAWAFoAtgDxARcBNgGKAd4CDiAO93W9Ad/4+AP5TPd1Fb38+FkHDvfslp/3PtH3Pp8B9xjR9zDQ9zDRFPz4P/eAFfd193UFRQb7UvtS+1L3UgVFBvd1+3X7dvt1BdIG91L3UvdS+1IF0gYO+MT7ZbP5vLMBw7P5vLMD+kT3fxX3iPtc91z7iPuI+1z7XPuI+4j3XPtc94j3iPdc91z3iB78UPwoFft0+0f3SPd093T3R/dI93T3dPdI+0j7dPt0+0j7SPt0Hw73Zb33Br0Bw/kwA/ln+C8VT3o8Lz8hMvc4+xYbP0E/WncfQIwH3KLi0Mb3AuL7OPcUG9nc272ZH9IHDjig97O997SfAfgBvQP5aPd1Fb37yffIWfvI+8lZ98n7yL33yAcO9MP3JsMBw/kwA/lo98cVw/0wUwf5MPteFcP9MFMHDkX7SaD4JJ/4JJ8B9yXVA/dv9w0V0n6yPZwejQfZnZiy0hr3PAfQn7HSmx6WByRNd/sLH/tGB0t7bEZ5HtB4m2xLGvtFB/sMyXfyHpYHRJt3sdAaDkX7SaD4JJ/4JJ8B9yvVA/d19xwVy5uq0J4eRp17qssa90UH9wxNnyQegAfSe59lRhr7PAdEmGTZeh6JBz15fmREGvs8B0Z3ZUR7HoAH8smf9wsfDvgq/k6g99/k+LCfAcD5yAP4Kf5OFZUG+F76fQVWBvwe/fT7cffE+yz7KJp23dsFDnie+GWenJD3K54G+2WiBx4KBI8MCb0KvQufqQwMqZ8MDfmgFPhMFQAAAAAAAwIkAfQABQAAAooCuwAAAIwCigK7AAAB3wAxAQIAAAAABgAAAAAAAAAAAAABEAAAAAAAAAAAAAAAKjIxKgAAAEPgBwMc/EYAZAMcA7oAAAAAAAAAAAAAAAAAAABDAAMAAAABAAMAAQAAAAwABABIAAAACgAIAAIAAgBEAGcAcOAH//8AAABDAGYAcOAA////wv+h/5kAAAABAAAAAAAAAAQAAAABAAEAAgACAAMAAwAEAAQAAQAAAAAQAAAAAABfDzz1AAAD6AAAAACeC34nAAAAAJ4LficAAPxGD/8DHAAAABEAAAAAAAAAAAABAAADHPxGAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAOAAAAAAAUAPYAAQAAAAAAAAAQAAAAAQAAAAAAAQALABAAAQAAAAAAAgAHABsAAQAAAAAAAwAIACIAAQAAAAAABAALACoAAQAAAAAABQAMADUAAQAAAAAABgAAAEEAAQAAAAAABwAHAEEAAQAAAAAACAAHAEgAAQAAAAAACQAHAE8AAwABBAkAAAAgAFYAAwABBAkAAQAWAHYAAwABBAkAAgAOAIwAAwABBAkAAwAQAJoAAwABBAkABAAWAKoAAwABBAkABQAYAMAAAwABBAkABgAAANgAAwABBAkABwAOANgAAwABBAkACAAOAOYAAwABBAkACQAOAPRPcmlnaW5hbCBsaWNlbmNlS0hQRkxFK01UU1lVbmtub3dudW5pcXVlSURLSFBGTEUrTVRTWVZlcnNpb24gMC4xMVVua25vd25Vbmtub3duVW5rbm93bgBPAHIAaQBnAGkAbgBhAGwAIABsAGkAYwBlAG4AYwBlAEsASABQAEYATABFACsATQBUAFMAWQBVAG4AawBuAG8AdwBuAHUAbgBpAHEAdQBlAEkARABLAEgAUABGAEwARQArAE0AVABTAFkAVgBlAHIAcwBpAG8AbgAgADAALgAxADEAVQBuAGsAbgBvAHcAbgBVAG4AawBuAG8AdwBuAFUAbgBrAG4AbwB3AG4AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==');
|
||||
describe('test harness testing', function() {
|
||||
it('returns output', function() {
|
||||
var output;
|
||||
waitsFor(function() { return output; }, 10000);
|
||||
ttx(font1_1, function(result) { output = result; });
|
||||
runs(function() {
|
||||
it('returns output', function(done) {
|
||||
ttx(font1_1, function(output) {
|
||||
verifyTtxOutput(output);
|
||||
expect(/<ttFont /.test(output)).toEqual(true);
|
||||
expect(/<\/ttFont>/.test(output)).toEqual(true);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -3,13 +3,14 @@
|
||||
<head>
|
||||
<title>pdf.js unit test</title>
|
||||
|
||||
<link rel="shortcut icon" type="image/png" href="../../external/jasmine/jasmine_favicon.png">
|
||||
<link rel="stylesheet" type="text/css" href="../../external/jasmine/jasmine.css">
|
||||
<link rel="stylesheet" type="text/css" href="../../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
|
||||
|
||||
<script src="../../node_modules/requirejs/require.js"></script>
|
||||
<script src="../../external/jasmine/jasmine.js"></script>
|
||||
<script src="../../external/jasmine/jasmine-html.js"></script>
|
||||
<script src="../../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
|
||||
<script src="../../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
|
||||
<script src="../unit/testreporter.js"></script>
|
||||
<script src="jasmine-boot.js"></script>
|
||||
|
||||
<script src="fontutils.js"></script>
|
||||
|
||||
<!-- include spec files here... -->
|
||||
@ -17,68 +18,6 @@
|
||||
<script src="font_os2_spec.js"></script>
|
||||
<script src="font_post_spec.js"></script>
|
||||
<script src="font_fpgm_spec.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
function initializePDFJS(callback) {
|
||||
require.config({paths: {'pdfjs': '../../src'}});
|
||||
require(['pdfjs/core/fonts', 'pdfjs/core/stream', 'pdfjs/core/primitives',
|
||||
'pdfjs/core/cmap'], function (fonts, stream, primitives, cmap) {
|
||||
// Expose some of the PDFJS members to global scope for tests.
|
||||
window.Font = fonts.Font;
|
||||
window.ToUnicodeMap = fonts.ToUnicodeMap;
|
||||
window.Stream = stream.Stream;
|
||||
window.Name = primitives.Name;
|
||||
window.CMapFactory = cmap.CMapFactory;
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
(function pdfJsUnitTest() {
|
||||
function queryParams() {
|
||||
var qs = window.location.search.substring(1);
|
||||
var kvs = qs.split('&');
|
||||
var params = { };
|
||||
for (var i = 0; i < kvs.length; ++i) {
|
||||
var kv = kvs[i].split('=');
|
||||
params[unescape(kv[0])] = unescape(kv[1]);
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
var jasmineEnv = jasmine.getEnv();
|
||||
jasmineEnv.updateInterval = 1000;
|
||||
|
||||
var trivialReporter = new jasmine.TrivialReporter();
|
||||
|
||||
jasmineEnv.addReporter(trivialReporter);
|
||||
|
||||
var params = queryParams();
|
||||
if (params['browser']) {
|
||||
var testReporter = new TestReporter(params['browser'], params['path']);
|
||||
jasmineEnv.addReporter(testReporter);
|
||||
}
|
||||
|
||||
jasmineEnv.specFilter = function pdfJsUnitTestSpecFilter(spec) {
|
||||
return trivialReporter.specFilter(spec);
|
||||
};
|
||||
|
||||
var currentWindowOnload = window.onload;
|
||||
|
||||
window.onload = function pdfJsUnitTestOnload() {
|
||||
if (currentWindowOnload) {
|
||||
currentWindowOnload();
|
||||
}
|
||||
initializePDFJS(execJasmine);
|
||||
};
|
||||
|
||||
function execJasmine() {
|
||||
jasmineEnv.execute();
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
157
test/font/jasmine-boot.js
Normal file
157
test/font/jasmine-boot.js
Normal file
@ -0,0 +1,157 @@
|
||||
/* Copyright 2016 Mozilla Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*
|
||||
Copyright (c) 2008-2016 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.
|
||||
*/
|
||||
/*globals jasmineRequire, jasmine, TestReporter */
|
||||
|
||||
// Modified jasmine's boot.js file to load PDF.js libraries async.
|
||||
|
||||
'use strict';
|
||||
|
||||
function initializePDFJS(callback) {
|
||||
require.config({paths: {'pdfjs': '../../src'}});
|
||||
require(['pdfjs/core/fonts', 'pdfjs/core/stream', 'pdfjs/core/primitives',
|
||||
'pdfjs/core/cmap'], function (fonts, stream, primitives, cmap) {
|
||||
// Expose some of the PDFJS members to global scope for tests.
|
||||
window.Font = fonts.Font;
|
||||
window.ToUnicodeMap = fonts.ToUnicodeMap;
|
||||
window.Stream = stream.Stream;
|
||||
window.Name = primitives.Name;
|
||||
window.CMapFactory = cmap.CMapFactory;
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
(function() {
|
||||
window.jasmine = jasmineRequire.core(jasmineRequire);
|
||||
|
||||
jasmineRequire.html(jasmine);
|
||||
|
||||
var env = jasmine.getEnv();
|
||||
|
||||
var jasmineInterface = jasmineRequire.interface(jasmine, env);
|
||||
extend(window, jasmineInterface);
|
||||
|
||||
// Runner Parameters
|
||||
var queryString = new jasmine.QueryString({
|
||||
getWindowLocation: function() { return window.location; }
|
||||
});
|
||||
|
||||
var catchingExceptions = queryString.getParam('catch');
|
||||
env.catchExceptions(typeof catchingExceptions === 'undefined' ?
|
||||
true : catchingExceptions);
|
||||
|
||||
var throwingExpectationFailures = queryString.getParam('throwFailures');
|
||||
env.throwOnExpectationFailure(throwingExpectationFailures);
|
||||
|
||||
var random = queryString.getParam('random');
|
||||
env.randomizeTests(random);
|
||||
|
||||
var seed = queryString.getParam('seed');
|
||||
if (seed) {
|
||||
env.seed(seed);
|
||||
}
|
||||
|
||||
// Reporters
|
||||
var htmlReporter = new jasmine.HtmlReporter({
|
||||
env: env,
|
||||
onRaiseExceptionsClick: function() {
|
||||
queryString.navigateWithNewParam('catch', !env.catchingExceptions());
|
||||
},
|
||||
onThrowExpectationsClick: function() {
|
||||
queryString.navigateWithNewParam('throwFailures',
|
||||
!env.throwingExpectationFailures());
|
||||
},
|
||||
onRandomClick: function() {
|
||||
queryString.navigateWithNewParam('random', !env.randomTests());
|
||||
},
|
||||
addToExistingQueryString: function(key, value) {
|
||||
return queryString.fullStringWithNewParam(key, value);
|
||||
},
|
||||
getContainer: function() { return document.body; },
|
||||
createElement: function() {
|
||||
return document.createElement.apply(document, arguments);
|
||||
},
|
||||
createTextNode: function() {
|
||||
return document.createTextNode.apply(document, arguments);
|
||||
},
|
||||
timer: new jasmine.Timer()
|
||||
});
|
||||
|
||||
env.addReporter(htmlReporter);
|
||||
|
||||
if (queryString.getParam('browser')) {
|
||||
var testReporter = new TestReporter(queryString.getParam('browser'),
|
||||
queryString.getParam('path'));
|
||||
env.addReporter(testReporter);
|
||||
}
|
||||
|
||||
// Filter which specs will be run by matching the start of the full name
|
||||
// against the `spec` query param.
|
||||
var specFilter = new jasmine.HtmlSpecFilter({
|
||||
filterString: function() { return queryString.getParam('spec'); }
|
||||
});
|
||||
|
||||
env.specFilter = function(spec) {
|
||||
return specFilter.matches(spec.getFullName());
|
||||
};
|
||||
|
||||
// Sets longer timeout.
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
||||
|
||||
// Replace the browser window's `onload`, ensure it's called, and then run
|
||||
// all of the loaded specs. This includes initializing the `HtmlReporter`
|
||||
// instance and then executing the loaded Jasmine environment.
|
||||
var currentWindowOnload = window.onload;
|
||||
|
||||
window.onload = function() {
|
||||
if (currentWindowOnload) {
|
||||
currentWindowOnload();
|
||||
}
|
||||
|
||||
initializePDFJS(function () {
|
||||
htmlReporter.initialize();
|
||||
env.execute();
|
||||
});
|
||||
};
|
||||
|
||||
function extend(destination, source) {
|
||||
for (var property in source) {
|
||||
destination[property] = source[property];
|
||||
}
|
||||
return destination;
|
||||
}
|
||||
}());
|
@ -1,25 +1,10 @@
|
||||
/* globals expect, it, describe, Dict, Name, Annotation, AnnotationBorderStyle,
|
||||
AnnotationBorderStyleType, AnnotationFlag, PDFJS, combineUrl,
|
||||
waitsFor, beforeEach, afterEach, stringToBytes */
|
||||
beforeEach, afterEach, stringToBytes */
|
||||
|
||||
'use strict';
|
||||
|
||||
describe('Annotation layer', function() {
|
||||
function waitsForPromiseResolved(promise, successCallback) {
|
||||
var resolved = false;
|
||||
promise.then(function(val) {
|
||||
resolved = true;
|
||||
successCallback(val);
|
||||
},
|
||||
function(error) {
|
||||
// Shouldn't get here.
|
||||
expect(error).toEqual('the promise should not have been rejected');
|
||||
});
|
||||
waitsFor(function() {
|
||||
return resolved;
|
||||
}, 20000);
|
||||
}
|
||||
|
||||
describe('Annotation', function() {
|
||||
it('should set and get flags', function() {
|
||||
var dict = new Dict();
|
||||
@ -66,7 +51,7 @@ describe('Annotation layer', function() {
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
annotation.setColor('red');
|
||||
|
||||
expect(annotation.color).toEqual([0, 0, 0]);
|
||||
expect(annotation.color).toEqual(new Uint8Array([0, 0, 0]));
|
||||
});
|
||||
|
||||
it('should set and get a transparent color', function() {
|
||||
@ -84,7 +69,7 @@ describe('Annotation layer', function() {
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
annotation.setColor([0.4]);
|
||||
|
||||
expect(annotation.color).toEqual([102, 102, 102]);
|
||||
expect(annotation.color).toEqual(new Uint8Array([102, 102, 102]));
|
||||
});
|
||||
|
||||
it('should set and get an RGB color', function() {
|
||||
@ -93,7 +78,7 @@ describe('Annotation layer', function() {
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
annotation.setColor([0, 0, 1]);
|
||||
|
||||
expect(annotation.color).toEqual([0, 0, 255]);
|
||||
expect(annotation.color).toEqual(new Uint8Array([0, 0, 255]));
|
||||
});
|
||||
|
||||
it('should set and get a CMYK color', function() {
|
||||
@ -102,7 +87,7 @@ describe('Annotation layer', function() {
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
annotation.setColor([0.1, 0.92, 0.84, 0.02]);
|
||||
|
||||
expect(annotation.color).toEqual([233, 59, 47]);
|
||||
expect(annotation.color).toEqual(new Uint8Array([233, 59, 47]));
|
||||
});
|
||||
|
||||
it('should not set and get an invalid color', function() {
|
||||
@ -111,7 +96,7 @@ describe('Annotation layer', function() {
|
||||
var annotation = new Annotation({ dict: dict, ref: 0 });
|
||||
annotation.setColor([0.4, 0.6]);
|
||||
|
||||
expect(annotation.color).toEqual([0, 0, 0]);
|
||||
expect(annotation.color).toEqual(new Uint8Array([0, 0, 0]));
|
||||
});
|
||||
});
|
||||
|
||||
@ -193,17 +178,19 @@ describe('Annotation layer', function() {
|
||||
var loadingTask;
|
||||
var annotations;
|
||||
|
||||
beforeEach(function() {
|
||||
beforeEach(function(done) {
|
||||
var pdfUrl = combineUrl(window.location.href,
|
||||
'../pdfs/annotation-fileattachment.pdf');
|
||||
loadingTask = PDFJS.getDocument(pdfUrl);
|
||||
waitsForPromiseResolved(loadingTask.promise, function(pdfDocument) {
|
||||
waitsForPromiseResolved(pdfDocument.getPage(1), function(pdfPage) {
|
||||
waitsForPromiseResolved(pdfPage.getAnnotations(),
|
||||
function (pdfAnnotations) {
|
||||
loadingTask.promise.then(function(pdfDocument) {
|
||||
return pdfDocument.getPage(1).then(function(pdfPage) {
|
||||
return pdfPage.getAnnotations().then(function (pdfAnnotations) {
|
||||
annotations = pdfAnnotations;
|
||||
done();
|
||||
});
|
||||
});
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* globals PDFJS, expect, it, describe, Promise, combineUrl, waitsFor,
|
||||
/* globals PDFJS, expect, it, describe, Promise, combineUrl,
|
||||
InvalidPDFException, MissingPDFException, StreamType, FontType,
|
||||
PDFDocumentProxy, PasswordException, PasswordResponses,
|
||||
PDFPageProxy, createPromiseCapability, beforeEach, afterEach */
|
||||
@ -8,35 +8,7 @@
|
||||
describe('api', function() {
|
||||
var basicApiUrl = combineUrl(window.location.href, '../pdfs/basicapi.pdf');
|
||||
var basicApiFileLength = 105779; // bytes
|
||||
var TEST_TIMEOUT = 20000;
|
||||
function waitsForPromiseResolved(promise, successCallback) {
|
||||
var resolved = false;
|
||||
promise.then(function(val) {
|
||||
resolved = true;
|
||||
successCallback(val);
|
||||
},
|
||||
function(error) {
|
||||
// Shouldn't get here.
|
||||
expect(error).toEqual('the promise should not have been rejected');
|
||||
});
|
||||
waitsFor(function() {
|
||||
return resolved;
|
||||
}, TEST_TIMEOUT);
|
||||
}
|
||||
function waitsForPromiseRejected(promise, failureCallback) {
|
||||
var rejected = false;
|
||||
promise.then(function(val) {
|
||||
// Shouldn't get here.
|
||||
expect(false).toEqual(true);
|
||||
},
|
||||
function(error) {
|
||||
rejected = true;
|
||||
failureCallback(error);
|
||||
});
|
||||
waitsFor(function() {
|
||||
return rejected;
|
||||
}, TEST_TIMEOUT);
|
||||
}
|
||||
|
||||
function waitSome(callback) {
|
||||
var WAIT_TIMEOUT = 10;
|
||||
setTimeout(function () {
|
||||
@ -46,7 +18,7 @@ describe('api', function() {
|
||||
|
||||
describe('PDFJS', function() {
|
||||
describe('getDocument', function() {
|
||||
it('creates pdf doc from URL', function() {
|
||||
it('creates pdf doc from URL', function(done) {
|
||||
var loadingTask = PDFJS.getDocument(basicApiUrl);
|
||||
|
||||
var isProgressReportedResolved = false;
|
||||
@ -65,34 +37,43 @@ describe('api', function() {
|
||||
progressReportedCapability.promise,
|
||||
loadingTask.promise
|
||||
];
|
||||
waitsForPromiseResolved(Promise.all(promises), function (data) {
|
||||
Promise.all(promises).then(function (data) {
|
||||
expect((data[0].loaded / data[0].total) > 0).toEqual(true);
|
||||
expect(data[1] instanceof PDFDocumentProxy).toEqual(true);
|
||||
expect(loadingTask).toEqual(data[1].loadingTask);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from URL and aborts before worker initialized',
|
||||
function() {
|
||||
function(done) {
|
||||
var loadingTask = PDFJS.getDocument(basicApiUrl);
|
||||
loadingTask.destroy();
|
||||
waitsForPromiseRejected(loadingTask.promise, function(reason) {
|
||||
loadingTask.promise.then(function(reason) {
|
||||
done.fail('shall fail loading');
|
||||
}).catch(function (reason) {
|
||||
expect(true).toEqual(true);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from URL and aborts loading after worker initialized',
|
||||
function() {
|
||||
function(done) {
|
||||
var loadingTask = PDFJS.getDocument(basicApiUrl);
|
||||
// This can be somewhat random -- we cannot guarantee perfect
|
||||
// 'Terminate' message to the worker before/after setting up pdfManager.
|
||||
var destroyed = loadingTask._worker.promise.then(function () {
|
||||
return loadingTask.destroy();
|
||||
});
|
||||
waitsForPromiseResolved(destroyed, function (data) {
|
||||
destroyed.then(function (data) {
|
||||
expect(true).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from typed array', function() {
|
||||
it('creates pdf doc from typed array', function(done) {
|
||||
var nonBinaryRequest = PDFJS.disableWorker;
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('GET', basicApiUrl, false);
|
||||
@ -123,32 +104,41 @@ describe('api', function() {
|
||||
expect(typedArrayPdf.length).toEqual(basicApiFileLength);
|
||||
|
||||
var loadingTask = PDFJS.getDocument(typedArrayPdf);
|
||||
waitsForPromiseResolved(loadingTask.promise, function(data) {
|
||||
loadingTask.promise.then(function(data) {
|
||||
expect(data instanceof PDFDocumentProxy).toEqual(true);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from invalid PDF file', function() {
|
||||
it('creates pdf doc from invalid PDF file', function(done) {
|
||||
// A severely corrupt PDF file (even Adobe Reader fails to open it).
|
||||
var url = combineUrl(window.location.href, '../pdfs/bug1020226.pdf');
|
||||
|
||||
var loadingTask = PDFJS.getDocument(url);
|
||||
waitsForPromiseRejected(loadingTask.promise, function (error) {
|
||||
loadingTask.promise.then(function () {
|
||||
done.fail('shall fail loading');
|
||||
}).catch(function (error) {
|
||||
expect(error instanceof InvalidPDFException).toEqual(true);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from non-existent URL', function() {
|
||||
it('creates pdf doc from non-existent URL', function(done) {
|
||||
var nonExistentUrl = combineUrl(window.location.href,
|
||||
'../pdfs/non-existent.pdf');
|
||||
var loadingTask = PDFJS.getDocument(nonExistentUrl);
|
||||
waitsForPromiseRejected(loadingTask.promise, function(error) {
|
||||
loadingTask.promise.then(function(error) {
|
||||
done.fail('shall fail loading');
|
||||
}).catch(function (error) {
|
||||
expect(error instanceof MissingPDFException).toEqual(true);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from PDF file protected with user and owner password',
|
||||
function () {
|
||||
function (done) {
|
||||
var url = combineUrl(window.location.href, '../pdfs/pr6531_1.pdf');
|
||||
var loadingTask = PDFJS.getDocument(url);
|
||||
|
||||
@ -185,50 +175,62 @@ describe('api', function() {
|
||||
passwordIncorrectCapability.promise,
|
||||
loadingTask.promise
|
||||
];
|
||||
waitsForPromiseResolved(Promise.all(promises), function (data) {
|
||||
Promise.all(promises).then(function (data) {
|
||||
expect(data[2] instanceof PDFDocumentProxy).toEqual(true);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('creates pdf doc from PDF file protected with only a user password',
|
||||
function () {
|
||||
function (done) {
|
||||
var url = combineUrl(window.location.href, '../pdfs/pr6531_2.pdf');
|
||||
|
||||
var passwordNeededLoadingTask = PDFJS.getDocument({
|
||||
url: url, password: '',
|
||||
});
|
||||
waitsForPromiseRejected(passwordNeededLoadingTask.promise,
|
||||
function (data) {
|
||||
var result1 = passwordNeededLoadingTask.promise.then(function () {
|
||||
done.fail('shall fail with no password');
|
||||
return passwordNeededLoadingTask.destroy();
|
||||
}, function (data) {
|
||||
expect(data instanceof PasswordException).toEqual(true);
|
||||
expect(data.code).toEqual(PasswordResponses.NEED_PASSWORD);
|
||||
passwordNeededLoadingTask.destroy();
|
||||
return passwordNeededLoadingTask.destroy();
|
||||
});
|
||||
|
||||
var passwordIncorrectLoadingTask = PDFJS.getDocument({
|
||||
url: url, password: 'qwerty',
|
||||
});
|
||||
waitsForPromiseRejected(passwordIncorrectLoadingTask.promise,
|
||||
function (data) {
|
||||
var result2 = passwordIncorrectLoadingTask.promise.then(function () {
|
||||
done.fail('shall fail with wrong password');
|
||||
return passwordNeededLoadingTask.destroy();
|
||||
}, function (data) {
|
||||
expect(data instanceof PasswordException).toEqual(true);
|
||||
expect(data.code).toEqual(PasswordResponses.INCORRECT_PASSWORD);
|
||||
passwordIncorrectLoadingTask.destroy();
|
||||
return passwordIncorrectLoadingTask.destroy();
|
||||
});
|
||||
|
||||
var passwordAcceptedLoadingTask = PDFJS.getDocument({
|
||||
url: url, password: 'asdfasdf',
|
||||
});
|
||||
waitsForPromiseResolved(passwordAcceptedLoadingTask.promise,
|
||||
function (data) {
|
||||
|
||||
var result3 = passwordAcceptedLoadingTask.promise.then(function (data) {
|
||||
expect(data instanceof PDFDocumentProxy).toEqual(true);
|
||||
passwordAcceptedLoadingTask.destroy();
|
||||
return passwordAcceptedLoadingTask.destroy();
|
||||
});
|
||||
Promise.all([result1, result2, result3]).then(function () {
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('PDFWorker', function() {
|
||||
it('worker created or destroyed', function () {
|
||||
it('worker created or destroyed', function (done) {
|
||||
var worker = new PDFJS.PDFWorker('test1');
|
||||
waitsForPromiseResolved(worker.promise, function () {
|
||||
worker.promise.then(function () {
|
||||
expect(worker.name).toEqual('test1');
|
||||
expect(!!worker.port).toEqual(true);
|
||||
expect(worker.destroyed).toEqual(false);
|
||||
@ -238,12 +240,15 @@ describe('api', function() {
|
||||
worker.destroy();
|
||||
expect(!!worker.port).toEqual(false);
|
||||
expect(worker.destroyed).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('worker created or destroyed by getDocument', function () {
|
||||
it('worker created or destroyed by getDocument', function (done) {
|
||||
var loadingTask = PDFJS.getDocument(basicApiUrl);
|
||||
var worker;
|
||||
waitsForPromiseResolved(loadingTask.promise, function () {
|
||||
loadingTask.promise.then(function () {
|
||||
worker = loadingTask._worker;
|
||||
expect(!!worker).toEqual(true);
|
||||
});
|
||||
@ -251,16 +256,19 @@ describe('api', function() {
|
||||
var destroyPromise = loadingTask.promise.then(function () {
|
||||
return loadingTask.destroy();
|
||||
});
|
||||
waitsForPromiseResolved(destroyPromise, function () {
|
||||
destroyPromise.then(function () {
|
||||
var destroyedWorker = loadingTask._worker;
|
||||
expect(!!destroyedWorker).toEqual(false);
|
||||
expect(worker.destroyed).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('worker created and can be used in getDocument', function () {
|
||||
it('worker created and can be used in getDocument', function (done) {
|
||||
var worker = new PDFJS.PDFWorker('test1');
|
||||
var loadingTask = PDFJS.getDocument({url: basicApiUrl, worker: worker});
|
||||
waitsForPromiseResolved(loadingTask.promise, function () {
|
||||
loadingTask.promise.then(function () {
|
||||
var docWorker = loadingTask._worker;
|
||||
expect(!!docWorker).toEqual(false);
|
||||
// checking is the same port is used in the MessageHandler
|
||||
@ -271,24 +279,30 @@ describe('api', function() {
|
||||
var destroyPromise = loadingTask.promise.then(function () {
|
||||
return loadingTask.destroy();
|
||||
});
|
||||
waitsForPromiseResolved(destroyPromise, function () {
|
||||
destroyPromise.then(function () {
|
||||
expect(worker.destroyed).toEqual(false);
|
||||
worker.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('creates more than one worker', function () {
|
||||
it('creates more than one worker', function (done) {
|
||||
var worker1 = new PDFJS.PDFWorker('test1');
|
||||
var worker2 = new PDFJS.PDFWorker('test2');
|
||||
var worker3 = new PDFJS.PDFWorker('test3');
|
||||
var ready = Promise.all([worker1.promise, worker2.promise,
|
||||
worker3.promise]);
|
||||
waitsForPromiseResolved(ready, function () {
|
||||
ready.then(function () {
|
||||
expect(worker1.port !== worker2.port &&
|
||||
worker1.port !== worker3.port &&
|
||||
worker2.port !== worker3.port).toEqual(true);
|
||||
worker1.destroy();
|
||||
worker2.destroy();
|
||||
worker3.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -296,10 +310,11 @@ describe('api', function() {
|
||||
var loadingTask;
|
||||
var doc;
|
||||
|
||||
beforeEach(function() {
|
||||
beforeEach(function(done) {
|
||||
loadingTask = PDFJS.getDocument(basicApiUrl);
|
||||
waitsForPromiseResolved(loadingTask.promise, function(data) {
|
||||
loadingTask.promise.then(function(data) {
|
||||
doc = data;
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
@ -315,54 +330,75 @@ describe('api', function() {
|
||||
expect(typeof fingerprint).toEqual('string');
|
||||
expect(fingerprint.length > 0).toEqual(true);
|
||||
});
|
||||
it('gets page', function() {
|
||||
it('gets page', function(done) {
|
||||
var promise = doc.getPage(1);
|
||||
waitsForPromiseResolved(promise, function(data) {
|
||||
promise.then(function(data) {
|
||||
expect(data instanceof PDFPageProxy).toEqual(true);
|
||||
expect(data.pageIndex).toEqual(0);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets non-existent page', function() {
|
||||
it('gets non-existent page', function(done) {
|
||||
var promise = doc.getPage(100);
|
||||
waitsForPromiseRejected(promise, function(data) {
|
||||
promise.then(function () {
|
||||
done.fail('shall fail for non-existent page');
|
||||
}, function(data) {
|
||||
expect(data instanceof Error).toEqual(true);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('gets page index', function() {
|
||||
it('gets page index', function(done) {
|
||||
// reference to second page
|
||||
var ref = {num: 17, gen: 0};
|
||||
var promise = doc.getPageIndex(ref);
|
||||
waitsForPromiseResolved(promise, function(pageIndex) {
|
||||
promise.then(function(pageIndex) {
|
||||
expect(pageIndex).toEqual(1);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets destinations', function() {
|
||||
it('gets destinations', function(done) {
|
||||
var promise = doc.getDestinations();
|
||||
waitsForPromiseResolved(promise, function(data) {
|
||||
promise.then(function(data) {
|
||||
expect(data).toEqual({ chapter1: [{ gen: 0, num: 17 }, { name: 'XYZ' },
|
||||
0, 841.89, null] });
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets a destination', function() {
|
||||
it('gets a destination', function(done) {
|
||||
var promise = doc.getDestination('chapter1');
|
||||
waitsForPromiseResolved(promise, function(data) {
|
||||
promise.then(function(data) {
|
||||
expect(data).toEqual([{ gen: 0, num: 17 }, { name: 'XYZ' },
|
||||
0, 841.89, null]);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets a non-existent destination', function() {
|
||||
it('gets a non-existent destination', function(done) {
|
||||
var promise = doc.getDestination('non-existent-named-destination');
|
||||
waitsForPromiseResolved(promise, function(data) {
|
||||
promise.then(function(data) {
|
||||
expect(data).toEqual(null);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets non-existent page labels', function () {
|
||||
it('gets non-existent page labels', function (done) {
|
||||
var promise = doc.getPageLabels();
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data).toEqual(null);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets page labels', function () {
|
||||
it('gets page labels', function (done) {
|
||||
// PageLabels with Roman/Arabic numerals.
|
||||
var url0 = combineUrl(window.location.href, '../pdfs/bug793632.pdf');
|
||||
var loadingTask0 = PDFJS.getDocument(url0);
|
||||
@ -384,8 +420,7 @@ describe('api', function() {
|
||||
return pdfDoc.getPageLabels();
|
||||
});
|
||||
|
||||
waitsForPromiseResolved(Promise.all([promise0, promise1, promise2]),
|
||||
function (pageLabels) {
|
||||
Promise.all([promise0, promise1, promise2]).then(function (pageLabels) {
|
||||
expect(pageLabels[0]).toEqual(['i', 'ii', 'iii', '1']);
|
||||
expect(pageLabels[1]).toEqual(['Front Page1']);
|
||||
expect(pageLabels[2]).toEqual(['1', '2']);
|
||||
@ -393,66 +428,86 @@ describe('api', function() {
|
||||
loadingTask0.destroy();
|
||||
loadingTask1.destroy();
|
||||
loadingTask2.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets attachments', function() {
|
||||
it('gets attachments', function(done) {
|
||||
var promise = doc.getAttachments();
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data).toEqual(null);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets javascript', function() {
|
||||
it('gets javascript', function(done) {
|
||||
var promise = doc.getJavaScript();
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data).toEqual([]);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
// Keep this in sync with the pattern in viewer.js. The pattern is used to
|
||||
// detect whether or not to automatically start printing.
|
||||
var viewerPrintRegExp = /\bprint\s*\(/;
|
||||
it('gets javascript with printing instructions (Print action)', function() {
|
||||
it('gets javascript with printing instructions (Print action)',
|
||||
function(done) {
|
||||
// PDF document with "Print" Named action in OpenAction
|
||||
var pdfUrl = combineUrl(window.location.href, '../pdfs/bug1001080.pdf');
|
||||
var loadingTask = PDFJS.getDocument(pdfUrl);
|
||||
var promise = loadingTask.promise.then(function(doc) {
|
||||
return doc.getJavaScript();
|
||||
});
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data).toEqual(['print({});']);
|
||||
expect(data[0]).toMatch(viewerPrintRegExp);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets javascript with printing instructions (JS action)', function() {
|
||||
it('gets javascript with printing instructions (JS action)',
|
||||
function(done) {
|
||||
// PDF document with "JavaScript" action in OpenAction
|
||||
var pdfUrl = combineUrl(window.location.href, '../pdfs/issue6106.pdf');
|
||||
var loadingTask = PDFJS.getDocument(pdfUrl);
|
||||
var promise = loadingTask.promise.then(function(doc) {
|
||||
return doc.getJavaScript();
|
||||
});
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data).toEqual(
|
||||
['this.print({bUI:true,bSilent:false,bShrinkToFit:true});']);
|
||||
expect(data[0]).toMatch(viewerPrintRegExp);
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets non-existent outline', function() {
|
||||
it('gets non-existent outline', function(done) {
|
||||
var url = combineUrl(window.location.href, '../pdfs/tracemonkey.pdf');
|
||||
var loadingTask = PDFJS.getDocument(url);
|
||||
|
||||
var promise = loadingTask.promise.then(function (pdfDocument) {
|
||||
return pdfDocument.getOutline();
|
||||
});
|
||||
waitsForPromiseResolved(promise, function (outline) {
|
||||
promise.then(function (outline) {
|
||||
expect(outline).toEqual(null);
|
||||
|
||||
loadingTask.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets outline', function() {
|
||||
it('gets outline', function(done) {
|
||||
var promise = doc.getOutline();
|
||||
waitsForPromiseResolved(promise, function(outline) {
|
||||
promise.then(function(outline) {
|
||||
// Two top level entries.
|
||||
expect(outline instanceof Array).toEqual(true);
|
||||
expect(outline.length).toEqual(2);
|
||||
@ -468,9 +523,12 @@ describe('api', function() {
|
||||
|
||||
expect(outlineItem.items.length).toEqual(1);
|
||||
expect(outlineItem.items[0].title).toEqual('Paragraph 1.1');
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets outline containing a url', function() {
|
||||
it('gets outline containing a url', function(done) {
|
||||
var pdfUrl = combineUrl(window.location.href, '../pdfs/issue3214.pdf');
|
||||
var loadingTask = PDFJS.getDocument(pdfUrl);
|
||||
|
||||
@ -490,38 +548,53 @@ describe('api', function() {
|
||||
expect(outlineItemOne.color).toEqual(new Uint8Array([0, 0, 0]));
|
||||
|
||||
loadingTask.destroy(); // Cleanup the worker.
|
||||
done();
|
||||
});
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets metadata', function() {
|
||||
it('gets metadata', function(done) {
|
||||
var promise = doc.getMetadata();
|
||||
waitsForPromiseResolved(promise, function(metadata) {
|
||||
promise.then(function(metadata) {
|
||||
expect(metadata.info['Title']).toEqual('Basic API Test');
|
||||
expect(metadata.info['PDFFormatVersion']).toEqual('1.7');
|
||||
expect(metadata.metadata.get('dc:title')).toEqual('Basic API Test');
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets data', function() {
|
||||
it('gets data', function(done) {
|
||||
var promise = doc.getData();
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data instanceof Uint8Array).toEqual(true);
|
||||
expect(data.length).toEqual(basicApiFileLength);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets download info', function() {
|
||||
it('gets download info', function(done) {
|
||||
var promise = doc.getDownloadInfo();
|
||||
waitsForPromiseResolved(promise, function (data) {
|
||||
promise.then(function (data) {
|
||||
expect(data).toEqual({ length: basicApiFileLength });
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets stats', function() {
|
||||
it('gets stats', function(done) {
|
||||
var promise = doc.getStats();
|
||||
waitsForPromiseResolved(promise, function (stats) {
|
||||
promise.then(function (stats) {
|
||||
expect(stats).toEqual({ streamTypes: [], fontTypes: [] });
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
|
||||
it('checks that fingerprints are unique', function() {
|
||||
it('checks that fingerprints are unique', function(done) {
|
||||
var url1 = combineUrl(window.location.href, '../pdfs/issue4436r.pdf');
|
||||
var loadingTask1 = PDFJS.getDocument(url1);
|
||||
|
||||
@ -530,7 +603,7 @@ describe('api', function() {
|
||||
|
||||
var promises = [loadingTask1.promise,
|
||||
loadingTask2.promise];
|
||||
waitsForPromiseResolved(Promise.all(promises), function (data) {
|
||||
Promise.all(promises).then(function (data) {
|
||||
var fingerprint1 = data[0].fingerprint;
|
||||
expect(typeof fingerprint1).toEqual('string');
|
||||
expect(fingerprint1.length > 0).toEqual(true);
|
||||
@ -543,6 +616,9 @@ describe('api', function() {
|
||||
|
||||
loadingTask1.destroy();
|
||||
loadingTask2.destroy();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -550,13 +626,16 @@ describe('api', function() {
|
||||
var loadingTask;
|
||||
var pdfDocument, page;
|
||||
|
||||
beforeEach(function() {
|
||||
beforeEach(function(done) {
|
||||
loadingTask = PDFJS.getDocument(basicApiUrl);
|
||||
waitsForPromiseResolved(loadingTask.promise, function(doc) {
|
||||
loadingTask.promise.then(function(doc) {
|
||||
pdfDocument = doc;
|
||||
waitsForPromiseResolved(pdfDocument.getPage(1), function(data) {
|
||||
pdfDocument.getPage(1).then(function(data) {
|
||||
page = data;
|
||||
done();
|
||||
});
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
|
||||
@ -585,23 +664,28 @@ describe('api', function() {
|
||||
expect(viewport.width).toEqual(1262.835);
|
||||
expect(viewport.height).toEqual(892.92);
|
||||
});
|
||||
it('gets annotations', function () {
|
||||
var defaultPromise = page.getAnnotations();
|
||||
waitsForPromiseResolved(defaultPromise, function (data) {
|
||||
it('gets annotations', function (done) {
|
||||
var defaultPromise = page.getAnnotations().then(function (data) {
|
||||
expect(data.length).toEqual(4);
|
||||
});
|
||||
|
||||
var displayPromise = page.getAnnotations({ intent: 'display' });
|
||||
waitsForPromiseResolved(displayPromise, function (data) {
|
||||
var displayPromise = page.getAnnotations({ intent: 'display' }).then(
|
||||
function (data) {
|
||||
expect(data.length).toEqual(4);
|
||||
});
|
||||
|
||||
var printPromise = page.getAnnotations({ intent: 'print' });
|
||||
waitsForPromiseResolved(printPromise, function (data) {
|
||||
var printPromise = page.getAnnotations({ intent: 'print' }).then(
|
||||
function (data) {
|
||||
expect(data.length).toEqual(4);
|
||||
});
|
||||
Promise.all([defaultPromise, displayPromise, printPromise]).then(
|
||||
function () {
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets text content', function () {
|
||||
it('gets text content', function (done) {
|
||||
var defaultPromise = page.getTextContent();
|
||||
var normalizeWhitespacePromise = page.getTextContent({
|
||||
normalizeWhitespace: true });
|
||||
@ -610,24 +694,30 @@ describe('api', function() {
|
||||
defaultPromise,
|
||||
normalizeWhitespacePromise
|
||||
];
|
||||
waitsForPromiseResolved(Promise.all(promises), function (data) {
|
||||
Promise.all(promises).then(function (data) {
|
||||
expect(!!data[0].items).toEqual(true);
|
||||
expect(data[0].items.length).toEqual(7);
|
||||
expect(!!data[0].styles).toEqual(true);
|
||||
|
||||
// A simple check that ensures the two `textContent` object match.
|
||||
expect(JSON.stringify(data[0])).toEqual(JSON.stringify(data[1]));
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets operator list', function() {
|
||||
it('gets operator list', function(done) {
|
||||
var promise = page.getOperatorList();
|
||||
waitsForPromiseResolved(promise, function (oplist) {
|
||||
promise.then(function (oplist) {
|
||||
expect(!!oplist.fnArray).toEqual(true);
|
||||
expect(!!oplist.argsArray).toEqual(true);
|
||||
expect(oplist.lastChunk).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('gets stats after parsing page', function () {
|
||||
it('gets stats after parsing page', function (done) {
|
||||
var promise = page.getOperatorList().then(function () {
|
||||
return pdfDocument.getStats();
|
||||
});
|
||||
@ -637,9 +727,12 @@ describe('api', function() {
|
||||
expectedFontTypes[FontType.TYPE1] = true;
|
||||
expectedFontTypes[FontType.CIDFONTTYPE2] = true;
|
||||
|
||||
waitsForPromiseResolved(promise, function (stats) {
|
||||
promise.then(function (stats) {
|
||||
expect(stats).toEqual({ streamTypes: expectedStreamTypes,
|
||||
fontTypes: expectedFontTypes });
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -677,23 +770,25 @@ describe('api', function() {
|
||||
});
|
||||
}
|
||||
|
||||
afterEach(function() {
|
||||
afterEach(function(done) {
|
||||
// Issue 6205 reported an issue with font rendering, so clear the loaded
|
||||
// fonts so that we can see whether loading PDFs in parallel does not
|
||||
// cause any issues with the rendered fonts.
|
||||
var destroyPromises = pdfDocuments.map(function(pdfDocument) {
|
||||
return pdfDocument.destroy();
|
||||
});
|
||||
waitsForPromiseResolved(Promise.all(destroyPromises), function() {});
|
||||
|
||||
// Destroy the workers.
|
||||
destroyPromises = loadingTasks.map(function(loadingTask) {
|
||||
var destroyPromises2 = loadingTasks.map(function(loadingTask) {
|
||||
return loadingTask.destroy();
|
||||
});
|
||||
waitsForPromiseResolved(Promise.all(destroyPromises), function() {});
|
||||
|
||||
Promise.all(destroyPromises.concat(destroyPromises2)).then(function() {
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should correctly render PDFs in parallel', function() {
|
||||
it('should correctly render PDFs in parallel', function(done) {
|
||||
var baseline1, baseline2, baseline3;
|
||||
var promiseDone = renderPDF(pdf1).then(function(data1) {
|
||||
baseline1 = data1;
|
||||
@ -714,7 +809,11 @@ describe('api', function() {
|
||||
expect(dataUrls[2]).toEqual(baseline3);
|
||||
return true;
|
||||
});
|
||||
waitsForPromiseResolved(promiseDone, function() {});
|
||||
promiseDone.then(function() {
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('PDFDataRangeTransport', function () {
|
||||
@ -734,7 +833,7 @@ describe('api', function() {
|
||||
});
|
||||
return loadPromise;
|
||||
}
|
||||
it('should fetch document info and page using ranges', function () {
|
||||
it('should fetch document info and page using ranges', function (done) {
|
||||
var transport;
|
||||
var initialDataLength = 4000;
|
||||
var fetches = 0;
|
||||
@ -758,14 +857,17 @@ describe('api', function() {
|
||||
return pagePromise;
|
||||
});
|
||||
|
||||
waitsForPromiseResolved(getPagePromise, function (page) {
|
||||
getPagePromise.then(function (page) {
|
||||
expect(pdfDocument.numPages).toEqual(14);
|
||||
expect(page.rotate).toEqual(0);
|
||||
expect(fetches).toBeGreaterThan(2);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('should fetch document info and page using range and streaming',
|
||||
function () {
|
||||
function (done) {
|
||||
var transport;
|
||||
var initialDataLength = 4000;
|
||||
var fetches = 0;
|
||||
@ -792,10 +894,13 @@ describe('api', function() {
|
||||
return pagePromise;
|
||||
});
|
||||
|
||||
waitsForPromiseResolved(getPagePromise, function (page) {
|
||||
getPagePromise.then(function (page) {
|
||||
expect(pdfDocument.numPages).toEqual(14);
|
||||
expect(page.rotate).toEqual(0);
|
||||
expect(fetches).toEqual(1);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* globals expect, it, describe, StringStream, CMapFactory, Name, CMap,
|
||||
IdentityCMap, waitsFor */
|
||||
IdentityCMap */
|
||||
|
||||
'use strict';
|
||||
|
||||
@ -7,93 +7,92 @@ var cMapUrl = '../../external/bcmaps/';
|
||||
var cMapPacked = true;
|
||||
|
||||
describe('cmap', function() {
|
||||
var TEST_TIMEOUT = 20000;
|
||||
function waitsForPromiseResolved(promise, successCallback) {
|
||||
var resolved = false;
|
||||
promise.then(function(val) {
|
||||
resolved = true;
|
||||
successCallback(val);
|
||||
},
|
||||
function(error) {
|
||||
// Shouldn't get here.
|
||||
expect(error).toEqual('the promise should not have been rejected');
|
||||
});
|
||||
waitsFor(function() {
|
||||
return resolved;
|
||||
}, TEST_TIMEOUT);
|
||||
}
|
||||
|
||||
it('parses beginbfchar', function() {
|
||||
it('parses beginbfchar', function(done) {
|
||||
var str = '2 beginbfchar\n' +
|
||||
'<03> <00>\n' +
|
||||
'<04> <01>\n' +
|
||||
'endbfchar\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.lookup(0x03)).toEqual(String.fromCharCode(0x00));
|
||||
expect(cmap.lookup(0x04)).toEqual(String.fromCharCode(0x01));
|
||||
expect(cmap.lookup(0x05)).toBeUndefined();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('parses beginbfrange with range', function() {
|
||||
it('parses beginbfrange with range', function(done) {
|
||||
var str = '1 beginbfrange\n' +
|
||||
'<06> <0B> 0\n' +
|
||||
'endbfrange\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.lookup(0x05)).toBeUndefined();
|
||||
expect(cmap.lookup(0x06)).toEqual(String.fromCharCode(0x00));
|
||||
expect(cmap.lookup(0x0B)).toEqual(String.fromCharCode(0x05));
|
||||
expect(cmap.lookup(0x0C)).toBeUndefined();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('parses beginbfrange with array', function() {
|
||||
it('parses beginbfrange with array', function(done) {
|
||||
var str = '1 beginbfrange\n' +
|
||||
'<0D> <12> [ 0 1 2 3 4 5 ]\n' +
|
||||
'endbfrange\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.lookup(0x0C)).toBeUndefined();
|
||||
expect(cmap.lookup(0x0D)).toEqual(0x00);
|
||||
expect(cmap.lookup(0x12)).toEqual(0x05);
|
||||
expect(cmap.lookup(0x13)).toBeUndefined();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('parses begincidchar', function() {
|
||||
it('parses begincidchar', function(done) {
|
||||
var str = '1 begincidchar\n' +
|
||||
'<14> 0\n' +
|
||||
'endcidchar\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.lookup(0x14)).toEqual(0x00);
|
||||
expect(cmap.lookup(0x15)).toBeUndefined();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('parses begincidrange', function() {
|
||||
it('parses begincidrange', function(done) {
|
||||
var str = '1 begincidrange\n' +
|
||||
'<0016> <001B> 0\n' +
|
||||
'endcidrange\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.lookup(0x15)).toBeUndefined();
|
||||
expect(cmap.lookup(0x16)).toEqual(0x00);
|
||||
expect(cmap.lookup(0x1B)).toEqual(0x05);
|
||||
expect(cmap.lookup(0x1C)).toBeUndefined();
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('decodes codespace ranges', function() {
|
||||
it('decodes codespace ranges', function(done) {
|
||||
var str = '1 begincodespacerange\n' +
|
||||
'<01> <02>\n' +
|
||||
'<00000003> <00000004>\n' +
|
||||
'endcodespacerange\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
var c = {};
|
||||
cmap.readCharCode(String.fromCharCode(1), 0, c);
|
||||
expect(c.charcode).toEqual(1);
|
||||
@ -101,70 +100,91 @@ describe('cmap', function() {
|
||||
cmap.readCharCode(String.fromCharCode(0, 0, 0, 3), 0, c);
|
||||
expect(c.charcode).toEqual(3);
|
||||
expect(c.length).toEqual(4);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('decodes 4 byte codespace ranges', function() {
|
||||
it('decodes 4 byte codespace ranges', function(done) {
|
||||
var str = '1 begincodespacerange\n' +
|
||||
'<8EA1A1A1> <8EA1FEFE>\n' +
|
||||
'endcodespacerange\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
var c = {};
|
||||
cmap.readCharCode(String.fromCharCode(0x8E, 0xA1, 0xA1, 0xA1), 0, c);
|
||||
expect(c.charcode).toEqual(0x8EA1A1A1);
|
||||
expect(c.length).toEqual(4);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('read usecmap', function() {
|
||||
it('read usecmap', function(done) {
|
||||
var str = '/Adobe-Japan1-1 usecmap\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream,
|
||||
{ url: cMapUrl, packed: cMapPacked }, null);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap instanceof CMap).toEqual(true);
|
||||
expect(cmap.useCMap).not.toBeNull();
|
||||
expect(cmap.builtInCMap).toBeFalsy();
|
||||
expect(cmap.length).toEqual(0x20A7);
|
||||
expect(cmap.isIdentityCMap).toEqual(false);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('parses cmapname', function() {
|
||||
it('parses cmapname', function(done) {
|
||||
var str = '/CMapName /Identity-H def\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.name).toEqual('Identity-H');
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('parses wmode', function() {
|
||||
it('parses wmode', function(done) {
|
||||
var str = '/WMode 1 def\n';
|
||||
var stream = new StringStream(str);
|
||||
var cmapPromise = CMapFactory.create(stream);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap.vertical).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('loads built in cmap', function() {
|
||||
it('loads built in cmap', function(done) {
|
||||
var cmapPromise = CMapFactory.create(new Name('Adobe-Japan1-1'),
|
||||
{ url: cMapUrl, packed: cMapPacked }, null);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap instanceof CMap).toEqual(true);
|
||||
expect(cmap.useCMap).toBeNull();
|
||||
expect(cmap.builtInCMap).toBeTruthy();
|
||||
expect(cmap.length).toEqual(0x20A7);
|
||||
expect(cmap.isIdentityCMap).toEqual(false);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
it('loads built in identity cmap', function() {
|
||||
it('loads built in identity cmap', function(done) {
|
||||
var cmapPromise = CMapFactory.create(new Name('Identity-H'),
|
||||
{ url: cMapUrl, packed: cMapPacked }, null);
|
||||
waitsForPromiseResolved(cmapPromise, function (cmap) {
|
||||
cmapPromise.then(function (cmap) {
|
||||
expect(cmap instanceof IdentityCMap).toEqual(true);
|
||||
expect(cmap.vertical).toEqual(false);
|
||||
expect(cmap.length).toEqual(0x10000);
|
||||
expect(function() { return cmap.isIdentityCMap; }).toThrow(
|
||||
new Error('should not access .isIdentityCMap'));
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -599,16 +599,20 @@ describe('CipherTransformFactory', function() {
|
||||
describe('AES256 Revision 5', function () {
|
||||
it('should accept user password', function () {
|
||||
new CipherTransformFactory(new DictMock(aes256Map), fileID1, 'user');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
it('should accept owner password', function () {
|
||||
new CipherTransformFactory(new DictMock(aes256Map), fileID1, 'owner');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
it('should not accept wrong password', function () {
|
||||
ensureCipherTransformFactoryPasswordIncorrect(
|
||||
new DictMock(aes256Map), fileID1, 'wrong');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
it('should accept blank password', function () {
|
||||
new CipherTransformFactory(new DictMock(aes256BlankMap), fileID1);
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
@ -616,34 +620,42 @@ describe('CipherTransformFactory', function() {
|
||||
it('should accept user password', function () {
|
||||
new CipherTransformFactory(new DictMock(aes256IsoMap), fileID1,
|
||||
'user');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
it('should accept owner password', function () {
|
||||
new CipherTransformFactory(new DictMock(aes256IsoMap), fileID1,
|
||||
'owner');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
it('should not accept wrong password', function () {
|
||||
ensureCipherTransformFactoryPasswordIncorrect(
|
||||
new DictMock(aes256IsoMap), fileID1, 'wrong');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
it('should accept blank password', function () {
|
||||
new CipherTransformFactory(new DictMock(aes256IBlankMap), fileID1);
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
});
|
||||
it('should accept user password', function() {
|
||||
new CipherTransformFactory(new DictMock(map1), fileID1, '123456');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
it('should accept owner password', function() {
|
||||
new CipherTransformFactory(new DictMock(map1), fileID1, '654321');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
it('should not accept wrong password', function() {
|
||||
ensureCipherTransformFactoryPasswordIncorrect(
|
||||
new DictMock(map1), fileID1, 'wrong');
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
it('should accept no password', function() {
|
||||
new CipherTransformFactory(new DictMock(map2), fileID2);
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* globals expect, it, describe, PartialEvaluator, StringStream, OPS,
|
||||
OperatorList, waitsFor, runs, Dict, Name, Stream, WorkerTask */
|
||||
OperatorList, Dict, Name, Stream, WorkerTask */
|
||||
|
||||
'use strict';
|
||||
|
||||
@ -29,24 +29,17 @@ describe('evaluator', function() {
|
||||
|
||||
function PdfManagerMock() { }
|
||||
|
||||
function runOperatorListCheck(evaluator, stream, resources, check) {
|
||||
var done = false;
|
||||
runs(function () {
|
||||
var result = new OperatorList();
|
||||
var task = new WorkerTask('OperatorListCheck');
|
||||
evaluator.getOperatorList(stream, task, resources, result).then(
|
||||
function () {
|
||||
check(result);
|
||||
done = true;
|
||||
});
|
||||
});
|
||||
waitsFor(function () {
|
||||
return done;
|
||||
function runOperatorListCheck(evaluator, stream, resources, callback) {
|
||||
var result = new OperatorList();
|
||||
var task = new WorkerTask('OperatorListCheck');
|
||||
evaluator.getOperatorList(stream, task, resources, result).then(
|
||||
function () {
|
||||
callback(result);
|
||||
});
|
||||
}
|
||||
|
||||
describe('splitCombinedOperations', function() {
|
||||
it('should reject unknown operations', function() {
|
||||
it('should reject unknown operations', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -58,10 +51,11 @@ describe('evaluator', function() {
|
||||
expect(result.fnArray.length).toEqual(1);
|
||||
expect(result.fnArray[0]).toEqual(OPS.fill);
|
||||
expect(result.argsArray[0]).toEqual(null);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle one operations', function() {
|
||||
it('should handle one operations', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -71,10 +65,11 @@ describe('evaluator', function() {
|
||||
expect(!!result.fnArray && !!result.argsArray).toEqual(true);
|
||||
expect(result.fnArray.length).toEqual(1);
|
||||
expect(result.fnArray[0]).toEqual(OPS.restore);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle two glued operations', function() {
|
||||
it('should handle two glued operations', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -86,10 +81,11 @@ describe('evaluator', function() {
|
||||
expect(result.fnArray.length).toEqual(2);
|
||||
expect(result.fnArray[0]).toEqual(OPS.paintXObject);
|
||||
expect(result.fnArray[1]).toEqual(OPS.restore);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle tree glued operations', function() {
|
||||
it('should handle tree glued operations', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -101,10 +97,11 @@ describe('evaluator', function() {
|
||||
expect(result.fnArray[0]).toEqual(OPS.fill);
|
||||
expect(result.fnArray[1]).toEqual(OPS.fill);
|
||||
expect(result.fnArray[2]).toEqual(OPS.fill);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle three glued operations #2', function() {
|
||||
it('should handle three glued operations #2', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -117,10 +114,11 @@ describe('evaluator', function() {
|
||||
expect(result.fnArray[0]).toEqual(OPS.eoFillStroke);
|
||||
expect(result.fnArray[1]).toEqual(OPS.fillStroke);
|
||||
expect(result.fnArray[2]).toEqual(OPS.eoFill);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle glued operations and operands', function() {
|
||||
it('should handle glued operations and operands', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -134,10 +132,11 @@ describe('evaluator', function() {
|
||||
expect(result.argsArray.length).toEqual(2);
|
||||
expect(result.argsArray[1].length).toEqual(1);
|
||||
expect(result.argsArray[1][0]).toEqual(5);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle glued operations and literals', function() {
|
||||
it('should handle glued operations and literals', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -155,12 +154,13 @@ describe('evaluator', function() {
|
||||
expect(result.argsArray[1].length).toEqual(1);
|
||||
expect(result.argsArray[1][0]).toEqual(false);
|
||||
expect(result.argsArray[2]).toEqual(null);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('validateNumberOfArgs', function() {
|
||||
it('should execute if correct number of arguments', function() {
|
||||
it('should execute if correct number of arguments', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -170,9 +170,10 @@ describe('evaluator', function() {
|
||||
expect(result.argsArray[0][0]).toEqual(5);
|
||||
expect(result.argsArray[0][1]).toEqual(1);
|
||||
expect(result.fnArray[0]).toEqual(OPS.setCharWidth);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should execute if too many arguments', function() {
|
||||
it('should execute if too many arguments', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -182,9 +183,10 @@ describe('evaluator', function() {
|
||||
expect(result.argsArray[0][0]).toEqual(1);
|
||||
expect(result.argsArray[0][1]).toEqual(4);
|
||||
expect(result.fnArray[0]).toEqual(OPS.setCharWidth);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should execute if nested commands', function() {
|
||||
it('should execute if nested commands', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -199,9 +201,10 @@ describe('evaluator', function() {
|
||||
expect(result.argsArray[0].length).toEqual(1);
|
||||
expect(result.argsArray[1].length).toEqual(1);
|
||||
expect(result.argsArray[2].length).toEqual(2);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should skip if too few arguments', function() {
|
||||
it('should skip if too few arguments', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -210,9 +213,10 @@ describe('evaluator', function() {
|
||||
function (result) {
|
||||
expect(result.argsArray).toEqual([]);
|
||||
expect(result.fnArray).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should close opened saves', function() {
|
||||
it('should close opened saves', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -225,9 +229,10 @@ describe('evaluator', function() {
|
||||
expect(result.fnArray[1]).toEqual(OPS.save);
|
||||
expect(result.fnArray[2]).toEqual(OPS.restore);
|
||||
expect(result.fnArray[3]).toEqual(OPS.restore);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should skip paintXObject if name is missing', function() {
|
||||
it('should skip paintXObject if name is missing', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -236,9 +241,10 @@ describe('evaluator', function() {
|
||||
function (result) {
|
||||
expect(result.argsArray).toEqual([]);
|
||||
expect(result.fnArray).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should skip paintXObject if subtype is PS', function() {
|
||||
it('should skip paintXObject if subtype is PS', function(done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
@ -256,51 +262,41 @@ describe('evaluator', function() {
|
||||
runOperatorListCheck(evaluator, stream, resources, function (result) {
|
||||
expect(result.argsArray).toEqual([]);
|
||||
expect(result.fnArray).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('thread control', function() {
|
||||
it('should abort operator list parsing', function () {
|
||||
it('should abort operator list parsing', function (done) {
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
var stream = new StringStream('qqQQ');
|
||||
var resources = new ResourcesMock();
|
||||
var done = false;
|
||||
runs(function () {
|
||||
var result = new OperatorList();
|
||||
var task = new WorkerTask('OperatorListAbort');
|
||||
task.terminate();
|
||||
evaluator.getOperatorList(stream, task, resources, result).catch(
|
||||
function () {
|
||||
done = true;
|
||||
expect(!!result.fnArray && !!result.argsArray).toEqual(true);
|
||||
expect(result.fnArray.length).toEqual(0);
|
||||
});
|
||||
});
|
||||
waitsFor(function () {
|
||||
return done;
|
||||
});
|
||||
var result = new OperatorList();
|
||||
var task = new WorkerTask('OperatorListAbort');
|
||||
task.terminate();
|
||||
evaluator.getOperatorList(stream, task, resources, result).catch(
|
||||
function () {
|
||||
expect(!!result.fnArray && !!result.argsArray).toEqual(true);
|
||||
expect(result.fnArray.length).toEqual(0);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('should abort text parsing parsing', function () {
|
||||
it('should abort text parsing parsing', function (done) {
|
||||
var resources = new ResourcesMock();
|
||||
var evaluator = new PartialEvaluator(new PdfManagerMock(),
|
||||
new XrefMock(), new HandlerMock(),
|
||||
'prefix');
|
||||
var stream = new StringStream('qqQQ');
|
||||
var done = false;
|
||||
runs(function () {
|
||||
var task = new WorkerTask('TextContentAbort');
|
||||
task.terminate();
|
||||
evaluator.getTextContent(stream, task, resources).catch(
|
||||
function () {
|
||||
done = true;
|
||||
});
|
||||
});
|
||||
waitsFor(function () {
|
||||
return done;
|
||||
});
|
||||
var task = new WorkerTask('TextContentAbort');
|
||||
task.terminate();
|
||||
evaluator.getTextContent(stream, task, resources).catch(
|
||||
function () {
|
||||
expect(true).toEqual(true);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -29,6 +29,14 @@ describe('font', function() {
|
||||
}
|
||||
};
|
||||
|
||||
function createWithNullProto(obj) {
|
||||
var result = Object.create(null);
|
||||
for (var i in obj) {
|
||||
result[i] = obj[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
describe('CFFParser', function() {
|
||||
var parser = new CFFParser(fontData, {});
|
||||
var cff = parser.parse();
|
||||
@ -226,7 +234,7 @@ describe('font', function() {
|
||||
]);
|
||||
parser.bytes = bytes;
|
||||
var encoding = parser.parseEncoding(2, {}, new CFFStrings(), null);
|
||||
expect(encoding.encoding).toEqual({0x8: 1});
|
||||
expect(encoding.encoding).toEqual(createWithNullProto({0x8: 1}));
|
||||
});
|
||||
|
||||
it('parses encoding format 1', function() {
|
||||
@ -239,7 +247,8 @@ describe('font', function() {
|
||||
]);
|
||||
parser.bytes = bytes;
|
||||
var encoding = parser.parseEncoding(2, {}, new CFFStrings(), null);
|
||||
expect(encoding.encoding).toEqual({0x7: 0x01, 0x08: 0x02});
|
||||
expect(encoding.encoding).toEqual(
|
||||
createWithNullProto({0x7: 0x01, 0x08: 0x02}));
|
||||
});
|
||||
|
||||
it('parses fdselect format 0', function() {
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* globals expect, it, describe, beforeEach, isArray, StringStream,
|
||||
/* globals jasmine, expect, it, describe, beforeEach, isArray, StringStream,
|
||||
PostScriptParser, PostScriptLexer, PostScriptEvaluator,
|
||||
PostScriptCompiler*/
|
||||
|
||||
@ -6,31 +6,42 @@
|
||||
|
||||
describe('function', function() {
|
||||
beforeEach(function() {
|
||||
this.addMatchers({
|
||||
toMatchArray: function(expected) {
|
||||
var actual = this.actual;
|
||||
if (actual.length !== expected.length) {
|
||||
return false;
|
||||
}
|
||||
for (var i = 0; i < expected.length; i++) {
|
||||
var a = actual[i], b = expected[i];
|
||||
if (isArray(b)) {
|
||||
if (a.length !== b.length) {
|
||||
return false;
|
||||
jasmine.addMatchers({
|
||||
toMatchArray: function(util, customEqualityTesters) {
|
||||
return {
|
||||
compare: function (actual, expected) {
|
||||
var result = {};
|
||||
if (actual.length !== expected.length) {
|
||||
result.pass = false;
|
||||
result.message = 'Array length: ' + actual.length +
|
||||
', expected: ' + expected.length;
|
||||
return result;
|
||||
}
|
||||
for (var j = 0; j < a.length; j++) {
|
||||
var suba = a[j], subb = b[j];
|
||||
if (suba !== subb) {
|
||||
return false;
|
||||
result.pass = true;
|
||||
for (var i = 0; i < expected.length; i++) {
|
||||
var a = actual[i], b = expected[i];
|
||||
if (isArray(b)) {
|
||||
if (a.length !== b.length) {
|
||||
result.pass = false;
|
||||
break;
|
||||
}
|
||||
for (var j = 0; j < a.length; j++) {
|
||||
var suba = a[j], subb = b[j];
|
||||
if (suba !== subb) {
|
||||
result.pass = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (a !== b) {
|
||||
result.pass = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (a !== b) {
|
||||
return false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
});
|
||||
});
|
||||
|
208
test/unit/jasmine-boot.js
Normal file
208
test/unit/jasmine-boot.js
Normal file
@ -0,0 +1,208 @@
|
||||
/* Copyright 2016 Mozilla Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*
|
||||
Copyright (c) 2008-2016 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.
|
||||
*/
|
||||
/*globals jasmineRequire, jasmine, TestReporter */
|
||||
|
||||
// Modified jasmine's boot.js file to load PDF.js libraries async.
|
||||
|
||||
'use strict';
|
||||
|
||||
var pdfjsLibs;
|
||||
|
||||
function initializePDFJS(callback) {
|
||||
require.config({paths: {'pdfjs': '../../src'}});
|
||||
require(['pdfjs/shared/util', 'pdfjs/display/global', 'pdfjs/core/primitives',
|
||||
'pdfjs/core/annotation', 'pdfjs/core/crypto', 'pdfjs/core/stream',
|
||||
'pdfjs/core/fonts', 'pdfjs/core/ps_parser', 'pdfjs/core/function',
|
||||
'pdfjs/core/parser', 'pdfjs/core/evaluator', 'pdfjs/core/cmap',
|
||||
'pdfjs/core/worker', 'pdfjs/core/network', 'pdfjs/display/api',
|
||||
'pdfjs/display/metadata', 'pdfjs/display/dom_utils'],
|
||||
function (sharedUtil, displayGlobal, corePrimitives, coreAnnotation,
|
||||
coreCrypto, coreStream, coreFonts, corePsParser, coreFunction,
|
||||
coreParser, coreEvaluator, coreCMap, coreWorker, coreNetwork,
|
||||
displayAPI, displayMetadata, displayDOMUtils) {
|
||||
|
||||
pdfjsLibs = {
|
||||
sharedUtil: sharedUtil,
|
||||
displayGlobal: displayGlobal,
|
||||
corePrimitives: corePrimitives,
|
||||
coreAnnotation: coreAnnotation,
|
||||
coreCrypto: coreCrypto,
|
||||
coreStream: coreStream,
|
||||
coreFonts: coreFonts,
|
||||
corePsParser: corePsParser,
|
||||
coreFunction: coreFunction,
|
||||
coreParser: coreParser,
|
||||
coreEvaluator: coreEvaluator,
|
||||
coreCMap: coreCMap,
|
||||
coreWorker: coreWorker,
|
||||
coreNetwork: coreNetwork,
|
||||
displayAPI: displayAPI,
|
||||
displayMetadata: displayMetadata,
|
||||
displayDOMUtils: displayDOMUtils
|
||||
};
|
||||
|
||||
// Expose all loaded internal exported members to global scope.
|
||||
Object.keys(pdfjsLibs).forEach(function (libName) {
|
||||
var lib = pdfjsLibs[libName];
|
||||
Object.keys(lib).forEach(function (name) {
|
||||
if (Object.getOwnPropertyDescriptor(window, name)) {
|
||||
return; // ignoring if already set
|
||||
}
|
||||
window[name] = lib[name];
|
||||
});
|
||||
});
|
||||
|
||||
// Configure the worker.
|
||||
displayGlobal.PDFJS.workerSrc = '../../src/worker_loader.js';
|
||||
|
||||
// Release describe() calls.
|
||||
window.describe = oldDescribe;
|
||||
describeQueue.forEach(function (args) {
|
||||
oldDescribe.apply(window, args);
|
||||
});
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
(function() {
|
||||
window.jasmine = jasmineRequire.core(jasmineRequire);
|
||||
|
||||
jasmineRequire.html(jasmine);
|
||||
|
||||
var env = jasmine.getEnv();
|
||||
|
||||
var jasmineInterface = jasmineRequire.interface(jasmine, env);
|
||||
extend(window, jasmineInterface);
|
||||
|
||||
// Runner Parameters
|
||||
var queryString = new jasmine.QueryString({
|
||||
getWindowLocation: function() { return window.location; }
|
||||
});
|
||||
|
||||
var catchingExceptions = queryString.getParam('catch');
|
||||
env.catchExceptions(typeof catchingExceptions === 'undefined' ?
|
||||
true : catchingExceptions);
|
||||
|
||||
var throwingExpectationFailures = queryString.getParam('throwFailures');
|
||||
env.throwOnExpectationFailure(throwingExpectationFailures);
|
||||
|
||||
var random = queryString.getParam('random');
|
||||
env.randomizeTests(random);
|
||||
|
||||
var seed = queryString.getParam('seed');
|
||||
if (seed) {
|
||||
env.seed(seed);
|
||||
}
|
||||
|
||||
// Reporters
|
||||
var htmlReporter = new jasmine.HtmlReporter({
|
||||
env: env,
|
||||
onRaiseExceptionsClick: function() {
|
||||
queryString.navigateWithNewParam('catch', !env.catchingExceptions());
|
||||
},
|
||||
onThrowExpectationsClick: function() {
|
||||
queryString.navigateWithNewParam('throwFailures',
|
||||
!env.throwingExpectationFailures());
|
||||
},
|
||||
onRandomClick: function() {
|
||||
queryString.navigateWithNewParam('random', !env.randomTests());
|
||||
},
|
||||
addToExistingQueryString: function(key, value) {
|
||||
return queryString.fullStringWithNewParam(key, value);
|
||||
},
|
||||
getContainer: function() { return document.body; },
|
||||
createElement: function() {
|
||||
return document.createElement.apply(document, arguments);
|
||||
},
|
||||
createTextNode: function() {
|
||||
return document.createTextNode.apply(document, arguments);
|
||||
},
|
||||
timer: new jasmine.Timer()
|
||||
});
|
||||
|
||||
env.addReporter(htmlReporter);
|
||||
|
||||
if (queryString.getParam('browser')) {
|
||||
var testReporter = new TestReporter(queryString.getParam('browser'),
|
||||
queryString.getParam('path'));
|
||||
env.addReporter(testReporter);
|
||||
}
|
||||
|
||||
// Filter which specs will be run by matching the start of the full name
|
||||
// against the `spec` query param.
|
||||
var specFilter = new jasmine.HtmlSpecFilter({
|
||||
filterString: function() { return queryString.getParam('spec'); }
|
||||
});
|
||||
|
||||
env.specFilter = function(spec) {
|
||||
return specFilter.matches(spec.getFullName());
|
||||
};
|
||||
|
||||
// Sets longer timeout.
|
||||
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
||||
|
||||
// Replace the browser window's `onload`, ensure it's called, and then run
|
||||
// all of the loaded specs. This includes initializing the `HtmlReporter`
|
||||
// instance and then executing the loaded Jasmine environment.
|
||||
var currentWindowOnload = window.onload;
|
||||
|
||||
window.onload = function() {
|
||||
if (currentWindowOnload) {
|
||||
currentWindowOnload();
|
||||
}
|
||||
|
||||
initializePDFJS(function () {
|
||||
htmlReporter.initialize();
|
||||
env.execute();
|
||||
});
|
||||
};
|
||||
|
||||
function extend(destination, source) {
|
||||
for (var property in source) {
|
||||
destination[property] = source[property];
|
||||
}
|
||||
return destination;
|
||||
}
|
||||
}());
|
||||
|
||||
// Hacking describe() to wait for PDFJS to be loaded, since Jasmine executes
|
||||
// it without waiting for libs to be loaded and fails to use PDFJS members.
|
||||
var oldDescribe = window.describe, describeQueue = [];
|
||||
window.describe = function () {
|
||||
describeQueue.push(Array.prototype.slice.call(arguments, 0));
|
||||
};
|
@ -1,4 +1,4 @@
|
||||
/* globals expect, it, describe, waitsFor, combineUrl, PDFNetworkStream */
|
||||
/* globals expect, it, describe, combineUrl, PDFNetworkStream */
|
||||
|
||||
'use strict';
|
||||
|
||||
@ -8,23 +8,7 @@ describe('network', function() {
|
||||
var pdf2 = combineUrl(window.location.href, '../pdfs/pdf.pdf');
|
||||
var pdf2Length = 32472771;
|
||||
|
||||
function waitsForPromiseResolved(promise, successCallback) {
|
||||
var TEST_TIMEOUT = 20000;
|
||||
var resolved = false;
|
||||
promise.then(function(val) {
|
||||
resolved = true;
|
||||
successCallback(val);
|
||||
},
|
||||
function(error) {
|
||||
// Shouldn't get here.
|
||||
expect(error).toEqual('the promise should not have been rejected');
|
||||
});
|
||||
waitsFor(function() {
|
||||
return resolved;
|
||||
}, TEST_TIMEOUT);
|
||||
}
|
||||
|
||||
it('read without stream and range', function() {
|
||||
it('read without stream and range', function(done) {
|
||||
var stream = new PDFNetworkStream({
|
||||
source: {
|
||||
url: pdf1,
|
||||
@ -56,21 +40,26 @@ describe('network', function() {
|
||||
|
||||
var readPromise = read();
|
||||
|
||||
waitsForPromiseResolved(readPromise, function (page) {
|
||||
readPromise.then(function (page) {
|
||||
expect(len).toEqual(pdf1Length);
|
||||
expect(count).toEqual(1);
|
||||
expect(isStreamingSupported).toEqual(false);
|
||||
expect(isRangeSupported).toEqual(false);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
|
||||
it('read with streaming', function() {
|
||||
it('read with streaming', function(done) {
|
||||
var userAgent = window.navigator.userAgent;
|
||||
// The test is valid for FF only: the XHR has support of the
|
||||
// 'moz-chunked-array' response type.
|
||||
// TODO enable for other browsers, e.g. when fetch/streams API is supported.
|
||||
var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
|
||||
if (!m || m[1] < 9) {
|
||||
expect(true).toEqual(true);
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -105,14 +94,17 @@ describe('network', function() {
|
||||
|
||||
var readPromise = read();
|
||||
|
||||
waitsForPromiseResolved(readPromise, function (page) {
|
||||
readPromise.then(function () {
|
||||
expect(len).toEqual(pdf2Length);
|
||||
expect(count).toBeGreaterThan(1);
|
||||
expect(isStreamingSupported).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
|
||||
it('read custom ranges', function () {
|
||||
it('read custom ranges', function (done) {
|
||||
// We don't test on browsers that don't support range request, so
|
||||
// requiring this test to pass.
|
||||
var rangeSize = 32768;
|
||||
@ -159,11 +151,14 @@ describe('network', function() {
|
||||
read(range2Reader, result2),
|
||||
promise]);
|
||||
|
||||
waitsForPromiseResolved(readPromises, function (page) {
|
||||
readPromises.then(function () {
|
||||
expect(result1.value).toEqual(rangeSize);
|
||||
expect(result2.value).toEqual(tailSize);
|
||||
expect(isRangeSupported).toEqual(true);
|
||||
expect(fullReaderCancelled).toEqual(true);
|
||||
done();
|
||||
}).catch(function (reason) {
|
||||
done.fail(reason);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -110,11 +110,12 @@ describe('primitives', function() {
|
||||
|
||||
dictWithManyKeys.forEach(callbackSpy);
|
||||
|
||||
expect(callbackSpy).wasCalled();
|
||||
expect(callbackSpy.argsForCall[0]).toEqual(['FontFile', testFontFile]);
|
||||
expect(callbackSpy.argsForCall[1]).toEqual(['FontFile2', testFontFile2]);
|
||||
expect(callbackSpy.argsForCall[2]).toEqual(['FontFile3', testFontFile3]);
|
||||
expect(callbackSpy.callCount).toEqual(3);
|
||||
expect(callbackSpy).toHaveBeenCalled();
|
||||
var callbackSpyCalls = callbackSpy.calls;
|
||||
expect(callbackSpyCalls.argsFor(0)).toEqual(['FontFile', testFontFile]);
|
||||
expect(callbackSpyCalls.argsFor(1)).toEqual(['FontFile2', testFontFile2]);
|
||||
expect(callbackSpyCalls.argsFor(2)).toEqual(['FontFile3', testFontFile3]);
|
||||
expect(callbackSpyCalls.count()).toEqual(3);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -1,22 +1,32 @@
|
||||
/* globals expect, it, describe, beforeEach, Stream, PredictorStream, Dict */
|
||||
/* globals jasmine, expect, it, describe, beforeEach, Stream, PredictorStream,
|
||||
Dict */
|
||||
|
||||
'use strict';
|
||||
|
||||
describe('stream', function() {
|
||||
beforeEach(function() {
|
||||
this.addMatchers({
|
||||
toMatchTypedArray: function(expected) {
|
||||
var actual = this.actual;
|
||||
if (actual.length !== expected.length) {
|
||||
return false;
|
||||
}
|
||||
for (var i = 0, ii = expected.length; i < ii; i++) {
|
||||
var a = actual[i], b = expected[i];
|
||||
if (a !== b) {
|
||||
return false;
|
||||
jasmine.addMatchers({
|
||||
toMatchTypedArray: function(util, customEqualityTesters) {
|
||||
return {
|
||||
compare: function (actual, expected) {
|
||||
var result = {};
|
||||
if (actual.length !== expected.length) {
|
||||
result.pass = false;
|
||||
result.message = 'Array length: ' + actual.length +
|
||||
', expected: ' + expected.length;
|
||||
return result;
|
||||
}
|
||||
result.pass = true;
|
||||
for (var i = 0, ii = expected.length; i < ii; i++) {
|
||||
var a = actual[i], b = expected[i];
|
||||
if (a !== b) {
|
||||
result.pass = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -46,34 +46,31 @@ var TestReporter = function(browser, appPath) {
|
||||
return new Date().getTime();
|
||||
};
|
||||
|
||||
this.reportRunnerStarting = function() {
|
||||
this.jasmineStarted = function(suiteInfo) {
|
||||
this.runnerStartTime = this.now();
|
||||
sendInfo('Started unit tests for ' + browser + '.');
|
||||
};
|
||||
|
||||
this.reportSpecStarting = function() { };
|
||||
this.suiteStarted = function(result) { };
|
||||
|
||||
this.reportSpecResults = function(spec) {
|
||||
var results = spec.results();
|
||||
if (results.skipped) {
|
||||
sendResult('TEST-SKIPPED', results.description);
|
||||
} else if (results.passed()) {
|
||||
sendResult('TEST-PASSED', results.description);
|
||||
this.specStarted = function(result) { };
|
||||
|
||||
this.specDone = function(result) {
|
||||
if (result.failedExpectations.length === 0) {
|
||||
sendResult('TEST-PASSED', result.description);
|
||||
} else {
|
||||
var failedMessages = '';
|
||||
var items = results.getItems();
|
||||
var items = result.failedExpectations;
|
||||
for (var i = 0, ii = items.length; i < ii; i++) {
|
||||
if (!items[i].passed()) {
|
||||
failedMessages += items[i].message + ' ';
|
||||
}
|
||||
failedMessages += items[i].message + ' ';
|
||||
}
|
||||
sendResult('TEST-UNEXPECTED-FAIL', results.description, failedMessages);
|
||||
sendResult('TEST-UNEXPECTED-FAIL', result.description, failedMessages);
|
||||
}
|
||||
};
|
||||
|
||||
this.reportSuiteResults = function(suite) { };
|
||||
this.suiteDone = function(result) { };
|
||||
|
||||
this.reportRunnerResults = function(runner) {
|
||||
this.jasmineDone = function() {
|
||||
// Give the test.py some time process any queued up requests
|
||||
setTimeout(sendQuitRequest, 500);
|
||||
};
|
||||
|
@ -3,25 +3,16 @@
|
||||
<head>
|
||||
<title>pdf.js unit test</title>
|
||||
|
||||
<link rel="shortcut icon" type="image/png" href="../../external/jasmine/jasmine_favicon.png">
|
||||
<link rel="stylesheet" type="text/css" href="../../external/jasmine/jasmine.css">
|
||||
<link rel="stylesheet" type="text/css" href="../../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
|
||||
|
||||
<script src="../../node_modules/requirejs/require.js"></script>
|
||||
<script src="../../external/jasmine/jasmine.js"></script>
|
||||
<script src="../../external/jasmine/jasmine-html.js"></script>
|
||||
<script src="../../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
|
||||
<script src="../../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
|
||||
<script src="testreporter.js"></script>
|
||||
<script src="jasmine-boot.js"></script>
|
||||
|
||||
<script src="../../web/ui_utils.js"></script>
|
||||
|
||||
<script>
|
||||
// Hacking describe() to wait for PDFJS to be loaded, since Jasmine executes
|
||||
// it without waiting for libs to be loaded and fails to use PDFJS members.
|
||||
var oldDescribe = window.describe, describeQueue = [];
|
||||
window.describe = function () {
|
||||
describeQueue.push(Array.prototype.slice.call(arguments, 0));
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- include spec files here... -->
|
||||
<script src="primitives_spec.js"></script>
|
||||
<script src="font_spec.js"></script>
|
||||
@ -38,112 +29,6 @@
|
||||
<script src="annotation_layer_spec.js"></script>
|
||||
<script src="network_spec.js"></script>
|
||||
<script src="dom_utils_spec.js"></script>
|
||||
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
var pdfjsLibs;
|
||||
|
||||
function initializePDFJS(callback) {
|
||||
require.config({paths: {'pdfjs': '../../src'}});
|
||||
require(['pdfjs/shared/util', 'pdfjs/display/global', 'pdfjs/core/primitives',
|
||||
'pdfjs/core/annotation', 'pdfjs/core/crypto', 'pdfjs/core/stream',
|
||||
'pdfjs/core/fonts', 'pdfjs/core/ps_parser', 'pdfjs/core/function',
|
||||
'pdfjs/core/parser', 'pdfjs/core/evaluator', 'pdfjs/core/cmap',
|
||||
'pdfjs/core/worker', 'pdfjs/core/network', 'pdfjs/display/api',
|
||||
'pdfjs/display/metadata', 'pdfjs/display/dom_utils'],
|
||||
function (sharedUtil, displayGlobal, corePrimitives, coreAnnotation,
|
||||
coreCrypto, coreStream, coreFonts, corePsParser, coreFunction,
|
||||
coreParser, coreEvaluator, coreCMap, coreWorker, coreNetwork,
|
||||
displayAPI, displayMetadata, displayDOMUtils) {
|
||||
|
||||
pdfjsLibs = {
|
||||
sharedUtil: sharedUtil,
|
||||
displayGlobal: displayGlobal,
|
||||
corePrimitives: corePrimitives,
|
||||
coreAnnotation: coreAnnotation,
|
||||
coreCrypto: coreCrypto,
|
||||
coreStream: coreStream,
|
||||
coreFonts: coreFonts,
|
||||
corePsParser: corePsParser,
|
||||
coreFunction: coreFunction,
|
||||
coreParser: coreParser,
|
||||
coreEvaluator: coreEvaluator,
|
||||
coreCMap: coreCMap,
|
||||
coreWorker: coreWorker,
|
||||
coreNetwork: coreNetwork,
|
||||
displayAPI: displayAPI,
|
||||
displayMetadata: displayMetadata,
|
||||
displayDOMUtils: displayDOMUtils
|
||||
};
|
||||
|
||||
// Expose all loaded internal exported members to global scope.
|
||||
Object.keys(pdfjsLibs).forEach(function (libName) {
|
||||
var lib = pdfjsLibs[libName];
|
||||
Object.keys(lib).forEach(function (name) {
|
||||
if (Object.getOwnPropertyDescriptor(window, name)) {
|
||||
return; // ignoring if already set
|
||||
}
|
||||
window[name] = lib[name];
|
||||
});
|
||||
});
|
||||
|
||||
// Configure the worker.
|
||||
PDFJS.workerSrc = '../../src/worker_loader.js';
|
||||
|
||||
// Release describe() calls.
|
||||
window.describe = oldDescribe;
|
||||
describeQueue.forEach(function (args) {
|
||||
oldDescribe.apply(window, args);
|
||||
});
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
(function pdfJsUnitTest() {
|
||||
function queryParams() {
|
||||
var qs = window.location.search.substring(1);
|
||||
var kvs = qs.split('&');
|
||||
var params = { };
|
||||
for (var i = 0; i < kvs.length; ++i) {
|
||||
var kv = kvs[i].split('=');
|
||||
params[unescape(kv[0])] = unescape(kv[1]);
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
var jasmineEnv = jasmine.getEnv();
|
||||
jasmineEnv.updateInterval = 1000;
|
||||
|
||||
var trivialReporter = new jasmine.TrivialReporter();
|
||||
|
||||
jasmineEnv.addReporter(trivialReporter);
|
||||
|
||||
var params = queryParams();
|
||||
if (params['browser']) {
|
||||
var testReporter = new TestReporter(params['browser'], params['path']);
|
||||
jasmineEnv.addReporter(testReporter);
|
||||
}
|
||||
|
||||
jasmineEnv.specFilter = function pdfJsUnitTestSpecFilter(spec) {
|
||||
return trivialReporter.specFilter(spec);
|
||||
};
|
||||
|
||||
var currentWindowOnload = window.onload;
|
||||
|
||||
window.onload = function pdfJsUnitTestOnload() {
|
||||
if (currentWindowOnload) {
|
||||
currentWindowOnload();
|
||||
}
|
||||
initializePDFJS(execJasmine);
|
||||
};
|
||||
|
||||
function execJasmine() {
|
||||
jasmineEnv.execute();
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
|
Loading…
x
Reference in New Issue
Block a user