xtrm-tools 2.3.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/README.md +132 -111
  2. package/cli/dist/index.cjs +142 -53
  3. package/cli/dist/index.cjs.map +1 -1
  4. package/cli/package.json +1 -1
  5. package/config/pi/extensions/beads.ts +24 -0
  6. package/hooks/beads-gate-core.mjs +6 -4
  7. package/hooks/beads-memory-gate.mjs +12 -5
  8. package/hooks/hooks.json +126 -0
  9. package/package.json +3 -1
  10. package/skills/test-planning/SKILL.md +208 -0
  11. package/skills/test-planning/evals/evals.json +23 -0
  12. package/skills/using-xtrm/SKILL.md +5 -27
  13. package/project-skills/tdd-guard/.claude/hooks/tdd-guard-pretool-bridge.cjs +0 -103
  14. package/project-skills/tdd-guard/.claude/settings.json +0 -38
  15. package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +0 -79
  16. package/project-skills/tdd-guard/CLAUDE.md +0 -98
  17. package/project-skills/tdd-guard/CONTRIBUTING.md +0 -38
  18. package/project-skills/tdd-guard/DEVELOPMENT.md +0 -127
  19. package/project-skills/tdd-guard/LICENSE +0 -21
  20. package/project-skills/tdd-guard/README.md +0 -398
  21. package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +0 -52
  22. package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +0 -56
  23. package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +0 -56
  24. package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +0 -64
  25. package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +0 -55
  26. package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +0 -93
  27. package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +0 -83
  28. package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +0 -182
  29. package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
  30. package/project-skills/tdd-guard/docs/config-migration.md +0 -143
  31. package/project-skills/tdd-guard/docs/configuration.md +0 -137
  32. package/project-skills/tdd-guard/docs/custom-instructions.md +0 -43
  33. package/project-skills/tdd-guard/docs/enforcement.md +0 -46
  34. package/project-skills/tdd-guard/docs/ignore-patterns.md +0 -81
  35. package/project-skills/tdd-guard/docs/linting.md +0 -109
  36. package/project-skills/tdd-guard/docs/quick-commands.md +0 -52
  37. package/project-skills/tdd-guard/docs/session-management.md +0 -75
  38. package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +0 -120
  39. package/project-skills/tdd-guard/docs/validation-model.md +0 -63
  40. package/project-skills/tdd-guard/eslint.config.mjs +0 -140
  41. package/project-skills/tdd-guard/package-lock.json +0 -16937
  42. package/project-skills/tdd-guard/package.json +0 -102
  43. package/project-skills/tdd-guard/reporters/go/README.md +0 -67
  44. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +0 -127
  45. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +0 -280
  46. package/project-skills/tdd-guard/reporters/go/go.mod +0 -3
  47. package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
  48. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +0 -126
  49. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +0 -264
  50. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +0 -26
  51. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +0 -37
  52. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +0 -94
  53. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +0 -198
  54. package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +0 -245
  55. package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +0 -547
  56. package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +0 -35
  57. package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +0 -113
  58. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +0 -103
  59. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +0 -303
  60. package/project-skills/tdd-guard/reporters/jest/README.md +0 -102
  61. package/project-skills/tdd-guard/reporters/jest/package.json +0 -38
  62. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test-data.ts +0 -199
  63. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test.ts +0 -302
  64. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.ts +0 -201
  65. package/project-skills/tdd-guard/reporters/jest/src/index.ts +0 -4
  66. package/project-skills/tdd-guard/reporters/jest/src/types.ts +0 -42
  67. package/project-skills/tdd-guard/reporters/jest/tsconfig.json +0 -11
  68. package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +0 -28
  69. package/project-skills/tdd-guard/reporters/phpunit/README.md +0 -97
  70. package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +0 -29
  71. package/project-skills/tdd-guard/reporters/phpunit/composer.json +0 -55
  72. package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +0 -19
  73. package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +0 -44
  74. package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +0 -28
  75. package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +0 -28
  76. package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +0 -28
  77. package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +0 -27
  78. package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +0 -28
  79. package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +0 -24
  80. package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +0 -88
  81. package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +0 -26
  82. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +0 -33
  83. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +0 -158
  84. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +0 -35
  85. package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +0 -105
  86. package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +0 -74
  87. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +0 -241
  88. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +0 -84
  89. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +0 -71
  90. package/project-skills/tdd-guard/reporters/pytest/README.md +0 -77
  91. package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +0 -43
  92. package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +0 -7
  93. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +0 -1
  94. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +0 -134
  95. package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +0 -1
  96. package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +0 -3
  97. package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +0 -293
  98. package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +0 -38
  99. package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +0 -59
  100. package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +0 -32
  101. package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +0 -296
  102. package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +0 -137
  103. package/project-skills/tdd-guard/reporters/rspec/Gemfile +0 -3
  104. package/project-skills/tdd-guard/reporters/rust/Cargo.lock +0 -458
  105. package/project-skills/tdd-guard/reporters/rust/Cargo.toml +0 -33
  106. package/project-skills/tdd-guard/reporters/rust/Makefile.example +0 -95
  107. package/project-skills/tdd-guard/reporters/rust/README.md +0 -88
  108. package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +0 -309
  109. package/project-skills/tdd-guard/reporters/rust/src/main.rs +0 -464
  110. package/project-skills/tdd-guard/reporters/rust/src/parser.rs +0 -225
  111. package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +0 -409
  112. package/project-skills/tdd-guard/reporters/storybook/README.md +0 -108
  113. package/project-skills/tdd-guard/reporters/storybook/package-lock.json +0 -9482
  114. package/project-skills/tdd-guard/reporters/storybook/package.json +0 -43
  115. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +0 -22
  116. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +0 -190
  117. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +0 -88
  118. package/project-skills/tdd-guard/reporters/storybook/src/index.ts +0 -12
  119. package/project-skills/tdd-guard/reporters/storybook/src/types.ts +0 -37
  120. package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +0 -11
  121. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +0 -3
  122. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +0 -13
  123. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +0 -3
  124. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +0 -17
  125. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +0 -3
  126. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +0 -13
  127. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +0 -5
  128. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +0 -8
  129. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +0 -5
  130. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +0 -11
  131. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +0 -14
  132. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +0 -11
  133. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +0 -3
  134. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +0 -6
  135. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +0 -3
  136. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +0 -7
  137. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +0 -4
  138. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +0 -14
  139. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +0 -7
  140. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +0 -4
  141. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +0 -13
  142. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +0 -7
  143. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +0 -4
  144. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +0 -14
  145. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +0 -4
  146. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +0 -15
  147. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +0 -14
  148. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +0 -15
  149. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +0 -7
  150. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +0 -9
  151. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +0 -7
  152. package/project-skills/tdd-guard/reporters/test/factories/go.ts +0 -59
  153. package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +0 -48
  154. package/project-skills/tdd-guard/reporters/test/factories/index.ts +0 -7
  155. package/project-skills/tdd-guard/reporters/test/factories/jest.ts +0 -51
  156. package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +0 -63
  157. package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +0 -41
  158. package/project-skills/tdd-guard/reporters/test/factories/rust.ts +0 -158
  159. package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +0 -198
  160. package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +0 -51
  161. package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +0 -735
  162. package/project-skills/tdd-guard/reporters/test/types.ts +0 -28
  163. package/project-skills/tdd-guard/reporters/vitest/README.md +0 -64
  164. package/project-skills/tdd-guard/reporters/vitest/package.json +0 -35
  165. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test-data.ts +0 -85
  166. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test.ts +0 -446
  167. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.ts +0 -110
  168. package/project-skills/tdd-guard/reporters/vitest/src/index.ts +0 -4
  169. package/project-skills/tdd-guard/reporters/vitest/src/types.ts +0 -39
  170. package/project-skills/tdd-guard/reporters/vitest/tsconfig.json +0 -11
  171. package/project-skills/tdd-guard/src/cli/buildContext.test.ts +0 -200
  172. package/project-skills/tdd-guard/src/cli/buildContext.ts +0 -48
  173. package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +0 -159
  174. package/project-skills/tdd-guard/src/cli/tdd-guard.ts +0 -48
  175. package/project-skills/tdd-guard/src/config/Config.test.ts +0 -538
  176. package/project-skills/tdd-guard/src/config/Config.ts +0 -172
  177. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +0 -58
  178. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +0 -8
  179. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +0 -347
  180. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +0 -61
  181. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +0 -24
  182. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +0 -7
  183. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +0 -377
  184. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +0 -75
  185. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +0 -563
  186. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +0 -140
  187. package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +0 -1
  188. package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +0 -12
  189. package/project-skills/tdd-guard/src/contracts/types/Context.ts +0 -16
  190. package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +0 -3
  191. package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +0 -6
  192. package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +0 -336
  193. package/project-skills/tdd-guard/src/guard/GuardManager.ts +0 -83
  194. package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +0 -107
  195. package/project-skills/tdd-guard/src/hooks/HookEvents.ts +0 -39
  196. package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +0 -16
  197. package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +0 -327
  198. package/project-skills/tdd-guard/src/hooks/postToolLint.ts +0 -165
  199. package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +0 -465
  200. package/project-skills/tdd-guard/src/hooks/processHookData.ts +0 -203
  201. package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +0 -136
  202. package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +0 -31
  203. package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +0 -131
  204. package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +0 -55
  205. package/project-skills/tdd-guard/src/index.ts +0 -19
  206. package/project-skills/tdd-guard/src/linters/Linter.ts +0 -5
  207. package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +0 -183
  208. package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +0 -82
  209. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +0 -170
  210. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +0 -148
  211. package/project-skills/tdd-guard/src/processors/index.ts +0 -1
  212. package/project-skills/tdd-guard/src/processors/lintProcessor.ts +0 -77
  213. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +0 -303
  214. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +0 -255
  215. package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +0 -43
  216. package/project-skills/tdd-guard/src/providers/LinterProvider.ts +0 -20
  217. package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +0 -68
  218. package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +0 -22
  219. package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +0 -76
  220. package/project-skills/tdd-guard/src/storage/FileStorage.ts +0 -108
  221. package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +0 -57
  222. package/project-skills/tdd-guard/src/storage/Storage.test.ts +0 -227
  223. package/project-skills/tdd-guard/src/storage/Storage.ts +0 -17
  224. package/project-skills/tdd-guard/src/validation/context/context.test.ts +0 -364
  225. package/project-skills/tdd-guard/src/validation/context/context.ts +0 -155
  226. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +0 -171
  227. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +0 -49
  228. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +0 -167
  229. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +0 -54
  230. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +0 -239
  231. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +0 -57
  232. package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +0 -52
  233. package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +0 -58
  234. package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +0 -54
  235. package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +0 -54
  236. package/project-skills/tdd-guard/src/validation/prompts/response.ts +0 -40
  237. package/project-skills/tdd-guard/src/validation/prompts/rules.ts +0 -51
  238. package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +0 -10
  239. package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +0 -15
  240. package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +0 -14
  241. package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +0 -9
  242. package/project-skills/tdd-guard/src/validation/validator.test.ts +0 -268
  243. package/project-skills/tdd-guard/src/validation/validator.ts +0 -159
  244. package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +0 -6
  245. package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +0 -12
  246. package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +0 -3
  247. package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +0 -7
  248. package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +0 -3
  249. package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +0 -20
  250. package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +0 -12
  251. package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +0 -10
  252. package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +0 -26
  253. package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +0 -46
  254. package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +0 -68
  255. package/project-skills/tdd-guard/test/integration/test-context.test.ts +0 -66
  256. package/project-skills/tdd-guard/test/integration/validator.core.test.ts +0 -96
  257. package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +0 -497
  258. package/project-skills/tdd-guard/test/utils/assertions.ts +0 -29
  259. package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +0 -30
  260. package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +0 -82
  261. package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +0 -46
  262. package/project-skills/tdd-guard/test/utils/factories/helpers.ts +0 -46
  263. package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +0 -352
  264. package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +0 -21
  265. package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +0 -79
  266. package/project-skills/tdd-guard/test/utils/factories/operations.ts +0 -57
  267. package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +0 -55
  268. package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +0 -22
  269. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +0 -745
  270. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +0 -767
  271. package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +0 -77
  272. package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +0 -15
  273. package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +0 -36
  274. package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +0 -90
  275. package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +0 -234
  276. package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +0 -99
  277. package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +0 -39
  278. package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +0 -70
  279. package/project-skills/tdd-guard/test/utils/index.ts +0 -131
  280. package/project-skills/tdd-guard/tsconfig.build.json +0 -16
  281. package/project-skills/tdd-guard/tsconfig.eslint.json +0 -17
  282. package/project-skills/tdd-guard/tsconfig.json +0 -32
  283. package/project-skills/tdd-guard/tsconfig.node.json +0 -10
  284. package/project-skills/tdd-guard/vitest.config.ts +0 -85
@@ -1,464 +0,0 @@
1
- // src/main.rs - Simplified main module with unified execution paths
2
-
3
- use clap::Parser;
4
- use std::fs;
5
- use std::io::{self, BufRead, BufReader, IsTerminal, Write};
6
- use std::path::{Path, PathBuf};
7
- use std::process::{Child, Command, Stdio};
8
-
9
- mod error_parser;
10
- mod parser;
11
- mod transformer;
12
-
13
- use error_parser::parse_error_buffer;
14
- use parser::TestEvent;
15
- use transformer::{transform_events, TddGuardOutput};
16
-
17
- #[derive(Parser, Debug)]
18
- #[command(name = "tdd-guard-rust")]
19
- #[command(about = "Rust test reporter for TDD Guard validation")]
20
- #[command(version = "0.1.0")]
21
- #[command(
22
- long_about = "A test reporter that captures Rust test results for TDD Guard validation. \
23
- Supports both cargo test and cargo nextest with optional JSON output for detailed reporting."
24
- )]
25
- struct Args {
26
- /// Absolute path to project root directory
27
- #[arg(long, value_name = "PATH")]
28
- project_root: String,
29
-
30
- /// Pass through mode - read from stdin instead of running tests
31
- #[arg(long, default_value_t = false)]
32
- passthrough: bool,
33
-
34
- /// Disable implicit passthrough when stdin is piped (auto on by default)
35
- #[arg(long, default_value_t = false)]
36
- no_auto_passthrough: bool,
37
-
38
- /// Test runner to use (nextest, cargo, auto)
39
- #[arg(long, default_value = "auto")]
40
- runner: String,
41
-
42
- /// Pass remaining args to test runner
43
- #[arg(trailing_var_arg = true)]
44
- test_args: Vec<String>,
45
- }
46
-
47
- fn main() -> io::Result<()> {
48
- let args = Args::parse();
49
-
50
- let project_root = PathBuf::from(&args.project_root);
51
- if !project_root.is_absolute() {
52
- eprintln!("Error: project-root must be an absolute path");
53
- std::process::exit(1);
54
- }
55
-
56
- if !project_root.exists() {
57
- eprintln!(
58
- "Error: project-root does not exist: {}",
59
- project_root.display()
60
- );
61
- std::process::exit(1);
62
- }
63
-
64
- let auto_enabled = !args.no_auto_passthrough && env_auto_enabled();
65
- let use_pass = should_passthrough(args.passthrough, auto_enabled);
66
-
67
- let exit_code = if use_pass {
68
- process_passthrough(&project_root)?
69
- } else {
70
- run_and_process(&args, &project_root)?
71
- };
72
-
73
- std::process::exit(exit_code);
74
- }
75
-
76
- /// Unified function to run tests and process output
77
- fn run_and_process(args: &Args, project_root: &Path) -> io::Result<i32> {
78
- let runner = detect_runner(&args.runner);
79
-
80
- let mut cmd = build_test_command(&runner, &args.test_args);
81
-
82
- // Execute and collect output
83
- let mut child = cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).spawn()?;
84
-
85
- let (test_lines, stderr_lines) = read_output(&mut child, false)?;
86
-
87
- process_output(&test_lines, &stderr_lines, project_root)?;
88
-
89
- let status = child.wait()?;
90
- Ok(status.code().unwrap_or(1))
91
- }
92
-
93
- /// Build test command based on runner type
94
- fn build_test_command(runner: &str, test_args: &[String]) -> Command {
95
- let mut cmd = Command::new("cargo");
96
-
97
- match runner {
98
- "nextest" => {
99
- cmd.arg("nextest").arg("run");
100
- cmd.env("NEXTEST_EXPERIMENTAL_LIBTEST_JSON", "1");
101
- cmd.arg("--message-format").arg("libtest-json");
102
- cmd.arg("--no-fail-fast");
103
- }
104
- _ => {
105
- cmd.arg("test");
106
- cmd.arg("--no-fail-fast");
107
-
108
- // Add test arguments
109
- for arg in test_args {
110
- cmd.arg(arg);
111
- }
112
-
113
- // Add JSON output flags (best effort - may require nightly)
114
- cmd.arg("--");
115
- cmd.arg("-Z").arg("unstable-options");
116
- cmd.arg("--format").arg("json");
117
- cmd.arg("--show-output");
118
-
119
- // Return here to avoid adding test_args twice
120
- return cmd;
121
- }
122
- }
123
-
124
- // Add test arguments for nextest
125
- for arg in test_args {
126
- cmd.arg(arg);
127
- }
128
-
129
- cmd
130
- }
131
-
132
- /// Process passthrough mode - read from stdin and echo
133
- fn process_passthrough(project_root: &Path) -> io::Result<i32> {
134
- let stdin = io::stdin();
135
- let reader = stdin.lock();
136
-
137
- let mut all_lines = Vec::new();
138
- for line in reader.lines() {
139
- let line = line?;
140
- println!("{}", line);
141
- io::stdout().flush()?;
142
- all_lines.push(line);
143
- }
144
-
145
- // Separate JSON and non-JSON lines
146
- let (json_lines, other_lines): (Vec<_>, Vec<_>) = all_lines
147
- .into_iter()
148
- .partition(|line| line.trim().starts_with('{') && line.contains("\"type\":"));
149
-
150
- process_output(&json_lines, &other_lines, project_root)?;
151
- Ok(0)
152
- }
153
-
154
- /// Read output from child process, optionally echoing to stdout/stderr
155
- fn read_output(child: &mut Child, echo: bool) -> io::Result<(Vec<String>, Vec<String>)> {
156
- let stdout = child.stdout.take().expect("Failed to capture stdout");
157
- let stderr = child.stderr.take().expect("Failed to capture stderr");
158
-
159
- let mut test_lines = Vec::new();
160
- let mut stderr_lines = Vec::new();
161
-
162
- for line in BufReader::new(stdout).lines() {
163
- let line = line?;
164
- if echo {
165
- println!("{}", line);
166
- io::stdout().flush()?;
167
- }
168
- test_lines.push(line);
169
- }
170
-
171
- for line in BufReader::new(stderr).lines() {
172
- let line = line?;
173
- if echo {
174
- eprintln!("{}", line);
175
- }
176
- stderr_lines.push(line);
177
- }
178
-
179
- if !echo {
180
- for line in &test_lines {
181
- println!("{}", line);
182
- }
183
- for line in &stderr_lines {
184
- eprintln!("{}", line);
185
- }
186
- io::stdout().flush()?;
187
- }
188
-
189
- Ok((test_lines, stderr_lines))
190
- }
191
-
192
- /// Process test output and save results
193
- fn process_output(
194
- test_lines: &[String],
195
- stderr_lines: &[String],
196
- project_root: &Path,
197
- ) -> io::Result<()> {
198
- // Parse JSON events
199
- let mut events = Vec::new();
200
- for line in test_lines {
201
- if let Ok(event) = serde_json::from_str::<TestEvent>(line) {
202
- events.push(event);
203
- }
204
- }
205
-
206
- let mut compilation_errors = parse_error_buffer(stderr_lines);
207
-
208
- // If no JSON events found, also check test output for errors
209
- if events.is_empty() && !test_lines.is_empty() {
210
- let test_errors = parse_error_buffer(test_lines);
211
- compilation_errors.extend(test_errors);
212
- }
213
-
214
- // Transform to TDD Guard format
215
- let output = transform_events(events, compilation_errors);
216
-
217
- save_results(project_root, &output)?;
218
-
219
- Ok(())
220
- }
221
-
222
- /// Save test results to TDD Guard format
223
- fn save_results(project_root: &Path, output: &TddGuardOutput) -> io::Result<()> {
224
- let output_dir = project_root.join(".claude").join("tdd-guard").join("data");
225
- fs::create_dir_all(&output_dir)?;
226
-
227
- let output_file = output_dir.join("test.json");
228
- let temp_file = output_dir.join("test.json.tmp");
229
-
230
- let json = serde_json::to_string_pretty(output)?;
231
- fs::write(&temp_file, json)?;
232
- fs::rename(&temp_file, &output_file)?;
233
-
234
- Ok(())
235
- }
236
-
237
- /// Detect which test runner to use
238
- fn detect_runner(preference: &str) -> String {
239
- match preference {
240
- "nextest" => "nextest".to_string(),
241
- "cargo" => "cargo".to_string(),
242
- "auto" => {
243
- // Check if nextest is available (cache this in real impl)
244
- if Command::new("cargo")
245
- .args(&["nextest", "--version"])
246
- .output()
247
- .map(|output| output.status.success())
248
- .unwrap_or(false)
249
- {
250
- "nextest".to_string()
251
- } else {
252
- "cargo".to_string()
253
- }
254
- }
255
- _ => "cargo".to_string(),
256
- }
257
- }
258
-
259
- fn env_auto_enabled() -> bool {
260
- match std::env::var("TDD_GUARD_AUTO_PASSTHROUGH") {
261
- Ok(val) => {
262
- let v = val.trim().to_ascii_lowercase();
263
- !(v == "0" || v == "false" || v == "no" || v == "off")
264
- }
265
- Err(_) => true,
266
- }
267
- }
268
-
269
- fn decide_passthrough(explicit: bool, auto_enabled: bool, stdin_is_terminal: bool) -> bool {
270
- if explicit {
271
- return true;
272
- }
273
- if auto_enabled {
274
- return !stdin_is_terminal;
275
- }
276
- false
277
- }
278
-
279
- fn should_passthrough(explicit: bool, auto_enabled: bool) -> bool {
280
- let stdin_is_terminal = io::stdin().is_terminal();
281
- decide_passthrough(explicit, auto_enabled, stdin_is_terminal)
282
- }
283
-
284
- #[cfg(test)]
285
- mod tests {
286
- use super::*;
287
- use tempfile::TempDir;
288
-
289
- #[test]
290
- fn test_save_results() {
291
- let temp_dir = TempDir::new().unwrap();
292
- let project_root = temp_dir.path();
293
-
294
- let output = TddGuardOutput {
295
- test_modules: vec![],
296
- reason: Some("passed".to_string()),
297
- };
298
-
299
- save_results(project_root, &output).unwrap();
300
-
301
- let expected_file = project_root
302
- .join(".claude")
303
- .join("tdd-guard")
304
- .join("data")
305
- .join("test.json");
306
-
307
- assert!(expected_file.exists());
308
-
309
- let content = fs::read_to_string(expected_file).unwrap();
310
- let parsed: serde_json::Value = serde_json::from_str(&content).unwrap();
311
-
312
- assert_eq!(parsed["reason"], "passed");
313
- }
314
-
315
- #[test]
316
- fn test_env_auto_enabled() {
317
- use std::env;
318
- let key = "TDD_GUARD_AUTO_PASSTHROUGH";
319
-
320
- // Unset -> true
321
- env::remove_var(key);
322
- assert!(super::env_auto_enabled());
323
-
324
- env::set_var(key, "0");
325
- assert!(!super::env_auto_enabled());
326
- env::set_var(key, "false");
327
- assert!(!super::env_auto_enabled());
328
- env::set_var(key, "no");
329
- assert!(!super::env_auto_enabled());
330
- env::set_var(key, "off");
331
- assert!(!super::env_auto_enabled());
332
-
333
- env::set_var(key, "1");
334
- assert!(super::env_auto_enabled());
335
- env::set_var(key, "true");
336
- assert!(super::env_auto_enabled());
337
- env::set_var(key, "yes");
338
- assert!(super::env_auto_enabled());
339
- env::set_var(key, "on");
340
- assert!(super::env_auto_enabled());
341
-
342
- env::remove_var(key);
343
- }
344
-
345
- #[test]
346
- fn test_decide_passthrough_matrix() {
347
- // explicit always wins
348
- assert!(super::decide_passthrough(true, true, true));
349
- assert!(super::decide_passthrough(true, true, false));
350
- assert!(super::decide_passthrough(true, false, true));
351
- assert!(super::decide_passthrough(true, false, false));
352
-
353
- // auto disabled: never passthrough unless explicit
354
- assert!(!super::decide_passthrough(false, false, true));
355
- assert!(!super::decide_passthrough(false, false, false));
356
-
357
- // auto enabled: passthrough when stdin is not a terminal
358
- assert!(!super::decide_passthrough(false, true, true));
359
- assert!(super::decide_passthrough(false, true, false));
360
- }
361
-
362
- #[test]
363
- fn test_detect_runner() {
364
- assert_eq!(detect_runner("nextest"), "nextest");
365
- assert_eq!(detect_runner("cargo"), "cargo");
366
- assert_eq!(detect_runner("invalid"), "cargo");
367
- }
368
-
369
- #[test]
370
- fn test_process_empty_output() {
371
- let temp_dir = TempDir::new().unwrap();
372
- let project_root = temp_dir.path();
373
-
374
- process_output(&[], &[], project_root).unwrap();
375
-
376
- let expected_file = project_root
377
- .join(".claude")
378
- .join("tdd-guard")
379
- .join("data")
380
- .join("test.json");
381
-
382
- assert!(expected_file.exists());
383
- }
384
-
385
- #[test]
386
- fn test_process_output_merges_stderr_compilation_errors_when_no_json() {
387
- use tempfile::TempDir;
388
- let temp_dir = TempDir::new().unwrap();
389
- let project_root = temp_dir.path();
390
-
391
- // No JSON events, only stderr with a compilation error
392
- let test_lines: Vec<String> = vec![
393
- // stdout
394
- "running 0 tests".to_string(),
395
- ];
396
- let stderr_lines: Vec<String> = vec![
397
- // stderr from rustc
398
- "error[E0425]: cannot find value `x` in this scope".to_string(),
399
- " --> src/lib.rs:2:9".to_string(),
400
- ];
401
-
402
- super::process_output(&test_lines, &stderr_lines, project_root).unwrap();
403
-
404
- // Verify output file exists and contains a compilation module failed
405
- let out = project_root
406
- .join(".claude")
407
- .join("tdd-guard")
408
- .join("data")
409
- .join("test.json");
410
- let content = std::fs::read_to_string(out).unwrap();
411
- let v: serde_json::Value = serde_json::from_str(&content).unwrap();
412
- assert_eq!(v["reason"], "failed");
413
- assert!(v["testModules"]
414
- .as_array()
415
- .unwrap()
416
- .iter()
417
- .any(|m| m["moduleId"] == "compilation"));
418
- }
419
-
420
- #[test]
421
- fn test_process_passthrough_partitions_json_and_non_json() {
422
- use crate::parser::TestEvent;
423
- use tempfile::TempDir;
424
-
425
- let temp_dir = TempDir::new().unwrap();
426
- let project_root = temp_dir.path();
427
-
428
- // Simulate passthrough partition logic by calling process_output directly with mixed lines.
429
- // JSON-like lines need a "type" key to be parsed as events.
430
- let json_test_event = serde_json::to_string(&TestEvent::Test {
431
- name: "crate::tests::adds$works".to_string(),
432
- event: "failed".to_string(),
433
- stdout: Some("assertion `left == right` failed\n left: 1\n right: 2".to_string()),
434
- stderr: None,
435
- })
436
- .unwrap();
437
-
438
- let non_json_error = vec![
439
- "error[E0599]: no method named `foo` found for type `u8`".to_string(),
440
- " --> src/main.rs:10:5".to_string(),
441
- ];
442
-
443
- let test_lines = vec![json_test_event]; // stdin JSON goes here
444
- let stderr_lines = non_json_error; // other lines treated as stderr here
445
-
446
- super::process_output(&test_lines, &stderr_lines, project_root).unwrap();
447
-
448
- let out = project_root
449
- .join(".claude")
450
- .join("tdd-guard")
451
- .join("data")
452
- .join("test.json");
453
- let content = std::fs::read_to_string(out).unwrap();
454
- let v: serde_json::Value = serde_json::from_str(&content).unwrap();
455
-
456
- // Expect both a normal module (crate) and compilation module
457
- assert_eq!(v["reason"], "failed");
458
- let modules = v["testModules"].as_array().unwrap();
459
- assert!(modules
460
- .iter()
461
- .any(|m| m["moduleId"].as_str().unwrap().contains("crate")));
462
- assert!(modules.iter().any(|m| m["moduleId"] == "compilation"));
463
- }
464
- }
@@ -1,225 +0,0 @@
1
- // src/parser.rs - Simplified parser for test events
2
-
3
- use serde::{Deserialize, Serialize};
4
- use serde_json::Value;
5
-
6
- /// Test event from cargo test/nextest JSON output
7
- #[derive(Debug, Clone, Deserialize, Serialize)]
8
- #[serde(tag = "type", rename_all = "lowercase")]
9
- pub enum TestEvent {
10
- Suite {
11
- event: String,
12
- #[serde(default)]
13
- passed: u32,
14
- #[serde(default)]
15
- failed: u32,
16
- #[serde(default)]
17
- ignored: u32,
18
- },
19
- Test {
20
- name: String,
21
- event: String,
22
- #[serde(default)]
23
- stdout: Option<String>,
24
- #[serde(default)]
25
- stderr: Option<String>,
26
- },
27
- #[serde(untagged)]
28
- Other(Value),
29
- }
30
-
31
- impl TestEvent {
32
- /// Get error message from stdout/stderr
33
- pub fn error_message(&self) -> Option<String> {
34
- match self {
35
- TestEvent::Test { stdout, stderr, .. } => {
36
- let mut msg = String::new();
37
-
38
- if let Some(out) = stdout {
39
- msg.push_str(out.trim());
40
- }
41
-
42
- if let Some(err) = stderr {
43
- if !msg.is_empty() {
44
- msg.push('\n');
45
- }
46
- msg.push_str(err.trim());
47
- }
48
-
49
- if msg.is_empty() {
50
- None
51
- } else {
52
- Some(msg)
53
- }
54
- }
55
- _ => None,
56
- }
57
- }
58
-
59
- /// Extract module name from test path
60
- pub fn module_name(&self) -> String {
61
- match self {
62
- TestEvent::Test { name, .. } => extract_module(name),
63
- _ => "tests".to_string(),
64
- }
65
- }
66
-
67
- /// Extract simple test name
68
- pub fn simple_test_name(&self) -> String {
69
- match self {
70
- TestEvent::Test { name, .. } => extract_test_name(name),
71
- _ => String::new(),
72
- }
73
- }
74
- }
75
-
76
- /// Extract module from test path
77
- fn extract_module(path: &str) -> String {
78
- // Handle doc tests: "src/lib.rs - function (line X)"
79
- if path.contains(" - ") && path.contains(" (line ") {
80
- return "doctests".to_string();
81
- }
82
-
83
- // Handle integration tests: "tests/integration.rs: test_name"
84
- if path.starts_with("tests/") && path.contains(':') {
85
- if let Some(file) = path.split(':').next() {
86
- return file.trim_end_matches(".rs").replace('/', "::");
87
- }
88
- }
89
-
90
- // Handle nextest format with $
91
- if let Some(pos) = path.find('$') {
92
- let module = &path[..pos];
93
- // Remove duplicate crate name if present
94
- if let Some(colon_pos) = module.rfind("::") {
95
- let prefix = &module[..colon_pos];
96
- let suffix = &module[colon_pos + 2..];
97
- if prefix == suffix {
98
- return prefix.to_string();
99
- }
100
- }
101
- return module.to_string();
102
- }
103
-
104
- // Standard format: extract first component
105
- if let Some(pos) = path.find("::") {
106
- return path[..pos].to_string();
107
- }
108
-
109
- "tests".to_string()
110
- }
111
-
112
- /// Extract test name from path
113
- fn extract_test_name(path: &str) -> String {
114
- // Handle doc tests
115
- if path.contains(" - ") && path.contains(" (line ") {
116
- if let Some(start) = path.find(" - ") {
117
- let after = &path[start + 3..];
118
- if let Some(end) = after.find(" (line ") {
119
- return after[..end].to_string();
120
- }
121
- }
122
- }
123
-
124
- // Handle integration tests
125
- if path.starts_with("tests/") && path.contains(": ") {
126
- if let Some(pos) = path.find(": ") {
127
- return path[pos + 2..].to_string();
128
- }
129
- }
130
-
131
- // Handle nextest format
132
- if let Some(pos) = path.find('$') {
133
- return path[pos + 1..].to_string();
134
- }
135
-
136
- // Standard format: last component
137
- if let Some(pos) = path.rfind("::") {
138
- return path[pos + 2..].to_string();
139
- }
140
-
141
- path.to_string()
142
- }
143
-
144
- #[cfg(test)]
145
- mod tests {
146
- use super::*;
147
-
148
- #[test]
149
- fn test_extract_module() {
150
- assert_eq!(extract_module("src/lib.rs - add (line 7)"), "doctests");
151
- assert_eq!(
152
- extract_module("tests/integration: test_basic"),
153
- "tests::integration"
154
- );
155
- assert_eq!(
156
- extract_module("my_crate::my_crate$tests::test_fn"),
157
- "my_crate"
158
- );
159
- assert_eq!(extract_module("my_crate::tests::test_fn"), "my_crate");
160
- }
161
-
162
- #[test]
163
- fn test_extract_test_name() {
164
- assert_eq!(
165
- extract_test_name("src/lib.rs - module::add (line 7)"),
166
- "module::add"
167
- );
168
- assert_eq!(
169
- extract_test_name("tests/integration: test_basic"),
170
- "test_basic"
171
- );
172
- assert_eq!(extract_test_name("crate$tests::test_fn"), "tests::test_fn");
173
- assert_eq!(extract_test_name("crate::tests::test_fn"), "test_fn");
174
- }
175
-
176
- #[test]
177
- fn test_error_message() {
178
- let event = TestEvent::Test {
179
- name: "test".to_string(),
180
- event: "failed".to_string(),
181
- stdout: Some("assertion failed".to_string()),
182
- stderr: Some("error details".to_string()),
183
- };
184
-
185
- let msg = event.error_message().unwrap();
186
- assert!(msg.contains("assertion failed"));
187
- assert!(msg.contains("error details"));
188
- }
189
-
190
- #[test]
191
- fn test_doctest_paths_module_and_name() {
192
- let e = TestEvent::Test {
193
- name: "src/lib.rs - my_mod::add (line 7)".to_string(),
194
- event: "ok".to_string(),
195
- stdout: None,
196
- stderr: None,
197
- };
198
- assert_eq!(e.module_name(), "doctests");
199
- assert_eq!(e.simple_test_name(), "my_mod::add");
200
- }
201
-
202
- #[test]
203
- fn test_integration_test_paths() {
204
- let e = TestEvent::Test {
205
- name: "tests/integration.rs: test_basic".to_string(),
206
- event: "ok".to_string(),
207
- stdout: None,
208
- stderr: None,
209
- };
210
- assert_eq!(e.module_name(), "tests::integration");
211
- assert_eq!(e.simple_test_name(), "test_basic");
212
- }
213
-
214
- #[test]
215
- fn test_nextest_dollar_format_and_duplicate_crate() {
216
- let e = TestEvent::Test {
217
- name: "my_crate::my_crate$tests::test_fn".to_string(),
218
- event: "ok".to_string(),
219
- stdout: None,
220
- stderr: None,
221
- };
222
- assert_eq!(e.module_name(), "my_crate");
223
- assert_eq!(e.simple_test_name(), "tests::test_fn");
224
- }
225
- }