{"version":3,"sources":["../../src/tests/emoji-commit-parsing.test.ts"],"sourcesContent":["/**\n * 测试 changelogen 的 emoji commit 解析功能\n *\n * 验证各种提交格式是否能够被正确解析：\n * - gitmoji 代码格式: :sparkles: feat: description\n * - Unicode emoji 格式: ✨ feat: description\n * - 带作用域: 🐞 fix(scope): description\n * - 标准格式: feat(scope): description\n */\n\n// 简单的测试断言函数\nfunction assert(condition: boolean, message: string) {\n\tif (!condition) {\n\t\tthrow new Error(`❌ Test failed: ${message}`);\n\t}\n}\n\nfunction assertEqual<T>(actual: T, expected: T, message: string) {\n\tif (actual !== expected) {\n\t\tthrow new Error(`❌ Test failed: ${message}\\n  Expected: ${expected}\\n  Actual: ${actual}`);\n\t}\n}\n\n// changelogen 的提交解析正则表达式（从源码复制）\nconst ConventionalCommitRegex =\n\t/(?<emoji>:.+:|(\\uD83C[\\uDF00-\\uDFFF])|(\\uD83D[\\uDC00-\\uDE4F\\uDE80-\\uDEFF])|[\\u2600-\\u2B55])?( *)?(?<type>[a-z]+)(\\((?<scope>.+)\\))?(?<breaking>!)?: (?<description>.+)/i;\n\ninterface CommitMatch {\n\temoji?: string;\n\ttype: string;\n\tscope?: string;\n\tbreaking?: string;\n\tdescription: string;\n}\n\n/**\n * 解析提交消息并返回匹配的组\n */\nfunction parseCommitMessage(commit: string): CommitMatch | null {\n\tconst match = commit.match(ConventionalCommitRegex);\n\tif (!match || !match.groups) {\n\t\treturn null;\n\t}\n\n\tconst { emoji, type, scope, breaking, description } = match.groups;\n\treturn {\n\t\temoji: emoji || undefined,\n\t\ttype,\n\t\tscope: scope || undefined,\n\t\tbreaking: breaking || undefined,\n\t\tdescription,\n\t};\n}\n\n/**\n * 测试各种 emoji 提交格式的解析\n */\nfunction testEmojiCommitParsing() {\n\tconsole.log(\"🧪 Testing Emoji Commit Message Parsing...\\n\");\n\n\tconst testCommits = [\n\t\t{\n\t\t\tcommit: \":sparkles: feat(auth): 新增用户认证功能\",\n\t\t\texpected: {\n\t\t\t\temoji: \":sparkles:\",\n\t\t\t\ttype: \"feat\",\n\t\t\t\tscope: \"auth\",\n\t\t\t\tdescription: \"新增用户认证功能\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tcommit: \"✨ feat(auth): 新增用户认证功能\",\n\t\t\texpected: {\n\t\t\t\temoji: \"✨\",\n\t\t\t\ttype: \"feat\",\n\t\t\t\tscope: \"auth\",\n\t\t\t\tdescription: \"新增用户认证功能\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tcommit: \"🐞 fix(api): 修复数据获取错误\",\n\t\t\texpected: {\n\t\t\t\temoji: \"🐞\",\n\t\t\t\ttype: \"fix\",\n\t\t\t\tscope: \"api\",\n\t\t\t\tdescription: \"修复数据获取错误\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tcommit: \"📝 docs: 更新API文档\",\n\t\t\texpected: {\n\t\t\t\temoji: \"📝\",\n\t\t\t\ttype: \"docs\",\n\t\t\t\tdescription: \"更新API文档\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tcommit: \"🔧 build(deps): 升级依赖包版本\",\n\t\t\texpected: {\n\t\t\t\temoji: \"🔧\",\n\t\t\t\ttype: \"build\",\n\t\t\t\tscope: \"deps\",\n\t\t\t\tdescription: \"升级依赖包版本\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tcommit: \"📦 chore: 更新构建配置\",\n\t\t\texpected: {\n\t\t\t\temoji: \"📦\",\n\t\t\t\ttype: \"chore\",\n\t\t\t\tdescription: \"更新构建配置\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tcommit: \"feat(api): 新增数据导出功能\",\n\t\t\texpected: {\n\t\t\t\ttype: \"feat\",\n\t\t\t\tscope: \"api\",\n\t\t\t\tdescription: \"新增数据导出功能\",\n\t\t\t},\n\t\t},\n\t];\n\n\tlet passedTests = 0;\n\ttestCommits.forEach(({ commit, expected }, index) => {\n\t\ttry {\n\t\t\tconst result = parseCommitMessage(commit);\n\n\t\t\tassert(result !== null, `Commit should be parseable: \"${commit}\"`);\n\t\t\tassertEqual(result!.type, expected.type, `Type mismatch for commit: \"${commit}\"`);\n\t\t\tassertEqual(result!.scope, expected.scope, `Scope mismatch for commit: \"${commit}\"`);\n\t\t\tassertEqual(result!.emoji, expected.emoji, `Emoji mismatch for commit: \"${commit}\"`);\n\t\t\tassertEqual(result!.description, expected.description, `Description mismatch for commit: \"${commit}\"`);\n\n\t\t\tconsole.log(`✅ Test #${index + 1} passed: \"${commit}\"`);\n\t\t\tconsole.log(`   → Type: ${result!.type}, Scope: ${result!.scope || \"none\"}, Emoji: ${result!.emoji || \"none\"}`);\n\t\t\tconsole.log(`   → Description: ${result!.description}\\n`);\n\t\t\tpassedTests++;\n\t\t} catch (error) {\n\t\t\tconsole.error(`❌ Test #${index + 1} failed: \"${commit}\"`);\n\t\t\tconsole.error(`   → ${error.message}\\n`);\n\t\t}\n\t});\n\n\treturn passedTests;\n}\n\n/**\n * 测试无效的提交消息\n */\nfunction testInvalidCommitMessages() {\n\tconsole.log(\"🧪 Testing Invalid Commit Messages...\\n\");\n\n\tconst invalidCommits = [\"just a random message\", \"feat without colon\", \"123: starts with number (no type)\"];\n\n\tlet passedTests = 0;\n\tinvalidCommits.forEach((commit, index) => {\n\t\ttry {\n\t\t\tconst result = parseCommitMessage(commit);\n\t\t\tassert(result === null, `Invalid commit should return null: \"${commit}\"`);\n\t\t\tconsole.log(`✅ Invalid test #${index + 1} passed: \"${commit}\" → null`);\n\t\t\tpassedTests++;\n\t\t} catch (error) {\n\t\t\tconsole.error(`❌ Invalid test #${index + 1} failed: \"${commit}\"`);\n\t\t\tconsole.error(`   → ${error.message}`);\n\t\t}\n\t});\n\n\treturn passedTests;\n}\n\n/**\n * 测试 breaking changes 解析\n */\nfunction testBreakingChanges() {\n\tconsole.log(\"\\n🧪 Testing Breaking Changes...\\n\");\n\n\tconst breakingCommit = \"🔥 feat!: remove deprecated API\";\n\n\ttry {\n\t\tconst result = parseCommitMessage(breakingCommit);\n\n\t\tassert(result !== null, \"Breaking commit should be parseable\");\n\t\tassertEqual(result!.type, \"feat\", \"Breaking change type should be feat\");\n\t\tassertEqual(result!.breaking, \"!\", \"Breaking change marker should be !\");\n\t\tassertEqual(result!.description, \"remove deprecated API\", \"Breaking change description should match\");\n\n\t\tconsole.log(`✅ Breaking change test passed: \"${breakingCommit}\"`);\n\t\tconsole.log(`   → Type: ${result!.type}, Breaking: ${result!.breaking}, Description: ${result!.description}`);\n\n\t\treturn 1;\n\t} catch (error) {\n\t\tconsole.error(`❌ Breaking change test failed: \"${breakingCommit}\"`);\n\t\tconsole.error(`   → ${error.message}`);\n\t\treturn 0;\n\t}\n}\n\n/**\n * 测试带有 PR 引用的提交\n */\nfunction testPullRequestReferences() {\n\tconsole.log(\"\\n🧪 Testing Pull Request References...\\n\");\n\n\tconst commitWithPR = \"✨ feat(auth): add OAuth support (#123)\";\n\n\ttry {\n\t\tconst result = parseCommitMessage(commitWithPR);\n\n\t\tassert(result !== null, \"PR commit should be parseable\");\n\t\tassertEqual(result!.type, \"feat\", \"PR commit type should be feat\");\n\t\tassertEqual(result!.scope, \"auth\", \"PR commit scope should be auth\");\n\t\tassertEqual(result!.description, \"add OAuth support (#123)\", \"PR commit description should include PR reference\");\n\n\t\tconsole.log(`✅ PR reference test passed: \"${commitWithPR}\"`);\n\t\tconsole.log(`   → Type: ${result!.type}, Scope: ${result!.scope}, Description: ${result!.description}`);\n\n\t\treturn 1;\n\t} catch (error) {\n\t\tconsole.error(`❌ PR reference test failed: \"${commitWithPR}\"`);\n\t\tconsole.error(`   → ${error.message}`);\n\t\treturn 0;\n\t}\n}\n\n/**\n * 验证所有支持的格式\n */\nfunction testSupportedFormats() {\n\tconsole.log(\"\\n🧪 Testing Supported Format Coverage...\\n\");\n\n\tconst supportedFormats = [\n\t\t\"gitmoji 代码格式: :sparkles: type: description\",\n\t\t\"Unicode emoji 格式: ✨ type: description\",\n\t\t\"带作用域: 🐞 type(scope): description\",\n\t\t\"标准格式: type(scope): description\",\n\t];\n\n\tconst testCases = [\n\t\t\":sparkles: feat: new feature\",\n\t\t\"✨ feat: new feature\",\n\t\t\"🐞 fix(api): bug fix\",\n\t\t\"feat(api): standard format\",\n\t];\n\n\tlet passedTests = 0;\n\ttestCases.forEach((commit, index) => {\n\t\ttry {\n\t\t\tconst result = parseCommitMessage(commit);\n\t\t\tassert(result !== null, `Supported format should be parseable: \"${commit}\"`);\n\t\t\tconsole.log(`✅ Format ${index + 1} supported: ${supportedFormats[index]}`);\n\t\t\tconsole.log(`   → Parsed: \"${commit}\" → Type: ${result!.type}\\n`);\n\t\t\tpassedTests++;\n\t\t} catch (error) {\n\t\t\tconsole.error(`❌ Format ${index + 1} failed: ${supportedFormats[index]}`);\n\t\t\tconsole.error(`   → ${error.message}\\n`);\n\t\t}\n\t});\n\n\treturn passedTests;\n}\n\n/**\n * 运行所有测试\n */\nexport function runAllTests() {\n\tconsole.log(\"🚀 Starting Emoji Commit Parsing Tests\\n\");\n\tconsole.log(\"=\".repeat(50));\n\n\tconst results = {\n\t\temojiParsing: testEmojiCommitParsing(),\n\t\tinvalidMessages: testInvalidCommitMessages(),\n\t\tbreakingChanges: testBreakingChanges(),\n\t\tprReferences: testPullRequestReferences(),\n\t\tsupportedFormats: testSupportedFormats(),\n\t};\n\n\tconsole.log(\"=\".repeat(50));\n\tconsole.log(\"📊 Test Results Summary:\");\n\tconsole.log(`✅ Emoji parsing: ${results.emojiParsing}/7 tests passed`);\n\tconsole.log(`✅ Invalid messages: ${results.invalidMessages}/3 tests passed`);\n\tconsole.log(`✅ Breaking changes: ${results.breakingChanges}/1 tests passed`);\n\tconsole.log(`✅ PR references: ${results.prReferences}/1 tests passed`);\n\tconsole.log(`✅ Supported formats: ${results.supportedFormats}/4 tests passed`);\n\n\tconst totalPassed = Object.values(results).reduce((sum, count) => sum + count, 0);\n\tconst totalTests = 16;\n\n\tconsole.log(\n\t\t`\\n🎯 Overall: ${totalPassed}/${totalTests} tests passed (${Math.round((totalPassed / totalTests) * 100)}%)`,\n\t);\n\n\tif (totalPassed === totalTests) {\n\t\tconsole.log(\"🎉 All tests passed! Emoji commit parsing is working correctly.\");\n\t} else {\n\t\tconsole.log(\"⚠️  Some tests failed. Please check the implementation.\");\n\t}\n\n\treturn totalPassed === totalTests;\n}\n"],"mappings":"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","names":[]}