test_text.py
268 lines
| 7.6 KiB
| text/x-python
|
PythonLexer
|
r4538 | # encoding: utf-8 | ||
"""Tests for IPython.utils.text""" | ||||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2011 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import os | ||||
|
r4654 | import math | ||
|
r7387 | import random | ||
|
r4538 | |||
|
r24258 | from pathlib import Path | ||
|
r4538 | |||
|
r26927 | import pytest | ||
|
r4538 | from IPython.utils import text | ||
#----------------------------------------------------------------------------- | ||||
# Globals | ||||
#----------------------------------------------------------------------------- | ||||
|
r28487 | |||
@pytest.mark.parametrize( | ||||
"expected, width, row_first, spread", | ||||
( | ||||
( | ||||
"aaaaa bbbbb ccccc ddddd\n", | ||||
80, | ||||
False, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa ccccc\nbbbbb ddddd\n", | ||||
25, | ||||
False, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa ccccc\nbbbbb ddddd\n", | ||||
12, | ||||
False, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa\nbbbbb\nccccc\nddddd\n", | ||||
10, | ||||
False, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa bbbbb ccccc ddddd\n", | ||||
80, | ||||
True, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa bbbbb\nccccc ddddd\n", | ||||
25, | ||||
True, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa bbbbb\nccccc ddddd\n", | ||||
12, | ||||
True, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa\nbbbbb\nccccc\nddddd\n", | ||||
10, | ||||
True, | ||||
False, | ||||
), | ||||
( | ||||
"aaaaa bbbbb ccccc ddddd\n", | ||||
40, | ||||
False, | ||||
True, | ||||
), | ||||
( | ||||
"aaaaa ccccc\nbbbbb ddddd\n", | ||||
20, | ||||
False, | ||||
True, | ||||
), | ||||
( | ||||
"aaaaa ccccc\nbbbbb ddddd\n", | ||||
12, | ||||
False, | ||||
True, | ||||
), | ||||
( | ||||
"aaaaa\nbbbbb\nccccc\nddddd\n", | ||||
10, | ||||
False, | ||||
True, | ||||
), | ||||
), | ||||
) | ||||
def test_columnize(expected, width, row_first, spread): | ||||
|
r4539 | """Basic columnize tests.""" | ||
size = 5 | ||||
|
r21616 | items = [l*size for l in 'abcd'] | ||
|
r28487 | with pytest.warns(PendingDeprecationWarning): | ||
out = text.columnize( | ||||
items, displaywidth=width, row_first=row_first, spread=spread | ||||
) | ||||
assert out == expected | ||||
|
r21621 | |||
|
r7387 | |||
def test_columnize_random(): | ||||
|
r24132 | """Test with random input to hopefully catch edge case """ | ||
|
r21616 | for row_first in [True, False]: | ||
for nitems in [random.randint(2,70) for i in range(2,20)]: | ||||
displaywidth = random.randint(20,200) | ||||
rand_len = [random.randint(2,displaywidth) for i in range(nitems)] | ||||
items = ['x'*l for l in rand_len] | ||||
|
r28487 | with pytest.warns(PendingDeprecationWarning): | ||
out = text.columnize( | ||||
items, row_first=row_first, displaywidth=displaywidth | ||||
) | ||||
longer_line = max([len(x) for x in out.split("\n")]) | ||||
|
r21616 | longer_element = max(rand_len) | ||
|
r27087 | assert longer_line <= displaywidth, ( | ||
f"Columnize displayed something lager than displaywidth : {longer_line}\n" | ||||
f"longer element : {longer_element}\n" | ||||
f"displaywidth : {displaywidth}\n" | ||||
f"number of element : {nitems}\n" | ||||
f"size of each element : {rand_len}\n" | ||||
f"row_first={row_first}\n" | ||||
) | ||||
|
r4539 | |||
|
r26715 | |||
|
r27423 | @pytest.mark.parametrize("row_first", [True, False]) | ||
|
r27420 | def test_columnize_medium(row_first): | ||
|
r21616 | """Test with inputs than shouldn't be wider than 80""" | ||
|
r7387 | size = 40 | ||
items = [l*size for l in 'abc'] | ||||
|
r28487 | with pytest.warns(PendingDeprecationWarning): | ||
out = text.columnize(items, row_first=row_first, displaywidth=80) | ||||
|
r27420 | assert out == "\n".join(items + [""]), "row_first={0}".format(row_first) | ||
|
r26715 | |||
|
r4539 | |||
|
r27423 | @pytest.mark.parametrize("row_first", [True, False]) | ||
|
r27420 | def test_columnize_long(row_first): | ||
|
r4539 | """Test columnize with inputs longer than the display window""" | ||
size = 11 | ||||
items = [l*size for l in 'abc'] | ||||
|
r28487 | with pytest.warns(PendingDeprecationWarning): | ||
out = text.columnize(items, row_first=row_first, displaywidth=size - 1) | ||||
|
r27420 | assert out == "\n".join(items + [""]), "row_first={0}".format(row_first) | ||
|
r26715 | |||
|
r4654 | |||
|
r5354 | def eval_formatter_check(f): | ||
|
r5355 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os, u=u"café", b="café") | ||
|
r4891 | s = f.format("{n} {n//4} {stuff.split()[0]}", **ns) | ||
|
r26715 | assert s == "12 3 hello" | ||
|
r27087 | s = f.format(" ".join(["{n//%i}" % i for i in range(1, 8)]), **ns) | ||
|
r26715 | assert s == "12 6 4 3 2 2 1" | ||
|
r27087 | s = f.format("{[n//i for i in range(1,8)]}", **ns) | ||
|
r26715 | assert s == "[12, 6, 4, 3, 2, 2, 1]" | ||
|
r4654 | s = f.format("{stuff!s}", **ns) | ||
|
r26715 | assert s == ns["stuff"] | ||
|
r4654 | s = f.format("{stuff!r}", **ns) | ||
|
r26715 | assert s == repr(ns["stuff"]) | ||
|
r5355 | # Check with unicode: | ||
s = f.format("{u}", **ns) | ||||
|
r26715 | assert s == ns["u"] | ||
|
r5355 | # This decodes in a platform dependent manner, but it shouldn't error out | ||
s = f.format("{b}", **ns) | ||||
|
r26927 | |||
pytest.raises(NameError, f.format, "{dne}", **ns) | ||||
|
r4654 | |||
|
r5354 | def eval_formatter_slicing_check(f): | ||
|
r4654 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os) | ||
s = f.format(" {stuff.split()[:]} ", **ns) | ||||
|
r26715 | assert s == " ['hello', 'there'] " | ||
|
r4654 | s = f.format(" {stuff.split()[::-1]} ", **ns) | ||
|
r26715 | assert s == " ['there', 'hello'] " | ||
|
r4654 | s = f.format("{stuff[::2]}", **ns) | ||
|
r26715 | assert s == ns["stuff"][::2] | ||
|
r26927 | pytest.raises(SyntaxError, f.format, "{n:x}", **ns) | ||
|
r4654 | |||
|
r5354 | def eval_formatter_no_slicing_check(f): | ||
|
r27087 | ns = dict(n=12, pi=math.pi, stuff="hello there", os=os) | ||
s = f.format("{n:x} {pi**2:+f}", **ns) | ||||
|
r26715 | assert s == "c +9.869604" | ||
s = f.format("{stuff[slice(1,4)]}", **ns) | ||||
assert s == "ell" | ||||
|
r24260 | |||
s = f.format("{a[:]}", a=[1, 2]) | ||||
|
r26715 | assert s == "[1, 2]" | ||
|
r4654 | |||
|
r5354 | def test_eval_formatter(): | ||
f = text.EvalFormatter() | ||||
eval_formatter_check(f) | ||||
eval_formatter_no_slicing_check(f) | ||||
def test_full_eval_formatter(): | ||||
f = text.FullEvalFormatter() | ||||
eval_formatter_check(f) | ||||
eval_formatter_slicing_check(f) | ||||
def test_dollar_formatter(): | ||||
f = text.DollarFormatter() | ||||
eval_formatter_check(f) | ||||
eval_formatter_slicing_check(f) | ||||
|
r21541 | |||
|
r5354 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os) | ||
s = f.format("$n", **ns) | ||||
|
r26715 | assert s == "12" | ||
|
r5354 | s = f.format("$n.real", **ns) | ||
|
r26715 | assert s == "12" | ||
|
r5354 | s = f.format("$n/{stuff[:5]}", **ns) | ||
|
r26715 | assert s == "12/hello" | ||
|
r5365 | s = f.format("$n $$HOME", **ns) | ||
|
r26715 | assert s == "12 $HOME" | ||
|
r5375 | s = f.format("${foo}", foo="HOME") | ||
|
r26715 | assert s == "$HOME" | ||
|
r7713 | |||
def test_strip_email(): | ||||
src = """\ | ||||
>> >>> def f(x): | ||||
>> ... return x+1 | ||||
|
r21541 | >> ... | ||
|
r7713 | >> >>> zz = f(2.5)""" | ||
cln = """\ | ||||
>>> def f(x): | ||||
... return x+1 | ||||
|
r21541 | ... | ||
|
r7713 | >>> zz = f(2.5)""" | ||
|
r26715 | assert text.strip_email_quotes(src) == cln | ||
|
r7715 | |||
def test_strip_email2(): | ||||
|
r27087 | src = "> > > list()" | ||
cln = "list()" | ||||
|
r26715 | assert text.strip_email_quotes(src) == cln | ||
|
r15516 | |||
|
r27087 | |||
|
r15516 | def test_LSString(): | ||
lss = text.LSString("abc\ndef") | ||||
|
r26715 | assert lss.l == ["abc", "def"] | ||
assert lss.s == "abc def" | ||||
|
r21547 | lss = text.LSString(os.getcwd()) | ||
|
r26927 | assert isinstance(lss.p[0], Path) | ||
|
r15516 | |||
|
r27087 | |||
|
r15516 | def test_SList(): | ||
|
r26715 | sl = text.SList(["a 11", "b 1", "a 2"]) | ||
assert sl.n == "a 11\nb 1\na 2" | ||||
assert sl.s == "a 11 b 1 a 2" | ||||
assert sl.grep(lambda x: x.startswith("a")) == text.SList(["a 11", "a 2"]) | ||||
assert sl.fields(0) == text.SList(["a", "b", "a"]) | ||||
assert sl.sort(field=1, nums=True) == text.SList(["b 1", "a 2", "a 11"]) | ||||