src/tests/__init__.py: add support for multiframe gif tests

This commit is contained in:
Johannes 'josch' Schauer 2017-01-20 08:47:58 +01:00
parent e20fe4944c
commit 8476e333cd

View file

@ -476,36 +476,63 @@ def test_suite():
x = PdfReader(StringIO(convert_load(output))) x = PdfReader(StringIO(convert_load(output)))
self.assertEqual(sorted(x.keys()), [PdfName.Info, PdfName.Root, self.assertEqual(sorted(x.keys()), [PdfName.Info, PdfName.Root,
PdfName.Size]) PdfName.Size])
self.assertIn(x.Root.Pages.Count, ('1', '2'))
if len(x.Root.Pages.Kids) == '1':
self.assertEqual(x.Size, '7') self.assertEqual(x.Size, '7')
self.assertEqual(len(x.Root.Pages.Kids), 1)
elif len(x.Root.Pages.Kids) == '2':
self.assertEqual(x.Size, '10')
self.assertEqual(len(x.Root.Pages.Kids), 2)
self.assertEqual(x.Info, {}) self.assertEqual(x.Info, {})
self.assertEqual(sorted(x.Root.keys()), [PdfName.Pages, self.assertEqual(sorted(x.Root.keys()), [PdfName.Pages,
PdfName.Type]) PdfName.Type])
self.assertEqual(x.Root.Type, PdfName.Catalog) self.assertEqual(x.Root.Type, PdfName.Catalog)
self.assertEqual(sorted(x.Root.Pages.keys()), self.assertEqual(sorted(x.Root.Pages.keys()),
[PdfName.Count, PdfName.Kids, PdfName.Type]) [PdfName.Count, PdfName.Kids, PdfName.Type])
self.assertEqual(x.Root.Pages.Count, '1')
self.assertEqual(x.Root.Pages.Type, PdfName.Pages) self.assertEqual(x.Root.Pages.Type, PdfName.Pages)
self.assertEqual(len(x.Root.Pages.Kids), 1) orig_img = Image.open(f)
self.assertEqual(sorted(x.Root.Pages.Kids[0].keys()), for pagenum in range(len(x.Root.Pages.Kids)):
# retrieve the original image frame that this page was
# generated from
orig_img.seek(pagenum)
ndpi = orig_img.info.get("dpi", (96.0, 96.0))
# In python3, the returned dpi value for some tiff images will
# not be an integer but a float. To make the behaviour of
# img2pdf the same between python2 and python3, we convert that
# float into an integer by rounding.
# Search online for the 72.009 dpi problem for more info.
ndpi = (int(round(ndpi[0])), int(round(ndpi[1])))
imgwidthpx, imgheightpx = orig_img.size
pagewidth = 72*imgwidthpx/ndpi[0]
pageheight = 72*imgheightpx/ndpi[1]
def format_float(f):
if int(f) == f:
return str(int(f))
else:
return ("%.4f" % f).rstrip("0")
self.assertEqual(sorted(x.Root.Pages.Kids[pagenum].keys()),
[PdfName.Contents, PdfName.MediaBox, [PdfName.Contents, PdfName.MediaBox,
PdfName.Parent, PdfName.Resources, PdfName.Type]) PdfName.Parent, PdfName.Resources, PdfName.Type])
self.assertEqual(x.Root.Pages.Kids[0].MediaBox, self.assertEqual(x.Root.Pages.Kids[pagenum].MediaBox,
['0', '0', '115', '48']) ['0', '0', format_float(pagewidth), format_float(pageheight)])
self.assertEqual(x.Root.Pages.Kids[0].Parent, x.Root.Pages) self.assertEqual(x.Root.Pages.Kids[pagenum].Parent, x.Root.Pages)
self.assertEqual(x.Root.Pages.Kids[0].Type, PdfName.Page) self.assertEqual(x.Root.Pages.Kids[pagenum].Type, PdfName.Page)
self.assertEqual(x.Root.Pages.Kids[0].Resources.keys(), self.assertEqual(x.Root.Pages.Kids[pagenum].Resources.keys(),
[PdfName.XObject]) [PdfName.XObject])
self.assertEqual(x.Root.Pages.Kids[0].Resources.XObject.keys(), self.assertEqual(x.Root.Pages.Kids[pagenum].Resources.XObject.keys(),
[PdfName.Im0]) [PdfName.Im0])
self.assertEqual(x.Root.Pages.Kids[0].Contents.keys(), self.assertEqual(x.Root.Pages.Kids[pagenum].Contents.keys(),
[PdfName.Length]) [PdfName.Length])
self.assertEqual(x.Root.Pages.Kids[0].Contents.Length, self.assertEqual(x.Root.Pages.Kids[pagenum].Contents.Length,
str(len(x.Root.Pages.Kids[0].Contents.stream))) str(len(x.Root.Pages.Kids[pagenum].Contents.stream)))
self.assertEqual(x.Root.Pages.Kids[0].Contents.stream, self.assertEqual(x.Root.Pages.Kids[pagenum].Contents.stream,
"q\n115.0000 0 0 48.0000 0.0000 0.0000 cm\n/Im0 " "q\n%.4f 0 0 %.4f 0.0000 0.0000 cm\n"
"Do\nQ") "/Im0 Do\nQ" % (pagewidth, pageheight))
imgprops = x.Root.Pages.Kids[0].Resources.XObject.Im0 imgprops = x.Root.Pages.Kids[pagenum].Resources.XObject.Im0
# test if the filter is valid: # test if the filter is valid:
self.assertIn( self.assertIn(
@ -516,15 +543,15 @@ def test_suite():
self.assertIn( self.assertIn(
imgprops.ColorSpace, [PdfName.DeviceGray, PdfName.DeviceRGB, imgprops.ColorSpace, [PdfName.DeviceGray, PdfName.DeviceRGB,
PdfName.DeviceCMYK]) PdfName.DeviceCMYK])
# test if the image has correct size # test if the image has correct size
orig_img = Image.open(f)
self.assertEqual(imgprops.Width, str(orig_img.size[0])) self.assertEqual(imgprops.Width, str(orig_img.size[0]))
self.assertEqual(imgprops.Height, str(orig_img.size[1])) self.assertEqual(imgprops.Height, str(orig_img.size[1]))
# if the input file is a jpeg then it should've been copied # if the input file is a jpeg then it should've been copied
# verbatim into the PDF # verbatim into the PDF
if imgprops.Filter in [[PdfName.DCTDecode], [PdfName.JPXDecode]]: if imgprops.Filter in [[PdfName.DCTDecode], [PdfName.JPXDecode]]:
self.assertEqual( self.assertEqual(
x.Root.Pages.Kids[0].Resources.XObject.Im0.stream, x.Root.Pages.Kids[pagenum].Resources.XObject.Im0.stream,
convert_load(orig_imgdata)) convert_load(orig_imgdata))
elif imgprops.Filter == [PdfName.CCITTFaxDecode]: elif imgprops.Filter == [PdfName.CCITTFaxDecode]:
tiff_header = tiff_header_for_ccitt( tiff_header = tiff_header_for_ccitt(
@ -533,7 +560,7 @@ def test_suite():
imgio = BytesIO() imgio = BytesIO()
imgio.write(tiff_header) imgio.write(tiff_header)
imgio.write(convert_store( imgio.write(convert_store(
x.Root.Pages.Kids[0].Resources.XObject.Im0.stream)) x.Root.Pages.Kids[pagenum].Resources.XObject.Im0.stream))
imgio.seek(0) imgio.seek(0)
im = Image.open(imgio) im = Image.open(imgio)
self.assertEqual(im.tobytes(), orig_img.tobytes()) self.assertEqual(im.tobytes(), orig_img.tobytes())
@ -547,7 +574,7 @@ def test_suite():
# the pixel data of the input image # the pixel data of the input image
imgdata = zlib.decompress( imgdata = zlib.decompress(
convert_store( convert_store(
x.Root.Pages.Kids[0].Resources.XObject.Im0.stream)) x.Root.Pages.Kids[pagenum].Resources.XObject.Im0.stream))
colorspace = imgprops.ColorSpace colorspace = imgprops.ColorSpace
if colorspace == PdfName.DeviceGray: if colorspace == PdfName.DeviceGray:
colorspace = 'L' colorspace = 'L'
@ -561,10 +588,9 @@ def test_suite():
int(imgprops.Height)), int(imgprops.Height)),
imgdata) imgdata)
if orig_img.mode == '1': if orig_img.mode == '1':
orig_img = orig_img.convert("L") self.assertEqual(im.tobytes(), orig_img.convert("L").tobytes())
elif orig_img.mode not in ("RGB", "L", "CMYK", "CMYK;I"): elif orig_img.mode not in ("RGB", "L", "CMYK", "CMYK;I"):
orig_img = orig_img.convert("RGB") self.assertEqual(im.tobytes(), orig_img.convert("RGB").tobytes())
self.assertEqual(im.tobytes(), orig_img.tobytes())
# the python-pil version 2.3.0-1ubuntu3 in Ubuntu does not have # the python-pil version 2.3.0-1ubuntu3 in Ubuntu does not have
# the close() method # the close() method
try: try: