Ported tiff-test.sh
parent
085c9715fc
commit
5267123186
@ -0,0 +1,154 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import system_tests
|
||||||
|
|
||||||
|
|
||||||
|
class OutputTagExtract(system_tests.Case):
|
||||||
|
"""
|
||||||
|
Test whether exiv2 -pa $file and exiv2 -pS $file produces the same output.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def parse_pa(self, stdout):
|
||||||
|
"""
|
||||||
|
Parse the output of exiv2 -pa $file, which looks like this:
|
||||||
|
|
||||||
|
Exif.Image.NewSubfileType Long 1 Primary image
|
||||||
|
|
||||||
|
into a list of dictionaries with the keys:
|
||||||
|
tag: last word of the first column (here NewSubfileType)
|
||||||
|
type: lowercase second column
|
||||||
|
len: third column
|
||||||
|
val: fourth column
|
||||||
|
|
||||||
|
It is furthermore checked that the first column begins with 'Exif.Image'
|
||||||
|
"""
|
||||||
|
data = []
|
||||||
|
|
||||||
|
for line in stdout:
|
||||||
|
tmp = line.split()
|
||||||
|
|
||||||
|
exif, image, tag = tmp[0].split('.')
|
||||||
|
self.assertEquals(exif, "Exif")
|
||||||
|
self.assertEquals(image, "Image")
|
||||||
|
|
||||||
|
data.append({
|
||||||
|
"tag": tag,
|
||||||
|
"type": tmp[1].lower(),
|
||||||
|
"len": int(tmp[2]),
|
||||||
|
"val": " ".join(tmp[3:])
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def parse_pS(self, stdout):
|
||||||
|
"""
|
||||||
|
Parse the output of exiv2 -pS $file, which looks like this:
|
||||||
|
|
||||||
|
STRUCTURE OF TIFF FILE (II): $file
|
||||||
|
address | tag | type | count | offset | value
|
||||||
|
254 | 0x00fe NewSubfileType | LONG | 1 | | 0
|
||||||
|
...
|
||||||
|
END $file
|
||||||
|
|
||||||
|
into a list of dictionaries with the following keys:
|
||||||
|
tag: the string after the hex number in the second column
|
||||||
|
type: lowercase third column
|
||||||
|
len: fourth column
|
||||||
|
val: fifth column
|
||||||
|
|
||||||
|
The first two lines and the last line are ignored, as they contain
|
||||||
|
explanatory output.
|
||||||
|
"""
|
||||||
|
data = []
|
||||||
|
|
||||||
|
for i, line in enumerate(stdout):
|
||||||
|
if i < 2 or i == len(stdout) - 1:
|
||||||
|
continue
|
||||||
|
|
||||||
|
tmp = line.split(" | ")
|
||||||
|
data.append({
|
||||||
|
"tag": tmp[1].split()[1],
|
||||||
|
"type": tmp[2].replace(' ', '').lower(),
|
||||||
|
"len": int(tmp[3].replace(' ', '')),
|
||||||
|
"val": tmp[5]
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def compare_pS_pa(self):
|
||||||
|
"""
|
||||||
|
Compares the output from self.parse_pa() and self.parse_pS() (saved in
|
||||||
|
self.pa_data & self.pS_data respectively).
|
||||||
|
All dictionaries in the lists are compared for equality for the keys
|
||||||
|
tag, len and type but only some for val. This is due to differently
|
||||||
|
processed output (exiv2 -pa produces more readable output,
|
||||||
|
e.g. compression is written in words and not as a number as it is by
|
||||||
|
exiv2 -pS)
|
||||||
|
"""
|
||||||
|
for pa_elem, pS_elem in zip(self.pa_data, self.pS_data):
|
||||||
|
for key in ["tag", "type", "len"]:
|
||||||
|
self.assertEquals(pa_elem[key], pS_elem[key])
|
||||||
|
|
||||||
|
if pa_elem["tag"] in [
|
||||||
|
"ImageWidth", "ImageLength", "BitsPerSample",
|
||||||
|
"DocumentName", "ImageDescription", "StripOffsets",
|
||||||
|
"SamplesPerPixel", "StripByteCounts", "PlanarConfiguration"]:
|
||||||
|
self.assertEquals(pa_elem["val"], pS_elem["val"])
|
||||||
|
|
||||||
|
def compare_stdout(self, i, command, got_stdout, expected_stdout):
|
||||||
|
super().compare_stdout(i, command, got_stdout, expected_stdout)
|
||||||
|
|
||||||
|
if '-pa' in command:
|
||||||
|
self.pa_data = self.parse_pa(got_stdout.splitlines())
|
||||||
|
if '-pS' in command:
|
||||||
|
self.pS_data = self.parse_pS(got_stdout.splitlines())
|
||||||
|
|
||||||
|
if i == 1:
|
||||||
|
self.compare_pS_pa()
|
||||||
|
|
||||||
|
commands = [
|
||||||
|
"{exiv2} %s {data_path}/mini9.tif" % (opt) for opt in ["-pa", "-pS"]
|
||||||
|
]
|
||||||
|
|
||||||
|
stderr = [""] * 2
|
||||||
|
retval = [0] * 2
|
||||||
|
stdout = [
|
||||||
|
"""Exif.Image.NewSubfileType Long 1 Primary image
|
||||||
|
Exif.Image.ImageWidth Short 1 9
|
||||||
|
Exif.Image.ImageLength Short 1 9
|
||||||
|
Exif.Image.BitsPerSample Short 3 8 8 8
|
||||||
|
Exif.Image.Compression Short 1 Uncompressed
|
||||||
|
Exif.Image.PhotometricInterpretation Short 1 RGB
|
||||||
|
Exif.Image.DocumentName Ascii 24 /home/ahuggel/mini9.tif
|
||||||
|
Exif.Image.ImageDescription Ascii 18 Created with GIMP
|
||||||
|
Exif.Image.StripOffsets Long 1 8
|
||||||
|
Exif.Image.Orientation Short 1 top, left
|
||||||
|
Exif.Image.SamplesPerPixel Short 1 3
|
||||||
|
Exif.Image.RowsPerStrip Short 1 64
|
||||||
|
Exif.Image.StripByteCounts Long 1 243
|
||||||
|
Exif.Image.XResolution Rational 1 72
|
||||||
|
Exif.Image.YResolution Rational 1 72
|
||||||
|
Exif.Image.PlanarConfiguration Short 1 1
|
||||||
|
Exif.Image.ResolutionUnit Short 1 inch
|
||||||
|
""",
|
||||||
|
"""STRUCTURE OF TIFF FILE (II): {data_path}/mini9.tif
|
||||||
|
address | tag | type | count | offset | value
|
||||||
|
254 | 0x00fe NewSubfileType | LONG | 1 | | 0
|
||||||
|
266 | 0x0100 ImageWidth | SHORT | 1 | | 9
|
||||||
|
278 | 0x0101 ImageLength | SHORT | 1 | | 9
|
||||||
|
290 | 0x0102 BitsPerSample | SHORT | 3 | 462 | 8 8 8
|
||||||
|
302 | 0x0103 Compression | SHORT | 1 | | 1
|
||||||
|
314 | 0x0106 PhotometricInterpretation | SHORT | 1 | | 2
|
||||||
|
326 | 0x010d DocumentName | ASCII | 24 | 468 | /home/ahuggel/mini9.tif
|
||||||
|
338 | 0x010e ImageDescription | ASCII | 18 | 492 | Created with GIMP
|
||||||
|
350 | 0x0111 StripOffsets | LONG | 1 | | 8
|
||||||
|
362 | 0x0112 Orientation | SHORT | 1 | | 1
|
||||||
|
374 | 0x0115 SamplesPerPixel | SHORT | 1 | | 3
|
||||||
|
386 | 0x0116 RowsPerStrip | SHORT | 1 | | 64
|
||||||
|
398 | 0x0117 StripByteCounts | LONG | 1 | | 243
|
||||||
|
410 | 0x011a XResolution | RATIONAL | 1 | 510 | 1207959552/16777216
|
||||||
|
422 | 0x011b YResolution | RATIONAL | 1 | 518 | 1207959552/16777216
|
||||||
|
434 | 0x011c PlanarConfiguration | SHORT | 1 | | 1
|
||||||
|
446 | 0x0128 ResolutionUnit | SHORT | 1 | | 2
|
||||||
|
END {data_path}/mini9.tif
|
||||||
|
"""]
|
@ -0,0 +1,60 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import system_tests
|
||||||
|
|
||||||
|
|
||||||
|
@system_tests.CopyFiles("{data_path}/mini9.tif")
|
||||||
|
class TestTiffTestProg(system_tests.Case):
|
||||||
|
|
||||||
|
commands = ["{tiff-test} {data_path}/mini9_copy.tif"]
|
||||||
|
|
||||||
|
stdout = [
|
||||||
|
"""Test 1: Writing empty Exif data without original binary data: ok.
|
||||||
|
Test 2: Writing empty Exif data with original binary data: ok.
|
||||||
|
Test 3: Wrote non-empty Exif data without original binary data:
|
||||||
|
Exif.Image.ExifTag 0x8769 Long 1 26
|
||||||
|
Exif.Photo.DateTimeOriginal 0x9003 Ascii 18 Yesterday at noon
|
||||||
|
MIME type: image/tiff
|
||||||
|
Image size: 9 x 9
|
||||||
|
Before
|
||||||
|
Exif.Image.NewSubfileType 0x00fe Long 1 0
|
||||||
|
Exif.Image.ImageWidth 0x0100 Short 1 9
|
||||||
|
Exif.Image.ImageLength 0x0101 Short 1 9
|
||||||
|
Exif.Image.BitsPerSample 0x0102 Short 3 8 8 8
|
||||||
|
Exif.Image.Compression 0x0103 Short 1 1
|
||||||
|
Exif.Image.PhotometricInterpretation 0x0106 Short 1 2
|
||||||
|
Exif.Image.DocumentName 0x010d Ascii 24 /home/ahuggel/mini9.tif
|
||||||
|
Exif.Image.ImageDescription 0x010e Ascii 18 Created with GIMP
|
||||||
|
Exif.Image.StripOffsets 0x0111 Long 1 8
|
||||||
|
Exif.Image.Orientation 0x0112 Short 1 1
|
||||||
|
Exif.Image.SamplesPerPixel 0x0115 Short 1 3
|
||||||
|
Exif.Image.RowsPerStrip 0x0116 Short 1 64
|
||||||
|
Exif.Image.StripByteCounts 0x0117 Long 1 243
|
||||||
|
Exif.Image.XResolution 0x011a Rational 1 1207959552/16777216
|
||||||
|
Exif.Image.YResolution 0x011b Rational 1 1207959552/16777216
|
||||||
|
Exif.Image.PlanarConfiguration 0x011c Short 1 1
|
||||||
|
Exif.Image.ResolutionUnit 0x0128 Short 1 2
|
||||||
|
======
|
||||||
|
After
|
||||||
|
Exif.Image.NewSubfileType 0x00fe Long 1 0
|
||||||
|
Exif.Image.ImageWidth 0x0100 Short 1 9
|
||||||
|
Exif.Image.ImageLength 0x0101 Short 1 9
|
||||||
|
Exif.Image.BitsPerSample 0x0102 Short 3 8 8 8
|
||||||
|
Exif.Image.Compression 0x0103 Short 1 1
|
||||||
|
Exif.Image.PhotometricInterpretation 0x0106 Short 1 2
|
||||||
|
Exif.Image.DocumentName 0x010d Ascii 24 /home/ahuggel/mini9.tif
|
||||||
|
Exif.Image.ImageDescription 0x010e Ascii 18 Created with GIMP
|
||||||
|
Exif.Image.StripOffsets 0x0111 Long 1 8
|
||||||
|
Exif.Image.Orientation 0x0112 Short 1 1
|
||||||
|
Exif.Image.SamplesPerPixel 0x0115 Short 1 3
|
||||||
|
Exif.Image.RowsPerStrip 0x0116 Short 1 64
|
||||||
|
Exif.Image.StripByteCounts 0x0117 Long 1 243
|
||||||
|
Exif.Image.XResolution 0x011a Rational 1 1207959552/16777216
|
||||||
|
Exif.Image.YResolution 0x011b Rational 1 1207959552/16777216
|
||||||
|
Exif.Image.PlanarConfiguration 0x011c Short 1 1
|
||||||
|
Exif.Image.ResolutionUnit 0x0128 Short 1 2
|
||||||
|
Exif.Photo.DateTimeOriginal 0x9003 Ascii 18 Yesterday at noon
|
||||||
|
"""
|
||||||
|
]
|
||||||
|
stderr = [""]
|
||||||
|
retval = [0]
|
Loading…
Reference in New Issue