|
|
@@ -14,15 +14,18 @@
|
|
|
* S4-2 canvas 2d(hand-signature.vue)
|
|
|
* TC-SIG2D-03 模板 :id + type="2d"(非 canvas-id)
|
|
|
* TC-SIG2D-03b data 含 canvasId='hsCanvas_'+(_uid||0) 与 _canvasNode:null
|
|
|
+ * TC-SIG2D-03c data 含 canvasWidth/canvasHeight/dpr/_destroyed/_initTimer/_rectLeft/_rectTop(2d 绘制与初始化防御所需)
|
|
|
* TC-SIG2D-04 mounted 走 createSelectorQuery().in(this).select().fields({node:true,...})
|
|
|
* TC-SIG2D-05 触摸坐标优先 t.x/t.y,兜底 clientX-rectLeft(不依赖旧 getPos 缓存 rect)
|
|
|
* TC-SIG2D-06 onTouchMove 同步 ctx.stroke() 绘制(无 ctx.draw)
|
|
|
* TC-SIG2D-07 导出 canvasToTempFilePath({canvas:_canvasNode});清空 ctx.clearRect
|
|
|
+ * TC-SIG2D-01-E 2d 初始化失败重试 + _destroyed 防销毁竞态(mounted 重试链、beforeDestroy 清理、initCanvas 守卫)
|
|
|
+ * TC-SIG2D-02-E 导出降级链路保持:H5 直接透传 dataURL、小程序 fs.readFile 转 base64(既有链路不回归)
|
|
|
* S4-3 不回归
|
|
|
* TC-SIG2D-08 组件对外契约 props/emit 不变(value/strokeColor/strokeWidth/height/requireAgree/agreeText + confirm/clear/agree-change)
|
|
|
*
|
|
|
* 本文件只读源码并求值 script 段,不修改任何业务代码。
|
|
|
- * 当前实现 = v2「待开发」,本文件内新契约断言应为 RED(除 02/08 保留不变的既有契约)。
|
|
|
+ * 当前实现 = v2「待开发」,本文件内新契约断言应为 RED(除 02/08/02-E 保留不变的既有契约)。
|
|
|
*/
|
|
|
|
|
|
const fs = require('fs')
|
|
|
@@ -159,6 +162,19 @@ describe('签名实现重写 v2(竖屏直签 + canvas 2d)· signature.canvas
|
|
|
expect(padScript).toMatch(/hsCanvas_['"]?\s*\+\s*\(?(this\._uid|this\.uid)\s*\|\|\s*0/)
|
|
|
})
|
|
|
|
|
|
+ test('TC-SIG2D-03c data 含 2d 绘制/初始化防御字段(canvasWidth/canvasHeight/dpr/_rectLeft/_rectTop/_destroyed/_initTimer)', function () {
|
|
|
+ // v2 data 新增(参照 RadarChart):画布逻辑尺寸与像素比、fields rect 左上角、销毁标志与定时器引用
|
|
|
+ const opts = loadOptions(PAD, { uni: {}, wx: undefined, window: undefined })
|
|
|
+ const data = typeof opts.data === 'function' ? opts.data() : opts.data
|
|
|
+ expect(data).toHaveProperty('canvasWidth', 0)
|
|
|
+ expect(data).toHaveProperty('canvasHeight', 0)
|
|
|
+ expect(data).toHaveProperty('dpr', 1)
|
|
|
+ expect(data).toHaveProperty('_rectLeft', 0)
|
|
|
+ expect(data).toHaveProperty('_rectTop', 0)
|
|
|
+ expect(data).toHaveProperty('_destroyed', false)
|
|
|
+ expect(data).toHaveProperty('_initTimer', null)
|
|
|
+ })
|
|
|
+
|
|
|
test('TC-SIG2D-04 mounted 用 createSelectorQuery().in(this).select("#canvasId").fields({node:true,size:true,rect:true})', function () {
|
|
|
// 参照 RadarChart:createSelectorQuery().in(this).select('#'+canvasId).fields({node:true,...})
|
|
|
expect(padScript).toMatch(/createSelectorQuery\(\s*\)\s*\.in\(this\)/)
|
|
|
@@ -189,6 +205,38 @@ describe('签名实现重写 v2(竖屏直签 + canvas 2d)· signature.canvas
|
|
|
expect(padScript).not.toMatch(/clearRect[\s\S]{0,80}ctx\.draw\(\)/)
|
|
|
})
|
|
|
|
|
|
+ // ---------- 异常流契约(台账 TC-SIG2D-01-E / 02-E) ----------
|
|
|
+
|
|
|
+ test('TC-SIG2D-01-E 2d 初始化失败重试 + _destroyed 防销毁竞态', function () {
|
|
|
+ // data 含 _destroyed / _initTimer(重试链状态机锚点,参考 RadarChart)
|
|
|
+ const opts = loadOptions(PAD, { uni: {}, wx: undefined, window: undefined })
|
|
|
+ const data = typeof opts.data === 'function' ? opts.data() : opts.data
|
|
|
+ expect(data).toHaveProperty('_destroyed', false)
|
|
|
+ expect(data).toHaveProperty('_initTimer', null)
|
|
|
+ // 旧实现不应存在 loadRect 方法(v2 移除旧式 rect 缓存逻辑,改为 2d 初始化)
|
|
|
+ expect(padScript).not.toMatch(/loadRect\s*:/)
|
|
|
+ // 源码必须包含:_destroyed 守卫、setTimeout 重试赋值给 _initTimer、beforeDestroy 清理
|
|
|
+ expect(padScript).toMatch(/_destroyed/)
|
|
|
+ expect(padScript).toMatch(/_initTimer\s*=\s*setTimeout/)
|
|
|
+ expect(padScript).toMatch(/beforeDestroy/)
|
|
|
+ })
|
|
|
+
|
|
|
+ test('TC-SIG2D-02-E 导出降级链路保持:H5 直接透传 dataURL + 小程序 fs.readFile 转 base64(既有链路不回归)', function () {
|
|
|
+ // v2 规格:导出成功后 H5 直接传 dataURL、小程序 fs.readFile 转 base64 既有链路保持不变
|
|
|
+ // 旧实现已含该链路 → 本例为 GREEN 基线锚点,确保 v2 不退化
|
|
|
+ const src = padScript
|
|
|
+ // 统一回写入口 _emitSignature 存在
|
|
|
+ expect(src).toMatch(/_emitSignature/)
|
|
|
+ // H5 判断:tempFilePath 以 data:image 开头 → 直接透传
|
|
|
+ expect(src).toMatch(/indexOf\(['"]data:image['"]\)/)
|
|
|
+ // 小程序 fs.readFile base64 编码
|
|
|
+ expect(src).toMatch(/getFileSystemManager\(\)/)
|
|
|
+ expect(src).toMatch(/readFile\(/)
|
|
|
+ expect(src).toMatch(/encoding\s*:\s*['"]base64['"]/)
|
|
|
+ // 拼接 data:image/png;base64, 前缀
|
|
|
+ expect(src).toMatch(/data:image\/png;base64,/)
|
|
|
+ })
|
|
|
+
|
|
|
// ---------- S4-3 不回归 ----------
|
|
|
|
|
|
test('TC-SIG2D-08 组件对外契约不变(props/emit 保持,三调用方无感)', function () {
|