mirror of
https://github.com/wting/autojump
synced 2024-10-27 20:34:07 +00:00
b00e0e85e1
Also added unit test coverage to check database initialization, saving, and loading. Unit tests also revealed that migration code was not working properly (starts database from scratch instead of copying existing entries over).
248 lines
7.2 KiB
Python
Executable File
248 lines
7.2 KiB
Python
Executable File
#!/usr/bin/env python2
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Tests autojump.
|
|
"""
|
|
|
|
from __future__ import division
|
|
import autojump
|
|
import contextlib
|
|
import random
|
|
import os
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
|
|
@contextlib.contextmanager
|
|
def no_stderr():
|
|
savestderr = sys.stderr
|
|
class DevNull(object):
|
|
def write(self, _): pass
|
|
sys.stderr = DevNull()
|
|
yield
|
|
sys.stderr = savestderr
|
|
|
|
# test suite
|
|
class TestAutojump(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
autojump.TESTING = True
|
|
self.fd, self.fname = tempfile.mkstemp()
|
|
self.db = autojump.Database(self.fname)
|
|
|
|
random.seed()
|
|
|
|
def tearDown(self):
|
|
os.remove(self.fname)
|
|
if os.path.isfile(self.fname + ".bak"):
|
|
os.remove(self.fname + ".bak")
|
|
|
|
def test_config(self):
|
|
self.assertEqual(autojump.COMPLETION_SEPARATOR, '__')
|
|
|
|
def test_db_add(self):
|
|
self.db.add('/1', 100)
|
|
self.assertEqual(self.db.get_weight('/1'), 100)
|
|
self.db.add('/2', 10)
|
|
self.assertEqual(self.db.get_weight('/2'), 10)
|
|
self.db.add('/2', 10)
|
|
self.assertEqual(self.db.get_weight('/2'), 14.142135623730951)
|
|
|
|
def test_db_get_weight(self):
|
|
self.assertEqual(self.db.get_weight('/'), 0)
|
|
|
|
def test_db_decay(self):
|
|
self.db.add('/1', 10)
|
|
self.db.decay()
|
|
self.assertTrue(self.db.get_weight('/1') < 10)
|
|
|
|
def test_db_load_existing(self):
|
|
self.db = autojump.Database('tests/database.txt')
|
|
self.assertTrue(len(self.db) > 0)
|
|
|
|
def test_db_load_empty(self):
|
|
# setup
|
|
_, fname = tempfile.mkstemp()
|
|
db = autojump.Database(fname)
|
|
|
|
try:
|
|
# test
|
|
self.assertEquals(len(self.db), 0)
|
|
finally:
|
|
# teardown
|
|
os.remove(fname)
|
|
|
|
def test_db_load_backup(self):
|
|
# setup
|
|
fname = '/tmp/autojump_test_db_load_backup_' + str(random.randint(0,32678))
|
|
db = autojump.Database(fname)
|
|
db.add('/1')
|
|
os.rename(fname, fname + '.bak')
|
|
|
|
try:
|
|
# test
|
|
with no_stderr():
|
|
db = autojump.Database(fname)
|
|
self.assertTrue(len(db.data) > 0)
|
|
self.assertTrue(os.path.isfile(fname))
|
|
finally:
|
|
# teardown
|
|
os.remove(fname)
|
|
os.remove(fname + '.bak')
|
|
|
|
def test_db_load_migrate(self):
|
|
ORIG_CONFIG_DIR = autojump.CONFIG_DIR
|
|
try:
|
|
# setup
|
|
CONFIG_DIR = '/tmp/autojump_test_db_load_migrate_' + str(random.randint(0,32678))
|
|
os.mkdir(CONFIG_DIR)
|
|
autojump.CONFIG_DIR = CONFIG_DIR
|
|
fname = CONFIG_DIR + '/autojump_py'
|
|
db = autojump.Database(fname)
|
|
db.add('/1')
|
|
shutil.copy(fname, fname + '.bak')
|
|
db.add('/2')
|
|
|
|
# test
|
|
missing_fname = '/tmp/autojump_test_db_load_missing_' + str(random.randint(0,32678)) + '.txt'
|
|
db = autojump.Database(missing_fname)
|
|
|
|
db.add('/3')
|
|
self.assertEquals(len(db.data), 3)
|
|
|
|
finally:
|
|
# teardown
|
|
shutil.rmtree(CONFIG_DIR)
|
|
os.remove(missing_fname)
|
|
os.remove(missing_fname + '.bak')
|
|
|
|
autojump.CONFIG_DIR = ORIG_CONFIG_DIR
|
|
|
|
def test_db_purge(self):
|
|
self.db.add('/1')
|
|
self.db.purge()
|
|
self.assertEquals(len(self.db), 0)
|
|
|
|
def test_db_save(self):
|
|
# setup
|
|
fname = '/tmp/autojump_test_db_save_' + str(random.randint(0,32678)) + '.txt'
|
|
db = autojump.Database(fname)
|
|
|
|
try:
|
|
# test
|
|
db.save()
|
|
self.assertTrue(os.path.isfile(fname))
|
|
finally:
|
|
# teardown
|
|
os.remove(fname)
|
|
os.remove(fname + '.bak')
|
|
|
|
def test_db_trim(self):
|
|
self.db.add('/1')
|
|
self.db.add('/2')
|
|
self.db.add('/3')
|
|
self.db.add('/4')
|
|
self.db.add('/5')
|
|
self.db.add('/6')
|
|
self.db.add('/7')
|
|
self.db.add('/8')
|
|
self.db.add('/9')
|
|
self.db.add('/10')
|
|
self.assertEquals(len(self.db), 10)
|
|
self.db.trim()
|
|
self.assertEquals(len(self.db), 9)
|
|
|
|
def test_db_decode(self):
|
|
#FIXME
|
|
self.assertEquals(autojump.decode('foo'), 'foo')
|
|
|
|
def test_db_unico(self):
|
|
#FIXME
|
|
self.assertEquals(autojump.unico('foo'), u'foo')
|
|
|
|
def test_match_normal(self):
|
|
max_matches = 1
|
|
self.db.add('/foo', 10)
|
|
self.db.add('/foo/bar', 20)
|
|
|
|
patterns = [u'']
|
|
results = autojump.find_matches(self.db, patterns, max_matches)
|
|
self.assertEquals(results[0], '/foo/bar')
|
|
|
|
patterns = [u'random']
|
|
results = autojump.find_matches(self.db, patterns, max_matches)
|
|
self.assertTrue(len(results) == 0)
|
|
|
|
patterns = [u'fo']
|
|
results = autojump.find_matches(self.db, patterns, max_matches)
|
|
self.assertEquals(results[0], '/foo')
|
|
|
|
self.db.add('/foo/bat', 15)
|
|
patterns = [u'ba']
|
|
results = autojump.find_matches(self.db, patterns, max_matches)
|
|
self.assertEquals(results[0], '/foo/bar')
|
|
|
|
self.db.add('/code/inbox', 5)
|
|
self.db.add('/home/user/inbox', 10)
|
|
patterns = [u'inbox']
|
|
results = autojump.find_matches(self.db, patterns, max_matches)
|
|
self.assertEquals(results[0], '/home/user/inbox')
|
|
patterns = [u'co', u'in']
|
|
results = autojump.find_matches(self.db, patterns, max_matches)
|
|
self.assertEquals(results[0], '/code/inbox')
|
|
|
|
def test_match_completion(self):
|
|
max_matches = 9
|
|
ignore_case = True
|
|
self.db.add('/1')
|
|
self.db.add('/2')
|
|
self.db.add('/3')
|
|
self.db.add('/4')
|
|
self.db.add('/5', 20)
|
|
self.db.add('/6', 15)
|
|
self.db.add('/7')
|
|
self.db.add('/8')
|
|
self.db.add('/9')
|
|
|
|
patterns = [u'']
|
|
results = autojump.find_matches(self.db, patterns, max_matches, ignore_case)
|
|
self.assertEquals(results, ['/5', '/6', '/9', '/8', '/7', '/4', '/3', '/2', '/1'])
|
|
|
|
def test_match_case_insensitive(self):
|
|
max_matches = 1
|
|
ignore_case = True
|
|
self.db.add('/FOO', 20)
|
|
self.db.add('/foo', 10)
|
|
|
|
patterns = [u'fo']
|
|
results = autojump.find_matches(self.db, patterns, max_matches, ignore_case)
|
|
self.assertEquals(results[0], '/FOO')
|
|
|
|
def test_match_fuzzy(self):
|
|
max_matches = 1
|
|
ignore_case = True
|
|
fuzzy_search = True
|
|
self.db.add('/foo', 10)
|
|
self.db.add('/foo/bar', 20)
|
|
self.db.add('/abcdefg', 10)
|
|
|
|
patterns = [u'random']
|
|
results = autojump.find_matches(self.db, patterns, max_matches, ignore_case, fuzzy_search)
|
|
self.assertTrue(len(results) == 0)
|
|
|
|
patterns = [u'abcdefg']
|
|
results = autojump.find_matches(self.db, patterns, max_matches, ignore_case, fuzzy_search)
|
|
self.assertEquals(results[0], '/abcdefg')
|
|
|
|
patterns = [u'abcefg']
|
|
results = autojump.find_matches(self.db, patterns, max_matches, ignore_case, fuzzy_search)
|
|
self.assertEquals(results[0], '/abcdefg')
|
|
|
|
patterns = [u'bacef']
|
|
results = autojump.find_matches(self.db, patterns, max_matches, ignore_case, fuzzy_search)
|
|
self.assertEquals(results[0], '/abcdefg')
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|