Path: blob/main/py-polars/tests/unit/series/test_all_any.py
8446 views
from __future__ import annotations12import operator3from typing import Any45import pytest67import polars as pl8from polars.exceptions import SchemaError91011@pytest.mark.parametrize(12("data", "expected"),13[14([], False),15([None], False),16([False], False),17([False, None], False),18([True], True),19([True, None], True),20([None] * 199 + [True], True),21([None] * 200, False),22([None] * 200 + [False] * 200, False),23],24)25def test_any(data: list[bool | None], expected: bool) -> None:26assert pl.Series(data, dtype=pl.Boolean).any() is expected272829@pytest.mark.parametrize(30("data", "expected"),31[32([], False),33([None], None),34([False], False),35([False, None], None),36([True], True),37([True, None], True),38],39)40def test_any_kleene(data: list[bool | None], expected: bool | None) -> None:41assert pl.Series(data, dtype=pl.Boolean).any(ignore_nulls=False) is expected424344def test_any_wrong_dtype() -> None:45with pytest.raises(SchemaError, match="expected `Boolean`"):46pl.Series([0, 1, 0]).any()474849@pytest.mark.parametrize(50("data", "expected"),51[52([], True),53([None], True),54([False], False),55([False, None], False),56([True], True),57([True, None], True),58([None] * 200 + [True] * 199 + [False], False),59([True] * 200 + [None] * 200 + [True] * 200, True),60],61)62def test_all(data: list[bool | None], expected: bool) -> None:63assert pl.Series(data, dtype=pl.Boolean).all() is expected646566@pytest.mark.parametrize(67("data", "expected"),68[69([], True),70([None], None),71([False], False),72([False, None], False),73([True], True),74([True, None], None),75],76)77def test_all_kleene(data: list[bool | None], expected: bool | None) -> None:78assert pl.Series(data, dtype=pl.Boolean).all(ignore_nulls=False) is expected798081def test_all_wrong_dtype() -> None:82with pytest.raises(SchemaError, match="expected `Boolean`"):83pl.Series([0, 1, 0]).all()848586F = False87U = None88T = True899091@pytest.mark.parametrize(92("op_impl", "truth_table"),93[94# https://en.wikipedia.org/wiki/Three-valued_logic#Kleene_and_Priest_logics95(96operator.and_,97{ # [F, U, T]98F: [F, F, F],99U: [F, U, U],100T: [F, U, T],101},102),103(104operator.or_,105{ # [F, U, T]106F: [F, U, T],107U: [U, U, T],108T: [T, T, T],109},110),111(112operator.xor,113{ # [F, U, T]114F: [F, U, T],115U: [U, U, U],116T: [T, U, F],117},118),119],120)121@pytest.mark.parametrize("swap_args", [True, False])122def test_binary_bitwise_kleene_24809(123op_impl: Any,124swap_args: bool,125truth_table: dict[bool, list[bool]],126) -> None:127def op(lhs: Any, rhs: Any) -> Any:128return op_impl(rhs, lhs) if swap_args else op_impl(lhs, rhs)129130rhs = pl.Series([F, U, T], dtype=pl.Boolean)131132class _:133def f(scalar: bool | None) -> Any: # type: ignore[misc]134lhs = pl.lit(scalar, dtype=pl.Boolean)135return pl.select(op(lhs, rhs)).to_series().to_list()136137assert {138F: f(F),139U: f(U),140T: f(T),141} == truth_table142143class _: # type: ignore[no-redef]144def f(scalar: bool | None) -> Any: # type: ignore[misc]145lhs = pl.Series([scalar], dtype=pl.Boolean)146return pl.select(op(lhs, rhs)).to_series().to_list()147148assert {149F: f(F),150U: f(U),151T: f(T),152} == truth_table153154class _: # type: ignore[no-redef]155def f(scalar: bool | None) -> Any: # type: ignore[misc]156lhs = pl.Series([scalar, scalar, scalar], dtype=pl.Boolean)157return op(lhs, rhs).to_list()158159assert {160F: f(F),161U: f(U),162T: f(T),163} == truth_table164165class _: # type: ignore[no-redef]166def f(scalar: bool | None) -> Any: # type: ignore[misc]167lhs = pl.lit(pl.Series([scalar]))168return pl.select(op(lhs, rhs)).to_series().to_list()169170assert {171F: f(F),172U: f(U),173T: f(T),174} == truth_table175176class _: # type: ignore[no-redef]177def f(scalar: bool | None) -> Any: # type: ignore[misc]178lhs = pl.lit(pl.Series([scalar, scalar, scalar]))179return pl.select(op(lhs, rhs)).to_series().to_list()180181assert {182F: f(F),183U: f(U),184T: f(T),185} == truth_table186187188