訂明本例驗收任務
假設答案接收器收到行、布林 complete 及文字或 null 的 next 引用。complete 為真須沒有 next,否則資料矛盾。未完整只列觀察行數、總數保留 null,並保存 next;檢查器不跟進該引用。
- 核對完整度欄
- 數已提供行
- 部分資料保留未知總數與續頁引用
標記矛盾,不可聲稱摘要涵蓋全數。
使用已填個案
| 個案 | 已提供輸入 | 預期結構化結果 | 判斷及原因 |
|---|---|---|---|
| 部分結果看到兩行 | {"rows":["A","B"],"complete":false,"next":"T"} | {"partial":true,"observed":2,"total":null,"next":"T"} | 看到兩行不代表總結果只有兩行。 |
| 完整而空白結果 | {"rows":[],"complete":true,"next":null} | {"partial":false,"observed":0,"total":0,"next":null} | 已列完整且空白,可確認零行。 |
| 續頁引用是數字 | {"rows":["A"],"complete":false,"next":42} | {"error":"completeness-contract"} | 本例引用欄只接文字或 null,不接數值。 |
| 完整標記與續頁矛盾 | {"rows":["A"],"complete":true,"next":"T"} | {"error":"completeness-contract"} | 本規則不能同時指已結束又有續頁。 |
逐步處理 complete-with-next 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"error":"completeness-contract"}。本規則不能同時指已結束又有續頁。
執行完整本機驗算
import assert from 'node:assert/strict';
function evaluate(x){
if(typeof x.complete!=='boolean'||(x.next!==null&&typeof x.next!=='string')||(x.complete&&x.next!==null))return {error:'completeness-contract'};
return {partial:!x.complete,observed:x.rows.length,total:x.complete?x.rows.length:null,next:x.next};
}
const cases = [
{
"id": "partial-two-rows",
"input": {
"rows": [
"A",
"B"
],
"complete": false,
"next": "T"
},
"expected": {
"partial": true,
"observed": 2,
"total": null,
"next": "T"
}
},
{
"id": "complete-empty",
"input": {
"rows": [],
"complete": true,
"next": null
},
"expected": {
"partial": false,
"observed": 0,
"total": 0,
"next": null
}
},
{
"id": "nontext-reference",
"input": {
"rows": [
"A"
],
"complete": false,
"next": 42
},
"expected": {
"error": "completeness-contract"
}
},
{
"id": "complete-with-next",
"input": {
"rows": [
"A"
],
"complete": true,
"next": "T"
},
"expected": {
"error": "completeness-contract"
}
}
];
for (const c of cases) assert.deepEqual(evaluate(c.input), c.expected, c.id);
console.log(JSON.stringify({checked:cases.length,caseIds:cases.map(c=>c.id)}));
同事摘要跟原完整度標記一起保留。本接收器不讀續頁,也未認證會變動資料的完整副本。