summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSeth Morton <seth.m.morton@gmail.com>2023-02-26 23:21:37 -0800
committerSeth Morton <seth.m.morton@gmail.com>2023-02-26 23:47:50 -0800
commitcf2a55daf7e74d177c95149da623172b1b6d93ae (patch)
tree6db55e4ddf210e4c7fe4824079ecc16bcd8abc62 /tests
parente778c1742fc94766b42110580809795605ca3c88 (diff)
downloadnatsort-cf2a55daf7e74d177c95149da623172b1b6d93ae.tar.gz
Ensure None, NaN, and Infinity are sorted consistently
Internally, these may be translated to the same value, so they will be output in the same order they were input, which could lead to suprise. This commit ensures the order is always consistent.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_natsorted.py29
-rw-r--r--tests/test_parse_number_function.py20
2 files changed, 35 insertions, 14 deletions
diff --git a/tests/test_natsorted.py b/tests/test_natsorted.py
index eccb9d2..3d6375c 100644
--- a/tests/test_natsorted.py
+++ b/tests/test_natsorted.py
@@ -4,6 +4,7 @@ Here are a collection of examples of how this module can be used.
See the README or the natsort homepage for more details.
"""
+import math
from operator import itemgetter
from pathlib import PurePosixPath
from typing import List, Tuple, Union
@@ -110,19 +111,29 @@ def test_natsorted_handles_mixed_types(
@pytest.mark.parametrize(
- "alg, expected, slc",
+ "alg, expected",
[
- (ns.DEFAULT, [float("nan"), 5, "25", 1e40], slice(1, None)),
- (ns.NANLAST, [5, "25", 1e40, float("nan")], slice(None, 3)),
+ (ns.DEFAULT, [None, float("nan"), float("-inf"), 5, "25", 1e40, float("inf")]),
+ (ns.NANLAST, [float("-inf"), 5, "25", 1e40, None, float("nan"), float("inf")]),
],
)
-def test_natsorted_handles_nan(
- alg: NSType, expected: List[Union[str, float, int]], slc: slice
+def test_natsorted_consistent_ordering_with_nan_and_friends(
+ alg: NSType, expected: List[Union[str, float, None, int]]
) -> None:
- given: List[Union[str, float, int]] = ["25", 5, float("nan"), 1e40]
- # The slice is because NaN != NaN
- # noinspection PyUnresolvedReferences
- assert natsorted(given, alg=alg)[slc] == expected[slc]
+ sentinel = math.pi
+ expected = [sentinel if x != x else x for x in expected]
+ given: List[Union[str, float, None, int]] = [
+ float("inf"),
+ float("-inf"),
+ "25",
+ 5,
+ float("nan"),
+ 1e40,
+ None,
+ ]
+ result = natsorted(given, alg=alg)
+ result = [sentinel if x != x else x for x in result]
+ assert result == expected
def test_natsorted_with_mixed_bytes_and_str_input_raises_type_error() -> None:
diff --git a/tests/test_parse_number_function.py b/tests/test_parse_number_function.py
index 85d6b96..5ac5700 100644
--- a/tests/test_parse_number_function.py
+++ b/tests/test_parse_number_function.py
@@ -20,7 +20,7 @@ from natsort.utils import NumTransformer, parse_number_or_none_factory
(ns.PATH | ns.UNGROUPLETTERS | ns.LOCALE, lambda x: ((("xx",), ("", x)),)),
],
)
-@given(x=floats(allow_nan=False) | integers())
+@given(x=floats(allow_nan=False, allow_infinity=False) | integers())
def test_parse_number_factory_makes_function_that_returns_tuple(
x: Union[float, int], alg: NSType, example_func: NumTransformer
) -> None:
@@ -32,10 +32,20 @@ def test_parse_number_factory_makes_function_that_returns_tuple(
"alg, x, result",
[
(ns.DEFAULT, 57, ("", 57)),
- (ns.DEFAULT, float("nan"), ("", float("-inf"))), # NaN transformed to -infinity
- (ns.NANLAST, float("nan"), ("", float("+inf"))), # NANLAST makes it +infinity
- (ns.DEFAULT, None, ("", float("-inf"))), # None transformed to -infinity
- (ns.NANLAST, None, ("", float("+inf"))), # NANLAST makes it +infinity
+ (
+ ns.DEFAULT,
+ float("nan"),
+ ("", float("-inf"), "2"),
+ ), # NaN transformed to -infinity
+ (
+ ns.NANLAST,
+ float("nan"),
+ ("", float("+inf"), "2"),
+ ), # NANLAST makes it +infinity
+ (ns.DEFAULT, None, ("", float("-inf"), "1")), # None transformed to -infinity
+ (ns.NANLAST, None, ("", float("+inf"), "1")), # NANLAST makes it +infinity
+ (ns.DEFAULT, float("-inf"), ("", float("-inf"), "3")),
+ (ns.NANLAST, float("+inf"), ("", float("+inf"), "3")),
],
)
def test_parse_number_factory_treats_nan_and_none_special(