Add tests for hint scattering

This commit is contained in:
Jay Kamat 2017-11-24 13:21:21 -05:00
parent 739cfc03ba
commit c9af36909f
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5

View File

@ -22,12 +22,17 @@
import os import os
import os.path import os.path
import textwrap import textwrap
import string
import functools
import operator
import attr import attr
import yaml import yaml
import pytest import pytest
import bs4 import bs4
import qutebrowser.browser.hints
def collect_tests(): def collect_tests():
basedir = os.path.dirname(__file__) basedir = os.path.dirname(__file__)
@ -146,3 +151,45 @@ def test_word_hints_issue1393(quteproc, tmpdir):
quteproc.wait_for(message='hints: *', category='hints') quteproc.wait_for(message='hints: *', category='hints')
quteproc.send_cmd(':follow-hint {}'.format(hint)) quteproc.send_cmd(':follow-hint {}'.format(hint))
quteproc.wait_for_load_finished('data/{}'.format(target)) quteproc.wait_for_load_finished('data/{}'.format(target))
@pytest.mark.parametrize('min_len', [0, 3])
@pytest.mark.parametrize('num_chars', [9])
@pytest.mark.parametrize('num_elements', range(1, 26))
def test_scattered_hints_count(win_registry, mode_manager, min_len,
num_chars, num_elements):
"""Test scattered hints function."""
# pylint: disable=W0141
manager = qutebrowser.browser.hints.HintManager(0, 0)
chars = string.ascii_lowercase[:num_chars]
hints = manager._hint_scattered(min_len, chars,
list(range(num_elements)))
# Check if hints are unique
assert len(hints) == len(set(hints))
# Check if any hints are shorter than min_len
assert not any([x for x in hints if len(x) < min_len])
# Check we don't have more than 2 link lengths
# Eg: 'a' 'bc' and 'def' cannot be in the same hint string
hint_lens = set(map(len, hints))
assert len(hint_lens) <= 2
if len(hint_lens) == 2:
# Check if hint_lens are more than 1 apart
# Eg: 'abc' and 'd' cannot be in the same hint sequence, but
# 'ab' and 'c' can
assert abs(functools.reduce(operator.sub, hint_lens)) <= 1
longest_hints = filter(lambda x: len(x) == max(hint_lens), hints)
if min_len < max(hint_lens) - 1:
# Check if we have any unique prefixes. For example, 'la'
# alone, with no other 'l<x>'
count_map = {}
for x in longest_hints:
prefix = x[:-1]
count_map[prefix] = count_map.get(prefix, 0) + 1
assert not any(filter(lambda x: x == 1, count_map.values()))