diff --git a/README.md b/README.md index 617762c..4112f48 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,27 +27,31 @@ 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) > > 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) > @@ -97,26 +102,26 @@ 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) | -| 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 | +| **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.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-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 -- **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 +- **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 (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 - **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 @@ -325,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..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.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-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 3f4b252..d872b83 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,17 +52,19 @@ 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`): +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) | -| Read Speed | 1.69x openpyxl (WolfXL 2.0.5 public API) | -| Write Speed | 1.20x openpyxl (WolfXL 2.0.5 public API) | +| 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/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-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. diff --git a/docs/public-reporting.md b/docs/public-reporting.md index c449209..4c1752a 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, 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 @@ -27,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 | @@ -40,7 +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 new file mode 100644 index 0000000..085111f --- /dev/null +++ b/results-2026-10-03/README.md @@ -0,0 +1,58 @@ +# 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` | +| 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)) | + +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 + +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. +- 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/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 0000000..a0314c8 Binary files /dev/null and b/results-2026-10-03/calc/aspose_cells_foss/financial_model.xlsx differ 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 0000000..133efb4 Binary files /dev/null and b/results-2026-10-03/calc/libreoffice/financial_model.xlsx differ 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 0000000..15aaef0 Binary files /dev/null and b/results-2026-10-03/calc/wolfxl-commercial/financial_model.xlsx differ diff --git a/results-2026-10-03/calc/wolfxl/financial_model.xlsx b/results-2026-10-03/calc/wolfxl/financial_model.xlsx new file mode 100644 index 0000000..64efb66 Binary files /dev/null and b/results-2026-10-03/calc/wolfxl/financial_model.xlsx differ 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 0000000..9074d5b Binary files /dev/null and b/results-2026-10-03/calc/zavora/financial_model.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/aspose-cells-foss/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/aspose-cells-foss/repeat-1-output.xlsx b/results-2026-10-03/mutation/aspose-cells-foss/repeat-1-output.xlsx new file mode 100644 index 0000000..9a043c7 Binary files /dev/null and b/results-2026-10-03/mutation/aspose-cells-foss/repeat-1-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/aspose-cells-foss/repeat-2-input.xlsx differ diff --git a/results-2026-10-03/mutation/aspose-cells-foss/repeat-2-output.xlsx b/results-2026-10-03/mutation/aspose-cells-foss/repeat-2-output.xlsx new file mode 100644 index 0000000..9a043c7 Binary files /dev/null and b/results-2026-10-03/mutation/aspose-cells-foss/repeat-2-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/aspose-cells-foss/repeat-3-input.xlsx differ diff --git a/results-2026-10-03/mutation/aspose-cells-foss/repeat-3-output.xlsx b/results-2026-10-03/mutation/aspose-cells-foss/repeat-3-output.xlsx new file mode 100644 index 0000000..23b80bd Binary files /dev/null and b/results-2026-10-03/mutation/aspose-cells-foss/repeat-3-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/exceljs/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/libreoffice/repeat-1-input.xlsx b/results-2026-10-03/mutation/libreoffice/repeat-1-input.xlsx new file mode 100644 index 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/libreoffice/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/libreoffice/repeat-1-output.xlsx b/results-2026-10-03/mutation/libreoffice/repeat-1-output.xlsx new file mode 100644 index 0000000..066ed7f Binary files /dev/null and b/results-2026-10-03/mutation/libreoffice/repeat-1-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/libreoffice/repeat-2-input.xlsx differ diff --git a/results-2026-10-03/mutation/libreoffice/repeat-2-output.xlsx b/results-2026-10-03/mutation/libreoffice/repeat-2-output.xlsx new file mode 100644 index 0000000..7fe0adf Binary files /dev/null and b/results-2026-10-03/mutation/libreoffice/repeat-2-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/libreoffice/repeat-3-input.xlsx differ diff --git a/results-2026-10-03/mutation/libreoffice/repeat-3-output.xlsx b/results-2026-10-03/mutation/libreoffice/repeat-3-output.xlsx new file mode 100644 index 0000000..2b7ed7c Binary files /dev/null and b/results-2026-10-03/mutation/libreoffice/repeat-3-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/openpyxl/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/openpyxl/repeat-1-output.xlsx b/results-2026-10-03/mutation/openpyxl/repeat-1-output.xlsx new file mode 100644 index 0000000..76aced7 Binary files /dev/null and b/results-2026-10-03/mutation/openpyxl/repeat-1-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/openpyxl/repeat-2-input.xlsx differ diff --git a/results-2026-10-03/mutation/openpyxl/repeat-2-output.xlsx b/results-2026-10-03/mutation/openpyxl/repeat-2-output.xlsx new file mode 100644 index 0000000..180437c Binary files /dev/null and b/results-2026-10-03/mutation/openpyxl/repeat-2-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/openpyxl/repeat-3-input.xlsx differ diff --git a/results-2026-10-03/mutation/openpyxl/repeat-3-output.xlsx b/results-2026-10-03/mutation/openpyxl/repeat-3-output.xlsx new file mode 100644 index 0000000..75b7c7f Binary files /dev/null and b/results-2026-10-03/mutation/openpyxl/repeat-3-output.xlsx differ diff --git a/results-2026-10-03/mutation/results.json b/results-2026-10-03/mutation/results.json new file mode 100644 index 0000000..a6c4915 --- /dev/null +++ b/results-2026-10-03/mutation/results.json @@ -0,0 +1,1318 @@ +{ + "engines": { + "aspose-cells-foss": { + "available": true, + "details": { + "diagnostics": { + "added_parts": [ + "xl/sharedStrings.xml" + ], + "element_changes": [], + "lost_parts": [ + "customXml/_rels/item1.xml.rels", + "customXml/item1.xml", + "customXml/itemProps1.xml" + ] + }, + "edits": [ + { + "actual": { + "type": "s", + "value": "MUTATED-aspose-cells-foss" + }, + "applied": true, + "cell": "B2", + "expected": { + "type": "s", + "value": "MUTATED-aspose-cells-foss" + }, + "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": { + "type": "s", + "value": "Driver" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A1" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 09" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A10" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 10" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A11" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 11" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A12" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 12" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A13" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 13" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A14" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 14" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A15" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 15" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A16" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 16" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A17" + }, + { + "after": null, + "before": { + "type": "s", + "value": "Input 17" + }, + "feature": "cells", + "kind": "missing", + "path": "/cells/Inputs/A18" + } + ] + }, + "edits_applied": true, + "feature_preservation": "15/17", + "features_changed": { + "cells": 87, + "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": 168128.0, + "preserved": false, + "status": "passed", + "verdict": "Changed cells, custom_xml", + "wall_ms_median": 750.0 + }, + "exceljs": { + "available": true, + "details": { + "error": "RuntimeError: Traceback (most recent call last):\n File \"\", 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/sheetjs/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/sheetjs/repeat-1-output.xlsx b/results-2026-10-03/mutation/sheetjs/repeat-1-output.xlsx new file mode 100644 index 0000000..21105ff Binary files /dev/null and b/results-2026-10-03/mutation/sheetjs/repeat-1-output.xlsx differ diff --git a/results-2026-10-03/mutation/sheetjs/repeat-2-input.xlsx b/results-2026-10-03/mutation/sheetjs/repeat-2-input.xlsx new file mode 100644 index 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/sheetjs/repeat-2-input.xlsx differ diff --git a/results-2026-10-03/mutation/sheetjs/repeat-2-output.xlsx b/results-2026-10-03/mutation/sheetjs/repeat-2-output.xlsx new file mode 100644 index 0000000..21105ff Binary files /dev/null and b/results-2026-10-03/mutation/sheetjs/repeat-2-output.xlsx differ diff --git a/results-2026-10-03/mutation/sheetjs/repeat-3-input.xlsx b/results-2026-10-03/mutation/sheetjs/repeat-3-input.xlsx new file mode 100644 index 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/sheetjs/repeat-3-input.xlsx differ diff --git a/results-2026-10-03/mutation/sheetjs/repeat-3-output.xlsx b/results-2026-10-03/mutation/sheetjs/repeat-3-output.xlsx new file mode 100644 index 0000000..21105ff Binary files /dev/null and b/results-2026-10-03/mutation/sheetjs/repeat-3-output.xlsx differ diff --git a/results-2026-10-03/mutation/wolfxl/repeat-1-input.xlsx b/results-2026-10-03/mutation/wolfxl/repeat-1-input.xlsx new file mode 100644 index 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/wolfxl/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/wolfxl/repeat-1-output.xlsx b/results-2026-10-03/mutation/wolfxl/repeat-1-output.xlsx new file mode 100644 index 0000000..de2ccde Binary files /dev/null and b/results-2026-10-03/mutation/wolfxl/repeat-1-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/wolfxl/repeat-2-input.xlsx differ diff --git a/results-2026-10-03/mutation/wolfxl/repeat-2-output.xlsx b/results-2026-10-03/mutation/wolfxl/repeat-2-output.xlsx new file mode 100644 index 0000000..66792f5 Binary files /dev/null and b/results-2026-10-03/mutation/wolfxl/repeat-2-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/wolfxl/repeat-3-input.xlsx differ diff --git a/results-2026-10-03/mutation/wolfxl/repeat-3-output.xlsx b/results-2026-10-03/mutation/wolfxl/repeat-3-output.xlsx new file mode 100644 index 0000000..66792f5 Binary files /dev/null and b/results-2026-10-03/mutation/wolfxl/repeat-3-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/zavora-xlsx/repeat-1-input.xlsx differ diff --git a/results-2026-10-03/mutation/zavora-xlsx/repeat-1-output.xlsx b/results-2026-10-03/mutation/zavora-xlsx/repeat-1-output.xlsx new file mode 100644 index 0000000..14b5814 Binary files /dev/null and b/results-2026-10-03/mutation/zavora-xlsx/repeat-1-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/zavora-xlsx/repeat-2-input.xlsx differ diff --git a/results-2026-10-03/mutation/zavora-xlsx/repeat-2-output.xlsx b/results-2026-10-03/mutation/zavora-xlsx/repeat-2-output.xlsx new file mode 100644 index 0000000..14b5814 Binary files /dev/null and b/results-2026-10-03/mutation/zavora-xlsx/repeat-2-output.xlsx differ 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 0000000..8614250 Binary files /dev/null and b/results-2026-10-03/mutation/zavora-xlsx/repeat-3-input.xlsx differ diff --git a/results-2026-10-03/mutation/zavora-xlsx/repeat-3-output.xlsx b/results-2026-10-03/mutation/zavora-xlsx/repeat-3-output.xlsx new file mode 100644 index 0000000..14b5814 Binary files /dev/null and b/results-2026-10-03/mutation/zavora-xlsx/repeat-3-output.xlsx differ 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-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 0000000..d608218 Binary files /dev/null and b/results-2026-10-03/xlsx/heatmap.png differ 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/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 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: