type Testcase = { id: number, subId: number | null, content: string, procedure: string, testData: string| null, expected: string, actual: string, pass: boolean } const testcase: Testcase[] = [ { "id": 1, "subId": null, "content": "Focus/Unfocus", "procedure": "1. 청크를 클릭한다.", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 2, "subId": null, "content": "remove", "procedure": "1. 청크를 삭제하는 버튼을 클릭한다.", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 3, "subId": 1, "content": "render - markdown", "procedure": "1. 마크다운 청크 렌더링을 확인한다.", "testData": " # 제목 ", "expected": "", "actual": "", "pass": true }, { "id": 3, "subId": 2, "content": "render - latex", "procedure": "1. LaTex 청크 렌더링을 확인한다.", "testData": " sum^n_{n=0}n = \\frac{n(n+1)}2$$ ", "expected": "", "actual": "", "pass": true }, { "id": 3, "subId": 3, "content": "render - link", "procedure": "1. Image 청크 렌더링을 확인한다.", "testData": " http://picsum.photos/200/300​ ", "expected": "", "actual": "", "pass": true }, { "id": 4, "subId": null, "content": "previews", "procedure": "1. Katex 청크의 미리보기를 본다.", "testData": " sum^n_{n=0}n = \\frac{n(n+1)}2$$ ", "expected": "", "actual": "", "pass": false }, { "id": 10, "subId": null, "content": "autocomplete", "procedure": "1. 자동완성을 시험한다.", "testData": null, "expected": "", "actual": "", "pass": false }, { "id": 11, "subId": null, "content": "swap positions", "procedure": "1. 청크의 위치를 바꾼다.", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 27, "subId": 1, "content": "edit", "procedure": "1. 청크를 수정한다.", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 27, "subId": 2, "content": "edit chunk conflict", "procedure": "1. 청크를 수정모드에 들어간다.", "testData": null, "expected": "", "actual": "", "pass": false }, { "id": 5, "subId": null, "content": "view Chunk", "procedure": "1. 문서를 열어 청크가 렌더링되는지 본다.", "testData": "test.syd", "expected": "", "actual": "", "pass": true }, { "id": 7, "subId": null, "content": "add/delete tag", "procedure": "1. 문서에 태그를 추가한다.
2. 문서에 태그를 삭제한다.", "testData": "A", "expected": "", "actual": "", "pass": true }, { "id": 8, "subId": null, "content": "Drag And Drop Upload,", "procedure": "1. 텍스트를 드래그한다.", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 14, "subId": null, "content": "create/delete/rename file", "procedure": "1. 파일을 만든다.", "testData": "test.txt", "expected": "", "actual": "", "pass": true }, { "id": 15, "subId": null, "content": "upload/download files", "procedure": "1. 파일을 업로드한다.", "testData": "test.txt", "expected": "", "actual": "", "pass": true }, { "id": 18, "subId": null, "content": "export document", "procedure": "1. export 버튼을 누른다.", "testData": null, "expected": "", "actual": "", "pass": false }, { "id": 17, "subId": null, "content": "render", "procedure": "1. 스태시가 그려지는지 확인한다", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 19, "subId": null, "content": "add", "procedure": "1. 청크를 추가한다", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 20, "subId": null, "content": "remove", "procedure": "1. 청크를 삭제한다", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 21, "subId": null, "content": "Drag and Drop to Document", "procedure": "1. 청크로부터 문서로 청크를 옮긴다.", "testData": null, "expected": "", "actual": "", "pass": true }, { "id": 22, "subId": null, "content": "Login", "procedure": "1. 비밀번호를 입력한다.", "testData": "admin", "expected": "", "actual": "", "pass": false }, { "id": 24, "subId": null, "content": "Localization", "procedure": "1. 다른언어를 지원하는지 언어를 바꿔 확인한다", "testData": null, "expected": "", "actual": "", "pass": false }, { "id": 16, "subId": null, "content": "Document Search", "procedure": "1. 검색해본다.", "testData": null, "expected": "", "actual": "", "pass": false }, { "id": 85, "subId": null, "content": "Permission", "procedure": "1. 각각의 기능들에 권한없이 시도한다", "testData": null, "expected": "", "actual": "", "pass": true } ] import {Issue} from "./githubType.ts" async function readContent(path?: string): Promise { let content = "[]"; if (path) { content = await Deno.readTextFile(path); } else throw new Error("No input provided. path or stdin."); return content; } const data = await readContent("../build/issues.json") const issues = JSON.parse(data) as Issue[] const table = new Map(); issues.forEach((x)=>{ const category = x.title.split(":")[0]; if(!category) return; let c = table.get(category) if(!c){ c = []; table.set(category,c); } c.push(x); }) const keys = Array.from(table.keys()); keys.forEach(x=>{ console.log(`\n### ${x}\n`); const issues = table.get(x); console.log(""); console.log(""); console.log(""); //console.log(""); console.log(""); console.log(""); console.log(""); console.log(""); console.log(""); console.log(""); console.log(""); console.log(""); const ts = issues!.map(x=> testcase.filter(y=>y.id==x.number)).flat() as Testcase[]; if(ts?.length == 0) return; //console.log(``); ts.forEach((y,i)=>{ //if(i>0) console.log(""); const id = y.subId ? `${y.id}-${y.subId}` : y.id; console.log(``); console.log(``); console.log(``); console.log(``); console.log(``); console.log(""); }) console.log(""); console.log("
CategoryIDContentProcedureTest DataP/F
${x}
${id}${y.content}${y.procedure}${y.testData ?? ""}${y.pass ? "P" : "F"}
"); })