textdistance 1.1.1

Lots of algorithms to compare how similar two sequences are
Documentation

from pathlib import Path
from typing import Iterator

import pytest


SKIP = frozenset({'algorithm', 'counter'})
ROOT = Path(__file__).parent.parent


def get_algorithms() -> Iterator[str]:
    for fpath in (ROOT / 'src' / 'algorithms').iterdir():
        alg_name = fpath.stem
        if alg_name not in SKIP:
            yield alg_name


ALGORITHMS = tuple(get_algorithms())


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_name_is_ascii(alg: str) -> None:
    assert alg.replace('_', '').isalnum()
    assert alg.isascii()


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_is_in_readme(alg: str) -> None:
    text = (ROOT / 'README.md').read_text()
    alg = alg.replace('_', '')
    assert f'1. `{alg}`' in text.lower()


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_str_shortcut_exists(alg: str) -> None:
    fpath = (ROOT / 'src' / 'str.rs')
    text = fpath.read_text()
    assert f'fn {alg}(' in text
    alg = alg.replace('_', '')
    assert f'{alg}::default().for_str(s1, s2).' in text.lower()
    assert f'/// a wrapper for [`{alg}`].\n' in text.lower()


def test_str_docs_consistency() -> None:
    fpath = (ROOT / 'src' / 'str.rs')
    text = fpath.read_text()
    assert text.count('/// Calculate ') == text.count('pub fn')


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_nstr_shortcut_exists(alg: str) -> None:
    fpath = (ROOT / 'src' / 'nstr.rs')
    text = fpath.read_text()
    assert f'fn {alg}(' in text
    alg = alg.replace('_', '')
    assert f'{alg}::default().for_str(s1, s2).nval()' in text.lower()
    assert f'/// a wrapper for [`{alg}`].\n' in text.lower()


def test_nstr_docs_consistency() -> None:
    fpath = (ROOT / 'src' / 'nstr.rs')
    text = fpath.read_text()
    assert text.count('/// Calculate normalized ') == text.count('pub fn')


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_is_exported(alg: str) -> None:
    fpath = (ROOT / 'src' / 'lib.rs')
    text = fpath.read_text()
    assert f'pub mod {alg}' in text
    assert f'pub use self::algorithms::{alg}::' in text


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_is_smoke_tested(alg: str) -> None:
    fpath = (ROOT / 'src' / 'lib.rs')
    text = fpath.read_text()
    assert f'#[case::{alg}(' in text


@pytest.mark.parametrize('alg', ALGORITHMS)
def test_is_tested(alg: str) -> None:
    fpath = (ROOT / 'src' / 'algorithms' / f'{alg}.rs')
    assert '#[rstest]' in fpath.read_text()