diff options
Diffstat (limited to 'tests/test_examples.py')
-rwxr-xr-x | tests/test_examples.py | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/tests/test_examples.py b/tests/test_examples.py new file mode 100755 index 0000000..baa98a6 --- /dev/null +++ b/tests/test_examples.py @@ -0,0 +1,195 @@ +#! /usr/bin/env python + +# A part of pdfrw (https://github.com/pmaupin/pdfrw) +# Copyright (C) 2015 Patrick Maupin, Austin, Texas +# MIT license -- See LICENSE.txt for details + +''' +Run from the directory above like so: + + python -m tests.test_examples + +A PDF that has been determined to be good or bad +should be added to expected.txt with either a good +checksum, or just the word "fail". + +These tests are incomplete, but they allow us to try +out various PDFs. There is a collection of difficult +PDFs available on github. + +In order to use them: + + 1) Insure that github.com/pmaupin/static_pdfs is on your path. + + 2) Use the imagemagick compare program to look at differences + between the static_pdfs/global directory and the tmp_results + directory after you run this. + + +''' +import sys +import os +import hashlib +import subprocess +import static_pdfs +import expected + +from pdfrw.py23_diffs import convert_store +from pdfrw import PdfReader, PdfWriter + +try: + import unittest2 as unittest +except ImportError: + import unittest + + +prog_dir = os.path.join(expected.root_dir, '..', 'examples', '%s.py') +prog_dir = os.path.abspath(prog_dir) +dstdir = os.path.join(expected.result_dir, 'examples') +hashfile = os.path.join(expected.result_dir, 'hashes.txt') + +lookup = static_pdfs.pdffiles[0] +lookup = dict((os.path.basename(x)[:-4], x) for x in lookup) + + +class TestOnePdf(unittest.TestCase): + + def do_test(self, params, prev_results=[''], scrub=False): + params = params.split() + hashkey = 'examples/%s' % '_'.join(params) + params = [lookup.get(x, x) for x in params] + progname = params[0] + params[0] = prog_dir % progname + srcf = params[1] + params.insert(0, sys.executable) + subdir, progname = os.path.split(progname) + subdir = os.path.join(dstdir, subdir) + if not os.path.exists(subdir): + os.makedirs(subdir) + os.chdir(subdir) + dstf = '%s.%s' % (progname, os.path.basename(srcf)) + scrub = scrub and dstf + dstf = dstf if not scrub else 'final.%s' % dstf + hash = '------no-file-generated---------' + expects = expected.results[hashkey] + + # If the test has been deliberately skipped, + # we are done. Otherwise, execute it even + # if we don't know about it yet, so we have + # results to compare. + + result = 'fail' + size = 0 + try: + if 'skip' in expects: + result = 'skip requested' + return self.skipTest(result) + elif 'xfail' in expects: + result = 'xfail requested' + return self.fail(result) + + exists = os.path.exists(dstf) + if expects or not exists: + if exists: + os.remove(dstf) + if scrub and os.path.exists(scrub): + os.remove(scrub) + subprocess.call(params) + if scrub: + PdfWriter().addpages(PdfReader(scrub).pages).write(dstf) + with open(dstf, 'rb') as f: + data = f.read() + size = len(data) + if data: + hash = hashlib.md5(data).hexdigest() + lookup[hash] = dstf + prev_results[0] = hash + else: + os.remove(dstf) + if expects: + if len(expects) == 1: + expects, = expects + self.assertEqual(hash, expects) + else: + self.assertIn(hash, expects) + result = 'pass' + else: + result = 'skip' + self.skipTest('No hash available') + finally: + result = '%8d %-20s %s %s\n' % (size, result, hashkey, hash) + with open(hashfile, 'ab') as f: + f.write(convert_store(result)) + + def test_4up(self): + self.do_test('4up b1c400de699af29ea3f1983bb26870ab') + + def test_booklet_unspread(self): + prev = [None] + self.do_test('booklet b1c400de699af29ea3f1983bb26870ab', prev) + if prev[0] is not None: + self.do_test('unspread ' + prev[0]) + self.do_test('extract ' + prev[0]) + + def test_print_two(self): + self.do_test('print_two b1c400de699af29ea3f1983bb26870ab') + + def test_watermarks(self): + self.do_test('watermark b1c400de699af29ea3f1983bb26870ab ' + '06c86654f9a77e82f9adaa0086fc391c') + self.do_test('watermark b1c400de699af29ea3f1983bb26870ab ' + '06c86654f9a77e82f9adaa0086fc391c -u') + + def test_subset(self): + self.do_test('subset b1c400de699af29ea3f1983bb26870ab 1-3 5') + + def test_alter(self): + self.do_test('alter b1c400de699af29ea3f1983bb26870ab') + + def test_cat(self): + self.do_test('cat b1c400de699af29ea3f1983bb26870ab ' + '06c86654f9a77e82f9adaa0086fc391c') + + def test_rotate(self): + self.do_test('rotate 707e3e2d17cbe9ec2273414b3b63f333 ' + '270 1-4 7-8 10-50 52-56') + + def test_poster(self): + prev = [None] + self.do_test('subset 1975ef8db7355b1d691bc79d0749574b 21', prev) + self.do_test('rotate %s 90 1' % prev[0], prev) + self.do_test('poster %s' % prev[0], prev) + + def test_extract(self): + self.do_test('extract 1975ef8db7355b1d691bc79d0749574b') + self.do_test('extract c5c895deecf7a7565393587e0d61be2b') + + def test_rl1_4up(self): + if sys.version_info < (2, 7): + return + self.do_test('rl1/4up b1c400de699af29ea3f1983bb26870ab', + scrub=True) + + def test_rl1_booklet(self): + if sys.version_info < (2, 7): + return + self.do_test('rl1/booklet b1c400de699af29ea3f1983bb26870ab', + scrub=True) + + def test_rl1_subset(self): + if sys.version_info < (2, 7): + return + self.do_test('rl1/subset b1c400de699af29ea3f1983bb26870ab 3 5', + scrub=True) + + def test_rl1_platypus(self): + if sys.version_info < (2, 7): + return + self.do_test('rl1/platypus_pdf_template b1c400de699af29ea3f1983bb26870ab', + scrub=True) + +def main(): + unittest.main() + +if __name__ == '__main__': + main() |