Exemplo n.º 1
0
 def setUp(self):
     self.ht = HashTable()
     self.ht.set(14, 'fourteen')
     self.ht.set(114, 'oneFourteen')
     self.ht.set(214, 'twoFourteen')
     self.ht.set(314, 'threeFourteen')
     self.ht.set('foo', 'bar')
Exemplo n.º 2
0
    def test_find(self):
        size = 17
        step = 3
        ht = HashTable(size, step)

        values = ["string", "gnirts", "string1", "string2", "string3"]

        for v in values:
            ht.put(v)

        # без коллизий
        index = ht.find(values[0])
        self.assertEqual(0, index)
        index = ht.find(values[2])
        self.assertEqual(15, index)
        index = ht.find(values[3])
        self.assertEqual(16, index)

        # с учетом коллизий
        index = ht.find(values[1])
        self.assertEqual(3, index)
        index = ht.find(values[4])
        self.assertEqual(6, index)

        # не строка
        value = 123
        index = ht.find(value)
        self.assertIsNone(index)
Exemplo n.º 3
0
class collisionTestCase(unittest.TestCase):
    def setUp(self):
        self.ht = HashTable()
        self.ht.set(14, 'fourteen')
        self.ht.set(114, 'oneFourteen')
        self.ht.set(214, 'twoFourteen')

    def testHash(self):
        """ All three keys should hash to the same idx in table """
        assert self.ht.get_idx(14) == 14
        assert self.ht.get_idx(114) == 14
        assert self.ht.get_idx(214) == 14

    def testSeperateChaining(self):
        """ Should be able to properly look up all keys, even with collision """
        assert self.ht.get(14) == 'fourteen'
        assert self.ht.get(114) == 'oneFourteen'
        assert self.ht.get(214) == 'twoFourteen'
Exemplo n.º 4
0
class insertionTestCase(unittest.TestCase):
    def setUp(self):
        self.ht = HashTable()
        self.ht.set('foo', 'bar')
        self.ht.set(('foo', 'bar'), 'bam')

    def testInsertSingle(self):
        """ Insertion should increase size """
        assert self.ht.size == 2

    def testOverrideInsert(self):
        """ Given an key, override existing value """
        self.ht.set('foo', 'kung')
        assert self.ht.get('foo') == 'kung'

    def testLookup(self):
        """ Should be able to get what was inserted """
        assert self.ht.get('foo') == 'bar'
        assert self.ht.get(('foo', 'bar')) == 'bam'

    def testErrorLookup(self):
        """ Error should be thrown if no key in table """
        self.assertRaises(KeyError, self.ht.get, 'blah')
Exemplo n.º 5
0
    def test_put(self):
        size = 17
        step = 3
        ht = HashTable(size, step)

        index = ht.put("string")
        self.assertEqual(0, index)
        # колллизия
        index = ht.put("gnirts")
        self.assertEqual(3, index)
        index = ht.put("string1")
        self.assertEqual(15, index)
        index = ht.put("string2")
        self.assertEqual(16, index)
        # колллизия
        index = ht.put("string3")
        self.assertEqual(6, index)

        # не строка
        value = 123
        index = ht.put(value)
        self.assertIsNone(index)
Exemplo n.º 6
0
class resizeTestCase(unittest.TestCase):
    def setUp(self):
        self.ht = HashTable()
        for i in range(0, 40):
            self.ht.set(i, i)

    def testLoadFactor(self):
        """ Should properly calculate the load factor, 0.4 (size / capacity) """
        assert self.ht.get_load_factor() == 0.4

    def testResize(self):
        """ Capacity should double once the load factor is >= 0.5"""
        for i in range(40, 50):
            self.ht.set(i, i)
        assert self.ht.capacity == 200
        assert self.ht.size == 50

    def testElementsStillInTable(self):
        """ After resizing, all elements should still be in table """
        for i in range(40, 50):
            self.ht.set(i, i)
        for i in range(0, 50):
            assert self.ht.get(i) == i
Exemplo n.º 7
0
    def test_hash_fun(self):
        size = 17
        step = 3
        ht = HashTable(size, step)

        value = "string123"
        index = ht.hash_fun(value)
        self.assertEqual(14, index)

        # коллизия
        value = "321gnirts"
        index = ht.hash_fun(value)
        self.assertEqual(14, index)

        # не строка
        value = 123
        index = ht.hash_fun(value)
        self.assertIsNone(index)

        # не строка
        value = [123]
        index = ht.hash_fun(value)
        self.assertIsNone(index)
Exemplo n.º 8
0
class deleteTestCase(unittest.TestCase):
    def setUp(self):
        self.ht = HashTable()
        self.ht.set(14, 'fourteen')
        self.ht.set(114, 'oneFourteen')
        self.ht.set(214, 'twoFourteen')
        self.ht.set(314, 'threeFourteen')
        self.ht.set('foo', 'bar')

    def testDeleteNonLinkedEntry(self):
        """ Delete a single entry that is not connected to other entries"""
        self.ht.delete('foo')
        self.assertRaises(KeyError, self.ht.get, 'foo')

    def testDeleteFirstLinkedEntry(self):
        """ Delete the first connected entry, but still have
        access to other connected entries"""
        self.ht.delete(14)
        self.assertRaises(KeyError, self.ht.get, 14)
        assert self.ht.get(114) == 'oneFourteen'
        assert self.ht.get(214) == 'twoFourteen'

    def testDeleteIntermediateLinkedEntry(self):
        """ Delete the middle connected entry, but still have
        access to other connected entries"""
        self.ht.delete(214)
        self.assertRaises(KeyError, self.ht.get, 214)
        assert self.ht.get(14) == 'fourteen'
        assert self.ht.get(114) == 'oneFourteen'
        assert self.ht.get(314) == 'threeFourteen'

    def testDeleteFinalLinkedEntry(self):
        """ Delete the last connected entry, but still have
        access to other connected entries"""
        self.ht.delete(314)
        self.assertRaises(KeyError, self.ht.get, 314)
        assert self.ht.get(14) == 'fourteen'
        assert self.ht.get(214) == 'twoFourteen'
        assert self.ht.get(114) == 'oneFourteen'

    def testDeleteNonExistantKey(self):
        self.assertRaises(KeyError, self.ht.delete, 'George Costanza')
Exemplo n.º 9
0
 def setUp(self):
     self.ht = HashTable()
     for i in range(0, 40):
         self.ht.set(i, i)
Exemplo n.º 10
0
 def setUp(self):
     self.ht = HashTable()
Exemplo n.º 11
0
 def setUp(self):
     self.ht = HashTable()
     self.ht.set(14, 'fourteen')
     self.ht.set(114, 'oneFourteen')
     self.ht.set(214, 'twoFourteen')
Exemplo n.º 12
0
 def setUp(self):
     self.ht = HashTable()
     self.ht.set('foo', 'bar')
     self.ht.set(('foo', 'bar'), 'bam')
Exemplo n.º 13
0
 def testCustomCapacity(self):
     """ Should override default capacity"""
     self.ht = HashTable(200)
     assert self.ht.capacity == 200
Exemplo n.º 14
0
    def test_seek_slot(self):
        size = 17
        step = 3
        ht = HashTable(size, step)

        values = ["string", "gnirts", "string1", "string2", "string3"]

        for v in values:
            ht.put(v)

        # без коллизий
        index = ht.seek_slot("string4")
        self.assertEqual(1, index)

        # с учетом коллизий
        index = ht.seek_slot(values[0])
        self.assertEqual(9, index)
        index = ht.seek_slot(values[1])
        self.assertEqual(9, index)
        index = ht.seek_slot(values[2])
        self.assertEqual(1, index)
        index = ht.seek_slot(values[3])
        self.assertEqual(2, index)
        index = ht.seek_slot(values[4])
        self.assertEqual(9, index)

        ht.put("string15")

        index = ht.seek_slot(values[0])
        self.assertEqual(12, index)
        index = ht.seek_slot(values[1])
        self.assertEqual(12, index)
        index = ht.seek_slot(values[4])
        self.assertEqual(12, index)

        # не строка
        value = 123
        index = ht.seek_slot(value)
        self.assertIsNone(index)