mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-19 22:42:17 +00:00
173 lines
5.7 KiB
Python
173 lines
5.7 KiB
Python
##############################################################################
|
|
#
|
|
# Copyright (c) 2007 Zope Foundation and Contributors.
|
|
# All Rights Reserved.
|
|
#
|
|
# This software is subject to the provisions of the Zope Public License,
|
|
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
|
|
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
|
|
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
|
|
# FOR A PARTLAR PURPOSE.
|
|
#
|
|
##############################################################################
|
|
"""Testing all XML Locale functionality.
|
|
"""
|
|
import logging
|
|
import os
|
|
import subprocess
|
|
import unittest
|
|
import sys
|
|
import z3c.rml.tests
|
|
from z3c.rml import rml2pdf, attr
|
|
|
|
try:
|
|
import Image
|
|
except ImportError:
|
|
from PIL import Image
|
|
|
|
LOG_FILE = os.path.join(os.path.dirname(__file__), 'render.log')
|
|
|
|
def gs_command(path):
|
|
return ('gs', '-q', '-sNOPAUSE', '-sDEVICE=png256',
|
|
'-sOutputFile=%s[Page-%%d].png' % path[:-4],
|
|
path, '-c', 'quit')
|
|
|
|
|
|
class RMLRenderingTestCase(unittest.TestCase):
|
|
|
|
def __init__(self, inPath, outPath):
|
|
self._inPath = inPath
|
|
self._outPath = outPath
|
|
unittest.TestCase.__init__(self)
|
|
|
|
def setUp(self):
|
|
# Switch file opener for Image attibute
|
|
self._fileOpen = attr.File.open
|
|
def testOpen(img, filename):
|
|
# cleanup win paths like:
|
|
# ....\\input\\file:///D:\\trunk\\...
|
|
if sys.platform[:3].lower() == "win":
|
|
if filename.startswith('file:///'):
|
|
filename = filename[len('file:///'):]
|
|
path = os.path.join(os.path.dirname(self._inPath), filename)
|
|
return open(path, 'rb')
|
|
attr.File.open = testOpen
|
|
import z3c.rml.tests.module
|
|
sys.modules['module'] = z3c.rml.tests.module
|
|
sys.modules['mymodule'] = z3c.rml.tests.module
|
|
|
|
def tearDown(self):
|
|
attr.File.open = self._fileOpen
|
|
del sys.modules['module']
|
|
del sys.modules['mymodule']
|
|
|
|
from z3c.rml.document import LOGGER_NAME
|
|
for handler in logging.getLogger(LOGGER_NAME).handlers:
|
|
if handler.baseFilename == LOG_FILE:
|
|
handler.close()
|
|
|
|
if os.path.exists(LOG_FILE):
|
|
os.remove(LOG_FILE)
|
|
|
|
def runTest(self):
|
|
rml2pdf.go(self._inPath, self._outPath)
|
|
|
|
|
|
class ComparePDFTestCase(unittest.TestCase):
|
|
|
|
level = 2
|
|
|
|
def __init__(self, basePath, testPath):
|
|
self._basePath = basePath
|
|
self._testPath = testPath
|
|
unittest.TestCase.__init__(self)
|
|
|
|
def assertSameImage(self, baseImage, testImage):
|
|
base = Image.open(baseImage).getdata()
|
|
test = Image.open(testImage).getdata()
|
|
for i in range(len(base)):
|
|
if (base[i] - test[i]) != 0:
|
|
self.fail(
|
|
'Image is not the same: %s' % os.path.basename(baseImage)
|
|
)
|
|
|
|
def runTest(self):
|
|
# Convert the base PDF to image(s)
|
|
status = subprocess.Popen(gs_command(self._basePath)).wait()
|
|
if status:
|
|
return
|
|
# Convert the test PDF to image(s)
|
|
status = subprocess.Popen(gs_command(self._testPath)).wait()
|
|
if status:
|
|
return
|
|
# Go through all pages and ensure their equality
|
|
n = 1
|
|
while True:
|
|
baseImage = self._basePath[:-4] + '[Page-%i].png' %n
|
|
testImage = self._testPath[:-4] + '[Page-%i].png' %n
|
|
if os.path.exists(baseImage) and os.path.exists(testImage):
|
|
self.assertSameImage(baseImage, testImage)
|
|
else:
|
|
break
|
|
n += 1
|
|
|
|
|
|
class CompareFileTestCase(unittest.TestCase):
|
|
|
|
def __init__(self, testPath, contains):
|
|
self._testPath = testPath
|
|
self._contains = contains
|
|
unittest.TestCase.__init__(self)
|
|
|
|
def runTest(self):
|
|
f = open(self._testPath, 'rb')
|
|
try:
|
|
contents = f.read()
|
|
|
|
if self._contains not in contents:
|
|
self.fail(
|
|
'PDF file does not contain: %s' % self._contains
|
|
)
|
|
finally:
|
|
f.close()
|
|
|
|
|
|
def test_suite():
|
|
suite = unittest.TestSuite()
|
|
inputDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'input')
|
|
outputDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'output')
|
|
expectDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'expected')
|
|
for filename in os.listdir(inputDir):
|
|
if not filename.endswith(".rml"):
|
|
continue
|
|
|
|
if sys.platform.startswith('win') and filename == 'rml-examples-032-images.rml':
|
|
# The Ghostscript command to convert EPS files in PIL doesn't work
|
|
# on Windows. It's easy to fix but requires modifying PIL.
|
|
continue
|
|
|
|
inPath = os.path.join(inputDir, filename)
|
|
outPath = os.path.join(outputDir, filename[:-4] + '.pdf')
|
|
expectPath = os.path.join(expectDir, filename[:-4] + '.pdf')
|
|
|
|
# ** Test RML to PDF rendering **
|
|
# Create new type, so that we can get test matching
|
|
TestCase = type(filename[:-4], (RMLRenderingTestCase,), {})
|
|
case = TestCase(inPath, outPath)
|
|
suite.addTest(case)
|
|
# ** Test PDF rendering correctness **
|
|
TestCase = type('compare-'+filename[:-4], (ComparePDFTestCase,), {})
|
|
case = TestCase(expectPath, outPath)
|
|
suite.addTest(case)
|
|
|
|
if filename == 'printScaling.rml':
|
|
TestCase = type('compare-file-'+filename[:-4], (CompareFileTestCase,), {})
|
|
case = TestCase(outPath, '<< /PrintScaling /None >>')
|
|
suite.addTest(case)
|
|
|
|
return suite
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main(defaultTest='test_suite')
|