Completed
Branch master (87ccc1)
by Chris
08:42
created

tests.distance.test_distance_hamming   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 148
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 84
dl 0
loc 148
rs 10
c 0
b 0
f 0
wmc 5
1
# -*- coding: utf-8 -*-
2
3
# Copyright 2014-2018 by Christopher C. Little.
4
# This file is part of Abydos.
5
#
6
# Abydos is free software: you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation, either version 3 of the License, or
9
# (at your option) any later version.
10
#
11
# Abydos is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with Abydos. If not, see <http://www.gnu.org/licenses/>.
18
19
"""abydos.tests.test_distance_hamming.
20
21
This module contains unit tests for abydos.distance.hamming
22
"""
23
24
from __future__ import division, unicode_literals
25
26
import unittest
27
28
from abydos.distance.hamming import dist_hamming, dist_mlipns, hamming, \
29
    sim_hamming, sim_mlipns
30
31
32
class HammingTestCases(unittest.TestCase):
33
    """Test Hamming functions.
34
35
    abydos.distance.hamming, .dist_hamming, & .sim_hamming
36
    """
37
38
    def test_hamming(self):
39
        """Test abydos.distance.hamming."""
40
        self.assertEqual(hamming('', ''), 0)
41
        self.assertEqual(hamming('', '', False), 0)
42
43
        self.assertEqual(hamming('a', ''), 1)
44
        self.assertEqual(hamming('a', 'a'), 0)
45
        self.assertEqual(hamming('a', 'a', False), 0)
46
        self.assertEqual(hamming('a', 'b'), 1)
47
        self.assertEqual(hamming('a', 'b', False), 1)
48
        self.assertEqual(hamming('abc', 'cba'), 2)
49
        self.assertEqual(hamming('abc', 'cba', False), 2)
50
        self.assertEqual(hamming('abc', ''), 3)
51
        self.assertEqual(hamming('bb', 'cbab'), 3)
52
53
        # test exception
54
        self.assertRaises(ValueError, hamming, 'ab', 'a', False)
55
56
        # https://en.wikipedia.org/wiki/Hamming_distance
57
        self.assertEqual(hamming('karolin', 'kathrin'), 3)
58
        self.assertEqual(hamming('karolin', 'kerstin'), 3)
59
        self.assertEqual(hamming('1011101', '1001001'), 2)
60
        self.assertEqual(hamming('2173896', '2233796'), 3)
61
62
    def test_dist_hamming(self):
63
        """Test abydos.distance.dist_hamming."""
64
        self.assertEqual(dist_hamming('', ''), 0)
65
        self.assertEqual(dist_hamming('', '', False), 0)
66
67
        self.assertEqual(dist_hamming('a', ''), 1)
68
        self.assertEqual(dist_hamming('a', 'a'), 0)
69
        self.assertEqual(dist_hamming('a', 'a', False), 0)
70
        self.assertEqual(dist_hamming('a', 'b'), 1)
71
        self.assertEqual(dist_hamming('a', 'b', False), 1)
72
        self.assertAlmostEqual(dist_hamming('abc', 'cba'), 2/3)
73
        self.assertAlmostEqual(dist_hamming('abc', 'cba', False), 2/3)
74
        self.assertEqual(dist_hamming('abc', ''), 1)
75
        self.assertAlmostEqual(dist_hamming('bb', 'cbab'), 3/4)
76
77
        # test exception
78
        self.assertRaises(ValueError, dist_hamming, 'ab', 'a', False)
79
80
        # https://en.wikipedia.org/wiki/Hamming_distance
81
        self.assertAlmostEqual(dist_hamming('karolin', 'kathrin'), 3/7)
82
        self.assertAlmostEqual(dist_hamming('karolin', 'kerstin'), 3/7)
83
        self.assertAlmostEqual(dist_hamming('1011101', '1001001'), 2/7)
84
        self.assertAlmostEqual(dist_hamming('2173896', '2233796'), 3/7)
85
86
    def test_sim_hamming(self):
87
        """Test abydos.distance.sim_hamming."""
88
        self.assertEqual(sim_hamming('', ''), 1)
89
        self.assertEqual(sim_hamming('', '', False), 1)
90
91
        self.assertEqual(sim_hamming('a', ''), 0)
92
        self.assertEqual(sim_hamming('a', 'a'), 1)
93
        self.assertEqual(sim_hamming('a', 'a', False), 1)
94
        self.assertEqual(sim_hamming('a', 'b'), 0)
95
        self.assertEqual(sim_hamming('a', 'b', False), 0)
96
        self.assertAlmostEqual(sim_hamming('abc', 'cba'), 1/3)
97
        self.assertAlmostEqual(sim_hamming('abc', 'cba', False), 1/3)
98
        self.assertEqual(sim_hamming('abc', ''), 0)
99
        self.assertAlmostEqual(sim_hamming('bb', 'cbab'), 1/4)
100
101
        # test exception
102
        self.assertRaises(ValueError, sim_hamming, 'ab', 'a', False)
103
104
        # https://en.wikipedia.org/wiki/Hamming_distance
105
        self.assertAlmostEqual(sim_hamming('karolin', 'kathrin'), 4/7)
106
        self.assertAlmostEqual(sim_hamming('karolin', 'kerstin'), 4/7)
107
        self.assertAlmostEqual(sim_hamming('1011101', '1001001'), 5/7)
108
        self.assertAlmostEqual(sim_hamming('2173896', '2233796'), 4/7)
109
110
111
class MLIPNSTestCases(unittest.TestCase):
112
    """Test MLIPNS functions.
113
114
    abydos.distance.sim_mlipns & .dist_mlipns
115
    """
116
117
    def test_sim_mlipns(self):
118
        """Test abydos.distance.sim_mlipns."""
119
        self.assertEqual(sim_mlipns('', ''), 1)
120
        self.assertEqual(sim_mlipns('a', ''), 0)
121
        self.assertEqual(sim_mlipns('', 'a'), 0)
122
        self.assertEqual(sim_mlipns('a', 'a'), 1)
123
        self.assertEqual(sim_mlipns('ab', 'a'), 1)
124
        self.assertEqual(sim_mlipns('abc', 'abc'), 1)
125
        self.assertEqual(sim_mlipns('abc', 'abcde'), 1)
126
        self.assertEqual(sim_mlipns('abcg', 'abcdeg'), 1)
127
        self.assertEqual(sim_mlipns('abcg', 'abcdefg'), 0)
128
        self.assertEqual(sim_mlipns('Tomato', 'Tamato'), 1)
129
        self.assertEqual(sim_mlipns('ato', 'Tam'), 1)
130
131
    def test_dist_mlipns(self):
132
        """Test abydos.distance.dist_mlipns."""
133
        self.assertEqual(dist_mlipns('', ''), 0)
134
        self.assertEqual(dist_mlipns('a', ''), 1)
135
        self.assertEqual(dist_mlipns('', 'a'), 1)
136
        self.assertEqual(dist_mlipns('a', 'a'), 0)
137
        self.assertEqual(dist_mlipns('ab', 'a'), 0)
138
        self.assertEqual(dist_mlipns('abc', 'abc'), 0)
139
        self.assertEqual(dist_mlipns('abc', 'abcde'), 0)
140
        self.assertEqual(dist_mlipns('abcg', 'abcdeg'), 0)
141
        self.assertEqual(dist_mlipns('abcg', 'abcdefg'), 1)
142
        self.assertEqual(dist_mlipns('Tomato', 'Tamato'), 0)
143
        self.assertEqual(dist_mlipns('ato', 'Tam'), 0)
144
145
146
if __name__ == '__main__':
147
    unittest.main()
148