From 708972a6bc8d24e6878cd476d8347450fc7f3820 Mon Sep 17 00:00:00 2001 From: Eric Jolibois Date: Sat, 5 Oct 2024 12:18:34 +0200 Subject: [PATCH] test: add symbols errors --- python/tests/fixtures/symbols-errors.xlsx | Bin 0 -> 4862 bytes python/tests/test_fastexcel.py | 43 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 python/tests/fixtures/symbols-errors.xlsx diff --git a/python/tests/fixtures/symbols-errors.xlsx b/python/tests/fixtures/symbols-errors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..44ee447b31d2e1cd57757e6215538d177535cffc GIT binary patch literal 4862 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 None: def test_null_column_is_nullable() -> None: sheet = fastexcel.read_excel(path_for_fixture("null-column.xlsx")).load_sheet(0) assert sheet.to_arrow().schema.field("nullonly").nullable is True + + +def test_symbols_errors() -> None: + reader = fastexcel.read_excel(path_for_fixture("symbols-errors.xlsx")) + + # Reading the sheet with only the first row as the schema forces columns + # to be numbers and discards errors like #DIV/0! and #VALUE! + pl_assert_frame_equal( + reader.load_sheet(0, schema_sample_rows=1).to_polars(), + pl.DataFrame( + { + "a": [1.1, 2.2, None], + "b": [2.0, 0.0, 1.0], + "a/b": [0.55, None, None], + } + ), + ) + + # Reading the sheet with all the rows as the schema forces columns + # to be strings and keeps the errors like #DIV/0! and #VALUE! + pl_assert_frame_equal( + reader.load_sheet(0, schema_sample_rows=3).to_polars(), + pl.DataFrame( + { + "a": ["1.1", "2.2", "abc"], + "b": [2.0, 0.0, 1.0], + "a/b": ["0.55", "#DIV/0!", "#VALUE!"], + } + ), + ) + + # Reading the sheet with only the first row as the schema forces columns + # But casting it to strings will keep the errors like #DIV/0! and #VALUE! + pl_assert_frame_equal( + reader.load_sheet(0, schema_sample_rows=1, dtypes={"a/b": "string"}).to_polars(), + pl.DataFrame( + { + "a": [1.1, 2.2, None], + "b": [2.0, 0.0, 1.0], + "a/b": ["0.55", "#DIV/0!", "#VALUE!"], + } + ), + )