#!/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()