1
0
mirror of https://github.com/wting/autojump synced 2024-09-28 22:10:45 +00:00
wting_autojump/tests/runtests.py
William Ting f41d0fb7b3 Remove database migration code support for v17 and older.
The migration code was never working to begin with. Users migrating from v17 or
older will be starting from an empty, new database.
2012-06-23 13:21:24 -10:00

224 lines
6.5 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.CONFIG_DIR = tempfile.mkdtemp()
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")
if (os.path.exists(autojump.CONFIG_DIR) and
('tmp' in autojump.CONFIG_DIR or 'temp' in autojump.CONFIG_DIR)):
shutil.rmtree(autojump.CONFIG_DIR)
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_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()