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
|
# 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 ##
|