excel

문서 › 레퍼런스

적합성 테스트 (conformance suite)

validate(rows, rules)의 언어 중립 테스트 476개. 다른 언어로 옮긴 서버 구현은 이 파일들을 100% 통과해야 합니다.

82excel npm 패키지의 dist/conformance/(npm i 82excel 후 node_modules/82excel/dist/conformance/)에 validate(rows, rules) 의 언어 중립 테스트 476개가 있습니다. 규칙, 입력 행, 기대하는 오류·경고·정리된 행이 JSON 파일 하나에 들어 있습니다. Node 구현(82excel)은 100% 통과합니다. 다른 언어로 옮긴 구현은 이 파일들을 고치지 않고 100% 통과해야 브라우저 check() 와 같은 결과라고 말할 수 있습니다.

케이스 형식

{
  "name": "types/date-dots",
  "why": "research §3 Korean dates: 2024.01.05",
  "rules": { "columns": [{ "key": "v", "type": "date" }] },
  "rows": [{ "v": "2024.01.05" }],
  "expect": {
    "ok": true,
    "errors": [],
    "warnings": [],
    "rows": [{ "$row": 2, "v": "2024-01-05" }]
  }
}
  • rules 는 0.2 규칙 JSON 그대로, rows 는 열 key 로 된 입력 행입니다($row 가 있을 수 있음). 입력은 순수 JSON뿐입니다.
  • expect.errors·expect.warnings 는 { row, key?, code } 목록입니다. 행 단위 문제(BLANK_ROW, ROWS_TOO_FEW, ROWS_TOO_MANY)에는 key 가 없습니다.
  • expect.rows 는 $row 가 붙은 정리된 결과 행, expect.masked 는 개인정보 케이스에서 가려진 raw/value, expect.throws 는 invalid/ 케이스에서 던져야 할 메시지 조각입니다.
  • 약 1/3의 케이스에는 근거(스펙 절, 조사 노트, 결정)를 적은 why 가 있습니다. 기대값은 엔진 출력을 붙여 넣지 않고 스펙에서 직접 썼습니다.

그룹

폴더다루는 것
types/모든 열 형식: 맞는 값, 틀린 값, 정규형 다시 넣기, 엑셀 오류 값
rules/열 규칙, failOn
rowrules/when / compare / uniqueWith
blank/rows.blank
injection/formulaInjection
pii/감지, forbid/allow, 마스킹
normalize/normalize 스위치
idempotency/정리된 행을 다시 넣기
edge/행 번호, 경계값, rows.min/rows.max
invalid/거부해야 하는 규칙

비교 규칙

  • 옵션 없이 validate(case.rows, case.rules) 를 부릅니다.
  • errors·warnings: (row, key, code) 의 집합을 비교합니다. 순서는 상관없습니다.
  • ok 는 같아야 하고, rows 는 순서까지 엄격히 같아야 합니다(빠지거나 남는 키 없음, 숫자는 숫자로).
  • throws 는 메시지가 82excel: 로 시작하고 주어진 글을 그대로 포함해야 합니다. 이 글은 계약의 일부입니다.
  • 메시지 문구, rule, col, header, summary 는 비교하지 않습니다. key 가 있는 issue는 header(규칙의 머리글)도 가지지만 비교 대상은 아닙니다.

정해 둔 세부 동작

스펙이 말하지 않는 곳은 테스트가 정합니다. 결과 행(형식이 틀린 칸은 원래 값, 그 밖의 규칙 위반은 정리된 값), 행 번호($row 가 양의 정수가 아니면 index + headerRow + 1), 빈칸의 뜻, 값 정리 순서, 칸 검사 순서, issue의 key, 행 수(rows.min/rows.max 는 결과 행 수, 머리글 행에 key 없이), failOn, 엑셀 오류 값(#REF! 등은 어느 열에서든 CELL_TYPE), 수식 인젝션, 개인정보 감지 후보와 마스킹 모양, 정규식(u 플래그, test() 의미 — Python이라면 re.search), 전화번호 모양, 날짜 범위가 그렇습니다. 전체 목록은 README에 있습니다.

범위 밖

파일이 있어야 하는 것은 이 테스트에 없고 Node 패키지에서 따로 테스트합니다. 파일 단위 검사(암호, 인코딩, 숨김, 병합, 매크로, 시트 선택, 열 찾기, 합계 행), 저장된 칸에 대한 경고(PRECISION_LOSS, SCIENTIFIC_NOTATION), 실제 수식 칸, 엑셀 날짜 시리얼과 1904 날짜 체계, 메시지 문구와 언어, JS 행 훅이 그렇습니다.

실행하기

Node(기준 구현):

pnpm --filter 82excel exec vitest run test/conformance.test.ts

다른 언어: cases/**/*.json 을 돌며 위 비교 규칙을 적용하고, 케이스마다 name 으로 결과를 보고합니다. 서버에서 무엇을 하는지는 서버 2차 검수에 있습니다.