Saltar al contenido principal

Suite de conformidad de XTL

Este directorio contiene el corpus de conformidad — los fixtures de prueba que cualquier implementación de XTL debe pasar para reclamar conformidad. El corpus es la definición ejecutable del comportamiento de XTL.

Organización

conformance/
├── README.md ← este archivo
├── AUTHORING.md ← cómo añadir fixtures (evitar la trampa de "JS como verdad")
├── runner-protocol.md ← cómo las implementaciones deben ejecutar la suite
└── fixtures/
└── <NNN>-<slug>/
├── template.xlsx
├── data.xlsx
├── expected.xlsx ← salida esperada canónica (caso de archivo único)
├── expected/ ← O un directorio de archivos (caso multi-archivo o sin salida)
│ └── *.xlsx
├── sin salida esperada ← para fixtures expected_error
├── sin expected estático ← para fixtures expected_dynamic
└── meta.yaml ← descripción, referencias a secciones de la especificación, tags

Qué significa "pasar"

Un fixture de salida estática pasa si la implementación, dados template.xlsx y data.xlsx, produce salidas que coinciden con expected.xlsx (o con el contenido de expected/). Los ejecutores de etapa 1 pueden comparar valores de hoja/celda de alto nivel. Los ejecutores de etapa 2 comparan contenido del libro byte a byte tras una normalización canónica del zip OOXML:

  • Archivos dentro del zip ordenados por nombre
  • XML serializado en forma canónica determinista
  • Espacios en blanco dentro de runs de texto preservados
  • Metadatos del generador eliminados (creator, modifiedBy, lastModified)

Consulta runner-protocol.md para la etapa de comparación y las reglas de canonicalización.

Un fixture de error pasa cuando la implementación reporta un error que contiene el texto de expected_error del fixture. Los fixtures de error no incluyen expected.xlsx ni un directorio expected/.

Un fixture dinámico pasa cuando la salida de la implementación coincide con las aserciones dinámicas declaradas por expected_dynamic en meta.yaml. Los fixtures dinámicos no incluyen expected.xlsx ni un directorio expected/.

Versionado

Cada directorio de fixture contiene meta.yaml declarando la versión mínima de la especificación que requiere (spec_version: 0.1). Las implementaciones reportan a qué versión de la especificación apuntan; la suite filtra los fixtures en consecuencia.

Los fixtures de salida estática también pueden declarar comparison_stage. El campo toma por defecto 1; los fixtures que requieren comparación canónica de OOXML declaran comparison_stage: 2.

Metadatos del fixture

Campos de meta.yaml usados por el corpus:

CampoRequeridoAplica aSignificado
descriptiontodos los fixturesContrato de una línea que el fixture asegura.
spec_sectiontodos los fixturesSección de la especificación o ADR que define el comportamiento.
spec_versiontodos los fixturesVersión mínima de XTL requerida por el fixture.
tagstodos los fixturesCategorías filtrables para reportes y ejecuciones enfocadas.
verified_bynotodos los fixturesVerificaciones de autoría independientes, como hand o manual-script.
expected_warningsnotodos los fixturesSubstrings estables de advertencia que la implementación debería emitir.
expected_errornofixtures de errorSubstring estable de error; se omiten las salidas estáticas esperadas.
expected_dynamicnofixtures dinámicosTipo de aserción dinámica; actualmente utc_today.
dynamic_cellscon expected_dynamicfixtures dinámicosAserciones de hoja/celda/formato calculadas por el ejecutor.
comparison_stagenofixtures de salida estáticaEtapa de comparación mínima; toma por defecto 1, usa 2 para verificaciones sensibles a OOXML.
skip_reasonnotodos los fixturesRazón temporal por la que un fixture roto conocido se omite.

expected_error y expected_dynamic son mutuamente exclusivos. Los fixtures de salida estática usan expected.xlsx o expected/; un directorio expected/ vacío significa cero archivos de salida. Los fixtures de error y dinámicos omiten las salidas estáticas esperadas.

Catálogo de fixtures

El corpus de arranque de XTL 0.1 contiene actualmente estos fixtures:

IDFixtureContrato
001bracket-substitutionExpresiones de columna fuente entre corchetes producen una fila de salida por fila de fuente.
002if-functionIF(condition, then, else) evalúa comparaciones dentro de la fila de datos actual.
003list-sheet-filter@filter [field] in _ListSheet conserva las filas coincidentes y elimina la hoja de lista de la salida.
004repeat-right-default@repeat right sin un conteo explícito toma colSpan = 1 por defecto.
005round-half-away-from-zeroROUND() usa redondeo estilo Excel (mitad alejándose de cero).
006filename-forbidden-charsLos caracteres prohibidos en nombres de archivo se reemplazan por _.
007filename-reserved-nameLos nombres base de dispositivos reservados de Windows reciben un único _ final.
008numfmt-numeric-string-coercionLos formatos numéricos de plantilla coaccionan strings numéricas a números.
009numfmt-date-string-coercionLos formatos de fecha de plantilla coaccionan strings con forma de fecha a valores de fecha.
010numfmt-text-format-coercionEl formato de texto @ coacciona un valor de expresión única a string.
011text-date-formatTEXT(date, "YYYY-MM-DD") retorna una string usando los tokens de fecha de XTL.
012text-number-formatTEXT(number, format) admite el subconjunto mínimo de formato numérico de XTL 0.1.
013rich-text-template-expressionLas celdas de plantilla con rich-text se parsean concatenando runs de texto antes de la detección de expresiones.
014source-formula-cached-resultLas celdas con fórmula en la fuente usan resultados cacheados y no son recalculadas por XTL.
015source-sheet-prefix-first-matchLos patrones de prefijo source_sheet seleccionan la primera hoja coincidente en el orden del libro.
016text-number-negative-roundingLos formatos numéricos TEXT() redondean los bordes de .5 negativos mitad alejándose de cero.
017source-sheet-prefix-no-match-errorCuando no hay coincidencia para el prefijo source_sheet, se reporta un error estable.
018source-formula-missing-cached-result-errorLas celdas con fórmula en la fuente sin resultado cacheado reportan un error estable.
019filename-empty-basename-errorLa sanitización de nombre de archivo reporta un error para un nombre base vacío.
020filename-length-overflow-errorLa sanitización de nombre de archivo reporta un error por encima del límite de 255 bytes.
021numfmt-number-coercion-errorLos formatos numéricos de plantilla reportan un error cuando la coerción falla.
022numfmt-date-coercion-errorLos formatos de fecha de plantilla reportan un error cuando la coerción falla.
023today-utc-dynamicTODAY() produce la fecha UTC de inicio del ejecutor mediante una aserción dinámica.
024stage2-merge-preservationLa comparación de etapa 2 verifica que los rangos combinados debajo de bloques de datos expandidos se preservan.
025stage2-style-numfmt-preservationLa comparación de etapa 2 verifica que las celdas renderizadas preservan el estilo y el numFmt de la plantilla.
026stage2-splice-merge-style-preservationLa comparación de etapa 2 verifica que la expansión de filas preserva tanto los rangos combinados desplazados como las celdas renderizadas con estilo/formato numérico.
027stage2-cross-writer-canonicalizationLa comparación de etapa 2 verifica que las diferencias conocidas entre escritores OOXML canonicalizan al mismo contenido de libro.
028source-table-row-shorthandsource_table = N selecciona la fila N como nombres de columna de fuente y lee las filas debajo.
029source-table-open-rangesource_table = B3:D selecciona una ventana de columnas y lee filas debajo hasta el final de filas usadas.
030source-table-finite-rangesource_table = B3:D4 deja de leer al llegar a la fila final declarada.
031source-table-zero-data-rangesource_table = B3:D3 es válido y produce cero filas de fuente.
032source-table-empty-column-name-errorLos nombres de columna de fuente vacíos dentro del span seleccionado reportan un error estable.
033source-table-duplicate-column-name-errorLos nombres de columna de fuente duplicados reportan un error estable.
034source-table-invalid-selector-errorLos selectores inválidos, como fila cero, reportan un error estable.
035source-table-rich-text-headerLas celdas de nombre de columna de fuente con rich-text se concatenan antes del parseo de source_table.
036source-table-formula-headerLas celdas de nombre de columna de fuente con fórmula usan resultados cacheados.
037source-table-formula-header-missing-cache-errorLas celdas de nombre de columna de fuente con fórmula sin resultado cacheado reportan un error estable.
038source-sheet-exact-match-beats-prefixLas coincidencias exactas de source_sheet tienen precedencia sobre los patrones de prefijo.
039source-sheet-default-first-worksheetSi se omite source_sheet, se usa la primera hoja en el orden del libro.
040list-sheet-hidden-states-removedLas hojas de lista ocultas y muy ocultas se eliminan igualmente de los libros de salida.
041row-function-inside-repeat-blockROW() retorna el índice 1-based de la fila de datos renderizada dentro de un bloque repeat.
042row-function-outside-repeat-block-errorLlamar a ROW() fuera de un bloque repeat reporta un error estable.
043ifempty-functionIFEMPTY() retorna el fallback para valores vacíos y deja pasar los valores no vacíos.
044sort-and-top-order@sort se ejecuta antes de @top, por lo que las N filas superiores vienen del conjunto ya ordenado.
045list-sheet-not-in-filter@filter ... !in _Sheet conserva las filas cuyos valores no están en la hoja de lista y elimina la hoja de lista de la salida.
046count-field-non-emptyCOUNT([field]) cuenta valores no vacíos en el conjunto de filas actual.
047aggregate-functionsLos agregados principales operan sobre el conjunto de filas renderizadas actual.
048if-and-comparison-boundariesLos operadores de comparación dirigen el comportamiento de IF() y @filter alrededor del borde de cero.
049filename-sanitization-warningSanitizar un nombre de archivo renderizado emite una advertencia sin cambiar la semántica de salida.
050empty-ifempty-whitespace-onlyIFEMPTY trata las strings que solo contienen espacios como vacías según ADR-0007.
051empty-ifempty-zero-not-emptyIFEMPTY preserva el número 0; los números nunca son vacíos según ADR-0007.
052empty-count-field-whitespace-zero-falseCOUNT([field]) cuenta valores no vacíos según ADR-0007 — espacios vacíos, 0 y FALSE no vacíos.
053empty-row-skip-whitespace-onlyUna fila fuente cuyas celdas sean todas vacías según ADR-0007 se omite, incluidas las celdas con solo espacios.
054empty-list-membershipLas hojas de lista descartan las entradas vacías al leerse; un valor de fila fuente vacío nunca coincide con @filter ... in _Sheet según ADR-0007.
055if-truthy-zero-and-emptyIF trata 0 y los valores vacíos como falsy; números distintos de cero, strings no vacías y TRUE son truthy según ADR-0008.
056if-truthy-string-zero-not-specialIF("0", …) e IF("false", …) toman la rama truthy — no hay caso especial para valores de bandera tipados como string.
057if-truthy-booleanUna celda fuente booleana dirige la truthiness de IF directamente según ADR-0008.
058if-comparison-resultEl resultado booleano de una expresión de comparación alimenta directamente la truthiness de IF según ADR-0008.
059compare-numeric-string-vs-numberLa comparación parsea números y strings numéricas bajo el compareValues compartido según ADR-0009.
060compare-string-codepoint-orderLa comparación fallback de strings usa orden de code-point Unicode — sin collation con consciencia de locale según ADR-0009.
061concat-canonical-form& convierte operandos a string usando la forma canónica de string según ADR-0009 (booleanos en mayúsculas, enteros sin decimales).
062concat-empty-stringifies-to-empty& sobre un operando vacío aporta la string vacía según ADR-0009.
063compare-empty-vs-valueDos operandos vacíos se comparan iguales; exactamente un vacío hace que = sea falso según las reglas 1 y 2 de ADR-0009.
064compare-unicode-minus-not-numericUna string con menos Unicode (U+2212) no se parsea como número; la comparación cae al fallback de string canónica según ADR-0009.
065input-text-default-appliedUn valor por defecto de input de texto _inputs se rellena cuando el host omite el valor (ADR-0010).
066input-text-host-suppliedUn input provisto por el host fluye a través de celdas, nombres de hoja y el patrón de nombre de archivo de salida (ADR-0010).
067input-missing-required-errorUna declaración _inputs requerida (sin default) que el host omite es un error (ADR-0010).
068input-select-host-suppliedUn input select acepta un valor del host listado en las opciones declaradas separadas por pipes (ADR-0010).
069source-multi-declarationUna hoja __sources__ declara una fuente nombrada adicional; los agregados sobre ella operan sobre su conjunto completo de filas según ADR-0012.
070source-aggregate-cross-sourceCOUNT/MIN/MAX sobre una fuente nombrada operan sobre su conjunto completo de filas según ADR-0012.
071source-directive-active@source SourceName delimita el alcance de un bloque de datos; dentro de él, [Column] se resuelve a esa fuente según ADR-0012.
072source-undeclared-error@source referenciando una fuente no declarada en __sources__ es un error en tiempo de parseo según ADR-0012.
073source-row-cross-errorUna referencia a nivel de fila a la columna de una fuente no activa es un error según ADR-0012.
074xlookup-basicXLOOKUP de 3 args retorna la columna del return-array coincidente para la primera fila cuyo lookup-array coincide según ADR-0013.
075xlookup-fallbackXLOOKUP de 4 args retorna el fallback cuando ninguna fila coincide según ADR-0013.
076xlookup-no-match-errorXLOOKUP de 3 args sin fallback da error cuando ninguna fila coincide según ADR-0013.
077xlookup-source-mismatch-errorEl arg 2 y el arg 3 de XLOOKUP deben referenciar la misma fuente según ADR-0013.
078xlookup-bare-bracket-errorEl arg 2 / arg 3 de XLOOKUP requieren una referencia entre corchetes con prefijo de fuente según ADR-0013.
079join-basic-inner@join empareja cada fila primaria con la primera fila unida coincidente según ADR-0014.
080join-no-match-dropped@join usa semántica de inner — las filas primarias sin coincidencia se descartan según ADR-0014.
081join-undeclared-source-error@join referenciando una fuente no declarada en __sources__ es un error en tiempo de parseo según ADR-0014.
082join-bad-on-clause-errorLa cláusula on de @join debe referenciar la fuente unida y la fuente primaria del bloque según ADR-0014.
083sort-stable-equal-keys@sort es estable — las filas con claves iguales preservan el orden de fuente según ADR-0016.
084sort-multi-stable-priorityMúltiples directivas @sort se aplican con primera = clave primaria, las posteriores como criterios de desempate según ADR-0016.
085file-group-first-seen-orderLos grupos de archivo se emiten en orden de primera aparición sobre las filas fuente según ADR-0016.
086sheet-group-first-seen-orderLos grupos de hoja dentro de un archivo se emiten en orden de primera aparición según ADR-0016.
087date-canonical-string-concatUna Date dentro de & produce YYYY-MM-DD (medianoche) o YYYY-MM-DDTHH:mm:ss según ADR-0017.
088date-comparison-equalityLos valores de fecha se comparan vía forma canónica de string contra un valor de filtro string según ADR-0017.
089error-sentinel-emptyLas celdas de error de Excel (#N/A, #VALUE!, …) se leen como vacías según ADR-0017.
090percentage-numeric-flowLas celdas con formato de porcentaje fluyen como su Number subyacente según ADR-0017 (50% → 0.5).

Estado

El corpus de XTL 0.1 está en estado de arranque. Los fixtures deberían añadirse solo para comportamientos ya enunciados en spec/README.md, siguiendo el mismo patrón usado por proyectos de estándares como CommonMark: la prosa define la regla, los fixtures hacen la regla ejecutable, y las implementaciones reportan qué fixtures pasan.

La implementación de referencia no hace su propio comportamiento normativo. Cuando un fixture y la implementación discrepan, actualiza la implementación o el fixture según la precedencia de especificación en spec/README.md.

Los fixtures del comportamiento principal de XTL 0.1 evitan extensiones definidas por la implementación, como formatos de TEXT() fuera de la tabla mínima en spec/language.md.