import { describe, it, expect } from 'vitest' import * as fc from 'fast-check' import { generateQRCodeData, verifyQRCodeData } from '../utils/qrcode.js' describe('Property 8: 二维码生成Round-Trip', () => { /** * **Feature: mobile-app, Property 8: 二维码生成Round-Trip** * **Validates: Requirements 4.1** * * 对于任意有效的token字符串,生成二维码后解码应得到与原始token相同的字符串。 * 由于uQRCode不支持解码,我们通过重新编码并比较模块数据来验证一致性: * 相同的token输入应始终产生相同的二维码模块数据。 */ it('相同token生成的二维码模块数据应完全一致(确定性)', () => { // 生成可被QR编码的ASCII字符串 const tokenArb = fc.string({ minLength: 1, maxLength: 200 }) .filter(s => s.trim().length > 0) fc.assert( fc.property(tokenArb, (token) => { const qrData = generateQRCodeData(token) // 验证生成的数据结构正确 expect(qrData).toHaveProperty('modules') expect(qrData).toHaveProperty('moduleCount') expect(qrData.moduleCount).toBeGreaterThan(0) expect(qrData.modules.length).toBe(qrData.moduleCount) // 验证Round-Trip:重新编码相同token应产生相同结果 const verified = verifyQRCodeData(token, qrData) expect(verified).toBe(true) }), { numRuns: 100 } ) }) })