Skip to content

Commit f76adca

Browse files
committed
Merge pull request mozilla#2312 from yurydelendik/ttx
Test harness for fonts (uses ttx)
2 parents 68cb985 + 5afec33 commit f76adca

File tree

6 files changed

+304
-16
lines changed

6 files changed

+304
-16
lines changed

make.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,9 @@ target.test = function() {
664664
//
665665
target.bottest = function() {
666666
target.unittest({}, function() {
667-
target.browsertest({noreftest: true});
667+
target.fonttest({}, function() {
668+
target.browsertest({noreftest: true});
669+
});
668670
});
669671
};
670672

@@ -715,6 +717,28 @@ target.unittest = function(options, callback) {
715717
PDF_BROWSERS, {async: true}, callback);
716718
};
717719

720+
//
721+
// make fonttest
722+
//
723+
target.fonttest = function(options, callback) {
724+
cd(ROOT_DIR);
725+
echo();
726+
echo('### Running font tests');
727+
728+
var PDF_BROWSERS = env['PDF_BROWSERS'] ||
729+
'resources/browser_manifests/browser_manifest.json';
730+
731+
if (!test('-f', 'test/' + PDF_BROWSERS)) {
732+
echo('Browser manifest file test/' + PDF_BROWSERS + ' does not exist.');
733+
echo('Copy one of the examples in test/resources/browser_manifests/');
734+
exit(1);
735+
}
736+
callback = callback || function() {};
737+
cd('test');
738+
exec(PYTHON_BIN + ' -u test.py --fontTest --browserManifestFile=' +
739+
PDF_BROWSERS, {async: true}, callback);
740+
};
741+
718742
//
719743
// make botmakeref
720744
//

test/font/font_core_spec.js

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/font/font_test.html

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>pdf.js unit test</title>
5+
6+
<link rel="shortcut icon" type="image/png" href="../../external/jasmine/jasmine_favicon.png">
7+
<link rel="stylesheet" type="text/css" href="../../external/jasmine/jasmine.css">
8+
9+
<script type="text/javascript" src="../../external/jasmine/jasmine.js"></script>
10+
<script type="text/javascript" src="../../external/jasmine/jasmine-html.js"></script>
11+
<script type="text/javascript" src="../unit/testreporter.js"></script>
12+
<script type="text/javascript" src="fontutils.js"></script>
13+
14+
<!-- include source files here... -->
15+
<script type="text/javascript" src="../../src/core.js"></script>
16+
<script type="text/javascript" src="../../src/api.js"></script>
17+
<script type="text/javascript" src="../../src/util.js"></script>
18+
<script type="text/javascript" src="../../src/canvas.js"></script>
19+
<script type="text/javascript" src="../../src/obj.js"></script>
20+
<script type="text/javascript" src="../../src/function.js"></script>
21+
<script type="text/javascript" src="../../src/charsets.js"></script>
22+
<script type="text/javascript" src="../../src/cidmaps.js"></script>
23+
<script type="text/javascript" src="../../src/colorspace.js"></script>
24+
<script type="text/javascript" src="../../src/crypto.js"></script>
25+
<script type="text/javascript" src="../../src/evaluator.js"></script>
26+
<script type="text/javascript" src="../../src/fonts.js"></script>
27+
<script type="text/javascript" src="../../src/glyphlist.js"></script>
28+
<script type="text/javascript" src="../../src/image.js"></script>
29+
<script type="text/javascript" src="../../src/metrics.js"></script>
30+
<script type="text/javascript" src="../../src/parser.js"></script>
31+
<script type="text/javascript" src="../../src/pattern.js"></script>
32+
<script type="text/javascript" src="../../src/stream.js"></script>
33+
<script type="text/javascript" src="../../src/worker.js"></script>
34+
<script type="text/javascript" src="../../src/metadata.js"></script>
35+
<script type="text/javascript" src="../../external/jpgjs/jpg.js"></script>
36+
<script type="text/javascript">PDFJS.workerSrc = '../../src/worker_loader.js';</script>
37+
38+
<!-- include spec files here... -->
39+
<script type="text/javascript" src="font_core_spec.js"></script>
40+
41+
<script type="text/javascript">
42+
'use strict';
43+
44+
(function pdfJsUnitTest() {
45+
function queryParams() {
46+
var qs = window.location.search.substring(1);
47+
var kvs = qs.split('&');
48+
var params = { };
49+
for (var i = 0; i < kvs.length; ++i) {
50+
var kv = kvs[i].split('=');
51+
params[unescape(kv[0])] = unescape(kv[1]);
52+
}
53+
return params;
54+
}
55+
56+
var jasmineEnv = jasmine.getEnv();
57+
jasmineEnv.updateInterval = 1000;
58+
59+
var trivialReporter = new jasmine.TrivialReporter();
60+
61+
jasmineEnv.addReporter(trivialReporter);
62+
63+
var params = queryParams();
64+
if (params['browser']) {
65+
var testReporter = new TestReporter(params['browser'], params['path']);
66+
jasmineEnv.addReporter(testReporter);
67+
}
68+
69+
jasmineEnv.specFilter = function pdfJsUnitTestSpecFilter(spec) {
70+
return trivialReporter.specFilter(spec);
71+
};
72+
73+
var currentWindowOnload = window.onload;
74+
75+
window.onload = function pdfJsUnitTestOnload() {
76+
if (currentWindowOnload) {
77+
currentWindowOnload();
78+
}
79+
execJasmine();
80+
};
81+
82+
function execJasmine() {
83+
jasmineEnv.execute();
84+
}
85+
})();
86+
</script>
87+
</head>
88+
<body>
89+
</body>
90+
</html>
91+

test/font/fontutils.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2+
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
3+
4+
var base64alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
5+
6+
function decodeFontData(base64) {
7+
var result = [];
8+
9+
var bits = 0, bitsLength = 0;
10+
for (var i = 0, ii = base64.length; i < ii; i++) {
11+
var ch = base64[i];
12+
if (ch <= " ") continue;
13+
var index = base64alphabet.indexOf(ch);
14+
if (index < 0) throw "Invalid character";
15+
if (index >= 64) break;
16+
bits = (bits << 6) | index;
17+
bitsLength += 6;
18+
if (bitsLength >= 8) {
19+
bitsLength -= 8
20+
var code = (bits >> bitsLength) & 0xFF;
21+
result.push(code);
22+
}
23+
}
24+
return new Uint8Array(result);
25+
}
26+
27+
function encodeFontData(data) {
28+
var buffer = '';
29+
var i, n;
30+
for (i = 0, n = data.length; i < n; i += 3) {
31+
var b1 = data[i] & 0xFF;
32+
var b2 = data[i + 1] & 0xFF;
33+
var b3 = data[i + 2] & 0xFF;
34+
var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
35+
var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
36+
var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
37+
buffer += (base64alphabet.charAt(d1) + base64alphabet.charAt(d2) +
38+
base64alphabet.charAt(d3) + base64alphabet.charAt(d4));
39+
}
40+
return buffer;
41+
}
42+
43+
function ttx(data, callback) {
44+
var xhr = new XMLHttpRequest();
45+
xhr.open('POST', '/ttx');
46+
47+
var encodedData = encodeFontData(data);
48+
xhr.setRequestHeader("Content-type", "text/plain");
49+
xhr.setRequestHeader("Content-length", encodedData.length);
50+
51+
xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
52+
if (xhr.readyState === 4) {
53+
if (xhr.status === 200) {
54+
callback(xhr.responseText);
55+
} else {
56+
callback('<error>Transport error: ' + xhr.statusText + '</error>');
57+
}
58+
}
59+
};
60+
xhr.send(encodedData);
61+
}
62+
63+
function verifyTtxOutput(output) {
64+
var m = /^<error>(.*?)<\/error>/.exec(output);
65+
if (m)
66+
throw m[1];
67+
}

0 commit comments

Comments
 (0)