1+ <!DOCTYPE html>
2+ < html lang ="zh-CN ">
3+ < head > < meta charset ="UTF-8 "> < title > HC 引擎浏览器测试</ title > </ head >
4+ < body style ="font-family:monospace;background:#14110d;color:#e8ddc8;padding:20px;line-height:1.7 ">
5+ < h3 style ="color:#d9ae6b "> HC v0.01 引擎浏览器测试</ h3 >
6+ < pre id ="out "> 运行中...</ pre >
7+ < script src ="../js/hic.js "> </ script >
8+ < script >
9+ let pass = 0 , fail = 0 ; const logs = [ ] ;
10+ function ok ( cond , label ) { if ( cond ) { pass ++ ; } else { fail ++ ; logs . push ( "✗ " + label ) ; } }
11+ const HC = window . HC ;
12+
13+ // 1. 变量声明
14+ let r = HC . classify ( "it title t 你好 HiCode" ) ;
15+ ok ( r . kind === "it" && r . name === "title" && r . vtype === "text" && r . value === "你好 HiCode" , "it title t" ) ;
16+ r = HC . classify ( "it logo p" ) ;
17+ ok ( r . kind === "it" && r . name === "logo" && r . vtype === "img" && r . value === "" , "it logo p" ) ;
18+ r = HC . classify ( "it age int 18" ) ;
19+ ok ( r . kind === "it" && r . name === "age" && r . vtype === "ordinary" , "it age int -> ordinary" ) ;
20+ r = HC . classify ( "it msg" ) ;
21+ ok ( r . kind === "it" && r . name === "msg" && r . vtype === "ordinary" , "it msg -> ordinary" ) ;
22+
23+ // 2. in 展示
24+ r = HC . classify ( "title in t" ) ;
25+ ok ( r . kind === "in" && r . mode === "text" , "in t" ) ;
26+ r = HC . classify ( "logo in p" ) ;
27+ ok ( r . kind === "in" && r . mode === "img" , "in p" ) ;
28+
29+ // 3. 条件头
30+ ok ( HC . classify ( "if age == 18:" ) . type === "if" , "if头" ) ;
31+ ok ( HC . classify ( "orif age > 18:" ) . type === "orif" , "orif头" ) ;
32+ ok ( HC . classify ( "noif:" ) . type === "noif" , "noif头" ) ;
33+
34+ // 4. 表达式求值
35+ ok ( HC . evalExpr ( "age == 18" , { age : { value : 18 } } ) === true , "数值比较" ) ;
36+ ok ( HC . evalExpr ( "1 == 1 and 2 > 1" , { } ) === true , "and" ) ;
37+ ok ( HC . evalExpr ( "1 > 2 or 3 == 3" , { } ) === true , "or" ) ;
38+ ok ( HC . evalExpr ( "not (1 == 2)" , { } ) === true , "not" ) ;
39+ ok ( HC . evalExpr ( "'hello' in 'xxhello'" , { } ) === true , "in子串" ) ;
40+
41+ // 5. 导向
42+ r = HC . parseNav ( "home to about" ) ;
43+ ok ( r && ! r . cross && r . toPage === "about" , "同项目 x to y" ) ;
44+ r = HC . parseNav ( "to about" ) ;
45+ ok ( r && ! r . cross && r . toPage === "about" , "to y(当前页)" ) ;
46+ r = HC . parseNav ( "fr 我的项目 首页 big to 我的项目 关于" ) ;
47+ ok ( r && r . cross && r . toProj === "我的项目" , "fr 项目 页面 big to" ) ;
48+
49+ // 6. 端到端
50+ const page = { name : "index" , code : [
51+ "it title t 你好,HiCode" ,
52+ "it intro t 简单上手的编程语言" ,
53+ "it logo p" ,
54+ "it count int 3" ,
55+ "if count == 3:" ,
56+ " intro in t" ,
57+ "noif:" ,
58+ " title in t" ,
59+ "to about"
60+ ] . join ( "\n" ) , images : { logo : "data:image/png;base64,AAAA" } } ;
61+ const pr = HC . processPage ( page , { } ) ;
62+ ok ( Object . keys ( pr . vars ) . length === 4 , "收集到4变量" ) ;
63+ ok ( pr . vars . logo . isImg && pr . vars . logo . value === "data:image/png;base64,AAAA" , "p绑定图片" ) ;
64+ const texts = pr . items . filter ( x => x . kind === "display" && x . mode === "text" ) ;
65+ ok ( texts . length === 1 && texts [ 0 ] . value === "简单上手的编程语言" , "if命中intro" ) ;
66+ ok ( pr . items . filter ( x => x . kind === "nav" ) . length === 1 , "1个导向" ) ;
67+
68+ // 7. HTML
69+ const proj = { id : "p1" , name : "我的项目" , pages : {
70+ p_a : page , p_b : { id : "p_b" , name : "about" , code : "it hello t 关于我们\nhello in t" , images : { } } } } ;
71+ const merged = HC . buildProjectMergedHtml ( proj , { } ) ;
72+ ok ( merged . indexOf ( 'data-page="我的项目::index"' ) >= 0 , "合并含index" ) ;
73+ ok ( merged . indexOf ( "简单上手的编程语言" ) >= 0 , "合并含文本" ) ;
74+ ok ( / < ! D O C T Y P E h t m l > / i. test ( merged ) , "HTML骨架" ) ;
75+ const single = HC . buildSinglePageHtml ( { name : "我的项目" } , page ) ;
76+ ok ( single . indexOf ( "简单上手" ) >= 0 || single . indexOf ( "你好,HiCode" ) >= 0 , "单页html" ) ;
77+
78+ // 8. ZIP
79+ const entries = HC . buildZipEntries ( [ proj ] ) ;
80+ ok ( entries . length === 2 , "zip两页" ) ;
81+ const z = HC . zipFiles ( entries . map ( e => ( { name : e . name , data : e . html } ) ) ) ;
82+ ok ( z && z [ 0 ] === 0x50 && z [ 1 ] === 0x4b , "zip魔数PK" ) ;
83+
84+ document . getElementById ( "out" ) . textContent = "通过 " + pass + " 项,失败 " + fail + " 项" + ( fail ? "\n" + logs . join ( "\n" ) : "\n全部通过 ✅" ) ;
85+ </ script >
86+ </ body >
87+ </ html >
0 commit comments