Skip to content

Commit b69d734

Browse files
committed
add KernelSHA256 tests
1 parent 431e516 commit b69d734

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

pytest_mpl/kernels.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,14 @@ def equivalent_hash(self, result, baseline, marker=None):
163163
# Unlike cryptographic hashes, perceptual hashes can measure the
164164
# degree of "similarity" through hamming distance bit differences
165165
# between the hashes.
166-
self.hamming_distance = result - baseline
167-
self.equivalent = self.hamming_distance <= self.hamming_tolerance
166+
try:
167+
self.hamming_distance = result - baseline
168+
self.equivalent = self.hamming_distance <= self.hamming_tolerance
169+
except TypeError:
170+
# imagehash won't compare hashes of different sizes, however
171+
# let's gracefully support this for use-ability.
172+
self.hamming_distance = None
173+
self.equivalent = False
168174
return self.equivalent
169175

170176
def generate_hash(self, buffer):

tests/test_kernels.py

+57-4
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
HAMMING_TOLERANCE = sentinel.hamming_tolerance
1212
HIGH_FREQUENCY_FACTOR = sentinel.high_freq_factor
1313

14+
#: baseline hash (32-bit)
15+
HASH_BASE_32 = "01234567"
16+
1417
#: baseline hash (64-bit)
1518
HASH_BASE = "0123456789abcdef"
1619

17-
#: 2-bit baseline delta (64-bit)
20+
#: baseline hash with 2-bit delta (64-bit)
1821
# ---X------------
1922
HASH_2BIT = "0120456789abcdef"
2023

21-
#: 4-bit baseline delta (64-bit)
24+
#: baseline with 4-bit delta (64-bit)
2225
# --XX-----------X
2326
HASH_4BIT = "0100456789abcdee"
2427

@@ -52,7 +55,13 @@ def test_kernel_abc():
5255

5356

5457
def test_phash_name():
55-
assert KernelPHash.name == KERNEL_PHASH
58+
for name, factory in kernel_factory.items():
59+
assert name == factory.name
60+
61+
62+
#
63+
# KernelPHash
64+
#
5665

5766

5867
def test_phash_init__set():
@@ -85,7 +94,12 @@ def test_phash_option():
8594

8695
@pytest.mark.parametrize(
8796
"baseline,equivalent,distance",
88-
[(HASH_BASE, True, 0), (HASH_2BIT, True, 2), (HASH_4BIT, False, 4)],
97+
[
98+
(HASH_BASE, True, 0),
99+
(HASH_2BIT, True, 2),
100+
(HASH_4BIT, False, 4),
101+
(HASH_BASE_32, False, None),
102+
],
89103
)
90104
def test_phash_equivalent(baseline, equivalent, distance):
91105
kernel = KernelPHash(DummyPlugin())
@@ -188,3 +202,42 @@ def test_phash_update_summary(summary, distance, tolerance, count):
188202
assert summary["hamming_distance"] == distance
189203
assert summary["hamming_tolerance"] == tolerance
190204
assert len(summary) == count
205+
206+
207+
#
208+
# KernelSHA256
209+
#
210+
211+
212+
@pytest.mark.parametrize(
213+
"baseline, equivalent",
214+
[(HASH_BASE, True), (HASH_2BIT, False), (HASH_4BIT, False)],
215+
)
216+
def test_sha256_equivalent(baseline, equivalent):
217+
kernel = KernelSHA256(DummyPlugin())
218+
assert kernel.equivalent_hash(HASH_BASE, baseline) is equivalent
219+
220+
221+
@pytest.mark.skipif(baseline_unavailable, reason=baseline_missing)
222+
def test_sha256_generate_hash():
223+
kernel = KernelSHA256(DummyPlugin())
224+
fh = open(baseline_image, "rb")
225+
actual = kernel.generate_hash(fh)
226+
expected = "2dc4d32eefa5f5d11c365b10196f2fcdadc8ed604e370d595f9cf304363c13d2"
227+
assert actual == expected
228+
229+
230+
def test_sha256_update_status():
231+
kernel = KernelSHA256(DummyPlugin())
232+
message = sentinel.message
233+
result = kernel.update_status(message)
234+
assert result is message
235+
236+
237+
def test_sha256_update_summary():
238+
kernel = KernelSHA256(DummyPlugin())
239+
summary = {}
240+
kernel.update_summary(summary)
241+
assert len(summary) == 1
242+
assert "kernel" in summary
243+
assert summary["kernel"] == KernelSHA256.name

0 commit comments

Comments
 (0)