문서 › 레퍼런스
적합성 테스트 (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차 검수에 있습니다.