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.
- package/README.md +132 -111
- package/cli/dist/index.cjs +142 -53
- package/cli/dist/index.cjs.map +1 -1
- package/cli/package.json +1 -1
- package/config/pi/extensions/beads.ts +24 -0
- package/hooks/beads-gate-core.mjs +6 -4
- package/hooks/beads-memory-gate.mjs +12 -5
- package/hooks/hooks.json +126 -0
- package/package.json +3 -1
- package/skills/test-planning/SKILL.md +208 -0
- package/skills/test-planning/evals/evals.json +23 -0
- package/skills/using-xtrm/SKILL.md +5 -27
- package/project-skills/tdd-guard/.claude/hooks/tdd-guard-pretool-bridge.cjs +0 -103
- package/project-skills/tdd-guard/.claude/settings.json +0 -38
- package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +0 -79
- package/project-skills/tdd-guard/CLAUDE.md +0 -98
- package/project-skills/tdd-guard/CONTRIBUTING.md +0 -38
- package/project-skills/tdd-guard/DEVELOPMENT.md +0 -127
- package/project-skills/tdd-guard/LICENSE +0 -21
- package/project-skills/tdd-guard/README.md +0 -398
- package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +0 -52
- package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +0 -56
- package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +0 -56
- package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +0 -64
- package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +0 -55
- package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +0 -93
- package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +0 -83
- package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +0 -182
- package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
- package/project-skills/tdd-guard/docs/config-migration.md +0 -143
- package/project-skills/tdd-guard/docs/configuration.md +0 -137
- package/project-skills/tdd-guard/docs/custom-instructions.md +0 -43
- package/project-skills/tdd-guard/docs/enforcement.md +0 -46
- package/project-skills/tdd-guard/docs/ignore-patterns.md +0 -81
- package/project-skills/tdd-guard/docs/linting.md +0 -109
- package/project-skills/tdd-guard/docs/quick-commands.md +0 -52
- package/project-skills/tdd-guard/docs/session-management.md +0 -75
- package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +0 -120
- package/project-skills/tdd-guard/docs/validation-model.md +0 -63
- package/project-skills/tdd-guard/eslint.config.mjs +0 -140
- package/project-skills/tdd-guard/package-lock.json +0 -16937
- package/project-skills/tdd-guard/package.json +0 -102
- package/project-skills/tdd-guard/reporters/go/README.md +0 -67
- package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +0 -127
- package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +0 -280
- package/project-skills/tdd-guard/reporters/go/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
- package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +0 -126
- package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +0 -264
- package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +0 -26
- package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +0 -37
- package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +0 -94
- package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +0 -198
- package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +0 -245
- package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +0 -547
- package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +0 -35
- package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +0 -113
- package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +0 -103
- package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +0 -303
- package/project-skills/tdd-guard/reporters/jest/README.md +0 -102
- package/project-skills/tdd-guard/reporters/jest/package.json +0 -38
- package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test-data.ts +0 -199
- package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test.ts +0 -302
- package/project-skills/tdd-guard/reporters/jest/src/JestReporter.ts +0 -201
- package/project-skills/tdd-guard/reporters/jest/src/index.ts +0 -4
- package/project-skills/tdd-guard/reporters/jest/src/types.ts +0 -42
- package/project-skills/tdd-guard/reporters/jest/tsconfig.json +0 -11
- package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/README.md +0 -97
- package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +0 -29
- package/project-skills/tdd-guard/reporters/phpunit/composer.json +0 -55
- package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +0 -19
- package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +0 -44
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +0 -27
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +0 -24
- package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +0 -88
- package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +0 -26
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +0 -33
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +0 -158
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +0 -35
- package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +0 -105
- package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +0 -74
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +0 -241
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +0 -84
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +0 -71
- package/project-skills/tdd-guard/reporters/pytest/README.md +0 -77
- package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +0 -43
- package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +0 -7
- package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +0 -1
- package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +0 -134
- package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +0 -1
- package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +0 -3
- package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +0 -293
- package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +0 -38
- package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +0 -59
- package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +0 -32
- package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +0 -296
- package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +0 -137
- package/project-skills/tdd-guard/reporters/rspec/Gemfile +0 -3
- package/project-skills/tdd-guard/reporters/rust/Cargo.lock +0 -458
- package/project-skills/tdd-guard/reporters/rust/Cargo.toml +0 -33
- package/project-skills/tdd-guard/reporters/rust/Makefile.example +0 -95
- package/project-skills/tdd-guard/reporters/rust/README.md +0 -88
- package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +0 -309
- package/project-skills/tdd-guard/reporters/rust/src/main.rs +0 -464
- package/project-skills/tdd-guard/reporters/rust/src/parser.rs +0 -225
- package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +0 -409
- package/project-skills/tdd-guard/reporters/storybook/README.md +0 -108
- package/project-skills/tdd-guard/reporters/storybook/package-lock.json +0 -9482
- package/project-skills/tdd-guard/reporters/storybook/package.json +0 -43
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +0 -22
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +0 -190
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +0 -88
- package/project-skills/tdd-guard/reporters/storybook/src/index.ts +0 -12
- package/project-skills/tdd-guard/reporters/storybook/src/types.ts +0 -37
- package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +0 -11
- package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +0 -13
- package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +0 -17
- package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +0 -13
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +0 -5
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +0 -8
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +0 -5
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +0 -11
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +0 -11
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +0 -6
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +0 -13
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +0 -15
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +0 -15
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +0 -9
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +0 -7
- package/project-skills/tdd-guard/reporters/test/factories/go.ts +0 -59
- package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +0 -48
- package/project-skills/tdd-guard/reporters/test/factories/index.ts +0 -7
- package/project-skills/tdd-guard/reporters/test/factories/jest.ts +0 -51
- package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +0 -63
- package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +0 -41
- package/project-skills/tdd-guard/reporters/test/factories/rust.ts +0 -158
- package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +0 -198
- package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +0 -51
- package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +0 -735
- package/project-skills/tdd-guard/reporters/test/types.ts +0 -28
- package/project-skills/tdd-guard/reporters/vitest/README.md +0 -64
- package/project-skills/tdd-guard/reporters/vitest/package.json +0 -35
- package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test-data.ts +0 -85
- package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test.ts +0 -446
- package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.ts +0 -110
- package/project-skills/tdd-guard/reporters/vitest/src/index.ts +0 -4
- package/project-skills/tdd-guard/reporters/vitest/src/types.ts +0 -39
- package/project-skills/tdd-guard/reporters/vitest/tsconfig.json +0 -11
- package/project-skills/tdd-guard/src/cli/buildContext.test.ts +0 -200
- package/project-skills/tdd-guard/src/cli/buildContext.ts +0 -48
- package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +0 -159
- package/project-skills/tdd-guard/src/cli/tdd-guard.ts +0 -48
- package/project-skills/tdd-guard/src/config/Config.test.ts +0 -538
- package/project-skills/tdd-guard/src/config/Config.ts +0 -172
- package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +0 -58
- package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +0 -8
- package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +0 -347
- package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +0 -61
- package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +0 -24
- package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +0 -7
- package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +0 -377
- package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +0 -75
- package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +0 -563
- package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +0 -140
- package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +0 -1
- package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +0 -12
- package/project-skills/tdd-guard/src/contracts/types/Context.ts +0 -16
- package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +0 -3
- package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +0 -6
- package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +0 -336
- package/project-skills/tdd-guard/src/guard/GuardManager.ts +0 -83
- package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +0 -107
- package/project-skills/tdd-guard/src/hooks/HookEvents.ts +0 -39
- package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +0 -16
- package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +0 -327
- package/project-skills/tdd-guard/src/hooks/postToolLint.ts +0 -165
- package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +0 -465
- package/project-skills/tdd-guard/src/hooks/processHookData.ts +0 -203
- package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +0 -136
- package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +0 -31
- package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +0 -131
- package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +0 -55
- package/project-skills/tdd-guard/src/index.ts +0 -19
- package/project-skills/tdd-guard/src/linters/Linter.ts +0 -5
- package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +0 -183
- package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +0 -82
- package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +0 -170
- package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +0 -148
- package/project-skills/tdd-guard/src/processors/index.ts +0 -1
- package/project-skills/tdd-guard/src/processors/lintProcessor.ts +0 -77
- package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +0 -303
- package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +0 -255
- package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +0 -43
- package/project-skills/tdd-guard/src/providers/LinterProvider.ts +0 -20
- package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +0 -68
- package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +0 -22
- package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +0 -76
- package/project-skills/tdd-guard/src/storage/FileStorage.ts +0 -108
- package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +0 -57
- package/project-skills/tdd-guard/src/storage/Storage.test.ts +0 -227
- package/project-skills/tdd-guard/src/storage/Storage.ts +0 -17
- package/project-skills/tdd-guard/src/validation/context/context.test.ts +0 -364
- package/project-skills/tdd-guard/src/validation/context/context.ts +0 -155
- package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +0 -171
- package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +0 -49
- package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +0 -167
- package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +0 -54
- package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +0 -239
- package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +0 -57
- package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +0 -52
- package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +0 -58
- package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +0 -54
- package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +0 -54
- package/project-skills/tdd-guard/src/validation/prompts/response.ts +0 -40
- package/project-skills/tdd-guard/src/validation/prompts/rules.ts +0 -51
- package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +0 -10
- package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +0 -15
- package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +0 -14
- package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +0 -9
- package/project-skills/tdd-guard/src/validation/validator.test.ts +0 -268
- package/project-skills/tdd-guard/src/validation/validator.ts +0 -159
- package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +0 -6
- package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +0 -12
- package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +0 -3
- package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +0 -7
- package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +0 -3
- package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +0 -20
- package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +0 -12
- package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +0 -10
- package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +0 -26
- package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +0 -46
- package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +0 -68
- package/project-skills/tdd-guard/test/integration/test-context.test.ts +0 -66
- package/project-skills/tdd-guard/test/integration/validator.core.test.ts +0 -96
- package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +0 -497
- package/project-skills/tdd-guard/test/utils/assertions.ts +0 -29
- package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +0 -30
- package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +0 -82
- package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +0 -46
- package/project-skills/tdd-guard/test/utils/factories/helpers.ts +0 -46
- package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +0 -352
- package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +0 -21
- package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +0 -79
- package/project-skills/tdd-guard/test/utils/factories/operations.ts +0 -57
- package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +0 -55
- package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +0 -22
- package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +0 -745
- package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +0 -767
- package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +0 -77
- package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +0 -15
- package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +0 -36
- package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +0 -90
- package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +0 -234
- package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +0 -99
- package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +0 -39
- package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +0 -70
- package/project-skills/tdd-guard/test/utils/index.ts +0 -131
- package/project-skills/tdd-guard/tsconfig.build.json +0 -16
- package/project-skills/tdd-guard/tsconfig.eslint.json +0 -17
- package/project-skills/tdd-guard/tsconfig.json +0 -32
- package/project-skills/tdd-guard/tsconfig.node.json +0 -10
- package/project-skills/tdd-guard/vitest.config.ts +0 -85
|
@@ -1,745 +0,0 @@
|
|
|
1
|
-
// Import existing types from contracts
|
|
2
|
-
import type { Todo } from '../../../../../src/contracts/schemas/toolSchemas'
|
|
3
|
-
|
|
4
|
-
const TEST_MODULE_ID = 'src/calculator/test_calculator.py'
|
|
5
|
-
const TEST_NAME = 'test_adds_two_numbers'
|
|
6
|
-
const TEST_FULL_NAME = 'test_calculator.py::test_adds_two_numbers'
|
|
7
|
-
|
|
8
|
-
// Test results for Python/pytest
|
|
9
|
-
export const testResults = {
|
|
10
|
-
notDefined: {
|
|
11
|
-
description: 'not defined error',
|
|
12
|
-
content: JSON.stringify(
|
|
13
|
-
{
|
|
14
|
-
testModules: [
|
|
15
|
-
{
|
|
16
|
-
moduleId: TEST_MODULE_ID,
|
|
17
|
-
tests: [
|
|
18
|
-
{
|
|
19
|
-
name: TEST_NAME,
|
|
20
|
-
fullName: TEST_FULL_NAME,
|
|
21
|
-
state: 'failed',
|
|
22
|
-
errors: [
|
|
23
|
-
{
|
|
24
|
-
message: "NameError: name 'Calculator' is not defined",
|
|
25
|
-
stack:
|
|
26
|
-
"test_calculator.py:3: in test_adds_two_numbers\n calculator = Calculator()\nE NameError: name 'Calculator' is not defined",
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
},
|
|
34
|
-
null,
|
|
35
|
-
2
|
|
36
|
-
),
|
|
37
|
-
},
|
|
38
|
-
notAConstructor: {
|
|
39
|
-
description: 'not a constructor error',
|
|
40
|
-
content: JSON.stringify(
|
|
41
|
-
{
|
|
42
|
-
testModules: [
|
|
43
|
-
{
|
|
44
|
-
moduleId: TEST_MODULE_ID,
|
|
45
|
-
tests: [
|
|
46
|
-
{
|
|
47
|
-
name: TEST_NAME,
|
|
48
|
-
fullName: TEST_FULL_NAME,
|
|
49
|
-
state: 'failed',
|
|
50
|
-
errors: [
|
|
51
|
-
{
|
|
52
|
-
message: "TypeError: 'module' object is not callable",
|
|
53
|
-
stack:
|
|
54
|
-
"test_calculator.py:4: in test_adds_two_numbers\n calculator = Calculator()\nE TypeError: 'module' object is not callable",
|
|
55
|
-
},
|
|
56
|
-
],
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
},
|
|
60
|
-
],
|
|
61
|
-
},
|
|
62
|
-
null,
|
|
63
|
-
2
|
|
64
|
-
),
|
|
65
|
-
},
|
|
66
|
-
notAFunction: {
|
|
67
|
-
description: 'not a function error',
|
|
68
|
-
content: JSON.stringify(
|
|
69
|
-
{
|
|
70
|
-
testModules: [
|
|
71
|
-
{
|
|
72
|
-
moduleId: TEST_MODULE_ID,
|
|
73
|
-
tests: [
|
|
74
|
-
{
|
|
75
|
-
name: TEST_NAME,
|
|
76
|
-
fullName: TEST_FULL_NAME,
|
|
77
|
-
state: 'failed',
|
|
78
|
-
errors: [
|
|
79
|
-
{
|
|
80
|
-
message: "TypeError: 'int' object is not callable",
|
|
81
|
-
stack:
|
|
82
|
-
"test_calculator.py:5: in test_adds_two_numbers\n result = calculator.add(2, 2)\nE TypeError: 'int' object is not callable",
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
},
|
|
88
|
-
],
|
|
89
|
-
},
|
|
90
|
-
null,
|
|
91
|
-
2
|
|
92
|
-
),
|
|
93
|
-
},
|
|
94
|
-
attributeError: {
|
|
95
|
-
description: 'attribute error',
|
|
96
|
-
content: JSON.stringify(
|
|
97
|
-
{
|
|
98
|
-
testModules: [
|
|
99
|
-
{
|
|
100
|
-
moduleId: TEST_MODULE_ID,
|
|
101
|
-
tests: [
|
|
102
|
-
{
|
|
103
|
-
name: TEST_NAME,
|
|
104
|
-
fullName: TEST_FULL_NAME,
|
|
105
|
-
state: 'failed',
|
|
106
|
-
errors: [
|
|
107
|
-
{
|
|
108
|
-
message:
|
|
109
|
-
"AttributeError: 'Calculator' object has no attribute 'add'",
|
|
110
|
-
stack:
|
|
111
|
-
"test_calculator.py:5: in test_adds_two_numbers\n result = calculator.add(2, 2)\nE AttributeError: 'Calculator' object has no attribute 'add'",
|
|
112
|
-
},
|
|
113
|
-
],
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
|
-
},
|
|
117
|
-
],
|
|
118
|
-
},
|
|
119
|
-
null,
|
|
120
|
-
2
|
|
121
|
-
),
|
|
122
|
-
},
|
|
123
|
-
assertionError: {
|
|
124
|
-
description: 'assertion failure',
|
|
125
|
-
content: JSON.stringify(
|
|
126
|
-
{
|
|
127
|
-
testModules: [
|
|
128
|
-
{
|
|
129
|
-
moduleId: TEST_MODULE_ID,
|
|
130
|
-
tests: [
|
|
131
|
-
{
|
|
132
|
-
name: TEST_NAME,
|
|
133
|
-
fullName: TEST_FULL_NAME,
|
|
134
|
-
state: 'failed',
|
|
135
|
-
errors: [
|
|
136
|
-
{
|
|
137
|
-
message: 'assert 0 == 4',
|
|
138
|
-
stack:
|
|
139
|
-
'test_calculator.py:6: in test_adds_two_numbers\n assert result == 4\nE assert 0 == 4',
|
|
140
|
-
expected: '4',
|
|
141
|
-
actual: '0',
|
|
142
|
-
},
|
|
143
|
-
],
|
|
144
|
-
},
|
|
145
|
-
],
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
},
|
|
149
|
-
null,
|
|
150
|
-
2
|
|
151
|
-
),
|
|
152
|
-
},
|
|
153
|
-
passing: {
|
|
154
|
-
description: 'passing tests',
|
|
155
|
-
content: JSON.stringify(
|
|
156
|
-
{
|
|
157
|
-
testModules: [
|
|
158
|
-
{
|
|
159
|
-
moduleId: TEST_MODULE_ID,
|
|
160
|
-
tests: [
|
|
161
|
-
{
|
|
162
|
-
name: TEST_NAME,
|
|
163
|
-
fullName: TEST_FULL_NAME,
|
|
164
|
-
state: 'passed',
|
|
165
|
-
errors: [],
|
|
166
|
-
},
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
],
|
|
170
|
-
},
|
|
171
|
-
null,
|
|
172
|
-
2
|
|
173
|
-
),
|
|
174
|
-
},
|
|
175
|
-
irrelevant: {
|
|
176
|
-
description: 'irrelevant tests',
|
|
177
|
-
content: JSON.stringify(
|
|
178
|
-
{
|
|
179
|
-
testModules: [
|
|
180
|
-
{
|
|
181
|
-
moduleId: 'src/billing/test_domestic.py',
|
|
182
|
-
tests: [
|
|
183
|
-
{
|
|
184
|
-
name: 'test_generates_xml_report',
|
|
185
|
-
fullName: 'test_domestic.py::test_generates_xml_report',
|
|
186
|
-
state: 'passed',
|
|
187
|
-
errors: [],
|
|
188
|
-
},
|
|
189
|
-
],
|
|
190
|
-
},
|
|
191
|
-
],
|
|
192
|
-
},
|
|
193
|
-
null,
|
|
194
|
-
2
|
|
195
|
-
),
|
|
196
|
-
},
|
|
197
|
-
empty: {
|
|
198
|
-
description: 'no test output',
|
|
199
|
-
content: ``,
|
|
200
|
-
},
|
|
201
|
-
} as const
|
|
202
|
-
|
|
203
|
-
// Python test modifications
|
|
204
|
-
export const testModifications = {
|
|
205
|
-
singleTest: {
|
|
206
|
-
description: 'adding a single test',
|
|
207
|
-
content: `def test_adds_two_numbers():
|
|
208
|
-
calculator = Calculator()
|
|
209
|
-
result = calculator.add(2, 2)
|
|
210
|
-
assert result == 4
|
|
211
|
-
`,
|
|
212
|
-
},
|
|
213
|
-
multipleTests: {
|
|
214
|
-
description: 'adding multiple tests',
|
|
215
|
-
content: `def test_adds_two_numbers():
|
|
216
|
-
calculator = Calculator()
|
|
217
|
-
result = calculator.add(2, 2)
|
|
218
|
-
assert result == 4
|
|
219
|
-
|
|
220
|
-
def test_subtracts_two_numbers():
|
|
221
|
-
calculator = Calculator()
|
|
222
|
-
result = calculator.subtract(8, 2)
|
|
223
|
-
assert result == 6
|
|
224
|
-
`,
|
|
225
|
-
},
|
|
226
|
-
multipleTestsWithImports: {
|
|
227
|
-
description: 'adding multiple tests with imports',
|
|
228
|
-
content: `import pytest
|
|
229
|
-
from calculator import Calculator
|
|
230
|
-
|
|
231
|
-
def test_adds_two_numbers():
|
|
232
|
-
calculator = Calculator()
|
|
233
|
-
result = calculator.add(2, 2)
|
|
234
|
-
assert result == 4
|
|
235
|
-
|
|
236
|
-
def test_subtracts_two_numbers():
|
|
237
|
-
calculator = Calculator()
|
|
238
|
-
result = calculator.subtract(8, 2)
|
|
239
|
-
assert result == 6
|
|
240
|
-
`,
|
|
241
|
-
},
|
|
242
|
-
singleTestWithContainer: {
|
|
243
|
-
description: 'adding a single test with test container',
|
|
244
|
-
content: `class TestCalculator:
|
|
245
|
-
def test_adds_two_numbers(self):
|
|
246
|
-
calculator = Calculator()
|
|
247
|
-
result = calculator.add(2, 2)
|
|
248
|
-
assert result == 4
|
|
249
|
-
`,
|
|
250
|
-
},
|
|
251
|
-
singleTestComplete: {
|
|
252
|
-
description: 'adding a complete test file',
|
|
253
|
-
content: `import pytest
|
|
254
|
-
from calculator import Calculator
|
|
255
|
-
|
|
256
|
-
class TestCalculator:
|
|
257
|
-
def test_adds_two_numbers(self):
|
|
258
|
-
calculator = Calculator()
|
|
259
|
-
result = calculator.add(2, 2)
|
|
260
|
-
assert result == 4
|
|
261
|
-
`,
|
|
262
|
-
},
|
|
263
|
-
emptyTestContainer: {
|
|
264
|
-
description: 'empty test container',
|
|
265
|
-
content: `class TestCalculator:
|
|
266
|
-
pass
|
|
267
|
-
`,
|
|
268
|
-
},
|
|
269
|
-
emptyTestContainerWithImports: {
|
|
270
|
-
description: 'empty test file with imports',
|
|
271
|
-
content: `import pytest
|
|
272
|
-
from calculator import Calculator
|
|
273
|
-
|
|
274
|
-
class TestCalculator:
|
|
275
|
-
pass
|
|
276
|
-
`,
|
|
277
|
-
},
|
|
278
|
-
refactoredTests: {
|
|
279
|
-
description: 'refactoring test setup',
|
|
280
|
-
content: `import pytest
|
|
281
|
-
from calculator import Calculator
|
|
282
|
-
|
|
283
|
-
class TestCalculator:
|
|
284
|
-
def setup_method(self):
|
|
285
|
-
self.calculator = Calculator()
|
|
286
|
-
|
|
287
|
-
def test_adds_two_numbers(self):
|
|
288
|
-
result = self.calculator.add(2, 2)
|
|
289
|
-
assert result == 4
|
|
290
|
-
|
|
291
|
-
def test_subtracts_two_numbers(self):
|
|
292
|
-
result = self.calculator.subtract(8, 2)
|
|
293
|
-
assert result == 6
|
|
294
|
-
`,
|
|
295
|
-
},
|
|
296
|
-
} as const
|
|
297
|
-
|
|
298
|
-
// Python implementation modifications
|
|
299
|
-
export const implementationModifications = {
|
|
300
|
-
empty: {
|
|
301
|
-
description: 'file with only a comment',
|
|
302
|
-
content: `# calculator.py
|
|
303
|
-
`,
|
|
304
|
-
},
|
|
305
|
-
classStub: {
|
|
306
|
-
description: 'creating empty class stub',
|
|
307
|
-
content: `class Calculator:
|
|
308
|
-
pass
|
|
309
|
-
`,
|
|
310
|
-
},
|
|
311
|
-
methodStub: {
|
|
312
|
-
description: 'creating method stub',
|
|
313
|
-
content: `class Calculator:
|
|
314
|
-
def add(self, a, b):
|
|
315
|
-
return None
|
|
316
|
-
`,
|
|
317
|
-
},
|
|
318
|
-
methodStubReturning0: {
|
|
319
|
-
description: 'method stub returning 0',
|
|
320
|
-
content: `class Calculator:
|
|
321
|
-
def add(self, a: int, b: int) -> int:
|
|
322
|
-
return 0
|
|
323
|
-
`,
|
|
324
|
-
},
|
|
325
|
-
methodImplementation: {
|
|
326
|
-
description: 'implementing method',
|
|
327
|
-
content: `class Calculator:
|
|
328
|
-
def add(self, a: int, b: int) -> int:
|
|
329
|
-
return a + b
|
|
330
|
-
`,
|
|
331
|
-
},
|
|
332
|
-
overEngineered: {
|
|
333
|
-
description: 'over-engineering implementation',
|
|
334
|
-
content: `import logging
|
|
335
|
-
from typing import Union, Optional
|
|
336
|
-
from dataclasses import dataclass
|
|
337
|
-
from datetime import datetime
|
|
338
|
-
|
|
339
|
-
@dataclass
|
|
340
|
-
class CalculationResult:
|
|
341
|
-
value: float
|
|
342
|
-
timestamp: datetime
|
|
343
|
-
operation: str
|
|
344
|
-
|
|
345
|
-
class Calculator:
|
|
346
|
-
def __init__(self):
|
|
347
|
-
self.logger = logging.getLogger(__name__)
|
|
348
|
-
self.history = []
|
|
349
|
-
self._configure_logging()
|
|
350
|
-
|
|
351
|
-
def _configure_logging(self):
|
|
352
|
-
handler = logging.StreamHandler()
|
|
353
|
-
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
354
|
-
handler.setFormatter(formatter)
|
|
355
|
-
self.logger.addHandler(handler)
|
|
356
|
-
self.logger.setLevel(logging.DEBUG)
|
|
357
|
-
|
|
358
|
-
def _validate_number(self, value: Union[int, float], param_name: str) -> None:
|
|
359
|
-
if not isinstance(value, (int, float)):
|
|
360
|
-
self.logger.error(f"Invalid {param_name}: {value}")
|
|
361
|
-
raise TypeError(f"{param_name} must be a number")
|
|
362
|
-
if not (-1e308 < value < 1e308):
|
|
363
|
-
self.logger.warning(f"{param_name} is very large: {value}")
|
|
364
|
-
|
|
365
|
-
def add(self, a: Union[int, float], b: Union[int, float]) -> float:
|
|
366
|
-
self.logger.debug(f"Adding {a} + {b}")
|
|
367
|
-
|
|
368
|
-
# Validate inputs
|
|
369
|
-
self._validate_number(a, "first argument")
|
|
370
|
-
self._validate_number(b, "second argument")
|
|
371
|
-
|
|
372
|
-
# Perform calculation
|
|
373
|
-
result = a + b
|
|
374
|
-
|
|
375
|
-
# Store in history
|
|
376
|
-
calc_result = CalculationResult(
|
|
377
|
-
value=result,
|
|
378
|
-
timestamp=datetime.now(),
|
|
379
|
-
operation=f"{a} + {b}"
|
|
380
|
-
)
|
|
381
|
-
self.history.append(calc_result)
|
|
382
|
-
|
|
383
|
-
self.logger.info(f"Addition result: {result}")
|
|
384
|
-
|
|
385
|
-
# Check for overflow
|
|
386
|
-
if result == float('inf') or result == float('-inf'):
|
|
387
|
-
self.logger.warning("Result exceeded maximum value")
|
|
388
|
-
|
|
389
|
-
return result
|
|
390
|
-
`,
|
|
391
|
-
},
|
|
392
|
-
completeClass: {
|
|
393
|
-
description: 'implementing multiple methods',
|
|
394
|
-
content: `class Calculator:
|
|
395
|
-
def add(self, a: int, b: int) -> int:
|
|
396
|
-
return a + b
|
|
397
|
-
|
|
398
|
-
def subtract(self, a: int, b: int) -> int:
|
|
399
|
-
return a - b
|
|
400
|
-
|
|
401
|
-
def multiply(self, a: int, b: int) -> int:
|
|
402
|
-
return a * b
|
|
403
|
-
|
|
404
|
-
def divide(self, a: int, b: int) -> float:
|
|
405
|
-
if b == 0:
|
|
406
|
-
raise ValueError("Cannot divide by zero")
|
|
407
|
-
return a / b
|
|
408
|
-
`,
|
|
409
|
-
},
|
|
410
|
-
} as const
|
|
411
|
-
|
|
412
|
-
// Todo states (same as TypeScript but with Python context)
|
|
413
|
-
export const todos = {
|
|
414
|
-
empty: {
|
|
415
|
-
description: 'no todos',
|
|
416
|
-
content: [] as Todo[],
|
|
417
|
-
},
|
|
418
|
-
irrelevantCompleted: {
|
|
419
|
-
description: 'irrelevant completed todos',
|
|
420
|
-
content: [
|
|
421
|
-
{
|
|
422
|
-
content: 'Add support for domestic billing',
|
|
423
|
-
status: 'completed',
|
|
424
|
-
priority: 'high',
|
|
425
|
-
id: '1',
|
|
426
|
-
},
|
|
427
|
-
{
|
|
428
|
-
content: 'Generate XML report tags',
|
|
429
|
-
status: 'completed',
|
|
430
|
-
priority: 'high',
|
|
431
|
-
id: '2',
|
|
432
|
-
},
|
|
433
|
-
{
|
|
434
|
-
content: 'Update billing wiki',
|
|
435
|
-
status: 'completed',
|
|
436
|
-
priority: 'high',
|
|
437
|
-
id: '3',
|
|
438
|
-
},
|
|
439
|
-
] as Todo[],
|
|
440
|
-
},
|
|
441
|
-
irrelevantInProgress: {
|
|
442
|
-
description: 'irrelevant task in progress',
|
|
443
|
-
content: [
|
|
444
|
-
{
|
|
445
|
-
content: 'Add support for domestic billing',
|
|
446
|
-
status: 'completed',
|
|
447
|
-
priority: 'high',
|
|
448
|
-
id: '1',
|
|
449
|
-
},
|
|
450
|
-
{
|
|
451
|
-
content: 'Generate XML report tags',
|
|
452
|
-
status: 'in_progress',
|
|
453
|
-
priority: 'high',
|
|
454
|
-
id: '2',
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
content: 'Update billing wiki',
|
|
458
|
-
status: 'pending',
|
|
459
|
-
priority: 'high',
|
|
460
|
-
id: '3',
|
|
461
|
-
},
|
|
462
|
-
] as Todo[],
|
|
463
|
-
},
|
|
464
|
-
classInProgress: {
|
|
465
|
-
description: 'class in progress',
|
|
466
|
-
content: [
|
|
467
|
-
{
|
|
468
|
-
content: 'Add Calculator class',
|
|
469
|
-
status: 'in_progress',
|
|
470
|
-
priority: 'high',
|
|
471
|
-
id: '1',
|
|
472
|
-
},
|
|
473
|
-
{
|
|
474
|
-
content: 'Create add method',
|
|
475
|
-
status: 'pending',
|
|
476
|
-
priority: 'high',
|
|
477
|
-
id: '2',
|
|
478
|
-
},
|
|
479
|
-
{
|
|
480
|
-
content: 'Create subtract method',
|
|
481
|
-
status: 'pending',
|
|
482
|
-
priority: 'high',
|
|
483
|
-
id: '3',
|
|
484
|
-
},
|
|
485
|
-
] as Todo[],
|
|
486
|
-
},
|
|
487
|
-
methodInProgress: {
|
|
488
|
-
description: 'method in progress',
|
|
489
|
-
content: [
|
|
490
|
-
{
|
|
491
|
-
content: 'Add Calculator class',
|
|
492
|
-
status: 'completed',
|
|
493
|
-
priority: 'high',
|
|
494
|
-
id: '1',
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
content: 'Create add method',
|
|
498
|
-
status: 'in_progress',
|
|
499
|
-
priority: 'high',
|
|
500
|
-
id: '2',
|
|
501
|
-
},
|
|
502
|
-
{
|
|
503
|
-
content: 'Create subtract method',
|
|
504
|
-
status: 'pending',
|
|
505
|
-
priority: 'high',
|
|
506
|
-
id: '3',
|
|
507
|
-
},
|
|
508
|
-
] as Todo[],
|
|
509
|
-
},
|
|
510
|
-
allCompleted: {
|
|
511
|
-
description: 'all tasks completed',
|
|
512
|
-
content: [
|
|
513
|
-
{
|
|
514
|
-
content: 'Add Calculator class',
|
|
515
|
-
status: 'completed',
|
|
516
|
-
priority: 'high',
|
|
517
|
-
id: '1',
|
|
518
|
-
},
|
|
519
|
-
{
|
|
520
|
-
content: 'Create add method',
|
|
521
|
-
status: 'completed',
|
|
522
|
-
priority: 'high',
|
|
523
|
-
id: '2',
|
|
524
|
-
},
|
|
525
|
-
{
|
|
526
|
-
content: 'Create subtract method',
|
|
527
|
-
status: 'completed',
|
|
528
|
-
priority: 'high',
|
|
529
|
-
id: '3',
|
|
530
|
-
},
|
|
531
|
-
] as Todo[],
|
|
532
|
-
},
|
|
533
|
-
refactoring: {
|
|
534
|
-
description: 'refactoring in progress',
|
|
535
|
-
content: [
|
|
536
|
-
{
|
|
537
|
-
content: 'Refactor Calculator class and tests',
|
|
538
|
-
status: 'in_progress',
|
|
539
|
-
priority: 'high',
|
|
540
|
-
id: '1',
|
|
541
|
-
},
|
|
542
|
-
] as Todo[],
|
|
543
|
-
},
|
|
544
|
-
} as const
|
|
545
|
-
|
|
546
|
-
// Python refactoring test data
|
|
547
|
-
export const refactoringImplementation = {
|
|
548
|
-
beforeRefactor: {
|
|
549
|
-
description: 'implementation with repetitive code',
|
|
550
|
-
content: `class Calculator:
|
|
551
|
-
def add(self, a, b):
|
|
552
|
-
if not isinstance(a, (int, float)):
|
|
553
|
-
raise TypeError("First argument must be a number")
|
|
554
|
-
if not isinstance(b, (int, float)):
|
|
555
|
-
raise TypeError("Second argument must be a number")
|
|
556
|
-
return a + b
|
|
557
|
-
|
|
558
|
-
def subtract(self, a, b):
|
|
559
|
-
if not isinstance(a, (int, float)):
|
|
560
|
-
raise TypeError("First argument must be a number")
|
|
561
|
-
if not isinstance(b, (int, float)):
|
|
562
|
-
raise TypeError("Second argument must be a number")
|
|
563
|
-
return a - b
|
|
564
|
-
|
|
565
|
-
def multiply(self, a, b):
|
|
566
|
-
if not isinstance(a, (int, float)):
|
|
567
|
-
raise TypeError("First argument must be a number")
|
|
568
|
-
if not isinstance(b, (int, float)):
|
|
569
|
-
raise TypeError("Second argument must be a number")
|
|
570
|
-
return a * b`,
|
|
571
|
-
},
|
|
572
|
-
afterRefactor: {
|
|
573
|
-
description: 'implementation after extracting common validation',
|
|
574
|
-
content: `class Calculator:
|
|
575
|
-
def _validate_numbers(self, a, b):
|
|
576
|
-
if not isinstance(a, (int, float)):
|
|
577
|
-
raise TypeError("First argument must be a number")
|
|
578
|
-
if not isinstance(b, (int, float)):
|
|
579
|
-
raise TypeError("Second argument must be a number")
|
|
580
|
-
|
|
581
|
-
def add(self, a, b):
|
|
582
|
-
self._validate_numbers(a, b)
|
|
583
|
-
return a + b
|
|
584
|
-
|
|
585
|
-
def subtract(self, a, b):
|
|
586
|
-
self._validate_numbers(a, b)
|
|
587
|
-
return a - b
|
|
588
|
-
|
|
589
|
-
def multiply(self, a, b):
|
|
590
|
-
self._validate_numbers(a, b)
|
|
591
|
-
return a * b`,
|
|
592
|
-
},
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
export const refactoringTests = {
|
|
596
|
-
beforeRefactor: {
|
|
597
|
-
description: 'test file with inline assertions',
|
|
598
|
-
content: `import pytest
|
|
599
|
-
from calculator import Calculator
|
|
600
|
-
|
|
601
|
-
class TestCalculator:
|
|
602
|
-
def test_adds_two_numbers(self):
|
|
603
|
-
calc = Calculator()
|
|
604
|
-
assert calc.add(2, 3) == 5
|
|
605
|
-
assert calc.add(-1, 1) == 0
|
|
606
|
-
assert calc.add(0, 0) == 0
|
|
607
|
-
|
|
608
|
-
def test_subtracts_two_numbers(self):
|
|
609
|
-
calc = Calculator()
|
|
610
|
-
assert calc.subtract(5, 3) == 2
|
|
611
|
-
assert calc.subtract(0, 5) == -5
|
|
612
|
-
assert calc.subtract(-1, -1) == 0
|
|
613
|
-
|
|
614
|
-
def test_multiplies_two_numbers(self):
|
|
615
|
-
calc = Calculator()
|
|
616
|
-
assert calc.multiply(3, 4) == 12
|
|
617
|
-
assert calc.multiply(-2, 3) == -6
|
|
618
|
-
assert calc.multiply(0, 5) == 0`,
|
|
619
|
-
},
|
|
620
|
-
afterRefactor: {
|
|
621
|
-
description: 'test file after extracting test setup',
|
|
622
|
-
content: `import pytest
|
|
623
|
-
from calculator import Calculator
|
|
624
|
-
|
|
625
|
-
class TestCalculator:
|
|
626
|
-
def setup_method(self):
|
|
627
|
-
self.calc = Calculator()
|
|
628
|
-
|
|
629
|
-
def test_adds_two_numbers(self):
|
|
630
|
-
assert self.calc.add(2, 3) == 5
|
|
631
|
-
assert self.calc.add(-1, 1) == 0
|
|
632
|
-
assert self.calc.add(0, 0) == 0
|
|
633
|
-
|
|
634
|
-
def test_subtracts_two_numbers(self):
|
|
635
|
-
assert self.calc.subtract(5, 3) == 2
|
|
636
|
-
assert self.calc.subtract(0, 5) == -5
|
|
637
|
-
assert self.calc.subtract(-1, -1) == 0
|
|
638
|
-
|
|
639
|
-
def test_multiplies_two_numbers(self):
|
|
640
|
-
assert self.calc.multiply(3, 4) == 12
|
|
641
|
-
assert self.calc.multiply(-2, 3) == -6
|
|
642
|
-
assert self.calc.multiply(0, 5) == 0`,
|
|
643
|
-
},
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
export const refactoringTestResults = {
|
|
647
|
-
failing: {
|
|
648
|
-
description: 'multiple tests failing',
|
|
649
|
-
content: JSON.stringify(
|
|
650
|
-
{
|
|
651
|
-
testModules: [
|
|
652
|
-
{
|
|
653
|
-
moduleId: TEST_MODULE_ID,
|
|
654
|
-
tests: [
|
|
655
|
-
{
|
|
656
|
-
name: TEST_NAME,
|
|
657
|
-
fullName:
|
|
658
|
-
'test_calculator.py::TestCalculator::test_adds_two_numbers',
|
|
659
|
-
state: 'failed',
|
|
660
|
-
errors: [
|
|
661
|
-
{
|
|
662
|
-
message: 'assert 4 == 5',
|
|
663
|
-
stack:
|
|
664
|
-
'test_calculator.py:7: in test_adds_two_numbers\n assert calc.add(2, 3) == 5\nE assert 4 == 5',
|
|
665
|
-
expected: '5',
|
|
666
|
-
actual: '4',
|
|
667
|
-
},
|
|
668
|
-
],
|
|
669
|
-
},
|
|
670
|
-
{
|
|
671
|
-
name: 'test_subtracts_two_numbers',
|
|
672
|
-
fullName:
|
|
673
|
-
'test_calculator.py::TestCalculator::test_subtracts_two_numbers',
|
|
674
|
-
state: 'failed',
|
|
675
|
-
errors: [
|
|
676
|
-
{
|
|
677
|
-
message: 'assert 1 == 2',
|
|
678
|
-
stack:
|
|
679
|
-
'test_calculator.py:13: in test_subtracts_two_numbers\n assert calc.subtract(5, 3) == 2\nE assert 1 == 2',
|
|
680
|
-
expected: '2',
|
|
681
|
-
actual: '1',
|
|
682
|
-
},
|
|
683
|
-
],
|
|
684
|
-
},
|
|
685
|
-
{
|
|
686
|
-
name: 'test_multiplies_two_numbers',
|
|
687
|
-
fullName:
|
|
688
|
-
'test_calculator.py::TestCalculator::test_multiplies_two_numbers',
|
|
689
|
-
state: 'failed',
|
|
690
|
-
errors: [
|
|
691
|
-
{
|
|
692
|
-
message: 'assert 11 == 12',
|
|
693
|
-
stack:
|
|
694
|
-
'test_calculator.py:19: in test_multiplies_two_numbers\n assert calc.multiply(3, 4) == 12\nE assert 11 == 12',
|
|
695
|
-
expected: '12',
|
|
696
|
-
actual: '11',
|
|
697
|
-
},
|
|
698
|
-
],
|
|
699
|
-
},
|
|
700
|
-
],
|
|
701
|
-
},
|
|
702
|
-
],
|
|
703
|
-
},
|
|
704
|
-
null,
|
|
705
|
-
2
|
|
706
|
-
),
|
|
707
|
-
},
|
|
708
|
-
passing: {
|
|
709
|
-
description: 'all tests passing',
|
|
710
|
-
content: JSON.stringify(
|
|
711
|
-
{
|
|
712
|
-
testModules: [
|
|
713
|
-
{
|
|
714
|
-
moduleId: TEST_MODULE_ID,
|
|
715
|
-
tests: [
|
|
716
|
-
{
|
|
717
|
-
name: TEST_NAME,
|
|
718
|
-
fullName:
|
|
719
|
-
'test_calculator.py::TestCalculator::test_adds_two_numbers',
|
|
720
|
-
state: 'passed',
|
|
721
|
-
errors: [],
|
|
722
|
-
},
|
|
723
|
-
{
|
|
724
|
-
name: 'test_subtracts_two_numbers',
|
|
725
|
-
fullName:
|
|
726
|
-
'test_calculator.py::TestCalculator::test_subtracts_two_numbers',
|
|
727
|
-
state: 'passed',
|
|
728
|
-
errors: [],
|
|
729
|
-
},
|
|
730
|
-
{
|
|
731
|
-
name: 'test_multiplies_two_numbers',
|
|
732
|
-
fullName:
|
|
733
|
-
'test_calculator.py::TestCalculator::test_multiplies_two_numbers',
|
|
734
|
-
state: 'passed',
|
|
735
|
-
errors: [],
|
|
736
|
-
},
|
|
737
|
-
],
|
|
738
|
-
},
|
|
739
|
-
],
|
|
740
|
-
},
|
|
741
|
-
null,
|
|
742
|
-
2
|
|
743
|
-
),
|
|
744
|
-
},
|
|
745
|
-
}
|