From 796d341bb355e5f8ca0fb0c5b1d80e6dde186da2 Mon Sep 17 00:00:00 2001 From: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:26:54 -0700 Subject: [PATCH 1/3] Competitor snapshot 2026-10-03: WolfXL 2.0.8, Excelize 2.11.0 Rerun the fidelity, template-mutation, calc and cross-language lanes with the 2026-10-02 fixtures, scoring and adapters on 2026-10-03 UTC. - WolfXL 2.0.8 from PyPI; competitors at their latest stable releases (python-calamine 0.8.2, pandas 3.0.6, polars 1.44.2, pyexcel 0.7.6, tablib 3.10.0 bumped; others unchanged). - Excelize helper moved to v2.11.0 (Chart.Title is now a ChartTitle struct); image excelbench-excelize-oracle:2.11.0. - README "Results at a Glance" and public-reporting status cite the new snapshot; 2026-10-02 artifacts are kept unchanged. --- README.md | 55 +- docs/public-reporting.md | 7 +- results-2026-10-03/README.md | 56 + results-2026-10-03/calc/README.md | 37 + .../aspose_cells_foss/financial_model.xlsx | Bin 0 -> 9655 bytes .../calc/libreoffice/financial_model.xlsx | Bin 0 -> 13135 bytes results-2026-10-03/calc/results.json | 157 + .../wolfxl-commercial/financial_model.xlsx | Bin 0 -> 10609 bytes .../calc/wolfxl/financial_model.xlsx | Bin 0 -> 9159 bytes .../calc/zavora/financial_model.xlsx | Bin 0 -> 9022 bytes results-2026-10-03/cross-language/CONTEXT.md | 22 + .../cross-language/FIDELITY_DELTAS.md | 3 + results-2026-10-03/cross-language/README.md | 606 + .../cross-language/WHY_FAILED.md | 517 + .../cross-language/history.jsonl | 1 + results-2026-10-03/cross-language/matrix.csv | 67 + .../cross-language/results.json | 10415 ++ results-2026-10-03/mutation/README.md | 32 + .../aspose-cells-foss/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../aspose-cells-foss/repeat-1-output.xlsx | Bin 0 -> 14820 bytes .../aspose-cells-foss/repeat-2-input.xlsx | Bin 0 -> 15030 bytes .../aspose-cells-foss/repeat-2-output.xlsx | Bin 0 -> 14820 bytes .../aspose-cells-foss/repeat-3-input.xlsx | Bin 0 -> 15030 bytes .../aspose-cells-foss/repeat-3-output.xlsx | Bin 0 -> 14820 bytes .../mutation/exceljs/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../mutation/libreoffice/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../mutation/libreoffice/repeat-1-output.xlsx | Bin 0 -> 26195 bytes .../mutation/libreoffice/repeat-2-input.xlsx | Bin 0 -> 15030 bytes .../mutation/libreoffice/repeat-2-output.xlsx | Bin 0 -> 26192 bytes .../mutation/libreoffice/repeat-3-input.xlsx | Bin 0 -> 15030 bytes .../mutation/libreoffice/repeat-3-output.xlsx | Bin 0 -> 26195 bytes .../mutation/openpyxl/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../mutation/openpyxl/repeat-1-output.xlsx | Bin 0 -> 14099 bytes .../mutation/openpyxl/repeat-2-input.xlsx | Bin 0 -> 15030 bytes .../mutation/openpyxl/repeat-2-output.xlsx | Bin 0 -> 14096 bytes .../mutation/openpyxl/repeat-3-input.xlsx | Bin 0 -> 15030 bytes .../mutation/openpyxl/repeat-3-output.xlsx | Bin 0 -> 14098 bytes results-2026-10-03/mutation/results.json | 1318 + .../mutation/sheetjs/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../mutation/sheetjs/repeat-1-output.xlsx | Bin 0 -> 20010 bytes .../mutation/sheetjs/repeat-2-input.xlsx | Bin 0 -> 15030 bytes .../mutation/sheetjs/repeat-2-output.xlsx | Bin 0 -> 20010 bytes .../mutation/sheetjs/repeat-3-input.xlsx | Bin 0 -> 15030 bytes .../mutation/sheetjs/repeat-3-output.xlsx | Bin 0 -> 20010 bytes .../mutation/wolfxl/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../mutation/wolfxl/repeat-1-output.xlsx | Bin 0 -> 16101 bytes .../mutation/wolfxl/repeat-2-input.xlsx | Bin 0 -> 15030 bytes .../mutation/wolfxl/repeat-2-output.xlsx | Bin 0 -> 16101 bytes .../mutation/wolfxl/repeat-3-input.xlsx | Bin 0 -> 15030 bytes .../mutation/wolfxl/repeat-3-output.xlsx | Bin 0 -> 16101 bytes .../mutation/zavora-xlsx/repeat-1-input.xlsx | Bin 0 -> 15030 bytes .../mutation/zavora-xlsx/repeat-1-output.xlsx | Bin 0 -> 14211 bytes .../mutation/zavora-xlsx/repeat-2-input.xlsx | Bin 0 -> 15030 bytes .../mutation/zavora-xlsx/repeat-2-output.xlsx | Bin 0 -> 14211 bytes .../mutation/zavora-xlsx/repeat-3-input.xlsx | Bin 0 -> 15030 bytes .../mutation/zavora-xlsx/repeat-3-output.xlsx | Bin 0 -> 14211 bytes results-2026-10-03/pins.txt | 14 + results-2026-10-03/pip-freeze.txt | 51 + results-2026-10-03/run-log.txt | 11 + results-2026-10-03/run.sh | 51 + results-2026-10-03/xlsx/FIDELITY_DELTAS.md | 3 + results-2026-10-03/xlsx/README.md | 4669 + results-2026-10-03/xlsx/WHY_FAILED.md | 9823 ++ results-2026-10-03/xlsx/heatmap.png | Bin 0 -> 308022 bytes results-2026-10-03/xlsx/heatmap.svg | 4702 + results-2026-10-03/xlsx/history.jsonl | 1 + results-2026-10-03/xlsx/matrix.csv | 375 + results-2026-10-03/xlsx/results.json | 101215 +++++++++++++++ src/excelbench/harness/external_oracles.py | 2 +- tools/external-oracles/excelize/Dockerfile | 6 +- tools/external-oracles/excelize/go.mod | 12 +- tools/external-oracles/excelize/go.sum | 24 +- tools/external-oracles/excelize/main.go | 2 +- tools/external-oracles/remote/README.md | 6 +- 74 files changed, 134209 insertions(+), 51 deletions(-) create mode 100644 results-2026-10-03/README.md create mode 100644 results-2026-10-03/calc/README.md create mode 100644 results-2026-10-03/calc/aspose_cells_foss/financial_model.xlsx create mode 100644 results-2026-10-03/calc/libreoffice/financial_model.xlsx create mode 100644 results-2026-10-03/calc/results.json create mode 100644 results-2026-10-03/calc/wolfxl-commercial/financial_model.xlsx create mode 100644 results-2026-10-03/calc/wolfxl/financial_model.xlsx create mode 100644 results-2026-10-03/calc/zavora/financial_model.xlsx create mode 100644 results-2026-10-03/cross-language/CONTEXT.md create mode 100644 results-2026-10-03/cross-language/FIDELITY_DELTAS.md create mode 100644 results-2026-10-03/cross-language/README.md create mode 100644 results-2026-10-03/cross-language/WHY_FAILED.md create mode 100644 results-2026-10-03/cross-language/history.jsonl create mode 100644 results-2026-10-03/cross-language/matrix.csv create mode 100644 results-2026-10-03/cross-language/results.json create mode 100644 results-2026-10-03/mutation/README.md create mode 100644 results-2026-10-03/mutation/aspose-cells-foss/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/aspose-cells-foss/repeat-1-output.xlsx create mode 100644 results-2026-10-03/mutation/aspose-cells-foss/repeat-2-input.xlsx create mode 100644 results-2026-10-03/mutation/aspose-cells-foss/repeat-2-output.xlsx create mode 100644 results-2026-10-03/mutation/aspose-cells-foss/repeat-3-input.xlsx create mode 100644 results-2026-10-03/mutation/aspose-cells-foss/repeat-3-output.xlsx create mode 100644 results-2026-10-03/mutation/exceljs/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/libreoffice/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/libreoffice/repeat-1-output.xlsx create mode 100644 results-2026-10-03/mutation/libreoffice/repeat-2-input.xlsx create mode 100644 results-2026-10-03/mutation/libreoffice/repeat-2-output.xlsx create mode 100644 results-2026-10-03/mutation/libreoffice/repeat-3-input.xlsx create mode 100644 results-2026-10-03/mutation/libreoffice/repeat-3-output.xlsx create mode 100644 results-2026-10-03/mutation/openpyxl/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/openpyxl/repeat-1-output.xlsx create mode 100644 results-2026-10-03/mutation/openpyxl/repeat-2-input.xlsx create mode 100644 results-2026-10-03/mutation/openpyxl/repeat-2-output.xlsx create mode 100644 results-2026-10-03/mutation/openpyxl/repeat-3-input.xlsx create mode 100644 results-2026-10-03/mutation/openpyxl/repeat-3-output.xlsx create mode 100644 results-2026-10-03/mutation/results.json create mode 100644 results-2026-10-03/mutation/sheetjs/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/sheetjs/repeat-1-output.xlsx create mode 100644 results-2026-10-03/mutation/sheetjs/repeat-2-input.xlsx create mode 100644 results-2026-10-03/mutation/sheetjs/repeat-2-output.xlsx create mode 100644 results-2026-10-03/mutation/sheetjs/repeat-3-input.xlsx create mode 100644 results-2026-10-03/mutation/sheetjs/repeat-3-output.xlsx create mode 100644 results-2026-10-03/mutation/wolfxl/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/wolfxl/repeat-1-output.xlsx create mode 100644 results-2026-10-03/mutation/wolfxl/repeat-2-input.xlsx create mode 100644 results-2026-10-03/mutation/wolfxl/repeat-2-output.xlsx create mode 100644 results-2026-10-03/mutation/wolfxl/repeat-3-input.xlsx create mode 100644 results-2026-10-03/mutation/wolfxl/repeat-3-output.xlsx create mode 100644 results-2026-10-03/mutation/zavora-xlsx/repeat-1-input.xlsx create mode 100644 results-2026-10-03/mutation/zavora-xlsx/repeat-1-output.xlsx create mode 100644 results-2026-10-03/mutation/zavora-xlsx/repeat-2-input.xlsx create mode 100644 results-2026-10-03/mutation/zavora-xlsx/repeat-2-output.xlsx create mode 100644 results-2026-10-03/mutation/zavora-xlsx/repeat-3-input.xlsx create mode 100644 results-2026-10-03/mutation/zavora-xlsx/repeat-3-output.xlsx create mode 100644 results-2026-10-03/pins.txt create mode 100644 results-2026-10-03/pip-freeze.txt create mode 100644 results-2026-10-03/run-log.txt create mode 100755 results-2026-10-03/run.sh create mode 100644 results-2026-10-03/xlsx/FIDELITY_DELTAS.md create mode 100644 results-2026-10-03/xlsx/README.md create mode 100644 results-2026-10-03/xlsx/WHY_FAILED.md create mode 100644 results-2026-10-03/xlsx/heatmap.png create mode 100644 results-2026-10-03/xlsx/heatmap.svg create mode 100644 results-2026-10-03/xlsx/history.jsonl create mode 100644 results-2026-10-03/xlsx/matrix.csv create mode 100644 results-2026-10-03/xlsx/results.json diff --git a/README.md b/README.md index 617762c..69071b9 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,13 @@ cross-language context lane (Apache POI, Excelize, zavora-xlsx). Tier 4 ## Results at a Glance -> Competitor snapshot: 2026-10-02 | WolfXL 2.0.5 (latest PyPI) | 17 fidelity adapters incl. SheetJS CE 0.20.3, ExcelJS 4.4.0, LibreOffice 26.8.0.3 | [Snapshot README](results-2026-10-02/README.md) | [Fidelity](results-2026-10-02/xlsx/README.md) | [Mutation](results-2026-10-02/mutation/README.md) | [Calc](results-2026-10-02/calc/README.md) | [Cross-language](results-2026-10-02/cross-language/README.md) +> Competitor snapshot: 2026-10-03 | WolfXL 2.0.8 (latest PyPI) | 17 fidelity adapters incl. SheetJS CE 0.20.3, ExcelJS 4.4.0, LibreOffice 26.8.0.3 | [Snapshot README](results-2026-10-03/README.md) | [Fidelity](results-2026-10-03/xlsx/README.md) | [Mutation](results-2026-10-03/mutation/README.md) | [Calc](results-2026-10-03/calc/README.md) | [Cross-language](results-2026-10-03/cross-language/README.md) > > Green features in that snapshot (read / write, out of 21¹): openpyxl -> 21/21 / 21/21, WolfXL 19/21 / 18/21, ExcelJS 12/21 / 15/21, -> aspose-cells-foss 11/21 / 14/21, LibreOffice 12/21 / 12/21, SheetJS CE -> 9/21 / 8/21; write-only xlsxwriter 15/21. +> 21/21 / 21/21 and WolfXL 21/21 / 21/21 (both pass all 133 tests in each +> mode), ExcelJS 12/21 / 15/21, aspose-cells-foss 11/21 / 14/21, +> LibreOffice 12/21 / 12/21, SheetJS CE 9/21 / 8/21; write-only +> xlsxwriter 15/21. > > Mutation suite (two-cell edit on a corporate template, content-model > preservation; features kept / features in the template): WolfXL @@ -26,21 +27,25 @@ cross-language context lane (Apache POI, Excelize, zavora-xlsx). Tier 4 > (cell styles, page setup); aspose-cells-foss 15/17 (drops 87 string > cells, custom XML); SheetJS 8/17 and zavora-xlsx 8/17 (charts, tables, > styles and more); ExcelJS fails to load the template. Every engine that -> ran applied both edits. Wall times in that run are not comparable (host -> under heavy unrelated load). +> ran applied both edits. > > Calc tier (133-formula financial DAG, cache-free fixture, LibreOffice -> oracle): LibreOffice 133/133, aspose-cells-foss 25/133, WolfXL 0/133, -> zavora 0/133. SheetJS CE, ExcelJS, and the other non-calculating -> adapters are not applicable. +> oracle): LibreOffice 26.8.0.3, WolfXL Community 2.0.8 and WolfXL +> Commercial 2.3.0 133/133; aspose-cells-foss 25/133; zavora 0/133. +> Community's `save()` writes no calculated values (0/133 saved), while +> Commercial saves all 133. SheetJS CE, ExcelJS, and the other +> non-calculating adapters are not applicable. > > Cross-language context (write lane): Apache POI 5.5.1 18/21, Excelize -> 2.10.1 18/21, zavora-xlsx 0.1.2 8/21. The POI and Excelize misses are +> 2.11.0 18/21, zavora-xlsx 0.1.2 8/21. The POI and Excelize misses are > the three Tier 4 features, which the ExcelBench adapters do not > implement yet (`NotImplementedError`). They are not library gaps. > > ¹ `pivot_tables` is excluded from every denominator because no adapter -> produced a score for it in either competitor snapshot. +> produced a score for it in any competitor snapshot (2026-09-08, +> 2026-10-02, 2026-10-03). +> +> Previous competitor snapshot: [2026-10-02](results-2026-10-02/README.md) (WolfXL 2.0.5: 19/21 read, 18/21 write). > > Python release snapshot: 2026-04-29 UTC | wheel-backed WolfXL 2.0 rerun | [Fidelity](results-release-2026-04-28/README.md) | [Perf](results-release-2026-04-28/perf/README.md) | [Dashboard](results-release-2026-04-28/DASHBOARD.md) > @@ -97,9 +102,9 @@ Use this when the question is: which engine actually computes a 133-formula fina | Library | Caps | Fidelity | Read Speed | Write Speed | Modify | |---------|:----:|:--------:|:----------:|:-----------:|:------:| -| **wolfxl** | R+W | R 20/21, W 19/21 in 2026-09-08 competitor snapshot (18/18 in 2026-04-29 snapshot) | 1.69x (13.46 ms) | 1.20x (22.28 ms) | Patch (Preserved, 17/17 features in 2026-10-02 mutation suite) | -| openpyxl | R+W | R 21/21, W 21/21 in 2026-09-08 competitor snapshot | 1.00x (22.79 ms, baseline) | 1.00x (26.70 ms, baseline) | Rewrite (16/17 features in 2026-10-02 mutation suite) | -| aspose-cells-foss | R+W | R 11/21, W 14/21 in 2026-09-08 competitor snapshot | not measured | not measured | Rewrite (15/17 features) | +| **wolfxl** | R+W | R 21/21, W 21/21 in 2026-10-03 competitor snapshot (18/18 in 2026-04-29 snapshot) | 1.69x (13.46 ms) | 1.20x (22.28 ms) | Patch (Preserved, 17/17 features in 2026-10-03 mutation suite) | +| openpyxl | R+W | R 21/21, W 21/21 in 2026-10-03 competitor snapshot | 1.00x (22.79 ms, baseline) | 1.00x (26.70 ms, baseline) | Rewrite (16/17 features in 2026-10-03 mutation suite) | +| aspose-cells-foss | R+W | R 11/21, W 14/21 in 2026-10-03 competitor snapshot | not measured | not measured | Rewrite (15/17 features) | | xlsxwriter | W | 15/18 in 2026-04-29 release snapshot | -- | 0.86x (31.12 ms) | No | | xlsxwriter-constmem | W | 12/18 in 2026-04-29 release snapshot | -- | 0.86x (31.17 ms) | No | | python-calamine | R | 1/18 in 2026-04-29 release snapshot | 14.02x (1.63 ms) | -- | No | @@ -109,14 +114,14 @@ Use this when the question is: which engine actually computes a 133-formula fina > Speed columns come from the [2026-10-02 perf snapshot](results-2026-10-02/perf/README.md): sum of per-feature p50 wall times over the same 19 xlsx features for every library (warmup 3, 25 iterations, Apple M4 Pro, Python 3.12.3), shown as openpyxl's total divided by the library's total. WolfXL 2.0.5 is measured through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`), like every other library. aspose-cells-foss was not part of the perf run. Always cite the artifact date, workload, and profile. See [METHODOLOGY.md](METHODOLOGY.md) and [Public Reporting Status](docs/public-reporting.md). ### Key Findings -- **High-fidelity libraries are rare**: in the 2026-04-29 release snapshot, only openpyxl and WolfXL reached 18/18 green features; in the 2026-09-08 competitor snapshot (21 scored features; `pivot_tables` unscored), openpyxl holds 21/21 read and write while WolfXL 2.1.0 reaches 20/21 read and 19/21 write +- **High-fidelity libraries are rare**: in the 2026-04-29 release snapshot, only openpyxl and WolfXL reached 18/18 green features; in the 2026-10-03 competitor snapshot (21 scored features; `pivot_tables` unscored), openpyxl 3.1.5 and WolfXL 2.0.8 both hold 21/21 read and 21/21 write and pass all 133 tests in each mode. The next best are ExcelJS (15/21 write) and xlsxwriter (15/21 write) - **WolfXL 2.1.0 regression signal**: conditional-formatting read scores 0 and named-range / print-title writes score 2 in the 2026-09-08 snapshot; tracked for the WolfXL repo -- **Patch modify is structurally different**: WolfXL's `load_workbook(path, modify=True)` uses surgical ZIP patching; it is the only engine whose output keeps every template feature in the 2026-10-02 mutation suite +- **Patch modify is structurally different**: WolfXL's `load_workbook(path, modify=True)` uses surgical ZIP patching; it is the only engine whose output keeps every template feature in the 2026-10-03 mutation suite - **The abstraction tax is real**: pandas wraps openpyxl but drops from 16 to 3 green features due to DataFrame coercion (errors become NaN) - **Speed vs fidelity tradeoff is measurable**: use the perf snapshot together with the fidelity matrix rather than quoting one without the other - **Optimization modes have clear costs**: openpyxl-readonly loses 13 green features for streaming speed - **Cross-language context is now strong too**: `Apache POI` and `Excelize` land at `18/18` in the scored write lane; `zavora-xlsx` 0.1.2 writes fast but corrupts hyperlink relationships on mutate and cannot recalculate -- **Calculation is a differentiator**: in the 2026-10-02 calc rerun, LibreOffice, WolfXL Community 2.0.7, and WolfXL Commercial 2.3.0 compute all 133 formulas; aspose-cells-foss covers 25/133 and zavora-xlsx 0/133. Community's `save()` writes no calculated values (0/133 saved), while Commercial saves all 133 +- **Calculation is a differentiator**: in the 2026-10-03 calc lane, LibreOffice, WolfXL Community 2.0.8, and WolfXL Commercial 2.3.0 compute all 133 formulas; aspose-cells-foss covers 25/133 and zavora-xlsx 0/133. Community's `save()` writes no calculated values (0/133 saved), while Commercial saves all 133 See the [release snapshot dashboard](results-release-2026-04-28/DASHBOARD.md) for the fresh wheel-backed combined view, or the [historical dashboard](results/DASHBOARD.md) for the older public baseline. @@ -136,9 +141,9 @@ See the [release snapshot dashboard](results-release-2026-04-28/DASHBOARD.md) fo | Library | Version | Lang | Caps | Green Features | |:--------|:--------|:-----|:-----|:--------------:| -| [WolfXL](https://github.com/SynthGL/wolfxl) | 2.1.0 | Python (Rust core) | R+W | R 20/21, W 19/21 (2026-09-08 snapshot) | -| [openpyxl](https://openpyxl.readthedocs.io/) | 3.1.5 | Python | R+W | R 21/21, W 21/21 (2026-09-08 snapshot) | -| [aspose-cells-foss](https://pypi.org/project/aspose-cells-foss/) | 26.7 | Python (JVM-core FOSS) | R+W | R 11/21, W 14/21 (2026-09-08 snapshot) | +| [WolfXL](https://github.com/SynthGL/wolfxl) | 2.0.8 | Python (Rust core) | R+W | R 21/21, W 21/21 (2026-10-03 snapshot) | +| [openpyxl](https://openpyxl.readthedocs.io/) | 3.1.5 | Python | R+W | R 21/21, W 21/21 (2026-10-03 snapshot) | +| [aspose-cells-foss](https://pypi.org/project/aspose-cells-foss/) | 26.7 | Python (JVM-core FOSS) | R+W | R 11/21, W 14/21 (2026-10-03 snapshot) | | [XlsxWriter](https://xlsxwriter.readthedocs.io/) | 3.2.9 | Python | W | 15/18 | | [xlsxwriter-constmem](https://xlsxwriter.readthedocs.io/) | 3.2.9 | Python | W | 12/18 | | [openpyxl-readonly](https://openpyxl.readthedocs.io/) | 3.1.5 | Python | R | 3/18 | @@ -152,9 +157,9 @@ See the [release snapshot dashboard](results-release-2026-04-28/DASHBOARD.md) fo | [xlrd](https://github.com/python-excel/xlrd) | 2.0.2 | Python | R | .xls only | > Green-feature counts are per dated snapshot; `x/18` numbers come from the -> 2026-04-29 release snapshot and `x/21` from the 2026-09-08 competitor -> snapshot (Tier 4 added; `pivot_tables` is unscored and excluded from the -> denominator). Never mix counts across snapshots. +> 2026-04-29 release snapshot and `x/21` from the 2026-10-03 competitor +> snapshot (Tier 4 added 2026-09-08; `pivot_tables` is unscored and +> excluded from the denominator). Never mix counts across snapshots. ### Cross-Language Context (oracle helpers) @@ -307,7 +312,7 @@ uv run excelbench generate --output fixtures/excel | **Tier 4** -- Production surfaces (2026-09-08) | Sheet protection, page setup, chart anchoring | 3 | > Pivot tables are tested but score N/A across all adapters in the current macOS run. -> Green-feature denominators: /18 in the 2026-04-29 release snapshot, /21 in the 2026-09-08 and 2026-10-02 competitor snapshots (22 features modeled; `pivot_tables` is unscored and excluded). +> Green-feature denominators: /18 in the 2026-04-29 release snapshot, /21 in the 2026-09-08, 2026-10-02 and 2026-10-03 competitor snapshots (22 features modeled; `pivot_tables` is unscored and excluded). ### Planned @@ -315,6 +320,8 @@ None currently queued. Tier 4 (charts anchoring, print settings, protection) shi ## Detailed Results +- **[2026-10-03 competitor snapshot](results-2026-10-03/README.md)** -- current: [fidelity](results-2026-10-03/xlsx/README.md) (21 scored features x 17 adapters, WolfXL 2.0.8, heatmap [PNG](results-2026-10-03/xlsx/heatmap.png) / [SVG](results-2026-10-03/xlsx/heatmap.svg)), [mutation](results-2026-10-03/mutation/README.md), [calc](results-2026-10-03/calc/README.md), [cross-language](results-2026-10-03/cross-language/README.md) +- **[2026-10-02 competitor snapshot](results-2026-10-02/README.md)** -- previous: same lanes and adapters, WolfXL 2.0.5 - **[Competitor snapshot fidelity](results-2026-09-08/xlsx/README.md)** -- 22 features x 14 Python adapters, WolfXL 2.1.0 + aspose-cells-foss - **[Competitor snapshot heatmap](results-2026-09-08/xlsx/heatmap.png)** ([SVG](results-2026-09-08/xlsx/heatmap.svg)) -- 22x14 visual score matrix - **[Competitor snapshot mutation](results-2026-09-08/mutation/README.md)** -- template mutation: wall time, RSS, preservation diff --git a/docs/public-reporting.md b/docs/public-reporting.md index c449209..2e34d2b 100644 --- a/docs/public-reporting.md +++ b/docs/public-reporting.md @@ -12,7 +12,8 @@ This page explains what the current ExcelBench repo artifacts mean and how to ci - Fresh WolfXL 2.0 wheel-backed release snapshot: `results-release-2026-04-28/` generated 2026-04-29 UTC - Current checked-in cross-language context snapshot: `results-cross-language/` generated 2026-04-29 UTC - Current checked-in cross-language pivot capability artifact: `results-cross-language-pivots/` generated 2026-04-29 UTC -- Current competitor snapshot: `results-2026-10-02/` (fidelity, mutation, calc, cross-language, perf) generated 2026-10-02 UTC with WolfXL 2.0.5 +- Current competitor snapshot: `results-2026-10-03/` (fidelity, mutation, calc, cross-language) generated 2026-10-03 UTC with WolfXL 2.0.8 +- Previous competitor snapshot: `results-2026-10-02/` (fidelity, mutation, calc, cross-language, perf) generated 2026-10-02 UTC with WolfXL 2.0.5 ## How To Cite ExcelBench Safely @@ -41,6 +42,10 @@ This page explains what the current ExcelBench repo artifacts mean and how to ci | `results-2026-10-02/calc/README.md` | 2026-10-02 | Formula-recalculation tier vs LibreOffice 26.8.0.3 oracle on the cache-free 133-formula fixture | | `results-2026-10-02/cross-language/README.md` | 2026-10-02 | Cross-language context: Apache POI 5.5.1, Excelize 2.10.1, zavora-xlsx 0.1.2 | | `results-2026-10-02/perf/README.md` | 2026-10-02 | Performance snapshot: April's 19 features x 13 Python adapters, warmup 3, 25 iterations, WolfXL 2.0.5 through its public API, Apple M4 Pro | +| `results-2026-10-03/xlsx/README.md` | 2026-10-03 | Competitor fidelity snapshot: 21 scored features (`pivot_tables` unscored), the same 17 adapters as 2026-10-02; WolfXL 2.0.8, python-calamine 0.8.2, pandas 3.0.6, polars 1.44.2, pyexcel 0.7.6, tablib 3.10.0 | +| `results-2026-10-03/mutation/README.md` | 2026-10-03 | Template-mutation lane (content-model preservation, wall time, RSS); see its Scope note for host load | +| `results-2026-10-03/calc/README.md` | 2026-10-03 | Formula-recalculation tier vs LibreOffice 26.8.0.3 oracle; WolfXL Community 2.0.8 and Commercial 2.3.0 | +| `results-2026-10-03/cross-language/README.md` | 2026-10-03 | Cross-language context: Apache POI 5.5.1, Excelize 2.11.0, zavora-xlsx 0.1.2 | ## Safe Claims Right Now diff --git a/results-2026-10-03/README.md b/results-2026-10-03/README.md new file mode 100644 index 0000000..88e1b52 --- /dev/null +++ b/results-2026-10-03/README.md @@ -0,0 +1,56 @@ +# ExcelBench competitor snapshot 2026-10-03 + +| Lane | Artifacts | Command | +| --- | --- | --- | +| Fidelity (17 adapters) | [xlsx/](xlsx/README.md) | `excelbench benchmark -t fixtures/excel -o results-2026-10-03/xlsx -a openpyxl -a xlsxwriter -a python-calamine -a aspose-cells-foss -a wolfxl -a pylightxl -a xlrd -a pyexcel -a xlwt -a pandas -a xlsxwriter-constmem -a openpyxl-readonly -a polars -a tablib -a sheetjs -a exceljs -a libreoffice` then `excelbench heatmap -i results-2026-10-03/xlsx/results.json -o results-2026-10-03/xlsx` | +| Template mutation | [mutation/](mutation/README.md) | `excelbench mutation -o results-2026-10-03/mutation --repeats 3` | +| Formula recalculation | [calc/](calc/README.md) | `EXCELBENCH_WOLFXL_COMMERCIAL_PYTHON=/bin/python excelbench calc -o results-2026-10-03/calc` | +| Cross-language context | [cross-language/](cross-language/README.md) | `EXCELBENCH_ORACLE_DOCKER_CONTEXT=pc excelbench cross-language-context -t fixtures/excel -o results-2026-10-03/cross-language` | + +All four lanes ran from [run.sh](run.sh) (`EB_VENV` and `EB_COMMERCIAL` name the two interpreters); its console output is [run-log.txt](run-log.txt). The per-lane console logs it writes to `logs/` are gitignored and not committed; every score is in each lane's `results.json`. Perf is a separate snapshot. Fixtures, scoring and adapters are the ones used for 2026-10-02; the only code change is the Excelize helper port to 2.11.0 (see the cross-language README). + +## Versions + +Every library was checked against its registry on 2026-10-02 UTC, shortly before the run. "Bumped" marks a version newer than 2026-10-02. + +| Library | Version | Runtime | +| --- | --- | --- | +| wolfxl | 2.0.8 from PyPI (bumped from 2.0.5 / calc 2.0.7), `wolfxl-2.0.8-cp313-cp313-macosx_11_0_arm64.whl`, sha256 `c410d299ebbc4bdf7290d8dd872d0cc251f69316bbbe3939eb7561ad8c0cbfb7` | Python wheel | +| wolfxl-commercial (calc only) | 2.3.0 (newest Commercial release) from SynthGL's authenticated index, `wolfxl-2.3.0-cp313-cp313-macosx_11_0_arm64.whl`, sha256 `b49ce6ff3bfea1f829ea4f922b78485e0badb71633406cd492d127a95b9ee1ec` | Python wheel, separate interpreter | +| openpyxl / openpyxl-readonly | 3.1.5 | Python | +| aspose-cells-foss | 26.7.0 | Python | +| xlsxwriter / xlsxwriter-constmem | 3.2.9 | Python | +| python-calamine | 0.8.2 (bumped from 0.6.1) | Python | +| pandas | 3.0.6 (bumped from 3.0.0) | Python | +| polars | 1.44.2 (bumped from 1.38.1) | Python | +| pyexcel | 0.7.6 (bumped from 0.7.4) | Python | +| pylightxl | 1.61 | Python | +| tablib | 3.10.0 (bumped from 3.9.0) | Python | +| xlrd | 2.0.2 | Python | +| xlwt | 1.3.0 | Python | +| sheetjs (npm `xlsx`, Community Edition) | 0.20.3 (latest on the SheetJS CDN) | Node v22.18.0 via `tools/external-oracles/sheetjs` | +| exceljs | 4.4.0 | Node v22.18.0 via `tools/external-oracles/exceljs` | +| libreoffice | 26.8.0.3 (build bce0998afefdbc355585ca324285661a2170ba77) | headless `soffice` + UNO macro via `tools/external-oracles/libreoffice` | +| zavora-xlsx | 0.1.2 | Rust, local `cargo run` (cargo 1.92.0) via `tools/external-oracles/zavora` | +| apache-poi | 5.5.1 | Docker image `excelbench-poi-oracle:5.5.1` (`ef46106ed14d`) on context `pc` (linux/amd64) | +| excelize | 2.11.0 (bumped from 2.10.1) | Docker image `excelbench-excelize-oracle:2.11.0` (`79f691f8e6d0`) on context `pc` (linux/amd64) | + +The Python pins are in [pins.txt](pins.txt) and the full environment in [pip-freeze.txt](pip-freeze.txt). `uv.lock` was not changed; the run used its own venv built from `pins.txt`. + +## Host + +macOS 26.5.1 (25F80), Apple M5 Pro, 64 GB, arm64; Python 3.13.9; ExcelBench `master` at `b453355` plus the Excelize 2.11.0 helper changes (`tools/external-oracles/excelize/{go.mod,go.sum,main.go,Dockerfile}`, the image tag in `src/excelbench/harness/external_oracles.py`, `tools/external-oracles/remote/README.md`). + +## Lane membership + +- Fidelity: the same 17 adapters as 2026-10-02. `pivot_tables` is not scored by any adapter, so green-feature denominators are /21. +- Mutation: every engine that can open and edit an existing workbook (`openpyxl`, `wolfxl`, `aspose-cells-foss`, `zavora-xlsx`, `sheetjs`, `exceljs`, `libreoffice`). +- Calc: engines with a recalculation API; non-calculating adapters are listed as N/A in the calc README. +- Cross-language: `apache-poi`, `excelize`, `zavora-xlsx`. + +## Changes from 2026-10-02 + +- Fidelity: openpyxl 3.1.5 scores 21/21 read and 21/21 write (133/133 tests in each mode), as on 2026-10-02. WolfXL 2.0.8 also scores 21/21 read and 21/21 write (133/133 in each mode), up from 19/21 read and 18/21 write with 2.0.5; the four features that changed are `named_ranges` (read 2 to 3, write 2 to 3), `tables` (read 2 to 3), `page_setup` (write 2 to 3) and `chart_anchor` (write 0 to 3). Every other adapter has the same per-feature scores as 2026-10-02, including the five bumped Python libraries. +- Cross-language: identical scores (Apache POI 18/21, Excelize 18/21 after the 2.11.0 bump, zavora-xlsx 8/21). +- Calc: identical except the WolfXL Community version (2.0.8, 133/133 calculated, 0/133 saved). +- Mutation: identical verdicts (wolfxl Preserved 17/17, openpyxl 16/17, LibreOffice 15/17, aspose-cells-foss 15/17, SheetJS 8/17, zavora-xlsx 8/17, ExcelJS fails to load the template). The committed table is a rerun at 00:24:57Z with the same command, because unrelated host load spiked during the `run.sh` attempt and skewed its timings; `run-log.txt` covers only the `run.sh` attempt. Details and load readings are in the mutation README. diff --git a/results-2026-10-03/calc/README.md b/results-2026-10-03/calc/README.md new file mode 100644 index 0000000..01130dc --- /dev/null +++ b/results-2026-10-03/calc/README.md @@ -0,0 +1,37 @@ +# ExcelBench Formula Recalculation Results + +Oracle: libreoffice/LibreOffice 26.8.0.3 bce0998afefdbc355585ca324285661a2170ba77 + +Formula values are compared with absolute tolerance 1e-6 or relative tolerance 1e-9 for numbers; strings and booleans compare exactly. Saved to file counts the matching values a save writes into the workbook, for engines that return results through an API. + +| Engine | Version | Status | Matched/total | Saved to file | First mismatches | +| --- | --- | --- | --- | --- | --- | +| wolfxl | 2.0.8 | passed | 133/133 | 0/133 | — | +| wolfxl-commercial | 2.3.0 | passed | 133/133 | 133/133 | — | +| libreoffice | 26.8.0.3 (build bce0998afefdbc355585ca324285661a2170ba77) | passed | 133/133 | — | — | +| aspose_cells_foss | 26.7.0 | failed | 25/133 | — | Schedule!B11: expected -308872.0, actual None
Schedule!B2: expected 100000.0, actual None
Schedule!B3: expected 38000.0, actual None
Schedule!B4: expected 62000.0, actual None
Schedule!B6: expected 488.0, actual None
Schedule!B7: expected 719.0, actual None
Schedule!B8: expected 400872.0, actual None
Schedule!B9: expected -300872.0, actual None
Schedule!C11: expected -306442.0, actual None
Schedule!C2: expected 104500.0, actual None | +| zavora | unknown | failed | 0/133 | — | Schedule!B10: expected 0.0, actual None
Schedule!B11: expected -308872.0, actual None
Schedule!B2: expected 100000.0, actual None
Schedule!B3: expected 38000.0, actual None
Schedule!B4: expected 62000.0, actual None
Schedule!B5: expected 12000.0, actual None
Schedule!B6: expected 488.0, actual None
Schedule!B7: expected 719.0, actual None
Schedule!B8: expected 400872.0, actual None
Schedule!B9: expected -300872.0, actual None | + +aspose_cells_foss: FOSS FormulaEvaluator returned no value for 107 formulas: Schedule!B2, Schedule!C2, Schedule!D2, Schedule!E2, Schedule!F2 + +zavora: 133/133 formula values wrong or missing (first mismatch batch: 10 shown, 10 missing, 0 wrong) + +## Scope (snapshot runner note) + +The calc tier scores engines that expose a recalculation API. Libraries without +one are **not applicable** here, not scored 0: + +| Adapter | Calc tier | Reason | +| --- | --- | --- | +| openpyxl, openpyxl-readonly, xlsxwriter, xlsxwriter-constmem, pandas, polars, python-calamine, pylightxl, pyexcel, tablib, xlrd, xlwt | N/A | No formula evaluation engine; they read or write cached values / formula text only | +| sheetjs (CE 0.20.3) | N/A | SheetJS Community Edition does not evaluate formulas | +| exceljs 4.4.0 | N/A | ExcelJS stores formulas and cached results but has no calculation engine | +| apache-poi 5.5.1 | Not run | POI ships `FormulaEvaluator`, but the ExcelBench POI helper has no evaluate operation, so there is no harness path to score it yet | +| excelize 2.11.0 | Not run | Excelize ships `CalcCellValue`, but the ExcelBench Excelize helper has no evaluate operation, so there is no harness path to score it yet | + +The `libreoffice` row above is LibreOffice 26.8.0.3 headless recalculation (it is also the oracle that produced `fixtures/calc/expected_values.json`). +`wolfxl` is WolfXL Community 2.0.8 from PyPI (`wolfxl-2.0.8-cp313-cp313-macosx_11_0_arm64.whl`, sha256 `c410d299ebbc4bdf7290d8dd872d0cc251f69316bbbe3939eb7561ad8c0cbfb7`). Its score counts the values `Workbook.calculate()` returns; its `save()` writes no calculated values, shown as Saved to file 0/133. +`wolfxl-commercial` is WolfXL Commercial 2.3.0 (the newest Commercial release when run) from SynthGL's authenticated package index (`wolfxl-2.3.0-cp313-cp313-macosx_11_0_arm64.whl`, sha256 `b49ce6ff3bfea1f829ea4f922b78485e0badb71633406cd492d127a95b9ee1ec`). Both editions install as `wolfxl`, so it ran in a separate interpreter named by `EXCELBENCH_WOLFXL_COMMERCIAL_PYTHON`. +Every row matches 2026-10-02 except the Community version (2.0.7 then, 2.0.8 now; both 133/133 calculated, 0/133 saved). + +Command: `EXCELBENCH_WOLFXL_COMMERCIAL_PYTHON=/bin/python excelbench calc -o results-2026-10-03/calc` (defaults: `fixtures/calc/financial_model.xlsx`, `fixtures/calc/expected_values.json`). diff --git a/results-2026-10-03/calc/aspose_cells_foss/financial_model.xlsx b/results-2026-10-03/calc/aspose_cells_foss/financial_model.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a0314c8f0d8f48900ee1d0610ad2ce5c1681c5af GIT binary patch literal 9655 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 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/calc/libreoffice/financial_model.xlsx b/results-2026-10-03/calc/libreoffice/financial_model.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..133efb4139f60e3055b91f67a4a5fac56b3d1f77 GIT binary patch literal 13135 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 EA9??xWB>pF literal 0 HcmV?d00001 diff --git a/results-2026-10-03/calc/results.json b/results-2026-10-03/calc/results.json new file mode 100644 index 0000000..bf99f7c --- /dev/null +++ b/results-2026-10-03/calc/results.json @@ -0,0 +1,157 @@ +{ + "engines": { + "aspose_cells_foss": { + "matched": 25, + "mismatched_cells": [ + { + "actual": null, + "cell": "Schedule!B11", + "expected": -308872.0 + }, + { + "actual": null, + "cell": "Schedule!B2", + "expected": 100000.0 + }, + { + "actual": null, + "cell": "Schedule!B3", + "expected": 38000.0 + }, + { + "actual": null, + "cell": "Schedule!B4", + "expected": 62000.0 + }, + { + "actual": null, + "cell": "Schedule!B6", + "expected": 488.0 + }, + { + "actual": null, + "cell": "Schedule!B7", + "expected": 719.0 + }, + { + "actual": null, + "cell": "Schedule!B8", + "expected": 400872.0 + }, + { + "actual": null, + "cell": "Schedule!B9", + "expected": -300872.0 + }, + { + "actual": null, + "cell": "Schedule!C11", + "expected": -306442.0 + }, + { + "actual": null, + "cell": "Schedule!C2", + "expected": 104500.0 + } + ], + "reason": "FOSS FormulaEvaluator returned no value for 107 formulas: Schedule!B2, Schedule!C2, Schedule!D2, Schedule!E2, Schedule!F2", + "saved_matched": null, + "status": "failed", + "total": 133, + "version": "26.7.0" + }, + "libreoffice": { + "matched": 133, + "mismatched_cells": [], + "reason": null, + "saved_matched": null, + "status": "passed", + "total": 133, + "version": "26.8.0.3 (build bce0998afefdbc355585ca324285661a2170ba77)" + }, + "wolfxl": { + "matched": 133, + "mismatched_cells": [], + "reason": null, + "saved_matched": 0, + "status": "passed", + "total": 133, + "version": "2.0.8" + }, + "wolfxl-commercial": { + "matched": 133, + "mismatched_cells": [], + "reason": null, + "saved_matched": 133, + "status": "passed", + "total": 133, + "version": "2.3.0" + }, + "zavora": { + "matched": 0, + "mismatched_cells": [ + { + "actual": null, + "cell": "Schedule!B10", + "expected": 0.0 + }, + { + "actual": null, + "cell": "Schedule!B11", + "expected": -308872.0 + }, + { + "actual": null, + "cell": "Schedule!B2", + "expected": 100000.0 + }, + { + "actual": null, + "cell": "Schedule!B3", + "expected": 38000.0 + }, + { + "actual": null, + "cell": "Schedule!B4", + "expected": 62000.0 + }, + { + "actual": null, + "cell": "Schedule!B5", + "expected": 12000.0 + }, + { + "actual": null, + "cell": "Schedule!B6", + "expected": 488.0 + }, + { + "actual": null, + "cell": "Schedule!B7", + "expected": 719.0 + }, + { + "actual": null, + "cell": "Schedule!B8", + "expected": 400872.0 + }, + { + "actual": null, + "cell": "Schedule!B9", + "expected": -300872.0 + } + ], + "reason": "133/133 formula values wrong or missing (first mismatch batch: 10 shown, 10 missing, 0 wrong)", + "saved_matched": null, + "status": "failed", + "total": 133, + "version": null + } + }, + "fixture": "fixtures/calc/financial_model.xlsx", + "metadata": { + "platform": "Darwin-arm64", + "run_date": "2026-10-03T00:06:34.185831+00:00" + }, + "oracle": "libreoffice/LibreOffice 26.8.0.3 bce0998afefdbc355585ca324285661a2170ba77" +} diff --git a/results-2026-10-03/calc/wolfxl-commercial/financial_model.xlsx b/results-2026-10-03/calc/wolfxl-commercial/financial_model.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..15aaef0fc79ab8c30c6f92b984c7f3d4b067d377 GIT binary patch literal 10609 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 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/calc/zavora/financial_model.xlsx b/results-2026-10-03/calc/zavora/financial_model.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9074d5b0625c672fb88394c552a7e480e249759f GIT binary patch literal 9022 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 XrOH6q=ZY}|1j_I4v#t=4{eJp?Q#TL& literal 0 HcmV?d00001 diff --git a/results-2026-10-03/cross-language/CONTEXT.md b/results-2026-10-03/cross-language/CONTEXT.md new file mode 100644 index 0000000..13f0b5d --- /dev/null +++ b/results-2026-10-03/cross-language/CONTEXT.md @@ -0,0 +1,22 @@ +# ExcelBench Cross-Language Context + +This snapshot is for ecosystem context, not Python migration decisions. + +Use this snapshot to answer: how does WolfXL compare to mature spreadsheet tooling outside Python? + +Included adapters: +- `apache-poi` +- `excelize` +- `zavora-xlsx` + +Artifacts: +- [README](./README.md) +- [results.json](./results.json) +- [matrix.csv](./matrix.csv) + +Interpretation guidance: +- Keep this separate from the Python hero table. +- Cite the artifact path and generation date. +- Treat write-only adapters as ecosystem context, not drop-in migration advice. + +> Do not compare this table directly against the Python-first hero table without naming the scope. This run exists to position WolfXL against non-Python spreadsheet tooling. diff --git a/results-2026-10-03/cross-language/FIDELITY_DELTAS.md b/results-2026-10-03/cross-language/FIDELITY_DELTAS.md new file mode 100644 index 0000000..a91d7e9 --- /dev/null +++ b/results-2026-10-03/cross-language/FIDELITY_DELTAS.md @@ -0,0 +1,3 @@ +# Fidelity Deltas + +Need at least two runs in history.jsonl. diff --git a/results-2026-10-03/cross-language/README.md b/results-2026-10-03/cross-language/README.md new file mode 100644 index 0000000..78a0c28 --- /dev/null +++ b/results-2026-10-03/cross-language/README.md @@ -0,0 +1,606 @@ +# ExcelBench Results + +*Generated: 2026-10-03 00:00 UTC* +*Profile: xlsx* +*Excel Version: 16.105.3* +*Platform: Darwin-arm64* + +## Overview + +> Condensed view — shows the **best score** across read/write for each library. See [Full Results Matrix](#full-results-matrix) for the complete R/W breakdown. + +**Tier 0 — Basic Values** + +| Feature | apache-poi | excelize | zavora-xlsx | +|---------|:-:|:-:|:-:| +| Cell Values | 🟢 | 🟢 | 🔴 | +| Formulas | 🟢 | 🟢 | 🟢 | +| Sheets | 🟢 | 🟢 | 🟢 | + +**Tier 1 — Formatting** + +| Feature | apache-poi | excelize | zavora-xlsx | +|---------|:-:|:-:|:-:| +| Alignment | 🟢 | 🟢 | 🟠 | +| Bg Colors | 🟢 | 🟢 | 🟢 | +| Borders | 🟢 | 🟢 | 🔴 | +| Dimensions | 🟢 | 🟢 | 🟠 | +| Num Fmt | 🟢 | 🟢 | 🟢 | +| Text Fmt | 🟢 | 🟢 | 🟢 | + +**Tier 2 — Advanced** + +| Feature | apache-poi | excelize | zavora-xlsx | +|---------|:-:|:-:|:-:| +| chart_anchor | 🔴 | 🔴 | 🔴 | +| Comments | 🟢 | 🟢 | 🟢 | +| Cond Fmt | 🟢 | 🟢 | 🔴 | +| Validation | 🟢 | 🟢 | 🔴 | +| Freeze | 🟢 | 🟢 | 🔴 | +| Hyperlinks | 🟢 | 🟢 | 🔴 | +| Images | 🟢 | 🟢 | 🔴 | +| Merged | 🟢 | 🟢 | 🟢 | +| page_setup | 🔴 | 🔴 | 🔴 | +| sheet_protection | 🔴 | 🔴 | 🔴 | + +**Tier 3 — Workbook Metadata** + +| Feature | apache-poi | excelize | zavora-xlsx | +|---------|:-:|:-:|:-:| +| Named Ranges | 🟢 | 🟢 | 🟢 | +| Tables | 🟢 | 🟢 | 🟠 | + +## Library Tiers + +> Libraries ranked by their best capability (max of read/write green features). + +| Tier | Library | Caps | Modify | Green Features | Summary | +|:----:|---------|:----:|:------:|:--------------:|---------| +| **S-** | apache-poi | W | No | 18/21 | 18/21 features with full fidelity | +| **S-** | excelize | W | No | 18/21 | 18/21 features with full fidelity | +| **B** | zavora-xlsx | W | No | 8/21 | 8/21 features with full fidelity | + +## Score Legend + +| Score | Meaning | +|-------|---------| +| 🟢 3 | Complete — all basic and edge cases pass | +| 🟡 2 | Functional — all basic pass, one or more edge cases fail | +| 🟠 1 | Minimal — at least one basic case passes, but not all basic cases | +| 🔴 0 | Unsupported — errors or data loss | +| ➖ | Not applicable | + +## Full Results Matrix + +**Tier 0 — Basic Values** + +| Feature | apache-poi (W) | excelize (W) | zavora-xlsx (W) | +|---------|------------|------------|------------| +| [cell_values](#cell_values-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [formulas](#formulas-details) | 🟢 3 | 🟢 3 | 🟢 3 | +| [multiple_sheets](#multiple_sheets-details) | 🟢 3 | 🟢 3 | 🟢 3 | + +**Tier 1 — Formatting** + +| Feature | apache-poi (W) | excelize (W) | zavora-xlsx (W) | +|---------|------------|------------|------------| +| [alignment](#alignment-details) | 🟢 3 | 🟢 3 | 🟠 1 | +| [background_colors](#background_colors-details) | 🟢 3 | 🟢 3 | 🟢 3 | +| [borders](#borders-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [dimensions](#dimensions-details) | 🟢 3 | 🟢 3 | 🟠 1 | +| [number_formats](#number_formats-details) | 🟢 3 | 🟢 3 | 🟢 3 | +| [text_formatting](#text_formatting-details) | 🟢 3 | 🟢 3 | 🟢 3 | + +**Tier 2 — Advanced** + +| Feature | apache-poi (W) | excelize (W) | zavora-xlsx (W) | +|---------|------------|------------|------------| +| [chart_anchor](#chart_anchor-details) | 🔴 0 | 🔴 0 | 🔴 0 | +| [comments](#comments-details) | 🟢 3 | 🟢 3 | 🟢 3 | +| [conditional_formatting](#conditional_formatting-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [data_validation](#data_validation-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [freeze_panes](#freeze_panes-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [hyperlinks](#hyperlinks-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [images](#images-details) | 🟢 3 | 🟢 3 | 🔴 0 | +| [merged_cells](#merged_cells-details) | 🟢 3 | 🟢 3 | 🟢 3 | +| [page_setup](#page_setup-details) | 🔴 0 | 🔴 0 | 🔴 0 | +| [pivot_tables](#pivot_tables-details) | ➖ | ➖ | ➖ | +| [sheet_protection](#sheet_protection-details) | 🔴 0 | 🔴 0 | 🔴 0 | + +**Tier 3 — Workbook Metadata** + +| Feature | apache-poi (W) | excelize (W) | zavora-xlsx (W) | +|---------|------------|------------|------------| +| [named_ranges](#named_ranges-details) | 🟢 3 | 🟢 3 | 🟢 3 | +| [tables](#tables-details) | 🟢 3 | 🟢 3 | 🟠 1 | + +## Notes + +- **pivot_tables**: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +## Statistics + +| Library | Mode | Tests | Passed | Failed | Pass Rate | Green Features | +|---------|------|-------|--------|--------|-----------|----------------| +| apache-poi | W | 133 | 125 | 8 | 94% | 18/21 | +| excelize | W | 133 | 125 | 8 | 94% | 18/21 | +| zavora-xlsx | W | 133 | 63 | 70 | 47% | 8/21 | + +## Libraries Tested + +- **apache-poi** v5.5.1 (java) - write; modify: No +- **excelize** vgo-helper (go) - write; modify: No +- **zavora-xlsx** v0.1.2 (rust) - write; modify: No + +## Diagnostics Summary + +| Group | Value | Count | +|-------|-------|-------| +| category | data_mismatch | 4 | +| category | unsupported_feature | 82 | +| severity | error | 4 | +| severity | warning | 82 | + +### Diagnostic Details + +| Feature | Library | Test Case | Operation | Category | Severity | Message | +|---------|---------|-----------|-----------|----------|----------|---------| +| cell_values | zavora-xlsx | string_simple | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | string_unicode | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | string_empty | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | string_long | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | string_newline | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | number_integer | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | number_float | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | number_negative | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | number_large | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | number_scientific | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | date_standard | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | datetime | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | boolean_true | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | boolean_false | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | error_div0 | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | error_na | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | error_value | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| cell_values | zavora-xlsx | blank | write | unsupported_feature | warning | RuntimeError: unsupported cell type "date" at cell_values!B12 | +| alignment | zavora-xlsx | v_top | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| borders | zavora-xlsx | thin_all | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | medium_all | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | thick_all | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | double | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | dashed | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | dotted | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | dash_dot | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | dash_dot_dot | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | top_only | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | bottom_only | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | left_only | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | right_only | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | diagonal_up | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | diagonal_down | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | diagonal_both | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | color_red | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | color_blue | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | color_custom | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | mixed_styles | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| borders | zavora-xlsx | mixed_colors | write | unsupported_feature | warning | RuntimeError: unsupported border style "dashDot" | +| dimensions | zavora-xlsx | row_height_30 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | zavora-xlsx | row_height_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| conditional_formatting | zavora-xlsx | cf_cell_gt | write | unsupported_feature | warning | RuntimeError: unsupported payload part: conditional_formats | +| conditional_formatting | zavora-xlsx | cf_formula_cross_sheet | write | unsupported_feature | warning | RuntimeError: unsupported payload part: conditional_formats | +| conditional_formatting | zavora-xlsx | cf_text_contains | write | unsupported_feature | warning | RuntimeError: unsupported payload part: conditional_formats | +| conditional_formatting | zavora-xlsx | cf_data_bar | write | unsupported_feature | warning | RuntimeError: unsupported payload part: conditional_formats | +| conditional_formatting | zavora-xlsx | cf_color_scale | write | unsupported_feature | warning | RuntimeError: unsupported payload part: conditional_formats | +| conditional_formatting | zavora-xlsx | cf_stop_if_true | write | unsupported_feature | warning | RuntimeError: unsupported payload part: conditional_formats | +| data_validation | zavora-xlsx | dv_list_csv | write | unsupported_feature | warning | RuntimeError: unsupported payload part: validations | +| data_validation | zavora-xlsx | dv_list_range | write | unsupported_feature | warning | RuntimeError: unsupported payload part: validations | +| data_validation | zavora-xlsx | dv_cross_sheet | write | unsupported_feature | warning | RuntimeError: unsupported payload part: validations | +| data_validation | zavora-xlsx | dv_custom_formula | write | unsupported_feature | warning | RuntimeError: unsupported payload part: validations | +| data_validation | zavora-xlsx | dv_whole_between | write | unsupported_feature | warning | RuntimeError: unsupported payload part: validations | +| hyperlinks | zavora-xlsx | link_external | write | unsupported_feature | warning | RuntimeError: unsupported hyperlink part: tooltip | +| hyperlinks | zavora-xlsx | link_internal | write | unsupported_feature | warning | RuntimeError: unsupported hyperlink part: tooltip | +| hyperlinks | zavora-xlsx | link_mailto | write | unsupported_feature | warning | RuntimeError: unsupported hyperlink part: tooltip | +| hyperlinks | zavora-xlsx | link_long | write | unsupported_feature | warning | RuntimeError: unsupported hyperlink part: tooltip | +| images | zavora-xlsx | image_one_cell | write | unsupported_feature | warning | RuntimeError: unsupported payload part: pictures | +| images | zavora-xlsx | image_two_cell_offset | write | unsupported_feature | warning | RuntimeError: unsupported payload part: pictures | +| freeze_panes | zavora-xlsx | freeze_b2 | write | unsupported_feature | warning | RuntimeError: unsupported pane part: top_left_cell | +| freeze_panes | zavora-xlsx | freeze_d5 | write | unsupported_feature | warning | RuntimeError: unsupported pane part: top_left_cell | +| freeze_panes | zavora-xlsx | split_2x1 | write | unsupported_feature | warning | RuntimeError: unsupported pane part: top_left_cell | +| tables | zavora-xlsx | tbl_with_totals | write | data_mismatch | error | Expected values did not match actual values: expected={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': True, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 1}}, actual={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': False, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 0}} | +| sheet_protection | apache-poi | prot_basic | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement sheet protection writes | +| sheet_protection | apache-poi | prot_password | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement sheet protection writes | +| sheet_protection | apache-poi | prot_granular | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement sheet protection writes | +| sheet_protection | excelize | prot_basic | write | unsupported_feature | warning | NotImplementedError: excelize does not implement sheet protection writes | +| sheet_protection | excelize | prot_password | write | unsupported_feature | warning | NotImplementedError: excelize does not implement sheet protection writes | +| sheet_protection | excelize | prot_granular | write | unsupported_feature | warning | NotImplementedError: excelize does not implement sheet protection writes | +| sheet_protection | zavora-xlsx | prot_basic | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement sheet protection writes | +| sheet_protection | zavora-xlsx | prot_password | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement sheet protection writes | +| sheet_protection | zavora-xlsx | prot_granular | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement sheet protection writes | +| page_setup | apache-poi | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement page setup writes | +| page_setup | apache-poi | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement page setup writes | +| page_setup | apache-poi | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement page setup writes | +| page_setup | excelize | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: excelize does not implement page setup writes | +| page_setup | excelize | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: excelize does not implement page setup writes | +| page_setup | excelize | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: excelize does not implement page setup writes | +| page_setup | zavora-xlsx | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement page setup writes | +| page_setup | zavora-xlsx | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement page setup writes | +| page_setup | zavora-xlsx | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement page setup writes | +| chart_anchor | apache-poi | chart_bar | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement chart anchor writes | +| chart_anchor | apache-poi | chart_line | write | unsupported_feature | warning | NotImplementedError: apache-poi does not implement chart anchor writes | +| chart_anchor | excelize | chart_bar | write | unsupported_feature | warning | NotImplementedError: excelize does not implement chart anchor writes | +| chart_anchor | excelize | chart_line | write | unsupported_feature | warning | NotImplementedError: excelize does not implement chart anchor writes | +| chart_anchor | zavora-xlsx | chart_bar | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement chart anchor writes | +| chart_anchor | zavora-xlsx | chart_line | write | unsupported_feature | warning | NotImplementedError: zavora-xlsx does not implement chart anchor writes | + +## Detailed Results + + +### alignment + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Align - left | basic | ✅ | +| Align - center | basic | ✅ | +| Align - right | basic | ✅ | +| Align - top | basic | ❌ | +| Align - center | basic | ✅ | +| Align - bottom | basic | ✅ | +| Align - wrap text | basic | ✅ | +| Align - rotation 45 | basic | ✅ | +| Align - indent 2 | basic | ✅ | + + +### background_colors + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### borders + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Border - thin all edges | basic | ❌ | +| Border - medium all edges | basic | ❌ | +| Border - thick all edges | basic | ❌ | +| Border - double line | basic | ❌ | +| Border - dashed | basic | ❌ | +| Border - dotted | basic | ❌ | +| Border - dash-dot | basic | ❌ | +| Border - dash-dot-dot | basic | ❌ | +| Border - top only | basic | ❌ | +| Border - bottom only | basic | ❌ | +| Border - left only | basic | ❌ | +| Border - right only | basic | ❌ | +| Border - diagonal up | basic | ❌ | +| Border - diagonal down | basic | ❌ | +| Border - diagonal both | basic | ❌ | +| Border - red color | basic | ❌ | +| Border - blue color | basic | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | +| Border - mixed styles per edge | basic | ❌ | +| Border - mixed colors per edge | basic | ❌ | + + +### cell_values + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| String - simple | basic | ❌ | +| String - unicode | basic | ❌ | +| String - empty | basic | ❌ | +| String - long (1000 chars) | basic | ❌ | +| String - with newlines | basic | ❌ | +| Number - integer | basic | ❌ | +| Number - float | basic | ❌ | +| Number - negative | basic | ❌ | +| Number - large | basic | ❌ | +| Number - scientific notation | basic | ❌ | +| Date - standard | basic | ❌ | +| DateTime - with time | basic | ❌ | +| Boolean - TRUE | basic | ❌ | +| Boolean - FALSE | basic | ❌ | +| Error - #DIV/0! | basic | ❌ | +| Error - #N/A | basic | ❌ | +| Error - #VALUE! | basic | ❌ | +| Blank cell | basic | ❌ | + + +### chart_anchor + +**apache-poi** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**excelize** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + + +### comments + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### conditional_formatting + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | +| CF: text contains | edge | ❌ | +| CF: data bar | edge | ❌ | +| CF: 3-color scale | edge | ❌ | +| CF: stop-if-true priority | edge | ❌ | + + +### data_validation + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| DV: list from CSV | basic | ❌ | +| DV: list from range | edge | ❌ | +| DV: cross-sheet named range | edge | ❌ | +| DV: custom formula | edge | ❌ | +| DV: whole number with error | basic | ❌ | + + +### dimensions + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Row height - 30 | basic | ❌ | +| Row height - 45 | basic | ❌ | +| Column width - D = 20 | basic | ✅ | +| Column width - E = 8 | basic | ✅ | + + +### formulas + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### freeze_panes + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Freeze panes at B2 | basic | ❌ | +| Freeze panes at D5 | edge | ❌ | +| Split panes row=2 col=1 | edge | ❌ | + + +### hyperlinks + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Hyperlink: external URL | basic | ❌ | +| Hyperlink: internal sheet | edge | ❌ | +| Hyperlink: mailto | basic | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | + + +### images + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Image: one-cell anchor | basic | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | + + +### merged_cells + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### multiple_sheets + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### named_ranges + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### number_formats + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + + +### page_setup + +**apache-poi** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**excelize** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + + +### pivot_tables + +**apache-poi** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**excelize** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**zavora-xlsx** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + + +### sheet_protection + +**apache-poi** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**excelize** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**zavora-xlsx** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + + +### tables + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Table: basic 3-col | basic | ✅ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ✅ | +| Table: single column | edge | ✅ | +| Table: header only (no data rows) | edge | ✅ | +| Table: with autoFilter | edge | ✅ | + + +### text_formatting + +**apache-poi** — Write: 🟢 3 + +**excelize** — Write: 🟢 3 + +**zavora-xlsx** — Write: 🟢 3 + +--- +*Benchmark version: 0.1.0* +## Scope (snapshot runner note) + +- `apache-poi` 5.5.1 and `excelize` 2.11.0 ran as Docker images `excelbench-poi-oracle:5.5.1` (`ef46106ed14d`) and `excelbench-excelize-oracle:2.11.0` (`79f691f8e6d0`) on Docker context `pc` (linux/amd64); `zavora-xlsx` 0.1.2 ran through local `cargo run`. +- **Excelize bump.** 2026-10-02 used Excelize 2.10.1. 2.11.0 (released 2026-07-06) is the latest stable, so the helper's `go.mod` now requires v2.11.0 and the image was rebuilt. 2.11.0 changed `Chart.Title` from `[]RichTextRun` to a `ChartTitle` struct, so the helper sets the same title text through `ChartTitle.Paragraph`; no other helper code changed. Scores are identical to 2026-10-02 (18/21). +- **Adapter gap, not library gap:** the `sheet_protection`, `page_setup`, and `chart_anchor` 0 scores for `apache-poi` and `excelize` come from the ExcelBench Python adapters raising `NotImplementedError` ("does not implement ... writes"). Both libraries expose these features; the ExcelBench helpers have not been extended to Tier 4 yet. Read their 18/21 as "18 of 18 implemented Tier 0-3 features". +- The `excelize` version column reads `go-helper` because the adapter reports the helper, not the module; the image pins `github.com/xuri/excelize/v2` v2.11.0. +- Apache POI 5.5.1 and zavora-xlsx 0.1.2 were still the latest stable releases (Maven Central and crates.io) when run. + +Command: `EXCELBENCH_ORACLE_DOCKER_CONTEXT=pc excelbench cross-language-context -t fixtures/excel -o results-2026-10-03/cross-language`. diff --git a/results-2026-10-03/cross-language/WHY_FAILED.md b/results-2026-10-03/cross-language/WHY_FAILED.md new file mode 100644 index 0000000..0acd6b8 --- /dev/null +++ b/results-2026-10-03/cross-language/WHY_FAILED.md @@ -0,0 +1,517 @@ +# Why Failed + +## cell_values / zavora-xlsx / write / string_simple + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / string_unicode + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / string_empty + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / string_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / string_newline + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / number_integer + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / number_float + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / number_negative + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / number_large + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / number_scientific + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / date_standard + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / datetime + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / boolean_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / boolean_false + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / error_div0 + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / error_na + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / error_value + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / zavora-xlsx / write / blank + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / zavora-xlsx / write / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / zavora-xlsx / write / thin_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / medium_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / thick_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / double + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / dashed + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / dotted + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / dash_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / dash_dot_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / top_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / bottom_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / left_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / right_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / diagonal_up + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / diagonal_down + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / diagonal_both + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / mixed_styles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / zavora-xlsx / write / mixed_colors + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / zavora-xlsx / write / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / zavora-xlsx / write / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / zavora-xlsx / write / cf_cell_gt + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / zavora-xlsx / write / cf_formula_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / zavora-xlsx / write / cf_text_contains + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / zavora-xlsx / write / cf_data_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / zavora-xlsx / write / cf_color_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / zavora-xlsx / write / cf_stop_if_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / zavora-xlsx / write / dv_list_csv + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / zavora-xlsx / write / dv_list_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / zavora-xlsx / write / dv_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / zavora-xlsx / write / dv_custom_formula + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / zavora-xlsx / write / dv_whole_between + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / zavora-xlsx / write / link_external + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / zavora-xlsx / write / link_internal + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / zavora-xlsx / write / link_mailto + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / zavora-xlsx / write / link_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / zavora-xlsx / write / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / zavora-xlsx / write / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / zavora-xlsx / write / freeze_b2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / zavora-xlsx / write / freeze_d5 + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / zavora-xlsx / write / split_2x1 + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / zavora-xlsx / write / tbl_with_totals + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## sheet_protection / apache-poi / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / apache-poi / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / apache-poi / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / excelize / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / excelize / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / excelize / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / zavora-xlsx / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / zavora-xlsx / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / zavora-xlsx / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / apache-poi / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / apache-poi / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / apache-poi / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / excelize / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / excelize / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / excelize / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / zavora-xlsx / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / zavora-xlsx / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / zavora-xlsx / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / apache-poi / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / apache-poi / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / excelize / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / excelize / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / zavora-xlsx / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / zavora-xlsx / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression diff --git a/results-2026-10-03/cross-language/history.jsonl b/results-2026-10-03/cross-language/history.jsonl new file mode 100644 index 0000000..cd34e5b --- /dev/null +++ b/results-2026-10-03/cross-language/history.jsonl @@ -0,0 +1 @@ +{"run_date": "2026-10-03T00:00:02.123787+00:00", "commit": "b453355", "profile": "xlsx", "scores": {"apache-poi": {"cell_values": {"read": null, "write": 3}, "formulas": {"read": null, "write": 3}, "text_formatting": {"read": null, "write": 3}, "background_colors": {"read": null, "write": 3}, "number_formats": {"read": null, "write": 3}, "alignment": {"read": null, "write": 3}, "borders": {"read": null, "write": 3}, "dimensions": {"read": null, "write": 3}, "multiple_sheets": {"read": null, "write": 3}, "merged_cells": {"read": null, "write": 3}, "conditional_formatting": {"read": null, "write": 3}, "data_validation": {"read": null, "write": 3}, "hyperlinks": {"read": null, "write": 3}, "images": {"read": null, "write": 3}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": 3}, "freeze_panes": {"read": null, "write": 3}, "named_ranges": {"read": null, "write": 3}, "tables": {"read": null, "write": 3}, "sheet_protection": {"read": null, "write": 0}, "page_setup": {"read": null, "write": 0}, "chart_anchor": {"read": null, "write": 0}}, "excelize": {"cell_values": {"read": null, "write": 3}, "formulas": {"read": null, "write": 3}, "text_formatting": {"read": null, "write": 3}, "background_colors": {"read": null, "write": 3}, "number_formats": {"read": null, "write": 3}, "alignment": {"read": null, "write": 3}, "borders": {"read": null, "write": 3}, "dimensions": {"read": null, "write": 3}, "multiple_sheets": {"read": null, "write": 3}, "merged_cells": {"read": null, "write": 3}, "conditional_formatting": {"read": null, "write": 3}, "data_validation": {"read": null, "write": 3}, "hyperlinks": {"read": null, "write": 3}, "images": {"read": null, "write": 3}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": 3}, "freeze_panes": {"read": null, "write": 3}, "named_ranges": {"read": null, "write": 3}, "tables": {"read": null, "write": 3}, "sheet_protection": {"read": null, "write": 0}, "page_setup": {"read": null, "write": 0}, "chart_anchor": {"read": null, "write": 0}}, "zavora-xlsx": {"cell_values": {"read": null, "write": 0}, "formulas": {"read": null, "write": 3}, "text_formatting": {"read": null, "write": 3}, "background_colors": {"read": null, "write": 3}, "number_formats": {"read": null, "write": 3}, "alignment": {"read": null, "write": 1}, "borders": {"read": null, "write": 0}, "dimensions": {"read": null, "write": 1}, "multiple_sheets": {"read": null, "write": 3}, "merged_cells": {"read": null, "write": 3}, "conditional_formatting": {"read": null, "write": 0}, "data_validation": {"read": null, "write": 0}, "hyperlinks": {"read": null, "write": 0}, "images": {"read": null, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": 3}, "freeze_panes": {"read": null, "write": 0}, "named_ranges": {"read": null, "write": 3}, "tables": {"read": null, "write": 1}, "sheet_protection": {"read": null, "write": 0}, "page_setup": {"read": null, "write": 0}, "chart_anchor": {"read": null, "write": 0}}}} diff --git a/results-2026-10-03/cross-language/matrix.csv b/results-2026-10-03/cross-language/matrix.csv new file mode 100644 index 0000000..0246491 --- /dev/null +++ b/results-2026-10-03/cross-language/matrix.csv @@ -0,0 +1,67 @@ +library,feature,read_score,write_score +apache-poi,cell_values,,3 +excelize,cell_values,,3 +zavora-xlsx,cell_values,,0 +apache-poi,formulas,,3 +excelize,formulas,,3 +zavora-xlsx,formulas,,3 +apache-poi,text_formatting,,3 +excelize,text_formatting,,3 +zavora-xlsx,text_formatting,,3 +apache-poi,background_colors,,3 +excelize,background_colors,,3 +zavora-xlsx,background_colors,,3 +apache-poi,number_formats,,3 +excelize,number_formats,,3 +zavora-xlsx,number_formats,,3 +apache-poi,alignment,,3 +excelize,alignment,,3 +zavora-xlsx,alignment,,1 +apache-poi,borders,,3 +excelize,borders,,3 +zavora-xlsx,borders,,0 +apache-poi,dimensions,,3 +excelize,dimensions,,3 +zavora-xlsx,dimensions,,1 +apache-poi,multiple_sheets,,3 +excelize,multiple_sheets,,3 +zavora-xlsx,multiple_sheets,,3 +apache-poi,merged_cells,,3 +excelize,merged_cells,,3 +zavora-xlsx,merged_cells,,3 +apache-poi,conditional_formatting,,3 +excelize,conditional_formatting,,3 +zavora-xlsx,conditional_formatting,,0 +apache-poi,data_validation,,3 +excelize,data_validation,,3 +zavora-xlsx,data_validation,,0 +apache-poi,hyperlinks,,3 +excelize,hyperlinks,,3 +zavora-xlsx,hyperlinks,,0 +apache-poi,images,,3 +excelize,images,,3 +zavora-xlsx,images,,0 +apache-poi,pivot_tables,, +excelize,pivot_tables,, +zavora-xlsx,pivot_tables,, +apache-poi,comments,,3 +excelize,comments,,3 +zavora-xlsx,comments,,3 +apache-poi,freeze_panes,,3 +excelize,freeze_panes,,3 +zavora-xlsx,freeze_panes,,0 +apache-poi,named_ranges,,3 +excelize,named_ranges,,3 +zavora-xlsx,named_ranges,,3 +apache-poi,tables,,3 +excelize,tables,,3 +zavora-xlsx,tables,,1 +apache-poi,sheet_protection,,0 +excelize,sheet_protection,,0 +zavora-xlsx,sheet_protection,,0 +apache-poi,page_setup,,0 +excelize,page_setup,,0 +zavora-xlsx,page_setup,,0 +apache-poi,chart_anchor,,0 +excelize,chart_anchor,,0 +zavora-xlsx,chart_anchor,,0 \ No newline at end of file diff --git a/results-2026-10-03/cross-language/results.json b/results-2026-10-03/cross-language/results.json new file mode 100644 index 0000000..ff5fd65 --- /dev/null +++ b/results-2026-10-03/cross-language/results.json @@ -0,0 +1,10415 @@ +{ + "metadata": { + "benchmark_version": "0.1.0", + "run_date": "2026-10-03T00:00:02.123787+00:00", + "excel_version": "16.105.3", + "platform": "Darwin-arm64", + "profile": "xlsx" + }, + "libraries": { + "apache-poi": { + "name": "apache-poi", + "version": "5.5.1", + "language": "java", + "capabilities": [ + "write" + ] + }, + "excelize": { + "name": "excelize", + "version": "go-helper", + "language": "go", + "capabilities": [ + "write" + ] + }, + "zavora-xlsx": { + "name": "zavora-xlsx", + "version": "0.1.2", + "language": "rust", + "capabilities": [ + "write" + ] + } + }, + "results": [ + { + "feature": "cell_values", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "string_simple": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "string_simple": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "string_simple": { + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_simple", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_unicode", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "write": { + "passed": false, + "expected": { + "type": "blank" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_empty", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_long", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_newline", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_integer", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_float", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "write": { + "passed": false, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_negative", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_large", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_scientific", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "write": { + "passed": false, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "date_standard", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "write": { + "passed": false, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "datetime", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "write": { + "passed": false, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "boolean_true", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "write": { + "passed": false, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "boolean_false", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_div0", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_na", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_value", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "write": { + "passed": false, + "expected": { + "type": "blank" + }, + "actual": { + "error": "unsupported cell type \"date\" at cell_values!B12" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "blank", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported cell type \"date\" at cell_values!B12", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bold": { + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bold": { + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_size": 8.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_size": 14.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_size": 24.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_size": 36.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bold": { + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bg_red": { + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bg_red": { + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bg_red": { + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "h_left": { + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "h_left": { + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "h_left": { + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "write": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "thin_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "thin_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "thin_all": { + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thin_all", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "write": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "medium_all", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "write": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thick_all", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "write": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "double", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "write": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dashed", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "write": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dotted", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "write": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "write": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "write": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "top_only", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "bottom_only", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "left_only", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "right_only", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "write": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_styles", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "error": "unsupported border style \"dashDot\"" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported border style \"dashDot\"", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "row_height_30": { + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "unsupported payload part: conditional_formats" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: conditional_formats", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "unsupported payload part: conditional_formats" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: conditional_formats", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "unsupported payload part: conditional_formats" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: conditional_formats", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "unsupported payload part: conditional_formats" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: conditional_formats", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "unsupported payload part: conditional_formats" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: conditional_formats", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "unsupported payload part: conditional_formats" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: conditional_formats", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "unsupported payload part: validations" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: validations", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "unsupported payload part: validations" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: validations", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "unsupported payload part: validations" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: validations", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "unsupported payload part: validations" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: validations", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "unsupported payload part: validations" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: validations", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "link_external": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "link_external": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "link_external": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "error": "unsupported hyperlink part: tooltip" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported hyperlink part: tooltip", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "error": "unsupported hyperlink part: tooltip" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported hyperlink part: tooltip", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "error": "unsupported hyperlink part: tooltip" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported hyperlink part: tooltip", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "error": "unsupported hyperlink part: tooltip" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported hyperlink part: tooltip", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "image_one_cell": { + "write": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "write": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "image_one_cell": { + "write": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "write": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "unsupported payload part: pictures" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: pictures", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "unsupported payload part: pictures" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "RuntimeError: unsupported payload part: pictures", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "apache-poi", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "excelize", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "comments", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "unsupported pane part: top_left_cell" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": null + }, + "adapter_message": "RuntimeError: unsupported pane part: top_left_cell", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "unsupported pane part: top_left_cell" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": null + }, + "adapter_message": "RuntimeError: unsupported pane part: top_left_cell", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "unsupported pane part: top_left_cell" + }, + "notes": "Write failed: RuntimeError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": null + }, + "adapter_message": "RuntimeError: unsupported pane part: top_left_cell", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "apache-poi", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "tbl_basic": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "excelize", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "tbl_basic": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "tbl_basic": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": false, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 0 + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': True, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 1}}, actual={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': False, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 0}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "apache-poi", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "apache-poi does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "apache-poi does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "apache-poi does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "excelize", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "excelize does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "excelize does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "excelize does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "zavora-xlsx does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "zavora-xlsx does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "zavora-xlsx does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "apache-poi", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "apache-poi does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "apache-poi does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "apache-poi does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "excelize", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "excelize does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "excelize does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "excelize does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "zavora-xlsx does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "zavora-xlsx does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "zavora-xlsx does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "apache-poi", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "apache-poi does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "apache-poi does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: apache-poi does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "excelize", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "excelize does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "excelize does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: excelize does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "zavora-xlsx", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "zavora-xlsx does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "zavora-xlsx does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: zavora-xlsx does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + } + ] +} \ No newline at end of file diff --git a/results-2026-10-03/mutation/README.md b/results-2026-10-03/mutation/README.md new file mode 100644 index 0000000..07de7d8 --- /dev/null +++ b/results-2026-10-03/mutation/README.md @@ -0,0 +1,32 @@ +# ExcelBench Mutation Results + +*Generated: 2026-10-03T00:25:19Z* +*Template SHA-256: da08cc9e607f267b438ec7ce2480d6eb3650d1c19928f283a18296a2b79d808e* +*Repeats: 3* + +## Comparison + +| Engine | Wall ms | Peak RSS KB | Features preserved | Unexpected changes | Edits applied | Integrity | Verdict | +|--------|---------|-------------|--------------------|--------------------|---------------|-----------|---------| +| aspose-cells-foss | 750.000 | 168128.000 | 15/17 | cells (87), custom_xml (1) | yes | ok | Changed cells, custom_xml | +| exceljs | — | — | — | — | — | — | Failed | +| libreoffice | 1660.000 | 264352.000 | 15/17 | cell_styles (16), page_setup (5) | yes | ok | Changed cell_styles, page_setup | +| openpyxl | 860.000 | 167968.000 | 16/17 | custom_xml (1) | yes | ok | Changed custom_xml | +| sheetjs | 800.000 | 167136.000 | 8/17 | cell_styles (9), views (3), data_validations (2), conditional_formats (2), protection (1), page_setup (2), charts (2), tables (1), custom_xml (1) | yes | ok | Changed cell_styles, views, data_validations, conditional_formats, protection, page_setup, charts, tables, custom_xml | +| wolfxl | 780.000 | 170032.000 | 17/17 | none | yes | ok | Preserved | +| zavora-xlsx | 1240.000 | 167184.000 | 8/17 | cells (48), cell_styles (17), data_validations (2), conditional_formats (2), comments (1), charts (2), tables (1), theme (1), custom_xml (1) | yes | ok | Changed cells, cell_styles, data_validations, conditional_formats, comments, charts, tables, theme, custom_xml | + +## Notes + +Wall time and peak RSS are measured in isolated subprocesses with macOS `/usr/bin/time -l`. +Preservation compares the output's workbook content model against the template's model with the two declared cell edits applied. Part names, relationship ids, XML serialization and document metadata are not content, so an equivalent rewrite scores the same as a byte copy. Cached results of formula cells are recalculation state and are not compared; formula text is. Features preserved counts template features with no unexpected difference. Integrity (dangling relationships, parts without a content type) is reported separately and is not scored. This does not measure formula recalculation or rendering. + +## Scope (snapshot runner note) + +- **Scorer.** The same content-model scorer as the 2026-10-02 rerun (template content model with the two declared edits applied, compared with the output's model, plus the `custom_xml` feature). Fixture, scorer and engines are unchanged; only the WolfXL version moved (2.0.5 to 2.0.8). +- **Verdicts.** Identical to 2026-10-02 for every engine: wolfxl Preserved (17/17); openpyxl Changed custom_xml (16/17); LibreOffice Changed cell_styles, page_setup (15/17); aspose-cells-foss Changed cells, custom_xml (15/17); SheetJS 8/17 and zavora-xlsx 8/17 with the same changed features; ExcelJS Failed. Every engine that ran applied both declared edits. The per-feature explanations in the 2026-10-02 mutation README still apply. +- `exceljs` 4.4.0 failed the same way as 2026-10-02: ExcelJS throws `Cannot read properties of undefined (reading 'anchors')` while loading the template (full traceback in `results.json`). +- **Timing.** This table is a rerun. The first attempt (started 00:02:15Z from `run.sh`, which waits up to 10 minutes for the 1-minute load to reach 8 or less) began at load `{ 7.18 6.93 5.56 }`, but unrelated jobs pushed it to `{ 21.30 11.57 7.66 }` by the end, and its timings were skewed (openpyxl 60770 ms against 1300 to 3000 ms for the rest). Its verdicts were identical to the table above; it was discarded only for timing. The rerun started at 00:24:57Z once the 1-minute load was back at or below 8 on this 18-core host: `{ 7.61 14.14 13.53 }` before and `{ 6.81 13.53 13.32 }` after. The host was not idle (5-minute average about 14), so read the wall times as a rough ordering: aspose-cells-foss 750 ms, wolfxl 780 ms, sheetjs 800 ms, openpyxl 860 ms, zavora-xlsx 1240 ms, LibreOffice 1660 ms. Differences of a few tens of milliseconds are within noise. Do not compare these timings with 2026-10-02, which ran under much heavier load. Peak RSS is 167 to 170 MB for every engine except LibreOffice (264 MB). +- `apache-poi` and `excelize` are not in this lane: their ExcelBench helpers are write-only (no open-existing-workbook operation), and the suite times each engine in a local `/usr/bin/time -l` subprocess, which a remote container cannot provide. + +Command: `excelbench mutation -o results-2026-10-03/mutation --repeats 3` (rerun with the same command after a load gate of 8.0). diff --git a/results-2026-10-03/mutation/aspose-cells-foss/repeat-1-input.xlsx b/results-2026-10-03/mutation/aspose-cells-foss/repeat-1-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 S000cocNQp=$-w&SzyAl!Ul_&! literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/aspose-cells-foss/repeat-2-input.xlsx b/results-2026-10-03/mutation/aspose-cells-foss/repeat-2-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 S000cocNQp=$-w&SzyAl!Ul_&! literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/aspose-cells-foss/repeat-3-input.xlsx b/results-2026-10-03/mutation/aspose-cells-foss/repeat-3-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 S000cocNQp=$-w&SzyAlbsu=J9 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/exceljs/repeat-1-input.xlsx b/results-2026-10-03/mutation/exceljs/repeat-1-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 B#-jiL literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/libreoffice/repeat-2-input.xlsx b/results-2026-10-03/mutation/libreoffice/repeat-2-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/libreoffice/repeat-3-input.xlsx b/results-2026-10-03/mutation/libreoffice/repeat-3-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/openpyxl/repeat-1-input.xlsx b/results-2026-10-03/mutation/openpyxl/repeat-1-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/openpyxl/repeat-2-input.xlsx b/results-2026-10-03/mutation/openpyxl/repeat-2-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/openpyxl/repeat-3-input.xlsx b/results-2026-10-03/mutation/openpyxl/repeat-3-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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\", line 9, in \n engine.mutate(Path(template), Path(output), json.loads(mutations))\n ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/src/excelbench/modifiable.py\", line 223, in mutate\n self._adapter().mutate_file(template, output, mutations)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/src/excelbench/harness/adapters/json_model_adapter.py\", line 545, in mutate_file\n cls.call_helper(\n ~~~~~~~~~~~~~~~^\n \"mutate\",\n ^^^^^^^^^\n ...<2 lines>...\n output_path=output,\n ^^^^^^^^^^^^^^^^^^^\n )\n ^\n File \"/src/excelbench/harness/adapters/json_model_adapter.py\", line 215, in call_helper\n raise HelperError(f\"{tool.name} {operation} failed: {message}\")\nexcelbench.harness.adapters.json_model_adapter.HelperError: exceljs mutate failed: Cannot read properties of undefined (reading 'anchors')\n 1.45 real 0.90 user 0.27 sys\n 171589632 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 34091 page reclaims\n 4 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 0 messages sent\n 0 messages received\n 0 signals received\n 807 voluntary context switches\n 3245 involuntary context switches\n 5970234356 instructions retired\n 3822258271 cycles elapsed\n 132039448 peak memory footprint" + }, + "edits_applied": null, + "feature_preservation": null, + "features_changed": null, + "features_present": null, + "peak_rss_kb_median": null, + "preserved": null, + "status": "failed", + "verdict": "Failed", + "wall_ms_median": null + }, + "libreoffice": { + "available": true, + "details": { + "diagnostics": { + "added_parts": [ + "docProps/custom.xml", + "xl/charts/_rels/chart1.xml.rels", + "xl/charts/_rels/chart2.xml.rels", + "xl/charts/colors1.xml", + "xl/charts/colors2.xml", + "xl/charts/style1.xml", + "xl/charts/style2.xml", + "xl/comments1.xml", + "xl/drawings/vmlDrawing1.vml", + "xl/sharedStrings.xml" + ], + "element_changes": [ + { + "element": "pageSetup", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": false, + "present_in_output": true + }, + { + "element": "headerFooter", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": false, + "present_in_output": true + }, + { + "element": "pageSetup", + "part": "xl/worksheets/sheet2.xml", + "present_in_original": false, + "present_in_output": true + }, + { + "element": "headerFooter", + "part": "xl/worksheets/sheet2.xml", + "present_in_original": false, + "present_in_output": true + } + ], + "lost_parts": [ + "xl/comments/comment1.xml", + "xl/drawings/commentsDrawing1.vml" + ] + }, + "edits": [ + { + "actual": { + "type": "s", + "value": "MUTATED-libreoffice" + }, + "applied": true, + "cell": "B2", + "expected": { + "type": "s", + "value": "MUTATED-libreoffice" + }, + "sheet": "Inputs" + }, + { + "actual": { + "type": "n", + "value": 1337.0 + }, + "applied": true, + "cell": "C3", + "expected": { + "type": "n", + "value": 1337.0 + }, + "sheet": "Inputs" + } + ], + "integrity": { + "dangling_rels": [], + "missing_content_types": [] + }, + "sample": [ + { + "after": "Cambria", + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/A1/font/name" + }, + { + "after": 11.0, + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/A1/font/size" + }, + { + "after": "Cambria", + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/B1/font/name" + }, + { + "after": 11.0, + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/B1/font/size" + }, + { + "after": "Cambria", + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/C1/font/name" + }, + { + "after": 11.0, + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/C1/font/size" + }, + { + "after": "Cambria", + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/D1/font/name" + }, + { + "after": 11.0, + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/D1/font/size" + }, + { + "after": "Cambria", + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/E1/font/name" + }, + { + "after": 11.0, + "before": null, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/sheets/Inputs/E1/font/size" + } + ] + }, + "edits_applied": true, + "feature_preservation": "15/17", + "features_changed": { + "cell_styles": 16, + "page_setup": 5 + }, + "features_present": [ + "workbook", + "defined_names", + "cells", + "formulas", + "cell_styles", + "columns", + "views", + "data_validations", + "conditional_formats", + "hyperlinks", + "comments", + "protection", + "page_setup", + "charts", + "tables", + "theme", + "custom_xml" + ], + "peak_rss_kb_median": 264352.0, + "preserved": false, + "status": "passed", + "verdict": "Changed cell_styles, page_setup", + "wall_ms_median": 1660.0 + }, + "openpyxl": { + "available": true, + "details": { + "diagnostics": { + "added_parts": [], + "element_changes": [], + "lost_parts": [ + "customXml/_rels/item1.xml.rels", + "customXml/item1.xml", + "customXml/itemProps1.xml" + ] + }, + "edits": [ + { + "actual": { + "type": "s", + "value": "MUTATED-openpyxl" + }, + "applied": true, + "cell": "B2", + "expected": { + "type": "s", + "value": "MUTATED-openpyxl" + }, + "sheet": "Inputs" + }, + { + "actual": { + "type": "n", + "value": 1337.0 + }, + "applied": true, + "cell": "C3", + "expected": { + "type": "n", + "value": 1337.0 + }, + "sheet": "Inputs" + } + ], + "integrity": { + "dangling_rels": [], + "missing_content_types": [] + }, + "sample": [ + { + "after": null, + "before": { + "count": 1, + "item_id": "{11111111-2222-3333-4444-555555555555}", + "schemas": [], + "xml": "openpyxl-targeted-fixture" + }, + "feature": "custom_xml", + "kind": "missing", + "path": "/custom_xml/923316dfc82cc7cb" + } + ] + }, + "edits_applied": true, + "feature_preservation": "16/17", + "features_changed": { + "custom_xml": 1 + }, + "features_present": [ + "workbook", + "defined_names", + "cells", + "formulas", + "cell_styles", + "columns", + "views", + "data_validations", + "conditional_formats", + "hyperlinks", + "comments", + "protection", + "page_setup", + "charts", + "tables", + "theme", + "custom_xml" + ], + "peak_rss_kb_median": 167968.0, + "preserved": false, + "status": "passed", + "verdict": "Changed custom_xml", + "wall_ms_median": 860.0 + }, + "sheetjs": { + "available": true, + "details": { + "diagnostics": { + "added_parts": [ + "xl/comments1.xml", + "xl/drawings/vmlDrawing1.vml", + "xl/metadata.xml" + ], + "element_changes": [ + { + "element": "tableParts", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "dataValidations", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "conditionalFormatting", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "sheetPr", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "pane", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "sheetProtection", + "part": "xl/worksheets/sheet2.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "sheetPr", + "part": "xl/worksheets/sheet2.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "pane", + "part": "xl/worksheets/sheet2.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "pageSetup", + "part": "xl/worksheets/sheet3.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "headerFooter", + "part": "xl/worksheets/sheet3.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "sheetPr", + "part": "xl/worksheets/sheet3.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "pane", + "part": "xl/worksheets/sheet3.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "drawing", + "part": "xl/worksheets/sheet3.xml", + "present_in_original": true, + "present_in_output": false + } + ], + "lost_parts": [ + "customXml/_rels/item1.xml.rels", + "customXml/item1.xml", + "customXml/itemProps1.xml", + "xl/charts/chart1.xml", + "xl/charts/chart2.xml", + "xl/comments/comment1.xml", + "xl/drawings/_rels/drawing1.xml.rels", + "xl/drawings/commentsDrawing1.vml", + "xl/drawings/drawing1.xml", + "xl/tables/table1.xml", + "xl/worksheets/_rels/sheet3.xml.rels" + ] + }, + "edits": [ + { + "actual": { + "type": "s", + "value": "MUTATED-sheetjs" + }, + "applied": true, + "cell": "B2", + "expected": { + "type": "s", + "value": "MUTATED-sheetjs" + }, + "sheet": "Inputs" + }, + { + "actual": { + "type": "n", + "value": 1337.0 + }, + "applied": true, + "cell": "C3", + "expected": { + "type": "n", + "value": 1337.0 + }, + "sheet": "Inputs" + } + ], + "integrity": { + "dangling_rels": [], + "missing_content_types": [] + }, + "sample": [ + { + "after": 12.0, + "before": 11.0, + "feature": "cell_styles", + "kind": "changed", + "path": "/cell_styles/default/font/size" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/A1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/B1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/C1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/D1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/E1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/F1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/G1" + }, + { + "after": null, + "before": { + "alignment": { + "horizontal": "general", + "indent": 0, + "justify_last_line": false, + "reading_order": 0, + "shrink_to_fit": false, + "text_rotation": 0, + "vertical": "bottom", + "wrap_text": false + }, + "border": { + "bottom": { + "style": "none" + }, + "left": { + "style": "none" + }, + "right": { + "style": "none" + }, + "top": { + "style": "none" + } + }, + "fill": { + "fg": "1F4E78", + "pattern": "solid" + }, + "font": { + "bold": true, + "color": "FFFFFF", + "italic": false, + "name": null, + "size": null, + "strike": false, + "underline": "none", + "vert_align": "baseline" + }, + "number_format": "General", + "protection": { + "hidden": false, + "locked": true + } + }, + "feature": "cell_styles", + "kind": "missing", + "path": "/cell_styles/sheets/Inputs/H1" + }, + { + "after": null, + "before": { + "cols": 1, + "rows": 1 + }, + "feature": "views", + "kind": "missing", + "path": "/views/Inputs/freeze" + } + ] + }, + "edits_applied": true, + "feature_preservation": "8/17", + "features_changed": { + "cell_styles": 9, + "charts": 2, + "conditional_formats": 2, + "custom_xml": 1, + "data_validations": 2, + "page_setup": 2, + "protection": 1, + "tables": 1, + "views": 3 + }, + "features_present": [ + "workbook", + "defined_names", + "cells", + "formulas", + "cell_styles", + "columns", + "views", + "data_validations", + "conditional_formats", + "hyperlinks", + "comments", + "protection", + "page_setup", + "charts", + "tables", + "theme", + "custom_xml" + ], + "peak_rss_kb_median": 167136.0, + "preserved": false, + "status": "passed", + "verdict": "Changed cell_styles, views, data_validations, conditional_formats, protection, page_setup, charts, tables, custom_xml", + "wall_ms_median": 800.0 + }, + "wolfxl": { + "available": true, + "details": { + "diagnostics": { + "added_parts": [ + "xl/calcChain.xml" + ], + "element_changes": [], + "lost_parts": [] + }, + "edits": [ + { + "actual": { + "type": "s", + "value": "MUTATED-wolfxl" + }, + "applied": true, + "cell": "B2", + "expected": { + "type": "s", + "value": "MUTATED-wolfxl" + }, + "sheet": "Inputs" + }, + { + "actual": { + "type": "n", + "value": 1337.0 + }, + "applied": true, + "cell": "C3", + "expected": { + "type": "n", + "value": 1337.0 + }, + "sheet": "Inputs" + } + ], + "integrity": { + "dangling_rels": [], + "missing_content_types": [] + }, + "sample": [] + }, + "edits_applied": true, + "feature_preservation": "17/17", + "features_changed": {}, + "features_present": [ + "workbook", + "defined_names", + "cells", + "formulas", + "cell_styles", + "columns", + "views", + "data_validations", + "conditional_formats", + "hyperlinks", + "comments", + "protection", + "page_setup", + "charts", + "tables", + "theme", + "custom_xml" + ], + "peak_rss_kb_median": 170032.0, + "preserved": true, + "status": "passed", + "verdict": "Preserved", + "wall_ms_median": 780.0 + }, + "zavora-xlsx": { + "available": true, + "details": { + "diagnostics": { + "added_parts": [ + "xl/sharedStrings.xml" + ], + "element_changes": [ + { + "element": "tableParts", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + }, + { + "element": "sheetPr", + "part": "xl/worksheets/sheet1.xml", + "present_in_original": true, + "present_in_output": false + } + ], + "lost_parts": [ + "xl/worksheets/_rels/sheet3.xml.rels" + ] + }, + "edits": [ + { + "actual": { + "type": "s", + "value": "MUTATED-zavora-xlsx" + }, + "applied": true, + "cell": "B2", + "expected": { + "type": "s", + "value": "MUTATED-zavora-xlsx" + }, + "sheet": "Inputs" + }, + { + "actual": { + "type": "n", + "value": 1337.0 + }, + "applied": true, + "cell": "C3", + "expected": { + "type": "n", + "value": 1337.0 + }, + "sheet": "Inputs" + } + ], + "integrity": { + "dangling_rels": [], + "missing_content_types": [] + }, + "sample": [ + { + "after": "", + "before": "Driver", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A1/value" + }, + { + "after": "", + "before": "Input 09", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A10/value" + }, + { + "after": "", + "before": "Input 10", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A11/value" + }, + { + "after": "", + "before": "Input 11", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A12/value" + }, + { + "after": "", + "before": "Input 12", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A13/value" + }, + { + "after": "", + "before": "Input 13", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A14/value" + }, + { + "after": "", + "before": "Input 14", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A15/value" + }, + { + "after": "", + "before": "Input 15", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A16/value" + }, + { + "after": "", + "before": "Input 16", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A17/value" + }, + { + "after": "", + "before": "Input 17", + "feature": "cells", + "kind": "changed", + "path": "/cells/Inputs/A18/value" + } + ] + }, + "edits_applied": true, + "feature_preservation": "8/17", + "features_changed": { + "cell_styles": 17, + "cells": 48, + "charts": 2, + "comments": 1, + "conditional_formats": 2, + "custom_xml": 1, + "data_validations": 2, + "tables": 1, + "theme": 1 + }, + "features_present": [ + "workbook", + "defined_names", + "cells", + "formulas", + "cell_styles", + "columns", + "views", + "data_validations", + "conditional_formats", + "hyperlinks", + "comments", + "protection", + "page_setup", + "charts", + "tables", + "theme", + "custom_xml" + ], + "peak_rss_kb_median": 167184.0, + "preserved": false, + "status": "passed", + "verdict": "Changed cells, cell_styles, data_validations, conditional_formats, comments, charts, tables, theme, custom_xml", + "wall_ms_median": 1240.0 + } + }, + "metadata": { + "platform": "Darwin", + "repeats": 3, + "template_sha256": "da08cc9e607f267b438ec7ce2480d6eb3650d1c19928f283a18296a2b79d808e", + "timestamp": "2026-10-03T00:25:19Z" + } +} diff --git a/results-2026-10-03/mutation/sheetjs/repeat-1-input.xlsx b/results-2026-10-03/mutation/sheetjs/repeat-1-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 bp!~xHQIvrMnyz0<92^jP;5Q@gUswMRy5$BB literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/wolfxl/repeat-2-input.xlsx b/results-2026-10-03/mutation/wolfxl/repeat-2-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 aA1;W3^c$e*`nANt2C)TxGvxer_5T3F>IM-2 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/wolfxl/repeat-3-input.xlsx b/results-2026-10-03/mutation/wolfxl/repeat-3-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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 aA1;W3^c$e*`nANt2C)TxGvxer_5T3F>IM-2 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/zavora-xlsx/repeat-1-input.xlsx b/results-2026-10-03/mutation/zavora-xlsx/repeat-1-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 zcmaKT1wb6jvNrDS?(XgqAV6?;x8Uv?EChFVhXi+bch|*&Cb$F*@^5nPyE%vdyvNcr zJF{KibahwPRCiS=%78;)fPjF&01K%uva+XK0VoKFGw>1}ct=Of-p<9$&c#60)4|MH zkIBQ(8HvV`7EQF25xiOy8cKbsg+qM@`F;)gSuQ@W@`fF*<{Z^TshvSVtoBY$j7P!F{O#BX_YU5ehd zsObj_hM=g$32~y>lbVH{4i0<<);`0N44?s5wFmLg(!E4JVlWj-Z!R>PzMM}syZ(UC z(hW(uFPnmX6e8^{jg3ATYx!7z*TFcHGM_r(WQU0QLsgRMWpB79_UHvonS&h;kn*+B z2kiRBR9wds=?P;NoiOVLpXiTMT8 z<-(Vz_70u(1w`>5V~S_l0`e0$mLp&wAn?Gmfs>hyGc(h#V@3S$u?%td`?yD`vQtPB zteC*WuueB0u&|ucFMV8hECc&ObR~C3Q)>KU-8&|yu3cNf&CnZWCbz7XjhPKfK98%i zqBbslK)kV1L4AqkopjtXF0od+W6d^UTo(q}7o_q?UN48wbB5LNv#j;KG7Do^{k1fc z;&;Pa*O4P`w?xmP{l%Ecs6l$cCokBw6$UW ztG6s&%xqbIN&oL|i;5A1?`1&=xqS}bam!c~c`Mr%IxSZiX#K9rw)&n#O8lim1REYH z+Wl<(>iqQRQ}&j;5RElYvS+{>iBGQT=)kA z38W%obtI`MJFd0+IUWLdN$rhE8kxcouQn0N+591~(xVIPThUa&riBQf3aWjpCO3+U2&9_3i@5Br&DBmdvu7hn3YDziD^8Vs~#jxHAaIW)radn&yAl z{V$_xQF3s7BpAWB*`jOs8G5LkZJ8v3Z$hV3J=B!u(g97e&(nK8KI{b{Zem`abbS!g zuh+wrU}Wlr%G33V<8oFEL%rU*AetRY+JpM8e=oxh7ifOJq^%MsO3>2RJWjI)Fbh$9 zNTYEagHKH*DeNGva@Nla+?#A_HB;O+pfEV+=T`Wq82{L<@-G3lbqiQ<{=YUWI@voo z{~jT|=rOn;78LPYKk;E9iIX5Q32tQv9qn&i{Yv0eaTLj--@DwU+h_zcj840=R5;z) z6Y%eHvoJXn*rmJamaO^Vym*OM0=Qh2uk()05=r@x^&rGprg_@brzM|1V!{AOY$B@H zkrmQW0=pQnAVo@WQsS?2saV(w?LZ@jdOXR=EB$uuaOwjWKQH)4wGY<{YS6=_mZe!n z+1h_r=z$ICo{4|4US$3!a}q;x?~;H_O#llDu$bDL{N{++$id;4*vU=F0VNIrYO71x zttl;>s1WI`V0d=>6qD=6Mq1n8hqDt1VLMOHVf=iiFfyvfRPhU@U0ZgxA;dR}j9B9c*upsMBsh-woCpWSrK@~x0|ZJ&ofDwyG|vGy4Uh4QT1(Wa`4qq z6PK+Kz@Z#?Q3^$%%kZYqL%u|)jA5!|?~mF)nnHF#w_^X3g%LK_*dt)m>49nn_3td0 z*gKj1;$b3w%BqhAVbH+rE_+xi4?1DLwpIl`2$Rc=y>T^t;6pWMeCHEEl^iYr9Kj{- z$M+J2TzSYmpZ`EvgQdu*js^%ZZCJJKImF0I}167GHgQuN3 zp&}?6C}7#E;o#%0v(!b!6L)tos}=&0a~x?{DnOv?ztM=OaCbj=nl#IbLA!S&kVkU) zVk{bQ(fP_#=p@OR6t%kyDvM?Ce?4{8-{6wMYRu1O~9epsl zf6|C7pmvML=Tuy`a2o8yr@`W^>jYQSH(?%8!~1k!tXiBRAgL0N>`6}_+3K^`D*0p)-n z0R-fiaRKDm#KOqQ#rdz(?|HhOA{Vm?RH83%;`ApKP;OuSYvb;UKP}9ze-T8k0cVOP zjFQWEy1kb4N2`ys;N3$@Nb@w`@Z2)YH-)#@aC)a%HXJ;!a8ki~AB&P@qXqR)H=0(T zrfLK=*ts2|7`&-#$0p*HHR*qcb;5ILPJn9%Q74HiIhXuHb04NmN0!wX=JyVXX|+KD38;u~@js*{)~b0C_A z$`)F{xkYhaol{Jp)AdH60iALU4`21?8XkR+an%Wngq}1zzyBOrAsFr|?HkG4@`fOu5HCVHZ0xGy$_F_+b+U*y<=6)4Ymzg)1M) zTS)74{|8bPI$4VNRDZ52oCK7w$mou}QdM)`(KYfI^uxMj9%eAZP=VkIZDIrSTCUVclqOV$dzm zZAAJ~K<%A~p7%9?)LR%dbtJ;piK`j#)z;pSXx-TVC&4yG@eOxvTvF7enY;+Wh)U)< z+N2%kq+?K>ex?aMzJY(8M(;{lFR!J;VuZ7?SpvMnMvB9R#@9?Po}&TYhT89tJjBvG z#9tgH@iMQsGqqNZ!7^hgGh@_v4iG23949Mm{6HuDV9mSW4)S}nm?u9bG157T-mo(~ z547rxT(kj5ByS0w*I4+MN&-c1Hh z)ZzBgB9Ol@VdSb>rDkdF(LbY!hab*C!7aV7vU%1%Js1|{r*f@uTTA;0R7Tf@H7zx# zOF^jPyqF>x&pq=IEZl2VM^eM8eA^^kR+^>8@2)O(ZAO-sz+PUxuIKl|D=1C1!4p(s&><^)pW@>O)!KM-C78FkK5W%V&O%{a!M zq~dgg`|7=rS-~w%YX5%9n=F^{?_h5h^SE8YVZ~MuSiSow_fcugI0Sj$-oV$(IYZeO zlQgi=x21ju@!e!#;zn4cU6zE#u(bD+@9!dEL&|DzR8~Eiaj%UF%#_m9q93dvsP?O{ z@dy{G9wD#2>lf%U$sE9#9i@gG2&C(KepYC>eplG_&soLN1~r@r*SDSF)hV)3>l%+~ut{q-vC!kmSB%qH;yY*hHBde1Y&=X|)o>mhKJ5Cr!=6WR^;iB3I`^ z*zN1(y{sv@I+7~wa@Fi+jn@+jFcqw z*3+ox!qq6@SoOwB%o#)U%s9?FgG{b3a~6=}G+tQo52XbVTRvnrkITd@yzOwigG-`` z00?y9Y#PZbG@#Z+P)_V4$IY4Z04I=dMyH-QE~*7RX`d%K)A!p}NZk$djGAE5=s zddaiQQC|$+O2}x~drb!%~yq$KhBy#e~|q+E`kS5WbM%2i_D|_7a@L;RbT)py$~B zDay_>UVinx17Tpj)ukQq(zl?P)4P>@-rR0@Rd(&=3Hrih+7oH8;=xfHE(5shZzgJUOdMHCX4LF4rfx8%pe@$U$7f%~A=U=b+b@iU; z3>K6p%zo%Z5Jp6`;k?o~x`qYmwom$UEdB8{pIPZ=tEz^mVr>M<++rx8 zQ(@&eD4wUVb|Pw$J+`_F$FiXoLgdhZ0WwHXp5Pkd;i0iXHpuRL90lW%P)!boqLw zgU?FdQR^5WC&n@vm0BASD zmgO&W!MCUISuWQMY#ESPs_6_nz%QO0b4wmGIX-?dUadxtB=?LaosM`WnqZ^g$Mt!< z?va;D-)|uX9j_vhV}+0>k2ZvR10GWN*_XG|gIGM}R<-{5)5gmy8Ae)&p@9V|3{#*S z|Hoo=F){|qF!S%z?>DM#oUc4^p*&Efya!Tv)M_VdO{vNe0P&862}M0cVl)LUr3R4D zKt9d*VgG5Pj?g>kSnN%2M*R4@{M6w1`Bgky+};87#+XigvpjL*8XrLdrIh4J zn4Z*gCx88#KR%atyo99UT$jif;(zMeG~G;c6etjoOzOWjt$;?Ci-no3*ZSEo$I-$FtYFFg!bm;sAzP0Slx8f+A(A}qKiRp;GsMY8%0+Lj=F zJia67Xnkve5il|y7-NgNTRM2mE?6Of07e9y6VDVi?_9N;la~5HXGqU0I{Xi zmff56!=|fH1h&4wa@utHX0?^qV15<5p;XqXLqZ{|oqG#%U)$7jKl^=Thm6Y*9E+tx*N z&oxhZ!%&|G2Ot(LXK|A`B%HEhA(241`)6boeX2wn!?$|lXLVy2r)V1#@nF)21Fj_l zNe9-do~~2cMhe-zvV8d_trI_3mVuU>v}H^sJUV~d%_&J(k`tYDXlH=E_(`r~^oiPz zAKi(Mz+BX4>gFb{h>~sU>>ln&Ucj7KJ-J$MYHBw-(uurn{YKOGMnTe!eCcy{9obT% z1ci9cFk|a3Do=wHA{)9eOjby$l_CLHAuMZhUdUbjU^(g*x^Gh_%b^Nh_;=pu=k8@2Yef)q_m&=j0ajxU@H1B)I>-4_*^0)*&j6N&Ip zA|WXhRA`@h{p8-EKhqbjK4;FoIZtG!c#w{Zv8*F6aiN;{#*Wt`QHAgN$zoQ(>lyMs zlM{|04xbRr9KTM2G}yB3oT!Q-I=!M7m0ncH7?%srsR1jX(eZPzp*Gs!jEDSeJ?f)Y zIcI{9;qdW9oa^Lb91?20J~y!LWJD}#7f}e0boxoYqb9^twtk;f&$qy__fO4!Aq(s_ z4AHle^Vrh6$W$f5-`O~z3(~bi!wN-kRk{`OH&Y!-*fG^PGwyJ-Y*Bo> z?<&{QNlSZGEi}ynI=kPi@?3-%rtSp{4(cc1*~OZiWDXk>I~%BYq<_?mJIE7_A@G|E z#1l5U=Mr-MywP*pB`;!8NfB$t6YT`IZOvNax6Qi((c+t` zVSBJVGxPJHN2$8tOdy$XDD*O)^fWIdb*fM7lc%>qs(I3&A_s=8O*sXFM3Z6j(gg#? zmZ>3QE_6_p64<4(njx#sAUJ(&zK?9A_&0}x6kUUznfM(*u~~y%6|Fn2EtxWJuVpH_ zdD-ZOSxt``;gp)rWp$^OU_GY%)U#H_a1H{hJQh6KJCj80V(I)VT$RoPdZ~Ujo-T3r zMzj>1_MQD9M|qWIG`B`%Ft(O9-p^iUtmeg+n~Vss3_77&XxnmnCkqD|nU!8-ZVxH$ zJ%*Q04kMDtd;A9mKlH>Z{chHG9_$kM-^pfr4xoa%h=Y+Q5kO&Kv+XLL#>YaTgH9xl zygdgCG%Y6ZPkn&zxI}27#hk1V;{71b5ELS>KTC;*5nhb|Ns8^Xb9R? ztjcD(fITV})+5O7B(|(dc~!Ye1^*GStvb<$*GXk4)8}QE#Yp`E(4QBq#}<^hDoEQR zs{7=e;nmzLUjCxFNOaG($?E{%+W^2q4LL zTm%%}tZyOs%$I2wnbM;Q%Ru`O$3vM!>ipm^h`}(fD6Xj(TxCV@^w+#X$a~MT`AIw- zk9{GcoHq*2US#3To-kk@(c%V?gCGu4pEa$Kt6*0iPGIf%46(YmKlY98eyi*`%#-ZUl!cll@@50)Bw8I71$uG-4cPXR`JqeNTx9ed92&{new z>T}v<-z~}Zzk#z#KFvj)sfm6>8kGUiQHY`zIXN*PLP!W=t~;ya$jF-7A0f-m z{E5HYE2AKNb=;ghiOyOqVB=#1NEd--)ql1uehsa& zg_#*}OXe>h-tUV)TNVxRg7&|hcrVhsSp+ODr7-A(IIXIW0cFlo439-uB7I#|N-z}4 zpO{vB&W^l)3}2o`FoeSjxl$G9yDyeVyOLcHl6;RQC}w+m*ZLOXnMb~79 zv~vn8Au@W-L9dg%hBZCECEsdZSJBVdJ;R%*+gJNL?zdzgqkx@t z1uXw(XR-g+F%dPz4+nJmLrj;23i>a}$B_+J&Nd@v z!?Xw-2#6>5f0y8Y8~Q(k-jJc^T)=}B@)90#^tp!eVy}`y&7?Z7thmgp&E32zjB!ZS zWM_av{${D_F7)f(J87o(_GlSHY}+LI!Z6Kk$qQ9uBBNe6UJUXn-Uo_H2h3OZX5O(w z$Cuuo$<*REX0GE_*NtB329rtSZngy`tOpSvg@xbWk9am)r}$P8osJ%~4l7)GbG8W( z$7o$Q#*2G)xTjuqZb?47lx9F)eQI;Qq4+TRU~q7ja02JVHI|Lsax_h@GS;C!#|(mLh%K^Sb?(J z?0&KVud?6rZ4B7tJ{Ja%e8Y#xu|>H->~%YHYb#h!aa1=)c31PvQky7QXyRmE1)V`$ z^QIQ&{IoRHs?4Era`>rPS*)ZrW9hIho$|_d)6UHP7P;6G-FG^~dbOXp9yOio2zj+R zoht)*)gzs21lra|F5^cK7ieQz*^?{4^09HQIq!aH?!G0P(PhBE)izzg*K;eP?S9N- zDl#v%+XG=8RyQV(J0OGg2Q>?BpCQ;BD*`mkHA<5gjJKc*xHTn%4koP3kV)Q|jz$ct zX@sSSzx=Hzn9FJjMyY*in0Hy2bye7Dw^mE?MD(BoZ$+3jpqf*WP1;``K0T7wd@div z6;b@cPW<9ne1@`bwC?zHxX#x77}rfp0~0xV*iucPFWFTMlCWU>KNKL;4z*N&i0cB!D`3@U;W92oCV+<;v2{8EbFzb zXIp!cnI*GKDgD@NGV;tU7twanSDdraS`LKkN(PxeqF-NaJT#J7ujRtVu!0Pkjz4Ny zoj4isE0cBm&>^!LI&qYPwwaED+`PL4yD6zn1VfTt8Iu6BbLy!Sn)sUg8M#i}0wOh7 z93eF_n$s`_fv8(3%&@x$qr_iK1*WdYHBHYgP2CN5nQ6qRI}nE1FolBEFeaL~T0efk zADpZcSPQSN$2U#SFHPMqt=dcmB9-6`t6@B`HI)sxDL4;F9s&;q7J`RmxEYrROI-xZ zTsRAO6~zdGCJHXpahwg*@!SRbAgGjiw+vao|4J{;bPzgw8wPs?278&mg#QS#JwobZ ze>rFZ%nAqrC^rz6OK1fLNeRVrkKys=x^ZjFcYAT>gWj;WiLh6QuumJ}&2QEA=Yb~V z?`4%Ar7FS|8Y@B*n>P&gJleY5S;$gXR zURU@7g0if6Y>(G>0yYcAEb)Csa=z&1YenhUHWxnJW_vgrAq&nXYtAJrPH0xD0L0Wx z+mGSf5lRE+#v2(YnbhQz}QgfmL z4qHh&t07OyaRfxByfiuWfhX)`tOb`tCrj~7?#f!_if-8ofk1jOS18+zO?1Aj3BGu0 zG{u%sl=L!Qe8{+YEqshP8Nxj`>IO?%i8KC|QNl#o_P4oKEq)uuk!wv<`Od ziZoCQSZ)jZ+6!1)vlLCBpWZe=j*WF3hu9-v}OkS4*baF)g zT^xQDOL$My$MvRzVkBg|dzbVkJxrWp zc!XCZe9Z$=8DW<3c$Tq#mT_=ZT9*=yr$e?JpSJ@lEK}Yd{9qT(F>sB15!gUNWrRh> z<3+~$MMlHG^bl?<&KbMiAJP;~e0_|H8J1q))WS@(4o2-b-;q{NRvUCI8UP=8t>QPB zyf`m_6`g<;M^5s&6Mje#p`1Z6MQTv2_q6G?xwmPbxmC=~$5~?^Epy7V->Rjr#fyG1 z#W?7c?v{E{-U`%D%8WU6+DtCd+YmsG!(1mvaP{-@`fzSE0Du;nFS!xUhUYEYoV?sv z8O^`*a(sV4$6VI#XMHxqG*vr#s9f>;qA40z07NbTbFSGTYFTsn!qf`%~7T z`p@+_*F+NLTjKm%!8kW>V>jN!rDnP*M^8acGh6I>vHOg6-CAl-o#x6fwRp_q;rZ>A;m1G9 z+CFzOio_Wl8f{iXA52|70JvMma$>rQ?&o@1PH2l8p?#)Hv7@zFdq}H6UKH!isfg7D zJ!(>R>X?5jrSv?`8OfDE(YHe)mCN{L_-PU|^YkQBapTy~F5q0V$gnc6Umj0%bHS8YuPQNp=8G)hk zsMsSfCQ+CZxdMlAPz`A>ZBcK;s-S2n>i%Q7)Alf|;Dv_NCjZ__Y|iEQav6b-ppEQU zqRi6#-Nmx1Sy$QxtDw`OPl04-fm#D=L6Iefw|?ggG^>e;5c}jxi*O+i8*_6gq0SA^ zoAO+r4~7M8?WN7YnVat3C+$T2c;cG#6{Ihq^PSp@eiwkCVc1?JM;Nlu*Dv_&AiscL z{Yj7L&e8;`*fDo#TlwPbSg=In;Pe{{lShqS)A71RQNoEAGx6?5AiZ^3pX5fk2QAk& zK+=&GDJ2~5HnC~XuVZVQ;c~(FLl&Nq$_oje*QZ$-M8bmliahj0Hx8HZ*~*Yf#nriK zUg@8)`k`+lS2UwnG$+maW?Q0m!G=zjT3gOfQ{K_=*)7?Fd8nX+HnlbG1Vzebd_vL80{*JjM?%9EXp^8hkx%s2ijX0zDTn zLok`L4s5-!U?u38(GKC=D-h=7nWPRvJ@+sNO)T#M*o(W<;s?dU^3B|AI#7oDO9xK^`M+wD`>AH&imE1WFC-D}Zh9YzgG1?}W zSi<#8uyF=XtKcJzv6mnvYVeQ13YOJe17_0r52GYHvI(g;`|H*z_^-Nn zkrF{#1)Y-?AdwHDGaxwPr92=KsC2OYO2N|Lh8TIZzitVDNZ8XFau7s?)JcG6&7j~Q zq7;wZ*{@rkFp(R|-841DqP^*^cvfXF@b3^&Kf_T~kZG11D$@s2 z!cldQX?`(OW(YKcqnaSotTa?UVT4+s<6O0glVGUO2AfBNcb4(jiHyLMA023Z`?XLn zQU+80aG+WCYoS5p7^XbjqQmsLs(ai@Z-fOrb8T=4?0XMbL~`A7hYq7)8H`HqNQck8 z*CD7(D$N@#y?by=_?>&XUq2I&*InbxESmI(gruYz;p0g(r!G&k^il$^QJE;YI3gWz zYx0bO$HEX1H=TeFu#H=Bim(`C1Uq63#MFgQ*Tum`*K{`06*XM==tvvjialrsp{|dU zg0AUp+1zt3YMG(;GcnSD-%HH?3?I-n8)UQXS_|nJCA6^cvg72o8EQK90%IJS>?*0V zQhxNH(Z}*)VL^{}#|IGsZ*HmOxQc|hAXpL6XxaxRR^T@DWvqqhJctLR#L84tEsA3g zf9C_%6sFoiJ^y%^&N5ihvsvI4>Icr8m7TX9t|9Pt~GuwH; z7N+NbLE%E?7+YMITRRH&W;URS(BNuEs)0YVyDWix)A_o>FV1Th!CdMpUPF$FPUdpF zNq916r9ERh?2NaI!yTahQ%V2h-3*dYQKw)XKt*Hip`|LKy)E_n$X6xoK_UBdEcQqH zGpxoW0@de1gC7W+ewfl>wQW+qV{}Sh22=xG?T3|9@Rc>4HLY_Gs)FLt*XCALrb1pF z@*lvT5PfY_o}8c7Zeoj`Y;FNfAobott+&>*=ZY8~4nFhU-z+vNXHy=C`eI@aR!wM# ziN%*voEJ80*4mQ&)m6rCVUGGcjZ^W8) z0xRj;=?zIIVGJS6Q4LWiX$&#USq)hyaSUyGCG>JaDivZ{jSZI8(Z970wt-=7M}kN= zV1Z(NjRcc$!~)0Ki3A;_vYB_~bkP$$41Y2PRJ>V2+`z0xF^6CYtb?hBF~?vDufwUv zF-KtGGAgJ%$~$^c(l}P=wnJ>SyQuX4$V2Xrnknut&Qsv8lsVu(z+>WH1B>svj-ba4 zeDDVbcl_yvf&b&d{4VQ4hpj!Wb|Opn2*~id77h?R#tx_saXm^~r9A`P15iW$CMw*c zM@XLQlAcYP`q=wfJDz%}*zWxwJsq)ISeQ>s;jgxt+>G?sSb@JaD{b5#``WU4V=Rkf zW3g*`1Yn1-aJ&H{W$lLP9R{Hdo(D03F#$J4sih@w@6_oN)b4NCgekltaMQ=*n=&#d zK!XVbl|YezdPiCag(HT8PZAU>XSBJ}qQlix#VAC5nW_<`_U*dEeoDyZ#|O(=gZH=K zl!vFbVqMc`TnYkGEj9r{*|2$bLAM&D2dijo2T9Va?vR~&6l$vk@##mfEe|rfDYxqp z0naY={0duP9A@j$TepSfFECx1=%0}>yk?k`^*tu}ElzCHotq{$JzU8rpK{lUsMe5c zb-Aok+3;M0jAlJJIhrUSqvZsQ80*01W#6gZ1C^iq`ZWB^s{KLP&a zI=n`Coks8n#RC|i^g5~FHTCNV{y)_GK)3sUssAUQ|26sRF!w*?YS8~z(EDqg*TLg| za3p~u^KYT#uMu8{1^+>)0&Wz)LilZ^zeac+;Q0rE8W?%>zlD3gMtL1b`3D8)C;x@= z-&nD~WbE$|W4{xPUIV@kV*CTR`U>#hLK4@~XOeQn4x1cmD-D?%r}f7xFcXcFFus_Q-x_+PTkj?>r?I{Ukp%cqlo(&lOtCy z)0RjwP0|DwcDl&XeuCo!FejV(@rX#zVcie#BzYpyZh z30B1<-Zz8wcv?`KWxk74q+T!8lpDGr)da%5ez;*~CBf_u7`vT?KWnVsV%Ztthi=M84w*a5Ka10oe$@1bB^FW$!7Xo71tm^vLPkCy5m2P{GAK*!FPXeRT{FW4La$wwQMu1}i=9J-CKi#8#@vSrp1{$}>UoW=^?ML_RsNn6 zbrcZv?j0H@C!vE`+@Q~@IJeNYSf?ZB=yHE7*hRMZ;sIcxBtd|H-T-P{2V*NoI@+I~ zsR7iLrG*KoX#NHR) z447TG-eyq6d6y_QG?15Qdgvs?Wgz-NdCryd$(YZvT}jiFzND4R1&wVmGvzKkRno@4OPg^CWDf6SE2a*#-F%7v!x6rmqU$CW3{Y$^B zU3S63D-wfHQt;q~HVN^94jskK_lviRP2-l)jLefq7oV^b-P0?KQ%(5n`B#-P zB0O|#(JWL{EFrCF-L2&9P@!JT1%YA;Mdxrb_rr)pY@ZLrr@~xtN_m^6dcv7Fo2Jg- z3{S<=cMGD=S&?uYG~DkAA4S2bc{zl#(HEpHI?^AJ>a&k-Vs28%?$(!FY@$W@{5e}V zdPidNfDK;)kRSNJX6v8x6cw*+3E1qxr#DnJ1a2%-Dj0cRQFrIb`pKrWC1>+lQ)A-u z6n>72l z3F_(=ze2)gSf|@-g}7~*vN`!cN!GnXsyZDd)x)xk(o17I@_5_ku< zypq{6lEDLh@H?2eOY(%daLY9T>XhjK57qF&4Qh_o^+r_l&+S)Is^47Y#2r};tAG4uCn1}z+B9`JvC_1H458^qtn8#_7D{i+y#ifdN7c0yh~YVheLm6n!mZ*sS(YExZp2dm;Y&7{Qz zD_X^`G)vQZcJxn4y7*SOnDCYPGN&W3Jn$g6;>{l(+MmX3Lo6%G+>zBQ zGo;l|cUO5|)SkJo$%-n9*@S1N9Zp(?5^gTL)=qRYt{=?ljM)z8qC*3`+Ilzn~WOMJx{Xo<M>+j~2ohO6uXPwo{Q+0nH3EF(9U zF_jq&b1{6X@4XU|v|MXmM(!o?A~a-HTX9QkxFE?+yY%O9e3F)ElayI*@a~MiHhO=m zwZ7C<&$i`iSv|T|yU}+aIKe+QBChLkoOxPp-mO_a9#e%M9hsAMZhYk8NW9uf4%s}u zc(H6axPFRzF`jk(@Z@=z-ql7SLZgf=V|`1$2xURcGtpbb`b@qEHcfUblo7iam~DnE zpRtc@ZD4`yvuyIY@PM&EeF7E!#`==eeC9$u8{V6PF1f+=P&G8X_5JWk5#3&)Q}0%Y zX+HkPI4`%}%`T>7{EyZ5XOYX!y6wYx(|0rS4o}13 zqLSk-I@5EDqL4B((zKt=)t=uzl{h>mM6X~oGfFYH-d6lweIW|F0!(DrM~K~4Q()M< zLGd0ADMcVJB@TH{&o!+c@Vadj9Y+{kj-XwZgy3DjF#*Rtbd-=Vn1e7Ja^dsyJ9n`d zf6|iubfs-EO2#oUtTa_=v@}s~#5At9e0H(G@Q1C3U6i^oAx~*a7ZTKr>{(`3x;tuC zx(s0}z)D%2Jce&>iL$Dmw-+J}u#|MiDH(W+Om@E~RtK@vAx&zpkryYWzo0Au=>t+fDl9<%~h(QD0 zO+f`ivMvZkZ!(kA5l)|iu8;O5776I>FjQbM6^szO2O*}Mm@F4z6-l~XX$@>eV1pHO z#Bh`9AkigpG9r|`IuQcbAe}#X*hPe0G6k=7O4%YK2Fk7jMPwPc#T$3a>v8$ml)K zXqI<0*&7fLFhGEB(LfNPVEw>en#pXzWLyfMzgIPo`AHkx>S@;xHQGfWiZ}Gw8fB(s ze+Bn@mL>0x&C!z!7FvI9Aj^?9x|MeBR>#}eEhivFFmMjcK=t7VBDF7p?xTc8#D7C7 zB#<$D*3oH~61352Ri^;5{+SVkp&u4Fm<3syuS_+)z3ZbT(t=YkJZo^16|8D-2V@o@ zf`1fYtnVm-o|?b}7~XXf86i8Sv_a`OtW0oICM^6gmyQGw7!z^qr*W|4BI}Z{7zyNc zjeOWJ5|skXVOZBR%nB_*UkSr%GE8_H|C({IA*x4>B0rR{b}t9-@{M@~oJUyKJ50Q^ z7DovnY6p>ZNOGxnNF4?dWWW|t6??t~gq@};<(SlOUDdJhGT5#Y`CyZS`;wnLa-frS zn4#sZLc8@W>MI`9dQ9k9mW?gy3((?`e7y*XeN`NCpwSEfU93af6S9yuW^2kZtfK4| zu=r2Fr-S)mYemcwKpgU*(TteG_-sPYFfp*D%apYkFt9fmSvxm%6+rZune-jsy^*e> z%!97aK}Ce)GOq~xR!9Y5N~|?166*)t0GOFCh>L~3%Vz!sfLV#fCd%~tHqouIfy#F3 zmr3W}-?3gwpuhUWn4^2LzVzwH5=Tsa9Z&QfjOQkWFwyLXN{r?xJ9q4j3~3Ds0$^KW z&j?gaGk;+$=}#KfM4jNNfDz5;GNb}V#3tY#im($r4E}hYZtj1jD_x~P{3C*78k1Mr6YL9|L z2*i#(U9Gg!z>d9h#|{itU(Vrc9B@P)^lT7I$6(aB3ph&%RH%-OkeX!Iv!1eb z;w8JPY}HJ$%!ZfJzO&@E`ds)_OH1j#G!#+P6z`aj5{!j2IMipy7RQtIt*q(7Gb|-H z-J`?GsW-dy{& zt<;%i8GDV2cTb_kMau4n@3{>cu&Tx7l}C;Ym8aL}F3Fc_Px)?iuJ*DUciE*dJkGqW zb$srnZ3g$cWZfH3(1N3CI4&~1COyQ}C~f_y#Cu&c-+%pB`ciG3F7vW)D>tBB?LD@*dDXl; z^AvIa^uwW;_NL8y>;8=QPjiZ29Nc#XU`D9|3|iv$kPZI5HV7%zLe61`3;ky&eaJ&Mai=$QLz^_*5!|Ai_habC>4^b* zih>N4N< zoSQJ>{S+ThZ12J`flU{Jo~3UvT&Ao3u$)D)6Jfje`GmDM?9#+IedSqbOxU#xOCutU z*m4XUedT)KdwMcji1$PTWBJY`)0nV2_L4KN%bd;J_s-IqLf7Nmrpz(n2egUs78_WD zW_VAUY#A-M)Fo%d_Y)q2_~}h5KZfm71lOm6kw3aN0|Z~K3|Ey}OVn$+o+ zbvOF1?!tr5+B+GmIp=hK+*&gDT-CEQyp3WP?i3!}&XBzm&uM8lD_MiGT70xTavlOZBo$S-ox>ak}eRrOaAYZ!DVclNv zr?SNC@>mT&SHS76yV;b-p+(hRR#;7b_%_g^y`9+5MjKUC;Dh+KMbKPQu#dvpav!V! z_ia}0*U}uO#A{}!=t-V@X~a+ltXYh=mb6%sSxaIzcFW!s8E;O#BLZ``T%L%0(OH0i z77ubT_^R#LJJf`=ej2mDeY2tt6~c5L=(9rE#YH3i{_n_ z$*=e{_k)X6&wU5Un`d(IlmGtI*iLb6r>%$LQB6x9&aI4&k>#GZYBrt0^7%nI^u6A+ zaO8(}3V|Lx`f#~0$VeikL*P89BzHj54j%oXx79R$)cqF`=eEo^_{a~T^7t6S#q*FN zh?M7k@_`awdMG)JKbw{zMOtE_Ao3>kW{WGCuz>P-448ocz2JNSy+8oHCV>FGsDC!W z`^vu<=53fUXR=`JM+Uc>`C_~UV1)|;dc`9EdNG3mdc6TO4GQWp-_BF0%Y=11%$gUE z5GC_jgo-KCo1=CZfG21mQp?jHpmr#LCm0}7E7F^zbvS@0Sae~2lZa-`$d4;fp#ioS zKysAy)r^cll^N`*7uv|zj+8`|Iqa#I+Q`?9972_WnY9}~OLUD}=#DT$rZeF00%NlJ z|9lwro+U=dEqF$nT{0L5cA=Tf2M5y(SG|3!nW~SCRZHK+%50?{Y;88*3A;32#bW3- zSle&aDE##R&F>Da1Bn)di8e9xb zV_kao8`LyZGD|t18jGAKlC9?TD5k?<)_1hvZ~3)+6`hUdm2u4n(R*KL@u)smU{>0% zIMqMQ;}>zwelA#E%Jo7LrKXg>L~(6A7xrI-E9lE19xQlj%(-1)lg-VgZZmb?8a&4I zIqe_ZQ_EX@2KrO?9dd#}qXKl_J<|WweM~=fU(~#&V+K2h??zjvLv>0|>Mh@_Ng+-k z=a($;3~nuCVk>FjYJupbrz=!FfSwnY6O+3GOywGFgZNk6+h%QZI&3NQmNCLPB!Y9ectC$sKXzR z@L}irrn;nZBd-&9JA3RoSa&^qLaWVm^x&v?@oX|1QzuQD&a0k7q>`-3mARx+tN572 zeSoO>AWT8}`I+#FxK!%EFbL)4OJf@^Ra)>x|FIp}Qs>k6UEqWk&Fv{L^*+0&F5fQQ9U%VF@ z9knRvWH1dMN+#06=VUQ0DWsUEvtl9I7IJPp+?T?T?S{!jZ9N}F=WqH%Ga5tsKr@}) z2*p~N-mKFG+)k9)&Z|wbF{nm~fv6?CX zcs|r!sQZUo|6_dju1ytv6-Ol%RAon4PR^!oYU@M+5q=SGX@O}O*gQU;a*D36N zv@{JI#kfC}G+REQ47Xn*f&u9x&oMR)BEako#or>8q92K>+Uvhhn@Lyr|@ zRg4U^N!1w+9jv~QFGFB8Fc|_Fgctz{M5;h47C}&KYe-#I<*uD#Lj4K0pOcHe>Dc%} zP!_kKDZ0xwY?k)?0@JI;v(eF+uML{Dx0wUnm71l~mmV#fXZi&%k_lbR9`h5DpicmM zYvPm*{=-$^0Nnm%5W->2Wi5(>6*VD8=~ZWd4%PgkvC7^ttz{}+`;6}9`<7F5h~S~P zXU-2hq+{kj1h?F!>AbmgeNu+@~9Bx=NsVr+n*!xhlga@g0ilS9( zf#dLH?ldyM=Ef%beab@E+=D*uq5SipL?Q)Dt6}v#?v+3sR&p*0)q~lwA6vOMW{egc z_<-zPRVX8^D>&~fzjD?gqV&SLW$pMHjv=A_HWW~HlyUr%>bZ@=H2*;+_i&dA9%On+0A3|7|Ewv}Mm z_&4+X6NmeIg^#OpoA2k|Lgop}KyK`7+sAY8`ns*cY(OJ@9XgnOcur&{I$-Jd1UVTQVZ^kXfjh+rJFyzUONk)TkCW0})AD zTk4=8BP(WEA++o^#;>9hOcD`#TQT3(F0zF{37qUOW-f)IKGuS+l7bOC;Dh-AC%tz< zc)0#FWF>1yFka_bXC1bmOle}J(nDe}BIGCo@k>1I_=Fx)QuW*Cmxips(Gnuii4TdI z3)TTwg{Jxw9(m*DB&U(P2t4#uWRTV0fZX6hw#%P7SL=jMl}a8B6BOTD>*s%o0GGDu z?j|^!``WLgKgFv*(5ijgH$A|gg(r`^dPAQ`cFiVS3_YQBr|@IGGsT`-9SKfHCcD$i z54Cks{7k`z3C4)^p$mmo%#hG;*N!Vf_RnJ=0%O*u2(V_8fbuig1&9ean&~?j8!0+D znA@2CT0-II5tz=O(EuLdc@OC;0wQst#|C#xe1fl**k-IO8OeuJOGKOcdORi&BDmyh zVTi;{d|0eUIA98>7NSwXHTA|G2$|F~wQmBkbo%X>sd_TI-;>Uc7f$2nZ+{lHb;tdX z&*2`pZ=KG-8vhVlyNkwfCu4KzN#5cNmJ0()`c@MGv|-P84+3Du+R&zw z7Tv;9G~uGvq1(Ocw&$SdtMd)xUPS3LI1rEm_FwTj0Ao&O#@5Dveg5(tAFIp8AhV&g z-6*O#h76D}5jGJ;ur7dUsHq)8P)3hNG8t}S##ouAEK{{Lzmura%CZ(5>d87>80xqxtPvy%5W=@I85eA2KT6yD-&lJ zP@VA9U-F&N501f7lYo3(6x2aiJygF$FUNZ3BF5NOyLL}Vs{GT;{{3B1J{7dTJ$DiE zhMmm*kCiA%F30C9{};xJxg%$f(M(;q_Ez|0PD!=8H3v?nk66WSTDvRd?ksiTbGK~C zXV_UXeM`mb*l(Jf0&Qo~Ph493UD4fa)n7(k>XypZTfkcz0#9`p%^HJNxOm5xm>Gz#=;cea0zf?^7C zM%J+?!LTz_P$GpE-}`c5`;9 z%st{KAq&Uyoy)5SS>DNXuBT6TxPD;v|X8)8Wf!o>)ej z3U8caP$Dv%cU@qvAPUMgM81I7)e=29vuEqHx0p^Ni;I3zi`I`Y_}Z5w53Ms2YXxiH zJ}_vvmLrr!TW&i=&uANKWlS{qS-Yf-L0U&S5;Mr+F$ZI8ed)}?z%p@Nx!$$v>||ZM zMpUoTr??6K@Z>?wRdwg0amGbn&$@+f^sa|0V;j-;8{TO9bW%dVFotYr@h0J|Sl9xK~MrNC#7kuqp&Ro;41em{L42#9y zwdm2m8EOa-6JaMXj>O3$lrfa9`=)csBE2ZGWi>eq9Zx%|O*qOGLNSw^YeZK>Ecuz( z2~5M?c}##uW@#3R^PO9y;yU>kkU(`PRl!zDX?JVJZ07l9nyf{M04gE{!Wp<^dHy82 zkqVjkpl9c?kw-foh1u#YZu zJFR@TFd9_*4RITi(hL+#WC71wQ>!>s5LJTs@CKY2u7P^|O@*>@A(Fv@mt!Fnht_nt zzo`6nr`Yin0yIpLjIe(!xANj0mWhnEPunO)lCw!gg;c~EAqR<7tg$WAmo90 zetYr&lZ+ZmjO&-atQbv?glj#*er{>HO$%XN4^*p6=^({cizAbWqt(UAMHD!EiU7X&Rr(@q!!5?S4@7!HR$Yf$U)MlwrszAXAEvRwi^b1c0^+<}uO_xHSz zroxbr(?a4uS&a{YlSl`!H~=UJ|72C)&h96t($O6-AcQDDr(QjqUXDiyh=)i*dvI64 zxwfw0Ug521M@N@RxFLS}-D&}+D*ZjeiB@&EYLI5R&g_!c^|}wlM=<7J7e&DabmZoX zSvQjn{iWa}=3vxFG(#uDE)CG28m%&VO$t*33WMEu?b9>;B$>y6#5{RnA>opMXy$pm z0;IwmB~~$|ttDEnu)ds>(kY+$5Z>Afc)dD}dAoSjzW~Nh1XwaWKyB#k=wxfHX8nH| z2Fu;mU}wE@189$KfLDpYnb$Nro5T%1-mJ;3rhgMG};yxGA3tufy*l@U~ zFeE544SY1=%9OCIgJQ0`$bGDEW~o(>`^Gp|I+SWhVcTzoMC@yhF%!f6D}4ox#M@l* zo9S=&Qwj3R2}>PyKKUDu)-{^MK2o^wp7GAn{V8fcwkv&qT7v6<@-yQ8=a_$OuwN^r z9X<5Z8Wg^H3Xk??#?3HM)$m09FVNF+h!e{>afBK$Z)&t!L6ve=Y1@YZvD zbe36`NuphX&5UdIhXYRysC7m@mHkGQN2Tea*mQZ@0-n zgzq&NC>ESO^@*8~9Day|&TrH_Dfgm6>+j>Z3cd!84$SyQHTTzWr%=J9mZq5pnA?`f zwnHnen+?3MWV}iSssrDHWd$U1aKZk^%ryju#sLpEICkZ4O*uDPD{r;=QJAj+hgpE%TOjUMA5P2 z8SMTY5))5IUB1ANU7@h`R)}+yFKe`|14t|U>i4xmOUXEb&-$B{Tum^7)omVY#+d7? zNf^4JIm}A9XK!$+JeA+OY>a?W7B{> zkw%_dlfLdks?r?NcF{lcc3Z=p7cFA`P)w+!ujx&I&9Shru#4J_%+)trqIWc{kIja< zG(XU*s&}MP<$P2nogQwzX_P=!#jR4sJ*%I=in=sCP^hZs@fq;f#cD}eo0c$A(LP(M zcQm7)0iazT*agt4R$U!c(Ew;Sj3P9wEc<=zEF=uGKDIgVod+fRMY!S<6g@g zS|$f7)p>ehdYa=)fhBfndRx*1hl9nG)S3k@?-yn%88+FDS*gh`cV_?A$5^MGwFd8` z>u`@oBKeBTIG~1^E(K$sx4^QuHUkHz0*{b?ZX(jcq)#FMIpYK<>%Xs4|CF;|(S+kv zY1_@8at0GYc~uLs=)h-A(z+n1Tw8w4Ln3pwIX^M~J=jNg2^z&8D-3NXQL@Z!7q^WG z9ukL64fJph1!Qp$iFVr1quiO3KnUD2-S_^TBBc~be5x;NB}M|m1~0OGr+DSm0kUfD zv4_nS_Xu;5$$%%kdet>IMwwB)rh#`mP^+B~h}73Gnk4VKaH<-irabdVE;WSTj zp4K#{V1!#OTL@8eq{nIBUK(8vdl1)3D}2p#CU5*kNl|p|3sf85l{Ye(*^hcSs%r+o z*-s_dPe0qqU}s)!W@;?_0Li=|&Ad@&H+?($!G5&N$_02d1ZgycGV>C`w1s_7g|!XH zv@P(9Zjj@|dKvm&=O9`VJK+N=+Ka(T`S$IKb!^^4G>1)UmZcI9*}Ga^Fp(gLk^KHG zXk^*g2F4JQ{$zz6eH&uv$E4d{|B(dDu6MA+FVrZXlq^!S)OM(zafHJUryyYFOe(FO zHBR>W1-QtZ%Uzb!f&j|sD!;m+`eZHuahL;@KjS&1#8ls=9)B(&w#2EM-)g!_t|xYP zYhWQhrV{*_>rc6x-f34V1}JSP!1?-jx|E@&q`4CmbdHQ+WqfA~^sR zIc*3``ue}&heup8M_zo4O*4qGB`7~>WxE`CKO=g|Kp!?j=f`QDHU;kcA!2p>9T}`K zQ}6e;DXHY25+`7d5EtmiSw}FN?fET?RcaZgfbUzc>X+$%sC4jfeiHMzoI-r@?`L

rem0-x-X5KmIl$dSba@0{8%o)(ivVd=o>Qri`*a z1L@*yM7jxCflggA6;zf!zhN>nwd%2&_$sAm~X`b)65yv(&hO(NS0y| z?6)W{mkVD-j8;WD+mnEzs101E%MVAH(^SeRC%5iRH;xUSV_1fnw7L2u;p^DOTw@THa>|jupo)s7Y_LunKol?c=ziZZbnsEdz z(E}+LuI$MPOzAuwCn!>*K!cOU(#344+$O-qP-W!q;iJCl@?M&;PzEi9ze;!{irU7e zQGXGr0xLQD^y%5zU!{v6;s64dcAVhUC_p0sbpa`=WI*mTLj4{-yq_b6&Q5Z1E^k(f z+|XHAXO)x|;>8M9?m5EFxm|vWRdNGeWQL9?FQ{~md!Ihph)sruggY&k^o_@xYa!k7 zD$!zR<_Qduef@NbE{8IEo~inUB{1~L&ZH#Z+O8I{93ovjDS|;&ALmuqcasSE#T{c$ zeVYp@XC7tOT<0J2*33YCVlyD=dr1wRFMjZ*c%8HGez@I@8DtNYdfzV+k^MCbT^_Nv z+DJBRcJz`$rpSri$?*~5*2}H#`PI#cAMNmt4X{aE0FJM})xdvb>YrQWIC0IQivXop zm-H6s3$&GC2TY#6A)BTyf22wW?}k|h&olFYa7{I%z=3k*W3=w0a14Gt53^imxxIdb zQlxg2{knu28lES)mP0<|kOAd}ucls$3#6spw}tl`<9>S9asu5ZP6(vcH(dI|rCWob zq)5#LfgXaA{+F>=DTz)@iRy@FUM_%#ZJF?OM8v01_twaU_JKgqDjD-m8!zTye%6me z6&C4Slpiqs&o3MK49D+yUsJiHTkw2xv_(S$VCaap~_ybU)zlphq z+(12%^8my&7cIi~GVJmp`$v%oe##V_!jIUDQ+wG>-yT7~XYZR0w9<@4VCX<(_SoT_ zF$Svw?=fhBHHU9Fw+qACg6L#3Jhdc7c*Kxz(9Ir1T(X45j9>8UBy?Zh*Kf^kB$kPB zn!|t3-ac&-9eP`D|HahY0gUAdGykWU0)wD{{+uN!K>6>tDFBVXe)9c(R{!#D#cP1q z+5LZ!0|DjxRRfmfAG!Xo3126{|0e7LtRp}P|BsaT*Ep}!!++zP1HvExoPQ>Zzb1a2 z-Ta%_7O->wCjPHn=hrB&lX`xmw8Fhc`PUSm*MP6{VSWQn12W+MWmv!L+1DtqBg?;0 z#sLEGFDSp_%&$>i2bF%KU}OG5`5j_vc3J^{J zAiNGGyassfqWTRGLHI8YtJmbO-9Ep`U5Nfc{$NB2Hx>=aKe7IU@*3c^Tj4jr#(x3)b~3z1d3}HXjnYc`YeD{b%lf5xUn9J} znf*o}qxdg`f0gUkHui6XkCcBQ{F}x7dK|B9+21IhfL9#=qV=Bx`>*Bs=dt~-EA-lq z{0%5i{U_kRS(UGc_u7K^jaESWC)z&;_8R5&(fAt$iT)SLe;t%^lHd?Od!Yk<2?5`v I7=AweKL}!YH~;_u literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/zavora-xlsx/repeat-2-input.xlsx b/results-2026-10-03/mutation/zavora-xlsx/repeat-2-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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

rem0-x-X5KmIl$dSba@0{8%o)(ivVd=o>Qri`*a z1L@*yM7jxCflggA6;zf!zhN>nwd%2&_$sAm~X`b)65yv(&hO(NS0y| z?6)W{mkVD-j8;WD+mnEzs101E%MVAH(^SeRC%5iRH;xUSV_1fnw7L2u;p^DOTw@THa>|jupo)s7Y_LunKol?c=ziZZbnsEdz z(E}+LuI$MPOzAuwCn!>*K!cOU(#344+$O-qP-W!q;iJCl@?M&;PzEi9ze;!{irU7e zQGXGr0xLQD^y%5zU!{v6;s64dcAVhUC_p0sbpa`=WI*mTLj4{-yq_b6&Q5Z1E^k(f z+|XHAXO)x|;>8M9?m5EFxm|vWRdNGeWQL9?FQ{~md!Ihph)sruggY&k^o_@xYa!k7 zD$!zR<_Qduef@NbE{8IEo~inUB{1~L&ZH#Z+O8I{93ovjDS|;&ALmuqcasSE#T{c$ zeVYp@XC7tOT<0J2*33YCVlyD=dr1wRFMjZ*c%8HGez@I@8DtNYdfzV+k^MCbT^_Nv z+DJBRcJz`$rpSri$?*~5*2}H#`PI#cAMNmt4X{aE0FJM})xdvb>YrQWIC0IQivXop zm-H6s3$&GC2TY#6A)BTyf22wW?}k|h&olFYa7{I%z=3k*W3=w0a14Gt53^imxxIdb zQlxg2{knu28lES)mP0<|kOAd}ucls$3#6spw}tl`<9>S9asu5ZP6(vcH(dI|rCWob zq)5#LfgXaA{+F>=DTz)@iRy@FUM_%#ZJF?OM8v01_twaU_JKgqDjD-m8!zTye%6me z6&C4Slpiqs&o3MK49D+yUsJiHTkw2xv_(S$VCaap~_ybU)zlphq z+(12%^8my&7cIi~GVJmp`$v%oe##V_!jIUDQ+wG>-yT7~XYZR0w9<@4VCX<(_SoT_ zF$Svw?=fhBHHU9Fw+qACg6L#3Jhdc7c*Kxz(9Ir1T(X45j9>8UBy?Zh*Kf^kB$kPB zn!|t3-ac&-9eP`D|HahY0gUAdGykWU0)wD{{+uN!K>6>tDFBVXe)9c(R{!#D#cP1q z+5LZ!0|DjxRRfmfAG!Xo3126{|0e7LtRp}P|BsaT*Ep}!!++zP1HvExoPQ>Zzb1a2 z-Ta%_7O->wCjPHn=hrB&lX`xmw8Fhc`PUSm*MP6{VSWQn12W+MWmv!L+1DtqBg?;0 z#sLEGFDSp_%&$>i2bF%KU}OG5`5j_vc3J^{J zAiNGGyassfqWTRGLHI8YtJmbO-9Ep`U5Nfc{$NB2Hx>=aKe7IU@*3c^Tj4jr#(x3)b~3z1d3}HXjnYc`YeD{b%lf5xUn9J} znf*o}qxdg`f0gUkHui6XkCcBQ{F}x7dK|B9+21IhfL9#=qV=Bx`>*Bs=dt~-EA-lq z{0%5i{U_kRS(UGc_u7K^jaESWC)z&;_8R5&(fAt$iT)SLe;t%^lHd?Od!Yk<2?5`v I7=AweKL}!YH~;_u literal 0 HcmV?d00001 diff --git a/results-2026-10-03/mutation/zavora-xlsx/repeat-3-input.xlsx b/results-2026-10-03/mutation/zavora-xlsx/repeat-3-input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..861425023f9d7984e3e35bc28a7cc8fffc902707 GIT binary patch literal 15030 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%0D#ygT66>yxE+!LAb19tsz@8Bj8-C zZLw^X#A;|C_8eL1I{qUrp?Fd$q|cc2%S8Dz*$Hi}JkJ~z6jI3jF-_{zIQkwJPXYhi zDV)s1+xhQdUt?m#S#}dQX-A#Y$G$LotuFFM6V;Pl@z!*Q_dz+AR)TqjFYj z>+KU`qfJFVz;3){tiE*6{pRDoR*g@8GtH^C^o_s;Xp4EyJu2$u{Kfl@p;M*+y{Y|9 zBWf%zZY?fHh3gIxtp(2U^ue&vLI2$-=lSZJ2o)8rd|tUC+wfrh#MxZLJn*-ht%p8% zz!4XsDs}bsqE+I;pOo$GPm5IVu^A6jbMv)UnyX*nQi9`c3$jKUkKiTf5_&qigVJ#C zK9_cW$t{Vi-Ei^n1|UOrT8z%}yq+ZCp6Q03|7yJW||e*R6>OA3_1GWJ~Y z6G?sg)n zI~ODC{36?K`lxDOT{RO1VI!k$__$&#_OiOVVRQ-hu6T&krHqBpj@Iafyy;xK#J_QK zabJRRpFex_XuJgMm8>a`!*JAHeBTQT3y+SC@&7C+Up=w8*~O||_^V}eYRZ68-1fr< zHE_MfXWO1>s5{<88G06VgwvFOv+H^{Q|gl)&nr-v7(ZuHO|hx7Zvy9KmzvWCOaO~5 z$Yh}ucBwJoUzir^dt+l*f+}u075UnGVR7d`;Fzmva>~x~9{J;19 zq~_We_9Q0tzc~Bixc)0J#wB&D{67i*u#CU_*FfavJO2x`=Kr$*8lsjU|0mmI;LL^3f25V=f=#9Q;plu`GA6CnD53{ zF#S0|u^6<}{!e_f&qMGIwme$>U1Sid{Kl}jm)k{Fu59~Xn!cCD58kwNx9)~L;=<|c zjZe>gddY;#A(u(;YVF=HQK>kyf#2re&w{KJ15?!A1u@$V_%^(3+~vfVK-ku`}pV}352>IOsi1^iFDS;@W~zN0G9sdfx672oX_Mi@U>P1!4d3VUoEkSv3$064i(!F;Eoj!jb9x_a9KU$p#`9+`&Pi(K#7) z`~?G=s~eTP`Qln&Z`mc&F2ihHn}>K}rqsVNW5*~+LP5f;nj?=uX7d+lRnHf)ge6<_ zKF#!t2eJp3rUap98urZg4vZZW69=`*Q2v4?gYWlTQ?yRgcq;Lvgaw~ET4k46ER8?@ zu4vE9Ka}@MKDwT|M9(U5)7|_}u~f_!t9kEJCpZN~+Ceu(B|oBcI%cix9Fe=SHDOZ( zeFL>G3O;_6_dzFZ6xlu|*~PBXJ9rHf)#~Lfk0zna=?c1otf;cqan4G4E?PkL8f`~c zq28H;wocoi5DHce*RfGAOg8}otsY3d+3d4n;g}89G0-(!aP~xt-l?(trrZ5S-p%`Juot4qrV5+IRl zHIY)6M}5pSLbEdD3mr8FetEo3S}Mgw8XBh|BzYAwO@hu-Tk?KtiXR0J!1B-;G9w7alGW?!^@?n(`d{#^#gsj~+*sg7x;XuM zN954o^}NBg=f(670Ttdzjc9VJBK~mw00cr0q>QE}3uf;_i)<*qnEhymMCGh>T!0mw zf|j~d=!6(GN!1JM)>9sR*phW9K4wAZdhm%WC^&ey?HlnXN_Ixiy$vSQ%6ANXv|Ec6WY%F z^mm5;>swttW5=pW%77b|ZmRHlsjh@uQfM0~#_seApF?>VqTc#wCtLx#!cd$M}?v(L*4XTz677DM2T(qrvKbba5=_5PMY+x-A;9awh8(cCfH-P1EH zvV7$cT9;L^R!RUnemy5+qbBM(a&hk7L=_D>@n3ZJAnRAi9nTS8LT?pa492K`p)kj~ zmAZO#)?ITS=S!K$ROW8@HqM2&|*UOt}^@=0$j`_TPKtToC!6?3l1tAP^9%S`g#z&Xf5b<|XUdlt@IH;+G=g<=bD!-7vpVZ~;OOJfMi7(b z7?l``{QXvT-8n$W1{0G+!D)?-kFmpW{v@#M(t5<8(|5Bh3kdFS>YL;JytE{jm63VQ z!Jz_$Lic#GNV#mN5LCkDr_sU3q%-Gq zM)KBy{k9?*kqxr>ta%#NkOF)QrbPy;e#AbX?YrYU1=LX`@#*h<#s0~b9ITm~VwrO9 z-x634w%YU=`SRc)4>8|)M@`}{r*u1LaZ;hb>gIb;1r(*SCD~@y+)Xh-l4=)Z6>Aw* z$?sb3CfZ-xDC_bemv@O{RfcCeT}OtfT1pTq;jfR$3P7DEe?YqcUfIqOqUdaSmPmn( zqw`%~^XGKa_iSta&;3uDdI{su6NSQB?~Y+9E>$K`CVcKlO;3aHppE;F%m;cRSj7z4 zkwE77TQ4d0T~5m8HW^d+DlG75l7q@sH6@>ueFN5F21;mKDKE5|#2q7*{eSPdTZi9cPAZ`7Q1NERa>7+7+vc)x2g6YuSF>cZ63NT5ZvEFwCy z5Eogy6RrW0l7T+`T-EKF{%lFLc9AEQ8ZM?yH#9}^Sq|+)_zN<#WP5qa4*VAjqL-YG zzT!1i8<$>LPBK>FeHKr?Kym8luK=cz0K|Z2ObV>pXhe}_XRimcYNORE-(|xD;1@F} zBT$Xa?VH(Kk7M7b_+VyU$Hn_L`Gd_b+6@{GqpZ7kr+InXg`Rke|{3tj|Rf)22DHTb$xzElh&gw|c>~ zx?*z~rd5{n3ZbPuoi@gimzVx#(ihkk+8Z^Pgo)piY^F~>_*`OYR9bmq8Wrr4tN}_+ z^~u!wFa#1YaS5a1ml;WIT~#ySnGPfJVyuR*c9yJ99hJKnSxTY5-usS?$;<*thgOHR{HE&&`qzd=2o;4jcS)`+oX5;@i!<-;4Xv z?nB&i3~DmW{P`tzD$*8#;-!uSR>Bj|(ckFE^c(&pmItP|fn3J2&(5mV0?ElT!BZS88dk{GrG7 zN^$hQ5?rjqN&QSsj-TDH6nAtbUSkad|07T90$jX8%(^E*!HH4sBP1a?Bf*F2*R|t- z3it(Kqo~#1b63LnJTpr>WCOjgi zpv2Q9efwimiZ4^in24Xa`I6e>tF~6G&LWMEbgvOl!&JSQB zKFy#=u_Irr-~dEzu0riR^+9=A()1>TQFO$}f|C9dk&pS#%lGaL13a#ElN`AJ2wS}q;C$Lxo)66vEYWTv(7!rYCXQ`LH#(+&N^W~lfbix+=G)pG z>mEfKK@&N?UM=5z`OA9WO}ZgC(c1#YBd>6D*>j|Q=WD&a4c?auenowt7;w&gUt7wN zIwA96K!8$2WbHV9+MJ<4hoh%kW5~ zNfbH$vs}5+odGS0wmU<0~-zxtf?7ew7)c@c2U6DwZl8~+P zjU>t!BYSC47?Q2*Q6n?PzB5QlWU1`Nnv8wlcPf;99}Hv5zKm^VFoyd*-}C(4*Lhvn z`Nw%5*Zs$RAIIqr%oxUDK0crK`}ul2pUC8HH1+EsVFUxWe@ z7Bt%Yk3VaAEv4H*O1W6QaPPF=o0u*Q=s+<8{QPv}bmgSI*=|{l*Mhg9%`M+`tcgF+phN~E+* z?KOaOCsBn1x*A(Mr~GqB75>VFRTl zGw^itDtp|m7Xich#@3CrCYqg2sh%?)oqO90#MROsIOxwdDtY-kRi$Iv;TkwM=I2ig zw4OZ2!I3^P@~phF5{Ev^!($U$SU(a^rmwgEdARnG6NPq6W?Zrkk66(D2Eh}z);#sKJL(x6a1lL(U zitCXmf=y*X0maXLTBlnUE+z5sarNT_*B^W>8C5>=4*VYN?)&nWqRM&rdGo;pwyVxA zhFTev`6HjIz5dGTl27@P%eBi=Is=9AX=O|(t_ZMXpd6M3iNEc|!Zf3*r#^wxsgGA3 z#!SZaxzxTqr<-T}L^;otJUt^E`B3fg=d(`t)qY1`D10m?l54T)kU0?)cZqxV zP?`b_G%~Oq_ir{hoG4-8NVHjA)l+qGA(Ye|0}+8S^g;JTCA*o2VdO1Hiq{_>j^-GG z6H8X}9nCHh8%!6?SmC(Y&^DhC-bCq2AVE?rAmzcIu=AHF(4z$6cBClXJ^dtMfXBiAxawOAH^w;D5#gUc^PTbjX{(0- z93z6_^fQdN&7HesjH;b7*7A^Xmp1#-)sS(u-+opq)qAeySK{FWT%%tjt-T$ZBtLY> zx4mudyZ5SocjhChnEAqu-Y{8wmg8*esB2zc-XMpzVp_d7nSp9eic|4x7%ni)eHYUR*%Y2-I~OD;Ze=%ShMJT}za zRH}+@WKfF2YjVn+tOtztBN-lROd!Qt6eO31wiv#OoHNX)N@ugU1so<*-7 z_o3)=-&oWF9`)()PD8W)p;RfK-&|I=t>uM#fi{hMt(^(fcsAF1Q&VMKQIVFS$@{yA z0SU5KRBA(;v!>dus|>fT&$!r)){o1wN1jhDc++=|;Bf8w6{lYp`E32#!KFE7>Vp7Y za>AZ8_>G%{W-R!5yj-r13ab+u>)x2b+&vwjkM>;%dn+(-$}=KzLrm2W{X+pm=EG)p zZCsAye~F1KWn$swm9?u|TtKI8s3~uq?Mjpz@U>TMo}YKBE(7p7rIc1qwest;5M8qI zlP9TQ;?eE)0Wxh_DgoMlYCt{O8Wv0|YCtmIniVv4)FrALREh$gH#11k_gPznAlrVA z4@gI}1LttfxUnUdu}>u6K6$}gL}JS!-)gqsHrZCt#3BYnaX$5yEvH|-e7T65Jai*i zK|RLDK?9IAw$?9b_3-#Qu(P1*`8%L@#>cIbrF;)Oyrqt>S+#|;AaEJqcD44nUgNHS zlUh~wV{6MB&9={#?EJciXrqLjrVbaA;vstBl|Ifzdnfkx*><%@OMu0Pxj9dun6nCOXd>xOUN zVsDfOPcgZ4b65R+N&?WO`&M2Shqbx|@7Qfkf8;@r6mC!ae3spHr=zRw!JVQrm30gg zDJSmE_}L1q@4?8CZ;KytO9YJGg`M~=Jc5V|ALZ(Bv4^DDaws0I+56@4E4cld-5e>} zHg%tPMW_V;6A?gac!qGQf)1K}li*8Mh>nfL*$vVHU0Dn!9e%J>{3u(xKm~<&xoK&4 zH#awH7LvWC?eU7T#BNA z*BL0GHwIy;fLRR4PD^(lDPQvI9_6O})Ar9e<_@gryEKwNG8955dnAGKH*!%yAsTGb zd<9p)!L%kzm&A4~{r6y;J(AU_VQC|O6w|Hc`I!64hl>YW7C)3QxP=nJefGT+SypnK zz+yEcNHo0*90E$3PxdTLU5E5Z<{U2g8dn5i3$!TXL@6NuvWPzynmW=b> zM23n9yUJvrt;dvS16`x^d4k@n#rQU~9ai`NsX7QS8Kx@b^gSssowPoZA(M}Anzy{D z`@{-o60&jvc5jS!BA_ei0Ffd;@ZngD@vrVA1sTNf4V(<_pds0U`enu-dcq z;;?mQ#*+6~+sIQxlU$KQ>L$L|z$B-G!EB)pnY`xoGL8**q29T;oi!$>zPM0Vo?R2{ zfWS-tKBMJoo2a{8^8C1Bk6ZhC_NZs2#FM24ONz&(^YRG_KJWpTHptyoIeWC2A$(G< zW0iLy>!p41vc}5DEyl2d0^jn{i8&eXhvE5Mft^3`LC{9ndmv}z?CWs?nPhv%I(ap} zE6yVmFw6)N)Hym4Jx+-W?hv5~2}%p}s&g%cidc$knb^blffDJJ_oI+c6GHZfx1rCJ zA1_px9o%uWs0vA7Fzb1F`;?n)kH;*ED`f#9yQwPl5^^|IjxXddX3fxU@7*bvik1?q zboU(l=>irl7wGiQ>a_rKgPZG~%MaGFh%;q3Uo{3>fTf>qE-t^y_j24FS8jsCuQ{$L z(LZtFmx9c5$HshsArL;Wsy}cL!v)#KD+J_LRX>gdO(J>VfRn=rjcA4u*%}$-C(oFm zS7py0j3vf>+7*UJl0UJV%qPHfyjoLbZa?dasjL99?ka-O4oQkV$04M4KXBYPzl@3) zKGUCLCnCb7MPK?h?`SaKv+u-^#7~zNEiJ7IQ?$8vKH=?K0bxF5jV8KaOgL~=uoIGm zq1L`e6KP4_EII_dQW4GqiOgq_M@vi!XN?aJUx-Sv5kS;DL9-63h4U33cRLc@^pX$N zPLLLzTCp0=5Q&;dVbUSHG&OL8LhqcyLTn%tN14x_6Q$BbGsxC2g}Q1TR5v+z4-Q{O zAMSCFDAi`vJQu+V#$wloUb%}e)%Q$?RtV-r^Iw~Ob#KwtHM_jvL8ff7o;4yU#&0SF zU#qzQ9e5RK0r~zlR|84R2a3e-z5(bY8LD@W4=;)zC}o5RX_kwY%a&z3v^|&6hrriF z3dq&CKuac=kV*My-(bPa#JilE*+VrwlZvSj+PwhbSoLqr(T%PFEi=2FAur(I2?CbD zhACkpDa8FgSppq1DC?2Y7J96MG^AJR$bMlRQrRsiY6y6fiLI$MC*hrw7dkb?J1+%V zz+K#z0eXYkVRk$@ZZCXl#D2JB^8SWLO^r)Yfq}-~e|yJ5*`A=^!~jLVD4sewHhyq< z#lgw)i}r#goFlEMu%cBYj(;&OnTI!b(D(RriXyn`?2P3N2b485QzALeadMu05kaOZ zAi`I$uZtEu?>s@2VvG!7WR_3e&eeZHoJQU}Q@X-A?OYGa()HSQaIM;_ROQR^MxKrm z(G?ZDigrd{3B}1)@?eKDYeO}M`xqvLy$2$7eHv7r8UIkEd-3p=!Y{C{ z^lpT__=CYrN6aiUT|iruE{*X$dhp;K6-!@5jbAv~&jArw_T~5*e!6$Yx6Bu2WRyUa z6&8MIP8q{WgZ)CFf5$0`sZ#UiofVbyh1lGbql1P0rc=tP-s{zB?vtoWb#-;yQ)?i% zY-y_bt@2$8vm}3gkmYcMg`30uwg+q`7dqBir@8pC6Tj0{UlI0gKQ%R=G@jO=#57$98E=5qu zXpHe{jI1)-v4FYi8PyaE()gg>T&>AgED)3*_h#OVV5^XlR(9H zesFZvDll7j?=*`wPt9VSJTBgIUIz_!;1`xsD5lKu7wazjC4vzXuGSW6x9-nllq?ET zn@xIR&o7m3Uuf^MPfZ!sK3x4%j3;nqWQbwsKw8$*o6#|Vi!rd(oAh-wJ-nS_QNhzW zqv8=wh3#(scKkFnI5;BFDSTTAwZDV6>;BQlaYEp_#kg|{6K5l5yxkPn>D*JxA^bPM zdJjt_PZo}rS|i5FY%Z$!)*0kIOB>2H%&n_40aDz?NjfZJ!NJK{X)tPu7L?GP%T~t) zSLLTcKYu*Ckz70uE!{*2rEHo)c9xm=fv5e-wu0Qwtbop>aPJWtx$cHB;PKizn z^EUG=rPyt%dImU8lnqAv1`qVZD65%Atl~Ip*)uV zx^7FcQ~6+7R(aY`cfeUNwOoytJB}!w=WBDJHw2r50_q?O$!GhZ&q<;5o!sP3jgph_ z&+DMn7dA0MZgpe>tL%5^MlW=J*Ot&6yZ~OZfL>?SMQZ`IcQB9l#HuWC-Z38h`KdEu zbSsVg_M?ws9j)2rkkad0?x|SgzU(62(YfW>Ed+XQknAq=ad?l0=5+;Lv5RZIrKRP% zl1y3|&_|Vo%W{@JlUEAGzun^tAQTUX5D&AZz+7yCH);>RCAQOqH_cgkjmxmPvUGYb(F*)3z?Zfp73!vHZw*-XzV z_sBglPKRBvWImKAV z17klT^dysb9EfR4rFtXd-wZo6WV)kM3r#Bq7vvUdGrTxaL$n*k34gH{#&HC#9`HU(e8x?ACuczMw3N37CUX;*c;qCDVHQ z+BFDGin8~k;D`e$htlJ@9yT9CpDgc6d-HNPvaSNn7OtqxB|&fQ?_6;X@}zaa!;}u`vnDJQl~y@ zYxhQpWsc$;q@!dM-Zj5D^$3;J;0^Lek)%32*AM#g zE@Tm_w4a208*|X7GgTMCn6jQFhzTi35qrzP?gNGj`~3~3`>;kfSHo9xi!CdY7dAG% z5ji_n3}u(-HJkQJYuy)vIt+=dRlr4@W?g8?wXrF3ae3{|jY}i)b!I3hEQIPbG!zoN zYG?E+z*yVN`Cd~Sm#pkkE`{Ityez(>sN78!-5435>vBcM#jXw`dY96 z57u5C!>Hs}Yd!9pC_Mt_OCp$kolveQNHS@0S! zi_#m9ZH1fjOvy4GW<1^j{a!!pRI1-BI4n8~8lQzV* zTs*$lU$3H%vm!d^Clw6t6YBE9=fhJAIC^J+kWS3MM_G&7ytg+1&I7SXwCD7#`GO(d z_T}DKu+ep4^Qh6ayQUl zE?~KtJM@D_79(E0Q!d+c)vsimI7zWUhT(~09TlZ~?58ORgbM*ftdN?1(rFRnZtwA% zwfBVTw4T*l8d&UB)c&MfMrOGHYgR19ek|=tfB#nyn^Dp&4LP${)gJ?^cc0Cz=zy@F zF6Za>A|r0DIGC<|ipYf{22g0(*J`d;c^NLhP#wlVx@@`cNz&yjmmq1FXYs4nWAd<| zEQOsyKPrN^yFP!%YGtnZAlK1AlOhoaD-s(sA8(E=90Yuu&*cgGm3dT{g z6E2ZGJ$H8FB;s%S5anL=bn46x-e}4ADGCuaV6`qwGHa+WHVumo18P(DjM4*mKL0+H z-J(oSK&5a&(8FM~v<5K{z5GQ=)S#~z1F47G(_a8uc=%w|ATWv@C=kOl)UdOSoNTqmhg^hLU_<euy6gTu-4=sKCETjD6^2G zU(@*0&FPftoQ*D8s)mdPj(NAnCC$Zxu5O4fx+_OKM`x+|957JqbEa9>z*NA3$z40) zD`)&@dw7_x-pfF0k)@$)^r4mhSsy9S$*Jvn~9Dme;$!&;T>JK#|1o>N^jnrt1z zFEOz9!^h%HFJ)qMfb^rJRv6kBJzCxFTx}~d0`yS@Q?hQ$!tO1W7n>%JKUe4_V<#dp zV>a{9wyLUYK}nYQ!1JA(hn|?#hun2;4VnlukJfeB!tU;Y-9Y*l1x=*e;%ih=QvBS~ zSLdC?JHL>HIfF7c6%mE+3V#0{_!&rl^}bqeL;Afo-esbyO>y!KMKLzIe0Ix!hn0y1 z!I7@W_1l1I*0Xdey9f}Ok~BQ)ufORSmUcs)D2$Gzt{m+r;+0=~Dd^zM1gWd)A>kGL zB|U(DnJYQxT|d}*=}zFY#~P(}o_i-Jp58KB*Cp+Uq+Wv<%Z zyK_yyymG0V=r;u2J6R*yc*pta)97=vdbw@+GxM-~6?4pFqFi2?5Xh^8$uC^R|v)qaQcBc zieck^GzuCcVG6f@vpQ02rRST%^c_1mcuia!dPK568m{#L2fi2J^j8tj0G(m~29%($ z1dAkdN4qxvl8ze2;erkEMoBZ9l|A%EU2A{#XQ$0Ln}V3kWc8B=fqQhT-9pm_3|plb z<9Khylns|JuMSI*7(%bEu^_LHI}YRhi5=R3>*5bxy zjt00QTH7~0<9md(cXhj?A9_xd-AW`+G)!f1cc*=8zqDK!}w=VhogK-9`d%Y0432FVdycs-g zcJk6C5)BTez2QUtBXxtku6XgpPr|=_=|8;Zdi&q(^0EJ>ziCIre;rTf69Prn;O*O= zeswd3V^xeq&-gks?#P@rk@w!5{{H>Uyq>RU51_qq&;Es^7lyPn&Tx z#fm{xvx7f}q(LNG@5^7|V1=&1Xk?a9&UJCAunq{^38v%4h92O+upn&mWrZab*sdwoq+VB8xqfY?PVi5c=l zO0D`z$yX5G;*-a2j5``+P&B^R6jYUI{&IZ1H~vgKer_M+@H`TZ>#jO_WZRV z9C3x~V)^VN?`K%f*qDRPYx!|pxgFN6@aY}yupYN--J|5z*1e0BZUQz~`@^wsPzvs! zpLzfOgX`X~3P3$y1C3!O*%H9u=1s7-x7GbOnt2Iao0qpde$+Hnm8p&Z@iba$C2UOd zW2{tKAw(eor*CMIIfHrtpuw`bq~xN4n-Wlseks=;nhQ-#ExUVt-x1R8YMsBm9sIMP~qpMMh4tZx~aVtMRT2 z>XnhF7s03Um4+#UCk*(J#-@qRcJ-W<78iXU{%d{g2EwKxY)6ZN*B$Qr4<6Xe{0t_oT(QqroT1yE zPVj3}?W%GcE)wvDb=a)=*rIn$kRE_z&NZLUGW<_C=C2d)#z-H<17BrzeTs7$k{0*H z&i(MR9Zh?R+?x#BVvnhQ{W~L?>*$-tc#1%K-`6EnT7H`1e(Xckw1~`=2>&O$E!5{V zaGmiY0ZJwjy8nlq^Wcy;GqmukA=uh#l9yL8X}Myy;$Z)omzu5 z^&Ak;**T93{ru_^u3z+=mU!xQxo{LsY&jXbgwoAq+l!+sm)UQ^VD*N&Q^f+i{W{|d z*?QuTZ;ju|;hz+e?M({%4FEHg#0E{t*6w_6LC5$Htz3^DUU3m>6AA1#jl?W6GfPBD z!8e{i@2;#^q(eg%9Z=$EhRe=~W_qPEkL($~w|+4O1NZ_qJb%X7|M;yj#bgN?=~DuEBs?z%@pGlf_E(`Bb@*n) zc6TnvPBs}6=#zBp$I50-dWO){$InsdyjKL{X6AQAw@RP07@&bY)o7D!2p;6HwBK3x zj!tzH!|NDnUisZK+s13BT_%L*N+4q>CZaPgAGB7@a2W$8kLNTL?LV7`&d}QK(=|lQMzdGV_WV(kVe6?KfNV}QXPE*mlBnKcvS0D zp7i@9U-*Ul0?47>?wD8;%nav%<@ifG%*XV28PS{K(F7-s6SwM_&q77^yIbVXch%!k+EtX;^~yD7UXAMh%pfUruu26 ze@$mISry>e21D6Ed9VDfd3DM`UK)_oU5%(WSN2c71{vj}E8phT3)0S-m}$qVleltU zYJa}2rI(f8pl^zocgx?t~U@8BZcM+q!YpNd|w>%pE(0wVd^ z^{)gYA9vSitjZ1$8u8&O!6H!CkW0pe5@$s=DGTn@>sw^=RA6_2*Bx;`eDiN z!J*~1#%6|KZ!Zk~D>4mDh7_JO1)hOo$!IeH&w08kc8=F!YqA?VnpSU>U@3O+GP+#f zx*7E@lvS!f&yC&QR~qG{ch-Mk>iYDfh8M((-|Blsf%6+-GA_8qL=0s=%4rl6|B4{> zHm|Ynb#M~0$)t_0`Q`Uvp5kI>b)z63(X5jB#l{>_Bzk)on|&)hhJ^L z2fXZ@LNR%Q6_S@9WBAjx;+tJZvcD=~#-unGz{G32Hwv3Lh&JX#56T9JUmlPhJW1aX z56wIwVV`Z&M>0p2>-LDiu976&Gg`#1{QaHbg1^P}G0$#1$QS5bpIm)1wkw?xPFM+K z=OE~5`e+iGxGp_|5bOv16iqS)G8*ik=?!@jmjv|??YDy@QbyfB$DbF>=9#r}*^mY- z&X{YNDH}D%K&@xbO)L+wwfrV!2>#TptiWvCyjQNNiiG10-!sQ=RZD=sXx*1g>& z<&&n3MybF^rE#*Xawk>e@#g}0_lJaJ=?tzjqGOsZ z$ghy6-DNyNi9<6BFE-P8gO~>*d%!|C69=+#S^#5}mfe+{+We;GB5GmdF3NTD3%)JR zB7jLC839YZ9lKjKaJMKAosl~o`i5k@ir7_s&|_F$y`>07ach4XE{RWAkH(S-#ekVED{mQI z=0Fq>>iv9t0t&jiu>V{n>AU{?yl)yExl+2?$huycX8Xg0-~-1(^3B~f2vp%~-r$-{ zo!6X7WW05;#A?>oIrtC^E>ZzyO-$k^jlJH6RuXCY*%`c?V~MZN0VD6_(70I1PP@9z zhZCR|$OzO~mz30~4FS#Re`l>5*iK2DoF^0(7P5IDY*&>pGh_5~4VD14R5H=DIov&}{BDMR!4 z1UTigy&r7qj^F&-$?|GcQnmk+!THU7ujulM-60G?a>7M&$4}taa(O(#*a~EP$oDOJ zBM*U7tj>2K6;RwwSy+sDn2d|dYeQFe|J=6u5GMu3j!Xy@evum~`)BVxvqGH!Qqdf= z+?Nd(zL{b1O}l?-q?~8*p#Kb9k{^F_N6|vs6dh}C&BmPr>1ulO!}sms?a4DLKyL5r zlAX*$+tvK`r4={T@APZPgJL0;t7Mn{hJ&pRr0g09?KH^LGL;vyr3EE|SiC@QnT-oC zI<^gnt+eeK|=U z)|Ne))pe|+Q*XOb!8<|xZK@X3>c_`-t=U~L_(ZQXkluP<1vU4gR zuUd#*4G)o5M&>DNM<+~~t7~iY2FJf;KSs43Rr|`YghHI_*Hlt7N;}*?!L_?EB((UC zPU&NTC6KO81Etc^-IO4$Wm%!-aXr9u)L(G&u9wFSp5H)yJCr)tss30;@BUAJVNOQ= zfYBF!zxYlM3ZA-sspHN)OYzppJR5PeHaE}&KJ=c2x9sKP$wA{oKGvYG>FGmb@qM}9$}nTm0rBTBHQT&8TfxAYY7 zq&hl2{1w0Z5ZT&tO;q-=Q~^4p>Q960gnRrzriI%4jQ#IOI5E!<)eTfIGwDS-oL&Yi55+usxlN%>vr3-T^?pW+$VXN)u*#t>K3 zT%t^X5vmA0s+@-g4@540F!(ZQk(+R=ZD)OMt=*Z3I)H*#-^m1(Lg5}dPC~zD zawD?A0JB@PhkcfcNV~I;Xu^DXh z3=o>MKQhGjrQOMf9=)N5HNn9`Sluc7#l2e!nwqC5xv-r!zR2ABv=5WBYP4$h-W%L2JKoPkgeH_s;HY#Hlmx z3Q1bH32%T?heSlgVpoQOIYa=zNquZ}_oxwhbV#k)?pBa-UDl&i#$(s#V$Fv?-fVa+ zSZmRIV!~rK?4qn)B8m#NUI!KDs@`PM$zGbP>KZZZEcAckwlBPIJon~XsK!uvO3mdd z)H-Wrh#M#EfEhGeQApxvx83B~tXcY4Nnh7PZ>3JUFgj+N!*@G`h0*QN{BYsK*$w5w zw%mSdi~P>`U74u<=N!|VXD_2>g_hc(gjy5YdN)mN<$H~p|7KHAzqDxKP5&vP+Y+L2 zD@ouC<2!_kXZ_3o#|gZl=T}uVv)kXc)qFCKpH!XB@vCk%D?DWhgURjByog@U#EAvm zEH<|&@{8+DIU1aJ__WM^mzf(He0;e>b5hA6-Vg*#JxE~w1{x}#VVkmsFha0rlt;DW zD>?!D%b%&jswho+HU~|%vT>DOmQV};`*qHK=2DzIQ>Frx2@8!6Zf8m%z$6NegP(20 z>2+CC)*!yKXDbF2*v~xvk>7O;OL#2Vmt!jw7uLHfdy1ES%1^Tr*c`x19|~p@Zv1x`5awhH#2Seg2$ALlo$09Q^AIAcw#2Y2tj zDX3kS$IXqobVCZAEiJ#=HB#LuuFlS->kSk;$}^6KvVQI`7-qeepsaMT@k8GCpsKzn zu(}I{QK;IJqbj^)8;Tw`S66R8St%4C^7r+AHxbB$1ryBbMsR4zlf3M%#Fqi1+`6lp z7au#Sw?7t+3o8lfi8ddE z{}6x;HIG=r>>qb)^zEfDTvg6%;+~<68%yrJT0Xt;Q1VuSX6lf+d0qKr$uZ{m8II;Z zEVrQU_nVfZw6EcS6-hJsPC1X{Bjo;&Z7NFQmeGkd$_YbEHq;#Gike6#O|=i6wcoNn zFk>-CY02AAdbD2{iy8Xt@s*2=G1Kcu2Zis>bjwLzAfZ1WUr&Yn_-NtA9e1pZiFy%Z zMQW)z++P7Jr@(LEFFgrw3+IR2K&rNa4E)%70tlWQT2MLiLUr`=FRfbuFtW-bgJ`C?n!rv z66}56hRS3Ih^iTSK2fUwYzB9%JyQ6kFnnEnJ6b_jd!=!^q|Wa9C}Z;b?(pLsGhg|B z7+qMbZhCFAxXSk|C_L*;$Jej#i6)n_%6U>*!=5$Hfk=xB;Y)8~WL+FI)i%n!6qk3r zI425uuol37GZ)4;a5eyCT~kUxk#4u$BGdl0=@$|k%H35Zm7LsylA{FwO<>0Ijx{te7}FYMQ{3=hJ753u z_m|`R)ho-(JGAhr%I#97=Y;WU-BMUriD_x3COE7+&A{@PO5SV}#DdACS1fQxtca-W z1+OXY74f3n${XY+DLgzen^oFVfZBEuK}xl87cj$?Zo8} z_^3Q%JkX`7Gl#ZNeyl9NE~3^@km447Sd(OR`@4vgjJgWN1T(MYMv_=rTOWb`*{LtmJgtI%cgb=Ia)w3vxcOc9sps6Wz)5VtlS5(+xw%W zx>B|MZ)c$OUNzy3F4CHaV2$SLd9d00+lr!mu=e?^#b~uKgV|+|(`dA9+tQ=|HJd{n8sSSvgUQs2U*>zTCw#9=Zu7DY{;;|tNOm3oLYz#o!d=KSCVNh zFl-GuqJUHH6R-d*BwB-bjZd5qnY}=BDGEwS51EXZi3^{?&VLL1dAabNEjR()z%DVi zNTM9Q9-6Z-fR%Mw-M5VANylM=CmxnUC>r6xIxhGB_}6R~LOI$CNQlLcy;tJ+8HCSF zG)nEX+%heWjEqDEtpX1uvWY4jRrjjn0!|+n7)E_N8pI~J&hm}vjYA307pTe1%?O&iViJMhY=;Nz=DoU-_)iJcBfpUY7) z%*Qosx_RFqe3ldc2q14v2QC8ubUDfh__mhZewXmeZdpKV$F&<9>x1x$#Hxnl{R3aV zoKm!dIko%0qQK!Jw;2;)mBu2xywdgNO02aIL@qeNTpW0_VS&t#c|~H`L0_KoQ&x2OlQgR;3p%-x@#Pr5ZA?ooMBZ7EMKJ86ox6pIuJ_Dx359diE(alSOoWA@ z_zg8JJc^DvT~cbc;kX9jPovAu$|^cacv7yiU3bUpM3)W~W3sqs3P^k97h8845oPhc zl}iUGNd^i|9v_FX&7weW)gDbMU(`HBNQ;|Py9I7%uiRZORNX`0a^TloOQxQ*VJ$}33ij7^GO4ZJ@Jzi>Q?8C422}+q)XbPenv?`aGf`Y;?-E^f(h53Om|@x=p!6T@BbR?C z4nIv?eAj;k*nUjV3p*sHNUug&{t&~LFoee3-d!>pHXmxO!O+dh66%I*@LLYW6Rgtt zjL_&pF7;Yo5|3;cZ(-JlU&nz}EbE&M|=U3*eQgY+eGr17x>cf$(JiohO%Pk|}lg&(P@J?OHxx5k)GCt04QC zJ?1Ui+4s7N38q~)8lI2PF}{bsA|!M^cIGMmz%jvVsO)%8uAEvME4|_H&J9yv^3(qb zupVMKuem4#EI1hR0W!lQwgEX-M$BM<9!NpC9xVs}>dn*TgEG1K4P6Y@mXR~7QCkCr zYs}YovOs^%2||^y8QY;%%~yWZZrFM5B!xgHGs25UvM`arZL;HEc=f7tTTPuO=S_MgIZEv_Xmg@*J;#F%Fn zu1}^fheIX|ZaLm*+7J;5Z+Cw42HW&V>A8o2V7z3To5U(p`+>#Yb(AB4=9*Znsq?8d zUnBGlhz!oWu#gGppwH`(hP-~-Sk!!U!!-M7yj1sHS6I#8VupgNvfLfJKSl>MC&E&3 z4h@V$b%C*)(S~9~3n};#V5JW+bbF#REo=&Mf8ER3smYqFJOH)2> zXl~|G&Cl%sl3kgf4iJ~BnNi8xMxLYo>*%J}3czmP7;}MgrfPrn;2qr2eN2mhnO%v! zV79)UI02%W4O%Yg(;I@T-J#2RC|)VMP-aujx=Y8^8_n+^BYOFY#>f+5C4u+UHVyDNu1i7IFgB~FDX9)j3{oqmj^>89BK6$Re zIMN4%y_W@W*KhDoI%xW(P;|9G`htsSOUytB?aYt& z7APQtQvZbf15KZhR=BF)*tkFDAE9Dmm`mVOZUQkmt{(OK5lJ|Z10++ik}D}E`MA*x z1#N0Wvy<qANVXsc?XUI8QeBW)6vdBK;_f~3jEdjVKQ3rI*_WohKGqs@ z_mK~=NkAdBrL)`er@~jFdF)NL-Dd;MyDDyW(dgrYjBk#V>n0mAZ5Rr7&TJfQU737y zLJ1^rp)9eGaxX<&^ex_zdFIQTpyx!NpPwIiwrOCs)XRk>AT%t~YEP&&1qE7jb8{f? zcaTMP{MJ-4*wPqP*v3=$M~Xk!>mYowU|)j-k`#iWp;*#$>m_be;S&v(zj}2Py|t9K#QM&A#l^y~l<+8`3Gwayrp&f@AtSSifP@?3sYg|v`}Uf=SY0%^ebGN$F;WQ6Uzr0o3g&3ad{0Uts4*ielUumV z%X*A!-SSzK>~R%Pkn~Tp_57m{m~i0nrPe)J^uLbQ35Qy;lRl*^5rnbwj`uN{P&7ti zy~?V0Ap?V17Bk-qq3$!A?*?2K3sQa^CIeO^q)9pF`H{x*uU}P7O-&)1lWuQhh0dA) z+GS^TA>}EllTSh4-9$YR1UAh%Jj4|tysc_4it*~Z<~+@ygbd*ayM^yQ(o4?jl}e$M zmRP%DF=9hktwDyK6^QtqcT>o4CoWwF8G04E-gIeC%uO;gRkrVweVqa3Vk6N4yx;N? zt+d1sHFsok_S2<9%kseukj=`u+@6Tdb#~?uafwVF-BWAZj{xtf=p_pb=BVs=x+K< z)Xj|2uKbu~;h_uv#5TiwHs737B~)5#FU@V8t4Dl)2||r@>`W5B3JD>v!L*^#hbA7~ zTJdKB#|By!%8I{g5)yAeH-yby@0okr$y@H3TJTVtD`|j~Q#tItvWwe*du9*UZIt09 z9ZL$@yUTTj+8)U14fNU7zEm-Mn#HmZba;oG@jX(X(}*%7Rpb2quY7_p7Qq5$DpFiroaDP*O1HFU z3QO|-Pmt#%#oiUV|A2bZKD`f0$Y7nvzhAn3z5RVd7>$9lJbfY1{5R1~PUw_`Jz0J4 z=HD@=rtcwV@-J0KvDO}QkX+vW+q3!D)Rk{skS(u&WjNnb{|`{}>I0d}0_y&||DGcK zKb~{SlD(7Rf86}%Gynfia|VBh|IWjv9Sr|zVD~4hZz{Ae`s<~{{_dcC_OCYwrgSUF zzi#~N$*r&-`}^w}J_R=Vb-SHA^Ja=@rLEg2BxN{N8vWI*O=0dVT~#JYjEu6LCo z)8d5}B(#>CB_AnH3u)Q;;Zx!!xRpM)?vPtw3|&4=RzE&rIb(I6pGznry9?vy>M5!f z%0lCro#i<>c)+yUt=wB_+U#mm2mqVq)4%FX;4u(3@Kl#opTa|RC4%nBtgXQ}tA5n0 z-zgjfqhp1y`q;h#VOj7Hp{v3V!B!&&L3omm?h%)C`|E+4n4IuKSAKr@Dqy4C;!rR^ z80B~DYbootjeMSRxOTNQ8|Iz~R{&Hs|0Zity@9=Btv;@=TkW0|?S-?KD=71ryUCro z`dm&O{mG8bgz73?nY*Qz(QPM}-%q{z!dTnH3&cZ5H992H!lF@6-?KE3uzme$%ToIC zm2073n)n{6qe@Gxt>k9`}%&Z<*KAo z+u(eZW{YtA8v|72eicqZ-?`u+@LG<}%D<5a3=tYmJ2*K(>FUgW9-=|Y?P9G2VzqwR zN}`s%{MABSN9)~3fX()tH+l^V2XhWliI$9CSq)=5E?#=(PcwmMPkwKo$#aZJ_>v19 zW_x}PM}-aV*m_T_n}hH|;`LF(yvRa+>pL>vXFwiny*tj~xRTY=v$BHsUwShY}p6;W|z)P~d_@xCYm-AXiyIk&_qik*L=_5dVE zB#TK50xjwC|Ha;!KSCM){XQv_HL|6#L`vBrgiwgeR`#99*vY<=h>$J&PWElAL&h>9 zWY03j*kw1iFqW~MYrfBU&JX9DKjHbUrkQ)jbi42C`g~rW*Za@s%H)jn5By8)GL^@3q@Z~rrtPVZ~N!8aT3 z(b%l17D_)guNzyUzb_-*;^F0|7z!331#GNRWnh~Fh)#=-D4Buea+W>v$B#IwJQ|os ztE;{n%1FEGp4ixq3z^FY_b%P>A`X83pS+87D#TLoZ~TA*C+o>qt<|0(9*Ezj5J(NW22V4#~zIqQ>vA*G>haM`O}Z`UEbm(|gP zhl!Sf6k8d`(J*&`EiibEiKBPZef=1RGf70s2?-0+&pN&zeA6rN zYsne2($Ueub8}|H`>$j4S~_OzPstb}@#8$!DdPI$v(%J#dO$yIXD?b;oIf_Y+#1LT zMk0VHSR6c_Jv|1kY03zNh;Gv^U18x zl4FxHggy{AdJfUh61)th5lKhE)ss@d1iR&*MV*2nRsLhE?R=e3)PXi1ZQtz$Ftilh z`f`PoS?+E8R`tVLE~z*$NuZmY3S;9nS)%LN+V{5q4-`$uobPB@r)=xIOBj?V*m#fW zbxwk-r$N(Je0$^FfZ~PAx!JUMOC$3=8atqTkwVx+fu?PR~ zFN+qoIu%`sw_U~(v;+h?FTX$!&>Qb1;pn8XQf#E@J6FTn0 z-M#mBONu}7HHRSv(C9U?E_1p@Zz&Br5jn#u7oMbQK4r56&l(EwFT&5SRjRynli z{#UBeg-h`B8O1E2{?<|u!G4p)nvMKnGe5f%2Ds@(=llwe)~^zm69#)_Nlnk9a3F-@>RJr>#gq@PMH^Qe6B|_l)I$B(l!4*dYM- zf}o&w`2%R`BMKP<8g5kryI{DH=Qo{F$KNLQHu2#s*bY`%RhRM94Al%V5x;YEZGFDS=R_*4jti` zY#AM!Cbc4RvP3YMKXLKPn8kMuRH(Py>#3eL=%6fp3vpkgBHk*W&W#8YS&e@924s*@`No-g0q+&KpYH2SWjN`xUqtW<7oIAhG ztyVLi#EROq$M3dGgJ*5PiiZW%ActN984LG#hMuGCuAqImRjQ1HeUf1x4!1GyfSoxO zFLAar{w{09FiT8ToFi3*J_%N@mYkPoH9PPbs6g67sw0I}BJl(B#L|O$2^r>=zb<`R zTXv!&QNDMP<>S6jQu|t8e;*gr5_Haxmp@4q{7jHgj{4*|dl)Q@v`hluSb{zHNaxei zhiODtz$_VIqyU%*QrE;>T6GS#>j2CQ%at=3Z|q$;2f-R*i}VEaUpP*^mRGpf5)%NK zvXsLp#7)|Reuw1^A!4ny)JRj|Ahn8aT!#4EJZC7twXODmd*mRCvc2!+&Q@3)=E=KG z$v*R6GtE9IpuC8WzuBKDb@D0Nq{{5`nFn^PJQu+V%BUqpMQ=1T4g>Gr?wf_mu82*2 zXiqj)`})?%$fg*Vu~pL?JMfu_CAHMgwk9{f-SPtw4L>yX_#8x%K;B&X`dLrt)XA_* z_m3eYTQqH=t(w2}^I;kQnr7f{2Ip+pla+6uq)wd@O_QHhw3*15Z0-30eRXe28w&?n z&wf3;TGjzc!dsDb2r06W))Y3H34AlQoSACF@{Bl=b#s0 zi=mm0ktu;6EzhKpqAS^Fa)u!4E-ErGdw2E%RacLFW)wMC4be)l@iG6{Ybrts+TP%n zW?x#iqvsA9Ra*8fU0$H4&QR2OIw;Wpv2-MovSn}q$nFf%(pH3tL(2QF&tjd0iYaIj4f_+J z5~bmsxlPu)*ELYXL*qUKW6FGyc=-QQr-Fv;}zV)bvu8|9_Mq9Hz_dAObY!Qo@Ubg{s?yH5WE&?bm@1TBRktviR@~nJI+?%w7zFuv zjz7WI*q%HF-JtR1ygZ{yLS2;s8F&Re!F~oPd@-A>f{~|9qodgsAWP%?1nJUGY&+7& z1vExa->VS+g!O+*TqX+AB;Hh8$p@-fE87tYtK#hqrky9k8cG2!U<>j4G`c^-xFY;C zY8Ge%`&8#v#p2jyD;%YTf~P?|J=_~-)1M_{0$c&^e^^Tl4q`bKf#67N?mRDV%en!0 z+)(s$SD^Q+s;XWqE7u|$#ajc+I6>`Ay3@7XA;7#OZ65Ilk)NN>!;$0jIs*($SwIi2 zcJysy*J7m7agYBlEYL$B_F0x~+kwfm=Kh7p;!+h}%F18;V0wc;GefIxjIXEQpL8y1 z0x41fxcjb-TV*+f0I4ohC&(JTH4ersRw>_u7ztZ|4J|5fqz%B}En1|R6Kvq$@ABM{ z4byWRg&KaPt)UgM@2BV}>^O1dpE~@NDG1}@*9yag9hig)>t9O=OZCP*zPohb$8LxC zvF$hIVe^9hCT%rs|JKM@f%sv%^U~vdwZ7Hn*^&9N%-QYXj|XYbVmd6j?h8GTefx;2 zVfe3zb;tXqz5!eck@+B-dpGu=nvX`kfHn6!Cp|Odu1>fTU80Km&%ghg4?Vn^!6lp( zYW4ijQs*&=No4A!ZHqBC3d2M?M#fs)pfDVPs7j8n+e+aAmKW1n5pSZ`!1pq5n5*=h_S+t?cND~6SN??*-C@4&KnL|U2RK@TpI`&}guMfR}I2&{a8#l`cu@C)P#FA`8 zKUx0>>Ds66XwMJ0NbH`zn@nILgJY%rf+#Jh%li4jXy0%wI7Ex*+($k3aTq>HBwTHq z^}|vH$ntDv0Ct^@kY~S*{!!~ZurQqCS6GRT$Nr88)$&SDDW~zh78TgFO|{+n^8s|? zeL&dIqvr+!>^}tztz12&h}tU%fbjv=VUbPwih_pO$1`ZQ-}}Mca~#uZ128rUw?3L) z-6_=rv;%;P&0A}C0|&&wFF!&1`8OBRUaErJdjo8AINYB(_*&yrVE%TM&udn_EbBBN zK4p&Zb8vkOP^&W0v*>A%b@K@`zu=Sqv2wE7B0^2aE&#Ocw1L%X^OF7L_Re@7js48S zCdIgWYIX1aPE6=e9%Eb+M2VKw{CDFH#5v!!4P4+WEVeCQnuO8ZG-%^8+pp z1L`5{f@PZ^??B|Uxa04&gZ3YSs9cjvGihwkncjmu`PDKN}hoN)Xj zcm-BMkRdrLWGzl8UR+8N%=RAvNigONdZ27WXRZW5)M4(t6W742ojo5v)&8^Y$;hy@ zO{Sl?2rToD7##Pn?yzWCcyl`+^&o$^@VSoEytCl zNyiID@!tm6bGS80xq24al9OMhnjZllj>3|0U--?MqGgF};}*Pi3Cl~+nrS4oQCVmQ z`ay=bUdrH^RNy8-{k+%tl9Z0!e=R@BuBZ`+6O9~i^8!7MD?v=fz6%8GR*lj~z2)PA z1^6|^iw#Sekt*{p?|`n8nL}w7ChA2q^rpcqK5?u}FV~}GFQbn0C<~~XBlHK|uwxj( zA8WtQ2oc#Jxbwgxm1ZAUg31A7yq4*+H3a01j_7hEu=uV6%0+v)1DS>CS;g1Ho49HOAk zVE5i=TdYn#T#FTx1RGf+d-vjcQHW}2`n48#N^(Zt=WSg(Qfj-iH4twjTLQvQAiAJU z+--f3_Q)@3h`^3`OkTE7?H$I>nhXNCK}1WWdt?nxqyxeoFEE^-jE4~$&;niNW_)?l zhWI6#2han0moqwgh;{VZnI+_lN;nEso_H*^VaDebj7w|p!_}^+$*r_nOD*7y(hm6} zZXGdrnOj=^86&q^UA?Uh>3l(1h7NgNPp5HOH(gGFSq!Q#+)Hr1Zu1MK?Og3bXdi(j2o`awY`ySPS; zruMKmnJ)k3eQvedMHVn`!DIaRyKt3vlBGHc@}<^5;yR_8Ywr%Jxf>1nS#F9dTQzj0 z2wQIS3uffd(b3V<(U}u>2ORgB*d1Y9BUr;8!hW=!p8yT}&wJ^15_%V43y=?BF`6B9@DUWCc%_f2hkgq!1d<{wB(TEI-k2#lUBnQA}3MDmiea{al8~Yo)GJ$0r$1jYtiNY3&rknP%zX##p3R&B6 zUHMiA2=QC>R=%^x!sTM%0`*ddjM?TJp}x zE#-Y`ZVIh5%T)fSrCd8utvdKbAP=-;fi;E5W@L&Ddl)DH4>Jul>DAYd$F84D-6LG< zUB4)~NSxWk0qZVS**q7@RY;+i78r#EUS~p*N|rg4eDD3STSq@K^FI2Zb~n{ zn;($ObGHB(RnW<=G`LaP|2%3f#i<3ZH#+reLz~Ro9@f2fA`PnY$-iH^9raT!1}Ilx zt#nirO-N{S6a{@Kgr@UV1Sf+-vw#@fYxXF*)^$yt#h;&-R}<)}23?>7>BWHPnsJYy zx)~!1$(`jLnVz^(q7u56A?ZQ&16fd@0Knt1Pglt=OUoo<8LXsK?){5o@sqjo7=(Y+ zf^Iv3Pc8#|^0MP9ThG>8Lqod@5t$P+--DVg2oS?-s;Q_n7iERzq^KI)^@&*e5;-<} z$iMAV4tWb21O>F8Fl6SWo7F-2qE~!6WXiUTSZ{zqWuYrIH~0&DmO+BU#NLS!0&jxG zPgzRP(e){eySf#F*gf}i??%`~U!=4LNQVS0^3K{fpv|*B5vX6cH)%nwz`pV@gM(

c9Km@7E*E`3Xr#lgd#Vl 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 MU9dh+GQJY~Z)F381^@s6 literal 0 HcmV?d00001 diff --git a/results-2026-10-03/xlsx/heatmap.svg b/results-2026-10-03/xlsx/heatmap.svg new file mode 100644 index 0000000..eab42c8 --- /dev/null +++ b/results-2026-10-03/xlsx/heatmap.svg @@ -0,0 +1,4702 @@ + + + + + + + + 2026-10-02T17:02:15.340113 + image/svg+xml + + + Matplotlib v3.11.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/results-2026-10-03/xlsx/history.jsonl b/results-2026-10-03/xlsx/history.jsonl new file mode 100644 index 0000000..a4a96cc --- /dev/null +++ b/results-2026-10-03/xlsx/history.jsonl @@ -0,0 +1 @@ +{"run_date": "2026-10-03T00:00:02.123770+00:00", "commit": "b453355", "profile": "xlsx", "scores": {"openpyxl": {"cell_values": {"read": 3, "write": 3}, "formulas": {"read": 3, "write": 3}, "text_formatting": {"read": 3, "write": 3}, "background_colors": {"read": 3, "write": 3}, "number_formats": {"read": 3, "write": 3}, "alignment": {"read": 3, "write": 3}, "borders": {"read": 3, "write": 3}, "dimensions": {"read": 3, "write": 3}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 3, "write": 3}, "conditional_formatting": {"read": 3, "write": 3}, "data_validation": {"read": 3, "write": 3}, "hyperlinks": {"read": 3, "write": 3}, "images": {"read": 3, "write": 3}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 3, "write": 3}, "freeze_panes": {"read": 3, "write": 3}, "named_ranges": {"read": 3, "write": 3}, "tables": {"read": 3, "write": 3}, "sheet_protection": {"read": 3, "write": 3}, "page_setup": {"read": 3, "write": 3}, "chart_anchor": {"read": 3, "write": 3}}, "xlsxwriter": {"cell_values": {"read": null, "write": 3}, "formulas": {"read": null, "write": 3}, "text_formatting": {"read": null, "write": 3}, "background_colors": {"read": null, "write": 3}, "number_formats": {"read": null, "write": 3}, "alignment": {"read": null, "write": 1}, "borders": {"read": null, "write": 3}, "dimensions": {"read": null, "write": 3}, "multiple_sheets": {"read": null, "write": 3}, "merged_cells": {"read": null, "write": 3}, "conditional_formatting": {"read": null, "write": 3}, "data_validation": {"read": null, "write": 3}, "hyperlinks": {"read": null, "write": 3}, "images": {"read": null, "write": 3}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": 3}, "freeze_panes": {"read": null, "write": 3}, "named_ranges": {"read": null, "write": 0}, "tables": {"read": null, "write": 0}, "sheet_protection": {"read": null, "write": 0}, "page_setup": {"read": null, "write": 0}, "chart_anchor": {"read": null, "write": 0}}, "python-calamine": {"cell_values": {"read": 1, "write": null}, "formulas": {"read": 0, "write": null}, "text_formatting": {"read": 0, "write": null}, "background_colors": {"read": 0, "write": null}, "number_formats": {"read": 0, "write": null}, "alignment": {"read": 0, "write": null}, "borders": {"read": 0, "write": null}, "dimensions": {"read": 0, "write": null}, "multiple_sheets": {"read": 3, "write": null}, "merged_cells": {"read": 0, "write": null}, "conditional_formatting": {"read": 0, "write": null}, "data_validation": {"read": 0, "write": null}, "hyperlinks": {"read": 0, "write": null}, "images": {"read": 0, "write": null}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": null}, "freeze_panes": {"read": 0, "write": null}, "named_ranges": {"read": 0, "write": null}, "tables": {"read": 0, "write": null}, "sheet_protection": {"read": 0, "write": null}, "page_setup": {"read": 0, "write": null}, "chart_anchor": {"read": 0, "write": null}}, "aspose-cells-foss": {"cell_values": {"read": 1, "write": 3}, "formulas": {"read": 3, "write": 3}, "text_formatting": {"read": 1, "write": 0}, "background_colors": {"read": 3, "write": 3}, "number_formats": {"read": 3, "write": 3}, "alignment": {"read": 1, "write": 1}, "borders": {"read": 1, "write": 1}, "dimensions": {"read": 1, "write": 3}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 3, "write": 3}, "conditional_formatting": {"read": 3, "write": 3}, "data_validation": {"read": 3, "write": 3}, "hyperlinks": {"read": 0, "write": 3}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 3, "write": 0}, "freeze_panes": {"read": 3, "write": 3}, "named_ranges": {"read": 2, "write": 3}, "tables": {"read": 1, "write": 1}, "sheet_protection": {"read": 3, "write": 3}, "page_setup": {"read": 1, "write": 0}, "chart_anchor": {"read": 3, "write": 3}}, "wolfxl": {"cell_values": {"read": 3, "write": 3}, "formulas": {"read": 3, "write": 3}, "text_formatting": {"read": 3, "write": 3}, "background_colors": {"read": 3, "write": 3}, "number_formats": {"read": 3, "write": 3}, "alignment": {"read": 3, "write": 3}, "borders": {"read": 3, "write": 3}, "dimensions": {"read": 3, "write": 3}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 3, "write": 3}, "conditional_formatting": {"read": 3, "write": 3}, "data_validation": {"read": 3, "write": 3}, "hyperlinks": {"read": 3, "write": 3}, "images": {"read": 3, "write": 3}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 3, "write": 3}, "freeze_panes": {"read": 3, "write": 3}, "named_ranges": {"read": 3, "write": 3}, "tables": {"read": 3, "write": 3}, "sheet_protection": {"read": 3, "write": 3}, "page_setup": {"read": 3, "write": 3}, "chart_anchor": {"read": 3, "write": 3}}, "pylightxl": {"cell_values": {"read": 3, "write": 0}, "formulas": {"read": 0, "write": 3}, "text_formatting": {"read": 0, "write": 0}, "background_colors": {"read": 0, "write": 0}, "number_formats": {"read": 0, "write": 0}, "alignment": {"read": 0, "write": 0}, "borders": {"read": 0, "write": 0}, "dimensions": {"read": 0, "write": 0}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 0, "write": 0}, "conditional_formatting": {"read": 0, "write": 0}, "data_validation": {"read": 0, "write": 0}, "hyperlinks": {"read": 0, "write": 0}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": 0}, "freeze_panes": {"read": 0, "write": 0}, "named_ranges": {"read": 0, "write": 0}, "tables": {"read": 0, "write": 0}, "sheet_protection": {"read": 0, "write": 0}, "page_setup": {"read": 0, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}, "xlrd": {"cell_values": {"read": null, "write": null}, "formulas": {"read": null, "write": null}, "text_formatting": {"read": null, "write": null}, "background_colors": {"read": null, "write": null}, "number_formats": {"read": null, "write": null}, "alignment": {"read": null, "write": null}, "borders": {"read": null, "write": null}, "dimensions": {"read": null, "write": null}, "multiple_sheets": {"read": null, "write": null}, "merged_cells": {"read": null, "write": null}, "conditional_formatting": {"read": null, "write": null}, "data_validation": {"read": null, "write": null}, "hyperlinks": {"read": null, "write": null}, "images": {"read": null, "write": null}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": null}, "freeze_panes": {"read": null, "write": null}, "named_ranges": {"read": null, "write": null}, "tables": {"read": null, "write": null}, "sheet_protection": {"read": null, "write": null}, "page_setup": {"read": null, "write": null}, "chart_anchor": {"read": null, "write": null}}, "pyexcel": {"cell_values": {"read": 3, "write": 0}, "formulas": {"read": 0, "write": 3}, "text_formatting": {"read": 0, "write": 0}, "background_colors": {"read": 0, "write": 0}, "number_formats": {"read": 0, "write": 0}, "alignment": {"read": 0, "write": 0}, "borders": {"read": 0, "write": 0}, "dimensions": {"read": 0, "write": 0}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 0, "write": 0}, "conditional_formatting": {"read": 0, "write": 0}, "data_validation": {"read": 0, "write": 0}, "hyperlinks": {"read": 0, "write": 0}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": 0}, "freeze_panes": {"read": 0, "write": 0}, "named_ranges": {"read": 0, "write": 0}, "tables": {"read": 0, "write": 0}, "sheet_protection": {"read": 0, "write": 0}, "page_setup": {"read": 0, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}, "xlwt": {"cell_values": {"read": null, "write": 3}, "formulas": {"read": null, "write": 0}, "text_formatting": {"read": null, "write": 1}, "background_colors": {"read": null, "write": 1}, "number_formats": {"read": null, "write": 3}, "alignment": {"read": null, "write": 3}, "borders": {"read": null, "write": 1}, "dimensions": {"read": null, "write": 1}, "multiple_sheets": {"read": null, "write": 3}, "merged_cells": {"read": null, "write": 0}, "conditional_formatting": {"read": null, "write": 0}, "data_validation": {"read": null, "write": 0}, "hyperlinks": {"read": null, "write": 0}, "images": {"read": null, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": 0}, "freeze_panes": {"read": null, "write": 0}, "named_ranges": {"read": null, "write": 0}, "tables": {"read": null, "write": 0}, "sheet_protection": {"read": null, "write": 0}, "page_setup": {"read": null, "write": 0}, "chart_anchor": {"read": null, "write": 0}}, "pandas": {"cell_values": {"read": 1, "write": 3}, "formulas": {"read": 0, "write": 3}, "text_formatting": {"read": 0, "write": 0}, "background_colors": {"read": 0, "write": 0}, "number_formats": {"read": 0, "write": 0}, "alignment": {"read": 0, "write": 0}, "borders": {"read": 0, "write": 0}, "dimensions": {"read": 0, "write": 0}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 0, "write": 0}, "conditional_formatting": {"read": 0, "write": 0}, "data_validation": {"read": 0, "write": 0}, "hyperlinks": {"read": 0, "write": 0}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": 0}, "freeze_panes": {"read": 0, "write": 0}, "named_ranges": {"read": 0, "write": 0}, "tables": {"read": 0, "write": 0}, "sheet_protection": {"read": 0, "write": 0}, "page_setup": {"read": 0, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}, "xlsxwriter-constmem": {"cell_values": {"read": null, "write": 3}, "formulas": {"read": null, "write": 3}, "text_formatting": {"read": null, "write": 3}, "background_colors": {"read": null, "write": 3}, "number_formats": {"read": null, "write": 3}, "alignment": {"read": null, "write": 1}, "borders": {"read": null, "write": 3}, "dimensions": {"read": null, "write": 1}, "multiple_sheets": {"read": null, "write": 3}, "merged_cells": {"read": null, "write": 3}, "conditional_formatting": {"read": null, "write": 3}, "data_validation": {"read": null, "write": 3}, "hyperlinks": {"read": null, "write": 3}, "images": {"read": null, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": null, "write": 0}, "freeze_panes": {"read": null, "write": 3}, "named_ranges": {"read": null, "write": 0}, "tables": {"read": null, "write": 0}, "sheet_protection": {"read": null, "write": 0}, "page_setup": {"read": null, "write": 0}, "chart_anchor": {"read": null, "write": 0}}, "openpyxl-readonly": {"cell_values": {"read": 3, "write": null}, "formulas": {"read": 3, "write": null}, "text_formatting": {"read": 0, "write": null}, "background_colors": {"read": 0, "write": null}, "number_formats": {"read": 0, "write": null}, "alignment": {"read": 0, "write": null}, "borders": {"read": 0, "write": null}, "dimensions": {"read": 0, "write": null}, "multiple_sheets": {"read": 3, "write": null}, "merged_cells": {"read": 0, "write": null}, "conditional_formatting": {"read": 0, "write": null}, "data_validation": {"read": 0, "write": null}, "hyperlinks": {"read": 0, "write": null}, "images": {"read": 0, "write": null}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": null}, "freeze_panes": {"read": 0, "write": null}, "named_ranges": {"read": 0, "write": null}, "tables": {"read": 0, "write": null}, "sheet_protection": {"read": 0, "write": null}, "page_setup": {"read": 0, "write": null}, "chart_anchor": {"read": 0, "write": null}}, "polars": {"cell_values": {"read": 1, "write": null}, "formulas": {"read": 0, "write": null}, "text_formatting": {"read": 0, "write": null}, "background_colors": {"read": 0, "write": null}, "number_formats": {"read": 0, "write": null}, "alignment": {"read": 0, "write": null}, "borders": {"read": 0, "write": null}, "dimensions": {"read": 0, "write": null}, "multiple_sheets": {"read": 1, "write": null}, "merged_cells": {"read": 0, "write": null}, "conditional_formatting": {"read": 0, "write": null}, "data_validation": {"read": 0, "write": null}, "hyperlinks": {"read": 0, "write": null}, "images": {"read": 0, "write": null}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": null}, "freeze_panes": {"read": 0, "write": null}, "named_ranges": {"read": 0, "write": null}, "tables": {"read": 0, "write": null}, "sheet_protection": {"read": 0, "write": null}, "page_setup": {"read": 0, "write": null}, "chart_anchor": {"read": 0, "write": null}}, "tablib": {"cell_values": {"read": 3, "write": 3}, "formulas": {"read": 0, "write": 3}, "text_formatting": {"read": 0, "write": 0}, "background_colors": {"read": 0, "write": 0}, "number_formats": {"read": 0, "write": 0}, "alignment": {"read": 0, "write": 0}, "borders": {"read": 0, "write": 0}, "dimensions": {"read": 0, "write": 0}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 0, "write": 0}, "conditional_formatting": {"read": 0, "write": 0}, "data_validation": {"read": 0, "write": 0}, "hyperlinks": {"read": 0, "write": 0}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 0, "write": 0}, "freeze_panes": {"read": 0, "write": 0}, "named_ranges": {"read": 0, "write": 0}, "tables": {"read": 0, "write": 0}, "sheet_protection": {"read": 0, "write": 0}, "page_setup": {"read": 0, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}, "sheetjs": {"cell_values": {"read": 3, "write": 3}, "formulas": {"read": 1, "write": 3}, "text_formatting": {"read": 0, "write": 0}, "background_colors": {"read": 3, "write": 0}, "number_formats": {"read": 3, "write": 3}, "alignment": {"read": 0, "write": 0}, "borders": {"read": 0, "write": 0}, "dimensions": {"read": 3, "write": 1}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 3, "write": 2}, "conditional_formatting": {"read": 0, "write": 0}, "data_validation": {"read": 0, "write": 0}, "hyperlinks": {"read": 3, "write": 3}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 3, "write": 3}, "freeze_panes": {"read": 0, "write": 0}, "named_ranges": {"read": 3, "write": 3}, "tables": {"read": 0, "write": 0}, "sheet_protection": {"read": 0, "write": 3}, "page_setup": {"read": 0, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}, "exceljs": {"cell_values": {"read": 3, "write": 3}, "formulas": {"read": 1, "write": 3}, "text_formatting": {"read": 3, "write": 3}, "background_colors": {"read": 3, "write": 3}, "number_formats": {"read": 3, "write": 3}, "alignment": {"read": 3, "write": 3}, "borders": {"read": 3, "write": 3}, "dimensions": {"read": 3, "write": 3}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 3, "write": 3}, "conditional_formatting": {"read": 2, "write": 2}, "data_validation": {"read": 3, "write": 3}, "hyperlinks": {"read": 0, "write": 2}, "images": {"read": 0, "write": 0}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 3, "write": 3}, "freeze_panes": {"read": 3, "write": 3}, "named_ranges": {"read": 2, "write": 2}, "tables": {"read": 0, "write": 3}, "sheet_protection": {"read": 1, "write": 3}, "page_setup": {"read": 0, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}, "libreoffice": {"cell_values": {"read": 1, "write": 3}, "formulas": {"read": 1, "write": 3}, "text_formatting": {"read": 3, "write": 3}, "background_colors": {"read": 3, "write": 3}, "number_formats": {"read": 1, "write": 1}, "alignment": {"read": 3, "write": 3}, "borders": {"read": 3, "write": 3}, "dimensions": {"read": 1, "write": 3}, "multiple_sheets": {"read": 3, "write": 3}, "merged_cells": {"read": 3, "write": 3}, "conditional_formatting": {"read": 2, "write": 0}, "data_validation": {"read": 3, "write": 2}, "hyperlinks": {"read": 0, "write": 0}, "images": {"read": 3, "write": 3}, "pivot_tables": {"read": null, "write": null}, "comments": {"read": 3, "write": 3}, "freeze_panes": {"read": 3, "write": 2}, "named_ranges": {"read": 3, "write": 3}, "tables": {"read": 3, "write": 2}, "sheet_protection": {"read": 0, "write": 2}, "page_setup": {"read": 1, "write": 0}, "chart_anchor": {"read": 0, "write": 0}}}} diff --git a/results-2026-10-03/xlsx/matrix.csv b/results-2026-10-03/xlsx/matrix.csv new file mode 100644 index 0000000..7e29caa --- /dev/null +++ b/results-2026-10-03/xlsx/matrix.csv @@ -0,0 +1,375 @@ +library,feature,read_score,write_score +openpyxl,cell_values,3,3 +xlsxwriter,cell_values,,3 +python-calamine,cell_values,1, +aspose-cells-foss,cell_values,1,3 +wolfxl,cell_values,3,3 +pylightxl,cell_values,3,0 +xlrd,cell_values,, +pyexcel,cell_values,3,0 +xlwt,cell_values,,3 +pandas,cell_values,1,3 +xlsxwriter-constmem,cell_values,,3 +openpyxl-readonly,cell_values,3, +polars,cell_values,1, +tablib,cell_values,3,3 +sheetjs,cell_values,3,3 +exceljs,cell_values,3,3 +libreoffice,cell_values,1,3 +openpyxl,formulas,3,3 +xlsxwriter,formulas,,3 +python-calamine,formulas,0, +aspose-cells-foss,formulas,3,3 +wolfxl,formulas,3,3 +pylightxl,formulas,0,3 +xlrd,formulas,, +pyexcel,formulas,0,3 +xlwt,formulas,,0 +pandas,formulas,0,3 +xlsxwriter-constmem,formulas,,3 +openpyxl-readonly,formulas,3, +polars,formulas,0, +tablib,formulas,0,3 +sheetjs,formulas,1,3 +exceljs,formulas,1,3 +libreoffice,formulas,1,3 +openpyxl,text_formatting,3,3 +xlsxwriter,text_formatting,,3 +python-calamine,text_formatting,0, +aspose-cells-foss,text_formatting,1,0 +wolfxl,text_formatting,3,3 +pylightxl,text_formatting,0,0 +xlrd,text_formatting,, +pyexcel,text_formatting,0,0 +xlwt,text_formatting,,1 +pandas,text_formatting,0,0 +xlsxwriter-constmem,text_formatting,,3 +openpyxl-readonly,text_formatting,0, +polars,text_formatting,0, +tablib,text_formatting,0,0 +sheetjs,text_formatting,0,0 +exceljs,text_formatting,3,3 +libreoffice,text_formatting,3,3 +openpyxl,background_colors,3,3 +xlsxwriter,background_colors,,3 +python-calamine,background_colors,0, +aspose-cells-foss,background_colors,3,3 +wolfxl,background_colors,3,3 +pylightxl,background_colors,0,0 +xlrd,background_colors,, +pyexcel,background_colors,0,0 +xlwt,background_colors,,1 +pandas,background_colors,0,0 +xlsxwriter-constmem,background_colors,,3 +openpyxl-readonly,background_colors,0, +polars,background_colors,0, +tablib,background_colors,0,0 +sheetjs,background_colors,3,0 +exceljs,background_colors,3,3 +libreoffice,background_colors,3,3 +openpyxl,number_formats,3,3 +xlsxwriter,number_formats,,3 +python-calamine,number_formats,0, +aspose-cells-foss,number_formats,3,3 +wolfxl,number_formats,3,3 +pylightxl,number_formats,0,0 +xlrd,number_formats,, +pyexcel,number_formats,0,0 +xlwt,number_formats,,3 +pandas,number_formats,0,0 +xlsxwriter-constmem,number_formats,,3 +openpyxl-readonly,number_formats,0, +polars,number_formats,0, +tablib,number_formats,0,0 +sheetjs,number_formats,3,3 +exceljs,number_formats,3,3 +libreoffice,number_formats,1,1 +openpyxl,alignment,3,3 +xlsxwriter,alignment,,1 +python-calamine,alignment,0, +aspose-cells-foss,alignment,1,1 +wolfxl,alignment,3,3 +pylightxl,alignment,0,0 +xlrd,alignment,, +pyexcel,alignment,0,0 +xlwt,alignment,,3 +pandas,alignment,0,0 +xlsxwriter-constmem,alignment,,1 +openpyxl-readonly,alignment,0, +polars,alignment,0, +tablib,alignment,0,0 +sheetjs,alignment,0,0 +exceljs,alignment,3,3 +libreoffice,alignment,3,3 +openpyxl,borders,3,3 +xlsxwriter,borders,,3 +python-calamine,borders,0, +aspose-cells-foss,borders,1,1 +wolfxl,borders,3,3 +pylightxl,borders,0,0 +xlrd,borders,, +pyexcel,borders,0,0 +xlwt,borders,,1 +pandas,borders,0,0 +xlsxwriter-constmem,borders,,3 +openpyxl-readonly,borders,0, +polars,borders,0, +tablib,borders,0,0 +sheetjs,borders,0,0 +exceljs,borders,3,3 +libreoffice,borders,3,3 +openpyxl,dimensions,3,3 +xlsxwriter,dimensions,,3 +python-calamine,dimensions,0, +aspose-cells-foss,dimensions,1,3 +wolfxl,dimensions,3,3 +pylightxl,dimensions,0,0 +xlrd,dimensions,, +pyexcel,dimensions,0,0 +xlwt,dimensions,,1 +pandas,dimensions,0,0 +xlsxwriter-constmem,dimensions,,1 +openpyxl-readonly,dimensions,0, +polars,dimensions,0, +tablib,dimensions,0,0 +sheetjs,dimensions,3,1 +exceljs,dimensions,3,3 +libreoffice,dimensions,1,3 +openpyxl,multiple_sheets,3,3 +xlsxwriter,multiple_sheets,,3 +python-calamine,multiple_sheets,3, +aspose-cells-foss,multiple_sheets,3,3 +wolfxl,multiple_sheets,3,3 +pylightxl,multiple_sheets,3,3 +xlrd,multiple_sheets,, +pyexcel,multiple_sheets,3,3 +xlwt,multiple_sheets,,3 +pandas,multiple_sheets,3,3 +xlsxwriter-constmem,multiple_sheets,,3 +openpyxl-readonly,multiple_sheets,3, +polars,multiple_sheets,1, +tablib,multiple_sheets,3,3 +sheetjs,multiple_sheets,3,3 +exceljs,multiple_sheets,3,3 +libreoffice,multiple_sheets,3,3 +openpyxl,merged_cells,3,3 +xlsxwriter,merged_cells,,3 +python-calamine,merged_cells,0, +aspose-cells-foss,merged_cells,3,3 +wolfxl,merged_cells,3,3 +pylightxl,merged_cells,0,0 +xlrd,merged_cells,, +pyexcel,merged_cells,0,0 +xlwt,merged_cells,,0 +pandas,merged_cells,0,0 +xlsxwriter-constmem,merged_cells,,3 +openpyxl-readonly,merged_cells,0, +polars,merged_cells,0, +tablib,merged_cells,0,0 +sheetjs,merged_cells,3,2 +exceljs,merged_cells,3,3 +libreoffice,merged_cells,3,3 +openpyxl,conditional_formatting,3,3 +xlsxwriter,conditional_formatting,,3 +python-calamine,conditional_formatting,0, +aspose-cells-foss,conditional_formatting,3,3 +wolfxl,conditional_formatting,3,3 +pylightxl,conditional_formatting,0,0 +xlrd,conditional_formatting,, +pyexcel,conditional_formatting,0,0 +xlwt,conditional_formatting,,0 +pandas,conditional_formatting,0,0 +xlsxwriter-constmem,conditional_formatting,,3 +openpyxl-readonly,conditional_formatting,0, +polars,conditional_formatting,0, +tablib,conditional_formatting,0,0 +sheetjs,conditional_formatting,0,0 +exceljs,conditional_formatting,2,2 +libreoffice,conditional_formatting,2,0 +openpyxl,data_validation,3,3 +xlsxwriter,data_validation,,3 +python-calamine,data_validation,0, +aspose-cells-foss,data_validation,3,3 +wolfxl,data_validation,3,3 +pylightxl,data_validation,0,0 +xlrd,data_validation,, +pyexcel,data_validation,0,0 +xlwt,data_validation,,0 +pandas,data_validation,0,0 +xlsxwriter-constmem,data_validation,,3 +openpyxl-readonly,data_validation,0, +polars,data_validation,0, +tablib,data_validation,0,0 +sheetjs,data_validation,0,0 +exceljs,data_validation,3,3 +libreoffice,data_validation,3,2 +openpyxl,hyperlinks,3,3 +xlsxwriter,hyperlinks,,3 +python-calamine,hyperlinks,0, +aspose-cells-foss,hyperlinks,0,3 +wolfxl,hyperlinks,3,3 +pylightxl,hyperlinks,0,0 +xlrd,hyperlinks,, +pyexcel,hyperlinks,0,0 +xlwt,hyperlinks,,0 +pandas,hyperlinks,0,0 +xlsxwriter-constmem,hyperlinks,,3 +openpyxl-readonly,hyperlinks,0, +polars,hyperlinks,0, +tablib,hyperlinks,0,0 +sheetjs,hyperlinks,3,3 +exceljs,hyperlinks,0,2 +libreoffice,hyperlinks,0,0 +openpyxl,images,3,3 +xlsxwriter,images,,3 +python-calamine,images,0, +aspose-cells-foss,images,0,0 +wolfxl,images,3,3 +pylightxl,images,0,0 +xlrd,images,, +pyexcel,images,0,0 +xlwt,images,,0 +pandas,images,0,0 +xlsxwriter-constmem,images,,0 +openpyxl-readonly,images,0, +polars,images,0, +tablib,images,0,0 +sheetjs,images,0,0 +exceljs,images,0,0 +libreoffice,images,3,3 +openpyxl,pivot_tables,, +xlsxwriter,pivot_tables,, +python-calamine,pivot_tables,, +aspose-cells-foss,pivot_tables,, +wolfxl,pivot_tables,, +pylightxl,pivot_tables,, +xlrd,pivot_tables,, +pyexcel,pivot_tables,, +xlwt,pivot_tables,, +pandas,pivot_tables,, +xlsxwriter-constmem,pivot_tables,, +openpyxl-readonly,pivot_tables,, +polars,pivot_tables,, +tablib,pivot_tables,, +sheetjs,pivot_tables,, +exceljs,pivot_tables,, +libreoffice,pivot_tables,, +openpyxl,comments,3,3 +xlsxwriter,comments,,3 +python-calamine,comments,0, +aspose-cells-foss,comments,3,0 +wolfxl,comments,3,3 +pylightxl,comments,0,0 +xlrd,comments,, +pyexcel,comments,0,0 +xlwt,comments,,0 +pandas,comments,0,0 +xlsxwriter-constmem,comments,,0 +openpyxl-readonly,comments,0, +polars,comments,0, +tablib,comments,0,0 +sheetjs,comments,3,3 +exceljs,comments,3,3 +libreoffice,comments,3,3 +openpyxl,freeze_panes,3,3 +xlsxwriter,freeze_panes,,3 +python-calamine,freeze_panes,0, +aspose-cells-foss,freeze_panes,3,3 +wolfxl,freeze_panes,3,3 +pylightxl,freeze_panes,0,0 +xlrd,freeze_panes,, +pyexcel,freeze_panes,0,0 +xlwt,freeze_panes,,0 +pandas,freeze_panes,0,0 +xlsxwriter-constmem,freeze_panes,,3 +openpyxl-readonly,freeze_panes,0, +polars,freeze_panes,0, +tablib,freeze_panes,0,0 +sheetjs,freeze_panes,0,0 +exceljs,freeze_panes,3,3 +libreoffice,freeze_panes,3,2 +openpyxl,named_ranges,3,3 +xlsxwriter,named_ranges,,0 +python-calamine,named_ranges,0, +aspose-cells-foss,named_ranges,2,3 +wolfxl,named_ranges,3,3 +pylightxl,named_ranges,0,0 +xlrd,named_ranges,, +pyexcel,named_ranges,0,0 +xlwt,named_ranges,,0 +pandas,named_ranges,0,0 +xlsxwriter-constmem,named_ranges,,0 +openpyxl-readonly,named_ranges,0, +polars,named_ranges,0, +tablib,named_ranges,0,0 +sheetjs,named_ranges,3,3 +exceljs,named_ranges,2,2 +libreoffice,named_ranges,3,3 +openpyxl,tables,3,3 +xlsxwriter,tables,,0 +python-calamine,tables,0, +aspose-cells-foss,tables,1,1 +wolfxl,tables,3,3 +pylightxl,tables,0,0 +xlrd,tables,, +pyexcel,tables,0,0 +xlwt,tables,,0 +pandas,tables,0,0 +xlsxwriter-constmem,tables,,0 +openpyxl-readonly,tables,0, +polars,tables,0, +tablib,tables,0,0 +sheetjs,tables,0,0 +exceljs,tables,0,3 +libreoffice,tables,3,2 +openpyxl,sheet_protection,3,3 +xlsxwriter,sheet_protection,,0 +python-calamine,sheet_protection,0, +aspose-cells-foss,sheet_protection,3,3 +wolfxl,sheet_protection,3,3 +pylightxl,sheet_protection,0,0 +xlrd,sheet_protection,, +pyexcel,sheet_protection,0,0 +xlwt,sheet_protection,,0 +pandas,sheet_protection,0,0 +xlsxwriter-constmem,sheet_protection,,0 +openpyxl-readonly,sheet_protection,0, +polars,sheet_protection,0, +tablib,sheet_protection,0,0 +sheetjs,sheet_protection,0,3 +exceljs,sheet_protection,1,3 +libreoffice,sheet_protection,0,2 +openpyxl,page_setup,3,3 +xlsxwriter,page_setup,,0 +python-calamine,page_setup,0, +aspose-cells-foss,page_setup,1,0 +wolfxl,page_setup,3,3 +pylightxl,page_setup,0,0 +xlrd,page_setup,, +pyexcel,page_setup,0,0 +xlwt,page_setup,,0 +pandas,page_setup,0,0 +xlsxwriter-constmem,page_setup,,0 +openpyxl-readonly,page_setup,0, +polars,page_setup,0, +tablib,page_setup,0,0 +sheetjs,page_setup,0,0 +exceljs,page_setup,0,0 +libreoffice,page_setup,1,0 +openpyxl,chart_anchor,3,3 +xlsxwriter,chart_anchor,,0 +python-calamine,chart_anchor,0, +aspose-cells-foss,chart_anchor,3,3 +wolfxl,chart_anchor,3,3 +pylightxl,chart_anchor,0,0 +xlrd,chart_anchor,, +pyexcel,chart_anchor,0,0 +xlwt,chart_anchor,,0 +pandas,chart_anchor,0,0 +xlsxwriter-constmem,chart_anchor,,0 +openpyxl-readonly,chart_anchor,0, +polars,chart_anchor,0, +tablib,chart_anchor,0,0 +sheetjs,chart_anchor,0,0 +exceljs,chart_anchor,0,0 +libreoffice,chart_anchor,0,0 \ No newline at end of file diff --git a/results-2026-10-03/xlsx/results.json b/results-2026-10-03/xlsx/results.json new file mode 100644 index 0000000..0cb95a5 --- /dev/null +++ b/results-2026-10-03/xlsx/results.json @@ -0,0 +1,101215 @@ +{ + "metadata": { + "benchmark_version": "0.1.0", + "run_date": "2026-10-03T00:00:02.123770+00:00", + "excel_version": "16.105.3", + "platform": "Darwin-arm64", + "profile": "xlsx" + }, + "libraries": { + "openpyxl": { + "name": "openpyxl", + "version": "3.1.5", + "language": "python", + "capabilities": [ + "write", + "read" + ] + }, + "xlsxwriter": { + "name": "xlsxwriter", + "version": "3.2.9", + "language": "python", + "capabilities": [ + "write" + ] + }, + "python-calamine": { + "name": "python-calamine", + "version": "0.8.2", + "language": "python", + "capabilities": [ + "read" + ] + }, + "aspose-cells-foss": { + "name": "aspose-cells-foss", + "version": "26.7.0", + "language": "python", + "capabilities": [ + "write", + "read" + ] + }, + "wolfxl": { + "name": "wolfxl", + "version": "2.0.8", + "language": "python", + "capabilities": [ + "write", + "modify", + "read" + ] + }, + "pylightxl": { + "name": "pylightxl", + "version": "1.61", + "language": "python", + "capabilities": [ + "write", + "read" + ] + }, + "xlrd": { + "name": "xlrd", + "version": "2.0.2", + "language": "python", + "capabilities": [ + "read" + ] + }, + "pyexcel": { + "name": "pyexcel", + "version": "0.7.6", + "language": "python", + "capabilities": [ + "write", + "read" + ] + }, + "xlwt": { + "name": "xlwt", + "version": "1.3.0", + "language": "python", + "capabilities": [ + "write" + ] + }, + "pandas": { + "name": "pandas", + "version": "3.0.6", + "language": "python", + "capabilities": [ + "write", + "read" + ] + }, + "xlsxwriter-constmem": { + "name": "xlsxwriter-constmem", + "version": "3.2.9", + "language": "python", + "capabilities": [ + "write" + ] + }, + "openpyxl-readonly": { + "name": "openpyxl-readonly", + "version": "3.1.5", + "language": "python", + "capabilities": [ + "read" + ] + }, + "polars": { + "name": "polars", + "version": "1.44.2", + "language": "python", + "capabilities": [ + "read" + ] + }, + "tablib": { + "name": "tablib", + "version": "3.10.0", + "language": "python", + "capabilities": [ + "write", + "read" + ] + }, + "sheetjs": { + "name": "sheetjs", + "version": "0.20.3", + "language": "javascript", + "capabilities": [ + "write", + "modify", + "read" + ] + }, + "exceljs": { + "name": "exceljs", + "version": "4.4.0", + "language": "javascript", + "capabilities": [ + "write", + "modify", + "read" + ] + }, + "libreoffice": { + "name": "libreoffice", + "version": "26.8.0.3 (build bce0998afefdbc355585ca324285661a2170ba77)", + "language": "cli", + "capabilities": [ + "write", + "modify", + "read" + ] + } + }, + "results": [ + { + "feature": "cell_values", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "string_simple": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "python-calamine", + "scores": { + "read": 1, + "write": null + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_div0", + "sheet": "cell_values", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#DIV/0!'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_na", + "sheet": "cell_values", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#N/A'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_value", + "sheet": "cell_values", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#VALUE!'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": "Known limitation: python-calamine can surface formula error cells as blank values in current API responses." + }, + { + "feature": "cell_values", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": false, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "number", + "value": 46057 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "date_standard", + "sheet": "cell_values", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'date', 'value': '2026-02-04'}, actual={'type': 'number', 'value': 46057}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": false, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "number", + "value": 46057.43802083333 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "datetime", + "sheet": "cell_values", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'datetime', 'value': '2026-02-04T10:30:45'}, actual={'type': 'number', 'value': 46057.43802083333}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "pylightxl", + "scores": { + "read": 3, + "write": 0 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_simple", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_unicode", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": false, + "expected": { + "type": "blank" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_empty", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_long", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_newline", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_integer", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_float", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_negative", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_large", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_scientific", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": false, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "date_standard", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": false, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "datetime", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": false, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "boolean_true", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": false, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "boolean_false", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_div0", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_na", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_value", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": false, + "expected": { + "type": "blank" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "blank", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": "Known limitation: pylightxl cell-values write has date/boolean/error fidelity limits due to writer encoding behavior." + }, + { + "feature": "cell_values", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "cell_values", + "library": "pyexcel", + "scores": { + "read": 3, + "write": 0 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_simple", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_unicode", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": false, + "expected": { + "type": "blank" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_empty", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_long", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": false, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "string_newline", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_integer", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_float", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_negative", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_large", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": false, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "number_scientific", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": false, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "date_standard", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": false, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "datetime", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": false, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "boolean_true", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": false, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "boolean_false", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_div0", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_na", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": false, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "error_value", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": false, + "expected": { + "type": "blank" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "cell_values", + "operation": "write", + "test_case_id": "blank", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "xlwt", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "string_simple": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "pandas", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_div0", + "sheet": "cell_values", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#DIV/0!'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_na", + "sheet": "cell_values", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#N/A'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_value", + "sheet": "cell_values", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#VALUE!'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "string_simple": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "openpyxl-readonly", + "scores": { + "read": 3, + "write": null + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "polars", + "scores": { + "read": 1, + "write": null + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.141592654 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_div0", + "sheet": "cell_values", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#DIV/0!'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_na", + "sheet": "cell_values", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#N/A'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": false, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "error_value", + "sheet": "cell_values", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'error', 'value': '#VALUE!'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "tablib", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "libreoffice", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "string_simple": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Hello World" + }, + "actual": { + "type": "string", + "value": "Hello World" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - simple" + } + }, + "string_unicode": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "actual": { + "type": "string", + "value": "\u65e5\u672c\u8a9e\ud83c\udf89\u00e9mojis" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - unicode" + } + }, + "string_empty": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - empty" + } + }, + "string_long": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "actual": { + "type": "string", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - long (1000 chars)" + } + }, + "string_newline": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "actual": { + "type": "string", + "value": "Line 1\nLine 2\nLine 3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "String - with newlines" + } + }, + "number_integer": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 42 + }, + "actual": { + "type": "number", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - integer" + } + }, + "number_float": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 3.14159265358979 + }, + "actual": { + "type": "number", + "value": 3.14159265358979 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - float" + } + }, + "number_negative": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": -100.5 + }, + "actual": { + "type": "number", + "value": -100.5 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - negative" + } + }, + "number_large": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1234567890123456 + }, + "actual": { + "type": "number", + "value": 1234567890123456 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - large" + } + }, + "number_scientific": { + "read": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + }, + "write": { + "passed": true, + "expected": { + "type": "number", + "value": 1.23e-10 + }, + "actual": { + "type": "number", + "value": 1.23e-10 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Number - scientific notation" + } + }, + "date_standard": { + "read": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + }, + "write": { + "passed": true, + "expected": { + "type": "date", + "value": "2026-02-04" + }, + "actual": { + "type": "date", + "value": "2026-02-04" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Date - standard" + } + }, + "datetime": { + "read": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + }, + "write": { + "passed": true, + "expected": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "actual": { + "type": "datetime", + "value": "2026-02-04T10:30:45" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DateTime - with time" + } + }, + "boolean_true": { + "read": { + "passed": false, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "formula", + "value": "=TRUE()" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "boolean_true", + "sheet": "cell_values", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'boolean', 'value': True}, actual={'type': 'formula', 'value': '=TRUE()'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Boolean - TRUE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": true + }, + "actual": { + "type": "boolean", + "value": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - TRUE" + } + }, + "boolean_false": { + "read": { + "passed": false, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "formula", + "value": "=FALSE()" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "cell_values", + "operation": "read", + "test_case_id": "boolean_false", + "sheet": "cell_values", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'boolean', 'value': False}, actual={'type': 'formula', 'value': '=FALSE()'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Boolean - FALSE" + }, + "write": { + "passed": true, + "expected": { + "type": "boolean", + "value": false + }, + "actual": { + "type": "boolean", + "value": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Boolean - FALSE" + } + }, + "error_div0": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#DIV/0!" + }, + "actual": { + "type": "error", + "value": "#DIV/0!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #DIV/0!" + } + }, + "error_na": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#N/A" + }, + "actual": { + "type": "error", + "value": "#N/A" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #N/A" + } + }, + "error_value": { + "read": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + }, + "write": { + "passed": true, + "expected": { + "type": "error", + "value": "#VALUE!" + }, + "actual": { + "type": "error", + "value": "#VALUE!" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Error - #VALUE!" + } + }, + "blank": { + "read": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + }, + "write": { + "passed": true, + "expected": { + "type": "blank" + }, + "actual": { + "type": "blank" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Blank cell" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got blank", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got error" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got error", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "formulas", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got error" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got error", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "formula_sum": { + "write": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "write", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "write": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "write", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "write": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "write", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "write": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "write", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "pandas", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got blank", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "openpyxl-readonly", + "scores": { + "read": 3, + "write": null + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got blank", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "tablib", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_sum", + "sheet": "formulas", + "cell": "B2" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got error" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got error", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "error": "Expected formula, got string" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_concat", + "sheet": "formulas", + "cell": "B4" + }, + "adapter_message": "RuntimeError: Expected formula, got string", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "error": "Expected formula, got number" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cross_sheet", + "sheet": "formulas", + "cell": "B5" + }, + "adapter_message": "RuntimeError: Expected formula, got number", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "sheetjs", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got error" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got error", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "exceljs", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got error" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got error", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "libreoffice", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "formula_sum": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "actual": { + "type": "formula", + "formula": "=SUM(1,2,3)" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - SUM" + } + }, + "formula_cell_ref": { + "read": { + "passed": false, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "error": "Expected formula, got error" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "formulas", + "operation": "read", + "test_case_id": "formula_cell_ref", + "sheet": "formulas", + "cell": "B3" + }, + "adapter_message": "RuntimeError: Expected formula, got error", + "probable_cause": "Adapter could not return a comparable value for this assertion.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Formula - cell reference" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A3*2" + }, + "actual": { + "type": "formula", + "formula": "=A3*2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cell reference" + } + }, + "formula_concat": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "actual": { + "type": "formula", + "formula": "=A4&\" \"&A5" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - concat" + } + }, + "formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + }, + "write": { + "passed": true, + "expected": { + "type": "formula", + "formula": "='References'!B2" + }, + "actual": { + "type": "formula", + "formula": "='References'!B2" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Formula - cross sheet" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bold": { + "read": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Aptos Narrow", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Aptos Narrow", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Aptos Narrow", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 12.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bold": { + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 0 + }, + "test_cases": { + "bold": { + "read": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": false, + "expected": { + "bold": true + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": false, + "expected": { + "italic": true + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "italic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_single", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "single", + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={'underline': 'single', 'font_name': 'Aptos Narrow', 'font_size': 12.0, 'font_color': '#000000'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_double", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "strikethrough", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold_italic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 8.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_8", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 14.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_14", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 24.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_24", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 36.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_36", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_arial", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_times", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_courier", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "error": "aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "combined", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants.", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss supports only a single underline, not accounting or double variants.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bold": { + "read": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 8.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 14.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 24.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 36.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 12.0, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": false, + "expected": { + "bold": true + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": false, + "expected": { + "italic": true + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "italic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_single", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_double", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "strikethrough", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold_italic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_8", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_14", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_24", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_36", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_arial", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_times", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_courier", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "combined", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "text_formatting", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": false, + "expected": { + "bold": true + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": false, + "expected": { + "italic": true + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "italic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_single", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_double", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "strikethrough", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold_italic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_8", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_14", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_24", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_36", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_arial", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_times", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_courier", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "combined", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "xlwt", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "bold": { + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Arial", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Arial", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Arial", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Arial", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#008000" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Arial', 'font_size': 10.0, 'font_color': '#008000'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#993300" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Arial', 'font_size': 10.0, 'font_color': '#993300'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Arial", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": false, + "expected": { + "bold": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": false, + "expected": { + "italic": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bold": { + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 11.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Calibri", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": false, + "expected": { + "bold": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": false, + "expected": { + "italic": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 11.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bold": { + "read": { + "passed": false, + "expected": { + "bold": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": false, + "expected": { + "bold": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold", + "sheet": "text_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": false, + "expected": { + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": false, + "expected": { + "italic": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "italic", + "sheet": "text_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'italic': True}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": false, + "expected": { + "underline": "single" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_single", + "sheet": "text_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'single'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": false, + "expected": { + "underline": "double" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "underline_double", + "sheet": "text_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'underline': 'double'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": false, + "expected": { + "strikethrough": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "strikethrough", + "sheet": "text_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'strikethrough': True}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "bold_italic", + "sheet": "text_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": false, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_8", + "sheet": "text_formatting", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 8}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": false, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_14", + "sheet": "text_formatting", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 14}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": false, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_24", + "sheet": "text_formatting", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 24}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": false, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_size_36", + "sheet": "text_formatting", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_size': 36}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_arial", + "sheet": "text_formatting", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_times", + "sheet": "text_formatting", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": false, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "font_courier", + "sheet": "text_formatting", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_red", + "sheet": "text_formatting", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_blue", + "sheet": "text_formatting", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_green", + "sheet": "text_formatting", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "text_formatting", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "read", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": false, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Calibri", + "font_size": 12.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "text_formatting", + "operation": "write", + "test_case_id": "combined", + "sheet": "text_formatting", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 12.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bold": { + "read": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Aptos Narrow", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Aptos Narrow", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Aptos Narrow", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 8 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 14 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 24 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 36 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 12 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 16, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bold": { + "read": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + }, + "write": { + "passed": true, + "expected": { + "bold": true + }, + "actual": { + "bold": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold" + } + }, + "italic": { + "read": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + }, + "write": { + "passed": true, + "expected": { + "italic": true + }, + "actual": { + "italic": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Italic" + } + }, + "underline_single": { + "read": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + }, + "write": { + "passed": true, + "expected": { + "underline": "single" + }, + "actual": { + "underline": "single", + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - single" + } + }, + "underline_double": { + "read": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + }, + "write": { + "passed": true, + "expected": { + "underline": "double" + }, + "actual": { + "underline": "double", + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Underline - double" + } + }, + "strikethrough": { + "read": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + }, + "write": { + "passed": true, + "expected": { + "strikethrough": true + }, + "actual": { + "strikethrough": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Strikethrough" + } + }, + "bold_italic": { + "read": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "italic": true + }, + "actual": { + "bold": true, + "italic": true, + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Bold + Italic" + } + }, + "font_size_8": { + "read": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 8, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + }, + "write": { + "passed": true, + "expected": { + "font_size": 8 + }, + "actual": { + "font_name": "Arial", + "font_size": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 8" + } + }, + "font_size_14": { + "read": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 14, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + }, + "write": { + "passed": true, + "expected": { + "font_size": 14 + }, + "actual": { + "font_name": "Arial", + "font_size": 14.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 14" + } + }, + "font_size_24": { + "read": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 24, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + }, + "write": { + "passed": true, + "expected": { + "font_size": 24 + }, + "actual": { + "font_name": "Arial", + "font_size": 24.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 24" + } + }, + "font_size_36": { + "read": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 36, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + }, + "write": { + "passed": true, + "expected": { + "font_size": 36 + }, + "actual": { + "font_name": "Arial", + "font_size": 36.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font size 36" + } + }, + "font_arial": { + "read": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Arial" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Arial" + } + }, + "font_times": { + "read": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Times New Roman" + }, + "actual": { + "font_name": "Times New Roman", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Times New Roman" + } + }, + "font_courier": { + "read": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 12, + "font_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + }, + "write": { + "passed": true, + "expected": { + "font_name": "Courier New" + }, + "actual": { + "font_name": "Courier New", + "font_size": 10.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font - Courier New" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#FF0000" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - red" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#0000FF" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - blue" + } + }, + "color_green": { + "read": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#00FF00" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - green" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Aptos Narrow", + "font_size": 12, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "font_color": "#8B4513" + }, + "actual": { + "font_name": "Arial", + "font_size": 10.0, + "font_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Font color - custom (#8B4513)" + } + }, + "combined": { + "read": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Aptos Narrow", + "font_size": 16, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + }, + "write": { + "passed": true, + "expected": { + "bold": true, + "font_size": 16, + "font_color": "#FF0000" + }, + "actual": { + "bold": true, + "font_name": "Arial", + "font_size": 16.0, + "font_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Combined - bold, 16pt, red" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bg_red": { + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_green", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "background_colors", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_green", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "xlwt", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "bg_red": { + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "write": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#008000" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={'bg_color': '#008000'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "write": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#993300" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={'bg_color': '#993300'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "bg_red": { + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "read", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 0 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_red", + "sheet": "background_colors", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_blue", + "sheet": "background_colors", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#00FF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_green", + "sheet": "background_colors", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "bg_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "background_colors", + "operation": "write", + "test_case_id": "bg_custom", + "sheet": "background_colors", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "bg_red": { + "read": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#FF0000" + }, + "actual": { + "bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - red" + } + }, + "bg_blue": { + "read": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#0000FF" + }, + "actual": { + "bg_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - blue" + } + }, + "bg_green": { + "read": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#00FF00" + }, + "actual": { + "bg_color": "#00FF00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - green" + } + }, + "bg_custom": { + "read": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "bg_color": "#8B4513" + }, + "actual": { + "bg_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Background - custom (#8B4513)" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_currency", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_percent", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_date", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_scientific", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_custom_text", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "number_formats", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_currency", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_percent", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_date", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_scientific", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_custom_text", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "xlwt", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_percent", + "sheet": "number_formats", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": false, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_scientific", + "sheet": "number_formats", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "General" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={'number_format': 'General'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "libreoffice", + "scores": { + "read": 1, + "write": 1 + }, + "test_cases": { + "numfmt_currency": { + "read": { + "passed": true, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "$#,##0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - currency" + }, + "write": { + "passed": false, + "expected": { + "number_format": "$#,##0.00" + }, + "actual": { + "number_format": "\\$#,##0.00" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_currency", + "sheet": "number_formats", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={'number_format': '\\\\$#,##0.00'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - currency" + } + }, + "numfmt_percent": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00%" + }, + "actual": { + "number_format": "0.00%" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - percent" + } + }, + "numfmt_date": { + "read": { + "passed": false, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "YYYY-MM-DD" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "read", + "test_case_id": "numfmt_date", + "sheet": "number_formats", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={'number_format': 'YYYY-MM-DD'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - date" + }, + "write": { + "passed": true, + "expected": { + "number_format": "yyyy-mm-dd" + }, + "actual": { + "number_format": "yyyy-mm-dd" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - date" + } + }, + "numfmt_scientific": { + "read": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + }, + "write": { + "passed": true, + "expected": { + "number_format": "0.00E+00" + }, + "actual": { + "number_format": "0.00E+00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - scientific" + } + }, + "numfmt_custom_text": { + "read": { + "passed": true, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD\" 0.00" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Format - custom text" + }, + "write": { + "passed": false, + "expected": { + "number_format": "\"USD\" 0.00" + }, + "actual": { + "number_format": "\"USD \"0.00" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "number_formats", + "operation": "write", + "test_case_id": "numfmt_custom_text", + "sheet": "number_formats", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'number_format': '\"USD\" 0.00'}, actual={'number_format': '\"USD \"0.00'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Format - custom text" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "h_left": { + "read": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "h_left": { + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "h_align": "left", + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": "Known limitation: python-calamine alignment read is limited because its API does not expose style/alignment metadata." + }, + { + "feature": "alignment", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 1 + }, + "test_cases": { + "h_left": { + "read": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "h_left": { + "read": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_left", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_center", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_right", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_top", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_center", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "wrap_text", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "rotation_45", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": { + "error": "pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "indent_2", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": "Known limitation: pylightxl alignment write is a no-op because the library does not support formatting writes." + }, + { + "feature": "alignment", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "alignment", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_left", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_center", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_right", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_top", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_center", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "wrap_text", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "rotation_45", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": { + "error": "pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "indent_2", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "xlwt", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "h_left": { + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "v_align": "bottom", + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "v_align": "bottom", + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "v_align": "bottom", + "indent": 2 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "h_left": { + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "h_align": "left", + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "h_left": { + "read": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": false, + "expected": { + "h_align": "left" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_left", + "sheet": "alignment", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'left'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "h_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_center", + "sheet": "alignment", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": false, + "expected": { + "h_align": "right" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "h_right", + "sheet": "alignment", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'h_align': 'right'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": false, + "expected": { + "v_align": "top" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_top", + "sheet": "alignment", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'top'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": false, + "expected": { + "v_align": "center" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_center", + "sheet": "alignment", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'center'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": false, + "expected": { + "v_align": "bottom" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "v_bottom", + "sheet": "alignment", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": false, + "expected": { + "wrap": true + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "wrap_text", + "sheet": "alignment", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'wrap': True}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": false, + "expected": { + "rotation": 45 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "rotation_45", + "sheet": "alignment", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'rotation': 45}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "read", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": false, + "expected": { + "indent": 2 + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "alignment", + "operation": "write", + "test_case_id": "indent_2", + "sheet": "alignment", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'indent': 2}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "h_left": { + "read": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "h_left": { + "read": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left", + "v_align": "bottom", + "wrap": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + }, + "write": { + "passed": true, + "expected": { + "h_align": "left" + }, + "actual": { + "h_align": "left", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - left" + } + }, + "h_center": { + "read": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center", + "v_align": "bottom", + "wrap": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "h_align": "center" + }, + "actual": { + "h_align": "center", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "h_right": { + "read": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right", + "v_align": "bottom", + "wrap": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + }, + "write": { + "passed": true, + "expected": { + "h_align": "right" + }, + "actual": { + "h_align": "right", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - right" + } + }, + "v_top": { + "read": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "v_align": "top", + "wrap": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + }, + "write": { + "passed": true, + "expected": { + "v_align": "top" + }, + "actual": { + "h_align": "general", + "v_align": "top" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - top" + } + }, + "v_center": { + "read": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "v_align": "center", + "wrap": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + }, + "write": { + "passed": true, + "expected": { + "v_align": "center" + }, + "actual": { + "h_align": "general", + "v_align": "center" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - center" + } + }, + "v_bottom": { + "read": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "v_align": "bottom", + "wrap": false + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + }, + "write": { + "passed": true, + "expected": { + "v_align": "bottom" + }, + "actual": { + "h_align": "general", + "v_align": "bottom" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - bottom" + } + }, + "wrap_text": { + "read": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "v_align": "bottom", + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + }, + "write": { + "passed": true, + "expected": { + "wrap": true + }, + "actual": { + "h_align": "general", + "v_align": "bottom", + "wrap": true + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - wrap text" + } + }, + "rotation_45": { + "read": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "h_align": "left", + "v_align": "bottom", + "wrap": false, + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + }, + "write": { + "passed": true, + "expected": { + "rotation": 45 + }, + "actual": { + "h_align": "general", + "v_align": "bottom", + "rotation": 45 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - rotation 45" + } + }, + "indent_2": { + "read": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "v_align": "bottom", + "wrap": false, + "indent": 2 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + }, + "write": { + "passed": true, + "expected": { + "indent": 2 + }, + "actual": { + "h_align": "general", + "v_align": "bottom", + "indent": 2.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Align - indent 2" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "thin_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 1 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thin_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "medium_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thick_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "double", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dashed", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dotted", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "top_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "bottom_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "left_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "right_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_styles", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "error": "pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "borders", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thin_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "medium_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thick_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "double", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dashed", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dotted", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "top_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "bottom_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "left_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "right_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_styles", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "error": "pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells", + "probable_cause": "pyexcel exposes value-only cells", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel exposes value-only cells", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "xlwt", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "thin_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={'border_diagonal_down': 'thin'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={'border_diagonal_up': 'thin'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#993300" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={'border_style': 'thin', 'border_color': '#993300'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#008000", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={'border_top_color': '#FF0000', 'border_bottom_color': '#008000', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00', 'border_style': 'thin'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "thin_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thin_all", + "sheet": "borders", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thin_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "medium_all", + "sheet": "borders", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "medium_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "thick_all", + "sheet": "borders", + "cell": "B4" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "thick_all", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "double", + "sheet": "borders", + "cell": "B5" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": false, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "double", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dashed", + "sheet": "borders", + "cell": "B6" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dashed", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dotted", + "sheet": "borders", + "cell": "B7" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dotted", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot", + "sheet": "borders", + "cell": "B8" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "dash_dot_dot", + "sheet": "borders", + "cell": "B9" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": false, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "dash_dot_dot", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "top_only", + "sheet": "borders", + "cell": "B10" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "top_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "bottom_only", + "sheet": "borders", + "cell": "B11" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "bottom_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "left_only", + "sheet": "borders", + "cell": "B12" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "left_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "right_only", + "sheet": "borders", + "cell": "B13" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": false, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "right_only", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_up", + "sheet": "borders", + "cell": "B14" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_up", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_down", + "sheet": "borders", + "cell": "B15" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_down", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "diagonal_both", + "sheet": "borders", + "cell": "B16" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": false, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "diagonal_both", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_red", + "sheet": "borders", + "cell": "B17" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_red", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_blue", + "sheet": "borders", + "cell": "B18" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_blue", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "color_custom", + "sheet": "borders", + "cell": "B19" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": false, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "color_custom", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_styles", + "sheet": "borders", + "cell": "B20" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_styles", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "read", + "test_case_id": "mixed_colors", + "sheet": "borders", + "cell": "B21" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": false, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "error": "sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "borders", + "operation": "write", + "test_case_id": "mixed_colors", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "thin_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#000000" + }, + "actual": { + "border_style": "thin", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thin all edges" + } + }, + "medium_all": { + "read": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "medium", + "border_color": "#000000" + }, + "actual": { + "border_style": "medium", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - medium all edges" + } + }, + "thick_all": { + "read": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thick", + "border_color": "#000000" + }, + "actual": { + "border_style": "thick", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - thick all edges" + } + }, + "double": { + "read": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + }, + "write": { + "passed": true, + "expected": { + "border_style": "double", + "border_color": "#000000" + }, + "actual": { + "border_style": "double", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - double line" + } + }, + "dashed": { + "read": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashed", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dashed" + } + }, + "dotted": { + "read": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dotted", + "border_color": "#000000" + }, + "actual": { + "border_style": "dotted", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dotted" + } + }, + "dash_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot" + } + }, + "dash_dot_dot": { + "read": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + }, + "write": { + "passed": true, + "expected": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "actual": { + "border_style": "dashDotDot", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - dash-dot-dot" + } + }, + "top_only": { + "read": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thin", + "border_bottom": null, + "border_left": null, + "border_right": null + }, + "actual": { + "border_top": "thin", + "border_top_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - top only" + } + }, + "bottom_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": "thin", + "border_left": null, + "border_right": null + }, + "actual": { + "border_bottom": "thin", + "border_bottom_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - bottom only" + } + }, + "left_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": "thin", + "border_right": null + }, + "actual": { + "border_left": "thin", + "border_left_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - left only" + } + }, + "right_only": { + "read": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + }, + "write": { + "passed": true, + "expected": { + "border_top": null, + "border_bottom": null, + "border_left": null, + "border_right": "thin" + }, + "actual": { + "border_right": "thin", + "border_right_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - right only" + } + }, + "diagonal_up": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin" + }, + "actual": { + "border_diagonal_up": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal up" + } + }, + "diagonal_down": { + "read": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal down" + } + }, + "diagonal_both": { + "read": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + }, + "write": { + "passed": true, + "expected": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "actual": { + "border_diagonal_up": "thin", + "border_diagonal_down": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - diagonal both" + } + }, + "color_red": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "actual": { + "border_style": "thin", + "border_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - red color" + } + }, + "color_blue": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "actual": { + "border_style": "thin", + "border_color": "#0000FF" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - blue color" + } + }, + "color_custom": { + "read": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + }, + "write": { + "passed": true, + "expected": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "actual": { + "border_style": "thin", + "border_color": "#8B4513" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - custom color (#8B4513)" + } + }, + "mixed_styles": { + "read": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed" + }, + "actual": { + "border_top": "thick", + "border_bottom": "thin", + "border_left": "medium", + "border_right": "dashed", + "border_color": "#000000" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed styles per edge" + } + }, + "mixed_colors": { + "read": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + }, + "write": { + "passed": true, + "expected": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00" + }, + "actual": { + "border_top_color": "#FF0000", + "border_bottom_color": "#00FF00", + "border_left_color": "#0000FF", + "border_right_color": "#FFFF00", + "border_style": "thin" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Border - mixed colors per edge" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.83203125 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 20.83203125}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.83203125 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 8.83203125}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "error": "pylightxl does not support set_row_height: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": null, + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "error": "pylightxl does not support set_row_height: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": null, + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "error": "pylightxl does not support set_row_height: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_20", + "sheet": null, + "cell": "D4" + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "error": "pylightxl does not support set_row_height: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_8", + "sheet": null, + "cell": "E5" + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "dimensions", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "error": "pyexcel does not support set_row_height: pyexcel does not expose row dimension writing" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": null, + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing", + "probable_cause": "pyexcel does not expose row dimension writing", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose row dimension writing", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "error": "pyexcel does not support set_row_height: pyexcel does not expose row dimension writing" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": null, + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing", + "probable_cause": "pyexcel does not expose row dimension writing", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose row dimension writing", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "error": "pyexcel does not support set_row_height: pyexcel does not expose row dimension writing" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_20", + "sheet": null, + "cell": "D4" + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing", + "probable_cause": "pyexcel does not expose row dimension writing", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose row dimension writing", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "error": "pyexcel does not support set_row_height: pyexcel does not expose row dimension writing" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_8", + "sheet": null, + "cell": "E5" + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing", + "probable_cause": "pyexcel does not expose row dimension writing", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose row dimension writing", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "xlwt", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "row_height_30": { + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 13.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 13.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 13.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 13.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 1 + }, + "test_cases": { + "row_height_30": { + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 13.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 13.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 13.0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 13.0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 1 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": false, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_30", + "sheet": "dimensions", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": false, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "write", + "test_case_id": "row_height_45", + "sheet": "dimensions", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "libreoffice", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "row_height_30": { + "read": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + }, + "write": { + "passed": true, + "expected": { + "row_height": 30 + }, + "actual": { + "row_height": 30.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 30" + } + }, + "row_height_45": { + "read": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + }, + "write": { + "passed": true, + "expected": { + "row_height": 45 + }, + "actual": { + "row_height": 45.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Row height - 45" + } + }, + "col_width_20": { + "read": { + "passed": false, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 19.998 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_20", + "sheet": "dimensions", + "cell": "D4" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 19.998}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - D = 20" + }, + "write": { + "passed": true, + "expected": { + "column_width": 20 + }, + "actual": { + "column_width": 20.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - D = 20" + } + }, + "col_width_8": { + "read": { + "passed": false, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 7.998 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "dimensions", + "operation": "read", + "test_case_id": "col_width_8", + "sheet": "dimensions", + "cell": "E5" + }, + "adapter_message": "Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 7.998}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Column width - E = 8" + }, + "write": { + "passed": true, + "expected": { + "column_width": 8 + }, + "actual": { + "column_width": 8.0 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Column width - E = 8" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "python-calamine", + "scores": { + "read": 3, + "write": null + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "pylightxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "multiple_sheets", + "library": "pyexcel", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlwt", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "pandas", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "openpyxl-readonly", + "scores": { + "read": 3, + "write": null + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "polars", + "scores": { + "read": 1, + "write": null + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": false, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "multiple_sheets", + "operation": "read", + "test_case_id": "value_beta", + "sheet": "Beta", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'string', 'value': 'Beta'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": false, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "blank" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "multiple_sheets", + "operation": "read", + "test_case_id": "value_gamma", + "sheet": "Gamma", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'type': 'string', 'value': 'Gamma'}, actual={'type': 'blank'}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "tablib", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "sheet_names": { + "read": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + }, + "write": { + "passed": true, + "expected": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "actual": { + "sheet_names": [ + "Alpha", + "Beta", + "Gamma" + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Sheet names" + } + }, + "value_alpha": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Alpha" + }, + "actual": { + "type": "string", + "value": "Alpha" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Alpha value" + } + }, + "value_beta": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Beta" + }, + "actual": { + "type": "string", + "value": "Beta" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Beta value" + } + }, + "value_gamma": { + "read": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + }, + "write": { + "passed": true, + "expected": { + "type": "string", + "value": "Gamma" + }, + "actual": { + "type": "string", + "value": "Gamma" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Gamma value" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "error": "pylightxl does not support merge_cells: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_horizontal", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "error": "pylightxl does not support merge_cells: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_vertical", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "error": "pylightxl does not support merge_cells: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_value_off_top_left", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "error": "pylightxl does not support merge_cells: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_top_left_fill", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "merged_cells", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "error": "pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_horizontal", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "error": "pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_vertical", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "error": "pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_value_off_top_left", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "error": "pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_top_left_fill", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "merge_horizontal": { + "write": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': 'B2:D2', 'top_left_value': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "write": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': 'B3:B5', 'top_left_value': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "write": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": null, + "non_top_left_nonempty": 0 + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': 'B6:D6', 'top_left_value': None, 'non_top_left_nonempty': 0}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "write": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": null, + "top_left_bg_color": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': 'B7:D7', 'top_left_value': None, 'top_left_bg_color': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_horizontal", + "sheet": "merged_cells", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_vertical", + "sheet": "merged_cells", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_value_off_top_left", + "sheet": "merged_cells", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "merge_drift", + "suggested_next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "explanation": { + "code": "merge_drift", + "summary": "merged-cell metadata changed", + "probable_cause": "merged range XML or non-anchor cell handling differs", + "next_step": "inspect mergeCells in the worksheet XML and subordinate cell behavior", + "tag": "merge" + } + } + ], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "read", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 2 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": false, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "merged_cells", + "operation": "write", + "test_case_id": "merge_top_left_fill", + "sheet": "merged_cells", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "merge_horizontal": { + "read": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "actual": { + "merged_range": "B2:D2", + "top_left_value": "Merged" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge horizontal B2:D2" + } + }, + "merge_vertical": { + "read": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "actual": { + "merged_range": "B3:B5", + "top_left_value": "Vertical" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Merge vertical B3:B5" + } + }, + "merge_value_off_top_left": { + "read": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "actual": { + "merged_range": "B6:D6", + "top_left_value": "OffTop", + "non_top_left_nonempty": 0 + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with non-top-left value" + } + }, + "merge_top_left_fill": { + "read": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + }, + "write": { + "passed": true, + "expected": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "actual": { + "merged_range": "B7:D7", + "top_left_value": "Fill", + "top_left_bg_color": "#FF0000" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Merge with top-left fill" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "conditional_formatting", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting", + "probable_cause": "xlwt cannot author conditional formatting", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author conditional formatting", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting", + "probable_cause": "xlwt cannot author conditional formatting", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author conditional formatting", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting", + "probable_cause": "xlwt cannot author conditional formatting", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author conditional formatting", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting", + "probable_cause": "xlwt cannot author conditional formatting", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author conditional formatting", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting", + "probable_cause": "xlwt cannot author conditional formatting", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author conditional formatting", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting", + "probable_cause": "xlwt cannot author conditional formatting", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author conditional formatting", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "cf_cell_gt": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_data_bar", + "sheet": "conditional_formatting", + "cell": "B5" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "error": "sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_data_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "error": "sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "error": "sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no conditional formatting API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "exceljs", + "scores": { + "read": 2, + "write": 2 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": null, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#FF0000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": null, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#FF0000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "libreoffice", + "scores": { + "read": 2, + "write": 0 + }, + "test_cases": { + "cf_cell_gt": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "priority": 1, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "cellIs", + "operator": "greaterThan", + "formula": "5", + "format": { + "bg_color": "#000000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_cell_gt", + "sheet": "conditional_formatting", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'format': {'bg_color': '#000000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "CF: cell > 5 (yellow fill)" + } + }, + "cf_formula_cross_sheet": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#FF00FF" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "priority": 2, + "format": { + "bg_color": "#FF00FF" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=Ref!$A$1>5", + "format": { + "bg_color": "#000000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_formula_cross_sheet", + "sheet": "conditional_formatting", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'format': {'bg_color': '#000000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: formula rule with cross-sheet ref" + } + }, + "cf_text_contains": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#FFFF00" + } + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: text contains" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "priority": 3, + "format": { + "bg_color": "#FFFF00" + } + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "expression", + "formula": "=ISNUMBER(SEARCH(\"foo\",B2))", + "format": { + "bg_color": "#000000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_text_contains", + "sheet": "conditional_formatting", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH(\"foo\",B2))', 'format': {'bg_color': '#000000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: text contains" + } + }, + "cf_data_bar": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + }, + "write": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar", + "priority": 4 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "dataBar" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: data bar" + } + }, + "cf_color_scale": { + "read": { + "passed": true, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "CF: 3-color scale" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B2:B6", + "rule_type": "colorScale", + "priority": 5 + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_color_scale", + "sheet": "conditional_formatting", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: 3-color scale" + } + }, + "cf_stop_if_true": { + "read": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": null, + "format": { + "bg_color": "#FF0000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "read", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#FF0000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + }, + "write": { + "passed": false, + "expected": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "priority": 1, + "stop_if_true": true, + "format": { + "bg_color": "#FF0000" + } + } + }, + "actual": { + "cf_rule": { + "range": "B7:B9", + "rule_type": "cellIs", + "operator": "lessThan", + "formula": "3", + "stop_if_true": null, + "format": { + "bg_color": "#000000" + } + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "conditional_formatting", + "operation": "write", + "test_case_id": "cf_stop_if_true", + "sheet": "conditional_formatting", + "cell": "B7" + }, + "adapter_message": "Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#000000'}}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "CF: stop-if-true priority" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "pylightxl does not support add_data_validation: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "pylightxl does not support add_data_validation: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "pylightxl does not support add_data_validation: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "pylightxl does not support add_data_validation: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "pylightxl does not support add_data_validation: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "data_validation", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "xlwt does not support add_data_validation: xlwt cannot author data validations" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations", + "probable_cause": "xlwt cannot author data validations", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author data validations", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "xlwt does not support add_data_validation: xlwt cannot author data validations" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations", + "probable_cause": "xlwt cannot author data validations", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author data validations", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "xlwt does not support add_data_validation: xlwt cannot author data validations" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations", + "probable_cause": "xlwt cannot author data validations", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author data validations", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "xlwt does not support add_data_validation: xlwt cannot author data validations" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations", + "probable_cause": "xlwt cannot author data validations", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author data validations", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "xlwt does not support add_data_validation: xlwt cannot author data validations" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations", + "probable_cause": "xlwt cannot author data validations", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author data validations", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '\"Red,Green,Blue\"', 'allow_blank': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_csv", + "sheet": "data_validation", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "error": "sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_csv", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_list_range", + "sheet": "data_validation", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "error": "sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_list_range", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "error": "sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_custom_formula", + "sheet": "data_validation", + "cell": "B5" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "error": "sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_custom_formula", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips " + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "read", + "test_case_id": "dv_whole_between", + "sheet": "data_validation", + "cell": "B6" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX reader skips ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "error": "sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no " + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_whole_between", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no ", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE has no data validation API; the XLSX writer emits no ", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 2 + }, + "test_cases": { + "dv_list_csv": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "actual": { + "validation": { + "range": "B2", + "validation_type": "list", + "formula1": "\"Red,Green,Blue\"", + "allow_blank": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: list from CSV" + } + }, + "dv_list_range": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "actual": { + "validation": { + "range": "B3", + "validation_type": "list", + "formula1": "=$D$2:$D$4" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: list from range" + } + }, + "dv_cross_sheet": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: cross-sheet named range" + }, + "write": { + "passed": false, + "expected": { + "validation": { + "range": "B4", + "validation_type": "list", + "formula1": "=RegionList" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "data_validation", + "operation": "write", + "test_case_id": "dv_cross_sheet", + "sheet": "data_validation", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "data_validation_drift", + "suggested_next_step": "inspect dataValidations in the worksheet XML", + "explanation": { + "code": "data_validation_drift", + "summary": "data validation metadata changed", + "probable_cause": "validation type, formula, or target range was dropped or rewritten", + "next_step": "inspect dataValidations in the worksheet XML", + "tag": "validation" + } + } + ], + "importance": "edge", + "label": "DV: cross-sheet named range" + } + }, + "dv_custom_formula": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "actual": { + "validation": { + "range": "B5", + "validation_type": "custom", + "formula1": "=B5>C5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "DV: custom formula" + } + }, + "dv_whole_between": { + "read": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + }, + "write": { + "passed": true, + "expected": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "actual": { + "validation": { + "range": "B6", + "validation_type": "whole", + "operator": "between", + "formula1": "1", + "formula2": "10", + "allow_blank": false, + "error_title": "Invalid", + "error": "Enter 1-10" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "DV: whole number with error" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "link_external": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "link_external": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "aspose-cells-foss", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": null, + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': None, 'tooltip': 'Go to docs', 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": null, + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': None, 'tooltip': 'Jump to target', 'internal': True}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": null, + "tooltip": "Send email", + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': None, 'tooltip': 'Send email', 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": null, + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': None, 'tooltip': 'Encoded URL', 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "link_external": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "error": "pylightxl does not support add_hyperlink: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "error": "pylightxl does not support add_hyperlink: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "error": "pylightxl does not support add_hyperlink: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "error": "pylightxl does not support add_hyperlink: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "hyperlinks", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "error": "pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "error": "pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "error": "pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "error": "pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "link_external": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "error": "xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "error": "xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "error": "xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "error": "xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt hyperlink metadata is not supported in this adapter", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "link_external": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "link_external": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "exceljs", + "scores": { + "read": 0, + "write": 2 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1#Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1#Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": true, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "libreoffice", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "link_external": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": "Go to docs", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B2", + "target": "https://example.com/docs", + "display": "Example Docs", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_external", + "sheet": "hyperlinks", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: external URL" + } + }, + "link_internal": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": null, + "internal": true + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': None, 'internal': True}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": "Jump to target", + "internal": true + } + }, + "actual": { + "hyperlink": { + "cell": "B3", + "target": "Targets!A1", + "display": "Go Target", + "tooltip": null, + "internal": true + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_internal", + "sheet": "hyperlinks", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': None, 'internal': True}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: internal sheet" + } + }, + "link_mailto": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": "Send email", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B4", + "target": "mailto:test@example.com", + "display": "Email", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_mailto", + "sheet": "hyperlinks", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "basic", + "label": "Hyperlink: mailto" + } + }, + "link_long": { + "read": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "read", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + }, + "write": { + "passed": false, + "expected": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": "Encoded URL", + "internal": false + } + }, + "actual": { + "hyperlink": { + "cell": "B5", + "target": "https://example.com/search?q=excel%20bench&sort=desc#section-2", + "display": "Search", + "tooltip": null, + "internal": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "hyperlinks", + "operation": "write", + "test_case_id": "link_long", + "sheet": "hyperlinks", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': None, 'internal': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "hyperlink_drift", + "suggested_next_step": "inspect worksheet hyperlinks and worksheet rels", + "explanation": { + "code": "hyperlink_drift", + "summary": "hyperlink target or display metadata changed", + "probable_cause": "hyperlink rel target, tooltip, or internal location was not preserved", + "next_step": "inspect worksheet hyperlinks and worksheet rels", + "tag": "hyperlink" + } + } + ], + "importance": "edge", + "label": "Hyperlink: long encoded URL" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "image_one_cell": { + "write": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "write": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "aspose-cells-foss", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "aspose-cells-foss does not support read_images: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind." + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support read_images: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind.", + "probable_cause": "aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "aspose-cells-foss does not support add_image: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support add_image: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors.", + "probable_cause": "aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "aspose-cells-foss does not support read_images: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind." + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support read_images: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind.", + "probable_cause": "aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "aspose-cells-foss does not support add_image: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support add_image: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors.", + "probable_cause": "aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "pylightxl does not support add_image: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_image: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "pylightxl does not support add_image: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_image: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "images", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "pyexcel does not support add_image: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_image: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "pyexcel does not support add_image: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_image: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "xlwt does not support add_image: xlwt cannot embed images in this adapter" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_image: xlwt cannot embed images in this adapter", + "probable_cause": "xlwt cannot embed images in this adapter", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot embed images in this adapter", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "xlwt does not support add_image: xlwt cannot embed images in this adapter" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_image: xlwt cannot embed images in this adapter", + "probable_cause": "xlwt cannot embed images in this adapter", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot embed images in this adapter", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "sheetjs does not support images: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support images: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed", + "probable_cause": "SheetJS CE does not parse worksheet drawings, so embedded images are not exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse worksheet drawings, so embedded images are not exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "sheetjs does not support image: SheetJS CE cannot embed images (drawing parts are not written)" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support image: SheetJS CE cannot embed images (drawing parts are not written)", + "probable_cause": "SheetJS CE cannot embed images (drawing parts are not written)", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot embed images (drawing parts are not written)", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "sheetjs does not support images: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support images: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed", + "probable_cause": "SheetJS CE does not parse worksheet drawings, so embedded images are not exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse worksheet drawings, so embedded images are not exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "sheetjs does not support image: SheetJS CE cannot embed images (drawing parts are not written)" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support image: SheetJS CE cannot embed images (drawing parts are not written)", + "probable_cause": "SheetJS CE cannot embed images (drawing parts are not written)", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot embed images (drawing parts are not written)", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "exceljs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_one_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_one_cell", + "sheet": "images", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "images", + "operation": "read", + "test_case_id": "image_two_cell_offset", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": false, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "images", + "operation": "write", + "test_case_id": "image_two_cell_offset", + "sheet": "images", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "images", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "image_one_cell": { + "read": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + }, + "write": { + "passed": true, + "expected": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "B2", + "path": "fixtures/images/sample.png", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Image: one-cell anchor" + } + }, + "image_two_cell_offset": { + "read": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + }, + "write": { + "passed": true, + "expected": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "actual": { + "image": { + "cell": "D6", + "path": "fixtures/images/sample.jpg", + "anchor": "oneCell" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Image: two-cell anchor with offset" + } + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "openpyxl", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "python-calamine", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "aspose-cells-foss", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "wolfxl", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "pylightxl", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "pivot_tables", + "library": "pyexcel", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "xlwt", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "pandas", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "openpyxl-readonly", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "polars", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "tablib", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "sheetjs", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "exceljs", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "pivot_tables", + "library": "libreoffice", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx)." + }, + { + "feature": "comments", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "None:Legacy note", + "threaded": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={'comment': {'cell': 'B2', 'text': 'None:Legacy note', 'threaded': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "None:Threaded fallback", + "threaded": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={'comment': {'cell': 'B3', 'text': 'None:Threaded fallback', 'threaded': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "None:Another note", + "threaded": false + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={'comment': {'cell': 'B4', 'text': 'None:Another note', 'threaded': False}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "error": "pylightxl does not support add_comment: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "error": "pylightxl does not support add_comment: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "error": "pylightxl does not support add_comment: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "comments", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "error": "pyexcel does not support add_comment: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "error": "pyexcel does not support add_comment: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "error": "pyexcel does not support add_comment: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "error": "xlwt does not support add_comment: xlwt cannot author comments" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments", + "probable_cause": "xlwt cannot author comments", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author comments", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "error": "xlwt does not support add_comment: xlwt cannot author comments" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments", + "probable_cause": "xlwt cannot author comments", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author comments", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "error": "xlwt does not support add_comment: xlwt cannot author comments" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments", + "probable_cause": "xlwt cannot author comments", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "xlwt cannot author comments", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_legacy", + "sheet": "comments", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_threaded", + "sheet": "comments", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "read", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": false, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": {}, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "comments", + "operation": "write", + "test_case_id": "comment_author", + "sheet": "comments", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "comment_drift", + "suggested_next_step": "inspect comments XML plus VML drawing relationships", + "explanation": { + "code": "comment_drift", + "summary": "comment metadata changed", + "probable_cause": "legacy comment text, author, or VML relationship was not preserved", + "next_step": "inspect comments XML plus VML drawing relationships", + "tag": "comment" + } + } + ], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "comment_legacy": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B2", + "text": "Legacy note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Comment: legacy note" + } + }, + "comment_threaded": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B3", + "text": "Threaded fallback", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: threaded" + } + }, + "comment_author": { + "read": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + }, + "write": { + "passed": true, + "expected": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "actual": { + "comment": { + "cell": "B4", + "text": "Another note", + "threaded": false + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Comment: second author" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "pylightxl does not support set_freeze_panes: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "pylightxl does not support set_freeze_panes: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "pylightxl does not support set_freeze_panes: pylightxl does not implement this feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature", + "probable_cause": "pylightxl does not implement this feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pylightxl does not implement this feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "freeze_panes", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature", + "probable_cause": "pyexcel does not expose this worksheet feature", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "pyexcel does not expose this worksheet feature", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "'Sheet' object has no attribute 'frozen_row_count'" + }, + "notes": "Exception: AttributeError", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "AttributeError: 'Sheet' object has no attribute 'frozen_row_count'", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "'Sheet' object has no attribute 'frozen_row_count'" + }, + "notes": "Exception: AttributeError", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "AttributeError: 'Sheet' object has no attribute 'frozen_row_count'", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "'Sheet' object has no attribute 'frozen_row_count'" + }, + "notes": "Exception: AttributeError", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "AttributeError: 'Sheet' object has no attribute 'frozen_row_count'", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": null, + "top_left_cell": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "probable_cause": "SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "error": "sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_b2", + "sheet": "FreezeB2", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "probable_cause": "SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "probable_cause": "SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "error": "sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "freeze_d5", + "sheet": "FreezeD5", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "probable_cause": "SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "read", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "probable_cause": "SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE parses only for zoom and right-to-left; panes are not exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "error": "sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "probable_cause": "SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE's XLSX writer emits without a element, so panes cannot be set", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "exceljs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 2 + }, + "test_cases": { + "freeze_b2": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "B2" + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Freeze panes at B2" + } + }, + "freeze_d5": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + }, + "write": { + "passed": true, + "expected": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "actual": { + "freeze": { + "mode": "freeze", + "top_left_cell": "D5" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Freeze panes at D5" + } + }, + "split_2x1": { + "read": { + "passed": true, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Split panes row=2 col=1" + }, + "write": { + "passed": false, + "expected": { + "freeze": { + "mode": "split", + "x_split": 1, + "y_split": 2 + } + }, + "actual": { + "freeze": { + "mode": null, + "x_split": null, + "y_split": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "freeze_panes", + "operation": "write", + "test_case_id": "split_2x1", + "sheet": "SplitPanes", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "freeze_pane_drift", + "suggested_next_step": "inspect sheetViews/pane in the worksheet XML", + "explanation": { + "code": "freeze_pane_drift", + "summary": "freeze pane settings changed", + "probable_cause": "pane split/top-left metadata was dropped or normalized incorrectly", + "next_step": "inspect sheetViews/pane in the worksheet XML", + "tag": "freeze_pane" + } + } + ], + "importance": "edge", + "label": "Split panes row=2 col=1" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "xlsxwriter does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "xlsxwriter does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "xlsxwriter does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "xlsxwriter does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "xlsxwriter does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "xlsxwriter does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "python-calamine does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": "named_ranges", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "python-calamine does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": "named_ranges", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "python-calamine does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": "named_ranges", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "python-calamine does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "python-calamine does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": "named_ranges", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "python-calamine does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": "named_ranges", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "aspose-cells-foss", + "scores": { + "read": 2, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": null + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': 'local'}, actual={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': None}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "pylightxl does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "pylightxl does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "pylightxl does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "pylightxl does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "pylightxl does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "pylightxl does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "named_ranges", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "pyexcel does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": "named_ranges", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "pyexcel does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "pyexcel does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": "named_ranges", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "pyexcel does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "pyexcel does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": "named_ranges", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "pyexcel does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "pyexcel does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "pyexcel does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "pyexcel does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": "named_ranges", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "pyexcel does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "pyexcel does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": "named_ranges", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "pyexcel does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "xlwt does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "xlwt does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "xlwt does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "xlwt does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "xlwt does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "xlwt does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "pandas does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": "named_ranges", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "pandas does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "pandas does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": "named_ranges", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: pandas does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "pandas does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "pandas does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": "named_ranges", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: pandas does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "pandas does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "pandas does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: pandas does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "pandas does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "pandas does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": "named_ranges", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: pandas does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "pandas does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "pandas does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": "named_ranges", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: pandas does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "pandas does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "xlsxwriter-constmem does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "xlsxwriter-constmem does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "xlsxwriter-constmem does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "xlsxwriter-constmem does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "xlsxwriter-constmem does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "xlsxwriter-constmem does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "openpyxl-readonly does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": "named_ranges", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "openpyxl-readonly does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": "named_ranges", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "openpyxl-readonly does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": "named_ranges", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "openpyxl-readonly does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "openpyxl-readonly does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": "named_ranges", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "openpyxl-readonly does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": "named_ranges", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "polars does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": "named_ranges", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "polars does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": "named_ranges", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: polars does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "polars does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": "named_ranges", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: polars does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "polars does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: polars does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "polars does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": "named_ranges", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: polars does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "polars does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": "named_ranges", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: polars does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "tablib does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_simple_cell", + "sheet": "named_ranges", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": false, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "error": "tablib does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_simple_cell", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "tablib does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cell_range", + "sheet": "named_ranges", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: tablib does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": false, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "error": "tablib does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cell_range", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "tablib does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_formula_ref", + "sheet": "named_ranges", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: tablib does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": false, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "error": "tablib does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_formula_ref", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "tablib does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: tablib does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "error": "tablib does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "tablib does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_cross_sheet", + "sheet": "named_ranges", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: tablib does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": false, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "error": "tablib does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_cross_sheet", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "tablib does not implement named range reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_special_chars", + "sheet": "named_ranges", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: tablib does not implement named range reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": false, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "error": "tablib does not implement named range writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_special_chars", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement named range writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "sheetjs", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "exceljs", + "scores": { + "read": 2, + "write": 2 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "not_found", + "refers_to": "" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "read", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': 'local'}, actual={'name': 'LocalName', 'scope': 'not_found', 'refers_to': ''}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": false, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "not_found", + "refers_to": "" + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "named_ranges", + "operation": "write", + "test_case_id": "nr_sheet_scope", + "sheet": "named_ranges", + "cell": "B5" + }, + "adapter_message": "Expected values did not match actual values: expected={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': 'local'}, actual={'name': 'LocalName', 'scope': 'not_found', 'refers_to': ''}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "named_range_scope_drift", + "suggested_next_step": "inspect workbook.xml definedNames and localSheetId values", + "explanation": { + "code": "named_range_scope_drift", + "summary": "named range metadata changed", + "probable_cause": "workbook-level vs sheet-level defined-name scope was lost or rewritten", + "next_step": "inspect workbook.xml definedNames and localSheetId values", + "tag": "named_range" + } + } + ], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "nr_simple_cell": { + "read": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + }, + "write": { + "passed": true, + "expected": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "actual": { + "name": "SingleCell", + "scope": "workbook", + "refers_to": "named_ranges!$B$2", + "value": 42 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: single cell" + } + }, + "nr_cell_range": { + "read": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + }, + "write": { + "passed": true, + "expected": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "actual": { + "name": "DataRange", + "scope": "workbook", + "refers_to": "named_ranges!$B$3:$D$3" + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: cell range" + } + }, + "nr_formula_ref": { + "read": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + }, + "write": { + "passed": true, + "expected": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "actual": { + "name": "TaxRate", + "scope": "workbook", + "refers_to": "named_ranges!$B$4", + "value": 0.08 + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Named range: used in formula" + } + }, + "nr_sheet_scope": { + "read": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + }, + "write": { + "passed": true, + "expected": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "actual": { + "name": "LocalName", + "scope": "sheet", + "refers_to": "named_ranges!$B$5", + "value": "local" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: sheet-scoped" + } + }, + "nr_cross_sheet": { + "read": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + }, + "write": { + "passed": true, + "expected": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "actual": { + "name": "OtherSheet", + "scope": "workbook", + "refers_to": "Targets!$A$1" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: cross-sheet reference" + } + }, + "nr_special_chars": { + "read": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + }, + "write": { + "passed": true, + "expected": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "actual": { + "name": "_my_range", + "scope": "workbook", + "refers_to": "named_ranges!$B$7" + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Named range: underscore name" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "xlsxwriter does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "xlsxwriter does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "xlsxwriter does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "xlsxwriter does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "xlsxwriter does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "xlsxwriter does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "python-calamine does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "python-calamine does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "python-calamine does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "python-calamine does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "python-calamine does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "python-calamine does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 1 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": false, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 0 + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': True, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 1}}, actual={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': False, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 0}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": false, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 0 + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "Expected values did not match actual values: expected={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': True, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 1}}, actual={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': False, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 0}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': None, 'columns': ['Key', 'Value']}}, actual={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': 'TableStyleMedium2', 'columns': ['Key', 'Value']}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "Expected values did not match actual values: expected={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': None, 'columns': ['Key', 'Value']}}, actual={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': 'TableStyleMedium2', 'columns': ['Key', 'Value']}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "pylightxl does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "pylightxl does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "pylightxl does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "pylightxl does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "pylightxl does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "pylightxl does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "tables", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "pyexcel does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "pyexcel does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "pyexcel does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "pyexcel does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "pyexcel does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "xlwt does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "xlwt does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "xlwt does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "xlwt does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "xlwt does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "xlwt does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "pandas does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "pandas does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "pandas does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: pandas does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "pandas does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "pandas does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: pandas does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "pandas does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "pandas does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: pandas does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "pandas does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "pandas does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: pandas does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "pandas does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "pandas does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: pandas does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "pandas does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "openpyxl-readonly does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "openpyxl-readonly does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "openpyxl-readonly does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "openpyxl-readonly does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "openpyxl-readonly does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "openpyxl-readonly does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "polars does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "polars does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: polars does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "polars does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: polars does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "polars does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: polars does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "polars does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: polars does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "polars does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: polars does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "tablib does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "tablib does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "tablib does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "NotImplementedError: tablib does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "tablib does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "tablib does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "NotImplementedError: tablib does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "tablib does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "tablib does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "NotImplementedError: tablib does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "tablib does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "tablib does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "NotImplementedError: tablib does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "tablib does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "tablib does not implement table reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "NotImplementedError: tablib does not implement table reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "tablib does not implement table writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement table writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": "tables", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": "tables", + "cell": "B3" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": "tables", + "cell": "B4" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": "tables", + "cell": "B5" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": "tables", + "cell": "B7" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "exceljs", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'name')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_basic", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'name')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_with_totals", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'name')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_no_style", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'name')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_col", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'name')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_single_row", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": false, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'name')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "tables", + "operation": "read", + "test_case_id": "tbl_autofilter", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "libreoffice", + "scores": { + "read": 3, + "write": 2 + }, + "test_cases": { + "tbl_basic": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "actual": { + "table": { + "name": "SalesData", + "ref": "E2:G5", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Name", + "Qty", + "Price" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: basic 3-col" + } + }, + "tbl_with_totals": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "actual": { + "table": { + "name": "Summary", + "ref": "E7:G11", + "header_row": true, + "totals_row": true, + "style": "TableStyleLight1", + "columns": [ + "Item", + "Count", + "Total" + ], + "totals_row_count": 1 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: with totals row" + } + }, + "tbl_no_style": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "actual": { + "table": { + "name": "PlainTable", + "ref": "E13:F16", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [ + "Key", + "Value" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Table: no style" + } + }, + "tbl_single_col": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "actual": { + "table": { + "name": "SingleCol", + "ref": "E18:E21", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium2", + "columns": [ + "Score" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: single column" + } + }, + "tbl_single_row": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: header only (no data rows)" + }, + "write": { + "passed": false, + "expected": { + "table": { + "name": "EmptyTable", + "ref": "E23:G23", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "A", + "B", + "C" + ] + } + }, + "actual": { + "table": { + "name": "EmptyTable", + "ref": "not_found", + "header_row": true, + "totals_row": false, + "style": null, + "columns": [] + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "tables", + "operation": "write", + "test_case_id": "tbl_single_row", + "sheet": "tables", + "cell": "B6" + }, + "adapter_message": "Expected values did not match actual values: expected={'table': {'name': 'EmptyTable', 'ref': 'E23:G23', 'header_row': True, 'totals_row': False, 'style': 'TableStyleMedium9', 'columns': ['A', 'B', 'C']}}, actual={'table': {'name': 'EmptyTable', 'ref': 'not_found', 'header_row': True, 'totals_row': False, 'style': None, 'columns': []}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "style_drift", + "suggested_next_step": "inspect styles.xml and the adapter's style mapping", + "explanation": { + "code": "style_drift", + "summary": "cell style metadata changed", + "probable_cause": "formatting was dropped, defaulted, or normalized differently", + "next_step": "inspect styles.xml and the adapter's style mapping", + "tag": "style" + } + } + ], + "importance": "edge", + "label": "Table: header only (no data rows)" + } + }, + "tbl_autofilter": { + "read": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + }, + "write": { + "passed": true, + "expected": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "actual": { + "table": { + "name": "Filtered", + "ref": "E25:G28", + "header_row": true, + "totals_row": false, + "style": "TableStyleMedium9", + "columns": [ + "Region", + "Sales", + "Year" + ], + "autofilter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Table: with autoFilter" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "xlsxwriter does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "xlsxwriter does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "xlsxwriter does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "python-calamine does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "python-calamine does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "python-calamine does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "pylightxl does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "pylightxl does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "pylightxl does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "sheet_protection", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "pyexcel does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "pyexcel does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "pyexcel does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "pyexcel does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "pyexcel does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "pyexcel does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "xlwt does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "xlwt does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "xlwt does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "pandas does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "pandas does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "pandas does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "pandas does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "pandas does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "pandas does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "openpyxl-readonly does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "openpyxl-readonly does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "openpyxl-readonly does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "polars does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "polars does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "polars does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "tablib does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "tablib does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "tablib does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "tablib does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "tablib does not implement sheet protection reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement sheet protection reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "tablib does not implement sheet protection writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement sheet protection writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 3 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "error": "sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "probable_cause": "SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "error": "sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "probable_cause": "SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "error": "sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "probable_cause": "SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "exceljs", + "scores": { + "read": 1, + "write": 3 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': True, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True, 'password': 'bench-secret'}}, actual={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "sheet_protection", + "library": "libreoffice", + "scores": { + "read": 0, + "write": 2 + }, + "test_cases": { + "prot_basic": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "auto_filter": null, + "format_cells": null, + "insert_rows": null, + "password_hash_present": false, + "protected": true, + "select_locked_cells": null, + "select_unlocked_cells": null, + "sort": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_basic", + "sheet": "sheet_protection_basic", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True}}, actual={'protection': {'auto_filter': None, 'format_cells': None, 'insert_rows': None, 'password_hash_present': False, 'protected': True, 'select_locked_cells': None, 'select_unlocked_cells': None, 'sort': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: basic (OOXML defaults)" + } + }, + "prot_password": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "auto_filter": null, + "format_cells": null, + "insert_rows": null, + "password_hash_present": true, + "protected": true, + "select_locked_cells": null, + "select_unlocked_cells": null, + "sort": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_password", + "sheet": "sheet_protection_password", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': True, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True, 'password': 'bench-secret'}}, actual={'protection': {'auto_filter': None, 'format_cells': None, 'insert_rows': None, 'password_hash_present': True, 'protected': True, 'select_locked_cells': None, 'select_unlocked_cells': None, 'sort': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Protection: with password hash" + }, + "write": { + "passed": true, + "expected": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true, + "password": "bench-secret" + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": true, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Protection: with password hash" + } + }, + "prot_granular": { + "read": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "auto_filter": null, + "format_cells": null, + "insert_rows": null, + "password_hash_present": false, + "protected": true, + "select_locked_cells": null, + "select_unlocked_cells": null, + "sort": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "read", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': False, 'insert_rows': True, 'select_locked_cells': True, 'select_unlocked_cells': False, 'sort': False, 'auto_filter': True}}, actual={'protection': {'auto_filter': None, 'format_cells': None, 'insert_rows': None, 'password_hash_present': False, 'protected': True, 'select_locked_cells': None, 'select_unlocked_cells': None, 'sort': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + }, + "write": { + "passed": false, + "expected": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": false, + "insert_rows": true, + "select_locked_cells": true, + "select_unlocked_cells": false, + "sort": false, + "auto_filter": true + } + }, + "actual": { + "protection": { + "protected": true, + "password_hash_present": false, + "format_cells": true, + "insert_rows": true, + "select_locked_cells": false, + "select_unlocked_cells": false, + "sort": true, + "auto_filter": true + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "sheet_protection", + "operation": "write", + "test_case_id": "prot_granular", + "sheet": "sheet_protection_granular", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': False, 'insert_rows': True, 'select_locked_cells': True, 'select_unlocked_cells': False, 'sort': False, 'auto_filter': True}}, actual={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Protection: granular attribute flags" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": true, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "xlsxwriter does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "xlsxwriter does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "xlsxwriter does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "python-calamine does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "python-calamine does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "python-calamine does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "aspose-cells-foss", + "scores": { + "read": 1, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": 100, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API.", + "probable_cause": "aspose-cells-foss has no print-title-rows API.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss has no print-title-rows API.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API.", + "probable_cause": "aspose-cells-foss has no print-title-rows API.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss has no print-title-rows API.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 100, + "print_title_rows": null, + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 100, 'print_title_rows': None, 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API." + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API.", + "probable_cause": "aspose-cells-foss has no print-title-rows API.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "aspose-cells-foss has no print-title-rows API.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": true, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pylightxl does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pylightxl does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "exception", + "suggested_next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "explanation": { + "code": "exception", + "summary": "adapter raised instead of returning comparable workbook data", + "probable_cause": "adapter/runtime error interrupted the assertion path", + "next_step": "open the diagnostic adapter message and reproduce the adapter call directly", + "tag": "exception" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "pylightxl does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "page_setup", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pyexcel does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pyexcel does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pyexcel does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pyexcel does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "pyexcel does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "pyexcel does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "xlwt does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "xlwt does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "xlwt does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pandas does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pandas does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pandas does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "pandas does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "pandas does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "pandas does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "xlsxwriter-constmem does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "openpyxl-readonly does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "openpyxl-readonly does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "openpyxl-readonly does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "polars does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "polars does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "polars does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "tablib does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "tablib does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "tablib does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "error": "tablib does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "tablib does not implement page setup reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement page setup reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "error": "tablib does not implement page setup writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement page setup writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": {} + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": {} + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "print_title_rows": "$1:$2" + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'print_title_rows': '$1:$2'}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "exceljs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 100, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 100, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 100, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "page_setup", + "library": "libreoffice", + "scores": { + "read": 1, + "write": 0 + }, + "test_cases": { + "page_setup_landscape": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "fit_to_height": null, + "fit_to_width": null, + "footer_center": null, + "header_center": null, + "orientation": "landscape", + "print_title_rows": null, + "scale": 100 + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'fit_to_height': None, 'fit_to_width': None, 'footer_center': None, 'header_center': None, 'orientation': 'landscape', 'print_title_rows': None, 'scale': 100}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": null, + "scale": null, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "landscape", + "fit_to_width": 1, + "fit_to_height": 0, + "scale": 100, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_landscape", + "sheet": "page_setup_landscape", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': 0, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: landscape + fit-to-width" + } + }, + "page_setup_scale": { + "read": { + "passed": true, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "fit_to_height": null, + "fit_to_width": null, + "footer_center": null, + "header_center": null, + "orientation": "portrait", + "print_title_rows": null, + "scale": 75 + } + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": null, + "fit_to_height": null, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 75, + "print_title_rows": null, + "header_center": null, + "footer_center": null + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_scale", + "sheet": "page_setup_scale", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "basic", + "label": "Page setup: portrait at 75% scale" + } + }, + "page_setup_titles": { + "read": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "fit_to_height": null, + "fit_to_width": null, + "footer_center": "Page &P", + "header_center": "ExcelBench Report", + "orientation": "portrait", + "print_title_rows": "$1:$2", + "scale": 100 + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "read", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'fit_to_height': None, 'fit_to_width': None, 'footer_center': 'Page &P', 'header_center': 'ExcelBench Report', 'orientation': 'portrait', 'print_title_rows': '$1:$2', 'scale': 100}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + }, + "write": { + "passed": false, + "expected": { + "page_setup": { + "orientation": null, + "fit_to_width": null, + "fit_to_height": null, + "scale": null, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "actual": { + "page_setup": { + "orientation": "portrait", + "fit_to_width": 1, + "fit_to_height": 1, + "scale": 100, + "print_title_rows": "$1:$2", + "header_center": "ExcelBench Report", + "footer_center": "Page &P" + } + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "page_setup", + "operation": "write", + "test_case_id": "page_setup_titles", + "sheet": "page_setup_titles", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": null, + "suggested_next_step": null, + "explanation": null + } + ], + "importance": "edge", + "label": "Page setup: print titles + header/footer" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "openpyxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": true, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": true, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": true, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": true, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "xlsxwriter", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "xlsxwriter does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "xlsxwriter does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "python-calamine", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "python-calamine does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "python-calamine does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: python-calamine does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "aspose-cells-foss", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": true, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": true, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": true, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": true, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "wolfxl", + "scores": { + "read": 3, + "write": 3 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": true, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": true, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": true, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": true, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12" + } + ] + }, + "notes": null, + "diagnostics": [], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "pylightxl", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pylightxl does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "expected string or bytes-like object, got 'NoneType'" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "invalid_input", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "TypeError: expected string or bytes-like object, got 'NoneType'", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pylightxl does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pylightxl does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "xlrd", + "scores": { + "read": null, + "write": null + }, + "test_cases": {}, + "notes": "Not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "chart_anchor", + "library": "pyexcel", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pyexcel does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pyexcel does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pyexcel does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pyexcel does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pyexcel does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pyexcel does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "xlwt", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "xlwt does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "xlwt does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlwt does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "pandas", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pandas does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pandas does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pandas does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: pandas does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "pandas does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: pandas does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "xlsxwriter-constmem", + "scores": { + "read": null, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "xlsxwriter-constmem does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "xlsxwriter-constmem does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: xlsxwriter-constmem does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "openpyxl-readonly", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "openpyxl-readonly does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "openpyxl-readonly does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: openpyxl-readonly does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "polars", + "scores": { + "read": 0, + "write": null + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "polars does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "polars does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: polars does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "tablib", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "tablib does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "tablib does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "tablib does not implement chart anchor reads" + }, + "notes": "Exception: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "NotImplementedError: tablib does not implement chart anchor reads", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter raised an exception while evaluating this test case.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "tablib does not implement chart anchor writes" + }, + "notes": "Write failed: NotImplementedError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "NotImplementedError: tablib does not implement chart anchor writes", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "Adapter could not create or save a workbook for this feature.", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "sheetjs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "sheetjs does not support chart_anchors: SheetJS CE does not parse charts or drawing anchors in worksheets" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support chart_anchors: SheetJS CE does not parse charts or drawing anchors in worksheets", + "probable_cause": "SheetJS CE does not parse charts or drawing anchors in worksheets", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse charts or drawing anchors in worksheets", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "sheetjs does not support chart: SheetJS CE cannot create charts" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support chart: SheetJS CE cannot create charts", + "probable_cause": "SheetJS CE cannot create charts", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create charts", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "sheetjs does not support chart_anchors: SheetJS CE does not parse charts or drawing anchors in worksheets" + }, + "notes": "Exception: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support chart_anchors: SheetJS CE does not parse charts or drawing anchors in worksheets", + "probable_cause": "SheetJS CE does not parse charts or drawing anchors in worksheets", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE does not parse charts or drawing anchors in worksheets", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "sheetjs does not support chart: SheetJS CE cannot create charts" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: sheetjs does not support chart: SheetJS CE cannot create charts", + "probable_cause": "SheetJS CE cannot create charts", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "SheetJS CE cannot create charts", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "exceljs", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "exceljs does not support chart: ExcelJS 4.4.0 has no chart creation API" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: exceljs does not support chart: ExcelJS 4.4.0 has no chart creation API", + "probable_cause": "ExcelJS 4.4.0 has no chart creation API", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "ExcelJS 4.4.0 has no chart creation API", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')" + }, + "notes": "Failed to open workbook", + "diagnostics": [ + { + "category": "internal", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors')", + "probable_cause": "Input workbook could not be opened by this adapter.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "error": "exceljs does not support chart: ExcelJS 4.4.0 has no chart creation API" + }, + "notes": "Write failed: UnsupportedAdapterOperationError", + "diagnostics": [ + { + "category": "unsupported_feature", + "severity": "warning", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": null, + "cell": null + }, + "adapter_message": "UnsupportedAdapterOperationError: exceljs does not support chart: ExcelJS 4.4.0 has no chart creation API", + "probable_cause": "ExcelJS 4.4.0 has no chart creation API", + "root_cause_code": "unsupported_feature", + "suggested_next_step": "treat as unsupported capability, not a semantic regression", + "explanation": { + "code": "unsupported_feature", + "summary": "adapter reported this operation as unsupported", + "probable_cause": "ExcelJS 4.4.0 has no chart creation API", + "next_step": "treat as unsupported capability, not a semantic regression", + "tag": "unsupported" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + }, + { + "feature": "chart_anchor", + "library": "libreoffice", + "scores": { + "read": 0, + "write": 0 + }, + "test_cases": { + "chart_bar": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "anchor_type": "twoCell", + "from": "B2", + "to": "G11", + "type": "bar" + }, + { + "anchor_type": "twoCell", + "from": "J2", + "to": "O11", + "type": "line" + } + ] + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'H12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11', 'type': 'bar'}, {'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11', 'type': 'line'}]}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "H12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "G11" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "O11" + } + ] + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_bar", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'H12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11'}, {'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11'}]}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "basic", + "label": "Chart: bar with twoCell anchor" + } + }, + "chart_line": { + "read": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "anchor_type": "twoCell", + "from": "B2", + "to": "G11", + "type": "bar" + }, + { + "anchor_type": "twoCell", + "from": "J2", + "to": "O11", + "type": "line" + } + ] + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "read", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'charts': [{'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'P12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11', 'type': 'bar'}, {'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11', 'type': 'line'}]}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + }, + "write": { + "passed": false, + "expected": { + "charts": [ + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "P12", + "data_ref": "E2:E8", + "categories_ref": "F2:F8" + } + ] + }, + "actual": { + "charts": [ + { + "type": "bar", + "anchor_type": "twoCell", + "from": "B2", + "to": "G11" + }, + { + "type": "line", + "anchor_type": "twoCell", + "from": "J2", + "to": "O11" + } + ] + }, + "notes": "Incorrect result", + "diagnostics": [ + { + "category": "data_mismatch", + "severity": "error", + "location": { + "feature": "chart_anchor", + "operation": "write", + "test_case_id": "chart_line", + "sheet": "chart_anchor", + "cell": "B2" + }, + "adapter_message": "Expected values did not match actual values: expected={'charts': [{'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'P12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11'}, {'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11'}]}", + "probable_cause": "Adapter returned a value that differs from benchmark expectations.", + "root_cause_code": "drawing_or_image_drift", + "suggested_next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "explanation": { + "code": "drawing_or_image_drift", + "summary": "image or drawing relationship changed", + "probable_cause": "media part may exist but worksheet drawing rels or anchors do not match", + "next_step": "inspect drawing XML, drawing rels, and xl/media package parts", + "tag": "drawing" + } + } + ], + "importance": "edge", + "label": "Chart: line with twoCell anchor" + } + } + }, + "notes": null + } + ] +} \ No newline at end of file diff --git a/src/excelbench/harness/external_oracles.py b/src/excelbench/harness/external_oracles.py index 1802e22..bdab443 100644 --- a/src/excelbench/harness/external_oracles.py +++ b/src/excelbench/harness/external_oracles.py @@ -22,7 +22,7 @@ #: ``tools/external-oracles/remote/README.md``. ORACLE_DOCKER_IMAGES: Mapping[str, str] = { "apache-poi": "excelbench-poi-oracle:5.5.1", - "excelize": "excelbench-excelize-oracle:2.10.1", + "excelize": "excelbench-excelize-oracle:2.11.0", } #: Per-request timeout floor for helpers reached through a remote Docker diff --git a/tools/external-oracles/excelize/Dockerfile b/tools/external-oracles/excelize/Dockerfile index 44e2037..7bbfa9f 100644 --- a/tools/external-oracles/excelize/Dockerfile +++ b/tools/external-oracles/excelize/Dockerfile @@ -1,8 +1,8 @@ # syntax=docker/dockerfile:1 -# Excelize v2.10.1 oracle helper image for remote Docker runs. +# Excelize v2.11.0 oracle helper image for remote Docker runs. # Build (see ../remote/README.md): # docker --context pc build --build-context oracle-remote=../remote \ -# -t excelbench-excelize-oracle:2.10.1 . +# -t excelbench-excelize-oracle:2.11.0 . FROM golang:1.25-trixie@sha256:2c4c60ef415fbfa5e90300722293bef36c5e63fae17570ce18f580af933dbd73 AS build ENV GOTOOLCHAIN=local CGO_ENABLED=0 @@ -23,7 +23,7 @@ COPY --from=oracle-remote container_entry.py /opt/excelbench/remote/container_en LABEL org.excelbench.adapter=excelize \ org.excelbench.library=github.com/xuri/excelize/v2 \ - org.excelbench.library-version=v2.10.1 + org.excelbench.library-version=v2.11.0 ENTRYPOINT ["python3", "/opt/excelbench/remote/container_entry.py", \ "--cwd", "/opt/excelbench/excelize", "--", \ diff --git a/tools/external-oracles/excelize/go.mod b/tools/external-oracles/excelize/go.mod index 55171c0..ec766e0 100644 --- a/tools/external-oracles/excelize/go.mod +++ b/tools/external-oracles/excelize/go.mod @@ -1,16 +1,16 @@ module github.com/SynthGL/excelbench/tools/external-oracles/excelize -go 1.24.0 +go 1.25.0 -require github.com/xuri/excelize/v2 v2.10.1 +require github.com/xuri/excelize/v2 v2.11.0 require ( - github.com/richardlehane/mscfb v1.0.6 // indirect + github.com/richardlehane/mscfb v1.0.7 // indirect github.com/richardlehane/msoleps v1.0.6 // indirect github.com/tiendc/go-deepcopy v1.7.2 // indirect github.com/xuri/efp v0.0.1 // indirect github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect - golang.org/x/crypto v0.48.0 // indirect - golang.org/x/net v0.50.0 // indirect - golang.org/x/text v0.34.0 // indirect + golang.org/x/crypto v0.53.0 // indirect + golang.org/x/net v0.56.0 // indirect + golang.org/x/text v0.38.0 // indirect ) diff --git a/tools/external-oracles/excelize/go.sum b/tools/external-oracles/excelize/go.sum index cff6dd8..3ea667a 100644 --- a/tools/external-oracles/excelize/go.sum +++ b/tools/external-oracles/excelize/go.sum @@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/richardlehane/mscfb v1.0.6 h1:eN3bvvZCp00bs7Zf52bxNwAx5lJDBK1tCuH19qq5aC8= -github.com/richardlehane/mscfb v1.0.6/go.mod h1:pe0+IUIc0AHh0+teNzBlJCtSyZdFOGgV4ZK9bsoV+Jo= +github.com/richardlehane/mscfb v1.0.7 h1:oeoiM0WE79vHwE8RpIYYvIAc8ajTH2mb6UZm55/+EB0= +github.com/richardlehane/mscfb v1.0.7/go.mod h1:pe0+IUIc0AHh0+teNzBlJCtSyZdFOGgV4ZK9bsoV+Jo= github.com/richardlehane/msoleps v1.0.6 h1:9BvkpjvD+iUBalUY4esMwv6uBkfOip/Lzvd93jvR9gg= github.com/richardlehane/msoleps v1.0.6/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= @@ -12,17 +12,17 @@ github.com/tiendc/go-deepcopy v1.7.2 h1:Ut2yYR7W9tWjTQitganoIue4UGxZwCcJy3orjrrI github.com/tiendc/go-deepcopy v1.7.2/go.mod h1:4bKjNC2r7boYOkD2IOuZpYjmlDdzjbpTRyCx+goBCJQ= github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8= github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/excelize/v2 v2.10.1 h1:V62UlqopMqha3kOpnlHy2CcRVw1V8E63jFoWUmMzxN0= -github.com/xuri/excelize/v2 v2.10.1/go.mod h1:iG5tARpgaEeIhTqt3/fgXCGoBRt4hNXgCp3tfXKoOIc= +github.com/xuri/excelize/v2 v2.11.0 h1:HxaEFl6sRN2+8J5a8HaKq+0M4FsjBGMnWWtjOCPSG88= +github.com/xuri/excelize/v2 v2.11.0/go.mod h1:jxFLbzaIwGQ5ufFNvYfUOHqXhfPaNmP14KWfmNz2Uak= github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 h1:+C0TIdyyYmzadGaL/HBLbf3WdLgC29pgyhTjAT/0nuE= github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= -golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= -golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= -golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE= +golang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tools/external-oracles/excelize/main.go b/tools/external-oracles/excelize/main.go index bd5b85c..4f7c1eb 100644 --- a/tools/external-oracles/excelize/main.go +++ b/tools/external-oracles/excelize/main.go @@ -866,7 +866,7 @@ func applyCharts(workbook *excelize.File, charts []chartSpec) error { VaryColors: chart.VaryColors, } if chart.Title != "" { - excelChart.Title = []excelize.RichTextRun{{Text: chart.Title}} + excelChart.Title = excelize.ChartTitle{Paragraph: []excelize.RichTextRun{{Text: chart.Title}}} } if err := workbook.AddChart(chart.Sheet, chart.Cell, excelChart); err != nil { return fmt.Errorf("add chart %s!%s: %w", chart.Sheet, chart.Cell, err) diff --git a/tools/external-oracles/remote/README.md b/tools/external-oracles/remote/README.md index ae9b671..5afe42b 100644 --- a/tools/external-oracles/remote/README.md +++ b/tools/external-oracles/remote/README.md @@ -17,7 +17,7 @@ docker --context pc build --build-context oracle-remote=../remote \ cd ../excelize docker --context pc build --build-context oracle-remote=../remote \ - -t excelbench-excelize-oracle:2.10.1 . + -t excelbench-excelize-oracle:2.11.0 . ``` The POI image runs `build.sh` (which runs `fetch_deps.py`, verifying every @@ -63,12 +63,12 @@ pull images implicitly. ## Runtime versions -Recorded from the images built on `pc` (linux/amd64) on 2026-10-01. +Recorded from the images built on `pc` (linux/amd64): POI on 2026-10-01, Excelize 2.11.0 on 2026-10-02 (UTC). | Image | Image ID | Library | Runtime | | --- | --- | --- | --- | | `excelbench-poi-oracle:5.5.1` | `ef46106ed14d` | Apache POI 5.5.1 (`poi`, `poi-ooxml`, `poi-ooxml-lite`), xmlbeans 5.3.0 | Eclipse Temurin OpenJDK 21.0.12.1+1 LTS (`javac 21.0.12.1`), Python 3.14.4, Ubuntu 26.04.1 LTS | -| `excelbench-excelize-oracle:2.10.1` | `425caf1a873f` | `github.com/xuri/excelize/v2` v2.10.1 | Go 1.25.14 (static, `CGO_ENABLED=0`), Python 3.13.5, Debian 13 (trixie) | +| `excelbench-excelize-oracle:2.11.0` | `79f691f8e6d0` | `github.com/xuri/excelize/v2` v2.11.0 | Go 1.25.14 (static, `CGO_ENABLED=0`), Python 3.13.5, Debian 13 (trixie) | Base images are pinned by digest in the Dockerfiles: From 98e59ac794a509dde0ddd60cfb6edfa7b036866f Mon Sep 17 00:00:00 2001 From: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:29:36 -0700 Subject: [PATCH 2/3] Perf snapshot 2026-10-03: WolfXL 2.0.8 public API; cite it as the current perf snapshot --- README.md | 21 +- docs-site/adapters/openpyxl.mdx | 2 +- docs-site/adapters/wolfxl.mdx | 14 +- docs-site/cli/perf.mdx | 13 +- docs/public-reporting.md | 9 +- results-2026-10-03/README.md | 4 +- results-2026-10-03/perf/README.md | 362 + .../wolfxl-2.0.5-control.results.json | 2097 ++++ .../wolfxl-2.0.8-control.results.json | 2097 ++++ results-2026-10-03/perf/history.jsonl | 1 + results-2026-10-03/perf/matrix.csv | 248 + results-2026-10-03/perf/pins.txt | 13 + results-2026-10-03/perf/pip-freeze.txt | 49 + results-2026-10-03/perf/results.json | 9207 +++++++++++++++++ results-2026-10-03/perf/run-log.txt | 70 + results-2026-10-03/perf/run.sh | 25 + results/perf/README.md | 2 +- 17 files changed, 14204 insertions(+), 30 deletions(-) create mode 100644 results-2026-10-03/perf/README.md create mode 100644 results-2026-10-03/perf/diagnostics/wolfxl-2.0.5-control.results.json create mode 100644 results-2026-10-03/perf/diagnostics/wolfxl-2.0.8-control.results.json create mode 100644 results-2026-10-03/perf/history.jsonl create mode 100644 results-2026-10-03/perf/matrix.csv create mode 100644 results-2026-10-03/perf/pins.txt create mode 100644 results-2026-10-03/perf/pip-freeze.txt create mode 100644 results-2026-10-03/perf/results.json create mode 100644 results-2026-10-03/perf/run-log.txt create mode 100755 results-2026-10-03/perf/run.sh diff --git a/README.md b/README.md index 69071b9..596146b 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ cross-language context lane (Apache POI, Excelize, zavora-xlsx). Tier 4 > > In that snapshot, WolfXL reaches `18/18` green features with `100%` pass rate. > -> Performance snapshot: 2026-10-02 UTC | WolfXL 2.0.5 through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`) | [Perf](results-2026-10-02/perf/README.md). It supersedes the 2026-04-29 perf numbers for WolfXL, which measured private backend objects. +> Performance snapshot: 2026-10-03 UTC | WolfXL 2.0.8 through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`) | [Perf](results-2026-10-03/perf/README.md). It supersedes the 2026-10-02 perf snapshot (WolfXL 2.0.5) and the 2026-04-29 perf numbers for WolfXL, which measured private backend objects. > > Cross-language context snapshot: [Apache POI `18/18`](results-cross-language/README.md) | [Excelize `18/18`](results-cross-language/README.md) > @@ -102,16 +102,16 @@ Use this when the question is: which engine actually computes a 133-formula fina | Library | Caps | Fidelity | Read Speed | Write Speed | Modify | |---------|:----:|:--------:|:----------:|:-----------:|:------:| -| **wolfxl** | R+W | R 21/21, W 21/21 in 2026-10-03 competitor snapshot (18/18 in 2026-04-29 snapshot) | 1.69x (13.46 ms) | 1.20x (22.28 ms) | Patch (Preserved, 17/17 features in 2026-10-03 mutation suite) | -| openpyxl | R+W | R 21/21, W 21/21 in 2026-10-03 competitor snapshot | 1.00x (22.79 ms, baseline) | 1.00x (26.70 ms, baseline) | Rewrite (16/17 features in 2026-10-03 mutation suite) | +| **wolfxl** | R+W | R 21/21, W 21/21 in 2026-10-03 competitor snapshot (18/18 in 2026-04-29 snapshot) | 1.73x (13.90 ms) | 2.45x (11.26 ms) | Patch (Preserved, 17/17 features in 2026-10-03 mutation suite) | +| openpyxl | R+W | R 21/21, W 21/21 in 2026-10-03 competitor snapshot | 1.00x (24.01 ms, baseline) | 1.00x (27.59 ms, baseline) | Rewrite (16/17 features in 2026-10-03 mutation suite) | | aspose-cells-foss | R+W | R 11/21, W 14/21 in 2026-10-03 competitor snapshot | not measured | not measured | Rewrite (15/17 features) | -| xlsxwriter | W | 15/18 in 2026-04-29 release snapshot | -- | 0.86x (31.12 ms) | No | -| xlsxwriter-constmem | W | 12/18 in 2026-04-29 release snapshot | -- | 0.86x (31.17 ms) | No | -| python-calamine | R | 1/18 in 2026-04-29 release snapshot | 14.02x (1.63 ms) | -- | No | -| pandas | R+W | 3/18 in 2026-04-29 release snapshot | 0.80x (28.43 ms) | 1.00x (26.66 ms) | Rebuild | -| polars | R | 0/18 in 2026-04-29 release snapshot | 3.72x (6.13 ms) | -- | No | +| xlsxwriter | W | 15/18 in 2026-04-29 release snapshot | -- | 0.82x (33.63 ms) | No | +| xlsxwriter-constmem | W | 12/18 in 2026-04-29 release snapshot | -- | 0.82x (33.69 ms) | No | +| python-calamine | R | 1/18 in 2026-04-29 release snapshot | 13.92x (1.73 ms) | -- | No | +| pandas | R+W | 3/18 in 2026-04-29 release snapshot | 0.82x (29.33 ms) | 0.97x (28.57 ms) | Rebuild | +| polars | R | 0/18 in 2026-04-29 release snapshot | 3.87x (6.21 ms) | -- | No | -> Speed columns come from the [2026-10-02 perf snapshot](results-2026-10-02/perf/README.md): sum of per-feature p50 wall times over the same 19 xlsx features for every library (warmup 3, 25 iterations, Apple M4 Pro, Python 3.12.3), shown as openpyxl's total divided by the library's total. WolfXL 2.0.5 is measured through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`), like every other library. aspose-cells-foss was not part of the perf run. Always cite the artifact date, workload, and profile. See [METHODOLOGY.md](METHODOLOGY.md) and [Public Reporting Status](docs/public-reporting.md). +> Speed columns come from the [2026-10-03 perf snapshot](results-2026-10-03/perf/README.md): sum of per-feature p50 wall times over the same 19 xlsx features for every library (warmup 3, 25 iterations, Apple M4 Pro, Python 3.12.3), shown as openpyxl's total divided by the library's total. WolfXL 2.0.8 is measured through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`), like every other library. python-calamine and polars read faster than WolfXL; openpyxl writes faster than xlsxwriter and pandas. aspose-cells-foss was not part of the perf run. Always cite the artifact date, workload, and profile. See [METHODOLOGY.md](METHODOLOGY.md) and [Public Reporting Status](docs/public-reporting.md). ### Key Findings - **High-fidelity libraries are rare**: in the 2026-04-29 release snapshot, only openpyxl and WolfXL reached 18/18 green features; in the 2026-10-03 competitor snapshot (21 scored features; `pivot_tables` unscored), openpyxl 3.1.5 and WolfXL 2.0.8 both hold 21/21 read and 21/21 write and pass all 133 tests in each mode. The next best are ExcelJS (15/21 write) and xlsxwriter (15/21 write) @@ -332,7 +332,8 @@ None currently queued. Tier 4 (charts anchoring, print settings, protection) shi - **[XLS results](results/xls/README.md)** -- legacy format results - **[Performance results](results/perf/README.md)** -- 2026-04-20 perf snapshot (historical; its WolfXL column measured private backend objects) - **[Release snapshot perf](results-release-2026-04-28/perf/README.md)** -- 2026-04-29 perf snapshot (historical; its WolfXL column measured private backend objects) -- **[2026-10-02 perf snapshot](results-2026-10-02/perf/README.md)** -- current perf: 13 Python adapters, 19 features, WolfXL 2.0.5 through its public API +- **[2026-10-02 perf snapshot](results-2026-10-02/perf/README.md)** -- 2026-10-02 perf snapshot (historical): 13 Python adapters, 19 features, WolfXL 2.0.5 through its public API +- **[2026-10-03 perf snapshot](results-2026-10-03/perf/README.md)** -- current perf: same command, host and adapters as 2026-10-02, WolfXL 2.0.8 through its public API - **[Dashboard](results/DASHBOARD.md)** -- combined fidelity + performance comparison - **[Release snapshot dashboard](results-release-2026-04-28/DASHBOARD.md)** -- combined view for the fresh rerun - **[Heatmap (PNG)](results/xlsx/heatmap.png)** | **[SVG](results/xlsx/heatmap.svg)** -- visual score matrix diff --git a/docs-site/adapters/openpyxl.mdx b/docs-site/adapters/openpyxl.mdx index 2019597..1a24260 100644 --- a/docs-site/adapters/openpyxl.mdx +++ b/docs-site/adapters/openpyxl.mdx @@ -53,4 +53,4 @@ wb = load_workbook("data.xlsx", read_only=True) openpyxl is **slow** by default. For large files: - Use `read_only=True` for reading (no in-memory model built) -- Consider WolfXL for a 1.69x read speedup (2026-10-02 perf snapshot: WolfXL 2.0.5 `wolfxl.load_workbook` 13.46 ms vs openpyxl 22.79 ms, summed p50 over 19 features); in the 2026-10-02 fidelity snapshot WolfXL has 17/21 features green in both read and write against openpyxl's 21/21 +- Consider WolfXL for a 1.73x read and 2.45x write speedup (2026-10-03 perf snapshot: WolfXL 2.0.8 `wolfxl.load_workbook` 13.90 ms vs openpyxl 24.01 ms, write 11.26 ms vs 27.59 ms, summed p50 over 19 features); in the 2026-10-02 fidelity snapshot WolfXL has 17/21 features green in both read and write against openpyxl's 21/21 diff --git a/docs-site/adapters/wolfxl.mdx b/docs-site/adapters/wolfxl.mdx index 3f4b252..3991f1b 100644 --- a/docs-site/adapters/wolfxl.mdx +++ b/docs-site/adapters/wolfxl.mdx @@ -5,13 +5,13 @@ description: "Rust-backed Python Excel library with an openpyxl-compatible API. WolfXL is a Rust-backed Python library with an openpyxl-compatible API. ExcelBench drives it through that public API: -| Operation | Public API (WolfXL 2.0.5) | Speed vs openpyxl (2026-10-02 perf snapshot) | +| Operation | Public API (WolfXL 2.0.8) | Speed vs openpyxl (2026-10-03 perf snapshot) | |-----------|---------------------------|-------------------| -| Read | `wolfxl.load_workbook(path)` | **1.69x faster** (13.46 ms vs 22.79 ms) | -| Write | `wolfxl.Workbook()` then `save(path)` | **1.20x faster** (22.28 ms vs 26.70 ms) | +| Read | `wolfxl.load_workbook(path)` | **1.73x faster** (13.90 ms vs 24.01 ms) | +| Write | `wolfxl.Workbook()` then `save(path)` | **2.45x faster** (11.26 ms vs 27.59 ms) | | Modify | `wolfxl.load_workbook(path, modify=True)` then `save(path)`: patch mode rewrites only the changed sheet XML and copies every other ZIP entry unchanged | No current measurement | -Speed figures are sums of per-feature p50 wall times over the same 19 xlsx features for both libraries (warmup 3, 25 iterations, Apple M4 Pro, Python 3.12.3), measured on WolfXL 2.0.5 through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`). Source: `results-2026-10-02/perf/README.md`. +Speed figures are sums of per-feature p50 wall times over the same 19 xlsx features for both libraries (warmup 3, 25 iterations, Apple M4 Pro, Python 3.12.3), measured on WolfXL 2.0.8 through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`). In the same run python-calamine (13.92x openpyxl) and polars (3.87x) read faster than WolfXL. Source: `results-2026-10-03/perf/README.md`. ## Install @@ -52,13 +52,13 @@ Large static content in a template (images, charts, pivot tables) is never parse ## Benchmark Scores -From the 2026-10-02 snapshot (WolfXL 2.0.5; fidelity from `results-2026-10-02/xlsx`, 21 scored features with `pivot_tables` unscored; speed from `results-2026-10-02/perf`): +Fidelity from the 2026-10-02 snapshot (WolfXL 2.0.5; `results-2026-10-02/xlsx`, 21 scored features with `pivot_tables` unscored); speed from the 2026-10-03 perf snapshot (WolfXL 2.0.8; `results-2026-10-03/perf`): | Axis | Score | |------|-------| | Fidelity | 17/21 features green in both read and write (read 19/21, write 18/21) | -| Read Speed | 1.69x openpyxl (WolfXL 2.0.5 public API) | -| Write Speed | 1.20x openpyxl (WolfXL 2.0.5 public API) | +| Read Speed | 1.73x openpyxl (WolfXL 2.0.8 public API) | +| Write Speed | 2.45x openpyxl (WolfXL 2.0.8 public API) | | Feature Coverage | 100% (21/21 features score at least 1 in read or write) | | Capability Breadth | 100 (R+W+Modify) | diff --git a/docs-site/cli/perf.mdx b/docs-site/cli/perf.mdx index 7074fd2..775a01e 100644 --- a/docs-site/cli/perf.mdx +++ b/docs-site/cli/perf.mdx @@ -48,13 +48,14 @@ uv run excelbench perf --tests fixtures/excel --output results ### Reference Numbers -From the 2026-10-02 perf snapshot (`results-2026-10-02/perf/README.md`): Apple M4 Pro, Python 3.12.3, warmup 3, 25 iterations, the same 19 xlsx features for every library. Totals are sums of per-feature p50 wall times; the multiple is openpyxl's total divided by the library's total. +From the 2026-10-03 perf snapshot (`results-2026-10-03/perf/README.md`): Apple M4 Pro, Python 3.12.3, warmup 3, 25 iterations, the same 19 xlsx features for every library. Totals are sums of per-feature p50 wall times; the multiple is openpyxl's total divided by the library's total. | Library | Read p50 total | Read vs openpyxl | Write p50 total | Write vs openpyxl | |---------|----------------|------------------|-----------------|-------------------| -| WolfXL 2.0.5 | 13.46 ms | 1.69x | 22.28 ms | 1.20x | -| openpyxl 3.1.5 | 22.79 ms | 1.00x | 26.70 ms | 1.00x | -| python-calamine 0.8.2 | 1.63 ms | 14.02x | n/a (read-only) | n/a | -| pandas 3.0.6 | 28.43 ms | 0.80x | 26.66 ms | 1.00x | +| WolfXL 2.0.8 | 13.90 ms | 1.73x | 11.26 ms | 2.45x | +| openpyxl 3.1.5 | 24.01 ms | 1.00x | 27.59 ms | 1.00x | +| python-calamine 0.8.2 | 1.73 ms | 13.92x | n/a (read-only) | n/a | +| polars 1.44.2 | 6.21 ms | 3.87x | n/a (read-only) | n/a | +| pandas 3.0.6 | 29.33 ms | 0.82x | 28.57 ms | 0.97x | -WolfXL is measured through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`), the same kind of surface as every other library. It reads 1.69x and writes 1.20x faster than openpyxl on this workload. +WolfXL is measured through its public API (`wolfxl.load_workbook`, `wolfxl.Workbook`), the same kind of surface as every other library. It reads 1.73x and writes 2.45x faster than openpyxl on this workload. python-calamine (13.92x) and polars (3.87x) read faster than WolfXL. openpyxl reads and writes faster than pandas. diff --git a/docs/public-reporting.md b/docs/public-reporting.md index 2e34d2b..4c1752a 100644 --- a/docs/public-reporting.md +++ b/docs/public-reporting.md @@ -12,7 +12,7 @@ This page explains what the current ExcelBench repo artifacts mean and how to ci - Fresh WolfXL 2.0 wheel-backed release snapshot: `results-release-2026-04-28/` generated 2026-04-29 UTC - Current checked-in cross-language context snapshot: `results-cross-language/` generated 2026-04-29 UTC - Current checked-in cross-language pivot capability artifact: `results-cross-language-pivots/` generated 2026-04-29 UTC -- Current competitor snapshot: `results-2026-10-03/` (fidelity, mutation, calc, cross-language) generated 2026-10-03 UTC with WolfXL 2.0.8 +- Current competitor snapshot: `results-2026-10-03/` (fidelity, mutation, calc, cross-language, perf) generated 2026-10-03 UTC with WolfXL 2.0.8 - Previous competitor snapshot: `results-2026-10-02/` (fidelity, mutation, calc, cross-language, perf) generated 2026-10-02 UTC with WolfXL 2.0.5 ## How To Cite ExcelBench Safely @@ -28,9 +28,9 @@ This page explains what the current ExcelBench repo artifacts mean and how to ci |---|---|---| | `results/xlsx/README.md` | 2026-02-17 | Current checked-in public XLSX fidelity snapshot | | `results/DASHBOARD.md` | 2026-02-17 | Current checked-in combined dashboard snapshot | -| `results/perf/README.md` | 2026-04-20 | Historical performance snapshot; its WolfXL column measured private backend objects and is superseded by `results-2026-10-02/perf/` | +| `results/perf/README.md` | 2026-04-20 | Historical performance snapshot; its WolfXL column measured private backend objects and is superseded by `results-2026-10-03/perf/` | | `results-release-2026-04-28/README.md` | 2026-04-29 | Fresh wheel-backed WolfXL 2.0 fidelity rerun | -| `results-release-2026-04-28/perf/README.md` | 2026-04-29 | Historical wheel-backed performance rerun; its WolfXL column measured private backend objects and is superseded by `results-2026-10-02/perf/` | +| `results-release-2026-04-28/perf/README.md` | 2026-04-29 | Historical wheel-backed performance rerun; its WolfXL column measured private backend objects and is superseded by `results-2026-10-03/perf/` | | `results-cross-language/README.md` | 2026-04-29 | Checked-in cross-language context snapshot for Apache POI and Excelize | | `results-cross-language-pivots/README.md` | 2026-04-29 | Separate pivot capability artifact for cross-language helpers | | `results-2026-09-08/xlsx/README.md` | 2026-09-08 | Competitor fidelity snapshot: 22 features, 14 Python adapters, WolfXL 2.1.0 + aspose-cells-foss | @@ -41,11 +41,12 @@ This page explains what the current ExcelBench repo artifacts mean and how to ci | `results-2026-10-02/mutation/README.md` | 2026-10-02 | Template-mutation lane: preservation is valid; wall time and RSS are not comparable (host under heavy unrelated load) | | `results-2026-10-02/calc/README.md` | 2026-10-02 | Formula-recalculation tier vs LibreOffice 26.8.0.3 oracle on the cache-free 133-formula fixture | | `results-2026-10-02/cross-language/README.md` | 2026-10-02 | Cross-language context: Apache POI 5.5.1, Excelize 2.10.1, zavora-xlsx 0.1.2 | -| `results-2026-10-02/perf/README.md` | 2026-10-02 | Performance snapshot: April's 19 features x 13 Python adapters, warmup 3, 25 iterations, WolfXL 2.0.5 through its public API, Apple M4 Pro | +| `results-2026-10-02/perf/README.md` | 2026-10-02 | Historical performance snapshot: April's 19 features x 13 Python adapters, warmup 3, 25 iterations, WolfXL 2.0.5 through its public API, Apple M4 Pro; superseded by `results-2026-10-03/perf/` | | `results-2026-10-03/xlsx/README.md` | 2026-10-03 | Competitor fidelity snapshot: 21 scored features (`pivot_tables` unscored), the same 17 adapters as 2026-10-02; WolfXL 2.0.8, python-calamine 0.8.2, pandas 3.0.6, polars 1.44.2, pyexcel 0.7.6, tablib 3.10.0 | | `results-2026-10-03/mutation/README.md` | 2026-10-03 | Template-mutation lane (content-model preservation, wall time, RSS); see its Scope note for host load | | `results-2026-10-03/calc/README.md` | 2026-10-03 | Formula-recalculation tier vs LibreOffice 26.8.0.3 oracle; WolfXL Community 2.0.8 and Commercial 2.3.0 | | `results-2026-10-03/cross-language/README.md` | 2026-10-03 | Cross-language context: Apache POI 5.5.1, Excelize 2.11.0, zavora-xlsx 0.1.2 | +| `results-2026-10-03/perf/README.md` | 2026-10-03 | Performance snapshot: the 2026-10-02 command, host and 13 Python adapters x 19 features, warmup 3, 25 iterations; WolfXL 2.0.8 through its public API is the only package change | ## Safe Claims Right Now diff --git a/results-2026-10-03/README.md b/results-2026-10-03/README.md index 88e1b52..085111f 100644 --- a/results-2026-10-03/README.md +++ b/results-2026-10-03/README.md @@ -6,8 +6,9 @@ | Template mutation | [mutation/](mutation/README.md) | `excelbench mutation -o results-2026-10-03/mutation --repeats 3` | | Formula recalculation | [calc/](calc/README.md) | `EXCELBENCH_WOLFXL_COMMERCIAL_PYTHON=/bin/python excelbench calc -o results-2026-10-03/calc` | | Cross-language context | [cross-language/](cross-language/README.md) | `EXCELBENCH_ORACLE_DOCKER_CONTEXT=pc excelbench cross-language-context -t fixtures/excel -o results-2026-10-03/cross-language` | +| Performance (13 Python adapters, separate host) | [perf/](perf/README.md) | `excelbench perf --tests fixtures/excel --profile xlsx --warmup 3 --iters 25 --iteration-policy fixed --memory-mode getrusage` with 19 `--feature` and 13 `--adapter` flags (full command in [perf/README.md](perf/README.md)) | -All four lanes ran from [run.sh](run.sh) (`EB_VENV` and `EB_COMMERCIAL` name the two interpreters); its console output is [run-log.txt](run-log.txt). The per-lane console logs it writes to `logs/` are gitignored and not committed; every score is in each lane's `results.json`. Perf is a separate snapshot. Fixtures, scoring and adapters are the ones used for 2026-10-02; the only code change is the Excelize helper port to 2.11.0 (see the cross-language README). +The fidelity, mutation, calc and cross-language lanes ran from [run.sh](run.sh) (`EB_VENV` and `EB_COMMERCIAL` name the two interpreters); its console output is [run-log.txt](run-log.txt). The per-lane console logs it writes to `logs/` are gitignored and not committed; every score is in each lane's `results.json`. Perf ran separately on a different host (Apple M4 Pro, Python 3.12.3, the WolfXL 2.0.8 cp312 wheel) with the 2026-10-02 perf command; its receipt, pins and log are in [perf/](perf/README.md). Fixtures, scoring and adapters are the ones used for 2026-10-02; the only code change is the Excelize helper port to 2.11.0 (see the cross-language README). ## Versions @@ -54,3 +55,4 @@ macOS 26.5.1 (25F80), Apple M5 Pro, 64 GB, arm64; Python 3.13.9; ExcelBench `mas - Cross-language: identical scores (Apache POI 18/21, Excelize 18/21 after the 2.11.0 bump, zavora-xlsx 8/21). - Calc: identical except the WolfXL Community version (2.0.8, 133/133 calculated, 0/133 saved). - Mutation: identical verdicts (wolfxl Preserved 17/17, openpyxl 16/17, LibreOffice 15/17, aspose-cells-foss 15/17, SheetJS 8/17, zavora-xlsx 8/17, ExcelJS fails to load the template). The committed table is a rerun at 00:24:57Z with the same command, because unrelated host load spiked during the `run.sh` attempt and skewed its timings; `run-log.txt` covers only the `run.sh` attempt. Details and load readings are in the mutation README. +- Perf ([perf/](perf/README.md)): the only package change is WolfXL 2.0.5 to 2.0.8. WolfXL write fell from 22.28 to 11.26 ms (sum of 19 per-feature p50s; 1.20x to 2.45x openpyxl) and read is flat (13.46 to 13.90 ms; 1.69x to 1.73x). python-calamine (13.92x openpyxl) and polars (3.87x) still read faster than WolfXL. The other adapters moved by -3.8% to +13.3% with no version change, which is run-to-run variance. diff --git a/results-2026-10-03/perf/README.md b/results-2026-10-03/perf/README.md new file mode 100644 index 0000000..0e8a6bd --- /dev/null +++ b/results-2026-10-03/perf/README.md @@ -0,0 +1,362 @@ +# ExcelBench Performance Results + +*Generated: 2026-10-03T00:00:03.786680+00:00* +*Profile: xlsx* +*Platform: Darwin-arm64* +*Python: 3.12.3* +*CPU: arm* +*Cores: 14 | Memory MB: 24576.0* +*Config: warmup=3 iters=25 iteration_policy=fixed breakdown=False* + +## Run Receipt + +Rerun of the 2026-10-02 perf snapshot (`results-2026-10-02/perf/`) with the WolfXL 2.0.8 +PyPI wheel. Method, fixtures, adapter set, iteration counts, host, interpreter and every +non-WolfXL package version are unchanged from 2026-10-02. WolfXL is measured through its +public API (`wolfxl.load_workbook`, `wolfxl.Workbook`), like every other library. + +### Source identity + +- ExcelBench commit: `b4533551150b3d4932f914088855f43b63493532` (`origin/master`, published), + tree `31a5f7e6237f43029120df6f89387129b5fdbc31`. `metadata.commit` in `results.json` is + `null` because the harness reads `git rev-parse` and the staged tree is a git archive, not a + checkout; the staging receipt below is the source identity. +- The perf harness (`src/excelbench/perf/`), the adapters (`src/excelbench/harness/adapters/`), + `src/excelbench/cli.py` and `fixtures/excel/` are byte-identical to the 2026-10-02 run's + source: `git diff --stat b453355 -- src/excelbench/perf src/excelbench/harness/adapters src/excelbench/cli.py fixtures/excel` + prints nothing for `` = `a9b223c` (the commit the 2026-10-02 run recorded) and for + `8db6afa` (its published equivalent). +- Staged from a clean `git worktree` at that commit (no dirty or untracked overlay). +- Staging receipt (`remote-source-sync run`): + +```json +{"action": "run", "schema_version": "remote-source-sync.v1", "mode": "git-archive-tar-gzip-1+dirty-overlay", + "head": "b4533551150b3d4932f914088855f43b63493532", "source_key": "b4533551150b3d4932f914088855f43b63493532", + "tracked_files": 563, "dirty_files": 0, "deleted_files": 0, "excluded_generated_files": 0, + "allowed_sensitive_files": 0, "target": "m4", "remote_dir": "~/wolf-lane/officelibs-perf-2026-10-03/src", + "replaces_remote_directory": true, "transfer_ok": true} +``` + +- Fixture manifest `fixtures/excel/manifest.json` sha256 + `984073b67669fb0566b55e35a05447fbaaeb9f0da2d6de1a335baf61de9b382f`, the same as 2026-10-02. + +### Host + +- Same host as 2026-10-02: Apple Mac16,8, Apple M4 Pro, 14 cores, 24 GB RAM; macOS 26.6.2 + (25G83), Darwin 25.6.0. Headless worker with sleep disabled. +- Resident non-benchmark load: the same long-running background agent process as on 2026-10-02, + at about one core for the whole window (not ours; not stopped). No other job of ours ran during + the measurement. +- Gates in `run.sh`: wait until `date -u +%F` prints 2026-10-03, then wait until load1 <= 4.0 + (10 s poll, 10 min cap). + - Date gate passed at 2026-10-03T00:00:02Z; the load gate passed on its first check. + - Load before: `{ 2.75 3.27 3.08 }` at 2026-10-03T00:00:02Z. + - Load after: `{ 2.93 3.29 3.08 }` at 2026-10-03T00:00:17Z. + - This is the only scored attempt; nothing was discarded. + +### Interpreter and packages + +- CPython 3.12.3 (python-build-standalone via uv, Clang 17.0.6). Fresh `uv venv` (uv 0.12.5), + default PyPI index, no index overrides. +- Pinned adapter packages (`pins.txt`): wolfxl 2.0.8, openpyxl 3.1.5, xlsxwriter 3.2.9, + python-calamine 0.8.2, pylightxl 1.61, xlrd 2.0.2, pyexcel 0.7.6, pyexcel-xlsx 0.6.1, + xlwt 1.3.0, pandas 3.0.6, polars 1.44.2, fastexcel 0.21.0, tablib 3.10.0. Each is the PyPI + latest on 2026-10-03 (checked against the PyPI JSON API before the run); no pin needed a bump. + `pip-freeze.txt` differs from 2026-10-02 only in the `wolfxl` line. +- WolfXL: `wolfxl.__version__ == "2.0.8"`, wheel `wolfxl-2.0.8-cp312-cp312-macosx_11_0_arm64.whl` + (maturin 1.14.1, uploaded 2026-10-02T23:48:12Z), sha256 + `7000537dde2101880671d83f010b6d3f519d3c553c5ad18b9ad56dc87add5ab7` (equal to the PyPI digest; + re-downloaded and hashed on the host). The installed `wolfxl/_rust.cpython-312-darwin.so` + sha256 `b967a8009824badcb982eca9e4a727aa2a4d9b2acc59b8dc55c63b07da5ee643` equals the copy + inside that wheel. Source: SynthGL/wolfxl-oss tag `v2.0.8`, commit + `396be5a9f5bb82c2892c9236e3571515315c4bfb` (tag resolved through the GitHub API). + +### Command + +Run from the staged source root by `run.sh` (log: `run-log.txt`; wall 14.5 s, exit 0). The +command is identical to 2026-10-02: + +```bash +excelbench perf --tests fixtures/excel --output ../out --profile xlsx \ + --warmup 3 --iters 25 --iteration-policy fixed --memory-mode getrusage \ + --feature cell_values --feature formulas --feature text_formatting --feature background_colors \ + --feature number_formats --feature alignment --feature borders --feature dimensions \ + --feature multiple_sheets --feature merged_cells --feature conditional_formatting \ + --feature data_validation --feature hyperlinks --feature images --feature pivot_tables \ + --feature comments --feature freeze_panes --feature named_ranges --feature tables \ + --adapter openpyxl --adapter xlsxwriter --adapter python-calamine --adapter wolfxl \ + --adapter pylightxl --adapter xlrd --adapter pyexcel --adapter xlwt --adapter pandas \ + --adapter xlsxwriter-constmem --adapter openpyxl-readonly --adapter polars --adapter tablib +``` + +- Warmup 3, recorded iterations 25, policy `fixed`, breakdown off, memory mode `getrusage`. + The perf harness has no per-operation timeout. +- 19 features x 13 adapters, the same set and order as 2026-10-02 and 2026-04-29. Every adapter + gets the same fixtures, warmup and iteration count; nothing is WolfXL-specific. +- Cold vs warm: the harness runs every (feature, adapter, operation) in one process, discards + the first 3 iterations as warmup, and reports min/p50/p95 over the next 25. All numbers are + warm in-process timings; cold start is not measured by this lane. + +### Differences from 2026-10-02 + +- **WolfXL 2.0.5 to 2.0.8.** This is the only package change. +- **Non-WolfXL adapters:** no version, method or coverage change. The Run Issues list below is + identical to 2026-10-02 (163 lines). Their p50 totals moved by -4% to +13% (most +1% to +8%) + with unchanged code; this is run-to-run and host variance, and it is why the ratios against + openpyxl below are taken within a single run. +- **WolfXL write.** The write total fell from 22.28 ms to 11.26 ms, and every one of the 19 + write features dropped (for example `cell_values` 1.18 to 0.59 ms). Read is unchanged within + noise (13.46 to 13.90 ms, the same drift as the other adapters). +- **Version-isolation diagnostic** (`diagnostics/`, same host and harness, openpyxl as control, + run back to back right after the scored run at 00:00:39Z to 00:00:57Z): WolfXL 2.0.5 read + 14.30 ms / write 26.01 ms vs 2.0.8 read 14.44 ms / write 12.23 ms, with openpyxl at + 24.21/30.67 and 24.24/29.38 ms. The write change follows the WolfXL version, not the host. + The 2.0.5 wheel installed for the diagnostic carries the same `_rust` extension as the + 2026-10-02 run (RECORD sha256 `O-2nMvPe8nVwzwcWifeoaRoIGNCjRk4HX8Gxg8DNHcA`). + +### Artifacts + +- `results.json`, `README.md` (this file; summary tables below are harness output), + `matrix.csv`, `history.jsonl`: harness output. +- `run.sh`, `run-log.txt`: the exact driver and its log (home prefix replaced with `~`, one + unrelated process path redacted; `.txt` because the repo ignores `*.log`). +- `pins.txt`, `pip-freeze.txt`: requested pins and the resolved environment. +- `diagnostics/wolfxl-2.0.5-control.results.json`, `diagnostics/wolfxl-2.0.8-control.results.json`: + the version-isolation diagnostic above (openpyxl + wolfxl only). Not part of the snapshot. + +### Per-adapter p50 totals (sum of per-feature p50 wall ms; n = features measured) + +Ratios against openpyxl are openpyxl's total divided by the library's total, within the same run. + +| Adapter | 2026-10-02 version | 2026-10-03 version | Op | 2026-10-02 total (n) | 2026-10-03 total (n) | 2026-10-02 vs openpyxl | 2026-10-03 vs openpyxl | +|---|---|---|---|---|---|---|---| +| openpyxl | 3.1.5 | 3.1.5 | read | 22.79 (19) | 24.01 (19) | 1.00x | 1.00x | +| openpyxl | 3.1.5 | 3.1.5 | write | 26.70 (19) | 27.59 (19) | 1.00x | 1.00x | +| xlsxwriter | 3.2.9 | 3.2.9 | write | 31.12 (19) | 33.63 (19) | 0.86x | 0.82x | +| python-calamine | 0.8.2 | 0.8.2 | read | 1.63 (19) | 1.73 (19) | 14.02x | 13.92x | +| wolfxl | 2.0.5 | 2.0.8 | read | 13.46 (19) | 13.90 (19) | 1.69x | 1.73x | +| wolfxl | 2.0.5 | 2.0.8 | write | 22.28 (19) | 11.26 (19) | 1.20x | 2.45x | +| pylightxl | 1.61 | 1.61 | read | 10.55 (10) | 10.92 (10) | 2.16x | 2.20x | +| pylightxl | 1.61 | 1.61 | write | 1.21 (5) | 1.23 (5) | not comparable (5 features) | not comparable (5 features) | +| pyexcel | 0.7.6 | 0.7.6 | read | 24.92 (19) | 25.37 (19) | 0.91x | 0.95x | +| pyexcel | 0.7.6 | 0.7.6 | write | 7.28 (5) | 7.00 (5) | not comparable (5 features) | not comparable (5 features) | +| xlwt | 1.3.0 | 1.3.0 | write | 2.90 (14) | 3.28 (14) | not comparable (14 features) | not comparable (14 features) | +| pandas | 3.0.6 | 3.0.6 | read | 28.43 (19) | 29.33 (19) | 0.80x | 0.82x | +| pandas | 3.0.6 | 3.0.6 | write | 26.66 (19) | 28.57 (19) | 1.00x | 0.97x | +| xlsxwriter-constmem | 3.2.9 | 3.2.9 | write | 31.17 (19) | 33.69 (19) | 0.86x | 0.82x | +| openpyxl-readonly | 3.1.5 | 3.1.5 | read | 22.75 (19) | 23.52 (19) | 1.00x | 1.02x | +| polars | 1.44.2 | 1.44.2 | read | 6.13 (19) | 6.21 (19) | 3.72x | 3.87x | +| tablib | 3.10.0 | 3.10.0 | read | 23.09 (19) | 23.74 (19) | 0.99x | 1.01x | +| tablib | 3.10.0 | 3.10.0 | write | 23.58 (19) | 24.61 (19) | 1.13x | 1.12x | + +xlrd has no timings (it does not read `.xlsx`). Leaders on this workload: python-calamine for +read (13.92x openpyxl); for write over all 19 features, WolfXL 2.0.8 (2.45x openpyxl). +pylightxl, pyexcel and xlwt write only a subset of features, so their write totals do not rank +against the 19-feature totals. + +## Notes + +These numbers measure only the library under test. Write timings do NOT include oracle verification. +Confidence note: treat deltas under ~5% as noise unless stable across multiple runs. + +## Summary (p50 wall time) + +**Tier 0 — Basic Values** + +| Feature | openpyxl (R p50/p95 ms) | openpyxl (W p50/p95 ms) | openpyxl-readonly (R p50/p95 ms) | pandas (R p50/p95 ms) | pandas (W p50/p95 ms) | polars (R p50/p95 ms) | pyexcel (R p50/p95 ms) | pyexcel (W p50/p95 ms) | pylightxl (R p50/p95 ms) | pylightxl (W p50/p95 ms) | python-calamine (R p50/p95 ms) | tablib (R p50/p95 ms) | tablib (W p50/p95 ms) | wolfxl (R p50/p95 ms) | wolfxl (W p50/p95 ms) | xlrd (R p50/p95 ms) | xlsxwriter (W p50/p95 ms) | xlsxwriter-constmem (W p50/p95 ms) | xlwt (W p50/p95 ms) | +|---------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------| +| cell_values | 1.30/1.62 | 1.29/1.51 | 5.92/6.17 | 1.77/1.93 | 1.57/1.85 | 0.45/0.72 | 1.49/1.52 | — | 1.32/1.33 | — | 0.65/0.66 | 1.43/1.69 | 1.35/1.45 | 0.69/0.74 | 0.59/0.67 | — | 1.70/2.00 | 1.73/2.03 | 0.28/0.33 | +| formulas | 1.14/1.19 | 1.41/1.59 | 1.49/1.56 | 1.59/1.72 | 1.67/1.76 | 0.39/0.47 | 1.26/1.31 | 1.45/1.52 | 1.13/1.19 | 0.26/0.28 | 0.14/0.14 | 1.19/1.25 | 1.43/1.66 | 0.63/0.70 | 0.66/0.73 | — | 1.61/2.07 | 1.77/2.18 | 0.28/0.30 | +| multiple_sheets | 1.28/1.33 | 1.75/1.95 | 1.01/1.04 | 1.79/1.87 | 2.08/2.27 | 0.51/0.62 | 1.40/1.54 | 1.72/1.96 | 1.31/1.32 | 0.31/0.41 | 0.06/0.06 | 1.35/1.47 | 1.69/1.89 | 0.52/0.58 | 0.57/0.62 | — | 1.97/2.71 | 2.07/2.54 | 0.20/0.21 | + +**Tier 1 — Formatting** + +| Feature | openpyxl (R p50/p95 ms) | openpyxl (W p50/p95 ms) | openpyxl-readonly (R p50/p95 ms) | pandas (R p50/p95 ms) | pandas (W p50/p95 ms) | polars (R p50/p95 ms) | pyexcel (R p50/p95 ms) | pyexcel (W p50/p95 ms) | pylightxl (R p50/p95 ms) | pylightxl (W p50/p95 ms) | python-calamine (R p50/p95 ms) | tablib (R p50/p95 ms) | tablib (W p50/p95 ms) | wolfxl (R p50/p95 ms) | wolfxl (W p50/p95 ms) | xlrd (R p50/p95 ms) | xlsxwriter (W p50/p95 ms) | xlsxwriter-constmem (W p50/p95 ms) | xlwt (W p50/p95 ms) | +|---------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------| +| alignment | 1.21/1.25 | 1.36/1.42 | 0.97/1.01 | 1.44/1.51 | 1.44/1.59 | 0.25/0.31 | 1.27/1.29 | — | — | — | 0.05/0.05 | 1.24/1.29 | 1.22/1.36 | 0.67/0.73 | 0.55/0.69 | — | 1.80/2.17 | 1.72/2.16 | 0.24/0.36 | +| background_colors | 1.01/1.02 | 1.30/1.43 | 0.88/0.94 | 1.26/1.36 | 1.44/1.62 | 0.23/0.27 | 1.08/1.11 | — | 0.94/0.95 | — | 0.05/0.06 | 1.03/1.05 | 1.19/1.23 | 0.59/0.65 | 0.53/0.60 | — | 1.76/2.27 | 1.67/1.97 | 0.23/0.36 | +| borders | 1.85/2.00 | 2.15/2.44 | 1.31/1.41 | 2.05/2.32 | 1.59/1.79 | 0.26/0.32 | 1.79/2.27 | — | — | — | 0.06/0.07 | 1.80/2.16 | 1.37/1.55 | 1.03/1.06 | 0.82/0.87 | — | 2.19/2.62 | 2.32/2.62 | 0.43/0.58 | +| dimensions | 0.95/0.97 | 1.16/1.29 | 0.81/0.94 | 1.25/1.32 | 1.30/1.43 | 0.33/0.46 | 1.05/1.07 | — | 0.90/0.91 | — | 0.06/0.06 | 0.98/1.01 | 1.16/1.28 | 0.55/0.60 | 0.52/0.71 | — | 1.41/1.82 | 1.71/2.02 | 0.16/0.36 | +| number_formats | 1.03/1.06 | 1.27/1.41 | 0.87/0.92 | 1.27/1.30 | 1.39/1.45 | 0.24/0.30 | 1.09/1.19 | — | 0.94/1.02 | — | 0.06/0.06 | 1.05/1.11 | 1.18/1.35 | 0.61/0.67 | 0.53/0.57 | — | 1.58/1.89 | 1.70/2.06 | 0.22/0.28 | +| text_formatting | 1.72/1.80 | 1.70/1.82 | 1.46/1.48 | 2.01/2.12 | 1.57/1.84 | 0.25/0.30 | 1.78/1.82 | — | 1.49/1.53 | — | 0.08/0.08 | 1.78/1.86 | 1.33/1.43 | 0.85/0.91 | 0.66/0.74 | — | 1.99/2.34 | 2.00/2.22 | 0.36/0.39 | + +**Tier 2 — Advanced** + +| Feature | openpyxl (R p50/p95 ms) | openpyxl (W p50/p95 ms) | openpyxl-readonly (R p50/p95 ms) | pandas (R p50/p95 ms) | pandas (W p50/p95 ms) | polars (R p50/p95 ms) | pyexcel (R p50/p95 ms) | pyexcel (W p50/p95 ms) | pylightxl (R p50/p95 ms) | pylightxl (W p50/p95 ms) | python-calamine (R p50/p95 ms) | tablib (R p50/p95 ms) | tablib (W p50/p95 ms) | wolfxl (R p50/p95 ms) | wolfxl (W p50/p95 ms) | xlrd (R p50/p95 ms) | xlsxwriter (W p50/p95 ms) | xlsxwriter-constmem (W p50/p95 ms) | xlwt (W p50/p95 ms) | +|---------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------| +| comments | 1.13/1.21 | 1.53/1.75 | 0.87/0.90 | 1.26/1.37 | 1.24/1.40 | 0.24/0.32 | 1.15/1.18 | — | 1.12/1.14 | — | 0.06/0.07 | 1.01/1.07 | 1.12/1.17 | 1.14/1.24 | 0.61/0.67 | — | 2.08/2.55 | 1.50/1.83 | — | +| conditional_formatting | 1.38/1.42 | 1.67/1.81 | 0.96/0.98 | 1.76/1.79 | 1.54/1.71 | 0.37/0.52 | 1.46/1.50 | — | — | — | 0.05/0.05 | 1.45/1.63 | 1.40/1.47 | 1.02/1.08 | 0.61/0.66 | — | 1.68/2.06 | 2.08/2.48 | — | +| data_validation | 1.21/1.36 | 1.22/1.28 | 0.90/0.94 | 1.64/1.76 | 1.27/1.42 | 0.48/0.63 | 1.32/1.34 | — | — | — | 0.05/0.05 | 1.29/1.32 | 1.13/1.23 | 0.59/0.65 | 0.53/0.59 | — | 1.51/1.87 | 1.60/1.92 | — | +| freeze_panes | 1.37/1.80 | 1.91/2.11 | 0.98/1.00 | 1.80/1.90 | 2.07/2.30 | 0.45/0.59 | 1.48/1.86 | — | — | — | 0.05/0.06 | 1.40/1.56 | 1.91/2.11 | 0.70/0.75 | 0.74/0.97 | — | 1.88/2.28 | 2.10/2.61 | 0.21/0.22 | +| hyperlinks | 1.19/1.21 | 1.26/1.41 | 0.88/0.98 | 1.55/1.56 | 1.28/1.44 | 0.37/0.48 | 1.28/1.39 | — | — | — | 0.05/0.05 | 1.22/1.26 | 1.14/1.25 | 1.15/1.21 | 0.54/0.58 | — | 1.75/1.94 | 1.82/2.13 | — | +| images | 1.63/2.13 | 1.62/1.82 | 0.79/0.82 | 1.16/1.26 | 1.26/1.45 | 0.22/0.26 | 1.21/1.26 | — | — | — | 0.05/0.05 | 0.94/1.02 | 1.14/1.19 | 0.87/0.91 | 0.69/0.73 | — | 2.49/2.89 | 1.47/2.01 | — | +| merged_cells | 1.24/1.27 | 1.33/1.59 | 0.88/0.92 | 1.32/1.34 | 1.43/1.61 | 0.23/0.29 | 1.31/1.36 | — | 0.95/0.97 | — | 0.06/0.06 | 1.07/1.09 | 1.16/1.23 | 0.82/0.87 | 0.54/0.57 | — | 1.65/2.10 | 1.60/2.03 | 0.20/0.36 | +| named_ranges | 1.11/1.14 | 1.41/1.47 | 0.87/0.90 | 1.57/2.06 | 1.78/2.04 | 0.37/0.46 | 1.24/1.34 | 1.49/4.76 | — | 0.23/0.25 | 0.05/0.05 | 1.19/1.21 | 1.36/3.56 | 0.49/0.53 | 0.54/0.57 | — | 1.57/1.99 | 1.68/2.17 | 0.16/0.17 | +| pivot_tables | 0.81/0.85 | 1.13/1.30 | 0.74/0.81 | 1.16/1.39 | 1.41/1.81 | 0.23/0.27 | 0.90/0.96 | 1.21/1.26 | 0.82/0.84 | 0.22/0.23 | 0.05/0.05 | 0.90/0.93 | 1.19/1.26 | 0.47/0.52 | 0.50/0.55 | — | 1.58/2.05 | 1.69/2.19 | 0.18/0.19 | +| tables | 1.44/1.85 | 1.13/1.30 | 0.93/0.95 | 1.68/1.78 | 1.23/1.30 | 0.37/0.54 | 1.81/2.23 | 1.13/1.20 | — | 0.21/0.22 | 0.05/0.06 | 1.40/1.42 | 1.14/1.20 | 0.52/0.56 | 0.49/0.52 | — | 1.45/1.83 | 1.46/1.79 | 0.14/0.15 | + +## Run Issues + +- alignment / openpyxl-readonly: Write unsupported +- alignment / polars: Write unsupported +- alignment / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells +- alignment / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature +- alignment / python-calamine: Write unsupported +- alignment / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- alignment / xlsxwriter-constmem: Read unsupported +- alignment / xlsxwriter: Read unsupported +- alignment / xlwt: Read unsupported +- background_colors / openpyxl-readonly: Write unsupported +- background_colors / polars: Write unsupported +- background_colors / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells +- background_colors / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature +- background_colors / python-calamine: Write unsupported +- background_colors / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- background_colors / xlsxwriter-constmem: Read unsupported +- background_colors / xlsxwriter: Read unsupported +- background_colors / xlwt: Read unsupported +- borders / openpyxl-readonly: Write unsupported +- borders / polars: Write unsupported +- borders / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells +- borders / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature +- borders / python-calamine: Write unsupported +- borders / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- borders / xlsxwriter-constmem: Read unsupported +- borders / xlsxwriter: Read unsupported +- borders / xlwt: Read unsupported +- cell_values / openpyxl-readonly: Write unsupported +- cell_values / polars: Write unsupported +- cell_values / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells +- cell_values / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature +- cell_values / python-calamine: Write unsupported +- cell_values / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- cell_values / xlsxwriter-constmem: Read unsupported +- cell_values / xlsxwriter: Read unsupported +- cell_values / xlwt: Read unsupported +- comments / openpyxl-readonly: Write unsupported +- comments / polars: Write unsupported +- comments / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature +- comments / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature +- comments / python-calamine: Write unsupported +- comments / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- comments / xlsxwriter-constmem: Read unsupported +- comments / xlsxwriter: Read unsupported +- comments / xlwt: Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments +- conditional_formatting / openpyxl-readonly: Write unsupported +- conditional_formatting / polars: Write unsupported +- conditional_formatting / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature +- conditional_formatting / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature +- conditional_formatting / python-calamine: Write unsupported +- conditional_formatting / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- conditional_formatting / xlsxwriter-constmem: Read unsupported +- conditional_formatting / xlsxwriter: Read unsupported +- conditional_formatting / xlwt: Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting +- data_validation / openpyxl-readonly: Write unsupported +- data_validation / polars: Write unsupported +- data_validation / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature +- data_validation / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature +- data_validation / python-calamine: Write unsupported +- data_validation / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- data_validation / xlsxwriter-constmem: Read unsupported +- data_validation / xlsxwriter: Read unsupported +- data_validation / xlwt: Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations +- dimensions / openpyxl-readonly: Write unsupported +- dimensions / polars: Write unsupported +- dimensions / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing +- dimensions / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature +- dimensions / python-calamine: Write unsupported +- dimensions / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- dimensions / xlsxwriter-constmem: Read unsupported +- dimensions / xlsxwriter: Read unsupported +- dimensions / xlwt: Read unsupported +- formulas / openpyxl-readonly: Write unsupported +- formulas / polars: Write unsupported +- formulas / python-calamine: Write unsupported +- formulas / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- formulas / xlsxwriter-constmem: Read unsupported +- formulas / xlsxwriter: Read unsupported +- formulas / xlwt: Read unsupported +- freeze_panes / openpyxl-readonly: Write unsupported +- freeze_panes / polars: Write unsupported +- freeze_panes / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature +- freeze_panes / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature +- freeze_panes / python-calamine: Write unsupported +- freeze_panes / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- freeze_panes / xlsxwriter-constmem: Read unsupported +- freeze_panes / xlsxwriter: Read unsupported +- freeze_panes / xlwt: Read unsupported +- hyperlinks / openpyxl-readonly: Write unsupported +- hyperlinks / polars: Write unsupported +- hyperlinks / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature +- hyperlinks / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature +- hyperlinks / python-calamine: Write unsupported +- hyperlinks / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- hyperlinks / xlsxwriter-constmem: Read unsupported +- hyperlinks / xlsxwriter: Read unsupported +- hyperlinks / xlwt: Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter +- images / openpyxl-readonly: Write unsupported +- images / polars: Write unsupported +- images / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_image: pyexcel does not expose this worksheet feature +- images / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_image: pylightxl does not implement this feature +- images / python-calamine: Write unsupported +- images / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- images / xlsxwriter-constmem: Read unsupported +- images / xlsxwriter: Read unsupported +- images / xlwt: Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_image: xlwt cannot embed images in this adapter +- merged_cells / openpyxl-readonly: Write unsupported +- merged_cells / polars: Write unsupported +- merged_cells / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature +- merged_cells / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature +- merged_cells / python-calamine: Write unsupported +- merged_cells / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- merged_cells / xlsxwriter-constmem: Read unsupported +- merged_cells / xlsxwriter: Read unsupported +- merged_cells / xlwt: Read unsupported +- multiple_sheets / openpyxl-readonly: Write unsupported +- multiple_sheets / polars: Write unsupported +- multiple_sheets / python-calamine: Write unsupported +- multiple_sheets / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- multiple_sheets / xlsxwriter-constmem: Read unsupported +- multiple_sheets / xlsxwriter: Read unsupported +- multiple_sheets / xlwt: Read unsupported +- named_ranges / openpyxl-readonly: Write unsupported +- named_ranges / polars: Write unsupported +- named_ranges / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType' +- named_ranges / python-calamine: Write unsupported +- named_ranges / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- named_ranges / xlsxwriter-constmem: Read unsupported +- named_ranges / xlsxwriter: Read unsupported +- named_ranges / xlwt: Read unsupported +- number_formats / openpyxl-readonly: Write unsupported +- number_formats / polars: Write unsupported +- number_formats / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells +- number_formats / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature +- number_formats / python-calamine: Write unsupported +- number_formats / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- number_formats / xlsxwriter-constmem: Read unsupported +- number_formats / xlsxwriter: Read unsupported +- number_formats / xlwt: Read unsupported +- pivot_tables / openpyxl-readonly: Write unsupported +- pivot_tables / polars: Write unsupported +- pivot_tables / python-calamine: Write unsupported +- pivot_tables / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- pivot_tables / xlsxwriter-constmem: Read unsupported +- pivot_tables / xlsxwriter: Read unsupported +- pivot_tables / xlwt: Read unsupported +- tables / openpyxl-readonly: Write unsupported +- tables / polars: Write unsupported +- tables / pylightxl: Read failed: TypeError: expected string or bytes-like object, got 'NoneType' +- tables / python-calamine: Write unsupported +- tables / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- tables / xlsxwriter-constmem: Read unsupported +- tables / xlsxwriter: Read unsupported +- tables / xlwt: Read unsupported +- text_formatting / openpyxl-readonly: Write unsupported +- text_formatting / polars: Write unsupported +- text_formatting / pyexcel: Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells +- text_formatting / pylightxl: Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature +- text_formatting / python-calamine: Write unsupported +- text_formatting / xlrd: Write unsupported; Read not applicable: xlrd does not support .xlsx input +- text_formatting / xlsxwriter-constmem: Read unsupported +- text_formatting / xlsxwriter: Read unsupported +- text_formatting / xlwt: Read unsupported diff --git a/results-2026-10-03/perf/diagnostics/wolfxl-2.0.5-control.results.json b/results-2026-10-03/perf/diagnostics/wolfxl-2.0.5-control.results.json new file mode 100644 index 0000000..ad3811e --- /dev/null +++ b/results-2026-10-03/perf/diagnostics/wolfxl-2.0.5-control.results.json @@ -0,0 +1,2097 @@ +{ + "metadata": { + "benchmark_version": "0.1.0", + "run_date": "2026-10-03T00:00:51.028658+00:00", + "excel_version": "16.105.3", + "platform": "Darwin-arm64", + "profile": "xlsx", + "python": "3.12.3", + "commit": null, + "config": { + "warmup": 3, + "iters": 25, + "iteration_policy": "fixed", + "breakdown": false + }, + "run_environment": { + "cpu_model": "arm", + "core_count": 14, + "memory_total_mb": 24576.0 + } + }, + "libraries": { + "openpyxl": { + "name": "openpyxl", + "version": "3.1.5", + "language": "python", + "capabilities": [ + "read", + "write" + ] + }, + "wolfxl": { + "name": "wolfxl", + "version": "2.0.5", + "language": "python", + "capabilities": [ + "modify", + "read", + "write" + ] + } + }, + "results": [ + { + "feature": "cell_values", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.27525, + "p50": 1.363625, + "p95": 1.426083 + }, + "cpu_ms": { + "min": 1.275, + "p50": 1.363, + "p95": 1.426 + }, + "rss_peak_mb": 184.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.363625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.57525, + "p50": 1.999791, + "p95": 2.9785 + }, + "cpu_ms": { + "min": 1.464, + "p50": 1.639, + "p95": 2.086 + }, + "rss_peak_mb": 184.765625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.999791, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.686375, + "p50": 0.716875, + "p95": 0.807584 + }, + "cpu_ms": { + "min": 0.686, + "p50": 0.716, + "p95": 0.808 + }, + "rss_peak_mb": 185.984375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.716875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.54125, + "p50": 2.141334, + "p95": 3.555792 + }, + "cpu_ms": { + "min": 1.36, + "p50": 1.707, + "p95": 1.975 + }, + "rss_peak_mb": 186.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.141334, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.09775, + "p50": 1.202584, + "p95": 1.27625 + }, + "cpu_ms": { + "min": 1.099, + "p50": 1.203, + "p95": 1.277 + }, + "rss_peak_mb": 186.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.202584, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.720667, + "p50": 2.505, + "p95": 3.230041 + }, + "cpu_ms": { + "min": 1.601, + "p50": 1.773, + "p95": 1.893 + }, + "rss_peak_mb": 186.640625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.505, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.583709, + "p50": 0.601375, + "p95": 0.655625 + }, + "cpu_ms": { + "min": 0.583, + "p50": 0.601, + "p95": 0.656 + }, + "rss_peak_mb": 186.640625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.601375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.296083, + "p50": 1.866209, + "p95": 2.956541 + }, + "cpu_ms": { + "min": 1.296, + "p50": 1.731, + "p95": 1.83 + }, + "rss_peak_mb": 186.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.866209, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.71725, + "p50": 1.812666, + "p95": 1.991208 + }, + "cpu_ms": { + "min": 1.717, + "p50": 1.812, + "p95": 1.991 + }, + "rss_peak_mb": 186.8125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.812666, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.707417, + "p50": 2.018125, + "p95": 3.16325 + }, + "cpu_ms": { + "min": 1.708, + "p50": 1.911, + "p95": 2.087 + }, + "rss_peak_mb": 186.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.018125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.874875, + "p50": 0.906542, + "p95": 0.955375 + }, + "cpu_ms": { + "min": 0.875, + "p50": 0.908, + "p95": 0.955 + }, + "rss_peak_mb": 186.875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.906542, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.302583, + "p50": 1.432458, + "p95": 2.005917 + }, + "cpu_ms": { + "min": 1.303, + "p50": 1.415, + "p95": 1.729 + }, + "rss_peak_mb": 187.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.432458, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.982625, + "p50": 1.054667, + "p95": 1.105 + }, + "cpu_ms": { + "min": 0.983, + "p50": 1.054, + "p95": 1.106 + }, + "rss_peak_mb": 187.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.054667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.269708, + "p50": 1.460708, + "p95": 3.119917 + }, + "cpu_ms": { + "min": 1.27, + "p50": 1.387, + "p95": 3.12 + }, + "rss_peak_mb": 187.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.460708, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.580833, + "p50": 0.611958, + "p95": 0.694542 + }, + "cpu_ms": { + "min": 0.581, + "p50": 0.612, + "p95": 0.695 + }, + "rss_peak_mb": 187.28125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.611958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.122292, + "p50": 1.177833, + "p95": 1.247208 + }, + "cpu_ms": { + "min": 1.122, + "p50": 1.178, + "p95": 1.247 + }, + "rss_peak_mb": 187.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.177833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.004208, + "p50": 1.065084, + "p95": 1.100292 + }, + "cpu_ms": { + "min": 1.004, + "p50": 1.065, + "p95": 1.101 + }, + "rss_peak_mb": 187.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.065084, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.25075, + "p50": 1.313584, + "p95": 1.369542 + }, + "cpu_ms": { + "min": 1.251, + "p50": 1.314, + "p95": 1.37 + }, + "rss_peak_mb": 187.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.313584, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.609291, + "p50": 0.624834, + "p95": 0.704291 + }, + "cpu_ms": { + "min": 0.609, + "p50": 0.625, + "p95": 0.705 + }, + "rss_peak_mb": 187.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.624834, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.138917, + "p50": 1.2275, + "p95": 1.320291 + }, + "cpu_ms": { + "min": 1.14, + "p50": 1.221, + "p95": 1.321 + }, + "rss_peak_mb": 187.390625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.2275, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.190083, + "p50": 1.24075, + "p95": 1.299541 + }, + "cpu_ms": { + "min": 1.19, + "p50": 1.241, + "p95": 1.3 + }, + "rss_peak_mb": 187.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.24075, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.394042, + "p50": 1.463542, + "p95": 1.52025 + }, + "cpu_ms": { + "min": 1.394, + "p50": 1.461, + "p95": 1.52 + }, + "rss_peak_mb": 187.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.463542, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.672583, + "p50": 0.745083, + "p95": 0.827583 + }, + "cpu_ms": { + "min": 0.673, + "p50": 0.745, + "p95": 0.827 + }, + "rss_peak_mb": 187.828125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.745083, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.154875, + "p50": 1.310208, + "p95": 1.563167 + }, + "cpu_ms": { + "min": 1.155, + "p50": 1.309, + "p95": 1.564 + }, + "rss_peak_mb": 188.03125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.310208, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.73475, + "p50": 1.785708, + "p95": 1.818084 + }, + "cpu_ms": { + "min": 1.735, + "p50": 1.786, + "p95": 1.819 + }, + "rss_peak_mb": 188.46875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.785708, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 2.204333, + "p50": 2.238334, + "p95": 2.514333 + }, + "cpu_ms": { + "min": 2.204, + "p50": 2.238, + "p95": 2.513 + }, + "rss_peak_mb": 188.5625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.238334, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.005792, + "p50": 1.052625, + "p95": 1.078541 + }, + "cpu_ms": { + "min": 1.006, + "p50": 1.054, + "p95": 1.079 + }, + "rss_peak_mb": 188.828125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.052625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.487083, + "p50": 1.539083, + "p95": 1.644875 + }, + "cpu_ms": { + "min": 1.488, + "p50": 1.53, + "p95": 1.644 + }, + "rss_peak_mb": 189.1875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.539083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.8865, + "p50": 0.953917, + "p95": 0.98775 + }, + "cpu_ms": { + "min": 0.886, + "p50": 0.955, + "p95": 0.988 + }, + "rss_peak_mb": 189.1875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.953917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.188792, + "p50": 1.2395, + "p95": 1.360042 + }, + "cpu_ms": { + "min": 1.189, + "p50": 1.239, + "p95": 1.32 + }, + "rss_peak_mb": 189.1875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.2395, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.548291, + "p50": 0.568167, + "p95": 0.620708 + }, + "cpu_ms": { + "min": 0.547, + "p50": 0.569, + "p95": 0.622 + }, + "rss_peak_mb": 189.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.568167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.089417, + "p50": 1.165125, + "p95": 1.279333 + }, + "cpu_ms": { + "min": 1.09, + "p50": 1.166, + "p95": 1.246 + }, + "rss_peak_mb": 189.234375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.165125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.287666, + "p50": 1.330625, + "p95": 1.357958 + }, + "cpu_ms": { + "min": 1.287, + "p50": 1.331, + "p95": 1.358 + }, + "rss_peak_mb": 189.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.330625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.691, + "p50": 1.74125, + "p95": 1.949042 + }, + "cpu_ms": { + "min": 1.691, + "p50": 1.725, + "p95": 1.793 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.74125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.510334, + "p50": 0.532125, + "p95": 0.576542 + }, + "cpu_ms": { + "min": 0.51, + "p50": 0.532, + "p95": 0.577 + }, + "rss_peak_mb": 189.40625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.532125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.263958, + "p50": 1.332291, + "p95": 1.413375 + }, + "cpu_ms": { + "min": 1.261, + "p50": 1.333, + "p95": 1.413 + }, + "rss_peak_mb": 189.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.332291, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.180166, + "p50": 1.259916, + "p95": 1.299875 + }, + "cpu_ms": { + "min": 1.18, + "p50": 1.26, + "p95": 1.301 + }, + "rss_peak_mb": 189.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.259916, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.347875, + "p50": 1.413291, + "p95": 1.530667 + }, + "cpu_ms": { + "min": 1.348, + "p50": 1.404, + "p95": 1.53 + }, + "rss_peak_mb": 189.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.413291, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.792625, + "p50": 0.82925, + "p95": 0.89275 + }, + "cpu_ms": { + "min": 0.792, + "p50": 0.83, + "p95": 0.892 + }, + "rss_peak_mb": 189.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.82925, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.129542, + "p50": 1.205333, + "p95": 1.293292 + }, + "cpu_ms": { + "min": 1.129, + "p50": 1.206, + "p95": 1.293 + }, + "rss_peak_mb": 189.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.205333, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.402625, + "p50": 1.445084, + "p95": 1.467875 + }, + "cpu_ms": { + "min": 1.403, + "p50": 1.445, + "p95": 1.469 + }, + "rss_peak_mb": 189.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.445084, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.649375, + "p50": 1.793, + "p95": 1.991 + }, + "cpu_ms": { + "min": 1.649, + "p50": 1.773, + "p95": 1.991 + }, + "rss_peak_mb": 189.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.793, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.004292, + "p50": 1.039, + "p95": 1.102083 + }, + "cpu_ms": { + "min": 1.005, + "p50": 1.039, + "p95": 1.102 + }, + "rss_peak_mb": 190.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.039, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.244917, + "p50": 1.302084, + "p95": 1.449708 + }, + "cpu_ms": { + "min": 1.245, + "p50": 1.302, + "p95": 1.45 + }, + "rss_peak_mb": 190.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.302084, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.233125, + "p50": 1.26775, + "p95": 1.3075 + }, + "cpu_ms": { + "min": 1.233, + "p50": 1.267, + "p95": 1.308 + }, + "rss_peak_mb": 190.6875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.26775, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.230208, + "p50": 1.327125, + "p95": 1.436375 + }, + "cpu_ms": { + "min": 1.23, + "p50": 1.325, + "p95": 1.436 + }, + "rss_peak_mb": 190.6875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.327125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.578291, + "p50": 0.603917, + "p95": 0.656833 + }, + "cpu_ms": { + "min": 0.577, + "p50": 0.604, + "p95": 0.656 + }, + "rss_peak_mb": 190.796875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.603917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.08725, + "p50": 1.221083, + "p95": 1.262375 + }, + "cpu_ms": { + "min": 1.088, + "p50": 1.215, + "p95": 1.261 + }, + "rss_peak_mb": 190.828125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.221083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.156875, + "p50": 1.216583, + "p95": 1.337041 + }, + "cpu_ms": { + "min": 1.157, + "p50": 1.216, + "p95": 1.338 + }, + "rss_peak_mb": 190.984375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.216583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.226666, + "p50": 1.322, + "p95": 1.464583 + }, + "cpu_ms": { + "min": 1.226, + "p50": 1.313, + "p95": 1.438 + }, + "rss_peak_mb": 190.984375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.322, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.14925, + "p50": 1.199417, + "p95": 1.267167 + }, + "cpu_ms": { + "min": 1.149, + "p50": 1.2, + "p95": 1.267 + }, + "rss_peak_mb": 191.390625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.199417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.165625, + "p50": 1.23075, + "p95": 1.302125 + }, + "cpu_ms": { + "min": 1.167, + "p50": 1.231, + "p95": 1.302 + }, + "rss_peak_mb": 191.40625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.23075, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.156083, + "p50": 1.253708, + "p95": 1.362875 + }, + "cpu_ms": { + "min": 1.155, + "p50": 1.253, + "p95": 1.363 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.253708, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.544792, + "p50": 1.613, + "p95": 1.876375 + }, + "cpu_ms": { + "min": 1.545, + "p50": 1.612, + "p95": 1.876 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.613, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.890125, + "p50": 0.910958, + "p95": 0.959166 + }, + "cpu_ms": { + "min": 0.89, + "p50": 0.911, + "p95": 0.959 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.910958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.48525, + "p50": 1.571916, + "p95": 1.761541 + }, + "cpu_ms": { + "min": 1.477, + "p50": 1.537, + "p95": 1.722 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.571916, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.794208, + "p50": 0.849916, + "p95": 0.876708 + }, + "cpu_ms": { + "min": 0.795, + "p50": 0.85, + "p95": 0.877 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.849916, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.1235, + "p50": 1.183291, + "p95": 1.346708 + }, + "cpu_ms": { + "min": 1.124, + "p50": 1.172, + "p95": 1.282 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.183291, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.451, + "p50": 0.464125, + "p95": 0.509541 + }, + "cpu_ms": { + "min": 0.451, + "p50": 0.465, + "p95": 0.509 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.464125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.06025, + "p50": 1.13475, + "p95": 1.224292 + }, + "cpu_ms": { + "min": 1.061, + "p50": 1.13, + "p95": 1.21 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.13475, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.057375, + "p50": 1.109167, + "p95": 1.142542 + }, + "cpu_ms": { + "min": 1.057, + "p50": 1.11, + "p95": 1.144 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.109167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.284916, + "p50": 1.416792, + "p95": 1.536209 + }, + "cpu_ms": { + "min": 1.284, + "p50": 1.413, + "p95": 1.508 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.416792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.122125, + "p50": 1.169958, + "p95": 1.242708 + }, + "cpu_ms": { + "min": 1.121, + "p50": 1.169, + "p95": 1.242 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.169958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.24175, + "p50": 1.39475, + "p95": 1.705416 + }, + "cpu_ms": { + "min": 1.242, + "p50": 1.395, + "p95": 1.565 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.39475, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.32275, + "p50": 1.377417, + "p95": 1.666583 + }, + "cpu_ms": { + "min": 1.322, + "p50": 1.377, + "p95": 1.667 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.377417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.929291, + "p50": 1.988917, + "p95": 2.172458 + }, + "cpu_ms": { + "min": 1.929, + "p50": 1.978, + "p95": 2.166 + }, + "rss_peak_mb": 192.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.988917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.677583, + "p50": 0.704583, + "p95": 0.760292 + }, + "cpu_ms": { + "min": 0.678, + "p50": 0.705, + "p95": 0.761 + }, + "rss_peak_mb": 192.796875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.704583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.35225, + "p50": 1.39375, + "p95": 1.445042 + }, + "cpu_ms": { + "min": 1.353, + "p50": 1.394, + "p95": 1.446 + }, + "rss_peak_mb": 192.984375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.39375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.07825, + "p50": 1.131125, + "p95": 1.156625 + }, + "cpu_ms": { + "min": 1.079, + "p50": 1.131, + "p95": 1.156 + }, + "rss_peak_mb": 193.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.131125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.399125, + "p50": 1.457417, + "p95": 1.559125 + }, + "cpu_ms": { + "min": 1.398, + "p50": 1.458, + "p95": 1.559 + }, + "rss_peak_mb": 193.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.457417, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.461, + "p50": 0.485833, + "p95": 0.548917 + }, + "cpu_ms": { + "min": 0.461, + "p50": 0.486, + "p95": 0.549 + }, + "rss_peak_mb": 193.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.485833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.154709, + "p50": 1.183833, + "p95": 1.272584 + }, + "cpu_ms": { + "min": 1.155, + "p50": 1.183, + "p95": 1.27 + }, + "rss_peak_mb": 193.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.183833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.448167, + "p50": 1.484834, + "p95": 1.608333 + }, + "cpu_ms": { + "min": 1.449, + "p50": 1.485, + "p95": 1.608 + }, + "rss_peak_mb": 193.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.484834, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.113833, + "p50": 1.177584, + "p95": 1.213541 + }, + "cpu_ms": { + "min": 1.114, + "p50": 1.178, + "p95": 1.213 + }, + "rss_peak_mb": 193.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.177584, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.511458, + "p50": 0.534459, + "p95": 0.581792 + }, + "cpu_ms": { + "min": 0.511, + "p50": 0.534, + "p95": 0.581 + }, + "rss_peak_mb": 193.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.534459, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.097666, + "p50": 1.175584, + "p95": 1.235042 + }, + "cpu_ms": { + "min": 1.098, + "p50": 1.176, + "p95": 1.229 + }, + "rss_peak_mb": 193.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.175584, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + } + ] +} \ No newline at end of file diff --git a/results-2026-10-03/perf/diagnostics/wolfxl-2.0.8-control.results.json b/results-2026-10-03/perf/diagnostics/wolfxl-2.0.8-control.results.json new file mode 100644 index 0000000..8813cd0 --- /dev/null +++ b/results-2026-10-03/perf/diagnostics/wolfxl-2.0.8-control.results.json @@ -0,0 +1,2097 @@ +{ + "metadata": { + "benchmark_version": "0.1.0", + "run_date": "2026-10-03T00:00:54.941631+00:00", + "excel_version": "16.105.3", + "platform": "Darwin-arm64", + "profile": "xlsx", + "python": "3.12.3", + "commit": null, + "config": { + "warmup": 3, + "iters": 25, + "iteration_policy": "fixed", + "breakdown": false + }, + "run_environment": { + "cpu_model": "arm", + "core_count": 14, + "memory_total_mb": 24576.0 + } + }, + "libraries": { + "openpyxl": { + "name": "openpyxl", + "version": "3.1.5", + "language": "python", + "capabilities": [ + "read", + "write" + ] + }, + "wolfxl": { + "name": "wolfxl", + "version": "2.0.8", + "language": "python", + "capabilities": [ + "modify", + "read", + "write" + ] + } + }, + "results": [ + { + "feature": "cell_values", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.304209, + "p50": 1.350625, + "p95": 1.635959 + }, + "cpu_ms": { + "min": 1.305, + "p50": 1.351, + "p95": 1.636 + }, + "rss_peak_mb": 154.875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.350625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.285166, + "p50": 1.352958, + "p95": 1.404625 + }, + "cpu_ms": { + "min": 1.286, + "p50": 1.352, + "p95": 1.405 + }, + "rss_peak_mb": 155.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.352958, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.674083, + "p50": 0.712166, + "p95": 0.770958 + }, + "cpu_ms": { + "min": 0.674, + "p50": 0.712, + "p95": 0.77 + }, + "rss_peak_mb": 156.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.712166, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.591084, + "p50": 0.611041, + "p95": 0.677917 + }, + "cpu_ms": { + "min": 0.591, + "p50": 0.611, + "p95": 0.678 + }, + "rss_peak_mb": 157.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.611041, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.122542, + "p50": 1.179625, + "p95": 1.2055 + }, + "cpu_ms": { + "min": 1.123, + "p50": 1.18, + "p95": 1.205 + }, + "rss_peak_mb": 157.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.179625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.429041, + "p50": 1.53075, + "p95": 1.579584 + }, + "cpu_ms": { + "min": 1.429, + "p50": 1.523, + "p95": 1.579 + }, + "rss_peak_mb": 157.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.53075, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.574583, + "p50": 0.649375, + "p95": 0.699542 + }, + "cpu_ms": { + "min": 0.574, + "p50": 0.65, + "p95": 0.699 + }, + "rss_peak_mb": 157.5625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.649375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.554292, + "p50": 0.63575, + "p95": 0.710292 + }, + "cpu_ms": { + "min": 0.555, + "p50": 0.636, + "p95": 0.71 + }, + "rss_peak_mb": 157.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.63575, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.7225, + "p50": 1.7625, + "p95": 1.925583 + }, + "cpu_ms": { + "min": 1.723, + "p50": 1.762, + "p95": 1.926 + }, + "rss_peak_mb": 158.078125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.7625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.68925, + "p50": 1.761542, + "p95": 1.80375 + }, + "cpu_ms": { + "min": 1.69, + "p50": 1.763, + "p95": 1.805 + }, + "rss_peak_mb": 158.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.761542, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.863584, + "p50": 0.889083, + "p95": 0.960125 + }, + "cpu_ms": { + "min": 0.864, + "p50": 0.889, + "p95": 0.96 + }, + "rss_peak_mb": 158.203125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.889083, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.658417, + "p50": 0.71175, + "p95": 0.764791 + }, + "cpu_ms": { + "min": 0.658, + "p50": 0.712, + "p95": 0.765 + }, + "rss_peak_mb": 158.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.71175, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.98375, + "p50": 1.029541, + "p95": 1.282208 + }, + "cpu_ms": { + "min": 0.983, + "p50": 1.03, + "p95": 1.282 + }, + "rss_peak_mb": 158.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.029541, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.292, + "p50": 1.354791, + "p95": 1.400708 + }, + "cpu_ms": { + "min": 1.292, + "p50": 1.355, + "p95": 1.401 + }, + "rss_peak_mb": 158.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.354791, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.576542, + "p50": 0.606958, + "p95": 0.649916 + }, + "cpu_ms": { + "min": 0.576, + "p50": 0.607, + "p95": 0.65 + }, + "rss_peak_mb": 158.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.606958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.524375, + "p50": 0.562917, + "p95": 0.611167 + }, + "cpu_ms": { + "min": 0.524, + "p50": 0.563, + "p95": 0.601 + }, + "rss_peak_mb": 158.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.562917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.003125, + "p50": 1.058458, + "p95": 1.082459 + }, + "cpu_ms": { + "min": 1.003, + "p50": 1.059, + "p95": 1.083 + }, + "rss_peak_mb": 158.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.058458, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.214417, + "p50": 1.289959, + "p95": 1.373458 + }, + "cpu_ms": { + "min": 1.214, + "p50": 1.289, + "p95": 1.354 + }, + "rss_peak_mb": 158.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.289959, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.599792, + "p50": 0.621625, + "p95": 0.673209 + }, + "cpu_ms": { + "min": 0.6, + "p50": 0.622, + "p95": 0.673 + }, + "rss_peak_mb": 158.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.621625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.534791, + "p50": 0.601917, + "p95": 0.633667 + }, + "cpu_ms": { + "min": 0.535, + "p50": 0.602, + "p95": 0.634 + }, + "rss_peak_mb": 158.6875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.601917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.164625, + "p50": 1.224584, + "p95": 1.30825 + }, + "cpu_ms": { + "min": 1.164, + "p50": 1.224, + "p95": 1.308 + }, + "rss_peak_mb": 158.8125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.224584, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.382209, + "p50": 1.42025, + "p95": 1.468375 + }, + "cpu_ms": { + "min": 1.383, + "p50": 1.42, + "p95": 1.469 + }, + "rss_peak_mb": 158.875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.42025, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.660417, + "p50": 0.698541, + "p95": 0.765333 + }, + "cpu_ms": { + "min": 0.66, + "p50": 0.699, + "p95": 0.765 + }, + "rss_peak_mb": 158.890625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.698541, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.564666, + "p50": 0.610833, + "p95": 0.680125 + }, + "cpu_ms": { + "min": 0.565, + "p50": 0.61, + "p95": 0.68 + }, + "rss_peak_mb": 158.953125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.610833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.72475, + "p50": 1.775584, + "p95": 1.862584 + }, + "cpu_ms": { + "min": 1.725, + "p50": 1.776, + "p95": 1.855 + }, + "rss_peak_mb": 159.5625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.775584, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 2.1855, + "p50": 2.233875, + "p95": 2.430459 + }, + "cpu_ms": { + "min": 2.187, + "p50": 2.234, + "p95": 2.427 + }, + "rss_peak_mb": 159.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.233875, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.008291, + "p50": 1.046167, + "p95": 1.100333 + }, + "cpu_ms": { + "min": 1.009, + "p50": 1.046, + "p95": 1.1 + }, + "rss_peak_mb": 159.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.046167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.80525, + "p50": 0.864459, + "p95": 0.914375 + }, + "cpu_ms": { + "min": 0.805, + "p50": 0.859, + "p95": 0.912 + }, + "rss_peak_mb": 159.921875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.864459, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.927167, + "p50": 0.984542, + "p95": 1.009417 + }, + "cpu_ms": { + "min": 0.927, + "p50": 0.984, + "p95": 1.01 + }, + "rss_peak_mb": 159.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.984542, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.159083, + "p50": 1.226834, + "p95": 1.394083 + }, + "cpu_ms": { + "min": 1.159, + "p50": 1.227, + "p95": 1.395 + }, + "rss_peak_mb": 159.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.226834, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.521, + "p50": 0.546292, + "p95": 0.580667 + }, + "cpu_ms": { + "min": 0.52, + "p50": 0.546, + "p95": 0.581 + }, + "rss_peak_mb": 159.953125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.546292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.482958, + "p50": 0.537042, + "p95": 0.640125 + }, + "cpu_ms": { + "min": 0.483, + "p50": 0.537, + "p95": 0.64 + }, + "rss_peak_mb": 160.015625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.537042, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.270916, + "p50": 1.29825, + "p95": 1.331417 + }, + "cpu_ms": { + "min": 1.271, + "p50": 1.298, + "p95": 1.331 + }, + "rss_peak_mb": 160.1875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.29825, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.643625, + "p50": 1.741833, + "p95": 2.093125 + }, + "cpu_ms": { + "min": 1.643, + "p50": 1.731, + "p95": 2.093 + }, + "rss_peak_mb": 160.234375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.741833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.506166, + "p50": 0.531292, + "p95": 0.575667 + }, + "cpu_ms": { + "min": 0.506, + "p50": 0.531, + "p95": 0.576 + }, + "rss_peak_mb": 160.265625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.531292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.553959, + "p50": 0.633417, + "p95": 0.711417 + }, + "cpu_ms": { + "min": 0.554, + "p50": 0.634, + "p95": 0.712 + }, + "rss_peak_mb": 160.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.633417, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.194416, + "p50": 1.249917, + "p95": 1.275583 + }, + "cpu_ms": { + "min": 1.195, + "p50": 1.25, + "p95": 1.276 + }, + "rss_peak_mb": 160.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.249917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.332209, + "p50": 1.409125, + "p95": 1.442333 + }, + "cpu_ms": { + "min": 1.333, + "p50": 1.409, + "p95": 1.432 + }, + "rss_peak_mb": 160.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.409125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.800834, + "p50": 0.827916, + "p95": 0.883834 + }, + "cpu_ms": { + "min": 0.801, + "p50": 0.828, + "p95": 0.884 + }, + "rss_peak_mb": 160.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.827916, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.521833, + "p50": 0.558625, + "p95": 0.631 + }, + "cpu_ms": { + "min": 0.522, + "p50": 0.559, + "p95": 0.628 + }, + "rss_peak_mb": 160.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.558625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.377167, + "p50": 1.404166, + "p95": 1.417542 + }, + "cpu_ms": { + "min": 1.378, + "p50": 1.404, + "p95": 1.418 + }, + "rss_peak_mb": 160.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.404166, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.668875, + "p50": 1.725, + "p95": 1.822667 + }, + "cpu_ms": { + "min": 1.669, + "p50": 1.725, + "p95": 1.817 + }, + "rss_peak_mb": 160.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.725, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.008625, + "p50": 1.038167, + "p95": 1.092916 + }, + "cpu_ms": { + "min": 1.01, + "p50": 1.039, + "p95": 1.094 + }, + "rss_peak_mb": 161.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.038167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.598083, + "p50": 0.638208, + "p95": 0.686375 + }, + "cpu_ms": { + "min": 0.598, + "p50": 0.639, + "p95": 0.686 + }, + "rss_peak_mb": 161.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.638208, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.227583, + "p50": 1.281458, + "p95": 1.316959 + }, + "cpu_ms": { + "min": 1.227, + "p50": 1.281, + "p95": 1.317 + }, + "rss_peak_mb": 161.578125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.281458, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.242334, + "p50": 1.297, + "p95": 1.500667 + }, + "cpu_ms": { + "min": 1.242, + "p50": 1.298, + "p95": 1.501 + }, + "rss_peak_mb": 161.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.297, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.588708, + "p50": 0.61, + "p95": 0.651125 + }, + "cpu_ms": { + "min": 0.588, + "p50": 0.61, + "p95": 0.651 + }, + "rss_peak_mb": 161.640625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.61, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.535833, + "p50": 0.603791, + "p95": 0.639292 + }, + "cpu_ms": { + "min": 0.536, + "p50": 0.604, + "p95": 0.639 + }, + "rss_peak_mb": 161.65625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.603791, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.192458, + "p50": 1.217333, + "p95": 1.254792 + }, + "cpu_ms": { + "min": 1.193, + "p50": 1.216, + "p95": 1.255 + }, + "rss_peak_mb": 161.90625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.217333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.249125, + "p50": 1.307792, + "p95": 1.372792 + }, + "cpu_ms": { + "min": 1.249, + "p50": 1.307, + "p95": 1.373 + }, + "rss_peak_mb": 161.921875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.307792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.135292, + "p50": 1.175625, + "p95": 1.238541 + }, + "cpu_ms": { + "min": 1.135, + "p50": 1.176, + "p95": 1.239 + }, + "rss_peak_mb": 161.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.175625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.544667, + "p50": 0.615083, + "p95": 0.707083 + }, + "cpu_ms": { + "min": 0.545, + "p50": 0.615, + "p95": 0.707 + }, + "rss_peak_mb": 162.0, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.615083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.095625, + "p50": 1.1705, + "p95": 1.22625 + }, + "cpu_ms": { + "min": 1.096, + "p50": 1.17, + "p95": 1.227 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.1705, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.588542, + "p50": 1.651667, + "p95": 1.741333 + }, + "cpu_ms": { + "min": 1.588, + "p50": 1.652, + "p95": 1.735 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.651667, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.849791, + "p50": 0.899209, + "p95": 0.956792 + }, + "cpu_ms": { + "min": 0.849, + "p50": 0.9, + "p95": 0.957 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.899209, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.70875, + "p50": 0.767917, + "p95": 0.893583 + }, + "cpu_ms": { + "min": 0.709, + "p50": 0.765, + "p95": 0.817 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.767917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.792584, + "p50": 0.861625, + "p95": 0.916958 + }, + "cpu_ms": { + "min": 0.792, + "p50": 0.862, + "p95": 0.917 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.861625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.171875, + "p50": 1.328708, + "p95": 1.472875 + }, + "cpu_ms": { + "min": 1.172, + "p50": 1.314, + "p95": 1.408 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.328708, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.488291, + "p50": 0.523708, + "p95": 0.587375 + }, + "cpu_ms": { + "min": 0.488, + "p50": 0.523, + "p95": 0.588 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.523708, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.548916, + "p50": 0.608084, + "p95": 0.6865 + }, + "cpu_ms": { + "min": 0.549, + "p50": 0.606, + "p95": 0.654 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.608084, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.051708, + "p50": 1.205167, + "p95": 1.240708 + }, + "cpu_ms": { + "min": 1.052, + "p50": 1.206, + "p95": 1.241 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.205167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.475333, + "p50": 1.545917, + "p95": 1.66925 + }, + "cpu_ms": { + "min": 1.476, + "p50": 1.546, + "p95": 1.658 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.545917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.137667, + "p50": 1.233125, + "p95": 1.31675 + }, + "cpu_ms": { + "min": 1.138, + "p50": 1.233, + "p95": 1.317 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.233125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.618334, + "p50": 0.684333, + "p95": 0.7895 + }, + "cpu_ms": { + "min": 0.618, + "p50": 0.685, + "p95": 0.761 + }, + "rss_peak_mb": 163.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.684333, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.38425, + "p50": 1.458833, + "p95": 1.837583 + }, + "cpu_ms": { + "min": 1.384, + "p50": 1.458, + "p95": 1.838 + }, + "rss_peak_mb": 163.46875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.458833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 2.110583, + "p50": 2.338792, + "p95": 3.110834 + }, + "cpu_ms": { + "min": 2.111, + "p50": 2.331, + "p95": 3.092 + }, + "rss_peak_mb": 163.5625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.338792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.699959, + "p50": 0.747625, + "p95": 0.824458 + }, + "cpu_ms": { + "min": 0.7, + "p50": 0.747, + "p95": 0.825 + }, + "rss_peak_mb": 163.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.747625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.654833, + "p50": 0.75875, + "p95": 0.853334 + }, + "cpu_ms": { + "min": 0.655, + "p50": 0.754, + "p95": 0.854 + }, + "rss_peak_mb": 163.765625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.75875, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.118042, + "p50": 1.207791, + "p95": 1.259833 + }, + "cpu_ms": { + "min": 1.118, + "p50": 1.208, + "p95": 1.259 + }, + "rss_peak_mb": 163.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.207791, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.469, + "p50": 1.577334, + "p95": 1.645458 + }, + "cpu_ms": { + "min": 1.468, + "p50": 1.576, + "p95": 1.646 + }, + "rss_peak_mb": 163.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.577334, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.457833, + "p50": 0.51675, + "p95": 0.594167 + }, + "cpu_ms": { + "min": 0.457, + "p50": 0.517, + "p95": 0.594 + }, + "rss_peak_mb": 163.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.51675, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.542875, + "p50": 0.617209, + "p95": 0.661208 + }, + "cpu_ms": { + "min": 0.543, + "p50": 0.617, + "p95": 0.661 + }, + "rss_peak_mb": 163.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.617209, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.491125, + "p50": 1.517417, + "p95": 1.620208 + }, + "cpu_ms": { + "min": 1.492, + "p50": 1.517, + "p95": 1.62 + }, + "rss_peak_mb": 164.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.517417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.20375, + "p50": 1.286625, + "p95": 1.338584 + }, + "cpu_ms": { + "min": 1.188, + "p50": 1.282, + "p95": 1.336 + }, + "rss_peak_mb": 164.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.286625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.501208, + "p50": 0.568458, + "p95": 0.604542 + }, + "cpu_ms": { + "min": 0.501, + "p50": 0.569, + "p95": 0.605 + }, + "rss_peak_mb": 164.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.568458, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.51075, + "p50": 0.605708, + "p95": 0.659333 + }, + "cpu_ms": { + "min": 0.512, + "p50": 0.606, + "p95": 0.66 + }, + "rss_peak_mb": 164.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.605708, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + } + ] +} \ No newline at end of file diff --git a/results-2026-10-03/perf/history.jsonl b/results-2026-10-03/perf/history.jsonl new file mode 100644 index 0000000..895147c --- /dev/null +++ b/results-2026-10-03/perf/history.jsonl @@ -0,0 +1 @@ +{"run_date": "2026-10-03T00:00:03.786680+00:00", "commit": null, "profile": "xlsx", "config": {"warmup": 3, "iters": 25, "iteration_policy": "fixed", "breakdown": false}, "p50_wall_ms": {"openpyxl": {"cell_values": {"read_p50": 1.295583, "write_p50": 1.292083}, "formulas": {"read_p50": 1.14075, "write_p50": 1.4065}, "text_formatting": {"read_p50": 1.718833, "write_p50": 1.696709}, "background_colors": {"read_p50": 1.008583, "write_p50": 1.297208}, "number_formats": {"read_p50": 1.03475, "write_p50": 1.271458}, "alignment": {"read_p50": 1.210209, "write_p50": 1.364209}, "borders": {"read_p50": 1.851166, "write_p50": 2.148}, "dimensions": {"read_p50": 0.954209, "write_p50": 1.158417}, "multiple_sheets": {"read_p50": 1.279792, "write_p50": 1.752166}, "merged_cells": {"read_p50": 1.238166, "write_p50": 1.329041}, "conditional_formatting": {"read_p50": 1.37925, "write_p50": 1.669708}, "data_validation": {"read_p50": 1.206292, "write_p50": 1.222709}, "hyperlinks": {"read_p50": 1.19, "write_p50": 1.259292}, "images": {"read_p50": 1.629833, "write_p50": 1.619833}, "pivot_tables": {"read_p50": 0.814833, "write_p50": 1.127166}, "comments": {"read_p50": 1.134875, "write_p50": 1.52925}, "freeze_panes": {"read_p50": 1.374334, "write_p50": 1.905666}, "named_ranges": {"read_p50": 1.110459, "write_p50": 1.408083}, "tables": {"read_p50": 1.442292, "write_p50": 1.128875}}, "xlsxwriter": {"cell_values": {"read_p50": null, "write_p50": 1.698167}, "formulas": {"read_p50": null, "write_p50": 1.605708}, "text_formatting": {"read_p50": null, "write_p50": 1.987125}, "background_colors": {"read_p50": null, "write_p50": 1.758833}, "number_formats": {"read_p50": null, "write_p50": 1.582542}, "alignment": {"read_p50": null, "write_p50": 1.797166}, "borders": {"read_p50": null, "write_p50": 2.19225}, "dimensions": {"read_p50": null, "write_p50": 1.412916}, "multiple_sheets": {"read_p50": null, "write_p50": 1.973709}, "merged_cells": {"read_p50": null, "write_p50": 1.645167}, "conditional_formatting": {"read_p50": null, "write_p50": 1.677083}, "data_validation": {"read_p50": null, "write_p50": 1.510291}, "hyperlinks": {"read_p50": null, "write_p50": 1.746625}, "images": {"read_p50": null, "write_p50": 2.485958}, "pivot_tables": {"read_p50": null, "write_p50": 1.581292}, "comments": {"read_p50": null, "write_p50": 2.08}, "freeze_panes": {"read_p50": null, "write_p50": 1.879125}, "named_ranges": {"read_p50": null, "write_p50": 1.570792}, "tables": {"read_p50": null, "write_p50": 1.4475}}, "python-calamine": {"cell_values": {"read_p50": 0.651916, "write_p50": null}, "formulas": {"read_p50": 0.137958, "write_p50": null}, "text_formatting": {"read_p50": 0.078333, "write_p50": null}, "background_colors": {"read_p50": 0.054625, "write_p50": null}, "number_formats": {"read_p50": 0.0565, "write_p50": null}, "alignment": {"read_p50": 0.049, "write_p50": null}, "borders": {"read_p50": 0.064792, "write_p50": null}, "dimensions": {"read_p50": 0.0565, "write_p50": null}, "multiple_sheets": {"read_p50": 0.057084, "write_p50": null}, "merged_cells": {"read_p50": 0.0565, "write_p50": null}, "conditional_formatting": {"read_p50": 0.052209, "write_p50": null}, "data_validation": {"read_p50": 0.05025, "write_p50": null}, "hyperlinks": {"read_p50": 0.048334, "write_p50": null}, "images": {"read_p50": 0.049041, "write_p50": null}, "pivot_tables": {"read_p50": 0.05025, "write_p50": null}, "comments": {"read_p50": 0.063667, "write_p50": null}, "freeze_panes": {"read_p50": 0.051417, "write_p50": null}, "named_ranges": {"read_p50": 0.046583, "write_p50": null}, "tables": {"read_p50": 0.050167, "write_p50": null}}, "wolfxl": {"cell_values": {"read_p50": 0.685292, "write_p50": 0.592375}, "formulas": {"read_p50": 0.634125, "write_p50": 0.662209}, "text_formatting": {"read_p50": 0.849959, "write_p50": 0.661}, "background_colors": {"read_p50": 0.590833, "write_p50": 0.5305}, "number_formats": {"read_p50": 0.607959, "write_p50": 0.533875}, "alignment": {"read_p50": 0.674625, "write_p50": 0.553792}, "borders": {"read_p50": 1.029292, "write_p50": 0.818667}, "dimensions": {"read_p50": 0.549667, "write_p50": 0.517333}, "multiple_sheets": {"read_p50": 0.5245, "write_p50": 0.570917}, "merged_cells": {"read_p50": 0.819375, "write_p50": 0.542584}, "conditional_formatting": {"read_p50": 1.021667, "write_p50": 0.613959}, "data_validation": {"read_p50": 0.593541, "write_p50": 0.534875}, "hyperlinks": {"read_p50": 1.146209, "write_p50": 0.544709}, "images": {"read_p50": 0.866375, "write_p50": 0.688833}, "pivot_tables": {"read_p50": 0.470917, "write_p50": 0.504791}, "comments": {"read_p50": 1.14, "write_p50": 0.614}, "freeze_panes": {"read_p50": 0.695291, "write_p50": 0.740375}, "named_ranges": {"read_p50": 0.485458, "write_p50": 0.54175}, "tables": {"read_p50": 0.519, "write_p50": 0.488959}}, "pylightxl": {"cell_values": {"read_p50": 1.316834, "write_p50": null}, "formulas": {"read_p50": 1.128709, "write_p50": 0.255042}, "text_formatting": {"read_p50": 1.491541, "write_p50": null}, "background_colors": {"read_p50": 0.935208, "write_p50": null}, "number_formats": {"read_p50": 0.940583, "write_p50": null}, "alignment": {"read_p50": null, "write_p50": null}, "borders": {"read_p50": null, "write_p50": null}, "dimensions": {"read_p50": 0.902833, "write_p50": null}, "multiple_sheets": {"read_p50": 1.307042, "write_p50": 0.307584}, "merged_cells": {"read_p50": 0.954917, "write_p50": null}, "conditional_formatting": {"read_p50": null, "write_p50": null}, "data_validation": {"read_p50": null, "write_p50": null}, "hyperlinks": {"read_p50": null, "write_p50": null}, "images": {"read_p50": null, "write_p50": null}, "pivot_tables": {"read_p50": 0.824041, "write_p50": 0.221166}, "comments": {"read_p50": 1.120875, "write_p50": null}, "freeze_panes": {"read_p50": null, "write_p50": null}, "named_ranges": {"read_p50": null, "write_p50": 0.232458}, "tables": {"read_p50": null, "write_p50": 0.211208}}, "xlrd": {"cell_values": {"read_p50": null, "write_p50": null}, "formulas": {"read_p50": null, "write_p50": null}, "text_formatting": {"read_p50": null, "write_p50": null}, "background_colors": {"read_p50": null, "write_p50": null}, "number_formats": {"read_p50": null, "write_p50": null}, "alignment": {"read_p50": null, "write_p50": null}, "borders": {"read_p50": null, "write_p50": null}, "dimensions": {"read_p50": null, "write_p50": null}, "multiple_sheets": {"read_p50": null, "write_p50": null}, "merged_cells": {"read_p50": null, "write_p50": null}, "conditional_formatting": {"read_p50": null, "write_p50": null}, "data_validation": {"read_p50": null, "write_p50": null}, "hyperlinks": {"read_p50": null, "write_p50": null}, "images": {"read_p50": null, "write_p50": null}, "pivot_tables": {"read_p50": null, "write_p50": null}, "comments": {"read_p50": null, "write_p50": null}, "freeze_panes": {"read_p50": null, "write_p50": null}, "named_ranges": {"read_p50": null, "write_p50": null}, "tables": {"read_p50": null, "write_p50": null}}, "pyexcel": {"cell_values": {"read_p50": 1.489666, "write_p50": null}, "formulas": {"read_p50": 1.259459, "write_p50": 1.452833}, "text_formatting": {"read_p50": 1.779625, "write_p50": null}, "background_colors": {"read_p50": 1.077833, "write_p50": null}, "number_formats": {"read_p50": 1.094625, "write_p50": null}, "alignment": {"read_p50": 1.265542, "write_p50": null}, "borders": {"read_p50": 1.792042, "write_p50": null}, "dimensions": {"read_p50": 1.046333, "write_p50": null}, "multiple_sheets": {"read_p50": 1.403, "write_p50": 1.716084}, "merged_cells": {"read_p50": 1.308917, "write_p50": null}, "conditional_formatting": {"read_p50": 1.460333, "write_p50": null}, "data_validation": {"read_p50": 1.321958, "write_p50": null}, "hyperlinks": {"read_p50": 1.276541, "write_p50": null}, "images": {"read_p50": 1.208083, "write_p50": null}, "pivot_tables": {"read_p50": 0.903625, "write_p50": 1.21075}, "comments": {"read_p50": 1.147542, "write_p50": null}, "freeze_panes": {"read_p50": 1.483708, "write_p50": null}, "named_ranges": {"read_p50": 1.242083, "write_p50": 1.488375}, "tables": {"read_p50": 1.811584, "write_p50": 1.132083}}, "xlwt": {"cell_values": {"read_p50": null, "write_p50": 0.27525}, "formulas": {"read_p50": null, "write_p50": 0.28375}, "text_formatting": {"read_p50": null, "write_p50": 0.359042}, "background_colors": {"read_p50": null, "write_p50": 0.230167}, "number_formats": {"read_p50": null, "write_p50": 0.223542}, "alignment": {"read_p50": null, "write_p50": 0.235333}, "borders": {"read_p50": null, "write_p50": 0.429833}, "dimensions": {"read_p50": null, "write_p50": 0.160583}, "multiple_sheets": {"read_p50": null, "write_p50": 0.195667}, "merged_cells": {"read_p50": null, "write_p50": 0.202041}, "conditional_formatting": {"read_p50": null, "write_p50": null}, "data_validation": {"read_p50": null, "write_p50": null}, "hyperlinks": {"read_p50": null, "write_p50": null}, "images": {"read_p50": null, "write_p50": null}, "pivot_tables": {"read_p50": null, "write_p50": 0.182083}, "comments": {"read_p50": null, "write_p50": null}, "freeze_panes": {"read_p50": null, "write_p50": 0.208041}, "named_ranges": {"read_p50": null, "write_p50": 0.15575}, "tables": {"read_p50": null, "write_p50": 0.138959}}, "pandas": {"cell_values": {"read_p50": 1.774667, "write_p50": 1.574416}, "formulas": {"read_p50": 1.587542, "write_p50": 1.667208}, "text_formatting": {"read_p50": 2.011375, "write_p50": 1.571333}, "background_colors": {"read_p50": 1.26425, "write_p50": 1.440875}, "number_formats": {"read_p50": 1.270625, "write_p50": 1.394167}, "alignment": {"read_p50": 1.4425, "write_p50": 1.438292}, "borders": {"read_p50": 2.045208, "write_p50": 1.592667}, "dimensions": {"read_p50": 1.246792, "write_p50": 1.295792}, "multiple_sheets": {"read_p50": 1.791625, "write_p50": 2.083083}, "merged_cells": {"read_p50": 1.315375, "write_p50": 1.430459}, "conditional_formatting": {"read_p50": 1.757583, "write_p50": 1.542834}, "data_validation": {"read_p50": 1.643166, "write_p50": 1.268125}, "hyperlinks": {"read_p50": 1.545292, "write_p50": 1.277125}, "images": {"read_p50": 1.157958, "write_p50": 1.261167}, "pivot_tables": {"read_p50": 1.157792, "write_p50": 1.411292}, "comments": {"read_p50": 1.263459, "write_p50": 1.241375}, "freeze_panes": {"read_p50": 1.803084, "write_p50": 2.073416}, "named_ranges": {"read_p50": 1.572125, "write_p50": 1.775708}, "tables": {"read_p50": 1.682792, "write_p50": 1.231125}}, "xlsxwriter-constmem": {"cell_values": {"read_p50": null, "write_p50": 1.734}, "formulas": {"read_p50": null, "write_p50": 1.765083}, "text_formatting": {"read_p50": null, "write_p50": 1.998917}, "background_colors": {"read_p50": null, "write_p50": 1.673292}, "number_formats": {"read_p50": null, "write_p50": 1.702}, "alignment": {"read_p50": null, "write_p50": 1.717958}, "borders": {"read_p50": null, "write_p50": 2.320666}, "dimensions": {"read_p50": null, "write_p50": 1.714167}, "multiple_sheets": {"read_p50": null, "write_p50": 2.068}, "merged_cells": {"read_p50": null, "write_p50": 1.597083}, "conditional_formatting": {"read_p50": null, "write_p50": 2.084541}, "data_validation": {"read_p50": null, "write_p50": 1.600959}, "hyperlinks": {"read_p50": null, "write_p50": 1.815458}, "images": {"read_p50": null, "write_p50": 1.474334}, "pivot_tables": {"read_p50": null, "write_p50": 1.685625}, "comments": {"read_p50": null, "write_p50": 1.495208}, "freeze_panes": {"read_p50": null, "write_p50": 2.1045}, "named_ranges": {"read_p50": null, "write_p50": 1.684583}, "tables": {"read_p50": null, "write_p50": 1.458375}}, "openpyxl-readonly": {"cell_values": {"read_p50": 5.917875, "write_p50": null}, "formulas": {"read_p50": 1.49125, "write_p50": null}, "text_formatting": {"read_p50": 1.45725, "write_p50": null}, "background_colors": {"read_p50": 0.8755, "write_p50": null}, "number_formats": {"read_p50": 0.874792, "write_p50": null}, "alignment": {"read_p50": 0.967667, "write_p50": null}, "borders": {"read_p50": 1.311834, "write_p50": null}, "dimensions": {"read_p50": 0.810333, "write_p50": null}, "multiple_sheets": {"read_p50": 1.008292, "write_p50": null}, "merged_cells": {"read_p50": 0.878917, "write_p50": null}, "conditional_formatting": {"read_p50": 0.960708, "write_p50": null}, "data_validation": {"read_p50": 0.899917, "write_p50": null}, "hyperlinks": {"read_p50": 0.883166, "write_p50": null}, "images": {"read_p50": 0.788333, "write_p50": null}, "pivot_tables": {"read_p50": 0.740041, "write_p50": null}, "comments": {"read_p50": 0.87075, "write_p50": null}, "freeze_panes": {"read_p50": 0.983459, "write_p50": null}, "named_ranges": {"read_p50": 0.870667, "write_p50": null}, "tables": {"read_p50": 0.931875, "write_p50": null}}, "polars": {"cell_values": {"read_p50": 0.445666, "write_p50": null}, "formulas": {"read_p50": 0.385208, "write_p50": null}, "text_formatting": {"read_p50": 0.252375, "write_p50": null}, "background_colors": {"read_p50": 0.22675, "write_p50": null}, "number_formats": {"read_p50": 0.2355, "write_p50": null}, "alignment": {"read_p50": 0.247834, "write_p50": null}, "borders": {"read_p50": 0.264417, "write_p50": null}, "dimensions": {"read_p50": 0.334625, "write_p50": null}, "multiple_sheets": {"read_p50": 0.507375, "write_p50": null}, "merged_cells": {"read_p50": 0.229958, "write_p50": null}, "conditional_formatting": {"read_p50": 0.368417, "write_p50": null}, "data_validation": {"read_p50": 0.475334, "write_p50": null}, "hyperlinks": {"read_p50": 0.374083, "write_p50": null}, "images": {"read_p50": 0.222167, "write_p50": null}, "pivot_tables": {"read_p50": 0.226958, "write_p50": null}, "comments": {"read_p50": 0.236292, "write_p50": null}, "freeze_panes": {"read_p50": 0.448584, "write_p50": null}, "named_ranges": {"read_p50": 0.365959, "write_p50": null}, "tables": {"read_p50": 0.365458, "write_p50": null}}, "tablib": {"cell_values": {"read_p50": 1.427125, "write_p50": 1.354042}, "formulas": {"read_p50": 1.191542, "write_p50": 1.434083}, "text_formatting": {"read_p50": 1.780709, "write_p50": 1.33225}, "background_colors": {"read_p50": 1.035, "write_p50": 1.192709}, "number_formats": {"read_p50": 1.048709, "write_p50": 1.178709}, "alignment": {"read_p50": 1.243333, "write_p50": 1.219416}, "borders": {"read_p50": 1.801709, "write_p50": 1.365459}, "dimensions": {"read_p50": 0.984958, "write_p50": 1.157625}, "multiple_sheets": {"read_p50": 1.347791, "write_p50": 1.693209}, "merged_cells": {"read_p50": 1.066875, "write_p50": 1.15975}, "conditional_formatting": {"read_p50": 1.449667, "write_p50": 1.400791}, "data_validation": {"read_p50": 1.294083, "write_p50": 1.1295}, "hyperlinks": {"read_p50": 1.223417, "write_p50": 1.13725}, "images": {"read_p50": 0.936667, "write_p50": 1.142584}, "pivot_tables": {"read_p50": 0.902042, "write_p50": 1.189833}, "comments": {"read_p50": 1.014208, "write_p50": 1.117542}, "freeze_panes": {"read_p50": 1.401709, "write_p50": 1.910625}, "named_ranges": {"read_p50": 1.188875, "write_p50": 1.358625}, "tables": {"read_p50": 1.399042, "write_p50": 1.139792}}}} diff --git a/results-2026-10-03/perf/matrix.csv b/results-2026-10-03/perf/matrix.csv new file mode 100644 index 0000000..1fefc7e --- /dev/null +++ b/results-2026-10-03/perf/matrix.csv @@ -0,0 +1,248 @@ +library,feature,read_p50_wall_ms,read_p95_wall_ms,read_op_count,read_op_unit,read_p50_units_per_sec,write_p50_wall_ms,write_p95_wall_ms,write_op_count,write_op_unit,write_p50_units_per_sec,read_tail_ratio,write_tail_ratio,confidence_note,regression_status +openpyxl,cell_values,1.295583,1.621833,,,,1.292083,1.513917,,,,0.2518,0.1717,high,no_history +xlsxwriter,cell_values,,,,,,1.698167,1.996917,,,,,0.1759,ok,no_history +python-calamine,cell_values,0.651916,0.661667,,,,,,,,,0.015,,ok,no_history +wolfxl,cell_values,0.685292,0.73575,,,,0.592375,0.665333,,,,0.0736,0.1232,ok,no_history +pylightxl,cell_values,1.316834,1.326959,,,,,,,,,0.0077,,ok,no_history +xlrd,cell_values,,,,,,,,,,,,,ok,no_history +pyexcel,cell_values,1.489666,1.517041,,,,,,,,,0.0184,,ok,no_history +xlwt,cell_values,,,,,,0.27525,0.327459,,,,,0.1897,ok,no_history +pandas,cell_values,1.774667,1.932417,,,,1.574416,1.8545,,,,0.0889,0.1779,ok,no_history +xlsxwriter-constmem,cell_values,,,,,,1.734,2.034292,,,,,0.1732,ok,no_history +openpyxl-readonly,cell_values,5.917875,6.168166,,,,,,,,,0.0423,,ok,no_history +polars,cell_values,0.445666,0.715333,,,,,,,,,0.6051,,high,no_history +tablib,cell_values,1.427125,1.688208,,,,1.354042,1.445917,,,,0.1829,0.0679,ok,no_history +openpyxl,formulas,1.14075,1.193458,,,,1.4065,1.5935,,,,0.0462,0.133,ok,no_history +xlsxwriter,formulas,,,,,,1.605708,2.073583,,,,,0.2914,high,no_history +python-calamine,formulas,0.137958,0.144708,,,,,,,,,0.0489,,ok,no_history +wolfxl,formulas,0.634125,0.704375,,,,0.662209,0.732917,,,,0.1108,0.1068,ok,no_history +pylightxl,formulas,1.128709,1.187667,,,,0.255042,0.27875,,,,0.0522,0.093,ok,no_history +xlrd,formulas,,,,,,,,,,,,,ok,no_history +pyexcel,formulas,1.259459,1.31125,,,,1.452833,1.52025,,,,0.0411,0.0464,ok,no_history +xlwt,formulas,,,,,,0.28375,0.295292,,,,,0.0407,ok,no_history +pandas,formulas,1.587542,1.715125,,,,1.667208,1.76175,,,,0.0804,0.0567,ok,no_history +xlsxwriter-constmem,formulas,,,,,,1.765083,2.181833,,,,,0.2361,high,no_history +openpyxl-readonly,formulas,1.49125,1.560125,,,,,,,,,0.0462,,ok,no_history +polars,formulas,0.385208,0.469209,,,,,,,,,0.2181,,high,no_history +tablib,formulas,1.191542,1.251042,,,,1.434083,1.662,,,,0.0499,0.1589,ok,no_history +openpyxl,text_formatting,1.718833,1.795833,,,,1.696709,1.815833,,,,0.0448,0.0702,ok,no_history +xlsxwriter,text_formatting,,,,,,1.987125,2.338333,,,,,0.1767,ok,no_history +python-calamine,text_formatting,0.078333,0.084041,,,,,,,,,0.0729,,ok,no_history +wolfxl,text_formatting,0.849959,0.908917,,,,0.661,0.743875,,,,0.0694,0.1254,ok,no_history +pylightxl,text_formatting,1.491541,1.528167,,,,,,,,,0.0246,,ok,no_history +xlrd,text_formatting,,,,,,,,,,,,,ok,no_history +pyexcel,text_formatting,1.779625,1.823084,,,,,,,,,0.0244,,ok,no_history +xlwt,text_formatting,,,,,,0.359042,0.387041,,,,,0.078,ok,no_history +pandas,text_formatting,2.011375,2.115166,,,,1.571333,1.842125,,,,0.0516,0.1723,ok,no_history +xlsxwriter-constmem,text_formatting,,,,,,1.998917,2.220125,,,,,0.1107,ok,no_history +openpyxl-readonly,text_formatting,1.45725,1.479083,,,,,,,,,0.015,,ok,no_history +polars,text_formatting,0.252375,0.302541,,,,,,,,,0.1988,,ok,no_history +tablib,text_formatting,1.780709,1.858459,,,,1.33225,1.433208,,,,0.0437,0.0758,ok,no_history +openpyxl,background_colors,1.008583,1.023208,,,,1.297208,1.43425,,,,0.0145,0.1056,ok,no_history +xlsxwriter,background_colors,,,,,,1.758833,2.271375,,,,,0.2914,high,no_history +python-calamine,background_colors,0.054625,0.060459,,,,,,,,,0.1068,,ok,no_history +wolfxl,background_colors,0.590833,0.647458,,,,0.5305,0.597166,,,,0.0958,0.1257,ok,no_history +pylightxl,background_colors,0.935208,0.947958,,,,,,,,,0.0136,,ok,no_history +xlrd,background_colors,,,,,,,,,,,,,ok,no_history +pyexcel,background_colors,1.077833,1.106792,,,,,,,,,0.0269,,ok,no_history +xlwt,background_colors,,,,,,0.230167,0.361833,,,,,0.572,high,no_history +pandas,background_colors,1.26425,1.357917,,,,1.440875,1.621125,,,,0.0741,0.1251,ok,no_history +xlsxwriter-constmem,background_colors,,,,,,1.673292,1.965875,,,,,0.1749,ok,no_history +openpyxl-readonly,background_colors,0.8755,0.942834,,,,,,,,,0.0769,,ok,no_history +polars,background_colors,0.22675,0.265541,,,,,,,,,0.1711,,ok,no_history +tablib,background_colors,1.035,1.051542,,,,1.192709,1.230792,,,,0.016,0.0319,ok,no_history +openpyxl,number_formats,1.03475,1.0595,,,,1.271458,1.405125,,,,0.0239,0.1051,ok,no_history +xlsxwriter,number_formats,,,,,,1.582542,1.891417,,,,,0.1952,ok,no_history +python-calamine,number_formats,0.0565,0.061958,,,,,,,,,0.0966,,ok,no_history +wolfxl,number_formats,0.607959,0.666875,,,,0.533875,0.5675,,,,0.0969,0.063,ok,no_history +pylightxl,number_formats,0.940583,1.018417,,,,,,,,,0.0828,,ok,no_history +xlrd,number_formats,,,,,,,,,,,,,ok,no_history +pyexcel,number_formats,1.094625,1.19225,,,,,,,,,0.0892,,ok,no_history +xlwt,number_formats,,,,,,0.223542,0.282084,,,,,0.2619,high,no_history +pandas,number_formats,1.270625,1.297209,,,,1.394167,1.448208,,,,0.0209,0.0388,ok,no_history +xlsxwriter-constmem,number_formats,,,,,,1.702,2.065,,,,,0.2133,high,no_history +openpyxl-readonly,number_formats,0.874792,0.924,,,,,,,,,0.0563,,ok,no_history +polars,number_formats,0.2355,0.303958,,,,,,,,,0.2907,,high,no_history +tablib,number_formats,1.048709,1.109542,,,,1.178709,1.352667,,,,0.058,0.1476,ok,no_history +openpyxl,alignment,1.210209,1.253291,,,,1.364209,1.418666,,,,0.0356,0.0399,ok,no_history +xlsxwriter,alignment,,,,,,1.797166,2.173375,,,,,0.2093,high,no_history +python-calamine,alignment,0.049,0.054542,,,,,,,,,0.1131,,ok,no_history +wolfxl,alignment,0.674625,0.726292,,,,0.553792,0.687375,,,,0.0766,0.2412,high,no_history +pylightxl,alignment,,,,,,,,,,,,,ok,no_history +xlrd,alignment,,,,,,,,,,,,,ok,no_history +pyexcel,alignment,1.265542,1.286041,,,,,,,,,0.0162,,ok,no_history +xlwt,alignment,,,,,,0.235333,0.364125,,,,,0.5473,high,no_history +pandas,alignment,1.4425,1.512375,,,,1.438292,1.591291,,,,0.0484,0.1064,ok,no_history +xlsxwriter-constmem,alignment,,,,,,1.717958,2.156,,,,,0.255,high,no_history +openpyxl-readonly,alignment,0.967667,1.008166,,,,,,,,,0.0419,,ok,no_history +polars,alignment,0.247834,0.307125,,,,,,,,,0.2392,,high,no_history +tablib,alignment,1.243333,1.292291,,,,1.219416,1.357084,,,,0.0394,0.1129,ok,no_history +openpyxl,borders,1.851166,1.996583,,,,2.148,2.443375,,,,0.0786,0.1375,ok,no_history +xlsxwriter,borders,,,,,,2.19225,2.621583,,,,,0.1958,ok,no_history +python-calamine,borders,0.064792,0.067959,,,,,,,,,0.0489,,ok,no_history +wolfxl,borders,1.029292,1.056125,,,,0.818667,0.868708,,,,0.0261,0.0611,ok,no_history +pylightxl,borders,,,,,,,,,,,,,ok,no_history +xlrd,borders,,,,,,,,,,,,,ok,no_history +pyexcel,borders,1.792042,2.268625,,,,,,,,,0.2659,,high,no_history +xlwt,borders,,,,,,0.429833,0.576917,,,,,0.3422,high,no_history +pandas,borders,2.045208,2.31975,,,,1.592667,1.785792,,,,0.1342,0.1213,ok,no_history +xlsxwriter-constmem,borders,,,,,,2.320666,2.620542,,,,,0.1292,ok,no_history +openpyxl-readonly,borders,1.311834,1.405208,,,,,,,,,0.0712,,ok,no_history +polars,borders,0.264417,0.317834,,,,,,,,,0.202,,high,no_history +tablib,borders,1.801709,2.155625,,,,1.365459,1.549208,,,,0.1964,0.1346,ok,no_history +openpyxl,dimensions,0.954209,0.967208,,,,1.158417,1.289333,,,,0.0136,0.113,ok,no_history +xlsxwriter,dimensions,,,,,,1.412916,1.816791,,,,,0.2858,high,no_history +python-calamine,dimensions,0.0565,0.060042,,,,,,,,,0.0627,,ok,no_history +wolfxl,dimensions,0.549667,0.597334,,,,0.517333,0.710333,,,,0.0867,0.3731,high,no_history +pylightxl,dimensions,0.902833,0.911125,,,,,,,,,0.0092,,ok,no_history +xlrd,dimensions,,,,,,,,,,,,,ok,no_history +pyexcel,dimensions,1.046333,1.069417,,,,,,,,,0.0221,,ok,no_history +xlwt,dimensions,,,,,,0.160583,0.35875,,,,,1.234,high,no_history +pandas,dimensions,1.246792,1.318417,,,,1.295792,1.431834,,,,0.0574,0.105,ok,no_history +xlsxwriter-constmem,dimensions,,,,,,1.714167,2.02075,,,,,0.1789,ok,no_history +openpyxl-readonly,dimensions,0.810333,0.941542,,,,,,,,,0.1619,,ok,no_history +polars,dimensions,0.334625,0.460125,,,,,,,,,0.375,,high,no_history +tablib,dimensions,0.984958,1.0065,,,,1.157625,1.278417,,,,0.0219,0.1043,ok,no_history +openpyxl,multiple_sheets,1.279792,1.325958,,,,1.752166,1.948583,,,,0.0361,0.1121,ok,no_history +xlsxwriter,multiple_sheets,,,,,,1.973709,2.705,,,,,0.3705,high,no_history +python-calamine,multiple_sheets,0.057084,0.061917,,,,,,,,,0.0847,,ok,no_history +wolfxl,multiple_sheets,0.5245,0.584667,,,,0.570917,0.622584,,,,0.1147,0.0905,ok,no_history +pylightxl,multiple_sheets,1.307042,1.3195,,,,0.307584,0.413542,,,,0.0095,0.3445,high,no_history +xlrd,multiple_sheets,,,,,,,,,,,,,ok,no_history +pyexcel,multiple_sheets,1.403,1.537958,,,,1.716084,1.955125,,,,0.0962,0.1393,ok,no_history +xlwt,multiple_sheets,,,,,,0.195667,0.20525,,,,,0.049,ok,no_history +pandas,multiple_sheets,1.791625,1.871708,,,,2.083083,2.265958,,,,0.0447,0.0878,ok,no_history +xlsxwriter-constmem,multiple_sheets,,,,,,2.068,2.544333,,,,,0.2303,high,no_history +openpyxl-readonly,multiple_sheets,1.008292,1.03775,,,,,,,,,0.0292,,ok,no_history +polars,multiple_sheets,0.507375,0.6195,,,,,,,,,0.221,,high,no_history +tablib,multiple_sheets,1.347791,1.474833,,,,1.693209,1.888458,,,,0.0943,0.1153,ok,no_history +openpyxl,merged_cells,1.238166,1.266459,,,,1.329041,1.588166,,,,0.0229,0.195,ok,no_history +xlsxwriter,merged_cells,,,,,,1.645167,2.097417,,,,,0.2749,high,no_history +python-calamine,merged_cells,0.0565,0.061708,,,,,,,,,0.0922,,ok,no_history +wolfxl,merged_cells,0.819375,0.872292,,,,0.542584,0.574125,,,,0.0646,0.0581,ok,no_history +pylightxl,merged_cells,0.954917,0.965833,,,,,,,,,0.0114,,ok,no_history +xlrd,merged_cells,,,,,,,,,,,,,ok,no_history +pyexcel,merged_cells,1.308917,1.357417,,,,,,,,,0.0371,,ok,no_history +xlwt,merged_cells,,,,,,0.202041,0.358417,,,,,0.774,high,no_history +pandas,merged_cells,1.315375,1.341375,,,,1.430459,1.610917,,,,0.0198,0.1262,ok,no_history +xlsxwriter-constmem,merged_cells,,,,,,1.597083,2.031208,,,,,0.2718,high,no_history +openpyxl-readonly,merged_cells,0.878917,0.9165,,,,,,,,,0.0428,,ok,no_history +polars,merged_cells,0.229958,0.290542,,,,,,,,,0.2635,,high,no_history +tablib,merged_cells,1.066875,1.085833,,,,1.15975,1.226375,,,,0.0178,0.0574,ok,no_history +openpyxl,conditional_formatting,1.37925,1.41875,,,,1.669708,1.805417,,,,0.0286,0.0813,ok,no_history +xlsxwriter,conditional_formatting,,,,,,1.677083,2.064875,,,,,0.2312,high,no_history +python-calamine,conditional_formatting,0.052209,0.054,,,,,,,,,0.0343,,ok,no_history +wolfxl,conditional_formatting,1.021667,1.083542,,,,0.613959,0.660959,,,,0.0606,0.0766,ok,no_history +pylightxl,conditional_formatting,,,,,,,,,,,,,ok,no_history +xlrd,conditional_formatting,,,,,,,,,,,,,ok,no_history +pyexcel,conditional_formatting,1.460333,1.501708,,,,,,,,,0.0283,,ok,no_history +xlwt,conditional_formatting,,,,,,,,,,,,,ok,no_history +pandas,conditional_formatting,1.757583,1.792791,,,,1.542834,1.710666,,,,0.02,0.1088,ok,no_history +xlsxwriter-constmem,conditional_formatting,,,,,,2.084541,2.483167,,,,,0.1912,ok,no_history +openpyxl-readonly,conditional_formatting,0.960708,0.976084,,,,,,,,,0.016,,ok,no_history +polars,conditional_formatting,0.368417,0.523375,,,,,,,,,0.4206,,high,no_history +tablib,conditional_formatting,1.449667,1.627333,,,,1.400791,1.466416,,,,0.1226,0.0468,ok,no_history +openpyxl,data_validation,1.206292,1.360875,,,,1.222709,1.281625,,,,0.1281,0.0482,ok,no_history +xlsxwriter,data_validation,,,,,,1.510291,1.867417,,,,,0.2365,high,no_history +python-calamine,data_validation,0.05025,0.052458,,,,,,,,,0.0439,,ok,no_history +wolfxl,data_validation,0.593541,0.649792,,,,0.534875,0.588417,,,,0.0948,0.1001,ok,no_history +pylightxl,data_validation,,,,,,,,,,,,,ok,no_history +xlrd,data_validation,,,,,,,,,,,,,ok,no_history +pyexcel,data_validation,1.321958,1.343916,,,,,,,,,0.0166,,ok,no_history +xlwt,data_validation,,,,,,,,,,,,,ok,no_history +pandas,data_validation,1.643166,1.761542,,,,1.268125,1.418542,,,,0.072,0.1186,ok,no_history +xlsxwriter-constmem,data_validation,,,,,,1.600959,1.922458,,,,,0.2008,high,no_history +openpyxl-readonly,data_validation,0.899917,0.94075,,,,,,,,,0.0454,,ok,no_history +polars,data_validation,0.475334,0.627916,,,,,,,,,0.321,,high,no_history +tablib,data_validation,1.294083,1.323792,,,,1.1295,1.22975,,,,0.023,0.0888,ok,no_history +openpyxl,hyperlinks,1.19,1.214291,,,,1.259292,1.40775,,,,0.0204,0.1179,ok,no_history +xlsxwriter,hyperlinks,,,,,,1.746625,1.941666,,,,,0.1117,ok,no_history +python-calamine,hyperlinks,0.048334,0.054042,,,,,,,,,0.1181,,ok,no_history +wolfxl,hyperlinks,1.146209,1.211,,,,0.544709,0.578375,,,,0.0565,0.0618,ok,no_history +pylightxl,hyperlinks,,,,,,,,,,,,,ok,no_history +xlrd,hyperlinks,,,,,,,,,,,,,ok,no_history +pyexcel,hyperlinks,1.276541,1.389958,,,,,,,,,0.0888,,ok,no_history +xlwt,hyperlinks,,,,,,,,,,,,,ok,no_history +pandas,hyperlinks,1.545292,1.558584,,,,1.277125,1.438083,,,,0.0086,0.126,ok,no_history +xlsxwriter-constmem,hyperlinks,,,,,,1.815458,2.13425,,,,,0.1756,ok,no_history +openpyxl-readonly,hyperlinks,0.883166,0.975958,,,,,,,,,0.1051,,ok,no_history +polars,hyperlinks,0.374083,0.475792,,,,,,,,,0.2719,,high,no_history +tablib,hyperlinks,1.223417,1.260166,,,,1.13725,1.245792,,,,0.03,0.0954,ok,no_history +openpyxl,images,1.629833,2.130834,,,,1.619833,1.817292,,,,0.3074,0.1219,high,no_history +xlsxwriter,images,,,,,,2.485958,2.888125,,,,,0.1618,ok,no_history +python-calamine,images,0.049041,0.053666,,,,,,,,,0.0943,,ok,no_history +wolfxl,images,0.866375,0.912583,,,,0.688833,0.728625,,,,0.0533,0.0578,ok,no_history +pylightxl,images,,,,,,,,,,,,,ok,no_history +xlrd,images,,,,,,,,,,,,,ok,no_history +pyexcel,images,1.208083,1.260875,,,,,,,,,0.0437,,ok,no_history +xlwt,images,,,,,,,,,,,,,ok,no_history +pandas,images,1.157958,1.256791,,,,1.261167,1.448375,,,,0.0854,0.1484,ok,no_history +xlsxwriter-constmem,images,,,,,,1.474334,2.008,,,,,0.362,high,no_history +openpyxl-readonly,images,0.788333,0.821167,,,,,,,,,0.0416,,ok,no_history +polars,images,0.222167,0.258209,,,,,,,,,0.1622,,ok,no_history +tablib,images,0.936667,1.018333,,,,1.142584,1.190042,,,,0.0872,0.0415,ok,no_history +openpyxl,pivot_tables,0.814833,0.853917,,,,1.127166,1.2955,,,,0.048,0.1493,ok,no_history +xlsxwriter,pivot_tables,,,,,,1.581292,2.054458,,,,,0.2992,high,no_history +python-calamine,pivot_tables,0.05025,0.051084,,,,,,,,,0.0166,,ok,no_history +wolfxl,pivot_tables,0.470917,0.522708,,,,0.504791,0.551917,,,,0.11,0.0934,ok,no_history +pylightxl,pivot_tables,0.824041,0.841333,,,,0.221166,0.226709,,,,0.021,0.0251,ok,no_history +xlrd,pivot_tables,,,,,,,,,,,,,ok,no_history +pyexcel,pivot_tables,0.903625,0.962958,,,,1.21075,1.264333,,,,0.0657,0.0443,ok,no_history +xlwt,pivot_tables,,,,,,0.182083,0.186792,,,,,0.0259,ok,no_history +pandas,pivot_tables,1.157792,1.389166,,,,1.411292,1.805458,,,,0.1998,0.2793,high,no_history +xlsxwriter-constmem,pivot_tables,,,,,,1.685625,2.193958,,,,,0.3016,high,no_history +openpyxl-readonly,pivot_tables,0.740041,0.811084,,,,,,,,,0.096,,ok,no_history +polars,pivot_tables,0.226958,0.272375,,,,,,,,,0.2001,,high,no_history +tablib,pivot_tables,0.902042,0.931542,,,,1.189833,1.264667,,,,0.0327,0.0629,ok,no_history +openpyxl,comments,1.134875,1.207,,,,1.52925,1.750417,,,,0.0636,0.1446,ok,no_history +xlsxwriter,comments,,,,,,2.08,2.548875,,,,,0.2254,high,no_history +python-calamine,comments,0.063667,0.065708,,,,,,,,,0.0321,,ok,no_history +wolfxl,comments,1.14,1.239417,,,,0.614,0.668833,,,,0.0872,0.0893,ok,no_history +pylightxl,comments,1.120875,1.139167,,,,,,,,,0.0163,,ok,no_history +xlrd,comments,,,,,,,,,,,,,ok,no_history +pyexcel,comments,1.147542,1.183875,,,,,,,,,0.0317,,ok,no_history +xlwt,comments,,,,,,,,,,,,,ok,no_history +pandas,comments,1.263459,1.374875,,,,1.241375,1.4015,,,,0.0882,0.129,ok,no_history +xlsxwriter-constmem,comments,,,,,,1.495208,1.83075,,,,,0.2244,high,no_history +openpyxl-readonly,comments,0.87075,0.902291,,,,,,,,,0.0362,,ok,no_history +polars,comments,0.236292,0.321208,,,,,,,,,0.3594,,high,no_history +tablib,comments,1.014208,1.072,,,,1.117542,1.171666,,,,0.057,0.0484,ok,no_history +openpyxl,freeze_panes,1.374334,1.797584,,,,1.905666,2.106208,,,,0.308,0.1052,high,no_history +xlsxwriter,freeze_panes,,,,,,1.879125,2.276791,,,,,0.2116,high,no_history +python-calamine,freeze_panes,0.051417,0.056917,,,,,,,,,0.107,,ok,no_history +wolfxl,freeze_panes,0.695291,0.751167,,,,0.740375,0.972334,,,,0.0804,0.3133,high,no_history +pylightxl,freeze_panes,,,,,,,,,,,,,ok,no_history +xlrd,freeze_panes,,,,,,,,,,,,,ok,no_history +pyexcel,freeze_panes,1.483708,1.855208,,,,,,,,,0.2504,,high,no_history +xlwt,freeze_panes,,,,,,0.208041,0.224833,,,,,0.0807,ok,no_history +pandas,freeze_panes,1.803084,1.903125,,,,2.073416,2.30275,,,,0.0555,0.1106,ok,no_history +xlsxwriter-constmem,freeze_panes,,,,,,2.1045,2.613042,,,,,0.2416,high,no_history +openpyxl-readonly,freeze_panes,0.983459,0.998875,,,,,,,,,0.0157,,ok,no_history +polars,freeze_panes,0.448584,0.59225,,,,,,,,,0.3203,,high,no_history +tablib,freeze_panes,1.401709,1.557625,,,,1.910625,2.111292,,,,0.1112,0.105,ok,no_history +openpyxl,named_ranges,1.110459,1.139333,,,,1.408083,1.472042,,,,0.026,0.0454,ok,no_history +xlsxwriter,named_ranges,,,,,,1.570792,1.989,,,,,0.2662,high,no_history +python-calamine,named_ranges,0.046583,0.0515,,,,,,,,,0.1056,,ok,no_history +wolfxl,named_ranges,0.485458,0.526375,,,,0.54175,0.568083,,,,0.0843,0.0486,ok,no_history +pylightxl,named_ranges,,,,,,0.232458,0.253541,,,,,0.0907,ok,no_history +xlrd,named_ranges,,,,,,,,,,,,,ok,no_history +pyexcel,named_ranges,1.242083,1.340917,,,,1.488375,4.763333,,,,0.0796,2.2004,high,no_history +xlwt,named_ranges,,,,,,0.15575,0.166875,,,,,0.0714,ok,no_history +pandas,named_ranges,1.572125,2.062875,,,,1.775708,2.037792,,,,0.3122,0.1476,high,no_history +xlsxwriter-constmem,named_ranges,,,,,,1.684583,2.174416,,,,,0.2908,high,no_history +openpyxl-readonly,named_ranges,0.870667,0.901417,,,,,,,,,0.0353,,ok,no_history +polars,named_ranges,0.365959,0.462,,,,,,,,,0.2624,,high,no_history +tablib,named_ranges,1.188875,1.212417,,,,1.358625,3.560375,,,,0.0198,1.6206,high,no_history +openpyxl,tables,1.442292,1.850875,,,,1.128875,1.295875,,,,0.2833,0.1479,high,no_history +xlsxwriter,tables,,,,,,1.4475,1.833041,,,,,0.2663,high,no_history +python-calamine,tables,0.050167,0.055542,,,,,,,,,0.1071,,ok,no_history +wolfxl,tables,0.519,0.557166,,,,0.488959,0.518417,,,,0.0735,0.0602,ok,no_history +pylightxl,tables,,,,,,0.211208,0.224292,,,,,0.0619,ok,no_history +xlrd,tables,,,,,,,,,,,,,ok,no_history +pyexcel,tables,1.811584,2.2325,,,,1.132083,1.196208,,,,0.2323,0.0566,high,no_history +xlwt,tables,,,,,,0.138959,0.149583,,,,,0.0765,ok,no_history +pandas,tables,1.682792,1.781709,,,,1.231125,1.29525,,,,0.0588,0.0521,ok,no_history +xlsxwriter-constmem,tables,,,,,,1.458375,1.788292,,,,,0.2262,high,no_history +openpyxl-readonly,tables,0.931875,0.94775,,,,,,,,,0.017,,ok,no_history +polars,tables,0.365458,0.54425,,,,,,,,,0.4892,,high,no_history +tablib,tables,1.399042,1.423625,,,,1.139792,1.201583,,,,0.0176,0.0542,ok,no_history \ No newline at end of file diff --git a/results-2026-10-03/perf/pins.txt b/results-2026-10-03/perf/pins.txt new file mode 100644 index 0000000..e441b72 --- /dev/null +++ b/results-2026-10-03/perf/pins.txt @@ -0,0 +1,13 @@ +wolfxl==2.0.8 +openpyxl==3.1.5 +xlsxwriter==3.2.9 +python-calamine==0.8.2 +pylightxl==1.61 +xlrd==2.0.2 +pyexcel==0.7.6 +pyexcel-xlsx==0.6.1 +xlwt==1.3.0 +pandas==3.0.6 +polars==1.44.2 +fastexcel==0.21.0 +tablib==3.10.0 diff --git a/results-2026-10-03/perf/pip-freeze.txt b/results-2026-10-03/perf/pip-freeze.txt new file mode 100644 index 0000000..96083f9 --- /dev/null +++ b/results-2026-10-03/perf/pip-freeze.txt @@ -0,0 +1,49 @@ +annotated-doc==0.0.5 +annotated-types==0.8.0 +appscript==1.4.0 +contourpy==1.4.0 +cycler==0.12.1 +defusedxml==0.7.1 +et-xmlfile==2.0.0 +excelbench @ file://~/wolf-lane/officelibs-perf-2026-10-03/src +fastexcel==0.21.0 +fonttools==4.66.1 +kiwisolver==1.5.1 +lml==0.2.0 +lxml==6.1.3 +markdown-it-py==4.2.0 +matplotlib==3.11.2 +mdurl==0.1.2 +narwhals==2.26.0 +numpy==2.5.3 +openpyxl==3.1.5 +packaging==26.3 +pandas==3.0.6 +pillow==12.3.0 +plotly==7.1.0 +polars==1.44.2 +polars-runtime-32==1.44.2 +psutil==7.2.2 +pydantic==2.13.5 +pydantic-core==2.46.5 +pyexcel==0.7.6 +pyexcel-io==0.6.8 +pyexcel-xlsx==0.6.1 +pygments==2.21.0 +pylightxl==1.61 +pyparsing==3.3.3 +python-calamine==0.8.2 +python-dateutil==2.9.0.post0 +rich==15.0.0 +shellingham==1.5.4 +six==1.17.0 +tablib==3.10.0 +texttable==1.7.0 +typer==0.27.2 +typing-extensions==4.16.0 +typing-inspection==0.4.4 +wolfxl==2.0.8 +xlrd==2.0.2 +xlsxwriter==3.2.9 +xlwings==0.37.5 +xlwt==1.3.0 diff --git a/results-2026-10-03/perf/results.json b/results-2026-10-03/perf/results.json new file mode 100644 index 0000000..6d89584 --- /dev/null +++ b/results-2026-10-03/perf/results.json @@ -0,0 +1,9207 @@ +{ + "metadata": { + "benchmark_version": "0.1.0", + "run_date": "2026-10-03T00:00:03.786680+00:00", + "excel_version": "16.105.3", + "platform": "Darwin-arm64", + "profile": "xlsx", + "python": "3.12.3", + "commit": null, + "config": { + "warmup": 3, + "iters": 25, + "iteration_policy": "fixed", + "breakdown": false + }, + "run_environment": { + "cpu_model": "arm", + "core_count": 14, + "memory_total_mb": 24576.0 + } + }, + "libraries": { + "openpyxl": { + "name": "openpyxl", + "version": "3.1.5", + "language": "python", + "capabilities": [ + "read", + "write" + ] + }, + "xlsxwriter": { + "name": "xlsxwriter", + "version": "3.2.9", + "language": "python", + "capabilities": [ + "write" + ] + }, + "python-calamine": { + "name": "python-calamine", + "version": "0.8.2", + "language": "python", + "capabilities": [ + "read" + ] + }, + "wolfxl": { + "name": "wolfxl", + "version": "2.0.8", + "language": "python", + "capabilities": [ + "modify", + "read", + "write" + ] + }, + "pylightxl": { + "name": "pylightxl", + "version": "1.61", + "language": "python", + "capabilities": [ + "read", + "write" + ] + }, + "xlrd": { + "name": "xlrd", + "version": "2.0.2", + "language": "python", + "capabilities": [ + "read" + ] + }, + "pyexcel": { + "name": "pyexcel", + "version": "0.7.6", + "language": "python", + "capabilities": [ + "read", + "write" + ] + }, + "xlwt": { + "name": "xlwt", + "version": "1.3.0", + "language": "python", + "capabilities": [ + "write" + ] + }, + "pandas": { + "name": "pandas", + "version": "3.0.6", + "language": "python", + "capabilities": [ + "read", + "write" + ] + }, + "xlsxwriter-constmem": { + "name": "xlsxwriter-constmem", + "version": "3.2.9", + "language": "python", + "capabilities": [ + "write" + ] + }, + "openpyxl-readonly": { + "name": "openpyxl-readonly", + "version": "3.1.5", + "language": "python", + "capabilities": [ + "read" + ] + }, + "polars": { + "name": "polars", + "version": "1.44.2", + "language": "python", + "capabilities": [ + "read" + ] + }, + "tablib": { + "name": "tablib", + "version": "3.10.0", + "language": "python", + "capabilities": [ + "read", + "write" + ] + } + }, + "results": [ + { + "feature": "cell_values", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.258, + "p50": 1.295583, + "p95": 1.621833 + }, + "cpu_ms": { + "min": 1.258, + "p50": 1.295, + "p95": 1.622 + }, + "rss_peak_mb": 163.828125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.295583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.228708, + "p50": 1.292083, + "p95": 1.513917 + }, + "cpu_ms": { + "min": 1.229, + "p50": 1.286, + "p95": 1.368 + }, + "rss_peak_mb": 164.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.292083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.628292, + "p50": 1.698167, + "p95": 1.996917 + }, + "cpu_ms": { + "min": 1.629, + "p50": 1.693, + "p95": 1.996 + }, + "rss_peak_mb": 164.1875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.698167, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "cell_values", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.629625, + "p50": 0.651916, + "p95": 0.661667 + }, + "cpu_ms": { + "min": 0.629, + "p50": 0.652, + "p95": 0.662 + }, + "rss_peak_mb": 164.71875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.651916, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "cell_values", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.660583, + "p50": 0.685292, + "p95": 0.73575 + }, + "cpu_ms": { + "min": 0.66, + "p50": 0.685, + "p95": 0.736 + }, + "rss_peak_mb": 165.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.685292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.569458, + "p50": 0.592375, + "p95": 0.665333 + }, + "cpu_ms": { + "min": 0.57, + "p50": 0.593, + "p95": 0.666 + }, + "rss_peak_mb": 166.59375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.592375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.277917, + "p50": 1.316834, + "p95": 1.326959 + }, + "cpu_ms": { + "min": 1.278, + "p50": 1.316, + "p95": 1.327 + }, + "rss_peak_mb": 166.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.316834, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + { + "feature": "cell_values", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "cell_values", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.461125, + "p50": 1.489666, + "p95": 1.517041 + }, + "cpu_ms": { + "min": 1.461, + "p50": 1.49, + "p95": 1.517 + }, + "rss_peak_mb": 166.671875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.489666, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + { + "feature": "cell_values", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.26425, + "p50": 0.27525, + "p95": 0.327459 + }, + "cpu_ms": { + "min": 0.264, + "p50": 0.275, + "p95": 0.327 + }, + "rss_peak_mb": 166.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.27525, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "cell_values", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.745625, + "p50": 1.774667, + "p95": 1.932417 + }, + "cpu_ms": { + "min": 1.745, + "p50": 1.775, + "p95": 1.932 + }, + "rss_peak_mb": 167.296875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.774667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.515042, + "p50": 1.574416, + "p95": 1.8545 + }, + "cpu_ms": { + "min": 1.516, + "p50": 1.571, + "p95": 1.726 + }, + "rss_peak_mb": 167.78125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.574416, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "cell_values", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.613375, + "p50": 1.734, + "p95": 2.034292 + }, + "cpu_ms": { + "min": 1.614, + "p50": 1.709, + "p95": 1.937 + }, + "rss_peak_mb": 167.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.734, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "cell_values", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 5.867208, + "p50": 5.917875, + "p95": 6.168166 + }, + "cpu_ms": { + "min": 5.867, + "p50": 5.917, + "p95": 6.169 + }, + "rss_peak_mb": 168.765625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 5.917875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "cell_values", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.36, + "p50": 0.445666, + "p95": 0.715333 + }, + "cpu_ms": { + "min": 0.49, + "p50": 0.739, + "p95": 1.659 + }, + "rss_peak_mb": 183.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.445666, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "cell_values", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.355167, + "p50": 1.427125, + "p95": 1.688208 + }, + "cpu_ms": { + "min": 1.356, + "p50": 1.427, + "p95": 1.688 + }, + "rss_peak_mb": 183.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.427125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.295292, + "p50": 1.354042, + "p95": 1.445917 + }, + "cpu_ms": { + "min": 1.295, + "p50": 1.354, + "p95": 1.446 + }, + "rss_peak_mb": 183.6875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.354042, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.094, + "p50": 1.14075, + "p95": 1.193458 + }, + "cpu_ms": { + "min": 1.094, + "p50": 1.14, + "p95": 1.193 + }, + "rss_peak_mb": 183.828125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.14075, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.357125, + "p50": 1.4065, + "p95": 1.5935 + }, + "cpu_ms": { + "min": 1.357, + "p50": 1.406, + "p95": 1.594 + }, + "rss_peak_mb": 183.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.4065, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.51975, + "p50": 1.605708, + "p95": 2.073583 + }, + "cpu_ms": { + "min": 1.519, + "p50": 1.606, + "p95": 2.073 + }, + "rss_peak_mb": 183.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.605708, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "formulas", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.124208, + "p50": 0.137958, + "p95": 0.144708 + }, + "cpu_ms": { + "min": 0.124, + "p50": 0.139, + "p95": 0.145 + }, + "rss_peak_mb": 183.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.137958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "formulas", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.585458, + "p50": 0.634125, + "p95": 0.704375 + }, + "cpu_ms": { + "min": 0.585, + "p50": 0.635, + "p95": 0.705 + }, + "rss_peak_mb": 183.953125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.634125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.585416, + "p50": 0.662209, + "p95": 0.732917 + }, + "cpu_ms": { + "min": 0.586, + "p50": 0.662, + "p95": 0.734 + }, + "rss_peak_mb": 184.0, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.662209, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.035917, + "p50": 1.128709, + "p95": 1.187667 + }, + "cpu_ms": { + "min": 1.037, + "p50": 1.129, + "p95": 1.187 + }, + "rss_peak_mb": 184.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.128709, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.242792, + "p50": 0.255042, + "p95": 0.27875 + }, + "cpu_ms": { + "min": 0.243, + "p50": 0.256, + "p95": 0.278 + }, + "rss_peak_mb": 184.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.255042, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "formulas", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.187916, + "p50": 1.259459, + "p95": 1.31125 + }, + "cpu_ms": { + "min": 1.188, + "p50": 1.26, + "p95": 1.311 + }, + "rss_peak_mb": 184.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.259459, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.391959, + "p50": 1.452833, + "p95": 1.52025 + }, + "cpu_ms": { + "min": 1.393, + "p50": 1.452, + "p95": 1.52 + }, + "rss_peak_mb": 184.296875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.452833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.267083, + "p50": 0.28375, + "p95": 0.295292 + }, + "cpu_ms": { + "min": 0.266, + "p50": 0.283, + "p95": 0.296 + }, + "rss_peak_mb": 184.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.28375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "formulas", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.48325, + "p50": 1.587542, + "p95": 1.715125 + }, + "cpu_ms": { + "min": 1.483, + "p50": 1.587, + "p95": 1.715 + }, + "rss_peak_mb": 184.40625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.587542, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.616083, + "p50": 1.667208, + "p95": 1.76175 + }, + "cpu_ms": { + "min": 1.615, + "p50": 1.667, + "p95": 1.761 + }, + "rss_peak_mb": 184.5, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.667208, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "formulas", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.699667, + "p50": 1.765083, + "p95": 2.181833 + }, + "cpu_ms": { + "min": 1.699, + "p50": 1.765, + "p95": 2.181 + }, + "rss_peak_mb": 184.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.765083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "formulas", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.471958, + "p50": 1.49125, + "p95": 1.560125 + }, + "cpu_ms": { + "min": 1.472, + "p50": 1.491, + "p95": 1.555 + }, + "rss_peak_mb": 184.640625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.49125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "formulas", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.326417, + "p50": 0.385208, + "p95": 0.469209 + }, + "cpu_ms": { + "min": 0.65, + "p50": 0.857, + "p95": 1.371 + }, + "rss_peak_mb": 185.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.385208, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "formulas", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.098375, + "p50": 1.191542, + "p95": 1.251042 + }, + "cpu_ms": { + "min": 1.099, + "p50": 1.192, + "p95": 1.251 + }, + "rss_peak_mb": 185.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.191542, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.399833, + "p50": 1.434083, + "p95": 1.662 + }, + "cpu_ms": { + "min": 1.4, + "p50": 1.43, + "p95": 1.523 + }, + "rss_peak_mb": 185.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.434083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.655917, + "p50": 1.718833, + "p95": 1.795833 + }, + "cpu_ms": { + "min": 1.655, + "p50": 1.718, + "p95": 1.788 + }, + "rss_peak_mb": 185.78125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.718833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.644125, + "p50": 1.696709, + "p95": 1.815833 + }, + "cpu_ms": { + "min": 1.643, + "p50": 1.697, + "p95": 1.74 + }, + "rss_peak_mb": 185.828125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.696709, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.874916, + "p50": 1.987125, + "p95": 2.338333 + }, + "cpu_ms": { + "min": 1.876, + "p50": 1.966, + "p95": 2.288 + }, + "rss_peak_mb": 186.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.987125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "text_formatting", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.073542, + "p50": 0.078333, + "p95": 0.084041 + }, + "cpu_ms": { + "min": 0.073, + "p50": 0.078, + "p95": 0.085 + }, + "rss_peak_mb": 186.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.078333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "text_formatting", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.824708, + "p50": 0.849959, + "p95": 0.908917 + }, + "cpu_ms": { + "min": 0.824, + "p50": 0.85, + "p95": 0.909 + }, + "rss_peak_mb": 186.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.849959, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.629458, + "p50": 0.661, + "p95": 0.743875 + }, + "cpu_ms": { + "min": 0.629, + "p50": 0.661, + "p95": 0.744 + }, + "rss_peak_mb": 186.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.661, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.395291, + "p50": 1.491541, + "p95": 1.528167 + }, + "cpu_ms": { + "min": 1.395, + "p50": 1.492, + "p95": 1.528 + }, + "rss_peak_mb": 186.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.491541, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + { + "feature": "text_formatting", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "text_formatting", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.7295, + "p50": 1.779625, + "p95": 1.823084 + }, + "cpu_ms": { + "min": 1.729, + "p50": 1.78, + "p95": 1.823 + }, + "rss_peak_mb": 186.96875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.779625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + { + "feature": "text_formatting", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.340375, + "p50": 0.359042, + "p95": 0.387041 + }, + "cpu_ms": { + "min": 0.341, + "p50": 0.36, + "p95": 0.387 + }, + "rss_peak_mb": 186.984375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.359042, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "text_formatting", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.971875, + "p50": 2.011375, + "p95": 2.115166 + }, + "cpu_ms": { + "min": 1.972, + "p50": 2.011, + "p95": 2.115 + }, + "rss_peak_mb": 187.015625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 2.011375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.479375, + "p50": 1.571333, + "p95": 1.842125 + }, + "cpu_ms": { + "min": 1.479, + "p50": 1.567, + "p95": 1.642 + }, + "rss_peak_mb": 187.03125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.571333, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "text_formatting", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.862292, + "p50": 1.998917, + "p95": 2.220125 + }, + "cpu_ms": { + "min": 1.862, + "p50": 1.946, + "p95": 2.127 + }, + "rss_peak_mb": 187.0625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.998917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "text_formatting", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.394875, + "p50": 1.45725, + "p95": 1.479083 + }, + "cpu_ms": { + "min": 1.396, + "p50": 1.458, + "p95": 1.479 + }, + "rss_peak_mb": 187.0625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.45725, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "text_formatting", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.225291, + "p50": 0.252375, + "p95": 0.302541 + }, + "cpu_ms": { + "min": 0.32, + "p50": 0.462, + "p95": 0.604 + }, + "rss_peak_mb": 187.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.252375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "text_formatting", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.745584, + "p50": 1.780709, + "p95": 1.858459 + }, + "cpu_ms": { + "min": 1.745, + "p50": 1.781, + "p95": 1.849 + }, + "rss_peak_mb": 187.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.780709, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.278125, + "p50": 1.33225, + "p95": 1.433208 + }, + "cpu_ms": { + "min": 1.278, + "p50": 1.327, + "p95": 1.366 + }, + "rss_peak_mb": 187.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.33225, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.956375, + "p50": 1.008583, + "p95": 1.023208 + }, + "cpu_ms": { + "min": 0.957, + "p50": 1.008, + "p95": 1.023 + }, + "rss_peak_mb": 187.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.008583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.239708, + "p50": 1.297208, + "p95": 1.43425 + }, + "cpu_ms": { + "min": 1.24, + "p50": 1.296, + "p95": 1.351 + }, + "rss_peak_mb": 187.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.297208, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.620334, + "p50": 1.758833, + "p95": 2.271375 + }, + "cpu_ms": { + "min": 1.607, + "p50": 1.704, + "p95": 2.053 + }, + "rss_peak_mb": 187.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.758833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "background_colors", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.053541, + "p50": 0.054625, + "p95": 0.060459 + }, + "cpu_ms": { + "min": 0.052, + "p50": 0.055, + "p95": 0.06 + }, + "rss_peak_mb": 187.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.054625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "background_colors", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.572291, + "p50": 0.590833, + "p95": 0.647458 + }, + "cpu_ms": { + "min": 0.573, + "p50": 0.591, + "p95": 0.647 + }, + "rss_peak_mb": 187.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.590833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.504083, + "p50": 0.5305, + "p95": 0.597166 + }, + "cpu_ms": { + "min": 0.504, + "p50": 0.531, + "p95": 0.597 + }, + "rss_peak_mb": 187.234375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.5305, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.858834, + "p50": 0.935208, + "p95": 0.947958 + }, + "cpu_ms": { + "min": 0.86, + "p50": 0.935, + "p95": 0.949 + }, + "rss_peak_mb": 187.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.935208, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + { + "feature": "background_colors", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "background_colors", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.014125, + "p50": 1.077833, + "p95": 1.106792 + }, + "cpu_ms": { + "min": 1.014, + "p50": 1.077, + "p95": 1.108 + }, + "rss_peak_mb": 187.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.077833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + { + "feature": "background_colors", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.209, + "p50": 0.230167, + "p95": 0.361833 + }, + "cpu_ms": { + "min": 0.209, + "p50": 0.23, + "p95": 0.286 + }, + "rss_peak_mb": 187.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.230167, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "background_colors", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.193292, + "p50": 1.26425, + "p95": 1.357917 + }, + "cpu_ms": { + "min": 1.193, + "p50": 1.265, + "p95": 1.358 + }, + "rss_peak_mb": 187.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.26425, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.354167, + "p50": 1.440875, + "p95": 1.621125 + }, + "cpu_ms": { + "min": 1.353, + "p50": 1.402, + "p95": 1.499 + }, + "rss_peak_mb": 187.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.440875, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "background_colors", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.588, + "p50": 1.673292, + "p95": 1.965875 + }, + "cpu_ms": { + "min": 1.586, + "p50": 1.658, + "p95": 1.965 + }, + "rss_peak_mb": 187.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.673292, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "background_colors", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.816875, + "p50": 0.8755, + "p95": 0.942834 + }, + "cpu_ms": { + "min": 0.816, + "p50": 0.876, + "p95": 0.943 + }, + "rss_peak_mb": 187.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.8755, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "background_colors", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.19975, + "p50": 0.22675, + "p95": 0.265541 + }, + "cpu_ms": { + "min": 0.291, + "p50": 0.467, + "p95": 0.672 + }, + "rss_peak_mb": 187.46875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.22675, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "background_colors", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.974, + "p50": 1.035, + "p95": 1.051542 + }, + "cpu_ms": { + "min": 0.975, + "p50": 1.034, + "p95": 1.053 + }, + "rss_peak_mb": 187.46875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.035, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.150583, + "p50": 1.192709, + "p95": 1.230792 + }, + "cpu_ms": { + "min": 1.15, + "p50": 1.193, + "p95": 1.231 + }, + "rss_peak_mb": 187.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.192709, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.983042, + "p50": 1.03475, + "p95": 1.0595 + }, + "cpu_ms": { + "min": 0.984, + "p50": 1.035, + "p95": 1.059 + }, + "rss_peak_mb": 187.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.03475, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.20425, + "p50": 1.271458, + "p95": 1.405125 + }, + "cpu_ms": { + "min": 1.205, + "p50": 1.271, + "p95": 1.39 + }, + "rss_peak_mb": 187.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.271458, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.482167, + "p50": 1.582542, + "p95": 1.891417 + }, + "cpu_ms": { + "min": 1.483, + "p50": 1.582, + "p95": 1.795 + }, + "rss_peak_mb": 187.515625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.582542, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "number_formats", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.054708, + "p50": 0.0565, + "p95": 0.061958 + }, + "cpu_ms": { + "min": 0.054, + "p50": 0.056, + "p95": 0.062 + }, + "rss_peak_mb": 187.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0565, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "number_formats", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.589167, + "p50": 0.607959, + "p95": 0.666875 + }, + "cpu_ms": { + "min": 0.59, + "p50": 0.608, + "p95": 0.666 + }, + "rss_peak_mb": 187.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.607959, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.504875, + "p50": 0.533875, + "p95": 0.5675 + }, + "cpu_ms": { + "min": 0.505, + "p50": 0.533, + "p95": 0.568 + }, + "rss_peak_mb": 187.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.533875, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.854708, + "p50": 0.940583, + "p95": 1.018417 + }, + "cpu_ms": { + "min": 0.854, + "p50": 0.941, + "p95": 1.011 + }, + "rss_peak_mb": 187.625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.940583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + { + "feature": "number_formats", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "number_formats", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.042959, + "p50": 1.094625, + "p95": 1.19225 + }, + "cpu_ms": { + "min": 1.043, + "p50": 1.094, + "p95": 1.192 + }, + "rss_peak_mb": 188.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.094625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + { + "feature": "number_formats", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.217042, + "p50": 0.223542, + "p95": 0.282084 + }, + "cpu_ms": { + "min": 0.217, + "p50": 0.224, + "p95": 0.281 + }, + "rss_peak_mb": 188.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.223542, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "number_formats", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.194709, + "p50": 1.270625, + "p95": 1.297209 + }, + "cpu_ms": { + "min": 1.195, + "p50": 1.271, + "p95": 1.297 + }, + "rss_peak_mb": 188.4375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.270625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.334167, + "p50": 1.394167, + "p95": 1.448208 + }, + "cpu_ms": { + "min": 1.334, + "p50": 1.394, + "p95": 1.448 + }, + "rss_peak_mb": 188.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.394167, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "number_formats", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.574375, + "p50": 1.702, + "p95": 2.065 + }, + "cpu_ms": { + "min": 1.575, + "p50": 1.665, + "p95": 2.065 + }, + "rss_peak_mb": 188.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.702, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "number_formats", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.817417, + "p50": 0.874792, + "p95": 0.924 + }, + "cpu_ms": { + "min": 0.817, + "p50": 0.874, + "p95": 0.925 + }, + "rss_peak_mb": 188.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.874792, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "number_formats", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.188875, + "p50": 0.2355, + "p95": 0.303958 + }, + "cpu_ms": { + "min": 0.287, + "p50": 0.374, + "p95": 0.515 + }, + "rss_peak_mb": 188.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.2355, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "number_formats", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.984, + "p50": 1.048709, + "p95": 1.109542 + }, + "cpu_ms": { + "min": 0.984, + "p50": 1.048, + "p95": 1.103 + }, + "rss_peak_mb": 188.453125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.048709, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.104, + "p50": 1.178709, + "p95": 1.352667 + }, + "cpu_ms": { + "min": 1.104, + "p50": 1.178, + "p95": 1.261 + }, + "rss_peak_mb": 188.53125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.178709, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.1675, + "p50": 1.210209, + "p95": 1.253291 + }, + "cpu_ms": { + "min": 1.168, + "p50": 1.209, + "p95": 1.252 + }, + "rss_peak_mb": 188.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.210209, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.313417, + "p50": 1.364209, + "p95": 1.418666 + }, + "cpu_ms": { + "min": 1.313, + "p50": 1.364, + "p95": 1.42 + }, + "rss_peak_mb": 188.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.364209, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.588, + "p50": 1.797166, + "p95": 2.173375 + }, + "cpu_ms": { + "min": 1.577, + "p50": 1.706, + "p95": 1.999 + }, + "rss_peak_mb": 188.765625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.797166, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "alignment", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.048333, + "p50": 0.049, + "p95": 0.054542 + }, + "cpu_ms": { + "min": 0.047, + "p50": 0.049, + "p95": 0.054 + }, + "rss_peak_mb": 188.765625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.049, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "alignment", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.648167, + "p50": 0.674625, + "p95": 0.726292 + }, + "cpu_ms": { + "min": 0.647, + "p50": 0.675, + "p95": 0.725 + }, + "rss_peak_mb": 188.765625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.674625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.539084, + "p50": 0.553792, + "p95": 0.687375 + }, + "cpu_ms": { + "min": 0.538, + "p50": 0.553, + "p95": 0.632 + }, + "rss_peak_mb": 188.8125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.553792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature" + }, + { + "feature": "alignment", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "alignment", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.185375, + "p50": 1.265542, + "p95": 1.286041 + }, + "cpu_ms": { + "min": 1.185, + "p50": 1.266, + "p95": 1.287 + }, + "rss_peak_mb": 189.0, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.265542, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells" + }, + { + "feature": "alignment", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.21775, + "p50": 0.235333, + "p95": 0.364125 + }, + "cpu_ms": { + "min": 0.218, + "p50": 0.234, + "p95": 0.283 + }, + "rss_peak_mb": 189.046875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.235333, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "alignment", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.358125, + "p50": 1.4425, + "p95": 1.512375 + }, + "cpu_ms": { + "min": 1.357, + "p50": 1.443, + "p95": 1.512 + }, + "rss_peak_mb": 189.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.4425, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.366458, + "p50": 1.438292, + "p95": 1.591291 + }, + "cpu_ms": { + "min": 1.366, + "p50": 1.425, + "p95": 1.585 + }, + "rss_peak_mb": 189.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.438292, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "alignment", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.587875, + "p50": 1.717958, + "p95": 2.156 + }, + "cpu_ms": { + "min": 1.588, + "p50": 1.635, + "p95": 2.044 + }, + "rss_peak_mb": 189.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.717958, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "alignment", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.893708, + "p50": 0.967667, + "p95": 1.008166 + }, + "cpu_ms": { + "min": 0.893, + "p50": 0.967, + "p95": 1.008 + }, + "rss_peak_mb": 189.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.967667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "alignment", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.193959, + "p50": 0.247834, + "p95": 0.307125 + }, + "cpu_ms": { + "min": 0.298, + "p50": 0.464, + "p95": 0.687 + }, + "rss_peak_mb": 189.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.247834, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "alignment", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.18925, + "p50": 1.243333, + "p95": 1.292291 + }, + "cpu_ms": { + "min": 1.189, + "p50": 1.244, + "p95": 1.293 + }, + "rss_peak_mb": 189.171875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.243333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.165958, + "p50": 1.219416, + "p95": 1.357084 + }, + "cpu_ms": { + "min": 1.166, + "p50": 1.204, + "p95": 1.251 + }, + "rss_peak_mb": 189.171875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.219416, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.685625, + "p50": 1.851166, + "p95": 1.996583 + }, + "cpu_ms": { + "min": 1.687, + "p50": 1.851, + "p95": 1.996 + }, + "rss_peak_mb": 189.1875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.851166, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 2.105334, + "p50": 2.148, + "p95": 2.443375 + }, + "cpu_ms": { + "min": 2.106, + "p50": 2.143, + "p95": 2.301 + }, + "rss_peak_mb": 189.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.148, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.983708, + "p50": 2.19225, + "p95": 2.621583 + }, + "cpu_ms": { + "min": 1.974, + "p50": 2.087, + "p95": 2.472 + }, + "rss_peak_mb": 189.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.19225, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "borders", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.059958, + "p50": 0.064792, + "p95": 0.067959 + }, + "cpu_ms": { + "min": 0.059, + "p50": 0.065, + "p95": 0.068 + }, + "rss_peak_mb": 189.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.064792, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "borders", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.986334, + "p50": 1.029292, + "p95": 1.056125 + }, + "cpu_ms": { + "min": 0.986, + "p50": 1.029, + "p95": 1.057 + }, + "rss_peak_mb": 189.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.029292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.790542, + "p50": 0.818667, + "p95": 0.868708 + }, + "cpu_ms": { + "min": 0.791, + "p50": 0.817, + "p95": 0.869 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.818667, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature" + }, + { + "feature": "borders", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "borders", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.736875, + "p50": 1.792042, + "p95": 2.268625 + }, + "cpu_ms": { + "min": 1.737, + "p50": 1.792, + "p95": 2.268 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.792042, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells" + }, + { + "feature": "borders", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.395334, + "p50": 0.429833, + "p95": 0.576917 + }, + "cpu_ms": { + "min": 0.395, + "p50": 0.421, + "p95": 0.468 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.429833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "borders", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.955833, + "p50": 2.045208, + "p95": 2.31975 + }, + "cpu_ms": { + "min": 1.956, + "p50": 2.045, + "p95": 2.319 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 2.045208, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.488709, + "p50": 1.592667, + "p95": 1.785792 + }, + "cpu_ms": { + "min": 1.489, + "p50": 1.557, + "p95": 1.636 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.592667, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "borders", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.969458, + "p50": 2.320666, + "p95": 2.620542 + }, + "cpu_ms": { + "min": 1.969, + "p50": 2.118, + "p95": 2.468 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.320666, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "borders", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.267459, + "p50": 1.311834, + "p95": 1.405208 + }, + "cpu_ms": { + "min": 1.267, + "p50": 1.312, + "p95": 1.406 + }, + "rss_peak_mb": 189.34375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.311834, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "borders", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.212167, + "p50": 0.264417, + "p95": 0.317834 + }, + "cpu_ms": { + "min": 0.322, + "p50": 0.513, + "p95": 0.762 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.264417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "borders", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.781875, + "p50": 1.801709, + "p95": 2.155625 + }, + "cpu_ms": { + "min": 1.782, + "p50": 1.801, + "p95": 2.156 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.801709, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.304333, + "p50": 1.365459, + "p95": 1.549208 + }, + "cpu_ms": { + "min": 1.305, + "p50": 1.36, + "p95": 1.418 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.365459, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.888166, + "p50": 0.954209, + "p95": 0.967208 + }, + "cpu_ms": { + "min": 0.889, + "p50": 0.954, + "p95": 0.968 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.954209, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.123958, + "p50": 1.158417, + "p95": 1.289333 + }, + "cpu_ms": { + "min": 1.124, + "p50": 1.158, + "p95": 1.189 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.158417, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.354709, + "p50": 1.412916, + "p95": 1.816791 + }, + "cpu_ms": { + "min": 1.355, + "p50": 1.402, + "p95": 1.817 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.412916, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "dimensions", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.053333, + "p50": 0.0565, + "p95": 0.060042 + }, + "cpu_ms": { + "min": 0.053, + "p50": 0.057, + "p95": 0.06 + }, + "rss_peak_mb": 189.359375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0565, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "dimensions", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.530834, + "p50": 0.549667, + "p95": 0.597334 + }, + "cpu_ms": { + "min": 0.531, + "p50": 0.55, + "p95": 0.598 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.549667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.481, + "p50": 0.517333, + "p95": 0.710333 + }, + "cpu_ms": { + "min": 0.48, + "p50": 0.5, + "p95": 0.577 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.517333, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.82175, + "p50": 0.902833, + "p95": 0.911125 + }, + "cpu_ms": { + "min": 0.822, + "p50": 0.903, + "p95": 0.911 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.902833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature" + }, + { + "feature": "dimensions", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "dimensions", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.991583, + "p50": 1.046333, + "p95": 1.069417 + }, + "cpu_ms": { + "min": 0.992, + "p50": 1.047, + "p95": 1.069 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.046333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing" + }, + { + "feature": "dimensions", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.148584, + "p50": 0.160583, + "p95": 0.35875 + }, + "cpu_ms": { + "min": 0.149, + "p50": 0.16, + "p95": 0.176 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.160583, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "dimensions", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.167167, + "p50": 1.246792, + "p95": 1.318417 + }, + "cpu_ms": { + "min": 1.166, + "p50": 1.248, + "p95": 1.318 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.246792, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.202208, + "p50": 1.295792, + "p95": 1.431834 + }, + "cpu_ms": { + "min": 1.201, + "p50": 1.26, + "p95": 1.347 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.295792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "dimensions", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.456417, + "p50": 1.714167, + "p95": 2.02075 + }, + "cpu_ms": { + "min": 1.442, + "p50": 1.499, + "p95": 1.628 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.714167, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "dimensions", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.744208, + "p50": 0.810333, + "p95": 0.941542 + }, + "cpu_ms": { + "min": 0.745, + "p50": 0.81, + "p95": 0.942 + }, + "rss_peak_mb": 189.375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.810333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "dimensions", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.245459, + "p50": 0.334625, + "p95": 0.460125 + }, + "cpu_ms": { + "min": 0.661, + "p50": 1.121, + "p95": 1.612 + }, + "rss_peak_mb": 189.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.334625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "dimensions", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.908875, + "p50": 0.984958, + "p95": 1.0065 + }, + "cpu_ms": { + "min": 0.909, + "p50": 0.985, + "p95": 1.006 + }, + "rss_peak_mb": 189.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.984958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.066667, + "p50": 1.157625, + "p95": 1.278417 + }, + "cpu_ms": { + "min": 1.066, + "p50": 1.137, + "p95": 1.191 + }, + "rss_peak_mb": 189.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.157625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.232041, + "p50": 1.279792, + "p95": 1.325958 + }, + "cpu_ms": { + "min": 1.232, + "p50": 1.279, + "p95": 1.326 + }, + "rss_peak_mb": 189.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.279792, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.599125, + "p50": 1.752166, + "p95": 1.948583 + }, + "cpu_ms": { + "min": 1.599, + "p50": 1.649, + "p95": 1.857 + }, + "rss_peak_mb": 189.703125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.752166, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.792958, + "p50": 1.973709, + "p95": 2.705 + }, + "cpu_ms": { + "min": 1.793, + "p50": 1.858, + "p95": 2.705 + }, + "rss_peak_mb": 189.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.973709, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "multiple_sheets", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.055041, + "p50": 0.057084, + "p95": 0.061917 + }, + "cpu_ms": { + "min": 0.055, + "p50": 0.057, + "p95": 0.062 + }, + "rss_peak_mb": 189.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.057084, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "multiple_sheets", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.498542, + "p50": 0.5245, + "p95": 0.584667 + }, + "cpu_ms": { + "min": 0.499, + "p50": 0.525, + "p95": 0.585 + }, + "rss_peak_mb": 189.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.5245, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.54425, + "p50": 0.570917, + "p95": 0.622584 + }, + "cpu_ms": { + "min": 0.543, + "p50": 0.571, + "p95": 0.622 + }, + "rss_peak_mb": 189.78125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.570917, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.291792, + "p50": 1.307042, + "p95": 1.3195 + }, + "cpu_ms": { + "min": 1.291, + "p50": 1.306, + "p95": 1.32 + }, + "rss_peak_mb": 189.78125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.307042, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.286333, + "p50": 0.307584, + "p95": 0.413542 + }, + "cpu_ms": { + "min": 0.286, + "p50": 0.307, + "p95": 0.344 + }, + "rss_peak_mb": 189.78125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.307584, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "multiple_sheets", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.374208, + "p50": 1.403, + "p95": 1.537958 + }, + "cpu_ms": { + "min": 1.374, + "p50": 1.402, + "p95": 1.529 + }, + "rss_peak_mb": 189.78125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.403, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.679334, + "p50": 1.716084, + "p95": 1.955125 + }, + "cpu_ms": { + "min": 1.679, + "p50": 1.716, + "p95": 1.9 + }, + "rss_peak_mb": 189.796875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.716084, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.179292, + "p50": 0.195667, + "p95": 0.20525 + }, + "cpu_ms": { + "min": 0.179, + "p50": 0.195, + "p95": 0.206 + }, + "rss_peak_mb": 189.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.195667, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "multiple_sheets", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.762167, + "p50": 1.791625, + "p95": 1.871708 + }, + "cpu_ms": { + "min": 1.762, + "p50": 1.791, + "p95": 1.872 + }, + "rss_peak_mb": 189.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.791625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 2.031084, + "p50": 2.083083, + "p95": 2.265958 + }, + "cpu_ms": { + "min": 2.03, + "p50": 2.083, + "p95": 2.266 + }, + "rss_peak_mb": 189.859375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.083083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "multiple_sheets", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.948416, + "p50": 2.068, + "p95": 2.544333 + }, + "cpu_ms": { + "min": 1.949, + "p50": 2.042, + "p95": 2.414 + }, + "rss_peak_mb": 189.953125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.068, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "multiple_sheets", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.943625, + "p50": 1.008292, + "p95": 1.03775 + }, + "cpu_ms": { + "min": 0.943, + "p50": 1.008, + "p95": 1.037 + }, + "rss_peak_mb": 189.953125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.008292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "multiple_sheets", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.430667, + "p50": 0.507375, + "p95": 0.6195 + }, + "cpu_ms": { + "min": 0.767, + "p50": 1.395, + "p95": 2.418 + }, + "rss_peak_mb": 190.09375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.507375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "multiple_sheets", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.281792, + "p50": 1.347791, + "p95": 1.474833 + }, + "cpu_ms": { + "min": 1.282, + "p50": 1.348, + "p95": 1.468 + }, + "rss_peak_mb": 190.109375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.347791, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.644625, + "p50": 1.693209, + "p95": 1.888458 + }, + "cpu_ms": { + "min": 1.645, + "p50": 1.693, + "p95": 1.751 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.693209, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.176917, + "p50": 1.238166, + "p95": 1.266459 + }, + "cpu_ms": { + "min": 1.177, + "p50": 1.237, + "p95": 1.266 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.238166, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.272958, + "p50": 1.329041, + "p95": 1.588166 + }, + "cpu_ms": { + "min": 1.273, + "p50": 1.327, + "p95": 1.489 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.329041, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.538875, + "p50": 1.645167, + "p95": 2.097417 + }, + "cpu_ms": { + "min": 1.539, + "p50": 1.594, + "p95": 2.098 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.645167, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "merged_cells", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.053458, + "p50": 0.0565, + "p95": 0.061708 + }, + "cpu_ms": { + "min": 0.053, + "p50": 0.058, + "p95": 0.062 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0565, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "merged_cells", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.77875, + "p50": 0.819375, + "p95": 0.872292 + }, + "cpu_ms": { + "min": 0.779, + "p50": 0.819, + "p95": 0.872 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.819375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.521292, + "p50": 0.542584, + "p95": 0.574125 + }, + "cpu_ms": { + "min": 0.521, + "p50": 0.543, + "p95": 0.575 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.542584, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.881542, + "p50": 0.954917, + "p95": 0.965833 + }, + "cpu_ms": { + "min": 0.882, + "p50": 0.955, + "p95": 0.965 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.954917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature" + }, + { + "feature": "merged_cells", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "merged_cells", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.249917, + "p50": 1.308917, + "p95": 1.357417 + }, + "cpu_ms": { + "min": 1.25, + "p50": 1.309, + "p95": 1.357 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.308917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature" + }, + { + "feature": "merged_cells", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.194583, + "p50": 0.202041, + "p95": 0.358417 + }, + "cpu_ms": { + "min": 0.194, + "p50": 0.202, + "p95": 0.259 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.202041, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "merged_cells", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.226375, + "p50": 1.315375, + "p95": 1.341375 + }, + "cpu_ms": { + "min": 1.226, + "p50": 1.315, + "p95": 1.342 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.315375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.3335, + "p50": 1.430459, + "p95": 1.610917 + }, + "cpu_ms": { + "min": 1.334, + "p50": 1.417, + "p95": 1.483 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.430459, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "merged_cells", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.545625, + "p50": 1.597083, + "p95": 2.031208 + }, + "cpu_ms": { + "min": 1.547, + "p50": 1.597, + "p95": 2.031 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.597083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "merged_cells", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.8255, + "p50": 0.878917, + "p95": 0.9165 + }, + "cpu_ms": { + "min": 0.826, + "p50": 0.879, + "p95": 0.917 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.878917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "merged_cells", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.192375, + "p50": 0.229958, + "p95": 0.290542 + }, + "cpu_ms": { + "min": 0.284, + "p50": 0.471, + "p95": 0.806 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.229958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "merged_cells", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.993833, + "p50": 1.066875, + "p95": 1.085833 + }, + "cpu_ms": { + "min": 0.994, + "p50": 1.067, + "p95": 1.086 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.066875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.116709, + "p50": 1.15975, + "p95": 1.226375 + }, + "cpu_ms": { + "min": 1.117, + "p50": 1.161, + "p95": 1.196 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.15975, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.33625, + "p50": 1.37925, + "p95": 1.41875 + }, + "cpu_ms": { + "min": 1.336, + "p50": 1.379, + "p95": 1.419 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.37925, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.606375, + "p50": 1.669708, + "p95": 1.805417 + }, + "cpu_ms": { + "min": 1.607, + "p50": 1.67, + "p95": 1.789 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.669708, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.582333, + "p50": 1.677083, + "p95": 2.064875 + }, + "cpu_ms": { + "min": 1.582, + "p50": 1.665, + "p95": 2.027 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.677083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "conditional_formatting", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.047541, + "p50": 0.052209, + "p95": 0.054 + }, + "cpu_ms": { + "min": 0.047, + "p50": 0.053, + "p95": 0.054 + }, + "rss_peak_mb": 190.140625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.052209, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "conditional_formatting", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.003125, + "p50": 1.021667, + "p95": 1.083542 + }, + "cpu_ms": { + "min": 1.003, + "p50": 1.022, + "p95": 1.084 + }, + "rss_peak_mb": 190.65625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.021667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.578917, + "p50": 0.613959, + "p95": 0.660959 + }, + "cpu_ms": { + "min": 0.58, + "p50": 0.614, + "p95": 0.661 + }, + "rss_peak_mb": 190.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.613959, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature" + }, + { + "feature": "conditional_formatting", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "conditional_formatting", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.440625, + "p50": 1.460333, + "p95": 1.501708 + }, + "cpu_ms": { + "min": 1.441, + "p50": 1.46, + "p95": 1.502 + }, + "rss_peak_mb": 191.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.460333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature" + }, + { + "feature": "conditional_formatting", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting" + }, + { + "feature": "conditional_formatting", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.728916, + "p50": 1.757583, + "p95": 1.792791 + }, + "cpu_ms": { + "min": 1.729, + "p50": 1.758, + "p95": 1.793 + }, + "rss_peak_mb": 191.25, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.757583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.479125, + "p50": 1.542834, + "p95": 1.710666 + }, + "cpu_ms": { + "min": 1.479, + "p50": 1.524, + "p95": 1.569 + }, + "rss_peak_mb": 191.265625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.542834, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "conditional_formatting", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.755792, + "p50": 2.084541, + "p95": 2.483167 + }, + "cpu_ms": { + "min": 1.756, + "p50": 2.044, + "p95": 2.484 + }, + "rss_peak_mb": 191.265625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.084541, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "conditional_formatting", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.884208, + "p50": 0.960708, + "p95": 0.976084 + }, + "cpu_ms": { + "min": 0.885, + "p50": 0.961, + "p95": 0.976 + }, + "rss_peak_mb": 191.265625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.960708, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "conditional_formatting", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.321916, + "p50": 0.368417, + "p95": 0.523375 + }, + "cpu_ms": { + "min": 0.532, + "p50": 0.92, + "p95": 1.254 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.368417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "conditional_formatting", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.401083, + "p50": 1.449667, + "p95": 1.627333 + }, + "cpu_ms": { + "min": 1.401, + "p50": 1.45, + "p95": 1.628 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.449667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.363709, + "p50": 1.400791, + "p95": 1.466416 + }, + "cpu_ms": { + "min": 1.364, + "p50": 1.401, + "p95": 1.466 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.400791, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.169792, + "p50": 1.206292, + "p95": 1.360875 + }, + "cpu_ms": { + "min": 1.169, + "p50": 1.206, + "p95": 1.353 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.206292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.185791, + "p50": 1.222709, + "p95": 1.281625 + }, + "cpu_ms": { + "min": 1.185, + "p50": 1.22, + "p95": 1.259 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.222709, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.409417, + "p50": 1.510291, + "p95": 1.867417 + }, + "cpu_ms": { + "min": 1.406, + "p50": 1.442, + "p95": 1.868 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.510291, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "data_validation", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.046459, + "p50": 0.05025, + "p95": 0.052458 + }, + "cpu_ms": { + "min": 0.046, + "p50": 0.05, + "p95": 0.053 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.05025, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "data_validation", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.573792, + "p50": 0.593541, + "p95": 0.649792 + }, + "cpu_ms": { + "min": 0.574, + "p50": 0.593, + "p95": 0.65 + }, + "rss_peak_mb": 191.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.593541, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.504167, + "p50": 0.534875, + "p95": 0.588417 + }, + "cpu_ms": { + "min": 0.504, + "p50": 0.535, + "p95": 0.589 + }, + "rss_peak_mb": 191.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.534875, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature" + }, + { + "feature": "data_validation", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "data_validation", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.304083, + "p50": 1.321958, + "p95": 1.343916 + }, + "cpu_ms": { + "min": 1.305, + "p50": 1.322, + "p95": 1.344 + }, + "rss_peak_mb": 191.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.321958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature" + }, + { + "feature": "data_validation", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations" + }, + { + "feature": "data_validation", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.620042, + "p50": 1.643166, + "p95": 1.761542 + }, + "cpu_ms": { + "min": 1.62, + "p50": 1.643, + "p95": 1.761 + }, + "rss_peak_mb": 191.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.643166, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.194291, + "p50": 1.268125, + "p95": 1.418542 + }, + "cpu_ms": { + "min": 1.195, + "p50": 1.268, + "p95": 1.41 + }, + "rss_peak_mb": 191.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.268125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "data_validation", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.484208, + "p50": 1.600959, + "p95": 1.922458 + }, + "cpu_ms": { + "min": 1.472, + "p50": 1.567, + "p95": 1.893 + }, + "rss_peak_mb": 191.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.600959, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "data_validation", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.81825, + "p50": 0.899917, + "p95": 0.94075 + }, + "cpu_ms": { + "min": 0.817, + "p50": 0.9, + "p95": 0.94 + }, + "rss_peak_mb": 191.328125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.899917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "data_validation", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.393875, + "p50": 0.475334, + "p95": 0.627916 + }, + "cpu_ms": { + "min": 1.249, + "p50": 1.794, + "p95": 2.253 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.475334, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "data_validation", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.225625, + "p50": 1.294083, + "p95": 1.323792 + }, + "cpu_ms": { + "min": 1.225, + "p50": 1.294, + "p95": 1.324 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.294083, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.084417, + "p50": 1.1295, + "p95": 1.22975 + }, + "cpu_ms": { + "min": 1.084, + "p50": 1.129, + "p95": 1.163 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.1295, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.168916, + "p50": 1.19, + "p95": 1.214291 + }, + "cpu_ms": { + "min": 1.169, + "p50": 1.19, + "p95": 1.214 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.19, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.197375, + "p50": 1.259292, + "p95": 1.40775 + }, + "cpu_ms": { + "min": 1.198, + "p50": 1.26, + "p95": 1.401 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.259292, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.672041, + "p50": 1.746625, + "p95": 1.941666 + }, + "cpu_ms": { + "min": 1.671, + "p50": 1.734, + "p95": 1.942 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.746625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "hyperlinks", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.046708, + "p50": 0.048334, + "p95": 0.054042 + }, + "cpu_ms": { + "min": 0.047, + "p50": 0.048, + "p95": 0.054 + }, + "rss_peak_mb": 191.546875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.048334, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "hyperlinks", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.123041, + "p50": 1.146209, + "p95": 1.211 + }, + "cpu_ms": { + "min": 1.123, + "p50": 1.147, + "p95": 1.211 + }, + "rss_peak_mb": 191.578125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.146209, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.527708, + "p50": 0.544709, + "p95": 0.578375 + }, + "cpu_ms": { + "min": 0.527, + "p50": 0.544, + "p95": 0.578 + }, + "rss_peak_mb": 191.59375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.544709, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature" + }, + { + "feature": "hyperlinks", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "hyperlinks", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.2445, + "p50": 1.276541, + "p95": 1.389958 + }, + "cpu_ms": { + "min": 1.246, + "p50": 1.278, + "p95": 1.391 + }, + "rss_peak_mb": 191.59375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.276541, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature" + }, + { + "feature": "hyperlinks", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter" + }, + { + "feature": "hyperlinks", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.474083, + "p50": 1.545292, + "p95": 1.558584 + }, + "cpu_ms": { + "min": 1.474, + "p50": 1.546, + "p95": 1.559 + }, + "rss_peak_mb": 191.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.545292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.203542, + "p50": 1.277125, + "p95": 1.438083 + }, + "cpu_ms": { + "min": 1.203, + "p50": 1.264, + "p95": 1.345 + }, + "rss_peak_mb": 191.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.277125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "hyperlinks", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.65525, + "p50": 1.815458, + "p95": 2.13425 + }, + "cpu_ms": { + "min": 1.655, + "p50": 1.765, + "p95": 2.133 + }, + "rss_peak_mb": 191.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.815458, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "hyperlinks", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.800833, + "p50": 0.883166, + "p95": 0.975958 + }, + "cpu_ms": { + "min": 0.801, + "p50": 0.884, + "p95": 0.976 + }, + "rss_peak_mb": 191.609375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.883166, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "hyperlinks", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.31125, + "p50": 0.374083, + "p95": 0.475792 + }, + "cpu_ms": { + "min": 0.586, + "p50": 0.941, + "p95": 2.006 + }, + "rss_peak_mb": 191.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.374083, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "hyperlinks", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.127833, + "p50": 1.223417, + "p95": 1.260166 + }, + "cpu_ms": { + "min": 1.128, + "p50": 1.223, + "p95": 1.26 + }, + "rss_peak_mb": 191.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.223417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.082709, + "p50": 1.13725, + "p95": 1.245792 + }, + "cpu_ms": { + "min": 1.083, + "p50": 1.137, + "p95": 1.178 + }, + "rss_peak_mb": 191.734375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.13725, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.267041, + "p50": 1.629833, + "p95": 2.130834 + }, + "cpu_ms": { + "min": 1.268, + "p50": 1.631, + "p95": 2.13 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.629833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.5505, + "p50": 1.619833, + "p95": 1.817292 + }, + "cpu_ms": { + "min": 1.55, + "p50": 1.612, + "p95": 1.817 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.619833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 2.242209, + "p50": 2.485958, + "p95": 2.888125 + }, + "cpu_ms": { + "min": 2.242, + "p50": 2.486, + "p95": 2.888 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.485958, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "images", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.047916, + "p50": 0.049041, + "p95": 0.053666 + }, + "cpu_ms": { + "min": 0.047, + "p50": 0.049, + "p95": 0.053 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.049041, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "images", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.84775, + "p50": 0.866375, + "p95": 0.912583 + }, + "cpu_ms": { + "min": 0.848, + "p50": 0.867, + "p95": 0.913 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.866375, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.677, + "p50": 0.688833, + "p95": 0.728625 + }, + "cpu_ms": { + "min": 0.678, + "p50": 0.689, + "p95": 0.713 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.688833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_image: pylightxl does not implement this feature" + }, + { + "feature": "images", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "images", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.138042, + "p50": 1.208083, + "p95": 1.260875 + }, + "cpu_ms": { + "min": 1.138, + "p50": 1.207, + "p95": 1.261 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.208083, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_image: pyexcel does not expose this worksheet feature" + }, + { + "feature": "images", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_image: xlwt cannot embed images in this adapter" + }, + { + "feature": "images", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.06525, + "p50": 1.157958, + "p95": 1.256791 + }, + "cpu_ms": { + "min": 1.065, + "p50": 1.158, + "p95": 1.257 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.157958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.196959, + "p50": 1.261167, + "p95": 1.448375 + }, + "cpu_ms": { + "min": 1.196, + "p50": 1.256, + "p95": 1.352 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.261167, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "images", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.400083, + "p50": 1.474334, + "p95": 2.008 + }, + "cpu_ms": { + "min": 1.401, + "p50": 1.463, + "p95": 1.892 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.474334, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "images", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.729708, + "p50": 0.788333, + "p95": 0.821167 + }, + "cpu_ms": { + "min": 0.73, + "p50": 0.788, + "p95": 0.821 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.788333, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "images", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.186167, + "p50": 0.222167, + "p95": 0.258209 + }, + "cpu_ms": { + "min": 0.287, + "p50": 0.409, + "p95": 0.499 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.222167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "images", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.859917, + "p50": 0.936667, + "p95": 1.018333 + }, + "cpu_ms": { + "min": 0.86, + "p50": 0.936, + "p95": 1.018 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.936667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.093917, + "p50": 1.142584, + "p95": 1.190042 + }, + "cpu_ms": { + "min": 1.094, + "p50": 1.143, + "p95": 1.19 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.142584, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.75575, + "p50": 0.814833, + "p95": 0.853917 + }, + "cpu_ms": { + "min": 0.756, + "p50": 0.815, + "p95": 0.854 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.814833, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.08425, + "p50": 1.127166, + "p95": 1.2955 + }, + "cpu_ms": { + "min": 1.085, + "p50": 1.127, + "p95": 1.199 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.127166, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.47875, + "p50": 1.581292, + "p95": 2.054458 + }, + "cpu_ms": { + "min": 1.478, + "p50": 1.556, + "p95": 1.941 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.581292, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "pivot_tables", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.049667, + "p50": 0.05025, + "p95": 0.051084 + }, + "cpu_ms": { + "min": 0.049, + "p50": 0.051, + "p95": 0.051 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.05025, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "pivot_tables", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.455708, + "p50": 0.470917, + "p95": 0.522708 + }, + "cpu_ms": { + "min": 0.456, + "p50": 0.471, + "p95": 0.523 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.470917, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.494292, + "p50": 0.504791, + "p95": 0.551917 + }, + "cpu_ms": { + "min": 0.495, + "p50": 0.504, + "p95": 0.551 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.504791, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.725, + "p50": 0.824041, + "p95": 0.841333 + }, + "cpu_ms": { + "min": 0.724, + "p50": 0.824, + "p95": 0.842 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.824041, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.212792, + "p50": 0.221166, + "p95": 0.226709 + }, + "cpu_ms": { + "min": 0.212, + "p50": 0.221, + "p95": 0.227 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.221166, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "pivot_tables", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.85, + "p50": 0.903625, + "p95": 0.962958 + }, + "cpu_ms": { + "min": 0.849, + "p50": 0.904, + "p95": 0.962 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.903625, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.17675, + "p50": 1.21075, + "p95": 1.264333 + }, + "cpu_ms": { + "min": 1.177, + "p50": 1.211, + "p95": 1.264 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.21075, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.178708, + "p50": 0.182083, + "p95": 0.186792 + }, + "cpu_ms": { + "min": 0.179, + "p50": 0.182, + "p95": 0.186 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.182083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "pivot_tables", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.040125, + "p50": 1.157792, + "p95": 1.389166 + }, + "cpu_ms": { + "min": 1.04, + "p50": 1.158, + "p95": 1.39 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.157792, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.327166, + "p50": 1.411292, + "p95": 1.805458 + }, + "cpu_ms": { + "min": 1.327, + "p50": 1.411, + "p95": 1.748 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.411292, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "pivot_tables", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.555709, + "p50": 1.685625, + "p95": 2.193958 + }, + "cpu_ms": { + "min": 1.556, + "p50": 1.686, + "p95": 2.194 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.685625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "pivot_tables", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.719084, + "p50": 0.740041, + "p95": 0.811084 + }, + "cpu_ms": { + "min": 0.719, + "p50": 0.74, + "p95": 0.812 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.740041, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "pivot_tables", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.178334, + "p50": 0.226958, + "p95": 0.272375 + }, + "cpu_ms": { + "min": 0.222, + "p50": 0.358, + "p95": 0.477 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.226958, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "pivot_tables", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.804792, + "p50": 0.902042, + "p95": 0.931542 + }, + "cpu_ms": { + "min": 0.805, + "p50": 0.902, + "p95": 0.932 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.902042, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.121541, + "p50": 1.189833, + "p95": 1.264667 + }, + "cpu_ms": { + "min": 1.122, + "p50": 1.19, + "p95": 1.225 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.189833, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.073417, + "p50": 1.134875, + "p95": 1.207 + }, + "cpu_ms": { + "min": 1.073, + "p50": 1.135, + "p95": 1.206 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.134875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.363459, + "p50": 1.52925, + "p95": 1.750417 + }, + "cpu_ms": { + "min": 1.364, + "p50": 1.529, + "p95": 1.75 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.52925, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.964083, + "p50": 2.08, + "p95": 2.548875 + }, + "cpu_ms": { + "min": 1.964, + "p50": 2.081, + "p95": 2.549 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.08, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "comments", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.056375, + "p50": 0.063667, + "p95": 0.065708 + }, + "cpu_ms": { + "min": 0.056, + "p50": 0.064, + "p95": 0.066 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.063667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "comments", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.100166, + "p50": 1.14, + "p95": 1.239417 + }, + "cpu_ms": { + "min": 1.1, + "p50": 1.14, + "p95": 1.241 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.14, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.566125, + "p50": 0.614, + "p95": 0.668833 + }, + "cpu_ms": { + "min": 0.566, + "p50": 0.614, + "p95": 0.668 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.614, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.099083, + "p50": 1.120875, + "p95": 1.139167 + }, + "cpu_ms": { + "min": 1.099, + "p50": 1.121, + "p95": 1.14 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.120875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature" + }, + { + "feature": "comments", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "comments", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.097292, + "p50": 1.147542, + "p95": 1.183875 + }, + "cpu_ms": { + "min": 1.098, + "p50": 1.148, + "p95": 1.183 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.147542, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature" + }, + { + "feature": "comments", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read unsupported; Write failed: UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments" + }, + { + "feature": "comments", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.181167, + "p50": 1.263459, + "p95": 1.374875 + }, + "cpu_ms": { + "min": 1.181, + "p50": 1.263, + "p95": 1.376 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.263459, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.171625, + "p50": 1.241375, + "p95": 1.4015 + }, + "cpu_ms": { + "min": 1.172, + "p50": 1.241, + "p95": 1.402 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.241375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "comments", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.39375, + "p50": 1.495208, + "p95": 1.83075 + }, + "cpu_ms": { + "min": 1.394, + "p50": 1.495, + "p95": 1.831 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.495208, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "comments", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.807833, + "p50": 0.87075, + "p95": 0.902291 + }, + "cpu_ms": { + "min": 0.808, + "p50": 0.87, + "p95": 0.902 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.87075, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "comments", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.191542, + "p50": 0.236292, + "p95": 0.321208 + }, + "cpu_ms": { + "min": 0.291, + "p50": 0.452, + "p95": 0.81 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.236292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "comments", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.947333, + "p50": 1.014208, + "p95": 1.072 + }, + "cpu_ms": { + "min": 0.947, + "p50": 1.013, + "p95": 1.072 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.014208, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.076083, + "p50": 1.117542, + "p95": 1.171666 + }, + "cpu_ms": { + "min": 1.076, + "p50": 1.118, + "p95": 1.172 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.117542, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.314542, + "p50": 1.374334, + "p95": 1.797584 + }, + "cpu_ms": { + "min": 1.314, + "p50": 1.375, + "p95": 1.797 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.374334, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.862709, + "p50": 1.905666, + "p95": 2.106208 + }, + "cpu_ms": { + "min": 1.862, + "p50": 1.906, + "p95": 2.106 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.905666, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.800208, + "p50": 1.879125, + "p95": 2.276791 + }, + "cpu_ms": { + "min": 1.8, + "p50": 1.879, + "p95": 2.276 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.879125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "freeze_panes", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.048959, + "p50": 0.051417, + "p95": 0.056917 + }, + "cpu_ms": { + "min": 0.049, + "p50": 0.052, + "p95": 0.057 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.051417, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "freeze_panes", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.662958, + "p50": 0.695291, + "p95": 0.751167 + }, + "cpu_ms": { + "min": 0.663, + "p50": 0.696, + "p95": 0.752 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.695291, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.664875, + "p50": 0.740375, + "p95": 0.972334 + }, + "cpu_ms": { + "min": 0.665, + "p50": 0.741, + "p95": 0.967 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.740375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'; Write failed: UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature" + }, + { + "feature": "freeze_panes", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "freeze_panes", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.434792, + "p50": 1.483708, + "p95": 1.855208 + }, + "cpu_ms": { + "min": 1.434, + "p50": 1.485, + "p95": 1.856 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.483708, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write failed: UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature" + }, + { + "feature": "freeze_panes", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.19425, + "p50": 0.208041, + "p95": 0.224833 + }, + "cpu_ms": { + "min": 0.194, + "p50": 0.208, + "p95": 0.225 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.208041, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "freeze_panes", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.767125, + "p50": 1.803084, + "p95": 1.903125 + }, + "cpu_ms": { + "min": 1.767, + "p50": 1.803, + "p95": 1.903 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.803084, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 2.028334, + "p50": 2.073416, + "p95": 2.30275 + }, + "cpu_ms": { + "min": 2.028, + "p50": 2.073, + "p95": 2.302 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.073416, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "freeze_panes", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 2.03775, + "p50": 2.1045, + "p95": 2.613042 + }, + "cpu_ms": { + "min": 2.037, + "p50": 2.105, + "p95": 2.612 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 2.1045, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "freeze_panes", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.910958, + "p50": 0.983459, + "p95": 0.998875 + }, + "cpu_ms": { + "min": 0.912, + "p50": 0.983, + "p95": 0.999 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.983459, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "freeze_panes", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.374167, + "p50": 0.448584, + "p95": 0.59225 + }, + "cpu_ms": { + "min": 0.541, + "p50": 0.816, + "p95": 1.143 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.448584, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "freeze_panes", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.374125, + "p50": 1.401709, + "p95": 1.557625 + }, + "cpu_ms": { + "min": 1.374, + "p50": 1.402, + "p95": 1.552 + }, + "rss_peak_mb": 192.84375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.401709, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.867958, + "p50": 1.910625, + "p95": 2.111292 + }, + "cpu_ms": { + "min": 1.868, + "p50": 1.911, + "p95": 2.111 + }, + "rss_peak_mb": 192.921875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.910625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.049041, + "p50": 1.110459, + "p95": 1.139333 + }, + "cpu_ms": { + "min": 1.049, + "p50": 1.111, + "p95": 1.139 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.110459, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.358625, + "p50": 1.408083, + "p95": 1.472042 + }, + "cpu_ms": { + "min": 1.359, + "p50": 1.407, + "p95": 1.471 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.408083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.492917, + "p50": 1.570792, + "p95": 1.989 + }, + "cpu_ms": { + "min": 1.493, + "p50": 1.571, + "p95": 1.988 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.570792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "named_ranges", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.045458, + "p50": 0.046583, + "p95": 0.0515 + }, + "cpu_ms": { + "min": 0.045, + "p50": 0.047, + "p95": 0.051 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.046583, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "named_ranges", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.464333, + "p50": 0.485458, + "p95": 0.526375 + }, + "cpu_ms": { + "min": 0.465, + "p50": 0.485, + "p95": 0.527 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.485458, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.502958, + "p50": 0.54175, + "p95": 0.568083 + }, + "cpu_ms": { + "min": 0.504, + "p50": 0.541, + "p95": 0.568 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.54175, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.217333, + "p50": 0.232458, + "p95": 0.253541 + }, + "cpu_ms": { + "min": 0.217, + "p50": 0.232, + "p95": 0.253 + }, + "rss_peak_mb": 192.9375, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.232458, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'" + }, + { + "feature": "named_ranges", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "named_ranges", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.191459, + "p50": 1.242083, + "p95": 1.340917 + }, + "cpu_ms": { + "min": 1.191, + "p50": 1.243, + "p95": 1.341 + }, + "rss_peak_mb": 193.0625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.242083, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.383167, + "p50": 1.488375, + "p95": 4.763333 + }, + "cpu_ms": { + "min": 1.384, + "p50": 1.488, + "p95": 1.932 + }, + "rss_peak_mb": 193.0625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.488375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.14525, + "p50": 0.15575, + "p95": 0.166875 + }, + "cpu_ms": { + "min": 0.145, + "p50": 0.156, + "p95": 0.167 + }, + "rss_peak_mb": 193.0625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.15575, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "named_ranges", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.459167, + "p50": 1.572125, + "p95": 2.062875 + }, + "cpu_ms": { + "min": 1.459, + "p50": 1.572, + "p95": 2.063 + }, + "rss_peak_mb": 193.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.572125, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.572625, + "p50": 1.775708, + "p95": 2.037792 + }, + "cpu_ms": { + "min": 1.573, + "p50": 1.775, + "p95": 2.031 + }, + "rss_peak_mb": 193.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.775708, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "named_ranges", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.601667, + "p50": 1.684583, + "p95": 2.174416 + }, + "cpu_ms": { + "min": 1.601, + "p50": 1.685, + "p95": 2.174 + }, + "rss_peak_mb": 193.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.684583, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "named_ranges", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.805084, + "p50": 0.870667, + "p95": 0.901417 + }, + "cpu_ms": { + "min": 0.805, + "p50": 0.871, + "p95": 0.901 + }, + "rss_peak_mb": 193.125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.870667, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "named_ranges", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.3055, + "p50": 0.365959, + "p95": 0.462 + }, + "cpu_ms": { + "min": 0.528, + "p50": 1.176, + "p95": 1.652 + }, + "rss_peak_mb": 193.171875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.365959, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "named_ranges", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.117666, + "p50": 1.188875, + "p95": 1.212417 + }, + "cpu_ms": { + "min": 1.117, + "p50": 1.19, + "p95": 1.213 + }, + "rss_peak_mb": 193.21875, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.188875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.280375, + "p50": 1.358625, + "p95": 3.560375 + }, + "cpu_ms": { + "min": 1.28, + "p50": 1.358, + "p95": 1.597 + }, + "rss_peak_mb": 193.3125, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.358625, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "openpyxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.41925, + "p50": 1.442292, + "p95": 1.850875 + }, + "cpu_ms": { + "min": 1.42, + "p50": 1.442, + "p95": 1.85 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.442292, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.0715, + "p50": 1.128875, + "p95": 1.295875 + }, + "cpu_ms": { + "min": 1.072, + "p50": 1.128, + "p95": 1.296 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.128875, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlsxwriter", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.324542, + "p50": 1.4475, + "p95": 1.833041 + }, + "cpu_ms": { + "min": 1.324, + "p50": 1.447, + "p95": 1.831 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.4475, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "tables", + "library": "python-calamine", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.049167, + "p50": 0.050167, + "p95": 0.055542 + }, + "cpu_ms": { + "min": 0.048, + "p50": 0.05, + "p95": 0.056 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.050167, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "tables", + "library": "wolfxl", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.499375, + "p50": 0.519, + "p95": 0.557166 + }, + "cpu_ms": { + "min": 0.5, + "p50": 0.519, + "p95": 0.558 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.519, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 0.461458, + "p50": 0.488959, + "p95": 0.518417 + }, + "cpu_ms": { + "min": 0.462, + "p50": 0.49, + "p95": 0.518 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.488959, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "pylightxl", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.200042, + "p50": 0.211208, + "p95": 0.224292 + }, + "cpu_ms": { + "min": 0.201, + "p50": 0.211, + "p95": 0.224 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.211208, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read failed: TypeError: expected string or bytes-like object, got 'NoneType'" + }, + { + "feature": "tables", + "library": "xlrd", + "workload_size": "small", + "perf": { + "read": null, + "write": null + }, + "notes": "Write unsupported; Read not applicable: xlrd does not support .xlsx input" + }, + { + "feature": "tables", + "library": "pyexcel", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.771583, + "p50": 1.811584, + "p95": 2.2325 + }, + "cpu_ms": { + "min": 1.772, + "p50": 1.811, + "p95": 2.232 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.811584, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.086708, + "p50": 1.132083, + "p95": 1.196208 + }, + "cpu_ms": { + "min": 1.086, + "p50": 1.132, + "p95": 1.197 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.132083, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlwt", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 0.13025, + "p50": 0.138959, + "p95": 0.149583 + }, + "cpu_ms": { + "min": 0.129, + "p50": 0.139, + "p95": 0.149 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 0.138959, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "tables", + "library": "pandas", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.644292, + "p50": 1.682792, + "p95": 1.781709 + }, + "cpu_ms": { + "min": 1.644, + "p50": 1.682, + "p95": 1.782 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.682792, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.182542, + "p50": 1.231125, + "p95": 1.29525 + }, + "cpu_ms": { + "min": 1.182, + "p50": 1.23, + "p95": 1.295 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.231125, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + }, + { + "feature": "tables", + "library": "xlsxwriter-constmem", + "workload_size": "small", + "perf": { + "read": null, + "write": { + "wall_ms": { + "min": 1.406916, + "p50": 1.458375, + "p95": 1.788292 + }, + "cpu_ms": { + "min": 1.406, + "p50": 1.459, + "p95": 1.789 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.458375, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": "Read unsupported" + }, + { + "feature": "tables", + "library": "openpyxl-readonly", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.918125, + "p50": 0.931875, + "p95": 0.94775 + }, + "cpu_ms": { + "min": 0.918, + "p50": 0.933, + "p95": 0.947 + }, + "rss_peak_mb": 193.75, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.931875, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "tables", + "library": "polars", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 0.306167, + "p50": 0.365458, + "p95": 0.54425 + }, + "cpu_ms": { + "min": 0.866, + "p50": 1.392, + "p95": 2.043 + }, + "rss_peak_mb": 194.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.365458, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": null + }, + "notes": "Write unsupported" + }, + { + "feature": "tables", + "library": "tablib", + "workload_size": "small", + "perf": { + "read": { + "wall_ms": { + "min": 1.372333, + "p50": 1.399042, + "p95": 1.423625 + }, + "cpu_ms": { + "min": 1.373, + "p50": 1.399, + "p95": 1.424 + }, + "rss_peak_mb": 194.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 1.399042, + "write": 0.0, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + }, + "write": { + "wall_ms": { + "min": 1.076375, + "p50": 1.139792, + "p95": 1.201583 + }, + "cpu_ms": { + "min": 1.076, + "p50": 1.139, + "p95": 1.202 + }, + "rss_peak_mb": 194.15625, + "breakdown_ms": null, + "phase_attribution_ms": { + "parse": 0.0, + "write": 1.139792, + "verify": 0.0 + }, + "op_count": null, + "op_unit": null, + "rss_kb_via_time": null, + "python_heap_peak_kb": null + } + }, + "notes": null + } + ] +} \ No newline at end of file diff --git a/results-2026-10-03/perf/run-log.txt b/results-2026-10-03/perf/run-log.txt new file mode 100644 index 0000000..46e13aa --- /dev/null +++ b/results-2026-10-03/perf/run-log.txt @@ -0,0 +1,70 @@ +date_gate_passed 2026-10-03T00:00:02Z +gate_check 00:00:02Z load1=2.75 +start_utc 2026-10-03T00:00:02Z +load_before { 2.75 3.27 3.08 } + %CPU COMM +107.2 [background agent process, path redacted] + 15.6 /System/Library/PrivateFrameworks/CoreAnalytics.framework/Support/analyticsd + 14.9 /usr/libexec/searchpartyuseragent +CMD: excelbench perf --tests fixtures/excel --output ../out --profile xlsx --warmup 3 --iters 25 --iteration-policy fixed --memory-mode getrusage --feature cell_values --feature formulas --feature text_formatting --feature background_colors --feature number_formats --feature alignment --feature borders --feature dimensions --feature multiple_sheets --feature merged_cells --feature conditional_formatting --feature data_validation --feature hyperlinks --feature images --feature pivot_tables --feature comments --feature freeze_panes --feature named_ranges --feature tables --adapter openpyxl --adapter xlsxwriter --adapter python-calamine --adapter wolfxl --adapter pylightxl --adapter xlrd --adapter pyexcel --adapter xlwt --adapter pandas --adapter xlsxwriter-constmem --adapter openpyxl-readonly --adapter polars --adapter tablib +Running performance benchmark... + Profile: xlsx + Test files: fixtures/excel + Output: ../out/perf + Warmup: 3 + Iterations: 25 + Iteration policy: fixed + Breakdown: False + Memory mode: getrusage + Adapters: openpyxl, xlsxwriter, python-calamine, wolfxl, pylightxl, xlrd, +pyexcel, xlwt, pandas, xlsxwriter-constmem, openpyxl-readonly, polars, tablib + +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +~/wolf-lane/officelibs-perf-2026-10-03/venv/lib/python3.12/site-packages/excelbench/harness/adapters/polars_adapter.py:97: FutureWarning: from_arrow() will return a Series instead of a DataFrame in 2.0. To avoid this warning, pass the ArrowStreamExportable to either `pl.DataFrame` or `pl.Series` instead based on your desired output type. + frames = pl.read_excel( +✓ Performance results written to ../out/perf + - ../out/perf/results.json + - ../out/perf/README.md + - ../out/perf/matrix.csv + - ../out/perf/history.jsonl +real 14.54 +user 10.73 +sys 2.79 +exit_code 0 +load_after { 2.93 3.29 3.08 } +end_utc 2026-10-03T00:00:17Z diff --git a/results-2026-10-03/perf/run.sh b/results-2026-10-03/perf/run.sh new file mode 100755 index 0000000..ec28c8a --- /dev/null +++ b/results-2026-10-03/perf/run.sh @@ -0,0 +1,25 @@ +#!/bin/zsh +set -u +cd "$HOME/wolf-lane/officelibs-perf-2026-10-03/src" +F=(cell_values formulas text_formatting background_colors number_formats alignment borders dimensions multiple_sheets merged_cells conditional_formatting data_validation hyperlinks images pivot_tables comments freeze_panes named_ranges tables) +A=(openpyxl xlsxwriter python-calamine wolfxl pylightxl xlrd pyexcel xlwt pandas xlsxwriter-constmem openpyxl-readonly polars tablib) +args=() +for f in $F; do args+=(--feature $f); done +for a in $A; do args+=(--adapter $a); done +until [[ "$(date -u +%F)" == "2026-10-03" ]]; do sleep 15; done +echo "date_gate_passed $(date -u +%Y-%m-%dT%H:%M:%SZ)" +for i in $(seq 1 60); do + l1=$(sysctl -n vm.loadavg | awk "{print \$2}") + echo "gate_check $(date -u +%H:%M:%SZ) load1=$l1" + if (( l1 <= 4.0 )); then break; fi + sleep 10 +done +echo "start_utc $(date -u +%Y-%m-%dT%H:%M:%SZ)" +echo "load_before $(sysctl -n vm.loadavg)" +ps -Ao pcpu,comm -r | head -4 +echo "CMD: excelbench perf --tests fixtures/excel --output ../out --profile xlsx --warmup 3 --iters 25 --iteration-policy fixed --memory-mode getrusage ${args[*]}" +/usr/bin/time -p ../venv/bin/excelbench perf --tests fixtures/excel --output ../out --profile xlsx --warmup 3 --iters 25 --iteration-policy fixed --memory-mode getrusage "${args[@]}" +rc=$? +echo "exit_code $rc" +echo "load_after $(sysctl -n vm.loadavg)" +echo "end_utc $(date -u +%Y-%m-%dT%H:%M:%SZ)" diff --git a/results/perf/README.md b/results/perf/README.md index 70df5e8..f705372 100644 --- a/results/perf/README.md +++ b/results/perf/README.md @@ -7,7 +7,7 @@ *Commit: 0aeaf16* *Config: warmup=3 iters=25 iteration_policy=fixed breakdown=False* -> **Superseded for WolfXL.** The `wolfxl` columns in this snapshot measured private backend objects in `wolfxl._rust` (`cal=0.4.0+rxw=0.79.4`), not WolfXL's public API, so they are not comparable with the other libraries' public-API numbers. Use the [2026-10-02 perf snapshot](../../results-2026-10-02/perf/README.md), which measures WolfXL 2.0.5 through `wolfxl.load_workbook` and `wolfxl.Workbook`. +> **Superseded for WolfXL.** The `wolfxl` columns in this snapshot measured private backend objects in `wolfxl._rust` (`cal=0.4.0+rxw=0.79.4`), not WolfXL's public API, so they are not comparable with the other libraries' public-API numbers. Use the [2026-10-03 perf snapshot](../../results-2026-10-03/perf/README.md), which measures WolfXL 2.0.8 through `wolfxl.load_workbook` and `wolfxl.Workbook`. ## Notes From 4abc15b44fb6c2a229384992d3bd40fbbe0d9221 Mon Sep 17 00:00:00 2001 From: Wolfgang Schoenberger <221313372+wolfiesch@users.noreply.github.com> Date: Fri, 2 Oct 2026 17:30:56 -0700 Subject: [PATCH 3/3] Cite 2026-10-03 WolfXL 2.0.8 fidelity, mutation and calc results in the docs --- README.md | 2 +- docs-site/adapters/openpyxl.mdx | 2 +- docs-site/adapters/wolfxl.mdx | 8 +++++--- docs-site/index.mdx | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 596146b..4112f48 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Use this when the question is: which engine actually computes a 133-formula fina ### Key Findings - **High-fidelity libraries are rare**: in the 2026-04-29 release snapshot, only openpyxl and WolfXL reached 18/18 green features; in the 2026-10-03 competitor snapshot (21 scored features; `pivot_tables` unscored), openpyxl 3.1.5 and WolfXL 2.0.8 both hold 21/21 read and 21/21 write and pass all 133 tests in each mode. The next best are ExcelJS (15/21 write) and xlsxwriter (15/21 write) -- **WolfXL 2.1.0 regression signal**: conditional-formatting read scores 0 and named-range / print-title writes score 2 in the 2026-09-08 snapshot; tracked for the WolfXL repo +- **WolfXL 2.1.0 regression signal (2026-09-08)**: conditional-formatting read scored 0 and named-range / print-title writes scored 2 in the 2026-09-08 snapshot; WolfXL 2.0.8 scores 3 on all three in the 2026-10-03 snapshot - **Patch modify is structurally different**: WolfXL's `load_workbook(path, modify=True)` uses surgical ZIP patching; it is the only engine whose output keeps every template feature in the 2026-10-03 mutation suite - **The abstraction tax is real**: pandas wraps openpyxl but drops from 16 to 3 green features due to DataFrame coercion (errors become NaN) - **Speed vs fidelity tradeoff is measurable**: use the perf snapshot together with the fidelity matrix rather than quoting one without the other diff --git a/docs-site/adapters/openpyxl.mdx b/docs-site/adapters/openpyxl.mdx index 1a24260..1aeeb41 100644 --- a/docs-site/adapters/openpyxl.mdx +++ b/docs-site/adapters/openpyxl.mdx @@ -53,4 +53,4 @@ wb = load_workbook("data.xlsx", read_only=True) openpyxl is **slow** by default. For large files: - Use `read_only=True` for reading (no in-memory model built) -- Consider WolfXL for a 1.73x read and 2.45x write speedup (2026-10-03 perf snapshot: WolfXL 2.0.8 `wolfxl.load_workbook` 13.90 ms vs openpyxl 24.01 ms, write 11.26 ms vs 27.59 ms, summed p50 over 19 features); in the 2026-10-02 fidelity snapshot WolfXL has 17/21 features green in both read and write against openpyxl's 21/21 +- Consider WolfXL for a 1.73x read and 2.45x write speedup (2026-10-03 perf snapshot: WolfXL 2.0.8 `wolfxl.load_workbook` 13.90 ms vs openpyxl 24.01 ms, write 11.26 ms vs 27.59 ms, summed p50 over 19 features); in the 2026-10-03 fidelity snapshot WolfXL 2.0.8 ties openpyxl at 21/21 features green in both read and write diff --git a/docs-site/adapters/wolfxl.mdx b/docs-site/adapters/wolfxl.mdx index 3991f1b..d872b83 100644 --- a/docs-site/adapters/wolfxl.mdx +++ b/docs-site/adapters/wolfxl.mdx @@ -52,17 +52,19 @@ Large static content in a template (images, charts, pivot tables) is never parse ## Benchmark Scores -Fidelity from the 2026-10-02 snapshot (WolfXL 2.0.5; `results-2026-10-02/xlsx`, 21 scored features with `pivot_tables` unscored); speed from the 2026-10-03 perf snapshot (WolfXL 2.0.8; `results-2026-10-03/perf`): +From the 2026-10-03 snapshot (WolfXL 2.0.8): fidelity from `results-2026-10-03/xlsx` (21 scored features; `pivot_tables` is unscored for every adapter), mutation from `results-2026-10-03/mutation`, calc from `results-2026-10-03/calc`, speed from `results-2026-10-03/perf`: | Axis | Score | |------|-------| -| Fidelity | 17/21 features green in both read and write (read 19/21, write 18/21) | +| Fidelity | 21/21 features green in both read and write, tied with openpyxl 3.1.5 (21/21 read and write) | | Read Speed | 1.73x openpyxl (WolfXL 2.0.8 public API) | | Write Speed | 2.45x openpyxl (WolfXL 2.0.8 public API) | | Feature Coverage | 100% (21/21 features score at least 1 in read or write) | +| Template mutation | Preserved, 17/17 template features kept (openpyxl 16/17) | +| Calc | Community 2.0.8 calculates 133/133 formulas, but its `save()` writes 0/133 calculated values; Commercial 2.3.0 calculates and saves 133/133 | | Capability Breadth | 100 (R+W+Modify) | -Known gaps: `named_ranges` read 2/3 and write 2/3, `tables` read 2/3, `page_setup` write 2/3, `chart_anchor` write 0/3. +Every scored feature is 3/3 in both read and write, so there are no fidelity gaps in this snapshot. ## Source diff --git a/docs-site/index.mdx b/docs-site/index.mdx index 5848f45..e8ab85b 100644 --- a/docs-site/index.mdx +++ b/docs-site/index.mdx @@ -21,7 +21,7 @@ ExcelBench scores Python Excel libraries on two dimensions: - **Fidelity** — does the library correctly read and write Excel features? - **Performance** — how fast is it, and how much memory does it use? -In the 2026-10-02 snapshot it scores **21 features** (22 fixtures; `pivot_tables` is unscored) across **17 adapters**, using Excel-generated fixtures as ground truth (the three Tier 4 fixtures are openpyxl-structural). Every score is reproducible from a single command. +In the 2026-10-03 snapshot it scores **21 features** (22 fixtures; `pivot_tables` is unscored) across **17 adapters**, using Excel-generated fixtures as ground truth (the three Tier 4 fixtures are openpyxl-structural). Every score is reproducible from a single command.

rem0-x-X5KmIl$dSba@0{8%o)(ivVd=o>Qri`*a z1L@*yM7jxCflggA6;zf!zhN>nwd%2&_$sAm~X`b)65yv(&hO(NS0y| z?6)W{mkVD-j8;WD+mnEzs101E%MVAH(^SeRC%5iRH;xUSV_1fnw7L2u;p^DOTw@THa>|jupo)s7Y_LunKol?c=ziZZbnsEdz z(E}+LuI$MPOzAuwCn!>*K!cOU(#344+$O-qP-W!q;iJCl@?M&;PzEi9ze;!{irU7e zQGXGr0xLQD^y%5zU!{v6;s64dcAVhUC_p0sbpa`=WI*mTLj4{-yq_b6&Q5Z1E^k(f z+|XHAXO)x|;>8M9?m5EFxm|vWRdNGeWQL9?FQ{~md!Ihph)sruggY&k^o_@xYa!k7 zD$!zR<_Qduef@NbE{8IEo~inUB{1~L&ZH#Z+O8I{93ovjDS|;&ALmuqcasSE#T{c$ zeVYp@XC7tOT<0J2*33YCVlyD=dr1wRFMjZ*c%8HGez@I@8DtNYdfzV+k^MCbT^_Nv z+DJBRcJz`$rpSri$?*~5*2}H#`PI#cAMNmt4X{aE0FJM})xdvb>YrQWIC0IQivXop zm-H6s3$&GC2TY#6A)BTyf22wW?}k|h&olFYa7{I%z=3k*W3=w0a14Gt53^imxxIdb zQlxg2{knu28lES)mP0<|kOAd}ucls$3#6spw}tl`<9>S9asu5ZP6(vcH(dI|rCWob zq)5#LfgXaA{+F>=DTz)@iRy@FUM_%#ZJF?OM8v01_twaU_JKgqDjD-m8!zTye%6me z6&C4Slpiqs&o3MK49D+yUsJiHTkw2xv_(S$VCaap~_ybU)zlphq z+(12%^8my&7cIi~GVJmp`$v%oe##V_!jIUDQ+wG>-yT7~XYZR0w9<@4VCX<(_SoT_ zF$Svw?=fhBHHU9Fw+qACg6L#3Jhdc7c*Kxz(9Ir1T(X45j9>8UBy?Zh*Kf^kB$kPB zn!|t3-ac&-9eP`D|HahY0gUAdGykWU0)wD{{+uN!K>6>tDFBVXe)9c(R{!#D#cP1q z+5LZ!0|DjxRRfmfAG!Xo3126{|0e7LtRp}P|BsaT*Ep}!!++zP1HvExoPQ>Zzb1a2 z-Ta%_7O->wCjPHn=hrB&lX`xmw8Fhc`PUSm*MP6{VSWQn12W+MWmv!L+1DtqBg?;0 z#sLEGFDSp_%&$>i2bF%KU}OG5`5j_vc3J^{J zAiNGGyassfqWTRGLHI8YtJmbO-9Ep`U5Nfc{$NB2Hx>=aKe7IU@*3c^Tj4jr#(x3)b~3z1d3}HXjnYc`YeD{b%lf5xUn9J} znf*o}qxdg`f0gUkHui6XkCcBQ{F}x7dK|B9+21IhfL9#=qV=Bx`>*Bs=dt~-EA-lq z{0%5i{U_kRS(UGc_u7K^jaESWC)z&;_8R5&(fAt$iT)SLe;t%^lHd?Od!Yk<2?5`v I7=AweKL}!YH~;_u literal 0 HcmV?d00001 diff --git a/results-2026-10-03/pins.txt b/results-2026-10-03/pins.txt new file mode 100644 index 0000000..5a37ab2 --- /dev/null +++ b/results-2026-10-03/pins.txt @@ -0,0 +1,14 @@ +wolfxl==2.0.8 +openpyxl==3.1.5 +xlsxwriter==3.2.9 +python-calamine==0.8.2 +aspose-cells-foss==26.7.0 +pylightxl==1.61 +xlrd==2.0.2 +pyexcel==0.7.6 +pyexcel-xlsx==0.6.1 +xlwt==1.3.0 +pandas==3.0.6 +polars==1.44.2 +fastexcel==0.21.0 +tablib[xlsx]==3.10.0 diff --git a/results-2026-10-03/pip-freeze.txt b/results-2026-10-03/pip-freeze.txt new file mode 100644 index 0000000..f02779a --- /dev/null +++ b/results-2026-10-03/pip-freeze.txt @@ -0,0 +1,51 @@ +annotated-doc==0.0.5 +annotated-types==0.8.0 +appscript==1.4.0 +aspose-cells-foss==26.7.0 +contourpy==1.4.0 +cycler==0.12.1 +defusedxml==0.7.1 +et-xmlfile==2.0.0 +fastexcel==0.21.0 +fonttools==4.66.1 +kiwisolver==1.5.1 +lml==0.2.0 +lxml==6.1.3 +markdown-it-py==4.2.0 +matplotlib==3.11.2 +mdurl==0.1.2 +narwhals==2.26.0 +numpy==2.5.3 +olefile==0.47 +openpyxl==3.1.5 +packaging==26.3 +pandas==3.0.6 +pillow==12.3.0 +plotly==7.1.0 +polars==1.44.2 +polars-runtime-32==1.44.2 +psutil==7.2.2 +pycryptodome==3.23.0 +pydantic==2.13.5 +pydantic-core==2.46.5 +pyexcel==0.7.6 +pyexcel-io==0.6.8 +pyexcel-xlsx==0.6.1 +pygments==2.21.0 +pylightxl==1.61 +pyparsing==3.3.3 +python-calamine==0.8.2 +python-dateutil==2.9.0.post0 +rich==15.0.0 +shellingham==1.5.4 +six==1.17.0 +tablib==3.10.0 +texttable==1.7.0 +typer==0.27.2 +typing-extensions==4.16.0 +typing-inspection==0.4.4 +wolfxl==2.0.8 +xlrd==2.0.2 +xlsxwriter==3.2.9 +xlwings==0.37.5 +xlwt==1.3.0 diff --git a/results-2026-10-03/run-log.txt b/results-2026-10-03/run-log.txt new file mode 100644 index 0000000..4b82dd3 --- /dev/null +++ b/results-2026-10-03/run-log.txt @@ -0,0 +1,11 @@ +start_utc 2026-10-03T00:00:01Z +load_start { 6.66 5.91 4.97 } +xlsx_exit 0 +cross_language_exit 0 +heatmap_exit 0 +gate_check 00:02:15Z load1=7.18 +mutation_load_before { 7.18 6.93 5.56 } +mutation_exit 0 +mutation_load_after { 21.30 11.57 7.66 } +calc_exit 0 +end_utc 2026-10-03T00:06:34Z diff --git a/results-2026-10-03/run.sh b/results-2026-10-03/run.sh new file mode 100755 index 0000000..21c55c5 --- /dev/null +++ b/results-2026-10-03/run.sh @@ -0,0 +1,51 @@ +#!/bin/zsh +# Runs the 2026-10-03 competitor snapshot lanes (fidelity, cross-language, +# mutation, calc) from the repository root. Perf is a separate run. +# +# Environment: +# EB_VENV venv with ExcelBench installed (-e .) and the pins in pins.txt +# EB_COMMERCIAL interpreter with the WolfXL Commercial 2.3.0 wheel installed +set -u +OUT=results-2026-10-03 +EB="$EB_VENV/bin/excelbench" + +if [[ "$(date -u +%F)" != "2026-10-03" ]]; then + echo "refusing to run: UTC date is $(date -u +%F)" + exit 2 +fi + +echo "start_utc $(date -u +%Y-%m-%dT%H:%M:%SZ)" +echo "load_start $(sysctl -n vm.loadavg)" + +# Fidelity and cross-language run side by side (cross-language work runs on the +# remote Docker host or in zavora's own process; no shared LibreOffice profile). +"$EB" benchmark -t fixtures/excel -o "$OUT/xlsx" \ + -a openpyxl -a xlsxwriter -a python-calamine -a aspose-cells-foss -a wolfxl \ + -a pylightxl -a xlrd -a pyexcel -a xlwt -a pandas -a xlsxwriter-constmem \ + -a openpyxl-readonly -a polars -a tablib -a sheetjs -a exceljs -a libreoffice \ + > "$OUT/logs/xlsx.log" 2>&1 & +xlsx_pid=$! +EXCELBENCH_ORACLE_DOCKER_CONTEXT=pc "$EB" cross-language-context \ + -t fixtures/excel -o "$OUT/cross-language" > "$OUT/logs/cross-language.log" 2>&1 & +xl_pid=$! +wait $xlsx_pid; echo "xlsx_exit $?" +wait $xl_pid; echo "cross_language_exit $?" +"$EB" heatmap -i "$OUT/xlsx/results.json" -o "$OUT/xlsx" > "$OUT/logs/heatmap.log" 2>&1 +echo "heatmap_exit $?" + +# Mutation timings: wait (up to 10 min) for the 1-minute load to drop to 8 or less. +for i in $(seq 1 60); do + l1=$(sysctl -n vm.loadavg | awk '{print $2}') + echo "gate_check $(date -u +%H:%M:%SZ) load1=$l1" + if (( l1 <= 8.0 )); then break; fi + sleep 10 +done +echo "mutation_load_before $(sysctl -n vm.loadavg)" +"$EB" mutation -o "$OUT/mutation" --repeats 3 > "$OUT/logs/mutation.log" 2>&1 +echo "mutation_exit $?" +echo "mutation_load_after $(sysctl -n vm.loadavg)" + +EXCELBENCH_WOLFXL_COMMERCIAL_PYTHON="$EB_COMMERCIAL" "$EB" calc -o "$OUT/calc" \ + > "$OUT/logs/calc.log" 2>&1 +echo "calc_exit $?" +echo "end_utc $(date -u +%Y-%m-%dT%H:%M:%SZ)" diff --git a/results-2026-10-03/xlsx/FIDELITY_DELTAS.md b/results-2026-10-03/xlsx/FIDELITY_DELTAS.md new file mode 100644 index 0000000..a91d7e9 --- /dev/null +++ b/results-2026-10-03/xlsx/FIDELITY_DELTAS.md @@ -0,0 +1,3 @@ +# Fidelity Deltas + +Need at least two runs in history.jsonl. diff --git a/results-2026-10-03/xlsx/README.md b/results-2026-10-03/xlsx/README.md new file mode 100644 index 0000000..6292322 --- /dev/null +++ b/results-2026-10-03/xlsx/README.md @@ -0,0 +1,4669 @@ +# ExcelBench Results + +*Generated: 2026-10-03 00:00 UTC* +*Profile: xlsx* +*Excel Version: 16.105.3* +*Platform: Darwin-arm64* + +## Overview + +> Condensed view — shows the **best score** across read/write for each library. See [Full Results Matrix](#full-results-matrix) for the complete R/W breakdown. + +**Tier 0 — Basic Values** + +| Feature | aspose-cells-foss | exceljs | libreoffice | openpyxl | opxl-readonly | pandas | polars | pyexcel | pylightxl | calamine | sheetjs | tablib | wolfxl | xlsxwriter | xlsx-constmem | xlwt | +|---------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +| Cell Values | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟠 | 🟢 | 🟢 | 🟠 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | +| Formulas | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🟢 | 🟢 | 🔴 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | +| Sheets | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟠 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | + +**Tier 1 — Formatting** + +| Feature | aspose-cells-foss | exceljs | libreoffice | openpyxl | opxl-readonly | pandas | polars | pyexcel | pylightxl | calamine | sheetjs | tablib | wolfxl | xlsxwriter | xlsx-constmem | xlwt | +|---------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +| Alignment | 🟠 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟠 | 🟠 | 🟢 | +| Bg Colors | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🟢 | 🟢 | 🟠 | +| Borders | 🟠 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟢 | 🟢 | 🟠 | +| Dimensions | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🟢 | 🟠 | 🟠 | +| Num Fmt | 🟢 | 🟢 | 🟠 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🟢 | 🟢 | 🟢 | +| Text Fmt | 🟠 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟢 | 🟢 | 🟠 | + +**Tier 2 — Advanced** + +| Feature | aspose-cells-foss | exceljs | libreoffice | openpyxl | opxl-readonly | pandas | polars | pyexcel | pylightxl | calamine | sheetjs | tablib | wolfxl | xlsxwriter | xlsx-constmem | xlwt | +|---------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +| chart_anchor | 🟢 | 🔴 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | +| Comments | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🟢 | 🔴 | 🔴 | +| Cond Fmt | 🟢 | 🟡 | 🟡 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟢 | 🟢 | 🔴 | +| Validation | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟢 | 🟢 | 🔴 | +| Freeze | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟢 | 🟢 | 🔴 | +| Hyperlinks | 🟢 | 🟡 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🟢 | 🟢 | 🔴 | +| Images | 🔴 | 🔴 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🟢 | 🔴 | 🔴 | +| Merged | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🟢 | 🟢 | 🔴 | +| page_setup | 🟠 | 🔴 | 🟠 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | +| sheet_protection | 🟢 | 🟢 | 🟡 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | + +**Tier 3 — Workbook Metadata** + +| Feature | aspose-cells-foss | exceljs | libreoffice | openpyxl | opxl-readonly | pandas | polars | pyexcel | pylightxl | calamine | sheetjs | tablib | wolfxl | xlsxwriter | xlsx-constmem | xlwt | +|---------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +| Named Ranges | 🟢 | 🟡 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | +| Tables | 🟠 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | 🔴 | 🔴 | + +## Library Tiers + +> Libraries ranked by their best capability (max of read/write green features). + +| Tier | Library | Caps | Modify | Green Features | Summary | +|:----:|---------|:----:|:------:|:--------------:|---------| +| **S** | openpyxl | R+W | Rewrite | 21/21 | Reference adapter — full read + write fidelity | +| **S** | wolfxl | R+W | Patch | 21/21 | Hybrid Rust+Python: openpyxl-compatible API with patch-mode modify | +| **A** | exceljs | R+W | Rewrite | 15/21 | 15/21 features with full fidelity | +| **A** | xlsxwriter | W | No | 15/21 | Best write-only option — full formatting support | +| **B** | aspose-cells-foss | R+W | Rewrite | 14/21 | 14/21 features with full fidelity | +| **B** | libreoffice | R+W | Rewrite | 12/21 | 12/21 features with full fidelity | +| **B** | xlsxwriter-constmem | W | No | 12/21 | Memory-optimized write — loses images, comments, row height | +| **B** | sheetjs | R+W | Rewrite | 9/21 | 9/21 features with full fidelity | +| **B** | xlwt | W | No | 4/21 | Legacy .xls writer — basic formatting subset | +| **C** | openpyxl-readonly | R | No | 3/21 | Streaming read — loses all formatting metadata | +| **C** | pandas | R+W | Rebuild | 3/21 | DataFrame abstraction — errors coerced to NaN on read | +| **C** | tablib | R+W | Rebuild | 3/21 | Dataset wrapper — matches pyexcel on fidelity | +| **C** | pyexcel | R+W | Rebuild | 2/21 | Meta-library wrapping openpyxl — preserves error values | +| **C** | pylightxl | R+W | Rebuild | 2/21 | Lightweight — basic values, no formatting API | +| **C** | python-calamine | R | No | 1/21 | Fast Rust-backed reader — cell values + sheet names only | +| **D** | polars | R | No | 0/21 | Rust DataFrame reader — columnar type coercion drops fidelity | + +## Score Legend + +| Score | Meaning | +|-------|---------| +| 🟢 3 | Complete — all basic and edge cases pass | +| 🟡 2 | Functional — all basic pass, one or more edge cases fail | +| 🟠 1 | Minimal — at least one basic case passes, but not all basic cases | +| 🔴 0 | Unsupported — errors or data loss | +| ➖ | Not applicable | + +## Full Results Matrix + +**Tier 0 — Basic Values** + +| Feature | aspose-cells-foss (R) | aspose-cells-foss (W) | exceljs (R) | exceljs (W) | libreoffice (R) | libreoffice (W) | openpyxl (R) | openpyxl (W) | openpyxl-readonly (R) | pandas (R) | pandas (W) | polars (R) | pyexcel (R) | pyexcel (W) | pylightxl (R) | pylightxl (W) | python-calamine (R) | sheetjs (R) | sheetjs (W) | tablib (R) | tablib (W) | wolfxl (R) | wolfxl (W) | xlrd (R) | xlsxwriter (W) | xlsxwriter-constmem (W) | xlwt (W) | +|---------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------| +| [cell_values](#cell_values-details) | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟠 1 | 🟢 3 | 🟠 1 | 🟢 3 | 🔴 0 | 🟢 3 | 🔴 0 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🟢 3 | +| [formulas](#formulas-details) | 🟢 3 | 🟢 3 | 🟠 1 | 🟢 3 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🟢 3 | 🔴 0 | 🔴 0 | 🟢 3 | 🔴 0 | 🟢 3 | 🔴 0 | 🟠 1 | 🟢 3 | 🔴 0 | 🟢 3 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🔴 0 | +| [multiple_sheets](#multiple_sheets-details) | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🟢 3 | + +**Tier 1 — Formatting** + +| Feature | aspose-cells-foss (R) | aspose-cells-foss (W) | exceljs (R) | exceljs (W) | libreoffice (R) | libreoffice (W) | openpyxl (R) | openpyxl (W) | openpyxl-readonly (R) | pandas (R) | pandas (W) | polars (R) | pyexcel (R) | pyexcel (W) | pylightxl (R) | pylightxl (W) | python-calamine (R) | sheetjs (R) | sheetjs (W) | tablib (R) | tablib (W) | wolfxl (R) | wolfxl (W) | xlrd (R) | xlsxwriter (W) | xlsxwriter-constmem (W) | xlwt (W) | +|---------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------| +| [alignment](#alignment-details) | 🟠 1 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟠 1 | 🟠 1 | 🟢 3 | +| [background_colors](#background_colors-details) | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🟠 1 | +| [borders](#borders-details) | 🟠 1 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🟠 1 | +| [dimensions](#dimensions-details) | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🟠 1 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟠 1 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟠 1 | 🟠 1 | +| [number_formats](#number_formats-details) | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟠 1 | 🟠 1 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🟢 3 | +| [text_formatting](#text_formatting-details) | 🟠 1 | 🔴 0 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🟠 1 | + +**Tier 2 — Advanced** + +| Feature | aspose-cells-foss (R) | aspose-cells-foss (W) | exceljs (R) | exceljs (W) | libreoffice (R) | libreoffice (W) | openpyxl (R) | openpyxl (W) | openpyxl-readonly (R) | pandas (R) | pandas (W) | polars (R) | pyexcel (R) | pyexcel (W) | pylightxl (R) | pylightxl (W) | python-calamine (R) | sheetjs (R) | sheetjs (W) | tablib (R) | tablib (W) | wolfxl (R) | wolfxl (W) | xlrd (R) | xlsxwriter (W) | xlsxwriter-constmem (W) | xlwt (W) | +|---------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------| +| [chart_anchor](#chart_anchor-details) | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🔴 0 | 🔴 0 | 🔴 0 | +| [comments](#comments-details) | 🟢 3 | 🔴 0 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🔴 0 | 🔴 0 | +| [conditional_formatting](#conditional_formatting-details) | 🟢 3 | 🟢 3 | 🟡 2 | 🟡 2 | 🟡 2 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🔴 0 | +| [data_validation](#data_validation-details) | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟡 2 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🔴 0 | +| [freeze_panes](#freeze_panes-details) | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟡 2 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🔴 0 | +| [hyperlinks](#hyperlinks-details) | 🔴 0 | 🟢 3 | 🔴 0 | 🟡 2 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🔴 0 | +| [images](#images-details) | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🔴 0 | 🔴 0 | +| [merged_cells](#merged_cells-details) | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟡 2 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🟢 3 | 🟢 3 | 🔴 0 | +| [page_setup](#page_setup-details) | 🟠 1 | 🔴 0 | 🔴 0 | 🔴 0 | 🟠 1 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🔴 0 | 🔴 0 | 🔴 0 | +| [pivot_tables](#pivot_tables-details) | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | ➖ | +| [sheet_protection](#sheet_protection-details) | 🟢 3 | 🟢 3 | 🟠 1 | 🟢 3 | 🔴 0 | 🟡 2 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🔴 0 | 🔴 0 | 🔴 0 | + +**Tier 3 — Workbook Metadata** + +| Feature | aspose-cells-foss (R) | aspose-cells-foss (W) | exceljs (R) | exceljs (W) | libreoffice (R) | libreoffice (W) | openpyxl (R) | openpyxl (W) | openpyxl-readonly (R) | pandas (R) | pandas (W) | polars (R) | pyexcel (R) | pyexcel (W) | pylightxl (R) | pylightxl (W) | python-calamine (R) | sheetjs (R) | sheetjs (W) | tablib (R) | tablib (W) | wolfxl (R) | wolfxl (W) | xlrd (R) | xlsxwriter (W) | xlsxwriter-constmem (W) | xlwt (W) | +|---------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------| +| [named_ranges](#named_ranges-details) | 🟡 2 | 🟢 3 | 🟡 2 | 🟡 2 | 🟢 3 | 🟢 3 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🔴 0 | 🔴 0 | 🔴 0 | +| [tables](#tables-details) | 🟠 1 | 🟠 1 | 🔴 0 | 🟢 3 | 🟢 3 | 🟡 2 | 🟢 3 | 🟢 3 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🔴 0 | 🟢 3 | 🟢 3 | ➖ | 🔴 0 | 🔴 0 | 🔴 0 | + +## Notes + +- **alignment**: Known limitation: pylightxl alignment write is a no-op because the library does not support formatting writes. +- **cell_values**: Known limitation: pylightxl cell-values write has date/boolean/error fidelity limits due to writer encoding behavior. +- **alignment**: Known limitation: python-calamine alignment read is limited because its API does not expose style/alignment metadata. +- **cell_values**: Known limitation: python-calamine can surface formula error cells as blank values in current API responses. +- **cell_values, formulas, ... (22 features)**: Not applicable: xlrd does not support .xlsx input +- **pivot_tables**: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +## Statistics + +| Library | Mode | Tests | Passed | Failed | Pass Rate | Green Features | +|---------|------|-------|--------|--------|-----------|----------------| +| aspose-cells-foss | R | 133 | 113 | 20 | 85% | 11/21 | +| aspose-cells-foss | W | 133 | 101 | 32 | 76% | 14/21 | +| exceljs | R | 133 | 113 | 20 | 85% | 12/21 | +| exceljs | W | 133 | 123 | 10 | 92% | 15/21 | +| libreoffice | R | 133 | 115 | 18 | 86% | 12/21 | +| libreoffice | W | 133 | 113 | 20 | 85% | 12/21 | +| openpyxl | R | 133 | 133 | 0 | 100% | 21/21 | +| openpyxl | W | 133 | 133 | 0 | 100% | 21/21 | +| openpyxl-readonly | R | 133 | 26 | 107 | 20% | 3/21 | +| pandas | R | 133 | 19 | 114 | 14% | 1/21 | +| pandas | W | 133 | 26 | 107 | 20% | 3/21 | +| polars | R | 133 | 17 | 116 | 13% | 0/21 | +| pyexcel | R | 133 | 22 | 111 | 17% | 2/21 | +| pyexcel | W | 133 | 8 | 125 | 6% | 2/21 | +| pylightxl | R | 133 | 22 | 111 | 17% | 2/21 | +| pylightxl | W | 133 | 8 | 125 | 6% | 2/21 | +| python-calamine | R | 133 | 19 | 114 | 14% | 1/21 | +| sheetjs | R | 133 | 55 | 78 | 41% | 9/21 | +| sheetjs | W | 133 | 52 | 81 | 39% | 8/21 | +| tablib | R | 133 | 22 | 111 | 17% | 2/21 | +| tablib | W | 133 | 26 | 107 | 20% | 3/21 | +| wolfxl | R | 133 | 133 | 0 | 100% | 21/21 | +| wolfxl | W | 133 | 133 | 0 | 100% | 21/21 | +| xlsxwriter | W | 133 | 112 | 21 | 84% | 15/21 | +| xlsxwriter-constmem | W | 133 | 105 | 28 | 79% | 12/21 | +| xlwt | W | 133 | 72 | 61 | 54% | 4/21 | + +## Libraries Tested + +- **aspose-cells-foss** v26.7.0 (python) - read, write; modify: Rewrite +- **exceljs** v4.4.0 (javascript) - modify, read, write; modify: Rewrite +- **libreoffice** v26.8.0.3 (build bce0998afefdbc355585ca324285661a2170ba77) (cli) - modify, read, write; modify: Rewrite +- **openpyxl** v3.1.5 (python) - read, write; modify: Rewrite +- **openpyxl-readonly** v3.1.5 (python) - read; modify: No +- **pandas** v3.0.6 (python) - read, write; modify: Rebuild +- **polars** v1.44.2 (python) - read; modify: No +- **pyexcel** v0.7.6 (python) - read, write; modify: Rebuild +- **pylightxl** v1.61 (python) - read, write; modify: Rebuild +- **python-calamine** v0.8.2 (python) - read; modify: No +- **sheetjs** v0.20.3 (javascript) - modify, read, write; modify: Rewrite +- **tablib** v3.10.0 (python) - read, write; modify: Rebuild +- **wolfxl** v2.0.8 (python) - modify, read, write; modify: Patch +- **xlrd** v2.0.2 (python) - read; modify: No +- **xlsxwriter** v3.2.9 (python) - write; modify: No +- **xlsxwriter-constmem** v3.2.9 (python) - write; modify: No +- **xlwt** v1.3.0 (python) - write; modify: No + +## Diagnostics Summary + +| Group | Value | Count | +|-------|-------|-------| +| category | data_mismatch | 916 | +| category | internal | 44 | +| category | invalid_input | 69 | +| category | unsupported_feature | 608 | +| severity | error | 1029 | +| severity | warning | 608 | + +### Diagnostic Details + +| Feature | Library | Test Case | Operation | Category | Severity | Message | +|---------|---------|-----------|-----------|----------|----------|---------| +| cell_values | python-calamine | error_div0 | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#DIV/0!'}, actual={'type': 'blank'} | +| cell_values | python-calamine | error_na | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#N/A'}, actual={'type': 'blank'} | +| cell_values | python-calamine | error_value | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#VALUE!'}, actual={'type': 'blank'} | +| cell_values | aspose-cells-foss | date_standard | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'date', 'value': '2026-02-04'}, actual={'type': 'number', 'value': 46057} | +| cell_values | aspose-cells-foss | datetime | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'datetime', 'value': '2026-02-04T10:30:45'}, actual={'type': 'number', 'value': 46057.43802083333} | +| cell_values | pylightxl | string_simple | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | string_unicode | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | string_empty | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | string_long | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | string_newline | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | number_integer | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | number_float | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | number_negative | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | number_large | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | number_scientific | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | date_standard | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | datetime | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | boolean_true | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | boolean_false | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | error_div0 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | error_na | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | error_value | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pylightxl | blank | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| cell_values | pyexcel | string_simple | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | string_unicode | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | string_empty | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | string_long | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | string_newline | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | number_integer | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | number_float | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | number_negative | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | number_large | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | number_scientific | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | date_standard | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | datetime | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | boolean_true | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | boolean_false | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | error_div0 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | error_na | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | error_value | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pyexcel | blank | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| cell_values | pandas | error_div0 | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#DIV/0!'}, actual={'type': 'blank'} | +| cell_values | pandas | error_na | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#N/A'}, actual={'type': 'blank'} | +| cell_values | pandas | error_value | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#VALUE!'}, actual={'type': 'blank'} | +| cell_values | polars | error_div0 | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#DIV/0!'}, actual={'type': 'blank'} | +| cell_values | polars | error_na | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#N/A'}, actual={'type': 'blank'} | +| cell_values | polars | error_value | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'error', 'value': '#VALUE!'}, actual={'type': 'blank'} | +| cell_values | libreoffice | boolean_true | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'boolean', 'value': True}, actual={'type': 'formula', 'value': '=TRUE()'} | +| cell_values | libreoffice | boolean_false | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'boolean', 'value': False}, actual={'type': 'formula', 'value': '=FALSE()'} | +| formulas | python-calamine | formula_sum | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | python-calamine | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got blank | +| formulas | python-calamine | formula_concat | read | internal | error | RuntimeError: Expected formula, got string | +| formulas | python-calamine | formula_cross_sheet | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | pylightxl | formula_sum | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | pylightxl | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got error | +| formulas | pylightxl | formula_concat | read | internal | error | RuntimeError: Expected formula, got string | +| formulas | pylightxl | formula_cross_sheet | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | pyexcel | formula_sum | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | pyexcel | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got error | +| formulas | pyexcel | formula_concat | read | internal | error | RuntimeError: Expected formula, got string | +| formulas | pyexcel | formula_cross_sheet | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | xlwt | formula_sum | write | internal | error | RuntimeError: Expected formula, got string | +| formulas | xlwt | formula_cell_ref | write | internal | error | RuntimeError: Expected formula, got string | +| formulas | xlwt | formula_concat | write | internal | error | RuntimeError: Expected formula, got string | +| formulas | xlwt | formula_cross_sheet | write | internal | error | RuntimeError: Expected formula, got string | +| formulas | pandas | formula_sum | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | pandas | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got blank | +| formulas | pandas | formula_concat | read | internal | error | RuntimeError: Expected formula, got string | +| formulas | pandas | formula_cross_sheet | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | polars | formula_sum | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | polars | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got blank | +| formulas | polars | formula_concat | read | internal | error | RuntimeError: Expected formula, got string | +| formulas | polars | formula_cross_sheet | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | tablib | formula_sum | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | tablib | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got error | +| formulas | tablib | formula_concat | read | internal | error | RuntimeError: Expected formula, got string | +| formulas | tablib | formula_cross_sheet | read | internal | error | RuntimeError: Expected formula, got number | +| formulas | sheetjs | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got error | +| formulas | exceljs | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got error | +| formulas | libreoffice | formula_cell_ref | read | internal | error | RuntimeError: Expected formula, got error | +| text_formatting | python-calamine | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | python-calamine | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | python-calamine | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | python-calamine | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | python-calamine | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | python-calamine | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | python-calamine | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | python-calamine | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | python-calamine | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | python-calamine | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | python-calamine | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | python-calamine | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | python-calamine | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | python-calamine | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | python-calamine | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | python-calamine | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | python-calamine | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | python-calamine | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | aspose-cells-foss | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={'underline': 'single', 'font_name': 'Aptos Narrow', 'font_size': 12.0, 'font_color': '#000000'} | +| text_formatting | aspose-cells-foss | bold | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | italic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | underline_single | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | underline_double | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | strikethrough | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | bold_italic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_size_8 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_size_14 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_size_24 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_size_36 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_arial | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_times | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | font_courier | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | color_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | color_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | color_green | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | color_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | aspose-cells-foss | combined | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support write_cell_format: aspose-cells-foss supports only a single underline, not accounting or double variants. | +| text_formatting | pylightxl | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | pylightxl | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | pylightxl | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | pylightxl | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | pylightxl | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | pylightxl | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | pylightxl | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | pylightxl | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | pylightxl | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | pylightxl | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | pylightxl | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | pylightxl | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | pylightxl | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | pylightxl | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | pylightxl | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | pylightxl | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | pylightxl | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | pylightxl | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | pylightxl | bold | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | italic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | underline_single | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | underline_double | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | strikethrough | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | bold_italic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_size_8 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_size_14 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_size_24 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_size_36 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_arial | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_times | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | font_courier | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | color_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | color_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | color_green | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | color_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pylightxl | combined | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| text_formatting | pyexcel | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | pyexcel | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | pyexcel | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | pyexcel | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | pyexcel | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | pyexcel | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | pyexcel | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | pyexcel | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | pyexcel | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | pyexcel | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | pyexcel | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | pyexcel | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | pyexcel | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | pyexcel | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | pyexcel | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | pyexcel | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | pyexcel | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | pyexcel | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | pyexcel | bold | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | italic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | underline_single | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | underline_double | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | strikethrough | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | bold_italic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_size_8 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_size_14 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_size_24 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_size_36 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_arial | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_times | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | font_courier | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | color_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | color_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | color_green | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | color_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | pyexcel | combined | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| text_formatting | xlwt | color_green | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Arial', 'font_size': 10.0, 'font_color': '#008000'} | +| text_formatting | xlwt | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Arial', 'font_size': 10.0, 'font_color': '#993300'} | +| text_formatting | pandas | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | pandas | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | pandas | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | pandas | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | pandas | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | pandas | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | pandas | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | pandas | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | pandas | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | pandas | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | pandas | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | pandas | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | pandas | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | pandas | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | pandas | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | pandas | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | pandas | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | pandas | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | pandas | bold | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | italic | write | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | underline_single | write | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | underline_double | write | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | strikethrough | write | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | bold_italic | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_size_8 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_size_14 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_size_24 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_size_36 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_arial | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_times | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | font_courier | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | color_red | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | color_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | color_green | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | pandas | combined | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | openpyxl-readonly | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | openpyxl-readonly | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | openpyxl-readonly | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | openpyxl-readonly | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | openpyxl-readonly | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | openpyxl-readonly | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | openpyxl-readonly | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | openpyxl-readonly | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | openpyxl-readonly | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | openpyxl-readonly | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | openpyxl-readonly | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | openpyxl-readonly | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | openpyxl-readonly | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | openpyxl-readonly | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | openpyxl-readonly | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | openpyxl-readonly | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | openpyxl-readonly | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | openpyxl-readonly | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | polars | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | polars | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | polars | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | polars | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | polars | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | polars | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | polars | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | polars | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | polars | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | polars | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | polars | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | polars | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | polars | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | polars | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | polars | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | polars | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | polars | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | polars | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | tablib | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | tablib | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | tablib | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | tablib | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | tablib | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | tablib | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | tablib | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | tablib | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | tablib | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | tablib | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | tablib | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | tablib | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | tablib | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | tablib | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | tablib | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | tablib | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | tablib | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | tablib | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | tablib | bold | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | italic | write | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | underline_single | write | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | underline_double | write | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | strikethrough | write | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | bold_italic | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_size_8 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_size_14 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_size_24 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_size_36 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_arial | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_times | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | font_courier | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | color_red | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | color_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | color_green | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | tablib | combined | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 11.0} | +| text_formatting | sheetjs | bold | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={} | +| text_formatting | sheetjs | italic | read | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={} | +| text_formatting | sheetjs | underline_single | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={} | +| text_formatting | sheetjs | underline_double | read | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={} | +| text_formatting | sheetjs | strikethrough | read | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={} | +| text_formatting | sheetjs | bold_italic | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={} | +| text_formatting | sheetjs | font_size_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={} | +| text_formatting | sheetjs | font_size_14 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={} | +| text_formatting | sheetjs | font_size_24 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={} | +| text_formatting | sheetjs | font_size_36 | read | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={} | +| text_formatting | sheetjs | font_arial | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={} | +| text_formatting | sheetjs | font_times | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={} | +| text_formatting | sheetjs | font_courier | read | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={} | +| text_formatting | sheetjs | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={} | +| text_formatting | sheetjs | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={} | +| text_formatting | sheetjs | color_green | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={} | +| text_formatting | sheetjs | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={} | +| text_formatting | sheetjs | combined | read | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={} | +| text_formatting | sheetjs | bold | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | italic | write | data_mismatch | error | Expected values did not match actual values: expected={'italic': True}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | underline_single | write | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'single'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | underline_double | write | data_mismatch | error | Expected values did not match actual values: expected={'underline': 'double'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | strikethrough | write | data_mismatch | error | Expected values did not match actual values: expected={'strikethrough': True}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | bold_italic | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'italic': True}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_size_8 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 8}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_size_14 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 14}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_size_24 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 24}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_size_36 | write | data_mismatch | error | Expected values did not match actual values: expected={'font_size': 36}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_arial | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Arial'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_times | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Times New Roman'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | font_courier | write | data_mismatch | error | Expected values did not match actual values: expected={'font_name': 'Courier New'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | color_red | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | color_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#0000FF'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | color_green | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#00FF00'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'font_color': '#8B4513'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| text_formatting | sheetjs | combined | write | data_mismatch | error | Expected values did not match actual values: expected={'bold': True, 'font_size': 16, 'font_color': '#FF0000'}, actual={'font_name': 'Calibri', 'font_size': 12.0} | +| background_colors | python-calamine | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | python-calamine | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | python-calamine | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | python-calamine | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | pylightxl | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | pylightxl | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | pylightxl | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | pylightxl | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | pylightxl | bg_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| background_colors | pylightxl | bg_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| background_colors | pylightxl | bg_green | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| background_colors | pylightxl | bg_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| background_colors | pyexcel | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | pyexcel | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | pyexcel | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | pyexcel | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | pyexcel | bg_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| background_colors | pyexcel | bg_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| background_colors | pyexcel | bg_green | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| background_colors | pyexcel | bg_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| background_colors | xlwt | bg_green | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={'bg_color': '#008000'} | +| background_colors | xlwt | bg_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={'bg_color': '#993300'} | +| background_colors | pandas | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | pandas | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | pandas | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | pandas | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | pandas | bg_red | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | pandas | bg_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | pandas | bg_green | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | pandas | bg_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | openpyxl-readonly | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | openpyxl-readonly | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | openpyxl-readonly | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | openpyxl-readonly | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | polars | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | polars | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | polars | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | polars | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | tablib | bg_red | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | tablib | bg_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | tablib | bg_green | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | tablib | bg_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | tablib | bg_red | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | tablib | bg_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | tablib | bg_green | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | tablib | bg_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| background_colors | sheetjs | bg_red | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#FF0000'}, actual={} | +| background_colors | sheetjs | bg_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#0000FF'}, actual={} | +| background_colors | sheetjs | bg_green | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#00FF00'}, actual={} | +| background_colors | sheetjs | bg_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'bg_color': '#8B4513'}, actual={} | +| number_formats | python-calamine | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | python-calamine | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | python-calamine | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | python-calamine | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | python-calamine | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | pylightxl | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | pylightxl | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | pylightxl | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | pylightxl | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | pylightxl | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | pylightxl | numfmt_currency | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| number_formats | pylightxl | numfmt_percent | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| number_formats | pylightxl | numfmt_date | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| number_formats | pylightxl | numfmt_scientific | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| number_formats | pylightxl | numfmt_custom_text | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| number_formats | pyexcel | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | pyexcel | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | pyexcel | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | pyexcel | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | pyexcel | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | pyexcel | numfmt_currency | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| number_formats | pyexcel | numfmt_percent | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| number_formats | pyexcel | numfmt_date | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| number_formats | pyexcel | numfmt_scientific | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| number_formats | pyexcel | numfmt_custom_text | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| number_formats | pandas | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | pandas | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | pandas | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | pandas | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | pandas | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | pandas | numfmt_currency | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={'number_format': 'General'} | +| number_formats | pandas | numfmt_percent | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={'number_format': 'General'} | +| number_formats | pandas | numfmt_date | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={'number_format': 'General'} | +| number_formats | pandas | numfmt_scientific | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={'number_format': 'General'} | +| number_formats | pandas | numfmt_custom_text | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={'number_format': 'General'} | +| number_formats | openpyxl-readonly | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | openpyxl-readonly | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | openpyxl-readonly | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | openpyxl-readonly | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | openpyxl-readonly | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | polars | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | polars | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | polars | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | polars | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | polars | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | tablib | numfmt_currency | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={} | +| number_formats | tablib | numfmt_percent | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={} | +| number_formats | tablib | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={} | +| number_formats | tablib | numfmt_scientific | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={} | +| number_formats | tablib | numfmt_custom_text | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={} | +| number_formats | tablib | numfmt_currency | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={'number_format': 'General'} | +| number_formats | tablib | numfmt_percent | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00%'}, actual={'number_format': 'General'} | +| number_formats | tablib | numfmt_date | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={'number_format': 'General'} | +| number_formats | tablib | numfmt_scientific | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '0.00E+00'}, actual={'number_format': 'General'} | +| number_formats | tablib | numfmt_custom_text | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={'number_format': 'General'} | +| number_formats | libreoffice | numfmt_date | read | data_mismatch | error | Expected values did not match actual values: expected={'number_format': 'yyyy-mm-dd'}, actual={'number_format': 'YYYY-MM-DD'} | +| number_formats | libreoffice | numfmt_currency | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '$#,##0.00'}, actual={'number_format': '\\$#,##0.00'} | +| number_formats | libreoffice | numfmt_custom_text | write | data_mismatch | error | Expected values did not match actual values: expected={'number_format': '"USD" 0.00'}, actual={'number_format': '"USD "0.00'} | +| alignment | xlsxwriter | v_bottom | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | python-calamine | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | python-calamine | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | python-calamine | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | python-calamine | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | python-calamine | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | python-calamine | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | python-calamine | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | python-calamine | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | python-calamine | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | aspose-cells-foss | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | aspose-cells-foss | v_bottom | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | pylightxl | h_left | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | h_center | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | h_right | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | v_top | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | v_center | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | v_bottom | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | wrap_text | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | rotation_45 | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | indent_2 | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| alignment | pylightxl | h_left | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | h_center | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | h_right | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | v_top | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | v_center | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | v_bottom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | wrap_text | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | rotation_45 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pylightxl | indent_2 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_format: pylightxl does not implement this feature | +| alignment | pyexcel | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | pyexcel | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | pyexcel | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | pyexcel | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | pyexcel | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | pyexcel | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | pyexcel | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | pyexcel | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | pyexcel | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | pyexcel | h_left | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | h_center | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | h_right | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | v_top | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | v_center | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | v_bottom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | wrap_text | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | rotation_45 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pyexcel | indent_2 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_format: pyexcel exposes value-only cells | +| alignment | pandas | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | pandas | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | pandas | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | pandas | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | pandas | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | pandas | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | pandas | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | pandas | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | pandas | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | pandas | h_left | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | pandas | h_center | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | pandas | h_right | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | pandas | v_top | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | pandas | v_center | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | pandas | v_bottom | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | pandas | wrap_text | write | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | pandas | rotation_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | pandas | indent_2 | write | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | xlsxwriter-constmem | v_bottom | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | openpyxl-readonly | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | openpyxl-readonly | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | openpyxl-readonly | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | openpyxl-readonly | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | openpyxl-readonly | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | openpyxl-readonly | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | openpyxl-readonly | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | openpyxl-readonly | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | openpyxl-readonly | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | polars | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | polars | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | polars | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | polars | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | polars | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | polars | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | polars | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | polars | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | polars | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | tablib | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | tablib | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | tablib | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | tablib | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | tablib | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | tablib | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | tablib | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | tablib | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | tablib | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | tablib | h_left | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | tablib | h_center | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | tablib | h_right | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | tablib | v_top | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | tablib | v_center | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | tablib | v_bottom | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | tablib | wrap_text | write | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | tablib | rotation_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | tablib | indent_2 | write | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | sheetjs | h_left | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | sheetjs | h_center | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | sheetjs | h_right | read | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | sheetjs | v_top | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | sheetjs | v_center | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | sheetjs | v_bottom | read | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | sheetjs | wrap_text | read | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | sheetjs | rotation_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | sheetjs | indent_2 | read | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| alignment | sheetjs | h_left | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'left'}, actual={} | +| alignment | sheetjs | h_center | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'center'}, actual={} | +| alignment | sheetjs | h_right | write | data_mismatch | error | Expected values did not match actual values: expected={'h_align': 'right'}, actual={} | +| alignment | sheetjs | v_top | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'top'}, actual={} | +| alignment | sheetjs | v_center | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'center'}, actual={} | +| alignment | sheetjs | v_bottom | write | data_mismatch | error | Expected values did not match actual values: expected={'v_align': 'bottom'}, actual={} | +| alignment | sheetjs | wrap_text | write | data_mismatch | error | Expected values did not match actual values: expected={'wrap': True}, actual={} | +| alignment | sheetjs | rotation_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'rotation': 45}, actual={} | +| alignment | sheetjs | indent_2 | write | data_mismatch | error | Expected values did not match actual values: expected={'indent': 2}, actual={} | +| borders | python-calamine | thin_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | medium_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | thick_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | double | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | dashed | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | dotted | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | dash_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | dash_dot_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | python-calamine | top_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | python-calamine | bottom_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | python-calamine | left_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | python-calamine | right_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | python-calamine | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | python-calamine | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | python-calamine | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | python-calamine | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | python-calamine | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | python-calamine | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | python-calamine | mixed_styles | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | python-calamine | mixed_colors | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | aspose-cells-foss | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | aspose-cells-foss | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | aspose-cells-foss | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | aspose-cells-foss | diagonal_up | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | aspose-cells-foss | diagonal_down | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | aspose-cells-foss | diagonal_both | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | pylightxl | thin_all | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | medium_all | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | thick_all | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | double | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | dashed | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | dotted | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | dash_dot | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | dash_dot_dot | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | top_only | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | bottom_only | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | left_only | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | right_only | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | diagonal_up | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | diagonal_down | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | diagonal_both | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | color_red | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | color_blue | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | color_custom | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | mixed_styles | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | mixed_colors | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| borders | pylightxl | thin_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | medium_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | thick_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | double | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | dashed | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | dotted | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | dash_dot | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | dash_dot_dot | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | top_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | bottom_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | left_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | right_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | diagonal_up | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | diagonal_down | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | diagonal_both | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | color_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | color_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | color_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | mixed_styles | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pylightxl | mixed_colors | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support write_cell_border: pylightxl does not implement this feature | +| borders | pyexcel | thin_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | medium_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | thick_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | double | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | dashed | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | dotted | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | dash_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | dash_dot_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | pyexcel | top_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | pyexcel | bottom_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | pyexcel | left_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | pyexcel | right_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | pyexcel | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | pyexcel | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | pyexcel | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | pyexcel | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | pyexcel | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | pyexcel | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | pyexcel | mixed_styles | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | pyexcel | mixed_colors | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | pyexcel | thin_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | medium_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | thick_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | double | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | dashed | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | dotted | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | dash_dot | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | dash_dot_dot | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | top_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | bottom_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | left_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | right_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | diagonal_up | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | diagonal_down | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | diagonal_both | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | color_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | color_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | color_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | mixed_styles | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | pyexcel | mixed_colors | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support write_cell_border: pyexcel exposes value-only cells | +| borders | xlwt | diagonal_up | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={'border_diagonal_down': 'thin'} | +| borders | xlwt | diagonal_down | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={'border_diagonal_up': 'thin'} | +| borders | xlwt | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={'border_style': 'thin', 'border_color': '#993300'} | +| borders | xlwt | mixed_colors | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={'border_top_color': '#FF0000', 'border_bottom_color': '#008000', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00', 'border_style': 'thin'} | +| borders | pandas | thin_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | pandas | medium_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | pandas | thick_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | pandas | double | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | pandas | dashed | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | pandas | dotted | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | pandas | dash_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | pandas | dash_dot_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | pandas | top_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | pandas | bottom_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | pandas | left_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | pandas | right_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | pandas | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | pandas | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | pandas | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | pandas | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | pandas | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | pandas | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | pandas | mixed_styles | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | pandas | mixed_colors | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | pandas | thin_all | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | pandas | medium_all | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | pandas | thick_all | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | pandas | double | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | pandas | dashed | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | pandas | dotted | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | pandas | dash_dot | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | pandas | dash_dot_dot | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | pandas | top_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | pandas | bottom_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | pandas | left_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | pandas | right_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | pandas | diagonal_up | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | pandas | diagonal_down | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | pandas | diagonal_both | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | pandas | color_red | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | pandas | color_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | pandas | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | pandas | mixed_styles | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | pandas | mixed_colors | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | openpyxl-readonly | thin_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | medium_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | thick_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | double | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | dashed | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | dotted | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | dash_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | dash_dot_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | openpyxl-readonly | top_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | openpyxl-readonly | bottom_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | openpyxl-readonly | left_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | openpyxl-readonly | right_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | openpyxl-readonly | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | openpyxl-readonly | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | openpyxl-readonly | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | openpyxl-readonly | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | openpyxl-readonly | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | openpyxl-readonly | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | openpyxl-readonly | mixed_styles | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | openpyxl-readonly | mixed_colors | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | polars | thin_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | polars | medium_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | polars | thick_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | polars | double | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | polars | dashed | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | polars | dotted | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | polars | dash_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | polars | dash_dot_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | polars | top_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | polars | bottom_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | polars | left_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | polars | right_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | polars | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | polars | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | polars | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | polars | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | polars | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | polars | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | polars | mixed_styles | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | polars | mixed_colors | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | tablib | thin_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | tablib | medium_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | tablib | thick_all | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | tablib | double | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | tablib | dashed | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | tablib | dotted | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | tablib | dash_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | tablib | dash_dot_dot | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | tablib | top_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | tablib | bottom_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | tablib | left_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | tablib | right_only | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | tablib | diagonal_up | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | tablib | diagonal_down | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | tablib | diagonal_both | read | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | tablib | color_red | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | tablib | color_blue | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | tablib | color_custom | read | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | tablib | mixed_styles | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | tablib | mixed_colors | read | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | tablib | thin_all | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#000000'}, actual={} | +| borders | tablib | medium_all | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'medium', 'border_color': '#000000'}, actual={} | +| borders | tablib | thick_all | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thick', 'border_color': '#000000'}, actual={} | +| borders | tablib | double | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'double', 'border_color': '#000000'}, actual={} | +| borders | tablib | dashed | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashed', 'border_color': '#000000'}, actual={} | +| borders | tablib | dotted | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dotted', 'border_color': '#000000'}, actual={} | +| borders | tablib | dash_dot | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDot', 'border_color': '#000000'}, actual={} | +| borders | tablib | dash_dot_dot | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'dashDotDot', 'border_color': '#000000'}, actual={} | +| borders | tablib | top_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thin', 'border_bottom': None, 'border_left': None, 'border_right': None}, actual={} | +| borders | tablib | bottom_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': 'thin', 'border_left': None, 'border_right': None}, actual={} | +| borders | tablib | left_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': 'thin', 'border_right': None}, actual={} | +| borders | tablib | right_only | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': None, 'border_bottom': None, 'border_left': None, 'border_right': 'thin'}, actual={} | +| borders | tablib | diagonal_up | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin'}, actual={} | +| borders | tablib | diagonal_down | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_down': 'thin'}, actual={} | +| borders | tablib | diagonal_both | write | data_mismatch | error | Expected values did not match actual values: expected={'border_diagonal_up': 'thin', 'border_diagonal_down': 'thin'}, actual={} | +| borders | tablib | color_red | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#FF0000'}, actual={} | +| borders | tablib | color_blue | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#0000FF'}, actual={} | +| borders | tablib | color_custom | write | data_mismatch | error | Expected values did not match actual values: expected={'border_style': 'thin', 'border_color': '#8B4513'}, actual={} | +| borders | tablib | mixed_styles | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top': 'thick', 'border_bottom': 'thin', 'border_left': 'medium', 'border_right': 'dashed'}, actual={} | +| borders | tablib | mixed_colors | write | data_mismatch | error | Expected values did not match actual values: expected={'border_top_color': '#FF0000', 'border_bottom_color': '#00FF00', 'border_left_color': '#0000FF', 'border_right_color': '#FFFF00'}, actual={} | +| borders | sheetjs | thin_all | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | medium_all | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | thick_all | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | double | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | dashed | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | dotted | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | dash_dot | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | dash_dot_dot | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | top_only | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | bottom_only | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | left_only | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | right_only | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | diagonal_up | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | diagonal_down | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | diagonal_both | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | color_red | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | color_blue | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | color_custom | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | mixed_styles | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | mixed_colors | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s | +| borders | sheetjs | thin_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | medium_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | thick_all | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | double | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | dashed | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | dotted | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | dash_dot | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | dash_dot_dot | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | top_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | bottom_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | left_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | right_only | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | diagonal_up | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | diagonal_down | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | diagonal_both | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | color_red | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | color_blue | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | color_custom | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | mixed_styles | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| borders | sheetjs | mixed_colors | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support cell_border: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles | +| dimensions | python-calamine | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | python-calamine | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | python-calamine | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | python-calamine | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | aspose-cells-foss | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 20.83203125} | +| dimensions | aspose-cells-foss | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 8.83203125} | +| dimensions | pylightxl | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | pylightxl | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | pylightxl | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | pylightxl | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | pylightxl | row_height_30 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature | +| dimensions | pylightxl | row_height_45 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature | +| dimensions | pylightxl | col_width_20 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature | +| dimensions | pylightxl | col_width_8 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_row_height: pylightxl does not implement this feature | +| dimensions | pyexcel | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | pyexcel | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | pyexcel | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | pyexcel | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | pyexcel | row_height_30 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing | +| dimensions | pyexcel | row_height_45 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing | +| dimensions | pyexcel | col_width_20 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing | +| dimensions | pyexcel | col_width_8 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_row_height: pyexcel does not expose row dimension writing | +| dimensions | xlwt | row_height_30 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | xlwt | row_height_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | pandas | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | pandas | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | pandas | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | pandas | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | pandas | row_height_30 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | pandas | row_height_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | pandas | col_width_20 | write | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 13.0} | +| dimensions | pandas | col_width_8 | write | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 13.0} | +| dimensions | xlsxwriter-constmem | row_height_30 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | xlsxwriter-constmem | row_height_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | openpyxl-readonly | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | openpyxl-readonly | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | openpyxl-readonly | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | openpyxl-readonly | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | polars | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | polars | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | polars | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | polars | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | tablib | row_height_30 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | tablib | row_height_45 | read | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | tablib | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': None} | +| dimensions | tablib | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': None} | +| dimensions | tablib | row_height_30 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | tablib | row_height_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | tablib | col_width_20 | write | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 13.0} | +| dimensions | tablib | col_width_8 | write | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 13.0} | +| dimensions | sheetjs | row_height_30 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 30}, actual={'row_height': None} | +| dimensions | sheetjs | row_height_45 | write | data_mismatch | error | Expected values did not match actual values: expected={'row_height': 45}, actual={'row_height': None} | +| dimensions | libreoffice | col_width_20 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 20}, actual={'column_width': 19.998} | +| dimensions | libreoffice | col_width_8 | read | data_mismatch | error | Expected values did not match actual values: expected={'column_width': 8}, actual={'column_width': 7.998} | +| multiple_sheets | polars | value_beta | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'string', 'value': 'Beta'}, actual={'type': 'blank'} | +| multiple_sheets | polars | value_gamma | read | data_mismatch | error | Expected values did not match actual values: expected={'type': 'string', 'value': 'Gamma'}, actual={'type': 'blank'} | +| merged_cells | python-calamine | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | python-calamine | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | python-calamine | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | python-calamine | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | pylightxl | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | pylightxl | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | pylightxl | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | pylightxl | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | pylightxl | merge_horizontal | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature | +| merged_cells | pylightxl | merge_vertical | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature | +| merged_cells | pylightxl | merge_value_off_top_left | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature | +| merged_cells | pylightxl | merge_top_left_fill | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support merge_cells: pylightxl does not implement this feature | +| merged_cells | pyexcel | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | pyexcel | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | pyexcel | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | pyexcel | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | pyexcel | merge_horizontal | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature | +| merged_cells | pyexcel | merge_vertical | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature | +| merged_cells | pyexcel | merge_value_off_top_left | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature | +| merged_cells | pyexcel | merge_top_left_fill | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support merge_cells: pyexcel does not expose this worksheet feature | +| merged_cells | xlwt | merge_horizontal | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': 'B2:D2', 'top_left_value': None} | +| merged_cells | xlwt | merge_vertical | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': 'B3:B5', 'top_left_value': None} | +| merged_cells | xlwt | merge_value_off_top_left | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': 'B6:D6', 'top_left_value': None, 'non_top_left_nonempty': 0} | +| merged_cells | xlwt | merge_top_left_fill | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': 'B7:D7', 'top_left_value': None, 'top_left_bg_color': None} | +| merged_cells | pandas | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | pandas | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | pandas | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | pandas | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | pandas | merge_horizontal | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | pandas | merge_vertical | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | pandas | merge_value_off_top_left | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | pandas | merge_top_left_fill | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | openpyxl-readonly | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | openpyxl-readonly | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | openpyxl-readonly | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | openpyxl-readonly | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | polars | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | polars | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | polars | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | polars | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | tablib | merge_horizontal | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | tablib | merge_vertical | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | tablib | merge_value_off_top_left | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | tablib | merge_top_left_fill | read | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | tablib | merge_horizontal | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B2:D2', 'top_left_value': 'Merged'}, actual={'merged_range': None} | +| merged_cells | tablib | merge_vertical | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B3:B5', 'top_left_value': 'Vertical'}, actual={'merged_range': None} | +| merged_cells | tablib | merge_value_off_top_left | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B6:D6', 'top_left_value': 'OffTop', 'non_top_left_nonempty': 0}, actual={'merged_range': None} | +| merged_cells | tablib | merge_top_left_fill | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': None} | +| merged_cells | sheetjs | merge_top_left_fill | write | data_mismatch | error | Expected values did not match actual values: expected={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': '#FF0000'}, actual={'merged_range': 'B7:D7', 'top_left_value': 'Fill', 'top_left_bg_color': None} | +| conditional_formatting | python-calamine | cf_cell_gt | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | python-calamine | cf_formula_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | python-calamine | cf_text_contains | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | python-calamine | cf_data_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | python-calamine | cf_color_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | python-calamine | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | pylightxl | cf_cell_gt | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| conditional_formatting | pylightxl | cf_formula_cross_sheet | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| conditional_formatting | pylightxl | cf_text_contains | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| conditional_formatting | pylightxl | cf_data_bar | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| conditional_formatting | pylightxl | cf_color_scale | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| conditional_formatting | pylightxl | cf_stop_if_true | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| conditional_formatting | pylightxl | cf_cell_gt | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature | +| conditional_formatting | pylightxl | cf_formula_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature | +| conditional_formatting | pylightxl | cf_text_contains | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature | +| conditional_formatting | pylightxl | cf_data_bar | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature | +| conditional_formatting | pylightxl | cf_color_scale | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature | +| conditional_formatting | pylightxl | cf_stop_if_true | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_conditional_format: pylightxl does not implement this feature | +| conditional_formatting | pyexcel | cf_cell_gt | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | pyexcel | cf_formula_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | pyexcel | cf_text_contains | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | pyexcel | cf_data_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | pyexcel | cf_color_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | pyexcel | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | pyexcel | cf_cell_gt | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature | +| conditional_formatting | pyexcel | cf_formula_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature | +| conditional_formatting | pyexcel | cf_text_contains | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature | +| conditional_formatting | pyexcel | cf_data_bar | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature | +| conditional_formatting | pyexcel | cf_color_scale | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature | +| conditional_formatting | pyexcel | cf_stop_if_true | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_conditional_format: pyexcel does not expose this worksheet feature | +| conditional_formatting | xlwt | cf_cell_gt | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting | +| conditional_formatting | xlwt | cf_formula_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting | +| conditional_formatting | xlwt | cf_text_contains | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting | +| conditional_formatting | xlwt | cf_data_bar | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting | +| conditional_formatting | xlwt | cf_color_scale | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting | +| conditional_formatting | xlwt | cf_stop_if_true | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_conditional_format: xlwt cannot author conditional formatting | +| conditional_formatting | pandas | cf_cell_gt | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | pandas | cf_formula_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | pandas | cf_text_contains | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | pandas | cf_data_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | pandas | cf_color_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | pandas | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | pandas | cf_cell_gt | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | pandas | cf_formula_cross_sheet | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | pandas | cf_text_contains | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | pandas | cf_data_bar | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | pandas | cf_color_scale | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | pandas | cf_stop_if_true | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | openpyxl-readonly | cf_cell_gt | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | openpyxl-readonly | cf_formula_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | openpyxl-readonly | cf_text_contains | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | openpyxl-readonly | cf_data_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | openpyxl-readonly | cf_color_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | openpyxl-readonly | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | polars | cf_cell_gt | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | polars | cf_formula_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | polars | cf_text_contains | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | polars | cf_data_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | polars | cf_color_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | polars | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | tablib | cf_cell_gt | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | tablib | cf_formula_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | tablib | cf_text_contains | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | tablib | cf_data_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | tablib | cf_color_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | tablib | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | tablib | cf_cell_gt | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | tablib | cf_formula_cross_sheet | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={} | +| conditional_formatting | tablib | cf_text_contains | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={} | +| conditional_formatting | tablib | cf_data_bar | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'dataBar', 'priority': 4}}, actual={} | +| conditional_formatting | tablib | cf_color_scale | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | tablib | cf_stop_if_true | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={} | +| conditional_formatting | sheetjs | cf_cell_gt | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips | +| conditional_formatting | sheetjs | cf_formula_cross_sheet | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips | +| conditional_formatting | sheetjs | cf_text_contains | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips | +| conditional_formatting | sheetjs | cf_data_bar | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips | +| conditional_formatting | sheetjs | cf_color_scale | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips | +| conditional_formatting | sheetjs | cf_stop_if_true | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_formats: SheetJS CE has no conditional formatting API; the XLSX reader skips | +| conditional_formatting | sheetjs | cf_cell_gt | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no | +| conditional_formatting | sheetjs | cf_formula_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no | +| conditional_formatting | sheetjs | cf_text_contains | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no | +| conditional_formatting | sheetjs | cf_data_bar | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no | +| conditional_formatting | sheetjs | cf_color_scale | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no | +| conditional_formatting | sheetjs | cf_stop_if_true | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support conditional_format: SheetJS CE has no conditional formatting API; the XLSX writer emits no | +| conditional_formatting | exceljs | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#FF0000'}}} | +| conditional_formatting | exceljs | cf_stop_if_true | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#FF0000'}}} | +| conditional_formatting | libreoffice | cf_stop_if_true | read | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#FF0000'}}} | +| conditional_formatting | libreoffice | cf_cell_gt | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'priority': 1, 'format': {'bg_color': '#FFFF00'}}}, actual={'cf_rule': {'range': 'B2:B6', 'rule_type': 'cellIs', 'operator': 'greaterThan', 'formula': '5', 'format': {'bg_color': '#000000'}}} | +| conditional_formatting | libreoffice | cf_formula_cross_sheet | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'priority': 2, 'format': {'bg_color': '#FF00FF'}}}, actual={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=Ref!$A$1>5', 'format': {'bg_color': '#000000'}}} | +| conditional_formatting | libreoffice | cf_text_contains | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'priority': 3, 'format': {'bg_color': '#FFFF00'}}}, actual={'cf_rule': {'range': 'B2:B6', 'rule_type': 'expression', 'formula': '=ISNUMBER(SEARCH("foo",B2))', 'format': {'bg_color': '#000000'}}} | +| conditional_formatting | libreoffice | cf_color_scale | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B2:B6', 'rule_type': 'colorScale', 'priority': 5}}, actual={} | +| conditional_formatting | libreoffice | cf_stop_if_true | write | data_mismatch | error | Expected values did not match actual values: expected={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'priority': 1, 'stop_if_true': True, 'format': {'bg_color': '#FF0000'}}}, actual={'cf_rule': {'range': 'B7:B9', 'rule_type': 'cellIs', 'operator': 'lessThan', 'formula': '3', 'stop_if_true': None, 'format': {'bg_color': '#000000'}}} | +| data_validation | python-calamine | dv_list_csv | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | python-calamine | dv_list_range | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | python-calamine | dv_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | python-calamine | dv_custom_formula | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | python-calamine | dv_whole_between | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | pylightxl | dv_list_csv | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| data_validation | pylightxl | dv_list_range | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| data_validation | pylightxl | dv_cross_sheet | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| data_validation | pylightxl | dv_custom_formula | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| data_validation | pylightxl | dv_whole_between | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| data_validation | pylightxl | dv_list_csv | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature | +| data_validation | pylightxl | dv_list_range | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature | +| data_validation | pylightxl | dv_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature | +| data_validation | pylightxl | dv_custom_formula | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature | +| data_validation | pylightxl | dv_whole_between | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_data_validation: pylightxl does not implement this feature | +| data_validation | pyexcel | dv_list_csv | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | pyexcel | dv_list_range | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | pyexcel | dv_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | pyexcel | dv_custom_formula | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | pyexcel | dv_whole_between | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | pyexcel | dv_list_csv | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature | +| data_validation | pyexcel | dv_list_range | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature | +| data_validation | pyexcel | dv_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature | +| data_validation | pyexcel | dv_custom_formula | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature | +| data_validation | pyexcel | dv_whole_between | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_data_validation: pyexcel does not expose this worksheet feature | +| data_validation | xlwt | dv_list_csv | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations | +| data_validation | xlwt | dv_list_range | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations | +| data_validation | xlwt | dv_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations | +| data_validation | xlwt | dv_custom_formula | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations | +| data_validation | xlwt | dv_whole_between | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_data_validation: xlwt cannot author data validations | +| data_validation | pandas | dv_list_csv | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | pandas | dv_list_range | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | pandas | dv_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | pandas | dv_custom_formula | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | pandas | dv_whole_between | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | pandas | dv_list_csv | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | pandas | dv_list_range | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | pandas | dv_cross_sheet | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | pandas | dv_custom_formula | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | pandas | dv_whole_between | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | openpyxl-readonly | dv_list_csv | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | openpyxl-readonly | dv_list_range | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | openpyxl-readonly | dv_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | openpyxl-readonly | dv_custom_formula | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | openpyxl-readonly | dv_whole_between | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | polars | dv_list_csv | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | polars | dv_list_range | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | polars | dv_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | polars | dv_custom_formula | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | polars | dv_whole_between | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | tablib | dv_list_csv | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | tablib | dv_list_range | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | tablib | dv_cross_sheet | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | tablib | dv_custom_formula | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | tablib | dv_whole_between | read | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | tablib | dv_list_csv | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B2', 'validation_type': 'list', 'formula1': '"Red,Green,Blue"', 'allow_blank': True}}, actual={} | +| data_validation | tablib | dv_list_range | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B3', 'validation_type': 'list', 'formula1': '=$D$2:$D$4'}}, actual={} | +| data_validation | tablib | dv_cross_sheet | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| data_validation | tablib | dv_custom_formula | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B5', 'validation_type': 'custom', 'formula1': '=B5>C5'}}, actual={} | +| data_validation | tablib | dv_whole_between | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B6', 'validation_type': 'whole', 'operator': 'between', 'formula1': '1', 'formula2': '10', 'allow_blank': False, 'error_title': 'Invalid', 'error': 'Enter 1-10'}}, actual={} | +| data_validation | sheetjs | dv_list_csv | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips | +| data_validation | sheetjs | dv_list_range | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips | +| data_validation | sheetjs | dv_cross_sheet | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips | +| data_validation | sheetjs | dv_custom_formula | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips | +| data_validation | sheetjs | dv_whole_between | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validations: SheetJS CE has no data validation API; the XLSX reader skips | +| data_validation | sheetjs | dv_list_csv | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no | +| data_validation | sheetjs | dv_list_range | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no | +| data_validation | sheetjs | dv_cross_sheet | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no | +| data_validation | sheetjs | dv_custom_formula | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no | +| data_validation | sheetjs | dv_whole_between | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support data_validation: SheetJS CE has no data validation API; the XLSX writer emits no | +| data_validation | libreoffice | dv_cross_sheet | write | data_mismatch | error | Expected values did not match actual values: expected={'validation': {'range': 'B4', 'validation_type': 'list', 'formula1': '=RegionList'}}, actual={} | +| hyperlinks | python-calamine | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | python-calamine | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | python-calamine | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | python-calamine | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | aspose-cells-foss | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': None, 'tooltip': 'Go to docs', 'internal': False}} | +| hyperlinks | aspose-cells-foss | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': None, 'tooltip': 'Jump to target', 'internal': True}} | +| hyperlinks | aspose-cells-foss | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': None, 'tooltip': 'Send email', 'internal': False}} | +| hyperlinks | aspose-cells-foss | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': None, 'tooltip': 'Encoded URL', 'internal': False}} | +| hyperlinks | pylightxl | link_external | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| hyperlinks | pylightxl | link_internal | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| hyperlinks | pylightxl | link_mailto | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| hyperlinks | pylightxl | link_long | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| hyperlinks | pylightxl | link_external | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature | +| hyperlinks | pylightxl | link_internal | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature | +| hyperlinks | pylightxl | link_mailto | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature | +| hyperlinks | pylightxl | link_long | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_hyperlink: pylightxl does not implement this feature | +| hyperlinks | pyexcel | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | pyexcel | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | pyexcel | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | pyexcel | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | pyexcel | link_external | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature | +| hyperlinks | pyexcel | link_internal | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature | +| hyperlinks | pyexcel | link_mailto | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature | +| hyperlinks | pyexcel | link_long | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_hyperlink: pyexcel does not expose this worksheet feature | +| hyperlinks | xlwt | link_external | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter | +| hyperlinks | xlwt | link_internal | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter | +| hyperlinks | xlwt | link_mailto | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter | +| hyperlinks | xlwt | link_long | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_hyperlink: xlwt hyperlink metadata is not supported in this adapter | +| hyperlinks | pandas | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | pandas | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | pandas | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | pandas | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | pandas | link_external | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | pandas | link_internal | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | pandas | link_mailto | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | pandas | link_long | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | openpyxl-readonly | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | openpyxl-readonly | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | openpyxl-readonly | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | openpyxl-readonly | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | polars | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | polars | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | polars | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | polars | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | tablib | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | tablib | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | tablib | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | tablib | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | tablib | link_external | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={} | +| hyperlinks | tablib | link_internal | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | tablib | link_mailto | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={} | +| hyperlinks | tablib | link_long | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={} | +| hyperlinks | exceljs | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': None, 'internal': False}} | +| hyperlinks | exceljs | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={} | +| hyperlinks | exceljs | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': None, 'internal': False}} | +| hyperlinks | exceljs | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': None, 'internal': False}} | +| hyperlinks | exceljs | link_internal | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1#Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': False}} | +| hyperlinks | libreoffice | link_external | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': None, 'internal': False}} | +| hyperlinks | libreoffice | link_internal | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': None, 'internal': True}} | +| hyperlinks | libreoffice | link_mailto | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': None, 'internal': False}} | +| hyperlinks | libreoffice | link_long | read | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': None, 'internal': False}} | +| hyperlinks | libreoffice | link_external | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': 'Go to docs', 'internal': False}}, actual={'hyperlink': {'cell': 'B2', 'target': 'https://example.com/docs', 'display': 'Example Docs', 'tooltip': None, 'internal': False}} | +| hyperlinks | libreoffice | link_internal | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': 'Jump to target', 'internal': True}}, actual={'hyperlink': {'cell': 'B3', 'target': 'Targets!A1', 'display': 'Go Target', 'tooltip': None, 'internal': True}} | +| hyperlinks | libreoffice | link_mailto | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': 'Send email', 'internal': False}}, actual={'hyperlink': {'cell': 'B4', 'target': 'mailto:test@example.com', 'display': 'Email', 'tooltip': None, 'internal': False}} | +| hyperlinks | libreoffice | link_long | write | data_mismatch | error | Expected values did not match actual values: expected={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': 'Encoded URL', 'internal': False}}, actual={'hyperlink': {'cell': 'B5', 'target': 'https://example.com/search?q=excel%20bench&sort=desc#section-2', 'display': 'Search', 'tooltip': None, 'internal': False}} | +| images | python-calamine | image_one_cell | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | python-calamine | image_two_cell_offset | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | aspose-cells-foss | image_one_cell | read | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support read_images: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind. | +| images | aspose-cells-foss | image_two_cell_offset | read | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support read_images: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind. | +| images | aspose-cells-foss | image_one_cell | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support add_image: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors. | +| images | aspose-cells-foss | image_two_cell_offset | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support add_image: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors. | +| images | pylightxl | image_one_cell | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| images | pylightxl | image_two_cell_offset | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| images | pylightxl | image_one_cell | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_image: pylightxl does not implement this feature | +| images | pylightxl | image_two_cell_offset | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_image: pylightxl does not implement this feature | +| images | pyexcel | image_one_cell | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | pyexcel | image_two_cell_offset | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | pyexcel | image_one_cell | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_image: pyexcel does not expose this worksheet feature | +| images | pyexcel | image_two_cell_offset | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_image: pyexcel does not expose this worksheet feature | +| images | xlwt | image_one_cell | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_image: xlwt cannot embed images in this adapter | +| images | xlwt | image_two_cell_offset | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_image: xlwt cannot embed images in this adapter | +| images | pandas | image_one_cell | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | pandas | image_two_cell_offset | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | pandas | image_one_cell | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | pandas | image_two_cell_offset | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | xlsxwriter-constmem | image_one_cell | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | xlsxwriter-constmem | image_two_cell_offset | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | openpyxl-readonly | image_one_cell | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | openpyxl-readonly | image_two_cell_offset | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | polars | image_one_cell | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | polars | image_two_cell_offset | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | tablib | image_one_cell | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | tablib | image_two_cell_offset | read | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | tablib | image_one_cell | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | tablib | image_two_cell_offset | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| images | sheetjs | image_one_cell | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support images: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed | +| images | sheetjs | image_two_cell_offset | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support images: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed | +| images | sheetjs | image_one_cell | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support image: SheetJS CE cannot embed images (drawing parts are not written) | +| images | sheetjs | image_two_cell_offset | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support image: SheetJS CE cannot embed images (drawing parts are not written) | +| images | exceljs | image_one_cell | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors') | +| images | exceljs | image_two_cell_offset | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors') | +| images | exceljs | image_one_cell | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'B2', 'path': 'fixtures/images/sample.png', 'anchor': 'oneCell'}}, actual={} | +| images | exceljs | image_two_cell_offset | write | data_mismatch | error | Expected values did not match actual values: expected={'image': {'cell': 'D6', 'path': 'fixtures/images/sample.jpg', 'anchor': 'oneCell'}}, actual={} | +| comments | python-calamine | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | python-calamine | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | python-calamine | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | aspose-cells-foss | comment_legacy | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={'comment': {'cell': 'B2', 'text': 'None:Legacy note', 'threaded': False}} | +| comments | aspose-cells-foss | comment_threaded | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={'comment': {'cell': 'B3', 'text': 'None:Threaded fallback', 'threaded': False}} | +| comments | aspose-cells-foss | comment_author | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={'comment': {'cell': 'B4', 'text': 'None:Another note', 'threaded': False}} | +| comments | pylightxl | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | pylightxl | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | pylightxl | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | pylightxl | comment_legacy | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature | +| comments | pylightxl | comment_threaded | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature | +| comments | pylightxl | comment_author | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support add_comment: pylightxl does not implement this feature | +| comments | pyexcel | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | pyexcel | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | pyexcel | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | pyexcel | comment_legacy | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature | +| comments | pyexcel | comment_threaded | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature | +| comments | pyexcel | comment_author | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support add_comment: pyexcel does not expose this worksheet feature | +| comments | xlwt | comment_legacy | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments | +| comments | xlwt | comment_threaded | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments | +| comments | xlwt | comment_author | write | unsupported_feature | warning | UnsupportedAdapterOperationError: xlwt does not support add_comment: xlwt cannot author comments | +| comments | pandas | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | pandas | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | pandas | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | pandas | comment_legacy | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | pandas | comment_threaded | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | pandas | comment_author | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | xlsxwriter-constmem | comment_legacy | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | xlsxwriter-constmem | comment_threaded | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | xlsxwriter-constmem | comment_author | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | openpyxl-readonly | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | openpyxl-readonly | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | openpyxl-readonly | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | polars | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | polars | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | polars | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | tablib | comment_legacy | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | tablib | comment_threaded | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | tablib | comment_author | read | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| comments | tablib | comment_legacy | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B2', 'text': 'Legacy note', 'threaded': False}}, actual={} | +| comments | tablib | comment_threaded | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B3', 'text': 'Threaded fallback', 'threaded': False}}, actual={} | +| comments | tablib | comment_author | write | data_mismatch | error | Expected values did not match actual values: expected={'comment': {'cell': 'B4', 'text': 'Another note', 'threaded': False}}, actual={} | +| freeze_panes | python-calamine | freeze_b2 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | python-calamine | freeze_d5 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | python-calamine | split_2x1 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | pylightxl | freeze_b2 | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| freeze_panes | pylightxl | freeze_d5 | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| freeze_panes | pylightxl | split_2x1 | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| freeze_panes | pylightxl | freeze_b2 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature | +| freeze_panes | pylightxl | freeze_d5 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature | +| freeze_panes | pylightxl | split_2x1 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pylightxl does not support set_freeze_panes: pylightxl does not implement this feature | +| freeze_panes | pyexcel | freeze_b2 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | pyexcel | freeze_d5 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | pyexcel | split_2x1 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | pyexcel | freeze_b2 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature | +| freeze_panes | pyexcel | freeze_d5 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature | +| freeze_panes | pyexcel | split_2x1 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: pyexcel does not support set_freeze_panes: pyexcel does not expose this worksheet feature | +| freeze_panes | xlwt | freeze_b2 | write | internal | error | AttributeError: 'Sheet' object has no attribute 'frozen_row_count' | +| freeze_panes | xlwt | freeze_d5 | write | internal | error | AttributeError: 'Sheet' object has no attribute 'frozen_row_count' | +| freeze_panes | xlwt | split_2x1 | write | internal | error | AttributeError: 'Sheet' object has no attribute 'frozen_row_count' | +| freeze_panes | pandas | freeze_b2 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | pandas | freeze_d5 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | pandas | split_2x1 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | pandas | freeze_b2 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | pandas | freeze_d5 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | pandas | split_2x1 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | openpyxl-readonly | freeze_b2 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | openpyxl-readonly | freeze_d5 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | openpyxl-readonly | split_2x1 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | polars | freeze_b2 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | polars | freeze_d5 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | polars | split_2x1 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | tablib | freeze_b2 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | tablib | freeze_d5 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | tablib | split_2x1 | read | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | tablib | freeze_b2 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'B2'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | tablib | freeze_d5 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'freeze', 'top_left_cell': 'D5'}}, actual={'freeze': {'mode': None, 'top_left_cell': None}} | +| freeze_panes | tablib | split_2x1 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| freeze_panes | sheetjs | freeze_b2 | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed | +| freeze_panes | sheetjs | freeze_d5 | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed | +| freeze_panes | sheetjs | split_2x1 | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support freeze_panes: SheetJS CE parses only for zoom and right-to-left; panes are not exposed | +| freeze_panes | sheetjs | freeze_b2 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set | +| freeze_panes | sheetjs | freeze_d5 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set | +| freeze_panes | sheetjs | split_2x1 | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support freeze: SheetJS CE's XLSX writer emits without a element, so panes cannot be set | +| freeze_panes | libreoffice | split_2x1 | write | data_mismatch | error | Expected values did not match actual values: expected={'freeze': {'mode': 'split', 'x_split': 1, 'y_split': 2}}, actual={'freeze': {'mode': None, 'x_split': None, 'y_split': None}} | +| named_ranges | xlsxwriter | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement named range writes | +| named_ranges | xlsxwriter | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement named range writes | +| named_ranges | xlsxwriter | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement named range writes | +| named_ranges | xlsxwriter | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement named range writes | +| named_ranges | xlsxwriter | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement named range writes | +| named_ranges | xlsxwriter | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement named range writes | +| named_ranges | python-calamine | nr_simple_cell | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement named range reads | +| named_ranges | python-calamine | nr_cell_range | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement named range reads | +| named_ranges | python-calamine | nr_formula_ref | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement named range reads | +| named_ranges | python-calamine | nr_sheet_scope | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement named range reads | +| named_ranges | python-calamine | nr_cross_sheet | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement named range reads | +| named_ranges | python-calamine | nr_special_chars | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement named range reads | +| named_ranges | aspose-cells-foss | nr_sheet_scope | read | data_mismatch | error | Expected values did not match actual values: expected={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': 'local'}, actual={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': None} | +| named_ranges | pylightxl | nr_simple_cell | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| named_ranges | pylightxl | nr_cell_range | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| named_ranges | pylightxl | nr_formula_ref | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| named_ranges | pylightxl | nr_sheet_scope | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| named_ranges | pylightxl | nr_cross_sheet | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| named_ranges | pylightxl | nr_special_chars | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| named_ranges | pylightxl | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement named range writes | +| named_ranges | pylightxl | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement named range writes | +| named_ranges | pylightxl | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement named range writes | +| named_ranges | pylightxl | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement named range writes | +| named_ranges | pylightxl | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement named range writes | +| named_ranges | pylightxl | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement named range writes | +| named_ranges | pyexcel | nr_simple_cell | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range reads | +| named_ranges | pyexcel | nr_cell_range | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range reads | +| named_ranges | pyexcel | nr_formula_ref | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range reads | +| named_ranges | pyexcel | nr_sheet_scope | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range reads | +| named_ranges | pyexcel | nr_cross_sheet | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range reads | +| named_ranges | pyexcel | nr_special_chars | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range reads | +| named_ranges | pyexcel | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range writes | +| named_ranges | pyexcel | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range writes | +| named_ranges | pyexcel | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range writes | +| named_ranges | pyexcel | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range writes | +| named_ranges | pyexcel | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range writes | +| named_ranges | pyexcel | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement named range writes | +| named_ranges | xlwt | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement named range writes | +| named_ranges | xlwt | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement named range writes | +| named_ranges | xlwt | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement named range writes | +| named_ranges | xlwt | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement named range writes | +| named_ranges | xlwt | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement named range writes | +| named_ranges | xlwt | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement named range writes | +| named_ranges | pandas | nr_simple_cell | read | unsupported_feature | warning | NotImplementedError: pandas does not implement named range reads | +| named_ranges | pandas | nr_cell_range | read | unsupported_feature | warning | NotImplementedError: pandas does not implement named range reads | +| named_ranges | pandas | nr_formula_ref | read | unsupported_feature | warning | NotImplementedError: pandas does not implement named range reads | +| named_ranges | pandas | nr_sheet_scope | read | unsupported_feature | warning | NotImplementedError: pandas does not implement named range reads | +| named_ranges | pandas | nr_cross_sheet | read | unsupported_feature | warning | NotImplementedError: pandas does not implement named range reads | +| named_ranges | pandas | nr_special_chars | read | unsupported_feature | warning | NotImplementedError: pandas does not implement named range reads | +| named_ranges | pandas | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: pandas does not implement named range writes | +| named_ranges | pandas | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: pandas does not implement named range writes | +| named_ranges | pandas | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: pandas does not implement named range writes | +| named_ranges | pandas | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: pandas does not implement named range writes | +| named_ranges | pandas | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: pandas does not implement named range writes | +| named_ranges | pandas | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: pandas does not implement named range writes | +| named_ranges | xlsxwriter-constmem | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement named range writes | +| named_ranges | xlsxwriter-constmem | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement named range writes | +| named_ranges | xlsxwriter-constmem | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement named range writes | +| named_ranges | xlsxwriter-constmem | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement named range writes | +| named_ranges | xlsxwriter-constmem | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement named range writes | +| named_ranges | xlsxwriter-constmem | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement named range writes | +| named_ranges | openpyxl-readonly | nr_simple_cell | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement named range reads | +| named_ranges | openpyxl-readonly | nr_cell_range | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement named range reads | +| named_ranges | openpyxl-readonly | nr_formula_ref | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement named range reads | +| named_ranges | openpyxl-readonly | nr_sheet_scope | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement named range reads | +| named_ranges | openpyxl-readonly | nr_cross_sheet | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement named range reads | +| named_ranges | openpyxl-readonly | nr_special_chars | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement named range reads | +| named_ranges | polars | nr_simple_cell | read | unsupported_feature | warning | NotImplementedError: polars does not implement named range reads | +| named_ranges | polars | nr_cell_range | read | unsupported_feature | warning | NotImplementedError: polars does not implement named range reads | +| named_ranges | polars | nr_formula_ref | read | unsupported_feature | warning | NotImplementedError: polars does not implement named range reads | +| named_ranges | polars | nr_sheet_scope | read | unsupported_feature | warning | NotImplementedError: polars does not implement named range reads | +| named_ranges | polars | nr_cross_sheet | read | unsupported_feature | warning | NotImplementedError: polars does not implement named range reads | +| named_ranges | polars | nr_special_chars | read | unsupported_feature | warning | NotImplementedError: polars does not implement named range reads | +| named_ranges | tablib | nr_simple_cell | read | unsupported_feature | warning | NotImplementedError: tablib does not implement named range reads | +| named_ranges | tablib | nr_cell_range | read | unsupported_feature | warning | NotImplementedError: tablib does not implement named range reads | +| named_ranges | tablib | nr_formula_ref | read | unsupported_feature | warning | NotImplementedError: tablib does not implement named range reads | +| named_ranges | tablib | nr_sheet_scope | read | unsupported_feature | warning | NotImplementedError: tablib does not implement named range reads | +| named_ranges | tablib | nr_cross_sheet | read | unsupported_feature | warning | NotImplementedError: tablib does not implement named range reads | +| named_ranges | tablib | nr_special_chars | read | unsupported_feature | warning | NotImplementedError: tablib does not implement named range reads | +| named_ranges | tablib | nr_simple_cell | write | unsupported_feature | warning | NotImplementedError: tablib does not implement named range writes | +| named_ranges | tablib | nr_cell_range | write | unsupported_feature | warning | NotImplementedError: tablib does not implement named range writes | +| named_ranges | tablib | nr_formula_ref | write | unsupported_feature | warning | NotImplementedError: tablib does not implement named range writes | +| named_ranges | tablib | nr_sheet_scope | write | unsupported_feature | warning | NotImplementedError: tablib does not implement named range writes | +| named_ranges | tablib | nr_cross_sheet | write | unsupported_feature | warning | NotImplementedError: tablib does not implement named range writes | +| named_ranges | tablib | nr_special_chars | write | unsupported_feature | warning | NotImplementedError: tablib does not implement named range writes | +| named_ranges | exceljs | nr_sheet_scope | read | data_mismatch | error | Expected values did not match actual values: expected={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': 'local'}, actual={'name': 'LocalName', 'scope': 'not_found', 'refers_to': ''} | +| named_ranges | exceljs | nr_sheet_scope | write | data_mismatch | error | Expected values did not match actual values: expected={'name': 'LocalName', 'scope': 'sheet', 'refers_to': 'named_ranges!$B$5', 'value': 'local'}, actual={'name': 'LocalName', 'scope': 'not_found', 'refers_to': ''} | +| tables | xlsxwriter | tbl_basic | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement table writes | +| tables | xlsxwriter | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement table writes | +| tables | xlsxwriter | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement table writes | +| tables | xlsxwriter | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement table writes | +| tables | xlsxwriter | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement table writes | +| tables | xlsxwriter | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement table writes | +| tables | python-calamine | tbl_basic | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement table reads | +| tables | python-calamine | tbl_with_totals | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement table reads | +| tables | python-calamine | tbl_no_style | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement table reads | +| tables | python-calamine | tbl_single_col | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement table reads | +| tables | python-calamine | tbl_single_row | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement table reads | +| tables | python-calamine | tbl_autofilter | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement table reads | +| tables | aspose-cells-foss | tbl_with_totals | read | data_mismatch | error | Expected values did not match actual values: expected={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': True, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 1}}, actual={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': False, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 0}} | +| tables | aspose-cells-foss | tbl_no_style | read | data_mismatch | error | Expected values did not match actual values: expected={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': None, 'columns': ['Key', 'Value']}}, actual={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': 'TableStyleMedium2', 'columns': ['Key', 'Value']}} | +| tables | aspose-cells-foss | tbl_with_totals | write | data_mismatch | error | Expected values did not match actual values: expected={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': True, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 1}}, actual={'table': {'name': 'Summary', 'ref': 'E7:G11', 'header_row': True, 'totals_row': False, 'style': 'TableStyleLight1', 'columns': ['Item', 'Count', 'Total'], 'totals_row_count': 0}} | +| tables | aspose-cells-foss | tbl_no_style | write | data_mismatch | error | Expected values did not match actual values: expected={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': None, 'columns': ['Key', 'Value']}}, actual={'table': {'name': 'PlainTable', 'ref': 'E13:F16', 'header_row': True, 'totals_row': False, 'style': 'TableStyleMedium2', 'columns': ['Key', 'Value']}} | +| tables | pylightxl | tbl_basic | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| tables | pylightxl | tbl_with_totals | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| tables | pylightxl | tbl_no_style | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| tables | pylightxl | tbl_single_col | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| tables | pylightxl | tbl_single_row | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| tables | pylightxl | tbl_autofilter | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| tables | pylightxl | tbl_basic | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement table writes | +| tables | pylightxl | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement table writes | +| tables | pylightxl | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement table writes | +| tables | pylightxl | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement table writes | +| tables | pylightxl | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement table writes | +| tables | pylightxl | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement table writes | +| tables | pyexcel | tbl_basic | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table reads | +| tables | pyexcel | tbl_with_totals | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table reads | +| tables | pyexcel | tbl_no_style | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table reads | +| tables | pyexcel | tbl_single_col | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table reads | +| tables | pyexcel | tbl_single_row | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table reads | +| tables | pyexcel | tbl_autofilter | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table reads | +| tables | pyexcel | tbl_basic | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table writes | +| tables | pyexcel | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table writes | +| tables | pyexcel | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table writes | +| tables | pyexcel | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table writes | +| tables | pyexcel | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table writes | +| tables | pyexcel | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement table writes | +| tables | xlwt | tbl_basic | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement table writes | +| tables | xlwt | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement table writes | +| tables | xlwt | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement table writes | +| tables | xlwt | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement table writes | +| tables | xlwt | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement table writes | +| tables | xlwt | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement table writes | +| tables | pandas | tbl_basic | read | unsupported_feature | warning | NotImplementedError: pandas does not implement table reads | +| tables | pandas | tbl_with_totals | read | unsupported_feature | warning | NotImplementedError: pandas does not implement table reads | +| tables | pandas | tbl_no_style | read | unsupported_feature | warning | NotImplementedError: pandas does not implement table reads | +| tables | pandas | tbl_single_col | read | unsupported_feature | warning | NotImplementedError: pandas does not implement table reads | +| tables | pandas | tbl_single_row | read | unsupported_feature | warning | NotImplementedError: pandas does not implement table reads | +| tables | pandas | tbl_autofilter | read | unsupported_feature | warning | NotImplementedError: pandas does not implement table reads | +| tables | pandas | tbl_basic | write | unsupported_feature | warning | NotImplementedError: pandas does not implement table writes | +| tables | pandas | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: pandas does not implement table writes | +| tables | pandas | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: pandas does not implement table writes | +| tables | pandas | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: pandas does not implement table writes | +| tables | pandas | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: pandas does not implement table writes | +| tables | pandas | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: pandas does not implement table writes | +| tables | xlsxwriter-constmem | tbl_basic | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement table writes | +| tables | xlsxwriter-constmem | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement table writes | +| tables | xlsxwriter-constmem | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement table writes | +| tables | xlsxwriter-constmem | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement table writes | +| tables | xlsxwriter-constmem | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement table writes | +| tables | xlsxwriter-constmem | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement table writes | +| tables | openpyxl-readonly | tbl_basic | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement table reads | +| tables | openpyxl-readonly | tbl_with_totals | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement table reads | +| tables | openpyxl-readonly | tbl_no_style | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement table reads | +| tables | openpyxl-readonly | tbl_single_col | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement table reads | +| tables | openpyxl-readonly | tbl_single_row | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement table reads | +| tables | openpyxl-readonly | tbl_autofilter | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement table reads | +| tables | polars | tbl_basic | read | unsupported_feature | warning | NotImplementedError: polars does not implement table reads | +| tables | polars | tbl_with_totals | read | unsupported_feature | warning | NotImplementedError: polars does not implement table reads | +| tables | polars | tbl_no_style | read | unsupported_feature | warning | NotImplementedError: polars does not implement table reads | +| tables | polars | tbl_single_col | read | unsupported_feature | warning | NotImplementedError: polars does not implement table reads | +| tables | polars | tbl_single_row | read | unsupported_feature | warning | NotImplementedError: polars does not implement table reads | +| tables | polars | tbl_autofilter | read | unsupported_feature | warning | NotImplementedError: polars does not implement table reads | +| tables | tablib | tbl_basic | read | unsupported_feature | warning | NotImplementedError: tablib does not implement table reads | +| tables | tablib | tbl_with_totals | read | unsupported_feature | warning | NotImplementedError: tablib does not implement table reads | +| tables | tablib | tbl_no_style | read | unsupported_feature | warning | NotImplementedError: tablib does not implement table reads | +| tables | tablib | tbl_single_col | read | unsupported_feature | warning | NotImplementedError: tablib does not implement table reads | +| tables | tablib | tbl_single_row | read | unsupported_feature | warning | NotImplementedError: tablib does not implement table reads | +| tables | tablib | tbl_autofilter | read | unsupported_feature | warning | NotImplementedError: tablib does not implement table reads | +| tables | tablib | tbl_basic | write | unsupported_feature | warning | NotImplementedError: tablib does not implement table writes | +| tables | tablib | tbl_with_totals | write | unsupported_feature | warning | NotImplementedError: tablib does not implement table writes | +| tables | tablib | tbl_no_style | write | unsupported_feature | warning | NotImplementedError: tablib does not implement table writes | +| tables | tablib | tbl_single_col | write | unsupported_feature | warning | NotImplementedError: tablib does not implement table writes | +| tables | tablib | tbl_single_row | write | unsupported_feature | warning | NotImplementedError: tablib does not implement table writes | +| tables | tablib | tbl_autofilter | write | unsupported_feature | warning | NotImplementedError: tablib does not implement table writes | +| tables | sheetjs | tbl_basic | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed | +| tables | sheetjs | tbl_with_totals | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed | +| tables | sheetjs | tbl_no_style | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed | +| tables | sheetjs | tbl_single_col | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed | +| tables | sheetjs | tbl_single_row | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed | +| tables | sheetjs | tbl_autofilter | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support tables: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed | +| tables | sheetjs | tbl_basic | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable | +| tables | sheetjs | tbl_with_totals | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable | +| tables | sheetjs | tbl_no_style | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable | +| tables | sheetjs | tbl_single_col | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable | +| tables | sheetjs | tbl_single_row | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable | +| tables | sheetjs | tbl_autofilter | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support table: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable | +| tables | exceljs | tbl_basic | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name') | +| tables | exceljs | tbl_with_totals | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name') | +| tables | exceljs | tbl_no_style | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name') | +| tables | exceljs | tbl_single_col | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name') | +| tables | exceljs | tbl_single_row | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name') | +| tables | exceljs | tbl_autofilter | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'name') | +| tables | libreoffice | tbl_single_row | write | data_mismatch | error | Expected values did not match actual values: expected={'table': {'name': 'EmptyTable', 'ref': 'E23:G23', 'header_row': True, 'totals_row': False, 'style': 'TableStyleMedium9', 'columns': ['A', 'B', 'C']}}, actual={'table': {'name': 'EmptyTable', 'ref': 'not_found', 'header_row': True, 'totals_row': False, 'style': None, 'columns': []}} | +| sheet_protection | xlsxwriter | prot_basic | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement sheet protection writes | +| sheet_protection | xlsxwriter | prot_password | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement sheet protection writes | +| sheet_protection | xlsxwriter | prot_granular | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement sheet protection writes | +| sheet_protection | python-calamine | prot_basic | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement sheet protection reads | +| sheet_protection | python-calamine | prot_password | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement sheet protection reads | +| sheet_protection | python-calamine | prot_granular | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement sheet protection reads | +| sheet_protection | pylightxl | prot_basic | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| sheet_protection | pylightxl | prot_password | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| sheet_protection | pylightxl | prot_granular | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| sheet_protection | pylightxl | prot_basic | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement sheet protection writes | +| sheet_protection | pylightxl | prot_password | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement sheet protection writes | +| sheet_protection | pylightxl | prot_granular | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement sheet protection writes | +| sheet_protection | pyexcel | prot_basic | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement sheet protection reads | +| sheet_protection | pyexcel | prot_password | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement sheet protection reads | +| sheet_protection | pyexcel | prot_granular | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement sheet protection reads | +| sheet_protection | pyexcel | prot_basic | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement sheet protection writes | +| sheet_protection | pyexcel | prot_password | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement sheet protection writes | +| sheet_protection | pyexcel | prot_granular | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement sheet protection writes | +| sheet_protection | xlwt | prot_basic | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement sheet protection writes | +| sheet_protection | xlwt | prot_password | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement sheet protection writes | +| sheet_protection | xlwt | prot_granular | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement sheet protection writes | +| sheet_protection | pandas | prot_basic | read | unsupported_feature | warning | NotImplementedError: pandas does not implement sheet protection reads | +| sheet_protection | pandas | prot_password | read | unsupported_feature | warning | NotImplementedError: pandas does not implement sheet protection reads | +| sheet_protection | pandas | prot_granular | read | unsupported_feature | warning | NotImplementedError: pandas does not implement sheet protection reads | +| sheet_protection | pandas | prot_basic | write | unsupported_feature | warning | NotImplementedError: pandas does not implement sheet protection writes | +| sheet_protection | pandas | prot_password | write | unsupported_feature | warning | NotImplementedError: pandas does not implement sheet protection writes | +| sheet_protection | pandas | prot_granular | write | unsupported_feature | warning | NotImplementedError: pandas does not implement sheet protection writes | +| sheet_protection | xlsxwriter-constmem | prot_basic | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement sheet protection writes | +| sheet_protection | xlsxwriter-constmem | prot_password | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement sheet protection writes | +| sheet_protection | xlsxwriter-constmem | prot_granular | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement sheet protection writes | +| sheet_protection | openpyxl-readonly | prot_basic | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement sheet protection reads | +| sheet_protection | openpyxl-readonly | prot_password | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement sheet protection reads | +| sheet_protection | openpyxl-readonly | prot_granular | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement sheet protection reads | +| sheet_protection | polars | prot_basic | read | unsupported_feature | warning | NotImplementedError: polars does not implement sheet protection reads | +| sheet_protection | polars | prot_password | read | unsupported_feature | warning | NotImplementedError: polars does not implement sheet protection reads | +| sheet_protection | polars | prot_granular | read | unsupported_feature | warning | NotImplementedError: polars does not implement sheet protection reads | +| sheet_protection | tablib | prot_basic | read | unsupported_feature | warning | NotImplementedError: tablib does not implement sheet protection reads | +| sheet_protection | tablib | prot_password | read | unsupported_feature | warning | NotImplementedError: tablib does not implement sheet protection reads | +| sheet_protection | tablib | prot_granular | read | unsupported_feature | warning | NotImplementedError: tablib does not implement sheet protection reads | +| sheet_protection | tablib | prot_basic | write | unsupported_feature | warning | NotImplementedError: tablib does not implement sheet protection writes | +| sheet_protection | tablib | prot_password | write | unsupported_feature | warning | NotImplementedError: tablib does not implement sheet protection writes | +| sheet_protection | tablib | prot_granular | write | unsupported_feature | warning | NotImplementedError: tablib does not implement sheet protection writes | +| sheet_protection | sheetjs | prot_basic | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs | +| sheet_protection | sheetjs | prot_password | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs | +| sheet_protection | sheetjs | prot_granular | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support sheet_protection: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs | +| sheet_protection | exceljs | prot_password | read | data_mismatch | error | Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': True, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True, 'password': 'bench-secret'}}, actual={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True}} | +| sheet_protection | libreoffice | prot_basic | read | data_mismatch | error | Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True}}, actual={'protection': {'auto_filter': None, 'format_cells': None, 'insert_rows': None, 'password_hash_present': False, 'protected': True, 'select_locked_cells': None, 'select_unlocked_cells': None, 'sort': None}} | +| sheet_protection | libreoffice | prot_password | read | data_mismatch | error | Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': True, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True, 'password': 'bench-secret'}}, actual={'protection': {'auto_filter': None, 'format_cells': None, 'insert_rows': None, 'password_hash_present': True, 'protected': True, 'select_locked_cells': None, 'select_unlocked_cells': None, 'sort': None}} | +| sheet_protection | libreoffice | prot_granular | read | data_mismatch | error | Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': False, 'insert_rows': True, 'select_locked_cells': True, 'select_unlocked_cells': False, 'sort': False, 'auto_filter': True}}, actual={'protection': {'auto_filter': None, 'format_cells': None, 'insert_rows': None, 'password_hash_present': False, 'protected': True, 'select_locked_cells': None, 'select_unlocked_cells': None, 'sort': None}} | +| sheet_protection | libreoffice | prot_granular | write | data_mismatch | error | Expected values did not match actual values: expected={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': False, 'insert_rows': True, 'select_locked_cells': True, 'select_unlocked_cells': False, 'sort': False, 'auto_filter': True}}, actual={'protection': {'protected': True, 'password_hash_present': False, 'format_cells': True, 'insert_rows': True, 'select_locked_cells': False, 'select_unlocked_cells': False, 'sort': True, 'auto_filter': True}} | +| page_setup | xlsxwriter | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement page setup writes | +| page_setup | xlsxwriter | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement page setup writes | +| page_setup | xlsxwriter | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement page setup writes | +| page_setup | python-calamine | page_setup_landscape | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement page setup reads | +| page_setup | python-calamine | page_setup_scale | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement page setup reads | +| page_setup | python-calamine | page_setup_titles | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement page setup reads | +| page_setup | aspose-cells-foss | page_setup_landscape | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | aspose-cells-foss | page_setup_titles | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 100, 'print_title_rows': None, 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}} | +| page_setup | aspose-cells-foss | page_setup_landscape | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API. | +| page_setup | aspose-cells-foss | page_setup_scale | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API. | +| page_setup | aspose-cells-foss | page_setup_titles | write | unsupported_feature | warning | UnsupportedAdapterOperationError: aspose-cells-foss does not support set_page_setup: aspose-cells-foss has no print-title-rows API. | +| page_setup | pylightxl | page_setup_landscape | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| page_setup | pylightxl | page_setup_scale | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| page_setup | pylightxl | page_setup_titles | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| page_setup | pylightxl | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement page setup writes | +| page_setup | pylightxl | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement page setup writes | +| page_setup | pylightxl | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement page setup writes | +| page_setup | pyexcel | page_setup_landscape | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement page setup reads | +| page_setup | pyexcel | page_setup_scale | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement page setup reads | +| page_setup | pyexcel | page_setup_titles | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement page setup reads | +| page_setup | pyexcel | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement page setup writes | +| page_setup | pyexcel | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement page setup writes | +| page_setup | pyexcel | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement page setup writes | +| page_setup | xlwt | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement page setup writes | +| page_setup | xlwt | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement page setup writes | +| page_setup | xlwt | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement page setup writes | +| page_setup | pandas | page_setup_landscape | read | unsupported_feature | warning | NotImplementedError: pandas does not implement page setup reads | +| page_setup | pandas | page_setup_scale | read | unsupported_feature | warning | NotImplementedError: pandas does not implement page setup reads | +| page_setup | pandas | page_setup_titles | read | unsupported_feature | warning | NotImplementedError: pandas does not implement page setup reads | +| page_setup | pandas | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: pandas does not implement page setup writes | +| page_setup | pandas | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: pandas does not implement page setup writes | +| page_setup | pandas | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: pandas does not implement page setup writes | +| page_setup | xlsxwriter-constmem | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement page setup writes | +| page_setup | xlsxwriter-constmem | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement page setup writes | +| page_setup | xlsxwriter-constmem | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement page setup writes | +| page_setup | openpyxl-readonly | page_setup_landscape | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement page setup reads | +| page_setup | openpyxl-readonly | page_setup_scale | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement page setup reads | +| page_setup | openpyxl-readonly | page_setup_titles | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement page setup reads | +| page_setup | polars | page_setup_landscape | read | unsupported_feature | warning | NotImplementedError: polars does not implement page setup reads | +| page_setup | polars | page_setup_scale | read | unsupported_feature | warning | NotImplementedError: polars does not implement page setup reads | +| page_setup | polars | page_setup_titles | read | unsupported_feature | warning | NotImplementedError: polars does not implement page setup reads | +| page_setup | tablib | page_setup_landscape | read | unsupported_feature | warning | NotImplementedError: tablib does not implement page setup reads | +| page_setup | tablib | page_setup_scale | read | unsupported_feature | warning | NotImplementedError: tablib does not implement page setup reads | +| page_setup | tablib | page_setup_titles | read | unsupported_feature | warning | NotImplementedError: tablib does not implement page setup reads | +| page_setup | tablib | page_setup_landscape | write | unsupported_feature | warning | NotImplementedError: tablib does not implement page setup writes | +| page_setup | tablib | page_setup_scale | write | unsupported_feature | warning | NotImplementedError: tablib does not implement page setup writes | +| page_setup | tablib | page_setup_titles | write | unsupported_feature | warning | NotImplementedError: tablib does not implement page setup writes | +| page_setup | sheetjs | page_setup_landscape | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {}} | +| page_setup | sheetjs | page_setup_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {}} | +| page_setup | sheetjs | page_setup_titles | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'print_title_rows': '$1:$2'}} | +| page_setup | sheetjs | page_setup_landscape | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | sheetjs | page_setup_scale | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | sheetjs | page_setup_titles | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': None, 'footer_center': None}} | +| page_setup | exceljs | page_setup_landscape | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | exceljs | page_setup_scale | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | exceljs | page_setup_landscape | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | exceljs | page_setup_scale | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | exceljs | page_setup_titles | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}} | +| page_setup | libreoffice | page_setup_landscape | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'fit_to_height': None, 'fit_to_width': None, 'footer_center': None, 'header_center': None, 'orientation': 'landscape', 'print_title_rows': None, 'scale': 100}} | +| page_setup | libreoffice | page_setup_titles | read | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'fit_to_height': None, 'fit_to_width': None, 'footer_center': 'Page &P', 'header_center': 'ExcelBench Report', 'orientation': 'portrait', 'print_title_rows': '$1:$2', 'scale': 100}} | +| page_setup | libreoffice | page_setup_landscape | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': None, 'scale': None, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'landscape', 'fit_to_width': 1, 'fit_to_height': 0, 'scale': 100, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | libreoffice | page_setup_scale | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': 'portrait', 'fit_to_width': None, 'fit_to_height': None, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 75, 'print_title_rows': None, 'header_center': None, 'footer_center': None}} | +| page_setup | libreoffice | page_setup_titles | write | data_mismatch | error | Expected values did not match actual values: expected={'page_setup': {'orientation': None, 'fit_to_width': None, 'fit_to_height': None, 'scale': None, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}}, actual={'page_setup': {'orientation': 'portrait', 'fit_to_width': 1, 'fit_to_height': 1, 'scale': 100, 'print_title_rows': '$1:$2', 'header_center': 'ExcelBench Report', 'footer_center': 'Page &P'}} | +| chart_anchor | xlsxwriter | chart_bar | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement chart anchor writes | +| chart_anchor | xlsxwriter | chart_line | write | unsupported_feature | warning | NotImplementedError: xlsxwriter does not implement chart anchor writes | +| chart_anchor | python-calamine | chart_bar | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement chart anchor reads | +| chart_anchor | python-calamine | chart_line | read | unsupported_feature | warning | NotImplementedError: python-calamine does not implement chart anchor reads | +| chart_anchor | pylightxl | chart_bar | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| chart_anchor | pylightxl | chart_line | read | invalid_input | error | TypeError: expected string or bytes-like object, got 'NoneType' | +| chart_anchor | pylightxl | chart_bar | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement chart anchor writes | +| chart_anchor | pylightxl | chart_line | write | unsupported_feature | warning | NotImplementedError: pylightxl does not implement chart anchor writes | +| chart_anchor | pyexcel | chart_bar | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement chart anchor reads | +| chart_anchor | pyexcel | chart_line | read | unsupported_feature | warning | NotImplementedError: pyexcel does not implement chart anchor reads | +| chart_anchor | pyexcel | chart_bar | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement chart anchor writes | +| chart_anchor | pyexcel | chart_line | write | unsupported_feature | warning | NotImplementedError: pyexcel does not implement chart anchor writes | +| chart_anchor | xlwt | chart_bar | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement chart anchor writes | +| chart_anchor | xlwt | chart_line | write | unsupported_feature | warning | NotImplementedError: xlwt does not implement chart anchor writes | +| chart_anchor | pandas | chart_bar | read | unsupported_feature | warning | NotImplementedError: pandas does not implement chart anchor reads | +| chart_anchor | pandas | chart_line | read | unsupported_feature | warning | NotImplementedError: pandas does not implement chart anchor reads | +| chart_anchor | pandas | chart_bar | write | unsupported_feature | warning | NotImplementedError: pandas does not implement chart anchor writes | +| chart_anchor | pandas | chart_line | write | unsupported_feature | warning | NotImplementedError: pandas does not implement chart anchor writes | +| chart_anchor | xlsxwriter-constmem | chart_bar | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement chart anchor writes | +| chart_anchor | xlsxwriter-constmem | chart_line | write | unsupported_feature | warning | NotImplementedError: xlsxwriter-constmem does not implement chart anchor writes | +| chart_anchor | openpyxl-readonly | chart_bar | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement chart anchor reads | +| chart_anchor | openpyxl-readonly | chart_line | read | unsupported_feature | warning | NotImplementedError: openpyxl-readonly does not implement chart anchor reads | +| chart_anchor | polars | chart_bar | read | unsupported_feature | warning | NotImplementedError: polars does not implement chart anchor reads | +| chart_anchor | polars | chart_line | read | unsupported_feature | warning | NotImplementedError: polars does not implement chart anchor reads | +| chart_anchor | tablib | chart_bar | read | unsupported_feature | warning | NotImplementedError: tablib does not implement chart anchor reads | +| chart_anchor | tablib | chart_line | read | unsupported_feature | warning | NotImplementedError: tablib does not implement chart anchor reads | +| chart_anchor | tablib | chart_bar | write | unsupported_feature | warning | NotImplementedError: tablib does not implement chart anchor writes | +| chart_anchor | tablib | chart_line | write | unsupported_feature | warning | NotImplementedError: tablib does not implement chart anchor writes | +| chart_anchor | sheetjs | chart_bar | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support chart_anchors: SheetJS CE does not parse charts or drawing anchors in worksheets | +| chart_anchor | sheetjs | chart_line | read | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support chart_anchors: SheetJS CE does not parse charts or drawing anchors in worksheets | +| chart_anchor | sheetjs | chart_bar | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support chart: SheetJS CE cannot create charts | +| chart_anchor | sheetjs | chart_line | write | unsupported_feature | warning | UnsupportedAdapterOperationError: sheetjs does not support chart: SheetJS CE cannot create charts | +| chart_anchor | exceljs | chart_bar | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors') | +| chart_anchor | exceljs | chart_line | read | internal | error | HelperError: exceljs read_model failed: Cannot read properties of undefined (reading 'anchors') | +| chart_anchor | exceljs | chart_bar | write | unsupported_feature | warning | UnsupportedAdapterOperationError: exceljs does not support chart: ExcelJS 4.4.0 has no chart creation API | +| chart_anchor | exceljs | chart_line | write | unsupported_feature | warning | UnsupportedAdapterOperationError: exceljs does not support chart: ExcelJS 4.4.0 has no chart creation API | +| chart_anchor | libreoffice | chart_bar | read | data_mismatch | error | Expected values did not match actual values: expected={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'H12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11', 'type': 'bar'}, {'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11', 'type': 'line'}]} | +| chart_anchor | libreoffice | chart_line | read | data_mismatch | error | Expected values did not match actual values: expected={'charts': [{'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'P12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11', 'type': 'bar'}, {'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11', 'type': 'line'}]} | +| chart_anchor | libreoffice | chart_bar | write | data_mismatch | error | Expected values did not match actual values: expected={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'H12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11'}, {'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11'}]} | +| chart_anchor | libreoffice | chart_line | write | data_mismatch | error | Expected values did not match actual values: expected={'charts': [{'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'P12', 'data_ref': 'E2:E8', 'categories_ref': 'F2:F8'}]}, actual={'charts': [{'type': 'bar', 'anchor_type': 'twoCell', 'from': 'B2', 'to': 'G11'}, {'type': 'line', 'anchor_type': 'twoCell', 'from': 'J2', 'to': 'O11'}]} | + +## Detailed Results + + +### alignment + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🟠 1 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Align - left | basic | ✅ | ✅ | +| Align - center | basic | ✅ | ✅ | +| Align - right | basic | ✅ | ✅ | +| Align - top | basic | ✅ | ✅ | +| Align - center | basic | ✅ | ✅ | +| Align - bottom | basic | ❌ | ❌ | +| Align - wrap text | basic | ✅ | ✅ | +| Align - rotation 45 | basic | ✅ | ✅ | +| Align - indent 2 | basic | ✅ | ✅ | + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Align - left | basic | ❌ | +| Align - center | basic | ❌ | +| Align - right | basic | ❌ | +| Align - top | basic | ❌ | +| Align - center | basic | ❌ | +| Align - bottom | basic | ❌ | +| Align - wrap text | basic | ❌ | +| Align - rotation 45 | basic | ❌ | +| Align - indent 2 | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Align - left | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - right | basic | ❌ | ❌ | +| Align - top | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - bottom | basic | ❌ | ❌ | +| Align - wrap text | basic | ❌ | ❌ | +| Align - rotation 45 | basic | ❌ | ❌ | +| Align - indent 2 | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Align - left | basic | ❌ | +| Align - center | basic | ❌ | +| Align - right | basic | ❌ | +| Align - top | basic | ❌ | +| Align - center | basic | ❌ | +| Align - bottom | basic | ❌ | +| Align - wrap text | basic | ❌ | +| Align - rotation 45 | basic | ❌ | +| Align - indent 2 | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Align - left | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - right | basic | ❌ | ❌ | +| Align - top | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - bottom | basic | ❌ | ❌ | +| Align - wrap text | basic | ❌ | ❌ | +| Align - rotation 45 | basic | ❌ | ❌ | +| Align - indent 2 | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 +- Notes: Known limitation: pylightxl alignment write is a no-op because the library does not support formatting writes. + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Align - left | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - right | basic | ❌ | ❌ | +| Align - top | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - bottom | basic | ❌ | ❌ | +| Align - wrap text | basic | ❌ | ❌ | +| Align - rotation 45 | basic | ❌ | ❌ | +| Align - indent 2 | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 +- Notes: Known limitation: python-calamine alignment read is limited because its API does not expose style/alignment metadata. + +| Test | Importance | Read | +|------|-----------|------| +| Align - left | basic | ❌ | +| Align - center | basic | ❌ | +| Align - right | basic | ❌ | +| Align - top | basic | ❌ | +| Align - center | basic | ❌ | +| Align - bottom | basic | ❌ | +| Align - wrap text | basic | ❌ | +| Align - rotation 45 | basic | ❌ | +| Align - indent 2 | basic | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Align - left | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - right | basic | ❌ | ❌ | +| Align - top | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - bottom | basic | ❌ | ❌ | +| Align - wrap text | basic | ❌ | ❌ | +| Align - rotation 45 | basic | ❌ | ❌ | +| Align - indent 2 | basic | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Align - left | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - right | basic | ❌ | ❌ | +| Align - top | basic | ❌ | ❌ | +| Align - center | basic | ❌ | ❌ | +| Align - bottom | basic | ❌ | ❌ | +| Align - wrap text | basic | ❌ | ❌ | +| Align - rotation 45 | basic | ❌ | ❌ | +| Align - indent 2 | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Align - left | basic | ✅ | +| Align - center | basic | ✅ | +| Align - right | basic | ✅ | +| Align - top | basic | ✅ | +| Align - center | basic | ✅ | +| Align - bottom | basic | ❌ | +| Align - wrap text | basic | ✅ | +| Align - rotation 45 | basic | ✅ | +| Align - indent 2 | basic | ✅ | + +**xlsxwriter-constmem** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Align - left | basic | ✅ | +| Align - center | basic | ✅ | +| Align - right | basic | ✅ | +| Align - top | basic | ✅ | +| Align - center | basic | ✅ | +| Align - bottom | basic | ❌ | +| Align - wrap text | basic | ✅ | +| Align - rotation 45 | basic | ✅ | +| Align - indent 2 | basic | ✅ | + +**xlwt** — Write: 🟢 3 + + +### background_colors + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Background - red | basic | ❌ | +| Background - blue | basic | ❌ | +| Background - green | basic | ❌ | +| Background - custom (#8B4513) | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Background - red | basic | ❌ | ❌ | +| Background - blue | basic | ❌ | ❌ | +| Background - green | basic | ❌ | ❌ | +| Background - custom (#8B4513) | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Background - red | basic | ❌ | +| Background - blue | basic | ❌ | +| Background - green | basic | ❌ | +| Background - custom (#8B4513) | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Background - red | basic | ❌ | ❌ | +| Background - blue | basic | ❌ | ❌ | +| Background - green | basic | ❌ | ❌ | +| Background - custom (#8B4513) | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Background - red | basic | ❌ | ❌ | +| Background - blue | basic | ❌ | ❌ | +| Background - green | basic | ❌ | ❌ | +| Background - custom (#8B4513) | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Background - red | basic | ❌ | +| Background - blue | basic | ❌ | +| Background - green | basic | ❌ | +| Background - custom (#8B4513) | basic | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Background - red | basic | ✅ | ❌ | +| Background - blue | basic | ✅ | ❌ | +| Background - green | basic | ✅ | ❌ | +| Background - custom (#8B4513) | basic | ✅ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Background - red | basic | ❌ | ❌ | +| Background - blue | basic | ❌ | ❌ | +| Background - green | basic | ❌ | ❌ | +| Background - custom (#8B4513) | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Background - red | basic | ✅ | +| Background - blue | basic | ✅ | +| Background - green | basic | ❌ | +| Background - custom (#8B4513) | basic | ❌ | + + +### borders + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🟠 1 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Border - thin all edges | basic | ✅ | ✅ | +| Border - medium all edges | basic | ✅ | ✅ | +| Border - thick all edges | basic | ✅ | ✅ | +| Border - double line | basic | ✅ | ✅ | +| Border - dashed | basic | ✅ | ✅ | +| Border - dotted | basic | ✅ | ✅ | +| Border - dash-dot | basic | ✅ | ✅ | +| Border - dash-dot-dot | basic | ✅ | ✅ | +| Border - top only | basic | ✅ | ✅ | +| Border - bottom only | basic | ✅ | ✅ | +| Border - left only | basic | ✅ | ✅ | +| Border - right only | basic | ✅ | ✅ | +| Border - diagonal up | basic | ❌ | ❌ | +| Border - diagonal down | basic | ❌ | ❌ | +| Border - diagonal both | basic | ❌ | ❌ | +| Border - red color | basic | ✅ | ✅ | +| Border - blue color | basic | ✅ | ✅ | +| Border - custom color (#8B4513) | basic | ✅ | ✅ | +| Border - mixed styles per edge | basic | ✅ | ✅ | +| Border - mixed colors per edge | basic | ✅ | ✅ | + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Border - thin all edges | basic | ❌ | +| Border - medium all edges | basic | ❌ | +| Border - thick all edges | basic | ❌ | +| Border - double line | basic | ❌ | +| Border - dashed | basic | ❌ | +| Border - dotted | basic | ❌ | +| Border - dash-dot | basic | ❌ | +| Border - dash-dot-dot | basic | ❌ | +| Border - top only | basic | ❌ | +| Border - bottom only | basic | ❌ | +| Border - left only | basic | ❌ | +| Border - right only | basic | ❌ | +| Border - diagonal up | basic | ❌ | +| Border - diagonal down | basic | ❌ | +| Border - diagonal both | basic | ❌ | +| Border - red color | basic | ❌ | +| Border - blue color | basic | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | +| Border - mixed styles per edge | basic | ❌ | +| Border - mixed colors per edge | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Border - thin all edges | basic | ❌ | ❌ | +| Border - medium all edges | basic | ❌ | ❌ | +| Border - thick all edges | basic | ❌ | ❌ | +| Border - double line | basic | ❌ | ❌ | +| Border - dashed | basic | ❌ | ❌ | +| Border - dotted | basic | ❌ | ❌ | +| Border - dash-dot | basic | ❌ | ❌ | +| Border - dash-dot-dot | basic | ❌ | ❌ | +| Border - top only | basic | ❌ | ❌ | +| Border - bottom only | basic | ❌ | ❌ | +| Border - left only | basic | ❌ | ❌ | +| Border - right only | basic | ❌ | ❌ | +| Border - diagonal up | basic | ❌ | ❌ | +| Border - diagonal down | basic | ❌ | ❌ | +| Border - diagonal both | basic | ❌ | ❌ | +| Border - red color | basic | ❌ | ❌ | +| Border - blue color | basic | ❌ | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | ❌ | +| Border - mixed styles per edge | basic | ❌ | ❌ | +| Border - mixed colors per edge | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Border - thin all edges | basic | ❌ | +| Border - medium all edges | basic | ❌ | +| Border - thick all edges | basic | ❌ | +| Border - double line | basic | ❌ | +| Border - dashed | basic | ❌ | +| Border - dotted | basic | ❌ | +| Border - dash-dot | basic | ❌ | +| Border - dash-dot-dot | basic | ❌ | +| Border - top only | basic | ❌ | +| Border - bottom only | basic | ❌ | +| Border - left only | basic | ❌ | +| Border - right only | basic | ❌ | +| Border - diagonal up | basic | ❌ | +| Border - diagonal down | basic | ❌ | +| Border - diagonal both | basic | ❌ | +| Border - red color | basic | ❌ | +| Border - blue color | basic | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | +| Border - mixed styles per edge | basic | ❌ | +| Border - mixed colors per edge | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Border - thin all edges | basic | ❌ | ❌ | +| Border - medium all edges | basic | ❌ | ❌ | +| Border - thick all edges | basic | ❌ | ❌ | +| Border - double line | basic | ❌ | ❌ | +| Border - dashed | basic | ❌ | ❌ | +| Border - dotted | basic | ❌ | ❌ | +| Border - dash-dot | basic | ❌ | ❌ | +| Border - dash-dot-dot | basic | ❌ | ❌ | +| Border - top only | basic | ❌ | ❌ | +| Border - bottom only | basic | ❌ | ❌ | +| Border - left only | basic | ❌ | ❌ | +| Border - right only | basic | ❌ | ❌ | +| Border - diagonal up | basic | ❌ | ❌ | +| Border - diagonal down | basic | ❌ | ❌ | +| Border - diagonal both | basic | ❌ | ❌ | +| Border - red color | basic | ❌ | ❌ | +| Border - blue color | basic | ❌ | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | ❌ | +| Border - mixed styles per edge | basic | ❌ | ❌ | +| Border - mixed colors per edge | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Border - thin all edges | basic | ❌ | ❌ | +| Border - medium all edges | basic | ❌ | ❌ | +| Border - thick all edges | basic | ❌ | ❌ | +| Border - double line | basic | ❌ | ❌ | +| Border - dashed | basic | ❌ | ❌ | +| Border - dotted | basic | ❌ | ❌ | +| Border - dash-dot | basic | ❌ | ❌ | +| Border - dash-dot-dot | basic | ❌ | ❌ | +| Border - top only | basic | ❌ | ❌ | +| Border - bottom only | basic | ❌ | ❌ | +| Border - left only | basic | ❌ | ❌ | +| Border - right only | basic | ❌ | ❌ | +| Border - diagonal up | basic | ❌ | ❌ | +| Border - diagonal down | basic | ❌ | ❌ | +| Border - diagonal both | basic | ❌ | ❌ | +| Border - red color | basic | ❌ | ❌ | +| Border - blue color | basic | ❌ | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | ❌ | +| Border - mixed styles per edge | basic | ❌ | ❌ | +| Border - mixed colors per edge | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Border - thin all edges | basic | ❌ | +| Border - medium all edges | basic | ❌ | +| Border - thick all edges | basic | ❌ | +| Border - double line | basic | ❌ | +| Border - dashed | basic | ❌ | +| Border - dotted | basic | ❌ | +| Border - dash-dot | basic | ❌ | +| Border - dash-dot-dot | basic | ❌ | +| Border - top only | basic | ❌ | +| Border - bottom only | basic | ❌ | +| Border - left only | basic | ❌ | +| Border - right only | basic | ❌ | +| Border - diagonal up | basic | ❌ | +| Border - diagonal down | basic | ❌ | +| Border - diagonal both | basic | ❌ | +| Border - red color | basic | ❌ | +| Border - blue color | basic | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | +| Border - mixed styles per edge | basic | ❌ | +| Border - mixed colors per edge | basic | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Border - thin all edges | basic | ❌ | ❌ | +| Border - medium all edges | basic | ❌ | ❌ | +| Border - thick all edges | basic | ❌ | ❌ | +| Border - double line | basic | ❌ | ❌ | +| Border - dashed | basic | ❌ | ❌ | +| Border - dotted | basic | ❌ | ❌ | +| Border - dash-dot | basic | ❌ | ❌ | +| Border - dash-dot-dot | basic | ❌ | ❌ | +| Border - top only | basic | ❌ | ❌ | +| Border - bottom only | basic | ❌ | ❌ | +| Border - left only | basic | ❌ | ❌ | +| Border - right only | basic | ❌ | ❌ | +| Border - diagonal up | basic | ❌ | ❌ | +| Border - diagonal down | basic | ❌ | ❌ | +| Border - diagonal both | basic | ❌ | ❌ | +| Border - red color | basic | ❌ | ❌ | +| Border - blue color | basic | ❌ | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | ❌ | +| Border - mixed styles per edge | basic | ❌ | ❌ | +| Border - mixed colors per edge | basic | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Border - thin all edges | basic | ❌ | ❌ | +| Border - medium all edges | basic | ❌ | ❌ | +| Border - thick all edges | basic | ❌ | ❌ | +| Border - double line | basic | ❌ | ❌ | +| Border - dashed | basic | ❌ | ❌ | +| Border - dotted | basic | ❌ | ❌ | +| Border - dash-dot | basic | ❌ | ❌ | +| Border - dash-dot-dot | basic | ❌ | ❌ | +| Border - top only | basic | ❌ | ❌ | +| Border - bottom only | basic | ❌ | ❌ | +| Border - left only | basic | ❌ | ❌ | +| Border - right only | basic | ❌ | ❌ | +| Border - diagonal up | basic | ❌ | ❌ | +| Border - diagonal down | basic | ❌ | ❌ | +| Border - diagonal both | basic | ❌ | ❌ | +| Border - red color | basic | ❌ | ❌ | +| Border - blue color | basic | ❌ | ❌ | +| Border - custom color (#8B4513) | basic | ❌ | ❌ | +| Border - mixed styles per edge | basic | ❌ | ❌ | +| Border - mixed colors per edge | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Border - thin all edges | basic | ✅ | +| Border - medium all edges | basic | ✅ | +| Border - thick all edges | basic | ✅ | +| Border - double line | basic | ✅ | +| Border - dashed | basic | ✅ | +| Border - dotted | basic | ✅ | +| Border - dash-dot | basic | ✅ | +| Border - dash-dot-dot | basic | ✅ | +| Border - top only | basic | ✅ | +| Border - bottom only | basic | ✅ | +| Border - left only | basic | ✅ | +| Border - right only | basic | ✅ | +| Border - diagonal up | basic | ❌ | +| Border - diagonal down | basic | ❌ | +| Border - diagonal both | basic | ✅ | +| Border - red color | basic | ✅ | +| Border - blue color | basic | ✅ | +| Border - custom color (#8B4513) | basic | ❌ | +| Border - mixed styles per edge | basic | ✅ | +| Border - mixed colors per edge | basic | ❌ | + + +### cell_values + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| String - simple | basic | ✅ | ✅ | +| String - unicode | basic | ✅ | ✅ | +| String - empty | basic | ✅ | ✅ | +| String - long (1000 chars) | basic | ✅ | ✅ | +| String - with newlines | basic | ✅ | ✅ | +| Number - integer | basic | ✅ | ✅ | +| Number - float | basic | ✅ | ✅ | +| Number - negative | basic | ✅ | ✅ | +| Number - large | basic | ✅ | ✅ | +| Number - scientific notation | basic | ✅ | ✅ | +| Date - standard | basic | ❌ | ✅ | +| DateTime - with time | basic | ❌ | ✅ | +| Boolean - TRUE | basic | ✅ | ✅ | +| Boolean - FALSE | basic | ✅ | ✅ | +| Error - #DIV/0! | basic | ✅ | ✅ | +| Error - #N/A | basic | ✅ | ✅ | +| Error - #VALUE! | basic | ✅ | ✅ | +| Blank cell | basic | ✅ | ✅ | + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| String - simple | basic | ✅ | ✅ | +| String - unicode | basic | ✅ | ✅ | +| String - empty | basic | ✅ | ✅ | +| String - long (1000 chars) | basic | ✅ | ✅ | +| String - with newlines | basic | ✅ | ✅ | +| Number - integer | basic | ✅ | ✅ | +| Number - float | basic | ✅ | ✅ | +| Number - negative | basic | ✅ | ✅ | +| Number - large | basic | ✅ | ✅ | +| Number - scientific notation | basic | ✅ | ✅ | +| Date - standard | basic | ✅ | ✅ | +| DateTime - with time | basic | ✅ | ✅ | +| Boolean - TRUE | basic | ❌ | ✅ | +| Boolean - FALSE | basic | ❌ | ✅ | +| Error - #DIV/0! | basic | ✅ | ✅ | +| Error - #N/A | basic | ✅ | ✅ | +| Error - #VALUE! | basic | ✅ | ✅ | +| Blank cell | basic | ✅ | ✅ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🟢 3 + +**pandas** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| String - simple | basic | ✅ | ✅ | +| String - unicode | basic | ✅ | ✅ | +| String - empty | basic | ✅ | ✅ | +| String - long (1000 chars) | basic | ✅ | ✅ | +| String - with newlines | basic | ✅ | ✅ | +| Number - integer | basic | ✅ | ✅ | +| Number - float | basic | ✅ | ✅ | +| Number - negative | basic | ✅ | ✅ | +| Number - large | basic | ✅ | ✅ | +| Number - scientific notation | basic | ✅ | ✅ | +| Date - standard | basic | ✅ | ✅ | +| DateTime - with time | basic | ✅ | ✅ | +| Boolean - TRUE | basic | ✅ | ✅ | +| Boolean - FALSE | basic | ✅ | ✅ | +| Error - #DIV/0! | basic | ❌ | ✅ | +| Error - #N/A | basic | ❌ | ✅ | +| Error - #VALUE! | basic | ❌ | ✅ | +| Blank cell | basic | ✅ | ✅ | + +**polars** — Read: 🟠 1 + +| Test | Importance | Read | +|------|-----------|------| +| String - simple | basic | ✅ | +| String - unicode | basic | ✅ | +| String - empty | basic | ✅ | +| String - long (1000 chars) | basic | ✅ | +| String - with newlines | basic | ✅ | +| Number - integer | basic | ✅ | +| Number - float | basic | ✅ | +| Number - negative | basic | ✅ | +| Number - large | basic | ✅ | +| Number - scientific notation | basic | ✅ | +| Date - standard | basic | ✅ | +| DateTime - with time | basic | ✅ | +| Boolean - TRUE | basic | ✅ | +| Boolean - FALSE | basic | ✅ | +| Error - #DIV/0! | basic | ❌ | +| Error - #N/A | basic | ❌ | +| Error - #VALUE! | basic | ❌ | +| Blank cell | basic | ✅ | + +**pyexcel** — Read: 🟢 3 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| String - simple | basic | ✅ | ❌ | +| String - unicode | basic | ✅ | ❌ | +| String - empty | basic | ✅ | ❌ | +| String - long (1000 chars) | basic | ✅ | ❌ | +| String - with newlines | basic | ✅ | ❌ | +| Number - integer | basic | ✅ | ❌ | +| Number - float | basic | ✅ | ❌ | +| Number - negative | basic | ✅ | ❌ | +| Number - large | basic | ✅ | ❌ | +| Number - scientific notation | basic | ✅ | ❌ | +| Date - standard | basic | ✅ | ❌ | +| DateTime - with time | basic | ✅ | ❌ | +| Boolean - TRUE | basic | ✅ | ❌ | +| Boolean - FALSE | basic | ✅ | ❌ | +| Error - #DIV/0! | basic | ✅ | ❌ | +| Error - #N/A | basic | ✅ | ❌ | +| Error - #VALUE! | basic | ✅ | ❌ | +| Blank cell | basic | ✅ | ❌ | + +**pylightxl** — Read: 🟢 3 | Write: 🔴 0 +- Notes: Known limitation: pylightxl cell-values write has date/boolean/error fidelity limits due to writer encoding behavior. + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| String - simple | basic | ✅ | ❌ | +| String - unicode | basic | ✅ | ❌ | +| String - empty | basic | ✅ | ❌ | +| String - long (1000 chars) | basic | ✅ | ❌ | +| String - with newlines | basic | ✅ | ❌ | +| Number - integer | basic | ✅ | ❌ | +| Number - float | basic | ✅ | ❌ | +| Number - negative | basic | ✅ | ❌ | +| Number - large | basic | ✅ | ❌ | +| Number - scientific notation | basic | ✅ | ❌ | +| Date - standard | basic | ✅ | ❌ | +| DateTime - with time | basic | ✅ | ❌ | +| Boolean - TRUE | basic | ✅ | ❌ | +| Boolean - FALSE | basic | ✅ | ❌ | +| Error - #DIV/0! | basic | ✅ | ❌ | +| Error - #N/A | basic | ✅ | ❌ | +| Error - #VALUE! | basic | ✅ | ❌ | +| Blank cell | basic | ✅ | ❌ | + +**python-calamine** — Read: 🟠 1 +- Notes: Known limitation: python-calamine can surface formula error cells as blank values in current API responses. + +| Test | Importance | Read | +|------|-----------|------| +| String - simple | basic | ✅ | +| String - unicode | basic | ✅ | +| String - empty | basic | ✅ | +| String - long (1000 chars) | basic | ✅ | +| String - with newlines | basic | ✅ | +| Number - integer | basic | ✅ | +| Number - float | basic | ✅ | +| Number - negative | basic | ✅ | +| Number - large | basic | ✅ | +| Number - scientific notation | basic | ✅ | +| Date - standard | basic | ✅ | +| DateTime - with time | basic | ✅ | +| Boolean - TRUE | basic | ✅ | +| Boolean - FALSE | basic | ✅ | +| Error - #DIV/0! | basic | ❌ | +| Error - #N/A | basic | ❌ | +| Error - #VALUE! | basic | ❌ | +| Blank cell | basic | ✅ | + +**sheetjs** — Read: 🟢 3 | Write: 🟢 3 + +**tablib** — Read: 🟢 3 | Write: 🟢 3 + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🟢 3 + + +### chart_anchor + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**libreoffice** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Chart: bar with twoCell anchor | basic | ❌ | +| Chart: line with twoCell anchor | edge | ❌ | + + +### comments + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Comment: legacy note | basic | ✅ | ❌ | +| Comment: threaded | edge | ✅ | ❌ | +| Comment: second author | edge | ✅ | ❌ | + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Comment: legacy note | basic | ❌ | +| Comment: threaded | edge | ❌ | +| Comment: second author | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Comment: legacy note | basic | ❌ | ❌ | +| Comment: threaded | edge | ❌ | ❌ | +| Comment: second author | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Comment: legacy note | basic | ❌ | +| Comment: threaded | edge | ❌ | +| Comment: second author | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Comment: legacy note | basic | ❌ | ❌ | +| Comment: threaded | edge | ❌ | ❌ | +| Comment: second author | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Comment: legacy note | basic | ❌ | ❌ | +| Comment: threaded | edge | ❌ | ❌ | +| Comment: second author | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Comment: legacy note | basic | ❌ | +| Comment: threaded | edge | ❌ | +| Comment: second author | edge | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🟢 3 + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Comment: legacy note | basic | ❌ | ❌ | +| Comment: threaded | edge | ❌ | ❌ | +| Comment: second author | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Comment: legacy note | basic | ❌ | +| Comment: threaded | edge | ❌ | +| Comment: second author | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Comment: legacy note | basic | ❌ | +| Comment: threaded | edge | ❌ | +| Comment: second author | edge | ❌ | + + +### conditional_formatting + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟡 2 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ✅ | ✅ | +| CF: formula rule with cross-sheet ref | edge | ✅ | ✅ | +| CF: text contains | edge | ✅ | ✅ | +| CF: data bar | edge | ✅ | ✅ | +| CF: 3-color scale | edge | ✅ | ✅ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**libreoffice** — Read: 🟡 2 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ✅ | ❌ | +| CF: formula rule with cross-sheet ref | edge | ✅ | ❌ | +| CF: text contains | edge | ✅ | ❌ | +| CF: data bar | edge | ✅ | ✅ | +| CF: 3-color scale | edge | ✅ | ❌ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| CF: cell > 5 (yellow fill) | basic | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | +| CF: text contains | edge | ❌ | +| CF: data bar | edge | ❌ | +| CF: 3-color scale | edge | ❌ | +| CF: stop-if-true priority | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | ❌ | +| CF: text contains | edge | ❌ | ❌ | +| CF: data bar | edge | ❌ | ❌ | +| CF: 3-color scale | edge | ❌ | ❌ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| CF: cell > 5 (yellow fill) | basic | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | +| CF: text contains | edge | ❌ | +| CF: data bar | edge | ❌ | +| CF: 3-color scale | edge | ❌ | +| CF: stop-if-true priority | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | ❌ | +| CF: text contains | edge | ❌ | ❌ | +| CF: data bar | edge | ❌ | ❌ | +| CF: 3-color scale | edge | ❌ | ❌ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | ❌ | +| CF: text contains | edge | ❌ | ❌ | +| CF: data bar | edge | ❌ | ❌ | +| CF: 3-color scale | edge | ❌ | ❌ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| CF: cell > 5 (yellow fill) | basic | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | +| CF: text contains | edge | ❌ | +| CF: data bar | edge | ❌ | +| CF: 3-color scale | edge | ❌ | +| CF: stop-if-true priority | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | ❌ | +| CF: text contains | edge | ❌ | ❌ | +| CF: data bar | edge | ❌ | ❌ | +| CF: 3-color scale | edge | ❌ | ❌ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | ❌ | +| CF: text contains | edge | ❌ | ❌ | +| CF: data bar | edge | ❌ | ❌ | +| CF: 3-color scale | edge | ❌ | ❌ | +| CF: stop-if-true priority | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| CF: cell > 5 (yellow fill) | basic | ❌ | +| CF: formula rule with cross-sheet ref | edge | ❌ | +| CF: text contains | edge | ❌ | +| CF: data bar | edge | ❌ | +| CF: 3-color scale | edge | ❌ | +| CF: stop-if-true priority | edge | ❌ | + + +### data_validation + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| DV: list from CSV | basic | ✅ | ✅ | +| DV: list from range | edge | ✅ | ✅ | +| DV: cross-sheet named range | edge | ✅ | ❌ | +| DV: custom formula | edge | ✅ | ✅ | +| DV: whole number with error | basic | ✅ | ✅ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| DV: list from CSV | basic | ❌ | +| DV: list from range | edge | ❌ | +| DV: cross-sheet named range | edge | ❌ | +| DV: custom formula | edge | ❌ | +| DV: whole number with error | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| DV: list from CSV | basic | ❌ | ❌ | +| DV: list from range | edge | ❌ | ❌ | +| DV: cross-sheet named range | edge | ❌ | ❌ | +| DV: custom formula | edge | ❌ | ❌ | +| DV: whole number with error | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| DV: list from CSV | basic | ❌ | +| DV: list from range | edge | ❌ | +| DV: cross-sheet named range | edge | ❌ | +| DV: custom formula | edge | ❌ | +| DV: whole number with error | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| DV: list from CSV | basic | ❌ | ❌ | +| DV: list from range | edge | ❌ | ❌ | +| DV: cross-sheet named range | edge | ❌ | ❌ | +| DV: custom formula | edge | ❌ | ❌ | +| DV: whole number with error | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| DV: list from CSV | basic | ❌ | ❌ | +| DV: list from range | edge | ❌ | ❌ | +| DV: cross-sheet named range | edge | ❌ | ❌ | +| DV: custom formula | edge | ❌ | ❌ | +| DV: whole number with error | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| DV: list from CSV | basic | ❌ | +| DV: list from range | edge | ❌ | +| DV: cross-sheet named range | edge | ❌ | +| DV: custom formula | edge | ❌ | +| DV: whole number with error | basic | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| DV: list from CSV | basic | ❌ | ❌ | +| DV: list from range | edge | ❌ | ❌ | +| DV: cross-sheet named range | edge | ❌ | ❌ | +| DV: custom formula | edge | ❌ | ❌ | +| DV: whole number with error | basic | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| DV: list from CSV | basic | ❌ | ❌ | +| DV: list from range | edge | ❌ | ❌ | +| DV: cross-sheet named range | edge | ❌ | ❌ | +| DV: custom formula | edge | ❌ | ❌ | +| DV: whole number with error | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| DV: list from CSV | basic | ❌ | +| DV: list from range | edge | ❌ | +| DV: cross-sheet named range | edge | ❌ | +| DV: custom formula | edge | ❌ | +| DV: whole number with error | basic | ❌ | + + +### dimensions + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ✅ | ✅ | +| Row height - 45 | basic | ✅ | ✅ | +| Column width - D = 20 | basic | ❌ | ✅ | +| Column width - E = 8 | basic | ❌ | ✅ | + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ✅ | ✅ | +| Row height - 45 | basic | ✅ | ✅ | +| Column width - D = 20 | basic | ❌ | ✅ | +| Column width - E = 8 | basic | ❌ | ✅ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Row height - 30 | basic | ❌ | +| Row height - 45 | basic | ❌ | +| Column width - D = 20 | basic | ❌ | +| Column width - E = 8 | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ❌ | ❌ | +| Row height - 45 | basic | ❌ | ❌ | +| Column width - D = 20 | basic | ❌ | ❌ | +| Column width - E = 8 | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Row height - 30 | basic | ❌ | +| Row height - 45 | basic | ❌ | +| Column width - D = 20 | basic | ❌ | +| Column width - E = 8 | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ❌ | ❌ | +| Row height - 45 | basic | ❌ | ❌ | +| Column width - D = 20 | basic | ❌ | ❌ | +| Column width - E = 8 | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ❌ | ❌ | +| Row height - 45 | basic | ❌ | ❌ | +| Column width - D = 20 | basic | ❌ | ❌ | +| Column width - E = 8 | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Row height - 30 | basic | ❌ | +| Row height - 45 | basic | ❌ | +| Column width - D = 20 | basic | ❌ | +| Column width - E = 8 | basic | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🟠 1 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ✅ | ❌ | +| Row height - 45 | basic | ✅ | ❌ | +| Column width - D = 20 | basic | ✅ | ✅ | +| Column width - E = 8 | basic | ✅ | ✅ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Row height - 30 | basic | ❌ | ❌ | +| Row height - 45 | basic | ❌ | ❌ | +| Column width - D = 20 | basic | ❌ | ❌ | +| Column width - E = 8 | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Row height - 30 | basic | ❌ | +| Row height - 45 | basic | ❌ | +| Column width - D = 20 | basic | ✅ | +| Column width - E = 8 | basic | ✅ | + +**xlwt** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Row height - 30 | basic | ❌ | +| Row height - 45 | basic | ❌ | +| Column width - D = 20 | basic | ✅ | +| Column width - E = 8 | basic | ✅ | + + +### formulas + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ✅ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ✅ | ✅ | +| Formula - cross sheet | basic | ✅ | ✅ | + +**libreoffice** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ✅ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ✅ | ✅ | +| Formula - cross sheet | basic | ✅ | ✅ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🟢 3 + +**pandas** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ❌ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ❌ | ✅ | +| Formula - cross sheet | basic | ❌ | ✅ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Formula - SUM | basic | ❌ | +| Formula - cell reference | basic | ❌ | +| Formula - concat | basic | ❌ | +| Formula - cross sheet | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ❌ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ❌ | ✅ | +| Formula - cross sheet | basic | ❌ | ✅ | + +**pylightxl** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ❌ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ❌ | ✅ | +| Formula - cross sheet | basic | ❌ | ✅ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Formula - SUM | basic | ❌ | +| Formula - cell reference | basic | ❌ | +| Formula - concat | basic | ❌ | +| Formula - cross sheet | basic | ❌ | + +**sheetjs** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ✅ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ✅ | ✅ | +| Formula - cross sheet | basic | ✅ | ✅ | + +**tablib** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Formula - SUM | basic | ❌ | ✅ | +| Formula - cell reference | basic | ❌ | ✅ | +| Formula - concat | basic | ❌ | ✅ | +| Formula - cross sheet | basic | ❌ | ✅ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Formula - SUM | basic | ❌ | +| Formula - cell reference | basic | ❌ | +| Formula - concat | basic | ❌ | +| Formula - cross sheet | basic | ❌ | + + +### freeze_panes + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Freeze panes at B2 | basic | ✅ | ✅ | +| Freeze panes at D5 | edge | ✅ | ✅ | +| Split panes row=2 col=1 | edge | ✅ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Freeze panes at B2 | basic | ❌ | +| Freeze panes at D5 | edge | ❌ | +| Split panes row=2 col=1 | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Freeze panes at B2 | basic | ❌ | ❌ | +| Freeze panes at D5 | edge | ❌ | ❌ | +| Split panes row=2 col=1 | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Freeze panes at B2 | basic | ❌ | +| Freeze panes at D5 | edge | ❌ | +| Split panes row=2 col=1 | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Freeze panes at B2 | basic | ❌ | ❌ | +| Freeze panes at D5 | edge | ❌ | ❌ | +| Split panes row=2 col=1 | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Freeze panes at B2 | basic | ❌ | ❌ | +| Freeze panes at D5 | edge | ❌ | ❌ | +| Split panes row=2 col=1 | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Freeze panes at B2 | basic | ❌ | +| Freeze panes at D5 | edge | ❌ | +| Split panes row=2 col=1 | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Freeze panes at B2 | basic | ❌ | ❌ | +| Freeze panes at D5 | edge | ❌ | ❌ | +| Split panes row=2 col=1 | edge | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Freeze panes at B2 | basic | ❌ | ❌ | +| Freeze panes at D5 | edge | ❌ | ❌ | +| Split panes row=2 col=1 | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Freeze panes at B2 | basic | ❌ | +| Freeze panes at D5 | edge | ❌ | +| Split panes row=2 col=1 | edge | ❌ | + + +### hyperlinks + +**aspose-cells-foss** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ✅ | +| Hyperlink: internal sheet | edge | ❌ | ✅ | +| Hyperlink: mailto | basic | ❌ | ✅ | +| Hyperlink: long encoded URL | edge | ❌ | ✅ | + +**exceljs** — Read: 🔴 0 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ✅ | +| Hyperlink: internal sheet | edge | ❌ | ❌ | +| Hyperlink: mailto | basic | ❌ | ✅ | +| Hyperlink: long encoded URL | edge | ❌ | ✅ | + +**libreoffice** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ❌ | +| Hyperlink: internal sheet | edge | ❌ | ❌ | +| Hyperlink: mailto | basic | ❌ | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Hyperlink: external URL | basic | ❌ | +| Hyperlink: internal sheet | edge | ❌ | +| Hyperlink: mailto | basic | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ❌ | +| Hyperlink: internal sheet | edge | ❌ | ❌ | +| Hyperlink: mailto | basic | ❌ | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Hyperlink: external URL | basic | ❌ | +| Hyperlink: internal sheet | edge | ❌ | +| Hyperlink: mailto | basic | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ❌ | +| Hyperlink: internal sheet | edge | ❌ | ❌ | +| Hyperlink: mailto | basic | ❌ | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ❌ | +| Hyperlink: internal sheet | edge | ❌ | ❌ | +| Hyperlink: mailto | basic | ❌ | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Hyperlink: external URL | basic | ❌ | +| Hyperlink: internal sheet | edge | ❌ | +| Hyperlink: mailto | basic | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🟢 3 + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Hyperlink: external URL | basic | ❌ | ❌ | +| Hyperlink: internal sheet | edge | ❌ | ❌ | +| Hyperlink: mailto | basic | ❌ | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Hyperlink: external URL | basic | ❌ | +| Hyperlink: internal sheet | edge | ❌ | +| Hyperlink: mailto | basic | ❌ | +| Hyperlink: long encoded URL | edge | ❌ | + + +### images + +**aspose-cells-foss** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**exceljs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Image: one-cell anchor | basic | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Image: one-cell anchor | basic | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Image: one-cell anchor | basic | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Image: one-cell anchor | basic | ❌ | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Image: one-cell anchor | basic | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Image: one-cell anchor | basic | ❌ | +| Image: two-cell anchor with offset | edge | ❌ | + + +### merged_cells + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Merge horizontal B2:D2 | basic | ❌ | +| Merge vertical B3:B5 | basic | ❌ | +| Merge with non-top-left value | edge | ❌ | +| Merge with top-left fill | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Merge horizontal B2:D2 | basic | ❌ | ❌ | +| Merge vertical B3:B5 | basic | ❌ | ❌ | +| Merge with non-top-left value | edge | ❌ | ❌ | +| Merge with top-left fill | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Merge horizontal B2:D2 | basic | ❌ | +| Merge vertical B3:B5 | basic | ❌ | +| Merge with non-top-left value | edge | ❌ | +| Merge with top-left fill | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Merge horizontal B2:D2 | basic | ❌ | ❌ | +| Merge vertical B3:B5 | basic | ❌ | ❌ | +| Merge with non-top-left value | edge | ❌ | ❌ | +| Merge with top-left fill | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Merge horizontal B2:D2 | basic | ❌ | ❌ | +| Merge vertical B3:B5 | basic | ❌ | ❌ | +| Merge with non-top-left value | edge | ❌ | ❌ | +| Merge with top-left fill | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Merge horizontal B2:D2 | basic | ❌ | +| Merge vertical B3:B5 | basic | ❌ | +| Merge with non-top-left value | edge | ❌ | +| Merge with top-left fill | edge | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Merge horizontal B2:D2 | basic | ✅ | ✅ | +| Merge vertical B3:B5 | basic | ✅ | ✅ | +| Merge with non-top-left value | edge | ✅ | ✅ | +| Merge with top-left fill | edge | ✅ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Merge horizontal B2:D2 | basic | ❌ | ❌ | +| Merge vertical B3:B5 | basic | ❌ | ❌ | +| Merge with non-top-left value | edge | ❌ | ❌ | +| Merge with top-left fill | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Merge horizontal B2:D2 | basic | ❌ | +| Merge vertical B3:B5 | basic | ❌ | +| Merge with non-top-left value | edge | ❌ | +| Merge with top-left fill | edge | ❌ | + + +### multiple_sheets + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🟢 3 + +**pandas** — Read: 🟢 3 | Write: 🟢 3 + +**polars** — Read: 🟠 1 + +| Test | Importance | Read | +|------|-----------|------| +| Sheet names | basic | ✅ | +| Alpha value | basic | ✅ | +| Beta value | basic | ❌ | +| Gamma value | basic | ❌ | + +**pyexcel** — Read: 🟢 3 | Write: 🟢 3 + +**pylightxl** — Read: 🟢 3 | Write: 🟢 3 + +**python-calamine** — Read: 🟢 3 + +**sheetjs** — Read: 🟢 3 | Write: 🟢 3 + +**tablib** — Read: 🟢 3 | Write: 🟢 3 + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🟢 3 + + +### named_ranges + +**aspose-cells-foss** — Read: 🟡 2 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Named range: single cell | basic | ✅ | ✅ | +| Named range: cell range | basic | ✅ | ✅ | +| Named range: used in formula | basic | ✅ | ✅ | +| Named range: sheet-scoped | edge | ❌ | ✅ | +| Named range: cross-sheet reference | edge | ✅ | ✅ | +| Named range: underscore name | edge | ✅ | ✅ | + +**exceljs** — Read: 🟡 2 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Named range: single cell | basic | ✅ | ✅ | +| Named range: cell range | basic | ✅ | ✅ | +| Named range: used in formula | basic | ✅ | ✅ | +| Named range: sheet-scoped | edge | ❌ | ❌ | +| Named range: cross-sheet reference | edge | ✅ | ✅ | +| Named range: underscore name | edge | ✅ | ✅ | + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Named range: single cell | basic | ❌ | +| Named range: cell range | basic | ❌ | +| Named range: used in formula | basic | ❌ | +| Named range: sheet-scoped | edge | ❌ | +| Named range: cross-sheet reference | edge | ❌ | +| Named range: underscore name | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Named range: single cell | basic | ❌ | ❌ | +| Named range: cell range | basic | ❌ | ❌ | +| Named range: used in formula | basic | ❌ | ❌ | +| Named range: sheet-scoped | edge | ❌ | ❌ | +| Named range: cross-sheet reference | edge | ❌ | ❌ | +| Named range: underscore name | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Named range: single cell | basic | ❌ | +| Named range: cell range | basic | ❌ | +| Named range: used in formula | basic | ❌ | +| Named range: sheet-scoped | edge | ❌ | +| Named range: cross-sheet reference | edge | ❌ | +| Named range: underscore name | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Named range: single cell | basic | ❌ | ❌ | +| Named range: cell range | basic | ❌ | ❌ | +| Named range: used in formula | basic | ❌ | ❌ | +| Named range: sheet-scoped | edge | ❌ | ❌ | +| Named range: cross-sheet reference | edge | ❌ | ❌ | +| Named range: underscore name | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Named range: single cell | basic | ❌ | ❌ | +| Named range: cell range | basic | ❌ | ❌ | +| Named range: used in formula | basic | ❌ | ❌ | +| Named range: sheet-scoped | edge | ❌ | ❌ | +| Named range: cross-sheet reference | edge | ❌ | ❌ | +| Named range: underscore name | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Named range: single cell | basic | ❌ | +| Named range: cell range | basic | ❌ | +| Named range: used in formula | basic | ❌ | +| Named range: sheet-scoped | edge | ❌ | +| Named range: cross-sheet reference | edge | ❌ | +| Named range: underscore name | edge | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🟢 3 + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Named range: single cell | basic | ❌ | ❌ | +| Named range: cell range | basic | ❌ | ❌ | +| Named range: used in formula | basic | ❌ | ❌ | +| Named range: sheet-scoped | edge | ❌ | ❌ | +| Named range: cross-sheet reference | edge | ❌ | ❌ | +| Named range: underscore name | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Named range: single cell | basic | ❌ | +| Named range: cell range | basic | ❌ | +| Named range: used in formula | basic | ❌ | +| Named range: sheet-scoped | edge | ❌ | +| Named range: cross-sheet reference | edge | ❌ | +| Named range: underscore name | edge | ❌ | + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Named range: single cell | basic | ❌ | +| Named range: cell range | basic | ❌ | +| Named range: used in formula | basic | ❌ | +| Named range: sheet-scoped | edge | ❌ | +| Named range: cross-sheet reference | edge | ❌ | +| Named range: underscore name | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Named range: single cell | basic | ❌ | +| Named range: cell range | basic | ❌ | +| Named range: used in formula | basic | ❌ | +| Named range: sheet-scoped | edge | ❌ | +| Named range: cross-sheet reference | edge | ❌ | +| Named range: underscore name | edge | ❌ | + + +### number_formats + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟠 1 | Write: 🟠 1 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Format - currency | basic | ✅ | ❌ | +| Format - percent | basic | ✅ | ✅ | +| Format - date | basic | ❌ | ✅ | +| Format - scientific | basic | ✅ | ✅ | +| Format - custom text | basic | ✅ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Format - currency | basic | ❌ | +| Format - percent | basic | ❌ | +| Format - date | basic | ❌ | +| Format - scientific | basic | ❌ | +| Format - custom text | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Format - currency | basic | ❌ | ❌ | +| Format - percent | basic | ❌ | ❌ | +| Format - date | basic | ❌ | ❌ | +| Format - scientific | basic | ❌ | ❌ | +| Format - custom text | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Format - currency | basic | ❌ | +| Format - percent | basic | ❌ | +| Format - date | basic | ❌ | +| Format - scientific | basic | ❌ | +| Format - custom text | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Format - currency | basic | ❌ | ❌ | +| Format - percent | basic | ❌ | ❌ | +| Format - date | basic | ❌ | ❌ | +| Format - scientific | basic | ❌ | ❌ | +| Format - custom text | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Format - currency | basic | ❌ | ❌ | +| Format - percent | basic | ❌ | ❌ | +| Format - date | basic | ❌ | ❌ | +| Format - scientific | basic | ❌ | ❌ | +| Format - custom text | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Format - currency | basic | ❌ | +| Format - percent | basic | ❌ | +| Format - date | basic | ❌ | +| Format - scientific | basic | ❌ | +| Format - custom text | basic | ❌ | + +**sheetjs** — Read: 🟢 3 | Write: 🟢 3 + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Format - currency | basic | ❌ | ❌ | +| Format - percent | basic | ❌ | ❌ | +| Format - date | basic | ❌ | ❌ | +| Format - scientific | basic | ❌ | ❌ | +| Format - custom text | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🟢 3 + + +### page_setup + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ✅ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**exceljs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | ❌ | +| Page setup: print titles + header/footer | edge | ✅ | ❌ | + +**libreoffice** — Read: 🟠 1 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ✅ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Page setup: landscape + fit-to-width | basic | ❌ | +| Page setup: portrait at 75% scale | basic | ❌ | +| Page setup: print titles + header/footer | edge | ❌ | + + +### pivot_tables + +**aspose-cells-foss** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**exceljs** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**libreoffice** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**openpyxl** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**openpyxl-readonly** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**pandas** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**polars** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**pyexcel** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**pylightxl** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**python-calamine** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**sheetjs** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**tablib** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**wolfxl** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**xlsxwriter-constmem** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + +**xlwt** +- Notes: Unsupported on macOS without a Windows-generated pivot fixture (fixtures/excel/tier2/15_pivot_tables.xlsx). + + +### sheet_protection + +**aspose-cells-foss** — Read: 🟢 3 | Write: 🟢 3 + +**exceljs** — Read: 🟠 1 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ✅ | ✅ | +| Protection: with password hash | basic | ❌ | ✅ | +| Protection: granular attribute flags | edge | ✅ | ✅ | + +**libreoffice** — Read: 🔴 0 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | ✅ | +| Protection: with password hash | basic | ❌ | ✅ | +| Protection: granular attribute flags | edge | ❌ | ❌ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | ❌ | +| Protection: with password hash | basic | ❌ | ❌ | +| Protection: granular attribute flags | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | ❌ | +| Protection: with password hash | basic | ❌ | ❌ | +| Protection: granular attribute flags | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | ❌ | +| Protection: with password hash | basic | ❌ | ❌ | +| Protection: granular attribute flags | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | ✅ | +| Protection: with password hash | basic | ❌ | ✅ | +| Protection: granular attribute flags | edge | ❌ | ✅ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | ❌ | +| Protection: with password hash | basic | ❌ | ❌ | +| Protection: granular attribute flags | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Protection: basic (OOXML defaults) | basic | ❌ | +| Protection: with password hash | basic | ❌ | +| Protection: granular attribute flags | edge | ❌ | + + +### tables + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🟠 1 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ✅ | ✅ | +| Table: with totals row | basic | ❌ | ❌ | +| Table: no style | basic | ❌ | ❌ | +| Table: single column | edge | ✅ | ✅ | +| Table: header only (no data rows) | edge | ✅ | ✅ | +| Table: with autoFilter | edge | ✅ | ✅ | + +**exceljs** — Read: 🔴 0 | Write: 🟢 3 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ❌ | ✅ | +| Table: with totals row | basic | ❌ | ✅ | +| Table: no style | basic | ❌ | ✅ | +| Table: single column | edge | ❌ | ✅ | +| Table: header only (no data rows) | edge | ❌ | ✅ | +| Table: with autoFilter | edge | ❌ | ✅ | + +**libreoffice** — Read: 🟢 3 | Write: 🟡 2 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ✅ | ✅ | +| Table: with totals row | basic | ✅ | ✅ | +| Table: no style | basic | ✅ | ✅ | +| Table: single column | edge | ✅ | ✅ | +| Table: header only (no data rows) | edge | ✅ | ❌ | +| Table: with autoFilter | edge | ✅ | ✅ | + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Table: basic 3-col | basic | ❌ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ❌ | +| Table: single column | edge | ❌ | +| Table: header only (no data rows) | edge | ❌ | +| Table: with autoFilter | edge | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ❌ | ❌ | +| Table: with totals row | basic | ❌ | ❌ | +| Table: no style | basic | ❌ | ❌ | +| Table: single column | edge | ❌ | ❌ | +| Table: header only (no data rows) | edge | ❌ | ❌ | +| Table: with autoFilter | edge | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Table: basic 3-col | basic | ❌ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ❌ | +| Table: single column | edge | ❌ | +| Table: header only (no data rows) | edge | ❌ | +| Table: with autoFilter | edge | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ❌ | ❌ | +| Table: with totals row | basic | ❌ | ❌ | +| Table: no style | basic | ❌ | ❌ | +| Table: single column | edge | ❌ | ❌ | +| Table: header only (no data rows) | edge | ❌ | ❌ | +| Table: with autoFilter | edge | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ❌ | ❌ | +| Table: with totals row | basic | ❌ | ❌ | +| Table: no style | basic | ❌ | ❌ | +| Table: single column | edge | ❌ | ❌ | +| Table: header only (no data rows) | edge | ❌ | ❌ | +| Table: with autoFilter | edge | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Table: basic 3-col | basic | ❌ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ❌ | +| Table: single column | edge | ❌ | +| Table: header only (no data rows) | edge | ❌ | +| Table: with autoFilter | edge | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ❌ | ❌ | +| Table: with totals row | basic | ❌ | ❌ | +| Table: no style | basic | ❌ | ❌ | +| Table: single column | edge | ❌ | ❌ | +| Table: header only (no data rows) | edge | ❌ | ❌ | +| Table: with autoFilter | edge | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Table: basic 3-col | basic | ❌ | ❌ | +| Table: with totals row | basic | ❌ | ❌ | +| Table: no style | basic | ❌ | ❌ | +| Table: single column | edge | ❌ | ❌ | +| Table: header only (no data rows) | edge | ❌ | ❌ | +| Table: with autoFilter | edge | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Table: basic 3-col | basic | ❌ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ❌ | +| Table: single column | edge | ❌ | +| Table: header only (no data rows) | edge | ❌ | +| Table: with autoFilter | edge | ❌ | + +**xlsxwriter-constmem** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Table: basic 3-col | basic | ❌ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ❌ | +| Table: single column | edge | ❌ | +| Table: header only (no data rows) | edge | ❌ | +| Table: with autoFilter | edge | ❌ | + +**xlwt** — Write: 🔴 0 + +| Test | Importance | Write | +|------|-----------|-------| +| Table: basic 3-col | basic | ❌ | +| Table: with totals row | basic | ❌ | +| Table: no style | basic | ❌ | +| Table: single column | edge | ❌ | +| Table: header only (no data rows) | edge | ❌ | +| Table: with autoFilter | edge | ❌ | + + +### text_formatting + +**aspose-cells-foss** — Read: 🟠 1 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Bold | basic | ✅ | ❌ | +| Italic | basic | ✅ | ❌ | +| Underline - single | basic | ✅ | ❌ | +| Underline - double | basic | ❌ | ❌ | +| Strikethrough | basic | ✅ | ❌ | +| Bold + Italic | basic | ✅ | ❌ | +| Font size 8 | basic | ✅ | ❌ | +| Font size 14 | basic | ✅ | ❌ | +| Font size 24 | basic | ✅ | ❌ | +| Font size 36 | basic | ✅ | ❌ | +| Font - Arial | basic | ✅ | ❌ | +| Font - Times New Roman | basic | ✅ | ❌ | +| Font - Courier New | basic | ✅ | ❌ | +| Font color - red | basic | ✅ | ❌ | +| Font color - blue | basic | ✅ | ❌ | +| Font color - green | basic | ✅ | ❌ | +| Font color - custom (#8B4513) | basic | ✅ | ❌ | +| Combined - bold, 16pt, red | basic | ✅ | ❌ | + +**exceljs** — Read: 🟢 3 | Write: 🟢 3 + +**libreoffice** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl** — Read: 🟢 3 | Write: 🟢 3 + +**openpyxl-readonly** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Bold | basic | ❌ | +| Italic | basic | ❌ | +| Underline - single | basic | ❌ | +| Underline - double | basic | ❌ | +| Strikethrough | basic | ❌ | +| Bold + Italic | basic | ❌ | +| Font size 8 | basic | ❌ | +| Font size 14 | basic | ❌ | +| Font size 24 | basic | ❌ | +| Font size 36 | basic | ❌ | +| Font - Arial | basic | ❌ | +| Font - Times New Roman | basic | ❌ | +| Font - Courier New | basic | ❌ | +| Font color - red | basic | ❌ | +| Font color - blue | basic | ❌ | +| Font color - green | basic | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | + +**pandas** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Bold | basic | ❌ | ❌ | +| Italic | basic | ❌ | ❌ | +| Underline - single | basic | ❌ | ❌ | +| Underline - double | basic | ❌ | ❌ | +| Strikethrough | basic | ❌ | ❌ | +| Bold + Italic | basic | ❌ | ❌ | +| Font size 8 | basic | ❌ | ❌ | +| Font size 14 | basic | ❌ | ❌ | +| Font size 24 | basic | ❌ | ❌ | +| Font size 36 | basic | ❌ | ❌ | +| Font - Arial | basic | ❌ | ❌ | +| Font - Times New Roman | basic | ❌ | ❌ | +| Font - Courier New | basic | ❌ | ❌ | +| Font color - red | basic | ❌ | ❌ | +| Font color - blue | basic | ❌ | ❌ | +| Font color - green | basic | ❌ | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | ❌ | + +**polars** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Bold | basic | ❌ | +| Italic | basic | ❌ | +| Underline - single | basic | ❌ | +| Underline - double | basic | ❌ | +| Strikethrough | basic | ❌ | +| Bold + Italic | basic | ❌ | +| Font size 8 | basic | ❌ | +| Font size 14 | basic | ❌ | +| Font size 24 | basic | ❌ | +| Font size 36 | basic | ❌ | +| Font - Arial | basic | ❌ | +| Font - Times New Roman | basic | ❌ | +| Font - Courier New | basic | ❌ | +| Font color - red | basic | ❌ | +| Font color - blue | basic | ❌ | +| Font color - green | basic | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | + +**pyexcel** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Bold | basic | ❌ | ❌ | +| Italic | basic | ❌ | ❌ | +| Underline - single | basic | ❌ | ❌ | +| Underline - double | basic | ❌ | ❌ | +| Strikethrough | basic | ❌ | ❌ | +| Bold + Italic | basic | ❌ | ❌ | +| Font size 8 | basic | ❌ | ❌ | +| Font size 14 | basic | ❌ | ❌ | +| Font size 24 | basic | ❌ | ❌ | +| Font size 36 | basic | ❌ | ❌ | +| Font - Arial | basic | ❌ | ❌ | +| Font - Times New Roman | basic | ❌ | ❌ | +| Font - Courier New | basic | ❌ | ❌ | +| Font color - red | basic | ❌ | ❌ | +| Font color - blue | basic | ❌ | ❌ | +| Font color - green | basic | ❌ | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | ❌ | + +**pylightxl** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Bold | basic | ❌ | ❌ | +| Italic | basic | ❌ | ❌ | +| Underline - single | basic | ❌ | ❌ | +| Underline - double | basic | ❌ | ❌ | +| Strikethrough | basic | ❌ | ❌ | +| Bold + Italic | basic | ❌ | ❌ | +| Font size 8 | basic | ❌ | ❌ | +| Font size 14 | basic | ❌ | ❌ | +| Font size 24 | basic | ❌ | ❌ | +| Font size 36 | basic | ❌ | ❌ | +| Font - Arial | basic | ❌ | ❌ | +| Font - Times New Roman | basic | ❌ | ❌ | +| Font - Courier New | basic | ❌ | ❌ | +| Font color - red | basic | ❌ | ❌ | +| Font color - blue | basic | ❌ | ❌ | +| Font color - green | basic | ❌ | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | ❌ | + +**python-calamine** — Read: 🔴 0 + +| Test | Importance | Read | +|------|-----------|------| +| Bold | basic | ❌ | +| Italic | basic | ❌ | +| Underline - single | basic | ❌ | +| Underline - double | basic | ❌ | +| Strikethrough | basic | ❌ | +| Bold + Italic | basic | ❌ | +| Font size 8 | basic | ❌ | +| Font size 14 | basic | ❌ | +| Font size 24 | basic | ❌ | +| Font size 36 | basic | ❌ | +| Font - Arial | basic | ❌ | +| Font - Times New Roman | basic | ❌ | +| Font - Courier New | basic | ❌ | +| Font color - red | basic | ❌ | +| Font color - blue | basic | ❌ | +| Font color - green | basic | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | + +**sheetjs** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Bold | basic | ❌ | ❌ | +| Italic | basic | ❌ | ❌ | +| Underline - single | basic | ❌ | ❌ | +| Underline - double | basic | ❌ | ❌ | +| Strikethrough | basic | ❌ | ❌ | +| Bold + Italic | basic | ❌ | ❌ | +| Font size 8 | basic | ❌ | ❌ | +| Font size 14 | basic | ❌ | ❌ | +| Font size 24 | basic | ❌ | ❌ | +| Font size 36 | basic | ❌ | ❌ | +| Font - Arial | basic | ❌ | ❌ | +| Font - Times New Roman | basic | ❌ | ❌ | +| Font - Courier New | basic | ❌ | ❌ | +| Font color - red | basic | ❌ | ❌ | +| Font color - blue | basic | ❌ | ❌ | +| Font color - green | basic | ❌ | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | ❌ | + +**tablib** — Read: 🔴 0 | Write: 🔴 0 + +| Test | Importance | Read | Write | +|------|-----------|------|-------| +| Bold | basic | ❌ | ❌ | +| Italic | basic | ❌ | ❌ | +| Underline - single | basic | ❌ | ❌ | +| Underline - double | basic | ❌ | ❌ | +| Strikethrough | basic | ❌ | ❌ | +| Bold + Italic | basic | ❌ | ❌ | +| Font size 8 | basic | ❌ | ❌ | +| Font size 14 | basic | ❌ | ❌ | +| Font size 24 | basic | ❌ | ❌ | +| Font size 36 | basic | ❌ | ❌ | +| Font - Arial | basic | ❌ | ❌ | +| Font - Times New Roman | basic | ❌ | ❌ | +| Font - Courier New | basic | ❌ | ❌ | +| Font color - red | basic | ❌ | ❌ | +| Font color - blue | basic | ❌ | ❌ | +| Font color - green | basic | ❌ | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | ❌ | +| Combined - bold, 16pt, red | basic | ❌ | ❌ | + +**wolfxl** — Read: 🟢 3 | Write: 🟢 3 + +**xlrd** +- Notes: Not applicable: xlrd does not support .xlsx input + +**xlsxwriter** — Write: 🟢 3 + +**xlsxwriter-constmem** — Write: 🟢 3 + +**xlwt** — Write: 🟠 1 + +| Test | Importance | Write | +|------|-----------|-------| +| Bold | basic | ✅ | +| Italic | basic | ✅ | +| Underline - single | basic | ✅ | +| Underline - double | basic | ✅ | +| Strikethrough | basic | ✅ | +| Bold + Italic | basic | ✅ | +| Font size 8 | basic | ✅ | +| Font size 14 | basic | ✅ | +| Font size 24 | basic | ✅ | +| Font size 36 | basic | ✅ | +| Font - Arial | basic | ✅ | +| Font - Times New Roman | basic | ✅ | +| Font - Courier New | basic | ✅ | +| Font color - red | basic | ✅ | +| Font color - blue | basic | ✅ | +| Font color - green | basic | ❌ | +| Font color - custom (#8B4513) | basic | ❌ | +| Combined - bold, 16pt, red | basic | ✅ | + +--- +*Benchmark version: 0.1.0* \ No newline at end of file diff --git a/results-2026-10-03/xlsx/WHY_FAILED.md b/results-2026-10-03/xlsx/WHY_FAILED.md new file mode 100644 index 0000000..b8fee04 --- /dev/null +++ b/results-2026-10-03/xlsx/WHY_FAILED.md @@ -0,0 +1,9823 @@ +# Why Failed + +## cell_values / python-calamine / read / error_div0 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / python-calamine / read / error_na + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / python-calamine / read / error_value + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / aspose-cells-foss / read / date_standard + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / aspose-cells-foss / read / datetime + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / pylightxl / write / string_simple + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / string_unicode + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / string_empty + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / string_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / string_newline + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / number_integer + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / number_float + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / number_negative + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / number_large + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / number_scientific + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / date_standard + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / datetime + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / boolean_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / boolean_false + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / error_div0 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / error_na + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / error_value + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pylightxl / write / blank + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / string_simple + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / string_unicode + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / string_empty + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / string_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / string_newline + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / number_integer + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / number_float + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / number_negative + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / number_large + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / number_scientific + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / date_standard + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / datetime + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / boolean_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / boolean_false + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / error_div0 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / error_na + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / error_value + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pyexcel / write / blank + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## cell_values / pandas / read / error_div0 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / pandas / read / error_na + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / pandas / read / error_value + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / polars / read / error_div0 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / polars / read / error_na + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / polars / read / error_value + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / libreoffice / read / boolean_true + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## cell_values / libreoffice / read / boolean_false + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## formulas / python-calamine / read / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / python-calamine / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / python-calamine / read / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / python-calamine / read / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pylightxl / read / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pylightxl / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pylightxl / read / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pylightxl / read / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pyexcel / read / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pyexcel / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pyexcel / read / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pyexcel / read / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / xlwt / write / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / xlwt / write / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / xlwt / write / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / xlwt / write / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pandas / read / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pandas / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pandas / read / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / pandas / read / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / polars / read / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / polars / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / polars / read / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / polars / read / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / tablib / read / formula_sum + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / tablib / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / tablib / read / formula_concat + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / tablib / read / formula_cross_sheet + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / sheetjs / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / exceljs / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## formulas / libreoffice / read / formula_cell_ref + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## text_formatting / python-calamine / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / python-calamine / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / python-calamine / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / python-calamine / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / python-calamine / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / python-calamine / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / python-calamine / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / python-calamine / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / aspose-cells-foss / read / underline_double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / aspose-cells-foss / write / bold + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / italic + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / underline_single + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / underline_double + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / strikethrough + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / bold_italic + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_size_8 + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_size_14 + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_size_24 + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_size_36 + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_arial + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_times + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / font_courier + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / color_green + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / aspose-cells-foss / write / combined + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss supports only a single underline, not accounting or double variants. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pylightxl / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pylightxl / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pylightxl / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pylightxl / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pylightxl / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pylightxl / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pylightxl / write / bold + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / italic + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / underline_single + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / underline_double + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / strikethrough + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / bold_italic + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_size_8 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_size_14 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_size_24 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_size_36 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_arial + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_times + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / font_courier + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / color_green + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pylightxl / write / combined + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pyexcel / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pyexcel / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pyexcel / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pyexcel / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pyexcel / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pyexcel / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pyexcel / write / bold + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / italic + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / underline_single + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / underline_double + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / strikethrough + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / bold_italic + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_size_8 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_size_14 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_size_24 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_size_36 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_arial + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_times + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / font_courier + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / color_green + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / pyexcel / write / combined + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## text_formatting / xlwt / write / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / xlwt / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pandas / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pandas / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pandas / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pandas / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pandas / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / pandas / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / bold + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / italic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / underline_single + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / underline_double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / strikethrough + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / bold_italic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / pandas / write / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / openpyxl-readonly / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / openpyxl-readonly / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / openpyxl-readonly / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / openpyxl-readonly / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / openpyxl-readonly / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / openpyxl-readonly / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / openpyxl-readonly / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / polars / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / polars / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / polars / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / polars / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / polars / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / polars / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / polars / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / tablib / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / tablib / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / tablib / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / tablib / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / tablib / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / tablib / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / bold + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / italic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / underline_single + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / underline_double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / strikethrough + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / bold_italic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / tablib / write / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / bold + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / sheetjs / read / italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / sheetjs / read / underline_single + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / sheetjs / read / underline_double + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / sheetjs / read / strikethrough + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / sheetjs / read / bold_italic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## text_formatting / sheetjs / read / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / read / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / bold + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / italic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / underline_single + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / underline_double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / strikethrough + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / bold_italic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_size_8 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_size_14 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_size_24 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_size_36 + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_arial + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_times + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / font_courier + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / color_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## text_formatting / sheetjs / write / combined + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / python-calamine / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / python-calamine / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / python-calamine / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / python-calamine / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pylightxl / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pylightxl / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pylightxl / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pylightxl / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pylightxl / write / bg_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pylightxl / write / bg_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pylightxl / write / bg_green + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pylightxl / write / bg_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pyexcel / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pyexcel / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pyexcel / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pyexcel / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pyexcel / write / bg_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pyexcel / write / bg_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pyexcel / write / bg_green + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / pyexcel / write / bg_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## background_colors / xlwt / write / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / xlwt / write / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / write / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / write / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / write / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / pandas / write / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / openpyxl-readonly / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / openpyxl-readonly / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / openpyxl-readonly / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / openpyxl-readonly / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / polars / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / polars / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / polars / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / polars / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / read / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / read / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / read / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / read / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / write / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / write / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / write / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / tablib / write / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / sheetjs / write / bg_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / sheetjs / write / bg_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / sheetjs / write / bg_green + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## background_colors / sheetjs / write / bg_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / python-calamine / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / python-calamine / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / python-calamine / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / python-calamine / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / python-calamine / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pylightxl / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pylightxl / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pylightxl / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pylightxl / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pylightxl / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pylightxl / write / numfmt_currency + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pylightxl / write / numfmt_percent + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pylightxl / write / numfmt_date + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pylightxl / write / numfmt_scientific + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pylightxl / write / numfmt_custom_text + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pyexcel / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pyexcel / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pyexcel / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pyexcel / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pyexcel / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pyexcel / write / numfmt_currency + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pyexcel / write / numfmt_percent + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pyexcel / write / numfmt_date + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pyexcel / write / numfmt_scientific + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pyexcel / write / numfmt_custom_text + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## number_formats / pandas / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / write / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / write / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / write / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / write / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / pandas / write / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / openpyxl-readonly / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / openpyxl-readonly / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / openpyxl-readonly / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / openpyxl-readonly / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / openpyxl-readonly / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / polars / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / polars / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / polars / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / polars / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / polars / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / read / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / read / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / read / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / read / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / write / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / write / numfmt_percent + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / write / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / write / numfmt_scientific + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / tablib / write / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / libreoffice / read / numfmt_date + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / libreoffice / write / numfmt_currency + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## number_formats / libreoffice / write / numfmt_custom_text + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## alignment / xlsxwriter / write / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / python-calamine / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / aspose-cells-foss / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / aspose-cells-foss / write / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pylightxl / read / h_left + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / h_center + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / h_right + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / v_top + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / v_center + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / v_bottom + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / wrap_text + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / rotation_45 + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / read / indent_2 + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## alignment / pylightxl / write / h_left + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / h_center + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / h_right + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / v_top + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / v_center + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / v_bottom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / wrap_text + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / rotation_45 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pylightxl / write / indent_2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pyexcel / write / h_left + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / h_center + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / h_right + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / v_top + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / v_center + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / v_bottom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / wrap_text + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / rotation_45 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pyexcel / write / indent_2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## alignment / pandas / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / pandas / write / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / xlsxwriter-constmem / write / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / openpyxl-readonly / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / polars / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / tablib / write / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / read / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / h_left + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / h_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / h_right + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / v_top + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / v_center + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / v_bottom + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / wrap_text + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / rotation_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## alignment / sheetjs / write / indent_2 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / python-calamine / read / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / python-calamine / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / aspose-cells-foss / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / aspose-cells-foss / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / aspose-cells-foss / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / aspose-cells-foss / write / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / aspose-cells-foss / write / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / aspose-cells-foss / write / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pylightxl / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / top_only + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / bottom_only + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / left_only + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / right_only + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / diagonal_up + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / diagonal_down + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / diagonal_both + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / read / mixed_styles + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## borders / pylightxl / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pylightxl / write / thin_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / medium_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / thick_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / double + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / dashed + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / dotted + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / dash_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / dash_dot_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / top_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / bottom_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / left_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / right_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / diagonal_up + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / diagonal_down + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / diagonal_both + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / mixed_styles + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pylightxl / write / mixed_colors + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / read / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pyexcel / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pyexcel / write / thin_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / medium_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / thick_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / double + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / dashed + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / dotted + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / dash_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / dash_dot_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / top_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / bottom_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / left_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / right_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / diagonal_up + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / diagonal_down + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / diagonal_both + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / mixed_styles + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / pyexcel / write / mixed_colors + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel exposes value-only cells +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / xlwt / write / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / xlwt / write / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / xlwt / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / xlwt / write / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / read / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / pandas / write / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / pandas / write / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / openpyxl-readonly / read / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / openpyxl-readonly / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / polars / read / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / polars / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / read / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / read / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / thin_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / medium_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / thick_all + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / double + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / dashed + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / dotted + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / dash_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / dash_dot_dot + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / top_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / bottom_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / left_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / right_only + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / diagonal_up + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / diagonal_down + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / diagonal_both + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / color_red + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / color_blue + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / color_custom + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / tablib / write / mixed_styles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## borders / tablib / write / mixed_colors + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## borders / sheetjs / read / thin_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / medium_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / thick_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / double + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / dashed + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / dotted + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / dash_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / dash_dot_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / top_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / bottom_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / left_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / right_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / diagonal_up + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / diagonal_down + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / diagonal_both + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / mixed_styles + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / read / mixed_colors + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not expose cell borders: with cellStyles the XLSX reader attaches only the fill to cell.s +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / thin_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / medium_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / thick_all + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / double + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / dashed + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / dotted + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / dash_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / dash_dot_dot + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / top_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / bottom_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / left_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / right_only + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / diagonal_up + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / diagonal_down + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / diagonal_both + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / color_red + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / color_blue + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / color_custom + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / mixed_styles + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## borders / sheetjs / write / mixed_colors + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no border API; the SheetJS CE writer only emits number formats in cell styles +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / python-calamine / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / python-calamine / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / python-calamine / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / python-calamine / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / aspose-cells-foss / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / aspose-cells-foss / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pylightxl / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pylightxl / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pylightxl / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pylightxl / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pylightxl / write / row_height_30 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pylightxl / write / row_height_45 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pylightxl / write / col_width_20 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pylightxl / write / col_width_8 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pyexcel / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pyexcel / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pyexcel / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pyexcel / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pyexcel / write / row_height_30 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose row dimension writing +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pyexcel / write / row_height_45 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose row dimension writing +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pyexcel / write / col_width_20 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose row dimension writing +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / pyexcel / write / col_width_8 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose row dimension writing +- Next debug surface: treat as unsupported capability, not a semantic regression + +## dimensions / xlwt / write / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / xlwt / write / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / write / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / write / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / write / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / pandas / write / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / xlsxwriter-constmem / write / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / xlsxwriter-constmem / write / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / openpyxl-readonly / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / openpyxl-readonly / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / openpyxl-readonly / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / openpyxl-readonly / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / polars / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / polars / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / polars / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / polars / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / read / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / read / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / write / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / write / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / write / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / tablib / write / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / sheetjs / write / row_height_30 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / sheetjs / write / row_height_45 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / libreoffice / read / col_width_20 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## dimensions / libreoffice / read / col_width_8 + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## multiple_sheets / polars / read / value_beta + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## multiple_sheets / polars / read / value_gamma + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## merged_cells / python-calamine / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / python-calamine / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / python-calamine / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / python-calamine / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / pylightxl / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pylightxl / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pylightxl / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pylightxl / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / pylightxl / write / merge_horizontal + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pylightxl / write / merge_vertical + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pylightxl / write / merge_value_off_top_left + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pylightxl / write / merge_top_left_fill + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pyexcel / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pyexcel / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pyexcel / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pyexcel / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / pyexcel / write / merge_horizontal + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pyexcel / write / merge_vertical + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pyexcel / write / merge_value_off_top_left + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / pyexcel / write / merge_top_left_fill + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## merged_cells / xlwt / write / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / xlwt / write / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / xlwt / write / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / xlwt / write / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / pandas / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pandas / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pandas / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pandas / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / pandas / write / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pandas / write / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pandas / write / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / pandas / write / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / openpyxl-readonly / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / openpyxl-readonly / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / openpyxl-readonly / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / openpyxl-readonly / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / polars / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / polars / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / polars / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / polars / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / tablib / read / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / tablib / read / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / tablib / read / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / tablib / read / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / tablib / write / merge_horizontal + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / tablib / write / merge_vertical + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / tablib / write / merge_value_off_top_left + +- What failed: merged-cell metadata changed +- Likely cause: merged range XML or non-anchor cell handling differs +- Next debug surface: inspect mergeCells in the worksheet XML and subordinate cell behavior + +## merged_cells / tablib / write / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## merged_cells / sheetjs / write / merge_top_left_fill + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / python-calamine / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / python-calamine / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / python-calamine / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / python-calamine / read / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / python-calamine / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / python-calamine / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pylightxl / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pylightxl / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pylightxl / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pylightxl / read / cf_data_bar + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## conditional_formatting / pylightxl / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pylightxl / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pylightxl / write / cf_cell_gt + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pylightxl / write / cf_formula_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pylightxl / write / cf_text_contains + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pylightxl / write / cf_data_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pylightxl / write / cf_color_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pylightxl / write / cf_stop_if_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pyexcel / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pyexcel / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pyexcel / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pyexcel / read / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / pyexcel / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pyexcel / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pyexcel / write / cf_cell_gt + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pyexcel / write / cf_formula_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pyexcel / write / cf_text_contains + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pyexcel / write / cf_data_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pyexcel / write / cf_color_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pyexcel / write / cf_stop_if_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / xlwt / write / cf_cell_gt + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author conditional formatting +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / xlwt / write / cf_formula_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author conditional formatting +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / xlwt / write / cf_text_contains + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author conditional formatting +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / xlwt / write / cf_data_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author conditional formatting +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / xlwt / write / cf_color_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author conditional formatting +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / xlwt / write / cf_stop_if_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author conditional formatting +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / pandas / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / read / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / pandas / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / write / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / write / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / write / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / write / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / pandas / write / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / pandas / write / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / openpyxl-readonly / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / openpyxl-readonly / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / openpyxl-readonly / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / openpyxl-readonly / read / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / openpyxl-readonly / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / openpyxl-readonly / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / polars / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / polars / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / polars / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / polars / read / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / polars / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / polars / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / read / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / read / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / read / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / read / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / tablib / read / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / write / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / write / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / write / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / write / cf_data_bar + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## conditional_formatting / tablib / write / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / tablib / write / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / sheetjs / read / cf_cell_gt + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / read / cf_formula_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / read / cf_text_contains + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / read / cf_data_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / read / cf_color_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / read / cf_stop_if_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / write / cf_cell_gt + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / write / cf_formula_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / write / cf_text_contains + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / write / cf_data_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / write / cf_color_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / sheetjs / write / cf_stop_if_true + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no conditional formatting API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## conditional_formatting / exceljs / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / exceljs / write / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / libreoffice / read / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / libreoffice / write / cf_cell_gt + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / libreoffice / write / cf_formula_cross_sheet + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / libreoffice / write / cf_text_contains + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / libreoffice / write / cf_color_scale + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## conditional_formatting / libreoffice / write / cf_stop_if_true + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## data_validation / python-calamine / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / python-calamine / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / python-calamine / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / python-calamine / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / python-calamine / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pylightxl / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pylightxl / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pylightxl / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pylightxl / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pylightxl / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pylightxl / write / dv_list_csv + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pylightxl / write / dv_list_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pylightxl / write / dv_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pylightxl / write / dv_custom_formula + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pylightxl / write / dv_whole_between + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pyexcel / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pyexcel / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pyexcel / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pyexcel / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pyexcel / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pyexcel / write / dv_list_csv + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pyexcel / write / dv_list_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pyexcel / write / dv_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pyexcel / write / dv_custom_formula + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pyexcel / write / dv_whole_between + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / xlwt / write / dv_list_csv + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author data validations +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / xlwt / write / dv_list_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author data validations +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / xlwt / write / dv_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author data validations +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / xlwt / write / dv_custom_formula + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author data validations +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / xlwt / write / dv_whole_between + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author data validations +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / pandas / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / write / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / write / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / write / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / write / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / pandas / write / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / openpyxl-readonly / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / openpyxl-readonly / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / openpyxl-readonly / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / openpyxl-readonly / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / openpyxl-readonly / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / polars / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / polars / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / polars / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / polars / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / polars / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / read / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / read / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / read / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / read / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / read / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / write / dv_list_csv + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / write / dv_list_range + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / write / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / write / dv_custom_formula + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / tablib / write / dv_whole_between + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## data_validation / sheetjs / read / dv_list_csv + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / read / dv_list_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / read / dv_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / read / dv_custom_formula + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / read / dv_whole_between + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX reader skips +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / write / dv_list_csv + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / write / dv_list_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / write / dv_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / write / dv_custom_formula + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / sheetjs / write / dv_whole_between + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE has no data validation API; the XLSX writer emits no +- Next debug surface: treat as unsupported capability, not a semantic regression + +## data_validation / libreoffice / write / dv_cross_sheet + +- What failed: data validation metadata changed +- Likely cause: validation type, formula, or target range was dropped or rewritten +- Next debug surface: inspect dataValidations in the worksheet XML + +## hyperlinks / python-calamine / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / python-calamine / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / python-calamine / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / python-calamine / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / aspose-cells-foss / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / aspose-cells-foss / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / aspose-cells-foss / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / aspose-cells-foss / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pylightxl / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pylightxl / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pylightxl / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pylightxl / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pylightxl / write / link_external + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pylightxl / write / link_internal + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pylightxl / write / link_mailto + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pylightxl / write / link_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pyexcel / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pyexcel / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pyexcel / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pyexcel / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pyexcel / write / link_external + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pyexcel / write / link_internal + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pyexcel / write / link_mailto + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pyexcel / write / link_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / xlwt / write / link_external + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt hyperlink metadata is not supported in this adapter +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / xlwt / write / link_internal + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt hyperlink metadata is not supported in this adapter +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / xlwt / write / link_mailto + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt hyperlink metadata is not supported in this adapter +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / xlwt / write / link_long + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt hyperlink metadata is not supported in this adapter +- Next debug surface: treat as unsupported capability, not a semantic regression + +## hyperlinks / pandas / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / write / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / write / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / write / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / pandas / write / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / openpyxl-readonly / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / openpyxl-readonly / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / openpyxl-readonly / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / openpyxl-readonly / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / polars / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / polars / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / polars / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / polars / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / write / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / write / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / write / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / tablib / write / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / exceljs / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / exceljs / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / exceljs / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / exceljs / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / exceljs / write / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / read / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / read / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / read / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / read / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / write / link_external + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / write / link_internal + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / write / link_mailto + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## hyperlinks / libreoffice / write / link_long + +- What failed: hyperlink target or display metadata changed +- Likely cause: hyperlink rel target, tooltip, or internal location was not preserved +- Next debug surface: inspect worksheet hyperlinks and worksheet rels + +## images / python-calamine / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / python-calamine / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / aspose-cells-foss / read / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / aspose-cells-foss / read / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss does not preserve the source one-cell versus two-cell anchor kind. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / aspose-cells-foss / write / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / aspose-cells-foss / write / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss writes only two-cell picture anchors, while the benchmark requires one-cell anchors. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / pylightxl / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pylightxl / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pylightxl / write / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / pylightxl / write / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / pyexcel / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pyexcel / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pyexcel / write / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / pyexcel / write / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / xlwt / write / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot embed images in this adapter +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / xlwt / write / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot embed images in this adapter +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / pandas / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pandas / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pandas / write / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / pandas / write / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / xlsxwriter-constmem / write / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / xlsxwriter-constmem / write / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / openpyxl-readonly / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / openpyxl-readonly / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / polars / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / polars / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / tablib / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / tablib / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / tablib / write / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / tablib / write / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / sheetjs / read / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / sheetjs / read / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse worksheet drawings, so embedded images are not exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / sheetjs / write / image_one_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot embed images (drawing parts are not written) +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / sheetjs / write / image_two_cell_offset + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot embed images (drawing parts are not written) +- Next debug surface: treat as unsupported capability, not a semantic regression + +## images / exceljs / read / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / exceljs / read / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / exceljs / write / image_one_cell + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## images / exceljs / write / image_two_cell_offset + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## comments / python-calamine / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / python-calamine / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / python-calamine / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / aspose-cells-foss / write / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / aspose-cells-foss / write / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / aspose-cells-foss / write / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pylightxl / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pylightxl / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pylightxl / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pylightxl / write / comment_legacy + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / pylightxl / write / comment_threaded + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / pylightxl / write / comment_author + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / pyexcel / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pyexcel / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pyexcel / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pyexcel / write / comment_legacy + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / pyexcel / write / comment_threaded + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / pyexcel / write / comment_author + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / xlwt / write / comment_legacy + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author comments +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / xlwt / write / comment_threaded + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author comments +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / xlwt / write / comment_author + +- What failed: adapter reported this operation as unsupported +- Likely cause: xlwt cannot author comments +- Next debug surface: treat as unsupported capability, not a semantic regression + +## comments / pandas / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pandas / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pandas / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pandas / write / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pandas / write / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / pandas / write / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / xlsxwriter-constmem / write / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / xlsxwriter-constmem / write / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / xlsxwriter-constmem / write / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / openpyxl-readonly / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / openpyxl-readonly / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / openpyxl-readonly / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / polars / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / polars / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / polars / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / tablib / read / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / tablib / read / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / tablib / read / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / tablib / write / comment_legacy + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / tablib / write / comment_threaded + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## comments / tablib / write / comment_author + +- What failed: comment metadata changed +- Likely cause: legacy comment text, author, or VML relationship was not preserved +- Next debug surface: inspect comments XML plus VML drawing relationships + +## freeze_panes / python-calamine / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / python-calamine / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / python-calamine / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pylightxl / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pylightxl / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pylightxl / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pylightxl / write / freeze_b2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / pylightxl / write / freeze_d5 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / pylightxl / write / split_2x1 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pylightxl does not implement this feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / pyexcel / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pyexcel / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pyexcel / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pyexcel / write / freeze_b2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / pyexcel / write / freeze_d5 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / pyexcel / write / split_2x1 + +- What failed: adapter reported this operation as unsupported +- Likely cause: pyexcel does not expose this worksheet feature +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / xlwt / write / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / xlwt / write / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / xlwt / write / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pandas / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pandas / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pandas / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pandas / write / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pandas / write / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / pandas / write / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / openpyxl-readonly / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / openpyxl-readonly / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / openpyxl-readonly / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / polars / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / polars / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / polars / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / tablib / read / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / tablib / read / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / tablib / read / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / tablib / write / freeze_b2 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / tablib / write / freeze_d5 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / tablib / write / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## freeze_panes / sheetjs / read / freeze_b2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE parses only for zoom and right-to-left; panes are not exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / sheetjs / read / freeze_d5 + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE parses only for zoom and right-to-left; panes are not exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / sheetjs / read / split_2x1 + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE parses only for zoom and right-to-left; panes are not exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / sheetjs / write / freeze_b2 + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE's XLSX writer emits without a element, so panes cannot be set +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / sheetjs / write / freeze_d5 + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE's XLSX writer emits without a element, so panes cannot be set +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / sheetjs / write / split_2x1 + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE's XLSX writer emits without a element, so panes cannot be set +- Next debug surface: treat as unsupported capability, not a semantic regression + +## freeze_panes / libreoffice / write / split_2x1 + +- What failed: freeze pane settings changed +- Likely cause: pane split/top-left metadata was dropped or normalized incorrectly +- Next debug surface: inspect sheetViews/pane in the worksheet XML + +## named_ranges / xlsxwriter / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / python-calamine / read / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / python-calamine / read / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / python-calamine / read / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / python-calamine / read / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / python-calamine / read / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / python-calamine / read / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / aspose-cells-foss / read / nr_sheet_scope + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / read / nr_simple_cell + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / read / nr_cell_range + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / read / nr_formula_ref + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / read / nr_sheet_scope + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / read / nr_cross_sheet + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / read / nr_special_chars + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / pylightxl / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pylightxl / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pylightxl / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pylightxl / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pylightxl / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pylightxl / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / read / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / read / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / read / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / read / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / read / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / read / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pyexcel / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlwt / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlwt / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlwt / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlwt / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlwt / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlwt / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / read / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / read / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / read / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / read / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / read / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / read / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / pandas / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter-constmem / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter-constmem / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter-constmem / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter-constmem / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter-constmem / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / xlsxwriter-constmem / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / openpyxl-readonly / read / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / openpyxl-readonly / read / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / openpyxl-readonly / read / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / openpyxl-readonly / read / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / openpyxl-readonly / read / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / openpyxl-readonly / read / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / polars / read / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / polars / read / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / polars / read / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / polars / read / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / polars / read / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / polars / read / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / read / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / read / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / read / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / read / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / read / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / read / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / write / nr_simple_cell + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / write / nr_cell_range + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / write / nr_formula_ref + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / write / nr_sheet_scope + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / write / nr_cross_sheet + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / tablib / write / nr_special_chars + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## named_ranges / exceljs / read / nr_sheet_scope + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## named_ranges / exceljs / write / nr_sheet_scope + +- What failed: named range metadata changed +- Likely cause: workbook-level vs sheet-level defined-name scope was lost or rewritten +- Next debug surface: inspect workbook.xml definedNames and localSheetId values + +## tables / xlsxwriter / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / python-calamine / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / python-calamine / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / python-calamine / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / python-calamine / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / python-calamine / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / python-calamine / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / aspose-cells-foss / read / tbl_with_totals + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / aspose-cells-foss / read / tbl_no_style + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / aspose-cells-foss / write / tbl_with_totals + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / aspose-cells-foss / write / tbl_no_style + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / read / tbl_basic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / read / tbl_with_totals + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / read / tbl_no_style + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / read / tbl_single_col + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / read / tbl_single_row + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / read / tbl_autofilter + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / pylightxl / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pylightxl / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pylightxl / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pylightxl / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pylightxl / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pylightxl / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pyexcel / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlwt / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlwt / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlwt / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlwt / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlwt / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlwt / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / pandas / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter-constmem / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter-constmem / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter-constmem / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter-constmem / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter-constmem / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / xlsxwriter-constmem / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / openpyxl-readonly / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / openpyxl-readonly / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / openpyxl-readonly / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / openpyxl-readonly / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / openpyxl-readonly / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / openpyxl-readonly / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / polars / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / polars / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / polars / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / polars / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / polars / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / polars / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / tablib / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / read / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / read / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / read / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / read / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / read / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / read / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse table parts (xl/tables/*.xml); only the sheet autofilter is exposed +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / write / tbl_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / write / tbl_with_totals + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / write / tbl_no_style + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / write / tbl_single_col + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / write / tbl_single_row + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / sheetjs / write / tbl_autofilter + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create table parts; only a sheet autofilter (ws['!autofilter']) is writable +- Next debug surface: treat as unsupported capability, not a semantic regression + +## tables / exceljs / read / tbl_basic + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / exceljs / read / tbl_with_totals + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / exceljs / read / tbl_no_style + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / exceljs / read / tbl_single_col + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / exceljs / read / tbl_single_row + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / exceljs / read / tbl_autofilter + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## tables / libreoffice / write / tbl_single_row + +- What failed: cell style metadata changed +- Likely cause: formatting was dropped, defaulted, or normalized differently +- Next debug surface: inspect styles.xml and the adapter's style mapping + +## sheet_protection / xlsxwriter / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlsxwriter / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlsxwriter / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / python-calamine / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / python-calamine / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / python-calamine / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pylightxl / read / prot_basic + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## sheet_protection / pylightxl / read / prot_password + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## sheet_protection / pylightxl / read / prot_granular + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## sheet_protection / pylightxl / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pylightxl / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pylightxl / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pyexcel / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pyexcel / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pyexcel / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pyexcel / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pyexcel / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pyexcel / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlwt / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlwt / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlwt / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pandas / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pandas / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pandas / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pandas / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pandas / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / pandas / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlsxwriter-constmem / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlsxwriter-constmem / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / xlsxwriter-constmem / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / openpyxl-readonly / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / openpyxl-readonly / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / openpyxl-readonly / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / polars / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / polars / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / polars / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / tablib / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / tablib / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / tablib / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / tablib / write / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / tablib / write / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / tablib / write / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / sheetjs / read / prot_basic + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / sheetjs / read / prot_password + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / sheetjs / read / prot_granular + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE's XLSX reader does not parse ; ws['!protect'] is populated only for XLS/XLSB/XLML inputs +- Next debug surface: treat as unsupported capability, not a semantic regression + +## sheet_protection / exceljs / read / prot_password + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## sheet_protection / libreoffice / read / prot_basic + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## sheet_protection / libreoffice / read / prot_password + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## sheet_protection / libreoffice / read / prot_granular + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## sheet_protection / libreoffice / write / prot_granular + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / xlsxwriter / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlsxwriter / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlsxwriter / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / python-calamine / read / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / python-calamine / read / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / python-calamine / read / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / aspose-cells-foss / read / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / aspose-cells-foss / read / page_setup_titles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / aspose-cells-foss / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss has no print-title-rows API. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / aspose-cells-foss / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss has no print-title-rows API. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / aspose-cells-foss / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: aspose-cells-foss has no print-title-rows API. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pylightxl / read / page_setup_landscape + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## page_setup / pylightxl / read / page_setup_scale + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## page_setup / pylightxl / read / page_setup_titles + +- What failed: adapter raised instead of returning comparable workbook data +- Likely cause: adapter/runtime error interrupted the assertion path +- Next debug surface: open the diagnostic adapter message and reproduce the adapter call directly + +## page_setup / pylightxl / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pylightxl / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pylightxl / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pyexcel / read / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pyexcel / read / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pyexcel / read / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pyexcel / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pyexcel / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pyexcel / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlwt / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlwt / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlwt / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pandas / read / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pandas / read / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pandas / read / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pandas / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pandas / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / pandas / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlsxwriter-constmem / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlsxwriter-constmem / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / xlsxwriter-constmem / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / openpyxl-readonly / read / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / openpyxl-readonly / read / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / openpyxl-readonly / read / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / polars / read / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / polars / read / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / polars / read / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / tablib / read / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / tablib / read / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / tablib / read / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / tablib / write / page_setup_landscape + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / tablib / write / page_setup_scale + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / tablib / write / page_setup_titles + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## page_setup / sheetjs / read / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / sheetjs / read / page_setup_scale + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / sheetjs / read / page_setup_titles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / sheetjs / write / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / sheetjs / write / page_setup_scale + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / sheetjs / write / page_setup_titles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / exceljs / read / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / exceljs / read / page_setup_scale + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / exceljs / write / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / exceljs / write / page_setup_scale + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / exceljs / write / page_setup_titles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / libreoffice / read / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / libreoffice / read / page_setup_titles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / libreoffice / write / page_setup_landscape + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / libreoffice / write / page_setup_scale + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## page_setup / libreoffice / write / page_setup_titles + +- What failed: benchmark expectation did not match actual output. +- Likely cause: no known failure archetype matched this payload. +- Next debug surface: inspect expected/actual payloads in results.json. + +## chart_anchor / xlsxwriter / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / xlsxwriter / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / python-calamine / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / python-calamine / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pylightxl / read / chart_bar + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / pylightxl / read / chart_line + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / pylightxl / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pylightxl / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pyexcel / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pyexcel / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pyexcel / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pyexcel / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / xlwt / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / xlwt / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pandas / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pandas / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pandas / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / pandas / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / xlsxwriter-constmem / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / xlsxwriter-constmem / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / openpyxl-readonly / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / openpyxl-readonly / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / polars / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / polars / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / tablib / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / tablib / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter raised an exception while evaluating this test case. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / tablib / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / tablib / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: Adapter could not create or save a workbook for this feature. +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / sheetjs / read / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse charts or drawing anchors in worksheets +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / sheetjs / read / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE does not parse charts or drawing anchors in worksheets +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / sheetjs / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create charts +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / sheetjs / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: SheetJS CE cannot create charts +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / exceljs / read / chart_bar + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / exceljs / read / chart_line + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / exceljs / write / chart_bar + +- What failed: adapter reported this operation as unsupported +- Likely cause: ExcelJS 4.4.0 has no chart creation API +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / exceljs / write / chart_line + +- What failed: adapter reported this operation as unsupported +- Likely cause: ExcelJS 4.4.0 has no chart creation API +- Next debug surface: treat as unsupported capability, not a semantic regression + +## chart_anchor / libreoffice / read / chart_bar + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / libreoffice / read / chart_line + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / libreoffice / write / chart_bar + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts + +## chart_anchor / libreoffice / write / chart_line + +- What failed: image or drawing relationship changed +- Likely cause: media part may exist but worksheet drawing rels or anchors do not match +- Next debug surface: inspect drawing XML, drawing rels, and xl/media package parts diff --git a/results-2026-10-03/xlsx/heatmap.png b/results-2026-10-03/xlsx/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..d608218de91c22a27f9d1d3fb3a7d41af4b856ac GIT binary patch literal 308022 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