mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-10 08:12:33 +03:00
Start moving tests over to use unittest
This commit is contained in:
parent
cd967680cb
commit
5c8c777ea4
|
@ -30,12 +30,13 @@ script:
|
||||||
# Don't cover PyPy: it fails intermittently and is x5.8 slower (#640)
|
# Don't cover PyPy: it fails intermittently and is x5.8 slower (#640)
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then python selftest.py; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then python selftest.py; fi
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then python Tests/run.py; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then python Tests/run.py; fi
|
||||||
|
- if [ "$TRAVIS_PYTHON_VERSION" == "pypy" ]; then nosetests test/; fi
|
||||||
|
|
||||||
# Cover the others
|
# Cover the others
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then coverage run --append --include=PIL/* selftest.py; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then coverage run --append --include=PIL/* selftest.py; fi
|
||||||
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then python Tests/run.py --coverage; fi
|
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then python Tests/run.py --coverage; fi
|
||||||
|
- if [ "$TRAVIS_PYTHON_VERSION" != "pypy" ]; then coverage run --append --include=PIL/* -m nose test/; fi
|
||||||
|
|
||||||
- nosetests test/
|
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- coverage report
|
- coverage report
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
from tester import *
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
def test_sanity():
|
|
||||||
im1 = lena()
|
|
||||||
im2 = Image.frombytes(im1.mode, im1.size, im1.tobytes())
|
|
||||||
|
|
||||||
assert_image_equal(im1, im2)
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
from tester import *
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
def test_sanity():
|
|
||||||
|
|
||||||
im = lena()
|
|
||||||
type_repr = repr(type(im.getim()))
|
|
||||||
|
|
||||||
if py3:
|
|
||||||
assert_true("PyCapsule" in type_repr)
|
|
||||||
|
|
||||||
assert_true(isinstance(im.im.id, int))
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
from tester import *
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
def test_sanity():
|
|
||||||
data = lena().tobytes()
|
|
||||||
assert_true(isinstance(data, bytes))
|
|
18
test/test_image_frombytes.py
Normal file
18
test/test_image_frombytes.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
from tester import unittest, PillowTestCase, lena
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
|
class TestImageFromBytes(PillowTestCase):
|
||||||
|
|
||||||
|
def test_sanity(self):
|
||||||
|
im1 = lena()
|
||||||
|
im2 = Image.frombytes(im1.mode, im1.size, im1.tobytes())
|
||||||
|
|
||||||
|
self.assert_image_equal(im1, im2)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
|
|
||||||
|
# End of file
|
19
test/test_image_getim.py
Normal file
19
test/test_image_getim.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
from tester import unittest, PillowTestCase, lena, py3
|
||||||
|
|
||||||
|
|
||||||
|
class TestImageGetIm(PillowTestCase):
|
||||||
|
|
||||||
|
def test_sanity(self):
|
||||||
|
im = lena()
|
||||||
|
type_repr = repr(type(im.getim()))
|
||||||
|
|
||||||
|
if py3:
|
||||||
|
self.assertIn("PyCapsule", type_repr)
|
||||||
|
|
||||||
|
self.assertIsInstance(im.im.id, int)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
|
|
||||||
|
# End of file
|
13
test/test_image_tobytes.py
Normal file
13
test/test_image_tobytes.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from tester import unittest, lena
|
||||||
|
|
||||||
|
|
||||||
|
class TestImageToBytes(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_sanity(self):
|
||||||
|
data = lena().tobytes()
|
||||||
|
self.assertTrue(isinstance(data, bytes))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
|
|
||||||
|
# End of file
|
393
test/tester.py
Normal file
393
test/tester.py
Normal file
|
@ -0,0 +1,393 @@
|
||||||
|
"""
|
||||||
|
Helper functions.
|
||||||
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if sys.version_info[:2] <= (2, 6):
|
||||||
|
import unittest2 as unittest
|
||||||
|
else:
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class PillowTestCase(unittest.TestCase):
|
||||||
|
|
||||||
|
def assert_image_equal(self, a, b, msg=None):
|
||||||
|
self.assertEqual(
|
||||||
|
a.mode, b.mode,
|
||||||
|
msg or "got mode %r, expected %r" % (a.mode, b.mode))
|
||||||
|
self.assertEqual(
|
||||||
|
a.size, b.size,
|
||||||
|
msg or "got size %r, expected %r" % (a.size, b.size))
|
||||||
|
self.assertEqual(
|
||||||
|
a.tobytes(), b.tobytes(),
|
||||||
|
msg or "got different content")
|
||||||
|
|
||||||
|
|
||||||
|
# # require that deprecation warnings are triggered
|
||||||
|
# import warnings
|
||||||
|
# warnings.simplefilter('default')
|
||||||
|
# # temporarily turn off resource warnings that warn about unclosed
|
||||||
|
# # files in the test scripts.
|
||||||
|
# try:
|
||||||
|
# warnings.filterwarnings("ignore", category=ResourceWarning)
|
||||||
|
# except NameError:
|
||||||
|
# # we expect a NameError on py2.x, since it doesn't have ResourceWarnings.
|
||||||
|
# pass
|
||||||
|
|
||||||
|
import sys
|
||||||
|
py3 = (sys.version_info >= (3, 0))
|
||||||
|
|
||||||
|
# # some test helpers
|
||||||
|
#
|
||||||
|
# _target = None
|
||||||
|
# _tempfiles = []
|
||||||
|
# _logfile = None
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def success():
|
||||||
|
# import sys
|
||||||
|
# success.count += 1
|
||||||
|
# if _logfile:
|
||||||
|
# print(sys.argv[0], success.count, failure.count, file=_logfile)
|
||||||
|
# return True
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def failure(msg=None, frame=None):
|
||||||
|
# import sys
|
||||||
|
# import linecache
|
||||||
|
# failure.count += 1
|
||||||
|
# if _target:
|
||||||
|
# if frame is None:
|
||||||
|
# frame = sys._getframe()
|
||||||
|
# while frame.f_globals.get("__name__") != _target.__name__:
|
||||||
|
# frame = frame.f_back
|
||||||
|
# location = (frame.f_code.co_filename, frame.f_lineno)
|
||||||
|
# prefix = "%s:%d: " % location
|
||||||
|
# line = linecache.getline(*location)
|
||||||
|
# print(prefix + line.strip() + " failed:")
|
||||||
|
# if msg:
|
||||||
|
# print("- " + msg)
|
||||||
|
# if _logfile:
|
||||||
|
# print(sys.argv[0], success.count, failure.count, file=_logfile)
|
||||||
|
# return False
|
||||||
|
#
|
||||||
|
# success.count = failure.count = 0
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# # predicates
|
||||||
|
#
|
||||||
|
# def assert_almost_equal(a, b, msg=None, eps=1e-6):
|
||||||
|
# if abs(a-b) < eps:
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "got %r, expected %r" % (a, b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_deep_equal(a, b, msg=None):
|
||||||
|
# try:
|
||||||
|
# if len(a) == len(b):
|
||||||
|
# if all([x == y for x, y in zip(a, b)]):
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "got %s, expected %s" % (a, b))
|
||||||
|
# else:
|
||||||
|
# failure(msg or "got length %s, expected %s" % (len(a), len(b)))
|
||||||
|
# except:
|
||||||
|
# assert_equal(a, b, msg)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_greater(a, b, msg=None):
|
||||||
|
# if a > b:
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "%r unexpectedly not greater than %r" % (a, b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_greater_equal(a, b, msg=None):
|
||||||
|
# if a >= b:
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(
|
||||||
|
# msg or "%r unexpectedly not greater than or equal to %r"
|
||||||
|
# % (a, b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_less(a, b, msg=None):
|
||||||
|
# if a < b:
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "%r unexpectedly not less than %r" % (a, b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_less_equal(a, b, msg=None):
|
||||||
|
# if a <= b:
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(
|
||||||
|
# msg or "%r unexpectedly not less than or equal to %r" % (a, b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_is_instance(a, b, msg=None):
|
||||||
|
# if isinstance(a, b):
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "got %r, expected %r" % (type(a), b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_in(a, b, msg=None):
|
||||||
|
# if a in b:
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "%r unexpectedly not in %r" % (a, b))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_match(v, pattern, msg=None):
|
||||||
|
# import re
|
||||||
|
# if re.match(pattern, v):
|
||||||
|
# success()
|
||||||
|
# else:
|
||||||
|
# failure(msg or "got %r, doesn't match pattern %r" % (v, pattern))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_exception(exc_class, func):
|
||||||
|
# import sys
|
||||||
|
# import traceback
|
||||||
|
# try:
|
||||||
|
# func()
|
||||||
|
# except exc_class:
|
||||||
|
# success()
|
||||||
|
# except:
|
||||||
|
# failure("expected %r exception, got %r" % (
|
||||||
|
# exc_class.__name__, sys.exc_info()[0].__name__))
|
||||||
|
# traceback.print_exc()
|
||||||
|
# else:
|
||||||
|
# failure(
|
||||||
|
# "expected %r exception, got no exception" % exc_class.__name__)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_no_exception(func):
|
||||||
|
# import sys
|
||||||
|
# import traceback
|
||||||
|
# try:
|
||||||
|
# func()
|
||||||
|
# except:
|
||||||
|
# failure("expected no exception, got %r" % sys.exc_info()[0].__name__)
|
||||||
|
# traceback.print_exc()
|
||||||
|
# else:
|
||||||
|
# success()
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_warning(warn_class, func):
|
||||||
|
# # note: this assert calls func three times!
|
||||||
|
# import warnings
|
||||||
|
#
|
||||||
|
# def warn_error(message, category=UserWarning, **options):
|
||||||
|
# raise category(message)
|
||||||
|
#
|
||||||
|
# def warn_ignore(message, category=UserWarning, **options):
|
||||||
|
# pass
|
||||||
|
# warn = warnings.warn
|
||||||
|
# result = None
|
||||||
|
# try:
|
||||||
|
# warnings.warn = warn_ignore
|
||||||
|
# assert_no_exception(func)
|
||||||
|
# result = func()
|
||||||
|
# warnings.warn = warn_error
|
||||||
|
# assert_exception(warn_class, func)
|
||||||
|
# finally:
|
||||||
|
# warnings.warn = warn # restore
|
||||||
|
# return result
|
||||||
|
#
|
||||||
|
# # helpers
|
||||||
|
#
|
||||||
|
# from io import BytesIO
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def fromstring(data):
|
||||||
|
# from PIL import Image
|
||||||
|
# return Image.open(BytesIO(data))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def tostring(im, format, **options):
|
||||||
|
# out = BytesIO()
|
||||||
|
# im.save(out, format, **options)
|
||||||
|
# return out.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
def lena(mode="RGB", cache={}):
|
||||||
|
from PIL import Image
|
||||||
|
im = cache.get(mode)
|
||||||
|
if im is None:
|
||||||
|
if mode == "RGB":
|
||||||
|
im = Image.open("Images/lena.ppm")
|
||||||
|
elif mode == "F":
|
||||||
|
im = lena("L").convert(mode)
|
||||||
|
elif mode[:4] == "I;16":
|
||||||
|
im = lena("I").convert(mode)
|
||||||
|
else:
|
||||||
|
im = lena("RGB").convert(mode)
|
||||||
|
cache[mode] = im
|
||||||
|
return im
|
||||||
|
|
||||||
|
|
||||||
|
# def assert_image(im, mode, size, msg=None):
|
||||||
|
# if mode is not None and im.mode != mode:
|
||||||
|
# failure(msg or "got mode %r, expected %r" % (im.mode, mode))
|
||||||
|
# elif size is not None and im.size != size:
|
||||||
|
# failure(msg or "got size %r, expected %r" % (im.size, size))
|
||||||
|
# else:
|
||||||
|
# success()
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_image_equal(a, b, msg=None):
|
||||||
|
# if a.mode != b.mode:
|
||||||
|
# failure(msg or "got mode %r, expected %r" % (a.mode, b.mode))
|
||||||
|
# elif a.size != b.size:
|
||||||
|
# failure(msg or "got size %r, expected %r" % (a.size, b.size))
|
||||||
|
# elif a.tobytes() != b.tobytes():
|
||||||
|
# failure(msg or "got different content")
|
||||||
|
# else:
|
||||||
|
# success()
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_image_completely_equal(a, b, msg=None):
|
||||||
|
# if a != b:
|
||||||
|
# failure(msg or "images different")
|
||||||
|
# else:
|
||||||
|
# success()
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def assert_image_similar(a, b, epsilon, msg=None):
|
||||||
|
# epsilon = float(epsilon)
|
||||||
|
# if a.mode != b.mode:
|
||||||
|
# return failure(msg or "got mode %r, expected %r" % (a.mode, b.mode))
|
||||||
|
# elif a.size != b.size:
|
||||||
|
# return failure(msg or "got size %r, expected %r" % (a.size, b.size))
|
||||||
|
# diff = 0
|
||||||
|
# try:
|
||||||
|
# ord(b'0')
|
||||||
|
# for abyte, bbyte in zip(a.tobytes(), b.tobytes()):
|
||||||
|
# diff += abs(ord(abyte)-ord(bbyte))
|
||||||
|
# except:
|
||||||
|
# for abyte, bbyte in zip(a.tobytes(), b.tobytes()):
|
||||||
|
# diff += abs(abyte-bbyte)
|
||||||
|
# ave_diff = float(diff)/(a.size[0]*a.size[1])
|
||||||
|
# if epsilon < ave_diff:
|
||||||
|
# return failure(
|
||||||
|
# msg or "average pixel value difference %.4f > epsilon %.4f" % (
|
||||||
|
# ave_diff, epsilon))
|
||||||
|
# else:
|
||||||
|
# return success()
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def tempfile(template, *extra):
|
||||||
|
# import os
|
||||||
|
# import os.path
|
||||||
|
# import sys
|
||||||
|
# import tempfile
|
||||||
|
# files = []
|
||||||
|
# root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
|
||||||
|
# try:
|
||||||
|
# os.mkdir(root)
|
||||||
|
# except OSError:
|
||||||
|
# pass
|
||||||
|
# for temp in (template,) + extra:
|
||||||
|
# assert temp[:5] in ("temp.", "temp_")
|
||||||
|
# name = os.path.basename(sys.argv[0])
|
||||||
|
# name = temp[:4] + os.path.splitext(name)[0][4:]
|
||||||
|
# name = name + "_%d" % len(_tempfiles) + temp[4:]
|
||||||
|
# name = os.path.join(root, name)
|
||||||
|
# files.append(name)
|
||||||
|
# _tempfiles.extend(files)
|
||||||
|
# return files[0]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# # test runner
|
||||||
|
#
|
||||||
|
# def run():
|
||||||
|
# global _target, _tests, run
|
||||||
|
# import sys
|
||||||
|
# import traceback
|
||||||
|
# _target = sys.modules["__main__"]
|
||||||
|
# run = None # no need to run twice
|
||||||
|
# tests = []
|
||||||
|
# for name, value in list(vars(_target).items()):
|
||||||
|
# if name[:5] == "test_" and type(value) is type(success):
|
||||||
|
# tests.append((value.__code__.co_firstlineno, name, value))
|
||||||
|
# tests.sort() # sort by line
|
||||||
|
# for lineno, name, func in tests:
|
||||||
|
# try:
|
||||||
|
# _tests = []
|
||||||
|
# func()
|
||||||
|
# for func, args in _tests:
|
||||||
|
# func(*args)
|
||||||
|
# except:
|
||||||
|
# t, v, tb = sys.exc_info()
|
||||||
|
# tb = tb.tb_next
|
||||||
|
# if tb:
|
||||||
|
# failure(frame=tb.tb_frame)
|
||||||
|
# traceback.print_exception(t, v, tb)
|
||||||
|
# else:
|
||||||
|
# print("%s:%d: cannot call test function: %s" % (
|
||||||
|
# sys.argv[0], lineno, v))
|
||||||
|
# failure.count += 1
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def yield_test(function, *args):
|
||||||
|
# # collect delayed/generated tests
|
||||||
|
# _tests.append((function, args))
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def skip(msg=None):
|
||||||
|
# import os
|
||||||
|
# print("skip")
|
||||||
|
# os._exit(0) # don't run exit handlers
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def ignore(pattern):
|
||||||
|
# """Tells the driver to ignore messages matching the pattern, for the
|
||||||
|
# duration of the current test."""
|
||||||
|
# print('ignore: %s' % pattern)
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# def _setup():
|
||||||
|
# global _logfile
|
||||||
|
#
|
||||||
|
# import sys
|
||||||
|
# if "--coverage" in sys.argv:
|
||||||
|
# # Temporary: ignore PendingDeprecationWarning from Coverage (Py3.4)
|
||||||
|
# with warnings.catch_warnings():
|
||||||
|
# warnings.simplefilter("ignore")
|
||||||
|
# import coverage
|
||||||
|
# cov = coverage.coverage(auto_data=True, include="PIL/*")
|
||||||
|
# cov.start()
|
||||||
|
#
|
||||||
|
# def report():
|
||||||
|
# if run:
|
||||||
|
# run()
|
||||||
|
# if success.count and not failure.count:
|
||||||
|
# print("ok")
|
||||||
|
# # only clean out tempfiles if test passed
|
||||||
|
# import os
|
||||||
|
# import os.path
|
||||||
|
# import tempfile
|
||||||
|
# for file in _tempfiles:
|
||||||
|
# try:
|
||||||
|
# os.remove(file)
|
||||||
|
# except OSError:
|
||||||
|
# pass # report?
|
||||||
|
# temp_root = os.path.join(tempfile.gettempdir(), 'pillow-tests')
|
||||||
|
# try:
|
||||||
|
# os.rmdir(temp_root)
|
||||||
|
# except OSError:
|
||||||
|
# pass
|
||||||
|
#
|
||||||
|
# import atexit
|
||||||
|
# atexit.register(report)
|
||||||
|
#
|
||||||
|
# if "--log" in sys.argv:
|
||||||
|
# _logfile = open("test.log", "a")
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# _setup()
|
|
@ -1,7 +1,7 @@
|
||||||
import unittest
|
from tester import unittest
|
||||||
|
|
||||||
|
|
||||||
class PillowTests(unittest.TestCase):
|
class SomeTests(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
Can we start moving the test suite here?
|
Can we start moving the test suite here?
|
||||||
"""
|
"""
|
||||||
|
@ -10,8 +10,10 @@ class PillowTests(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
Great idea!
|
Great idea!
|
||||||
"""
|
"""
|
||||||
assert True is True
|
self.assertTrue(True)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
||||||
|
# End of file
|
||||||
|
|
Loading…
Reference in New Issue
Block a user