aboutsummaryrefslogtreecommitdiffstats
path: root/test/reader
diff options
context:
space:
mode:
Diffstat (limited to 'test/reader')
-rw-r--r--test/reader/image/__init__.py0
-rw-r--r--test/reader/image/load_nef.py28
-rw-r--r--test/reader/image/test_image.py54
-rw-r--r--test/reader/image/test_pillow.py44
-rw-r--r--test/reader/image/test_raw_image.py53
-rw-r--r--test/reader/image/testimage.jpgbin0 -> 518 bytes
-rw-r--r--test/reader/test_base.py45
-rw-r--r--test/reader/test_builder.py54
-rw-r--r--test/reader/test_chain.py85
-rw-r--r--test/reader/test_path.py2
-rw-r--r--test/reader/test_stat.py4
11 files changed, 366 insertions, 3 deletions
diff --git a/test/reader/image/__init__.py b/test/reader/image/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/reader/image/__init__.py
diff --git a/test/reader/image/load_nef.py b/test/reader/image/load_nef.py
new file mode 100644
index 0000000..5ba0adc
--- /dev/null
+++ b/test/reader/image/load_nef.py
@@ -0,0 +1,28 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import os
+
+# external imports
+import requests
+
+# constants
+IMAGE_URL = 'http://igsor.net/eik7AhvohghaeN5.nef'
+
+## code ##
+
+def get():
+ """Download a raw test image."""
+ target = os.path.join(os.path.dirname(__file__), 'testimage.nef')
+ if not os.path.exists(target):
+ with open(target, 'wb') as ofile:
+ ans = requests.get(IMAGE_URL)
+ ofile.write(ans.content)
+
+
+
+## EOF ##
diff --git a/test/reader/image/test_image.py b/test/reader/image/test_image.py
new file mode 100644
index 0000000..26f6a93
--- /dev/null
+++ b/test/reader/image/test_image.py
@@ -0,0 +1,54 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import importlib
+import os
+import unittest
+
+# bsie imports
+from bsie.utils import errors
+
+# objects to test
+from bsie.reader.image import Image
+
+
+## code ##
+
+class TestImage(unittest.TestCase):
+ def setUp(self):
+ if __package__ is None or __package__ == '': # direct call or local discovery
+ importlib.import_module('load_nef', __package__).get()
+ else: # parent discovery
+ importlib.import_module('.load_nef', __package__).get()
+
+ def test_construct(self):
+ image = Image({})
+ self.assertIsInstance(image, Image)
+ self.assertEqual(len(image._children), 2)
+
+ def test_call(self):
+ image = Image({})
+ # call returns raw image
+ img = image(os.path.join(os.path.dirname(__file__), 'testimage.nef'))
+ self.assertEqual(img.size, (6016, 4016)) # FIXME: change when image was replaced
+ img.close()
+ # call returns jpeg image
+ img = image(os.path.join(os.path.dirname(__file__), 'testimage.jpg'))
+ self.assertEqual(img.size, (1, 1))
+ img.close()
+ # call raises error if file cannot be read
+ self.assertRaises(errors.ReaderError, image,
+ os.path.join(os.path.dirname(__file__), 'invalid.nef'))
+ self.assertRaises(errors.ReaderError, image,
+ os.path.join(os.path.dirname(__file__), 'invalid.jpg'))
+
+## main ##
+
+if __name__ == '__main__':
+ unittest.main()
+
+## EOF ##
diff --git a/test/reader/image/test_pillow.py b/test/reader/image/test_pillow.py
new file mode 100644
index 0000000..8abf5c1
--- /dev/null
+++ b/test/reader/image/test_pillow.py
@@ -0,0 +1,44 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import os
+import unittest
+
+# external imports
+import PIL.Image
+
+# bsie imports
+from bsie.utils import errors
+
+# objects to test
+from bsie.reader.image._pillow import PillowImage
+
+
+## code ##
+
+class TestPillowImage(unittest.TestCase):
+ def test_call(self):
+ rdr = PillowImage()
+ # returns PIL image
+ img = rdr(os.path.join(os.path.dirname(__file__), 'testimage.jpg'))
+ self.assertEqual(img.size, (1, 1))
+ self.assertEqual(img.getdata().getpixel((0, 0)), (0, 0, 0))
+ img.close()
+ # raises exception when image cannot be read
+ self.assertRaises(errors.ReaderError, rdr,
+ os.path.join(os.path.dirname(__file__), 'invalid.jpg'))
+ # NOTE: PIL can actually read raw image files (returns the thumbnail)
+ #self.assertRaises(errors.ReaderError, rdr,
+ # os.path.join(os.path.dirname(__file__), 'testimage.nef'))
+
+
+## main ##
+
+if __name__ == '__main__':
+ unittest.main()
+
+## EOF ##
diff --git a/test/reader/image/test_raw_image.py b/test/reader/image/test_raw_image.py
new file mode 100644
index 0000000..ba21b5a
--- /dev/null
+++ b/test/reader/image/test_raw_image.py
@@ -0,0 +1,53 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import importlib
+import os
+import unittest
+
+# external imports
+import PIL.Image
+
+# bsie imports
+from bsie.utils import errors
+
+# objects to test
+from bsie.reader.image._raw import RawImage
+
+
+## code ##
+
+class TestRawImage(unittest.TestCase):
+ def setUp(self):
+ if __package__ is None or __package__ == '': # direct call or local discovery
+ importlib.import_module('load_nef', __package__).get()
+ else: # parent discovery
+ importlib.import_module('.load_nef', __package__).get()
+
+ def test_call(self):
+ rdr = RawImage()
+ # returns PIL image
+ img = rdr(os.path.join(os.path.dirname(__file__), 'testimage.nef'))
+ self.assertEqual(img.size, (6016, 4016)) # FIXME: change when image was replaced
+ #self.assertEqual(img.size, (1, 1))
+ #self.assertEqual(img.getdata().getpixel((0, 0)), (0, 0, 0))
+ img.close()
+ # raises exception when image cannot be read
+ self.assertRaises(errors.ReaderError, rdr,
+ os.path.join(os.path.dirname(__file__), 'invalid.nef'))
+ self.assertRaises(errors.ReaderError, rdr,
+ os.path.join(os.path.dirname(__file__), 'testimage.jpg'))
+
+
+
+
+## main ##
+
+if __name__ == '__main__':
+ unittest.main()
+
+## EOF ##
diff --git a/test/reader/image/testimage.jpg b/test/reader/image/testimage.jpg
new file mode 100644
index 0000000..ea7af63
--- /dev/null
+++ b/test/reader/image/testimage.jpg
Binary files differ
diff --git a/test/reader/test_base.py b/test/reader/test_base.py
new file mode 100644
index 0000000..41f4c29
--- /dev/null
+++ b/test/reader/test_base.py
@@ -0,0 +1,45 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import unittest
+
+# objects to test
+from bsie.reader import Reader
+
+
+## code ##
+
+class StubReader(Reader):
+ def __call__(self, path):
+ raise NotImplementedError()
+
+class StubSub(StubReader):
+ pass
+
+class TestReader(unittest.TestCase):
+ def test_essentials(self):
+ ext = StubReader()
+ self.assertEqual(str(ext), 'StubReader')
+ self.assertEqual(repr(ext), 'StubReader()')
+ self.assertEqual(ext, StubReader())
+ self.assertEqual(hash(ext), hash(StubReader()))
+
+ sub = StubSub()
+ self.assertEqual(str(sub), 'StubSub')
+ self.assertEqual(repr(sub), 'StubSub()')
+ self.assertEqual(sub, StubSub())
+ self.assertEqual(hash(sub), hash(StubSub()))
+ self.assertNotEqual(ext, sub)
+ self.assertNotEqual(hash(ext), hash(sub))
+
+
+## main ##
+
+if __name__ == '__main__':
+ unittest.main()
+
+## EOF ##
diff --git a/test/reader/test_builder.py b/test/reader/test_builder.py
new file mode 100644
index 0000000..92e9edc
--- /dev/null
+++ b/test/reader/test_builder.py
@@ -0,0 +1,54 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import unittest
+
+# bsie imports
+from bsie.utils import errors
+
+# objects to test
+from bsie.reader import ReaderBuilder
+
+
+## code ##
+
+class TestReaderBuilder(unittest.TestCase):
+ def test_build(self):
+ builder = ReaderBuilder({'bsie.reader.path.Path': {}})
+ # build configured reader
+ cls = builder.build('bsie.reader.path.Path')
+ import bsie.reader.path
+ self.assertIsInstance(cls, bsie.reader.path.Path)
+ # build unconfigured reader
+ cls = builder.build('bsie.reader.stat.Stat')
+ import bsie.reader.stat
+ self.assertIsInstance(cls, bsie.reader.stat.Stat)
+ # re-build previous reader (test cache)
+ self.assertEqual(cls, builder.build('bsie.reader.stat.Stat'))
+ # test invalid
+ self.assertRaises(TypeError, builder.build, 123)
+ self.assertRaises(TypeError, builder.build, None)
+ self.assertRaises(ValueError, builder.build, '')
+ self.assertRaises(ValueError, builder.build, 'Path')
+ self.assertRaises(errors.BuilderError, builder.build, 'path.Path')
+ # invalid config
+ builder = ReaderBuilder({'bsie.reader.stat.Stat': dict(foo=123)})
+ self.assertRaises(errors.BuilderError, builder.build, 'bsie.reader.stat.Stat')
+ builder = ReaderBuilder({'bsie.reader.stat.Stat': 123})
+ self.assertRaises(TypeError, builder.build, 'bsie.reader.stat.Stat')
+ # no instructions
+ builder = ReaderBuilder({})
+ cls = builder.build('bsie.reader.stat.Stat')
+ self.assertIsInstance(cls, bsie.reader.stat.Stat)
+
+
+## main ##
+
+if __name__ == '__main__':
+ unittest.main()
+
+## EOF ##
diff --git a/test/reader/test_chain.py b/test/reader/test_chain.py
new file mode 100644
index 0000000..901faa1
--- /dev/null
+++ b/test/reader/test_chain.py
@@ -0,0 +1,85 @@
+"""
+
+Part of the bsie test suite.
+A copy of the license is provided with the project.
+Author: Matthias Baumgartner, 2022
+"""
+# standard imports
+import logging
+import os
+import unittest
+
+# bsie imports
+from bsie.utils import errors
+import bsie.reader.path
+import bsie.reader.stat
+
+# objects to test
+from bsie.reader.chain import ReaderChain
+
+
+## code ##
+
+class TestReaderChain(unittest.TestCase):
+ def test_construct(self):
+ # subreaders are built
+ chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {})
+ self.assertIsInstance(chain, ReaderChain)
+ self.assertEqual(chain._children,
+ (bsie.reader.stat.Stat(), bsie.reader.path.Path()))
+ # subreaders that failed to build are omitted
+ with self.assertLogs(logging.getLogger('bsie.reader.chain'), logging.WARNING):
+ chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.invalid.Invalid'], {})
+ self.assertEqual(chain._children, (bsie.reader.stat.Stat(), ))
+ with self.assertLogs(logging.getLogger('bsie.reader.chain'), logging.WARNING):
+ chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Invalid'], {})
+ self.assertEqual(chain._children, (bsie.reader.stat.Stat(), ))
+ # warning is issued if there are no subreaders
+ with self.assertLogs(logging.getLogger('bsie.reader.chain'), logging.WARNING):
+ chain = ReaderChain([], {})
+ self.assertEqual(chain._children, tuple())
+
+ def test_essentials(self):
+ chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {})
+ # identity
+ self.assertEqual(chain, chain)
+ self.assertEqual(hash(chain), hash(chain))
+ # comparison works across instances
+ self.assertEqual(chain,
+ ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {}))
+ self.assertEqual(hash(chain),
+ hash(ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {})))
+ # comparison respects subreaders
+ self.assertNotEqual(hash(chain),
+ hash(ReaderChain(['bsie.reader.path.Path'], {})))
+ self.assertNotEqual(hash(chain),
+ hash(ReaderChain(['bsie.reader.path.Path'], {})))
+ # comparison respects subreader order
+ self.assertNotEqual(chain,
+ ReaderChain(['bsie.reader.path.Path', 'bsie.reader.stat.Stat'], {}))
+ self.assertNotEqual(hash(chain),
+ hash(ReaderChain(['bsie.reader.path.Path', 'bsie.reader.stat.Stat'], {})))
+ # string representation
+ self.assertEqual(str(chain), 'ReaderChain(Stat, Path)')
+ self.assertEqual(repr(chain), 'ReaderChain((Stat(), Path()))')
+
+ def test_call(self):
+ chain = ReaderChain(['bsie.reader.stat.Stat', 'bsie.reader.path.Path'], {})
+ # chain first probes first child
+ self.assertEqual(chain(__file__), os.stat(__file__))
+ # chain probes second child if first one failes
+ self.assertEqual(chain(''), '')
+ self.assertEqual(chain('missing-file'), 'missing-file')
+
+ # chain raises a ReaderError if childs were exhausted
+ chain = ReaderChain(['bsie.reader.stat.Stat'], {})
+ # chain probes second child if first one failes
+ self.assertRaises(errors.ReaderError, chain, '')
+
+
+## main ##
+
+if __name__ == '__main__':
+ unittest.main()
+
+## EOF ##
diff --git a/test/reader/test_path.py b/test/reader/test_path.py
index fd7bc5a..95e447f 100644
--- a/test/reader/test_path.py
+++ b/test/reader/test_path.py
@@ -4,7 +4,7 @@ Part of the bsie test suite.
A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2022
"""
-# imports
+# standard imports
import unittest
# objects to test
diff --git a/test/reader/test_stat.py b/test/reader/test_stat.py
index d12ad9c..fd9fdcd 100644
--- a/test/reader/test_stat.py
+++ b/test/reader/test_stat.py
@@ -4,12 +4,12 @@ Part of the bsie test suite.
A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2022
"""
-# imports
+# standard imports
import os
import unittest
# bsie imports
-from bsie.base import errors
+from bsie.utils import errors
# objects to test
from bsie.reader.stat import Stat