aboutsummaryrefslogtreecommitdiffstats
path: root/test/extractor/test_preview.py
blob: 10d2a7fb338c367b7c42bc1cd495415f9c35f567 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
"""

Part of the bsie test suite.
A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2022
"""
# standard imports
import io
import os
import unittest

# external imports
import PIL.Image

# bsie imports
from bsie.extractor import base
from bsie.utils import bsfs, node as _node, ns
from bsie.reader.preview import Preview as Reader

# objects to test
from bsie.extractor.preview import Preview


## code ##

class TestPreview(unittest.TestCase):
    def test_eq(self):
        # identical instances are equal
        self.assertEqual(Preview([1,2,3]), Preview([1,2,3]))
        self.assertEqual(hash(Preview([1,2,3])), hash(Preview([1,2,3])))
        # comparison respects max_sides
        self.assertNotEqual(Preview([1,2,3]), Preview([1,2]))
        self.assertNotEqual(hash(Preview([1,2,3])), hash(Preview([1,2])))
        self.assertNotEqual(Preview([1,2]), Preview([1,2,3]))
        self.assertNotEqual(hash(Preview([1,2])), hash(Preview([1,2,3])))
        # comparison respects type
        class Foo(): pass
        self.assertNotEqual(Preview([1,2,3]), Foo())
        self.assertNotEqual(hash(Preview([1,2,3])), hash(Foo()))
        self.assertNotEqual(Preview([1,2,3]), 123)
        self.assertNotEqual(hash(Preview([1,2,3])), hash(123))
        self.assertNotEqual(Preview([1,2,3]), None)
        self.assertNotEqual(hash(Preview([1,2,3])), hash(None))

    def test_schema(self):
        self.assertEqual(Preview([1,2,3]).schema,
            bsfs.schema.from_string(base.SCHEMA_PREAMBLE + '''
                bsfs:Preview rdfs:subClassOf bsfs:Node .
                bsfs:BinaryBlob rdfs:subClassOf bsfs:Literal .
                bsfs:JPEG rdfs:subClassOf bsfs:BinaryBlob .

                bse:preview rdfs:subClassOf bsfs:Predicate ;
                    rdfs:domain bsfs:File ;
                    rdfs:range bsfs:Preview ;
                    bsfs:unique "false"^^xsd:boolean .

                bsp:width rdfs:subClassOf bsfs:Predicate ;
                    rdfs:domain bsfs:Preview ;
                    rdfs:range xsd:integer ;
                    bsfs:unique "true"^^xsd:boolean .

                bsp:height rdfs:subClassOf bsfs:Predicate ;
                    rdfs:domain bsfs:Preview ;
                    rdfs:range xsd:integer ;
                    bsfs:unique "true"^^xsd:boolean .

                bsp:asset rdfs:subClassOf bsfs:Predicate ;
                    rdfs:domain bsfs:Preview ;
                    rdfs:range bsfs:JPEG ;
                    bsfs:unique "true"^^xsd:boolean .

                '''))

    def test_extract(self):
        # setup dependents
        rdr = Reader()
        subject = _node.Node(ns.bsfs.File)
        path = os.path.join(os.path.dirname(__file__), 'testimage.jpg')

        # setup extractor
        ext = Preview(max_sides=[10])
        principals = set(ext.principals)
        self.assertEqual(principals, {ext.schema.predicate(ns.bse.preview)})
        # skip unknown predicates
        gen = rdr(path)
        self.assertSetEqual(set(), set(ext.extract(subject, gen,
            {ext.schema.predicate(ns.bsfs.Predicate).child(ns.bse.unknown)})))
        gen(10) # NOTE: consume some image to avoid resource error warning
        # extract a preview
        triples = set(ext.extract(subject, rdr(path), principals))
        thumbs = {node for node, _, _ in triples if node.node_type == ns.bsfs.Preview}
        self.assertEqual(len(thumbs), 1)
        thumb = list(thumbs)[0]
        # test properties
        self.assertTrue(triples.issuperset({
            (subject, ext.schema.predicate(ns.bse.preview), thumb),
            (thumb, ext.schema.predicate(ns.bsp.width), 10),
            (thumb, ext.schema.predicate(ns.bsp.height), 10),
            }))
        # test image data
        rawdata = {val for _, pred, val in triples if pred == ext.schema.predicate(ns.bsp.asset)}
        self.assertEqual(len(rawdata), 1)
        data = io.BytesIO(list(rawdata)[0])
        data.seek(0)
        img = PIL.Image.open(data)
        self.assertEqual(img.size, (10, 10))
        self.assertEqual(sum(band for pix in img.getdata() for band in pix), 0)

        # setup extractor
        ext = Preview(max_sides=[10, 20])
        principals = set(ext.principals)
        self.assertEqual(principals, {ext.schema.predicate(ns.bse.preview)})
        # extract a preview
        triples = set(ext.extract(subject, rdr(path), principals))
        thumbs = {node for node, _, _ in triples if node.node_type == ns.bsfs.Preview}
        self.assertEqual(len(thumbs), 2)
        self.assertSetEqual({10, 20}, {
            value for _, pred, value in triples if pred == ext.schema.predicate(ns.bsp.width)})
        self.assertSetEqual({10, 20}, {
            value for _, pred, value in triples if pred == ext.schema.predicate(ns.bsp.height)})


## main ##

if __name__ == '__main__':
    unittest.main()

## EOF ##