Path: blob/main/py-polars/tests/unit/testing/test_assert_series_equal.py
8410 views
from __future__ import annotations12import math3from datetime import datetime, time, timedelta4from decimal import Decimal as D5from typing import Any67import hypothesis.strategies as st8import pytest9from hypothesis import given1011import polars as pl12from polars.exceptions import InvalidOperationError13from polars.testing import assert_series_equal, assert_series_not_equal14from polars.testing.parametric import dtypes, series1516nan = float("nan")17pytest_plugins = ["pytester"]181920@given(s=series())21def test_assert_series_equal_parametric(s: pl.Series) -> None:22assert_series_equal(s, s)232425@given(data=st.data())26def test_assert_series_equal_parametric_array(data: st.DataObject) -> None:27inner = data.draw(dtypes(excluded_dtypes=[pl.Categorical]))28shape = data.draw(st.integers(min_value=1, max_value=3))29dtype = pl.Array(inner, shape=shape)30s = data.draw(series(dtype=dtype))3132assert_series_equal(s, s)333435def test_compare_series_value_mismatch() -> None:36srs1 = pl.Series([1, 2, 3])37srs2 = pl.Series([2, 3, 4])38assert_series_not_equal(srs1, srs2)3940with pytest.raises(41AssertionError,42match=r"Series are different \(exact value mismatch\)",43):44assert_series_equal(srs1, srs2)454647def test_compare_series_empty_equal() -> None:48srs1 = pl.Series([])49srs2 = pl.Series(())50assert_series_equal(srs1, srs2)5152with pytest.raises(53AssertionError,54match=r"Series are equal \(but are expected not to be\)",55):56assert_series_not_equal(srs1, srs2)575859def test_assert_series_equal_check_order() -> None:60srs1 = pl.Series([1, 2, 3, None])61srs2 = pl.Series([2, None, 3, 1])62assert_series_equal(srs1, srs2, check_order=False)6364with pytest.raises(65AssertionError,66match=r"Series are equal \(but are expected not to be\)",67):68assert_series_not_equal(srs1, srs2, check_order=False)697071def test_assert_series_equal_check_order_unsortable_type() -> None:72s1 = pl.Series([object(), object()])73s2 = pl.Series([object(), object()])74with pytest.raises(75InvalidOperationError,76match="`sort_with` operation not supported for dtype `object`",77):78assert_series_equal(s1, s2, check_order=False)798081def test_compare_series_nans_assert_equal() -> None:82srs1 = pl.Series([1.0, 2.0, nan, 4.0, None, 6.0])83srs2 = pl.Series([1.0, nan, 3.0, 4.0, None, 6.0])84srs3 = pl.Series([1.0, 2.0, 3.0, 4.0, None, 6.0])8586for srs in (srs1, srs2, srs3):87assert_series_equal(srs, srs)88assert_series_equal(srs, srs, check_exact=True)8990for check_exact in (False, True):91if check_exact:92check_msg = "exact value mismatch"93else:94check_msg = "Series are different.*value mismatch.*"9596with pytest.raises(AssertionError, match=check_msg):97assert_series_equal(srs1, srs2, check_exact=check_exact)98with pytest.raises(AssertionError, match=check_msg):99assert_series_equal(srs1, srs3, check_exact=check_exact)100101srs4 = pl.Series([1.0, 2.0, 3.0, 4.0, None, 6.0])102srs5 = pl.Series([1.0, 2.0, 3.0, 4.0, nan, 6.0])103srs6 = pl.Series([1, 2, 3, 4, None, 6])104105assert_series_equal(srs4, srs6, check_dtypes=False)106with pytest.raises(AssertionError):107assert_series_equal(srs5, srs6, check_dtypes=False)108assert_series_not_equal(srs5, srs6, check_dtypes=True)109110# nested111for float_type in (pl.Float32, pl.Float64):112srs = pl.Series([[0.0, nan]], dtype=pl.List(float_type))113assert srs.dtype == pl.List(float_type)114assert_series_equal(srs, srs)115116117def test_compare_series_nulls() -> None:118srs1 = pl.Series([1, 2, None])119srs2 = pl.Series([1, 2, None])120assert_series_equal(srs1, srs2)121122srs1 = pl.Series([1, 2, 3])123srs2 = pl.Series([1, None, None])124assert_series_not_equal(srs1, srs2)125126with pytest.raises(AssertionError, match="value mismatch"):127assert_series_equal(srs1, srs2)128129130def test_compare_series_value_mismatch_string() -> None:131srs1 = pl.Series(["hello", "no"])132srs2 = pl.Series(["hello", "yes"])133134assert_series_not_equal(srs1, srs2)135with pytest.raises(136AssertionError,137match=r"Series are different \(exact value mismatch\)",138):139assert_series_equal(srs1, srs2)140141142def test_compare_series_dtype_mismatch() -> None:143srs1 = pl.Series([1, 2, 3])144srs2 = pl.Series([1.0, 2.0, 3.0])145assert_series_not_equal(srs1, srs2)146147with pytest.raises(148AssertionError,149match=r"Series are different \(dtype mismatch\)",150):151assert_series_equal(srs1, srs2)152153154@pytest.mark.parametrize(155"assert_function", [assert_series_equal, assert_series_not_equal]156)157def test_compare_series_input_type_mismatch(assert_function: Any) -> None:158srs1 = pl.Series([1, 2, 3])159srs2 = pl.DataFrame({"col1": [2, 3, 4]})160161with pytest.raises(162AssertionError,163match=r"inputs are different \(unexpected input types\)",164):165assert_function(srs1, srs2)166167168def test_compare_series_name_mismatch() -> None:169srs1 = pl.Series(values=[1, 2, 3], name="srs1")170srs2 = pl.Series(values=[1, 2, 3], name="srs2")171with pytest.raises(172AssertionError,173match=r"Series are different \(name mismatch\)",174):175assert_series_equal(srs1, srs2)176177178def test_compare_series_length_mismatch() -> None:179srs1 = pl.Series(values=[1, 2, 3, 4], name="srs1")180srs2 = pl.Series(values=[1, 2, 3], name="srs2")181182assert_series_not_equal(srs1, srs2)183with pytest.raises(184AssertionError,185match=r"Series are different \(length mismatch\)",186):187assert_series_equal(srs1, srs2)188189190def test_compare_series_value_exact_mismatch() -> None:191srs1 = pl.Series([1.0, 2.0, 3.0])192srs2 = pl.Series([1.0, 2.0 + 1e-7, 3.0])193with pytest.raises(194AssertionError,195match=r"Series are different \(exact value mismatch\)",196):197assert_series_equal(srs1, srs2, check_exact=True)198199200def test_assert_series_equal_int_overflow() -> None:201# internally may call 'abs' if not check_exact, which can overflow on signed int202s0 = pl.Series([-128], dtype=pl.Int8)203s1 = pl.Series([0, -128], dtype=pl.Int8)204s2 = pl.Series([1, -128], dtype=pl.Int8)205206for check_exact in (True, False):207assert_series_equal(s0, s0, check_exact=check_exact)208with pytest.raises(AssertionError):209assert_series_equal(s1, s2, check_exact=check_exact)210211212@pytest.mark.parametrize(213("data1", "data2"),214[215([datetime(2022, 10, 2, 12)], [datetime(2022, 10, 2, 13)]),216([time(10, 0, 0)], [time(10, 0, 10)]),217([timedelta(10, 0, 0)], [timedelta(10, 0, 10)]),218],219)220def test_assert_series_equal_temporal(data1: Any, data2: Any) -> None:221s1 = pl.Series(data1)222s2 = pl.Series(data2)223assert_series_not_equal(s1, s2)224225226@pytest.mark.parametrize(227("s1", "s2", "kwargs"),228[229pytest.param(230pl.Series([0.2, 0.3]),231pl.Series([0.2, 0.3]),232{"abs_tol": 1e-15},233id="equal_floats_low_abs_tol",234),235pytest.param(236pl.Series([0.2, 0.3]),237pl.Series([0.2, 0.3000000000000001]),238{"abs_tol": 1e-15},239id="approx_equal_float_low_abs_tol",240),241pytest.param(242pl.Series([0.2, 0.3]),243pl.Series([0.2, 0.31]),244{"abs_tol": 0.1},245id="approx_equal_float_high_abs_tol",246),247pytest.param(248pl.Series([0.2, 1.3]),249pl.Series([0.2, 0.9]),250{"abs_tol": 1},251id="approx_equal_float_integer_abs_tol",252),253pytest.param(254pl.Series([1.0, 2.0, nan]),255pl.Series([1.005, 2.005, nan]),256{"abs_tol": 1e-2, "rel_tol": 0.0},257id="approx_equal_float_nan_abs_tol",258),259pytest.param(260pl.Series([1.0, 2.0, None]),261pl.Series([1.005, 2.005, None]),262{"abs_tol": 1e-2},263id="approx_equal_float_none_abs_tol",264),265pytest.param(266pl.Series([1.0, 2.0, nan]),267pl.Series([1.005, 2.015, nan]),268{"abs_tol": 0.0, "rel_tol": 1e-2},269id="approx_equal_float_nan_rel_tol",270),271pytest.param(272pl.Series([1.0, 2.0, None]),273pl.Series([1.005, 2.015, None]),274{"rel_tol": 1e-2},275id="approx_equal_float_none_rel_tol",276),277pytest.param(278pl.Series([0.0, 1.0, 2.0], dtype=pl.Float64),279pl.Series([0, 1, 2], dtype=pl.Int64),280{"check_dtypes": False},281id="equal_int_float_integer_no_check_dtype",282),283pytest.param(284pl.Series([0, 1, 2], dtype=pl.Float64),285pl.Series([0, 1, 2], dtype=pl.Float32),286{"check_dtypes": False},287id="equal_int_float_integer_no_check_dtype",288),289pytest.param(290pl.Series([0, 1, 2], dtype=pl.Int64),291pl.Series([0, 1, 2], dtype=pl.Int64),292{},293id="equal_int",294),295pytest.param(296pl.Series(["a", "b", "c"], dtype=pl.String),297pl.Series(["a", "b", "c"], dtype=pl.String),298{},299id="equal_str",300),301pytest.param(302pl.Series([[0.2, 0.3]]),303pl.Series([[0.2, 0.31]]),304{"abs_tol": 0.1},305id="list_of_float_high_abs_tol",306),307pytest.param(308pl.Series([[0.2, 1.3]]),309pl.Series([[0.2, 0.9]]),310{"abs_tol": 1},311id="list_of_float_integer_abs_tol",312),313pytest.param(314pl.Series([[0.2, 0.3]]),315pl.Series([[0.2, 0.300000001]]),316{"rel_tol": 1e-15},317id="list_of_float_low_rel_tol",318),319pytest.param(320pl.Series([[0.2, 0.3]]),321pl.Series([[0.2, 0.301]]),322{"rel_tol": 0.1},323id="list_of_float_high_rel_tol",324),325pytest.param(326pl.Series([[0.2, 1.3]]),327pl.Series([[0.2, 0.9]]),328{"rel_tol": 1},329id="list_of_float_integer_rel_tol",330),331pytest.param(332pl.Series([[None, 1.3]]),333pl.Series([[None, 0.9]]),334{"rel_tol": 1},335id="list_of_none_and_float_integer_rel_tol",336),337pytest.param(338pl.Series([[None, 1]], dtype=pl.List(pl.Int64)),339pl.Series([[None, 1]], dtype=pl.List(pl.Int64)),340{"rel_tol": 1},341id="list_of_none_and_int_integer_rel_tol",342),343pytest.param(344pl.Series([[math.nan, 1.3]]),345pl.Series([[math.nan, 0.9]]),346{"rel_tol": 1},347id="list_of_none_and_float_integer_rel_tol",348),349pytest.param(350pl.Series([[2.0, 3.0]]),351pl.Series([[2, 3]]),352{"check_exact": False, "check_dtypes": False},353id="list_of_float_list_of_int_check_dtype_false",354),355pytest.param(356pl.Series([[[0.2, 3.0]]]),357pl.Series([[[0.2, 3.00000001]]]),358{"abs_tol": 0.1},359id="nested_list_of_float_abs_tol_high",360),361pytest.param(362pl.Series([[[0.2, math.nan, 3.0]]]),363pl.Series([[[0.2, math.nan, 3.00000001]]]),364{"abs_tol": 0.1},365id="nested_list_of_float_and_nan_abs_tol_high",366),367pytest.param(368pl.Series([[[[0.2, 3.0]]]]),369pl.Series([[[[0.2, 3.00000001]]]]),370{"abs_tol": 0.1},371id="double_nested_list_of_float_abs_tol_high",372),373pytest.param(374pl.Series([[[[0.2, math.nan, 3.0]]]]),375pl.Series([[[[0.2, math.nan, 3.00000001]]]]),376{"abs_tol": 0.1},377id="double_nested_list_of_float__and_nan_abs_tol_high",378),379pytest.param(380pl.Series([[[[[0.2, 3.0]]]]]),381pl.Series([[[[[0.2, 3.00000001]]]]]),382{"abs_tol": 0.1},383id="triple_nested_list_of_float_abs_tol_high",384),385pytest.param(386pl.Series([[[[[0.2, math.nan, 3.0]]]]]),387pl.Series([[[[[0.2, math.nan, 3.00000001]]]]]),388{"abs_tol": 0.1},389id="triple_nested_list_of_float_and_nan_abs_tol_high",390),391pytest.param(392pl.struct(a=0, b=1, eager=True),393pl.struct(a=0, b=1, eager=True),394{},395id="struct_equal",396),397pytest.param(398pl.struct(a=0, b=1.1, eager=True),399pl.struct(a=0, b=1.01, eager=True),400{"abs_tol": 0.1, "rel_tol": 0},401id="struct_approx_equal",402),403pytest.param(404pl.struct(a=0, b=[0.0, 1.1], eager=True),405pl.struct(a=0, b=[0.0, 1.11], eager=True),406{"abs_tol": 0.1},407id="struct_with_list_approx_equal",408),409pytest.param(410pl.struct(a=0, b=[0.0, math.nan], eager=True),411pl.struct(a=0, b=[0.0, math.nan], eager=True),412{"abs_tol": 0.1},413id="struct_with_list_with_nan_compare_equal_true",414),415],416)417def test_assert_series_equal_passes_assertion(418s1: pl.Series,419s2: pl.Series,420kwargs: Any,421) -> None:422assert_series_equal(s1, s2, **kwargs)423with pytest.raises(AssertionError):424assert_series_not_equal(s1, s2, **kwargs)425426427@pytest.mark.parametrize(428("s1", "s2", "kwargs"),429[430pytest.param(431pl.Series([0.2, 0.3]),432pl.Series([0.2, 0.39]),433{"abs_tol": 0.09, "rel_tol": 0},434id="approx_equal_float_high_abs_tol_zero_rel_tol",435),436pytest.param(437pl.Series([0.2, 1.3]),438pl.Series([0.2, 2.31]),439{"abs_tol": 1, "rel_tol": 0},440id="approx_equal_float_integer_abs_tol_zero_rel_tol",441),442pytest.param(443pl.Series([0, 1, 2], dtype=pl.Float64),444pl.Series([0, 1, 2], dtype=pl.Int64),445{"check_dtypes": True},446id="equal_int_float_integer_check_dtype",447),448pytest.param(449pl.Series([0, 1, 2], dtype=pl.Float64),450pl.Series([0, 1, 2], dtype=pl.Float32),451{"check_dtypes": True},452id="equal_int_float_integer_check_dtype",453),454pytest.param(455pl.Series([1.0, 2.0, nan]),456pl.Series([1.005, 2.005, 3.005]),457{"abs_tol": 1e-2, "rel_tol": 0.0},458id="approx_equal_float_left_nan_abs_tol",459),460pytest.param(461pl.Series([1.0, 2.0, 3.0]),462pl.Series([1.005, 2.005, nan]),463{"abs_tol": 1e-2, "rel_tol": 0.0},464id="approx_equal_float_right_nan_abs_tol",465),466pytest.param(467pl.Series([1.0, 2.0, nan]),468pl.Series([1.005, 2.015, 3.025]),469{"abs_tol": 0.0, "rel_tol": 1e-2},470id="approx_equal_float_left_nan_rel_tol",471),472pytest.param(473pl.Series([1.0, 2.0, 3.0]),474pl.Series([1.005, 2.015, nan]),475{"abs_tol": 0.0, "rel_tol": 1e-2},476id="approx_equal_float_right_nan_rel_tol",477),478pytest.param(479pl.Series([[0.2, 0.3]]),480pl.Series([[0.2, 0.3, 0.4]]),481{},482id="list_of_float_different_lengths",483),484pytest.param(485pl.Series([[0.2, 0.3]]),486pl.Series([[0.2, 0.3000000000000001]]),487{"check_exact": True},488id="list_of_float_check_exact",489),490pytest.param(491pl.Series([[0.2, 0.3]]),492pl.Series([[0.2, 0.300001]]),493{"abs_tol": 1e-15, "rel_tol": 0},494id="list_of_float_too_low_abs_tol",495),496pytest.param(497pl.Series([[0.2, 0.3]]),498pl.Series([[0.2, 0.30000001]]),499{"abs_tol": -1, "rel_tol": 0},500id="list_of_float_negative_abs_tol",501),502pytest.param(503pl.Series([[2.0, 3.0]]),504pl.Series([[2, 3]]),505{"check_exact": False, "check_dtypes": True},506id="list_of_float_list_of_int_check_dtype_true",507),508pytest.param(509pl.struct(a=0, b=1.1, eager=True),510pl.struct(a=0, b=1, eager=True),511{"abs_tol": 0.1, "rel_tol": 0, "check_dtypes": True},512id="struct_approx_equal_different_type",513),514pytest.param(515pl.struct(a=0, b=1.09, eager=True),516pl.struct(a=0, b=1, eager=True),517{"abs_tol": 0.1, "rel_tol": 0, "check_dtypes": False},518id="struct_approx_equal_different_type",519),520],521)522def test_assert_series_equal_raises_assertion_error(523s1: pl.Series,524s2: pl.Series,525kwargs: Any,526) -> None:527with pytest.raises(AssertionError):528assert_series_equal(s1, s2, **kwargs)529assert_series_not_equal(s1, s2, **kwargs)530531532def test_assert_series_equal_categorical_vs_str() -> None:533s1 = pl.Series(["a", "b", "a"], dtype=pl.Categorical)534s2 = pl.Series(["a", "b", "a"], dtype=pl.String)535536with pytest.raises(AssertionError, match="dtype mismatch"):537assert_series_equal(s1, s2, categorical_as_str=True)538539assert_series_equal(s1, s2, check_dtypes=False, categorical_as_str=True)540assert_series_equal(s2, s1, check_dtypes=False, categorical_as_str=True)541542543def test_assert_series_equal_incompatible_data_types() -> None:544s1 = pl.Series(["a", "b", "a"], dtype=pl.Categorical)545s2 = pl.Series([0, 1, 0], dtype=pl.Int8)546547with pytest.raises(AssertionError, match="incompatible data types"):548assert_series_equal(s1, s2, check_dtypes=False)549550551def test_assert_series_equal_full_series() -> None:552s1 = pl.Series([1, 2, 3])553s2 = pl.Series([1, 2, 4])554with pytest.raises(555AssertionError, match=r"Series are different \(exact value mismatch\)"556):557assert_series_equal(s1, s2)558559560def test_assert_series_not_equal() -> None:561s = pl.Series("a", [1, 2])562with pytest.raises(563AssertionError,564match=r"Series are equal \(but are expected not to be\)",565):566assert_series_not_equal(s, s)567568569def test_assert_series_equal_nested_list_float() -> None:570# First entry has only integers571s1 = pl.Series([[1.0, 2.0], [3.0, 4.0]], dtype=pl.List(pl.Float64))572s2 = pl.Series([[1.0, 2.0], [3.0, 4.9]], dtype=pl.List(pl.Float64))573574with pytest.raises(575AssertionError,576match=r"Series are different \(nested value mismatch\)",577):578assert_series_equal(s1, s2)579580581def test_assert_series_equal_nested_struct_float() -> None:582s1 = pl.Series(583[{"a": 1.0, "b": 2.0}, {"a": 3.0, "b": 4.0}],584dtype=pl.Struct({"a": pl.Float64, "b": pl.Float64}),585)586s2 = pl.Series(587[{"a": 1.0, "b": 2.0}, {"a": 3.0, "b": 4.9}],588dtype=pl.Struct({"a": pl.Float64, "b": pl.Float64}),589)590591with pytest.raises(592AssertionError,593match=r"Series are different \(nested value mismatch\)",594):595assert_series_equal(s1, s2)596597598def test_assert_series_equal_all_null_different_dtypes_fails_with_check_dtypes_true() -> (599None600):601s1 = pl.Series([None, None], dtype=pl.Categorical)602s2 = pl.Series([None, None], dtype=pl.Int16)603604with pytest.raises(605AssertionError,606match="dtype mismatch",607):608assert_series_equal(s1, s2, check_dtypes=True)609610611def test_assert_series_equal_all_null_different_dtypes_passes_with_check_dtypes_false() -> (612None613):614s1 = pl.Series([None, None], dtype=pl.Categorical)615s2 = pl.Series([None, None], dtype=pl.Int16)616617assert_series_equal(s1, s2, check_dtypes=False)618619620def test_assert_series_equal_full_null_nested_list() -> None:621s = pl.Series([None, None], dtype=pl.List(pl.Float64))622assert_series_equal(s, s)623624625def test_assert_series_equal_nested_list_nan() -> None:626s = pl.Series([[1.0, 2.0], [3.0, nan]], dtype=pl.List(pl.Float64))627assert_series_equal(s, s)628629630def test_assert_series_equal_nested_list_none() -> None:631s1 = pl.Series([[1.0, 2.0], None], dtype=pl.List(pl.Float64))632s2 = pl.Series([[1.0, 2.0], None], dtype=pl.List(pl.Float64))633634assert_series_equal(s1, s2)635636637def test_assert_series_equal_uint_overflow() -> None:638s1 = pl.Series([1, 2, 3], dtype=pl.UInt8)639s2 = pl.Series([2, 3, 4], dtype=pl.UInt8)640641with pytest.raises(642AssertionError,643match=r"Series are different \(exact value mismatch\)",644):645assert_series_equal(s1, s2, abs_tol=0)646647with pytest.raises(648AssertionError,649match=r"Series are different \(exact value mismatch\)",650):651assert_series_equal(s1, s2, abs_tol=1)652653left = pl.Series(654values=[2810428175213635359],655dtype=pl.UInt64,656)657right = pl.Series(658values=[15807433754238349345],659dtype=pl.UInt64,660)661with pytest.raises(AssertionError):662assert_series_equal(left, right)663664665def test_assert_series_equal_uint_always_checked_exactly() -> None:666s1 = pl.Series([1, 3], dtype=pl.UInt8)667s2 = pl.Series([2, 4], dtype=pl.Int64)668669with pytest.raises(670AssertionError,671match=r"Series are different \(exact value mismatch\)",672):673assert_series_equal(s1, s2, abs_tol=1, check_dtypes=False)674675676def test_assert_series_equal_nested_int_always_checked_exactly() -> None:677s1 = pl.Series([[1, 2], [3, 4]])678s2 = pl.Series([[1, 2], [3, 5]])679680with pytest.raises(681AssertionError,682match=r"Series are different \(exact value mismatch\)",683):684assert_series_equal(s1, s2, abs_tol=1)685with pytest.raises(686AssertionError,687match=r"Series are different \(exact value mismatch\)",688):689assert_series_equal(s1, s2, check_exact=True)690691692@pytest.mark.parametrize("check_exact", [True, False])693def test_assert_series_equal_array_equal(check_exact: bool) -> None:694s1 = pl.Series([[1.0, 2.0], [3.0, 4.0]], dtype=pl.Array(pl.Float64, 2))695s2 = pl.Series([[1.0, 2.0], [3.0, 4.2]], dtype=pl.Array(pl.Float64, 2))696697with pytest.raises(698AssertionError, match=r"Series are different \(nested value mismatch\)"699):700assert_series_equal(s1, s2, check_exact=check_exact)701702703def test_series_equal_nested_lengths_mismatch() -> None:704s1 = pl.Series([[1.0, 2.0], [3.0, 4.0]], dtype=pl.List(pl.Float64))705s2 = pl.Series([[1.0, 2.0, 3.0], [4.0]], dtype=pl.List(pl.Float64))706707with pytest.raises(AssertionError, match="nested value mismatch"):708assert_series_equal(s1, s2)709710711@pytest.mark.parametrize("check_exact", [True, False])712def test_series_equal_decimals(check_exact: bool) -> None:713s1 = pl.Series([D("1.00000"), D("2.00000")], dtype=pl.Decimal)714s2 = pl.Series([D("1.00000"), D("2.00001")], dtype=pl.Decimal)715716assert_series_equal(s1, s1, check_exact=check_exact)717assert_series_equal(s2, s2, check_exact=check_exact)718719with pytest.raises(AssertionError, match="exact value mismatch"):720assert_series_equal(s1, s2, check_exact=check_exact)721722723def test_assert_series_equal_w_large_integers_12328() -> None:724left = pl.Series([1577840521123000])725right = pl.Series([1577840521123543])726with pytest.raises(AssertionError):727assert_series_equal(left, right)728729730def test_assert_series_equal_check_dtype_deprecated() -> None:731s1 = pl.Series("a", [1, 2])732s2 = pl.Series("a", [1.0, 2.0])733s3 = pl.Series("a", [2, 1])734735with pytest.deprecated_call():736assert_series_equal(s1, s2, check_dtype=False) # type: ignore[call-arg]737738with pytest.deprecated_call():739assert_series_not_equal(s1, s3, check_dtype=False) # type: ignore[call-arg]740741742def test_assert_series_equal_nested_categorical_as_str_independently_constructed() -> (743None744):745# https://github.com/pola-rs/polars/issues/16196746s1 = pl.Series(["c0"], dtype=pl.Categorical)747s2 = pl.Series(["c1"], dtype=pl.Categorical)748a = pl.DataFrame([s1, s2]).to_struct("col0")749750s1 = pl.Series(["c0"], dtype=pl.Categorical)751s2 = pl.Series(["c1"], dtype=pl.Categorical)752b = pl.DataFrame([s1, s2]).to_struct("col0")753754assert_series_equal(a, b, categorical_as_str=True)755assert_series_equal(a, b, categorical_as_str=False)756757758@pytest.mark.parametrize(759"s",760[761pl.Series([["a", "b"], ["a"]], dtype=pl.List(pl.Categorical)),762pl.Series([{"a": "x"}, {"a": "y"}], dtype=pl.Struct({"a": pl.Categorical})),763],764)765def test_assert_series_equal_nested_categorical_as_str(s: pl.Series) -> None:766assert_series_equal(s, s, categorical_as_str=True)767768769def test_tracebackhide(testdir: pytest.Testdir) -> None:770testdir.makefile(771".py",772test_path="""\773import polars as pl774from polars.testing import assert_series_equal, assert_series_not_equal775776nan = float("nan")777778def test_series_equal_fail():779s1 = pl.Series([1, 2])780s2 = pl.Series([1, 3])781assert_series_equal(s1, s2)782783def test_series_not_equal_fail():784s1 = pl.Series([1, 2])785s2 = pl.Series([1, 2])786assert_series_not_equal(s1, s2)787788def test_series_nested_fail():789s1 = pl.Series([[1, 2], [3, 4]])790s2 = pl.Series([[1, 2], [3, 5]])791assert_series_equal(s1, s2)792793def test_series_null_fail():794s1 = pl.Series([1, 2])795s2 = pl.Series([1, None])796assert_series_equal(s1, s2)797798def test_series_nan_fail():799s1 = pl.Series([1.0, 2.0])800s2 = pl.Series([1.0, nan])801assert_series_equal(s1, s2)802803def test_series_float_tolerance_fail():804s1 = pl.Series([1.0, 2.0])805s2 = pl.Series([1.0, 2.1])806assert_series_equal(s1, s2)807808def test_series_schema_fail():809s1 = pl.Series([1, 2], dtype=pl.Int64)810s2 = pl.Series([1, 2], dtype=pl.Int32)811assert_series_equal(s1, s2)812813def test_series_data_type_fail():814s1 = pl.Series([1, 2])815s2 = [1, 2]816assert_series_equal(s1, s2)817""",818)819result = testdir.runpytest()820result.assert_outcomes(passed=0, failed=8)821stdout = "\n".join(result.outlines)822823assert "polars/py-polars/polars/testing" not in stdout824825# The above should catch any polars testing functions that appear in the826# stack trace. But we keep the following checks (for specific function827# names) just to double-check.828829assert "def assert_series_equal" not in stdout830assert "def assert_series_not_equal" not in stdout831832# Make sure the tests are failing for the expected reason (e.g. not because833# an import is missing or something like that):834835assert "AssertionError: Series are different (exact value mismatch)" in stdout836assert "AssertionError: Series are equal" in stdout837assert "AssertionError: Series are different (nan value mismatch)" in stdout838assert "AssertionError: Series are different (dtype mismatch)" in stdout839assert "AssertionError: inputs are different (unexpected input types)" in stdout840841842def test_assert_series_equal_inf() -> None:843s1 = pl.Series([1.0, float("inf")])844s2 = pl.Series([1.0, float("inf")])845assert_series_equal(s1, s2)846847s1 = pl.Series([1.0, float("-inf")])848s2 = pl.Series([1.0, float("-inf")])849assert_series_equal(s1, s2)850851s1 = pl.Series([1.0, float("inf")])852s2 = pl.Series([float("inf"), 1.0])853assert_series_not_equal(s1, s2)854855s1 = pl.Series([1.0, float("inf")])856s2 = pl.Series([1.0, float("-inf")])857assert_series_not_equal(s1, s2)858859s1 = pl.Series([1.0, float("inf")])860s2 = pl.Series([1.0, 2.0])861assert_series_not_equal(s1, s2)862863s1 = pl.Series([1.0, float("inf")])864s2 = pl.Series([1.0, float("nan")])865assert_series_not_equal(s1, s2)866867868