You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wting_autojump/tests/runtests.py

248 lines
7.2 KiB

#!/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_migration(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')
db.add('/2')
shutil.copy(fname, fname + '.bak')
# 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()