@tyvm/knowhow 0.0.32 → 0.0.34
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/autodoc/plugins/downloader/downloader.mdx +2 -2
- package/benchmarks/.dockerignore +7 -0
- package/benchmarks/README.md +166 -0
- package/benchmarks/docker/Dockerfile +68 -0
- package/benchmarks/example-config.yml +27 -0
- package/benchmarks/jest.config.js +13 -0
- package/benchmarks/package-lock.json +4297 -0
- package/benchmarks/package.json +39 -0
- package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +2814 -0
- package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +2014 -0
- package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +3121 -0
- package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +98 -0
- package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +3256 -0
- package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +4298 -0
- package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3031 -0
- package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +2990 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3256 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3007 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +3256 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +3036 -0
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +3280 -0
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +1920 -0
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +3281 -0
- package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +2896 -0
- package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3011 -0
- package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +3003 -0
- package/benchmarks/scripts/build-and-run.sh +47 -0
- package/benchmarks/scripts/clone-exercism.sh +92 -0
- package/benchmarks/scripts/validate.sh +48 -0
- package/benchmarks/src/__tests__/runner.test.ts +27 -0
- package/benchmarks/src/cli.ts +90 -0
- package/benchmarks/src/evaluators/EvaluatorRegistry.ts +64 -0
- package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +183 -0
- package/benchmarks/src/evaluators/index.ts +3 -0
- package/benchmarks/src/evaluators/types.ts +22 -0
- package/benchmarks/src/index.ts +3 -0
- package/benchmarks/src/providers.ts +13 -0
- package/benchmarks/src/runner.ts +824 -0
- package/benchmarks/src/types.ts +63 -0
- package/benchmarks/tsconfig.json +19 -0
- package/jest.config.js +2 -1
- package/leaderboard/README.md +148 -0
- package/leaderboard/app/api/benchmark-data/route.ts +131 -0
- package/leaderboard/app/api/benchmark-detail/route.ts +172 -0
- package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +501 -0
- package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +375 -0
- package/leaderboard/app/globals.css +27 -0
- package/leaderboard/app/layout.tsx +21 -0
- package/leaderboard/app/page.tsx +170 -0
- package/leaderboard/components/LeaderboardTable.tsx +168 -0
- package/leaderboard/components/PerformanceChart.tsx +109 -0
- package/leaderboard/next-env.d.ts +5 -0
- package/leaderboard/next.config.js +4 -0
- package/leaderboard/package-lock.json +6363 -0
- package/leaderboard/package.json +28 -0
- package/leaderboard/postcss.config.js +6 -0
- package/leaderboard/tailwind.config.js +17 -0
- package/leaderboard/tsconfig.json +28 -0
- package/leaderboard/types/benchmark.ts +67 -0
- package/leaderboard/utils/dataProcessor.ts +33 -0
- package/package.json +2 -1
- package/src/agents/base/base.ts +147 -21
- package/src/agents/base/prompt.ts +28 -0
- package/src/agents/index.ts +3 -0
- package/src/agents/patcher/patcher.ts +6 -4
- package/src/agents/setup/setup.ts +56 -0
- package/src/agents/tools/agentCall.ts +6 -2
- package/src/agents/tools/aiClient.ts +74 -8
- package/src/agents/tools/execCommand.ts +13 -14
- package/src/agents/tools/executeScript/README.md +16 -0
- package/src/agents/tools/index.ts +2 -0
- package/src/agents/tools/list.ts +73 -16
- package/src/agents/tools/startAgentTask.ts +109 -0
- package/src/agents/tools/textSearch.ts +1 -1
- package/src/agents/tools/visionTool.ts +31 -2
- package/src/agents/tools/ycmd/client.ts +608 -0
- package/src/agents/tools/ycmd/definitions.ts +294 -0
- package/src/agents/tools/ycmd/detection.ts +211 -0
- package/src/agents/tools/ycmd/index.ts +11 -0
- package/src/agents/tools/ycmd/installer.ts +251 -0
- package/src/agents/tools/ycmd/server.ts +535 -0
- package/src/agents/tools/ycmd/serverManager.ts +316 -0
- package/src/agents/tools/ycmd/tools/completion.ts +113 -0
- package/src/agents/tools/ycmd/tools/diagnostics.ts +155 -0
- package/src/agents/tools/ycmd/tools/getLocations.ts +173 -0
- package/src/agents/tools/ycmd/tools/goto.ts +169 -0
- package/src/agents/tools/ycmd/tools/refactor.ts +204 -0
- package/src/agents/tools/ycmd/tools/signature.ts +174 -0
- package/src/agents/tools/ycmd/tools/start.ts +95 -0
- package/src/agents/tools/ycmd/utils/pathUtils.ts +59 -0
- package/src/ai.ts +15 -0
- package/src/chat/CliChatService.ts +277 -0
- package/src/chat/modules/AgentModule.ts +980 -0
- package/src/chat/modules/AskModule.ts +98 -0
- package/src/chat/modules/BaseChatModule.ts +66 -0
- package/src/chat/modules/InternalChatModule.ts +174 -0
- package/src/chat/modules/SearchModule.ts +166 -0
- package/src/chat/modules/SetupModule.ts +185 -0
- package/src/chat/modules/SystemModule.ts +120 -0
- package/src/chat/modules/VoiceModule.ts +70 -0
- package/src/chat/modules/index.js +5 -0
- package/src/chat/types.ts +97 -0
- package/src/chat.ts +9 -1
- package/src/chat2.ts +62 -0
- package/src/cli.ts +264 -35
- package/src/clients/anthropic.ts +14 -7
- package/src/clients/gemini.ts +15 -7
- package/src/clients/http.ts +17 -7
- package/src/clients/index.ts +117 -4
- package/src/clients/knowhow.ts +7 -2
- package/src/clients/knowhowMcp.ts +118 -0
- package/src/clients/openai.ts +32 -8
- package/src/clients/types.ts +1 -0
- package/src/clients/xai.ts +17 -5
- package/src/config.ts +30 -5
- package/src/conversion.ts +4 -1
- package/src/embeddings.ts +79 -23
- package/src/login.ts +26 -9
- package/src/microphone.ts +0 -1
- package/src/plugins/downloader/downloader.ts +72 -24
- package/src/plugins/downloader/plugin.ts +3 -1
- package/src/plugins/plugins.ts +3 -0
- package/src/processors/CustomVariables.ts +425 -0
- package/src/processors/HarmonyToolProcessor.ts +264 -0
- package/src/processors/XmlToolCallProcessor.ts +533 -0
- package/src/processors/index.ts +3 -0
- package/src/prompts/KnowhowConfigExamples.ts +376 -0
- package/src/services/KnowhowClient.ts +49 -3
- package/src/services/Mcp.ts +42 -3
- package/src/services/McpServer.ts +14 -4
- package/src/services/McpWebsocketTransport.ts +21 -7
- package/src/services/MessageProcessor.ts +10 -5
- package/src/services/index.ts +5 -0
- package/src/services/script-execution/ScriptExecutor.ts +34 -1
- package/src/services/types.ts +17 -14
- package/src/types.ts +17 -0
- package/src/utils/index.ts +138 -0
- package/tests/XmlToolCallProcessor.test.ts +468 -0
- package/tests/manual/ycmd/debug_diagnostics_test.ts +127 -0
- package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +26 -0
- package/tests/manual/ycmd/fixtures/file_change_test.ts +17 -0
- package/tests/manual/ycmd/minimal_advanced_test.ts +108 -0
- package/tests/manual/ycmd/simple_diagnostics_test.ts +61 -0
- package/tests/manual/ycmd/simple_test.ts +74 -0
- package/tests/manual/ycmd/test-typescript-sample.ts +34 -0
- package/tests/manual/ycmd/test_advanced_features.ts +407 -0
- package/tests/manual/ycmd/test_advanced_with_tools.ts +320 -0
- package/tests/manual/ycmd/test_comprehensive_typescript.ts +179 -0
- package/tests/manual/ycmd/test_diagnostics_file_changes.ts +249 -0
- package/tests/manual/ycmd/test_diagnostics_fix.ts +99 -0
- package/tests/manual/ycmd/test_diagnostics_simple.ts +100 -0
- package/tests/manual/ycmd/test_diagnostics_timing.ts +120 -0
- package/tests/manual/ycmd/test_discover_commands.ts +310 -0
- package/tests/manual/ycmd/test_endpoints.ts +115 -0
- package/tests/manual/ycmd/test_final_comprehensive.ts +218 -0
- package/tests/manual/ycmd/test_final_validation.ts +150 -0
- package/tests/manual/ycmd/test_implementation.js +42 -0
- package/tests/manual/ycmd/test_individual_ycmd_tool.ts +39 -0
- package/tests/manual/ycmd/test_server_manager.ts +52 -0
- package/tests/manual/ycmd/test_simple_debug.ts +86 -0
- package/tests/manual/ycmd/test_tsserver_workflow.js +83 -0
- package/tests/manual/ycmd/test_tsserver_workflow.ts +122 -0
- package/tests/manual/ycmd/test_typescript_simple.ts +48 -0
- package/tests/manual/ycmd/test_typescript_ycmd.ts +105 -0
- package/tests/manual/ycmd/test_workspace_config.ts +90 -0
- package/tests/manual/ycmd/test_ycmd_auto_start.ts +137 -0
- package/tests/manual/ycmd/test_ycmd_comprehensive.ts +73 -0
- package/tests/manual/ycmd/test_ycmd_connection.py +10 -0
- package/tests/manual/ycmd/test_ycmd_direct.ts +142 -0
- package/tests/manual/ycmd/test_ycmd_experiment.ts +48 -0
- package/tests/manual/ycmd/test_ycmd_final.ts +200 -0
- package/tests/manual/ycmd/test_ycmd_fixed.py +18 -0
- package/tests/manual/ycmd/test_ycmd_integration.ts +112 -0
- package/tests/manual/ycmd/test_ycmd_simple.ts +45 -0
- package/tests/manual/ycmd/test_ycmd_usage.py +27 -0
- package/tests/manual/ycmd/working_simple_test.ts +134 -0
- package/ts_build/src/agents/base/base.d.ts +14 -1
- package/ts_build/src/agents/base/base.js +91 -17
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/agents/base/prompt.d.ts +1 -1
- package/ts_build/src/agents/base/prompt.js +28 -0
- package/ts_build/src/agents/base/prompt.js.map +1 -1
- package/ts_build/src/agents/index.d.ts +2 -0
- package/ts_build/src/agents/index.js +2 -0
- package/ts_build/src/agents/index.js.map +1 -1
- package/ts_build/src/agents/patcher/patcher.js +6 -3
- package/ts_build/src/agents/patcher/patcher.js.map +1 -1
- package/ts_build/src/agents/setup/setup.d.ts +8 -0
- package/ts_build/src/agents/setup/setup.js +59 -0
- package/ts_build/src/agents/setup/setup.js.map +1 -0
- package/ts_build/src/agents/tools/agentCall.js +5 -2
- package/ts_build/src/agents/tools/agentCall.js.map +1 -1
- package/ts_build/src/agents/tools/aiClient.d.ts +6 -5
- package/ts_build/src/agents/tools/aiClient.js +37 -6
- package/ts_build/src/agents/tools/aiClient.js.map +1 -1
- package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
- package/ts_build/src/agents/tools/execCommand.js +5 -6
- package/ts_build/src/agents/tools/execCommand.js.map +1 -1
- package/ts_build/src/agents/tools/executeScript/index.d.ts +1 -1
- package/ts_build/src/agents/tools/index.d.ts +2 -0
- package/ts_build/src/agents/tools/index.js +2 -0
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +66 -16
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/startAgentTask.d.ts +13 -0
- package/ts_build/src/agents/tools/startAgentTask.js +74 -0
- package/ts_build/src/agents/tools/startAgentTask.js.map +1 -0
- package/ts_build/src/agents/tools/startChatTask.d.ts +13 -0
- package/ts_build/src/agents/tools/startChatTask.js +73 -0
- package/ts_build/src/agents/tools/startChatTask.js.map +1 -0
- package/ts_build/src/agents/tools/textSearch.js +1 -1
- package/ts_build/src/agents/tools/textSearch.js.map +1 -1
- package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
- package/ts_build/src/agents/tools/visionTool.js +23 -3
- package/ts_build/src/agents/tools/visionTool.js.map +1 -1
- package/ts_build/src/agents/tools/ycmd/client.d.ts +93 -0
- package/ts_build/src/agents/tools/ycmd/client.js +355 -0
- package/ts_build/src/agents/tools/ycmd/client.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/definitions.d.ts +345 -0
- package/ts_build/src/agents/tools/ycmd/definitions.js +298 -0
- package/ts_build/src/agents/tools/ycmd/definitions.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/detection.d.ts +11 -0
- package/ts_build/src/agents/tools/ycmd/detection.js +175 -0
- package/ts_build/src/agents/tools/ycmd/detection.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/index.d.ts +8 -0
- package/ts_build/src/agents/tools/ycmd/index.js +20 -0
- package/ts_build/src/agents/tools/ycmd/index.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/installer.d.ts +19 -0
- package/ts_build/src/agents/tools/ycmd/installer.js +196 -0
- package/ts_build/src/agents/tools/ycmd/installer.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/server.d.ts +35 -0
- package/ts_build/src/agents/tools/ycmd/server.js +363 -0
- package/ts_build/src/agents/tools/ycmd/server.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/serverManager.d.ts +39 -0
- package/ts_build/src/agents/tools/ycmd/serverManager.js +210 -0
- package/ts_build/src/agents/tools/ycmd/serverManager.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/completion.d.ts +22 -0
- package/ts_build/src/agents/tools/ycmd/tools/completion.js +72 -0
- package/ts_build/src/agents/tools/ycmd/tools/completion.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/diagnostics.d.ts +42 -0
- package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js +88 -0
- package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/getLocations.d.ts +22 -0
- package/ts_build/src/agents/tools/ycmd/tools/getLocations.js +142 -0
- package/ts_build/src/agents/tools/ycmd/tools/getLocations.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/goto.d.ts +20 -0
- package/ts_build/src/agents/tools/ycmd/tools/goto.js +101 -0
- package/ts_build/src/agents/tools/ycmd/tools/goto.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/refactor.d.ts +32 -0
- package/ts_build/src/agents/tools/ycmd/tools/refactor.js +123 -0
- package/ts_build/src/agents/tools/ycmd/tools/refactor.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/signature.d.ts +25 -0
- package/ts_build/src/agents/tools/ycmd/tools/signature.js +110 -0
- package/ts_build/src/agents/tools/ycmd/tools/signature.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/tools/start.d.ts +17 -0
- package/ts_build/src/agents/tools/ycmd/tools/start.js +65 -0
- package/ts_build/src/agents/tools/ycmd/tools/start.js.map +1 -0
- package/ts_build/src/agents/tools/ycmd/utils/pathUtils.d.ts +4 -0
- package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js +67 -0
- package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js.map +1 -0
- package/ts_build/src/ai.d.ts +1 -0
- package/ts_build/src/ai.js +40 -1
- package/ts_build/src/ai.js.map +1 -1
- package/ts_build/src/chat/ChatCommandHandler.d.ts +36 -0
- package/ts_build/src/chat/ChatCommandHandler.js +268 -0
- package/ts_build/src/chat/ChatCommandHandler.js.map +1 -0
- package/ts_build/src/chat/ChatInputManager.d.ts +22 -0
- package/ts_build/src/chat/ChatInputManager.js +85 -0
- package/ts_build/src/chat/ChatInputManager.js.map +1 -0
- package/ts_build/src/chat/ChatManager.d.ts +49 -0
- package/ts_build/src/chat/ChatManager.js +271 -0
- package/ts_build/src/chat/ChatManager.js.map +1 -0
- package/ts_build/src/chat/ChatSession.d.ts +32 -0
- package/ts_build/src/chat/ChatSession.js +3 -0
- package/ts_build/src/chat/ChatSession.js.map +1 -0
- package/ts_build/src/chat/ChatSessionManager.d.ts +19 -0
- package/ts_build/src/chat/ChatSessionManager.js +188 -0
- package/ts_build/src/chat/ChatSessionManager.js.map +1 -0
- package/ts_build/src/chat/ChatStateManager.d.ts +58 -0
- package/ts_build/src/chat/ChatStateManager.js +156 -0
- package/ts_build/src/chat/ChatStateManager.js.map +1 -0
- package/ts_build/src/chat/CliChatService.d.ts +35 -0
- package/ts_build/src/chat/CliChatService.js +201 -0
- package/ts_build/src/chat/CliChatService.js.map +1 -0
- package/ts_build/src/chat/InterruptibleInput.d.ts +20 -0
- package/ts_build/src/chat/InterruptibleInput.js +109 -0
- package/ts_build/src/chat/InterruptibleInput.js.map +1 -0
- package/ts_build/src/chat/interfaces/ChatModule.d.ts +6 -0
- package/ts_build/src/chat/interfaces/ChatModule.js +3 -0
- package/ts_build/src/chat/interfaces/ChatModule.js.map +1 -0
- package/ts_build/src/chat/modules/AgentModule.d.ts +56 -0
- package/ts_build/src/chat/modules/AgentModule.js +705 -0
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -0
- package/ts_build/src/chat/modules/AskModule.d.ts +10 -0
- package/ts_build/src/chat/modules/AskModule.js +63 -0
- package/ts_build/src/chat/modules/AskModule.js.map +1 -0
- package/ts_build/src/chat/modules/BaseChatModule.d.ts +14 -0
- package/ts_build/src/chat/modules/BaseChatModule.js +32 -0
- package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -0
- package/ts_build/src/chat/modules/InternalChatModule.d.ts +24 -0
- package/ts_build/src/chat/modules/InternalChatModule.js +127 -0
- package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -0
- package/ts_build/src/chat/modules/SearchModule.d.ts +12 -0
- package/ts_build/src/chat/modules/SearchModule.js +119 -0
- package/ts_build/src/chat/modules/SearchModule.js.map +1 -0
- package/ts_build/src/chat/modules/SetupModule.d.ts +15 -0
- package/ts_build/src/chat/modules/SetupModule.js +147 -0
- package/ts_build/src/chat/modules/SetupModule.js.map +1 -0
- package/ts_build/src/chat/modules/SystemModule.d.ts +14 -0
- package/ts_build/src/chat/modules/SystemModule.js +90 -0
- package/ts_build/src/chat/modules/SystemModule.js.map +1 -0
- package/ts_build/src/chat/modules/VoiceModule.d.ts +11 -0
- package/ts_build/src/chat/modules/VoiceModule.js +57 -0
- package/ts_build/src/chat/modules/VoiceModule.js.map +1 -0
- package/ts_build/src/chat/types.d.ts +83 -0
- package/ts_build/src/chat/types.js +3 -0
- package/ts_build/src/chat/types.js.map +1 -0
- package/ts_build/src/chat.js +7 -1
- package/ts_build/src/chat.js.map +1 -1
- package/ts_build/src/chat2.d.ts +3 -0
- package/ts_build/src/chat2.js +47 -0
- package/ts_build/src/chat2.js.map +1 -0
- package/ts_build/src/cli.js +218 -37
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/anthropic.d.ts +5 -2
- package/ts_build/src/clients/anthropic.js +12 -7
- package/ts_build/src/clients/anthropic.js.map +1 -1
- package/ts_build/src/clients/gemini.d.ts +6 -3
- package/ts_build/src/clients/gemini.js +13 -7
- package/ts_build/src/clients/gemini.js.map +1 -1
- package/ts_build/src/clients/http.d.ts +1 -0
- package/ts_build/src/clients/http.js +12 -5
- package/ts_build/src/clients/http.js.map +1 -1
- package/ts_build/src/clients/index.d.ts +10 -0
- package/ts_build/src/clients/index.js +74 -4
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/clients/knowhow.d.ts +3 -1
- package/ts_build/src/clients/knowhow.js +8 -2
- package/ts_build/src/clients/knowhow.js.map +1 -1
- package/ts_build/src/clients/knowhowMcp.d.ts +20 -0
- package/ts_build/src/clients/knowhowMcp.js +86 -0
- package/ts_build/src/clients/knowhowMcp.js.map +1 -0
- package/ts_build/src/clients/openai.d.ts +5 -2
- package/ts_build/src/clients/openai.js +29 -8
- package/ts_build/src/clients/openai.js.map +1 -1
- package/ts_build/src/clients/types.d.ts +1 -0
- package/ts_build/src/clients/xai.d.ts +5 -2
- package/ts_build/src/clients/xai.js +15 -5
- package/ts_build/src/clients/xai.js.map +1 -1
- package/ts_build/src/config.js +24 -3
- package/ts_build/src/config.js.map +1 -1
- package/ts_build/src/conversion.js +6 -4
- package/ts_build/src/conversion.js.map +1 -1
- package/ts_build/src/embeddings.d.ts +2 -1
- package/ts_build/src/embeddings.js +62 -17
- package/ts_build/src/embeddings.js.map +1 -1
- package/ts_build/src/login.d.ts +1 -1
- package/ts_build/src/login.js +21 -7
- package/ts_build/src/login.js.map +1 -1
- package/ts_build/src/microphone.js.map +1 -1
- package/ts_build/src/plugins/downloader/downloader.d.ts +4 -5
- package/ts_build/src/plugins/downloader/downloader.js +55 -26
- package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
- package/ts_build/src/plugins/downloader/plugin.js +5 -3
- package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
- package/ts_build/src/plugins/plugins.js +3 -0
- package/ts_build/src/plugins/plugins.js.map +1 -1
- package/ts_build/src/processors/CustomVariables.d.ts +32 -0
- package/ts_build/src/processors/CustomVariables.js +297 -0
- package/ts_build/src/processors/CustomVariables.js.map +1 -0
- package/ts_build/src/processors/HarmonyToolProcessor.d.ts +15 -0
- package/ts_build/src/processors/HarmonyToolProcessor.js +154 -0
- package/ts_build/src/processors/HarmonyToolProcessor.js.map +1 -0
- package/ts_build/src/processors/XmlToolCallProcessor.d.ts +14 -0
- package/ts_build/src/processors/XmlToolCallProcessor.js +357 -0
- package/ts_build/src/processors/XmlToolCallProcessor.js.map +1 -0
- package/ts_build/src/processors/index.d.ts +3 -0
- package/ts_build/src/processors/index.js +7 -1
- package/ts_build/src/processors/index.js.map +1 -1
- package/ts_build/src/prompts/KnowhowConfigExamples.d.ts +2 -0
- package/ts_build/src/prompts/KnowhowConfigExamples.js +379 -0
- package/ts_build/src/prompts/KnowhowConfigExamples.js.map +1 -0
- package/ts_build/src/services/KnowhowClient.d.ts +22 -0
- package/ts_build/src/services/KnowhowClient.js +14 -2
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/Mcp.d.ts +1 -0
- package/ts_build/src/services/Mcp.js +20 -3
- package/ts_build/src/services/Mcp.js.map +1 -1
- package/ts_build/src/services/McpServer.d.ts +1 -1
- package/ts_build/src/services/McpServer.js +8 -4
- package/ts_build/src/services/McpServer.js.map +1 -1
- package/ts_build/src/services/McpWebsocketTransport.js +17 -7
- package/ts_build/src/services/McpWebsocketTransport.js.map +1 -1
- package/ts_build/src/services/MessageProcessor.d.ts +1 -1
- package/ts_build/src/services/MessageProcessor.js +4 -4
- package/ts_build/src/services/MessageProcessor.js.map +1 -1
- package/ts_build/src/services/index.d.ts +2 -0
- package/ts_build/src/services/index.js +4 -0
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +1 -0
- package/ts_build/src/services/script-execution/ScriptExecutor.js +23 -0
- package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
- package/ts_build/src/services/types.d.ts +2 -6
- package/ts_build/src/services/types.js +4 -4
- package/ts_build/src/services/types.js.map +1 -1
- package/ts_build/src/types.d.ts +11 -0
- package/ts_build/src/types.js +8 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/index.d.ts +2 -0
- package/ts_build/src/utils/index.js +102 -1
- package/ts_build/src/utils/index.js.map +1 -1
- package/ts_build/tests/XmlToolCallProcessor.test.d.ts +1 -0
- package/ts_build/tests/XmlToolCallProcessor.test.js +376 -0
- package/ts_build/tests/XmlToolCallProcessor.test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +114 -0
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +104 -0
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +74 -0
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/simple_test.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/simple_test.js +82 -0
- package/ts_build/tests/manual/ycmd/simple_test.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +14 -0
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js +20 -0
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_advanced_features.js +297 -0
- package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +3 -0
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +262 -0
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +186 -0
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +174 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +106 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +104 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +119 -0
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_discover_commands.js +243 -0
- package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_endpoints.js +120 -0
- package/ts_build/tests/manual/ycmd/test_endpoints.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +221 -0
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_final_validation.js +160 -0
- package/ts_build/tests/manual/ycmd/test_final_validation.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +37 -0
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_server_manager.js +38 -0
- package/ts_build/tests/manual/ycmd/test_server_manager.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_simple_debug.js +99 -0
- package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +128 -0
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js +66 -0
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +105 -0
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_workspace_config.js +89 -0
- package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +130 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +83 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +149 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +15 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +58 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js +195 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +3 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +110 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +1 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +36 -0
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +1 -0
- package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +2 -0
- package/ts_build/tests/manual/ycmd/working_simple_test.js +134 -0
- package/ts_build/tests/manual/ycmd/working_simple_test.js.map +1 -0
- package/tsconfig.json +3 -1
package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json
ADDED
|
@@ -0,0 +1,3121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"config": {
|
|
3
|
+
"language": "javascript",
|
|
4
|
+
"maxExercises": 10,
|
|
5
|
+
"model": "claude-sonnet-4",
|
|
6
|
+
"provider": "anthropic",
|
|
7
|
+
"limits": {
|
|
8
|
+
"maxTurns": 30,
|
|
9
|
+
"maxTime": 300,
|
|
10
|
+
"maxCost": 1
|
|
11
|
+
},
|
|
12
|
+
"outputFile": "results.json"
|
|
13
|
+
},
|
|
14
|
+
"exercises": [
|
|
15
|
+
{
|
|
16
|
+
"exerciseName": "accumulate",
|
|
17
|
+
"status": "success",
|
|
18
|
+
"turns": 16,
|
|
19
|
+
"testResult": {
|
|
20
|
+
"passed": 5,
|
|
21
|
+
"failed": 0,
|
|
22
|
+
"total": 5,
|
|
23
|
+
"skipped": 0,
|
|
24
|
+
"success": true,
|
|
25
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":5,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":5,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602146575,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"accumulate()\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulation empty\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulation empty\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate squares\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate squares\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate upcases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate upcases\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate reversed strings\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate reversed strings\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate recursively\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate recursively\"}],\"endTime\":1754602146730,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/accumulate/accumulate.spec.js\",\"startTime\":1754602146597,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
26
|
+
"details": {
|
|
27
|
+
"numFailedTestSuites": 0,
|
|
28
|
+
"numFailedTests": 0,
|
|
29
|
+
"numPassedTestSuites": 1,
|
|
30
|
+
"numPassedTests": 5,
|
|
31
|
+
"numPendingTestSuites": 0,
|
|
32
|
+
"numPendingTests": 0,
|
|
33
|
+
"numRuntimeErrorTestSuites": 0,
|
|
34
|
+
"numTodoTests": 0,
|
|
35
|
+
"numTotalTestSuites": 1,
|
|
36
|
+
"numTotalTests": 5,
|
|
37
|
+
"openHandles": [],
|
|
38
|
+
"snapshot": {
|
|
39
|
+
"added": 0,
|
|
40
|
+
"didUpdate": false,
|
|
41
|
+
"failure": false,
|
|
42
|
+
"filesAdded": 0,
|
|
43
|
+
"filesRemoved": 0,
|
|
44
|
+
"filesRemovedList": [],
|
|
45
|
+
"filesUnmatched": 0,
|
|
46
|
+
"filesUpdated": 0,
|
|
47
|
+
"matched": 0,
|
|
48
|
+
"total": 0,
|
|
49
|
+
"unchecked": 0,
|
|
50
|
+
"uncheckedKeysByFile": [],
|
|
51
|
+
"unmatched": 0,
|
|
52
|
+
"updated": 0
|
|
53
|
+
},
|
|
54
|
+
"startTime": 1754602146575,
|
|
55
|
+
"success": true,
|
|
56
|
+
"testResults": [
|
|
57
|
+
{
|
|
58
|
+
"assertionResults": [
|
|
59
|
+
{
|
|
60
|
+
"ancestorTitles": [
|
|
61
|
+
"accumulate()"
|
|
62
|
+
],
|
|
63
|
+
"duration": 1,
|
|
64
|
+
"failureDetails": [],
|
|
65
|
+
"failureMessages": [],
|
|
66
|
+
"fullName": "accumulate() accumulation empty",
|
|
67
|
+
"invocations": 1,
|
|
68
|
+
"location": null,
|
|
69
|
+
"numPassingAsserts": 1,
|
|
70
|
+
"retryReasons": [],
|
|
71
|
+
"status": "passed",
|
|
72
|
+
"title": "accumulation empty"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"ancestorTitles": [
|
|
76
|
+
"accumulate()"
|
|
77
|
+
],
|
|
78
|
+
"duration": 1,
|
|
79
|
+
"failureDetails": [],
|
|
80
|
+
"failureMessages": [],
|
|
81
|
+
"fullName": "accumulate() accumulate squares",
|
|
82
|
+
"invocations": 1,
|
|
83
|
+
"location": null,
|
|
84
|
+
"numPassingAsserts": 1,
|
|
85
|
+
"retryReasons": [],
|
|
86
|
+
"status": "passed",
|
|
87
|
+
"title": "accumulate squares"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"ancestorTitles": [
|
|
91
|
+
"accumulate()"
|
|
92
|
+
],
|
|
93
|
+
"duration": 0,
|
|
94
|
+
"failureDetails": [],
|
|
95
|
+
"failureMessages": [],
|
|
96
|
+
"fullName": "accumulate() accumulate upcases",
|
|
97
|
+
"invocations": 1,
|
|
98
|
+
"location": null,
|
|
99
|
+
"numPassingAsserts": 1,
|
|
100
|
+
"retryReasons": [],
|
|
101
|
+
"status": "passed",
|
|
102
|
+
"title": "accumulate upcases"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"ancestorTitles": [
|
|
106
|
+
"accumulate()"
|
|
107
|
+
],
|
|
108
|
+
"duration": 0,
|
|
109
|
+
"failureDetails": [],
|
|
110
|
+
"failureMessages": [],
|
|
111
|
+
"fullName": "accumulate() accumulate reversed strings",
|
|
112
|
+
"invocations": 1,
|
|
113
|
+
"location": null,
|
|
114
|
+
"numPassingAsserts": 1,
|
|
115
|
+
"retryReasons": [],
|
|
116
|
+
"status": "passed",
|
|
117
|
+
"title": "accumulate reversed strings"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"ancestorTitles": [
|
|
121
|
+
"accumulate()"
|
|
122
|
+
],
|
|
123
|
+
"duration": 0,
|
|
124
|
+
"failureDetails": [],
|
|
125
|
+
"failureMessages": [],
|
|
126
|
+
"fullName": "accumulate() accumulate recursively",
|
|
127
|
+
"invocations": 1,
|
|
128
|
+
"location": null,
|
|
129
|
+
"numPassingAsserts": 1,
|
|
130
|
+
"retryReasons": [],
|
|
131
|
+
"status": "passed",
|
|
132
|
+
"title": "accumulate recursively"
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"endTime": 1754602146730,
|
|
136
|
+
"message": "",
|
|
137
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/accumulate/accumulate.spec.js",
|
|
138
|
+
"startTime": 1754602146597,
|
|
139
|
+
"status": "passed",
|
|
140
|
+
"summary": ""
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"wasInterrupted": false
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
"timeElapsed": 62.456,
|
|
147
|
+
"cost": 0.07475238567750002,
|
|
148
|
+
"startTime": "2025-08-07T21:28:04.285Z",
|
|
149
|
+
"endTime": "2025-08-07T21:29:06.741Z",
|
|
150
|
+
"finalOutput": "I have successfully implemented the `accumulate` function and completed the coding exercise. Here's what I accomplished:\n\n## Problem Understanding\nThe exercise required implementing an `accumulate` function that takes a collection and an operation, then applies that operation to each element to produce a new collection. The key constraint was to avoid using built-in methods like `map`, `forEach`, etc.\n\n## Implementation\nI implemented the `accumulate` function in `accumulate.js`:\n\n```javascript\nexport const accumulate = (collection, operation) => {\n const result = [];\n \n for (let i = 0; i < collection.length; i++) {\n result.push(operation(collection[i]));\n }\n \n return result;\n};\n```\n\n## Solution Details\n1. **Setup**: Ran `pnpm install` to install project dependencies\n2. **Implementation**: Created a simple loop-based solution that:\n - Takes a collection and an operation function as parameters\n - Creates an empty result array\n - Iterates through each element using a basic for loop\n - Applies the operation to each element and pushes the result\n - Returns the new collection\n\n3. **Testing**: \n - First test (empty collection) passed immediately\n - Unskipped all remaining tests by changing `xtest` to `test`\n - Fixed a minor import issue that occurred during the replacement\n - All 5 tests now pass successfully\n\n## Test Results\n✅ All 5 tests pass:\n- `accumulation empty` - handles empty arrays correctly\n- `accumulate squares` - squares numbers [1,2,3] → [1,4,9]\n- `accumulate upcases` - converts strings to uppercase\n- `accumulate reversed strings` - reverses individual strings\n- `accumulate recursively` - handles nested accumulate calls\n\nThe implementation follows the exercise constraints by using basic control flow (for loop) instead of higher-order array methods, and successfully handles all test cases including edge cases like empty collections and recursive operations."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"exerciseName": "acronym",
|
|
154
|
+
"status": "success",
|
|
155
|
+
"turns": 17,
|
|
156
|
+
"testResult": {
|
|
157
|
+
"passed": 9,
|
|
158
|
+
"failed": 0,
|
|
159
|
+
"total": 9,
|
|
160
|
+
"skipped": 0,
|
|
161
|
+
"success": true,
|
|
162
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":9,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":9,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602207394,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from title cased phrases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"title cased phrases\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from other title cased phrases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"other title cased phrases\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with punctuation\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with punctuation\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with all uppercase words\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with all uppercase words\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with punctuation without whitespace\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with punctuation without whitespace\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from long phrases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"long phrases\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with consecutive delimiters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with consecutive delimiters\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with apostrophes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with apostrophes\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with underscore emphasis\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with underscore emphasis\"}],\"endTime\":1754602207512,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/acronym/acronym.spec.js\",\"startTime\":1754602207409,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
163
|
+
"details": {
|
|
164
|
+
"numFailedTestSuites": 0,
|
|
165
|
+
"numFailedTests": 0,
|
|
166
|
+
"numPassedTestSuites": 1,
|
|
167
|
+
"numPassedTests": 9,
|
|
168
|
+
"numPendingTestSuites": 0,
|
|
169
|
+
"numPendingTests": 0,
|
|
170
|
+
"numRuntimeErrorTestSuites": 0,
|
|
171
|
+
"numTodoTests": 0,
|
|
172
|
+
"numTotalTestSuites": 1,
|
|
173
|
+
"numTotalTests": 9,
|
|
174
|
+
"openHandles": [],
|
|
175
|
+
"snapshot": {
|
|
176
|
+
"added": 0,
|
|
177
|
+
"didUpdate": false,
|
|
178
|
+
"failure": false,
|
|
179
|
+
"filesAdded": 0,
|
|
180
|
+
"filesRemoved": 0,
|
|
181
|
+
"filesRemovedList": [],
|
|
182
|
+
"filesUnmatched": 0,
|
|
183
|
+
"filesUpdated": 0,
|
|
184
|
+
"matched": 0,
|
|
185
|
+
"total": 0,
|
|
186
|
+
"unchecked": 0,
|
|
187
|
+
"uncheckedKeysByFile": [],
|
|
188
|
+
"unmatched": 0,
|
|
189
|
+
"updated": 0
|
|
190
|
+
},
|
|
191
|
+
"startTime": 1754602207394,
|
|
192
|
+
"success": true,
|
|
193
|
+
"testResults": [
|
|
194
|
+
{
|
|
195
|
+
"assertionResults": [
|
|
196
|
+
{
|
|
197
|
+
"ancestorTitles": [
|
|
198
|
+
"Acronyms are produced from"
|
|
199
|
+
],
|
|
200
|
+
"duration": 1,
|
|
201
|
+
"failureDetails": [],
|
|
202
|
+
"failureMessages": [],
|
|
203
|
+
"fullName": "Acronyms are produced from title cased phrases",
|
|
204
|
+
"invocations": 1,
|
|
205
|
+
"location": null,
|
|
206
|
+
"numPassingAsserts": 1,
|
|
207
|
+
"retryReasons": [],
|
|
208
|
+
"status": "passed",
|
|
209
|
+
"title": "title cased phrases"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"ancestorTitles": [
|
|
213
|
+
"Acronyms are produced from"
|
|
214
|
+
],
|
|
215
|
+
"duration": 0,
|
|
216
|
+
"failureDetails": [],
|
|
217
|
+
"failureMessages": [],
|
|
218
|
+
"fullName": "Acronyms are produced from other title cased phrases",
|
|
219
|
+
"invocations": 1,
|
|
220
|
+
"location": null,
|
|
221
|
+
"numPassingAsserts": 1,
|
|
222
|
+
"retryReasons": [],
|
|
223
|
+
"status": "passed",
|
|
224
|
+
"title": "other title cased phrases"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"ancestorTitles": [
|
|
228
|
+
"Acronyms are produced from"
|
|
229
|
+
],
|
|
230
|
+
"duration": 0,
|
|
231
|
+
"failureDetails": [],
|
|
232
|
+
"failureMessages": [],
|
|
233
|
+
"fullName": "Acronyms are produced from phrases with punctuation",
|
|
234
|
+
"invocations": 1,
|
|
235
|
+
"location": null,
|
|
236
|
+
"numPassingAsserts": 1,
|
|
237
|
+
"retryReasons": [],
|
|
238
|
+
"status": "passed",
|
|
239
|
+
"title": "phrases with punctuation"
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"ancestorTitles": [
|
|
243
|
+
"Acronyms are produced from"
|
|
244
|
+
],
|
|
245
|
+
"duration": 0,
|
|
246
|
+
"failureDetails": [],
|
|
247
|
+
"failureMessages": [],
|
|
248
|
+
"fullName": "Acronyms are produced from phrases with all uppercase words",
|
|
249
|
+
"invocations": 1,
|
|
250
|
+
"location": null,
|
|
251
|
+
"numPassingAsserts": 1,
|
|
252
|
+
"retryReasons": [],
|
|
253
|
+
"status": "passed",
|
|
254
|
+
"title": "phrases with all uppercase words"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"ancestorTitles": [
|
|
258
|
+
"Acronyms are produced from"
|
|
259
|
+
],
|
|
260
|
+
"duration": 0,
|
|
261
|
+
"failureDetails": [],
|
|
262
|
+
"failureMessages": [],
|
|
263
|
+
"fullName": "Acronyms are produced from phrases with punctuation without whitespace",
|
|
264
|
+
"invocations": 1,
|
|
265
|
+
"location": null,
|
|
266
|
+
"numPassingAsserts": 1,
|
|
267
|
+
"retryReasons": [],
|
|
268
|
+
"status": "passed",
|
|
269
|
+
"title": "phrases with punctuation without whitespace"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"ancestorTitles": [
|
|
273
|
+
"Acronyms are produced from"
|
|
274
|
+
],
|
|
275
|
+
"duration": 0,
|
|
276
|
+
"failureDetails": [],
|
|
277
|
+
"failureMessages": [],
|
|
278
|
+
"fullName": "Acronyms are produced from long phrases",
|
|
279
|
+
"invocations": 1,
|
|
280
|
+
"location": null,
|
|
281
|
+
"numPassingAsserts": 1,
|
|
282
|
+
"retryReasons": [],
|
|
283
|
+
"status": "passed",
|
|
284
|
+
"title": "long phrases"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"ancestorTitles": [
|
|
288
|
+
"Acronyms are produced from"
|
|
289
|
+
],
|
|
290
|
+
"duration": 0,
|
|
291
|
+
"failureDetails": [],
|
|
292
|
+
"failureMessages": [],
|
|
293
|
+
"fullName": "Acronyms are produced from phrases with consecutive delimiters",
|
|
294
|
+
"invocations": 1,
|
|
295
|
+
"location": null,
|
|
296
|
+
"numPassingAsserts": 1,
|
|
297
|
+
"retryReasons": [],
|
|
298
|
+
"status": "passed",
|
|
299
|
+
"title": "phrases with consecutive delimiters"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"ancestorTitles": [
|
|
303
|
+
"Acronyms are produced from"
|
|
304
|
+
],
|
|
305
|
+
"duration": 1,
|
|
306
|
+
"failureDetails": [],
|
|
307
|
+
"failureMessages": [],
|
|
308
|
+
"fullName": "Acronyms are produced from phrases with apostrophes",
|
|
309
|
+
"invocations": 1,
|
|
310
|
+
"location": null,
|
|
311
|
+
"numPassingAsserts": 1,
|
|
312
|
+
"retryReasons": [],
|
|
313
|
+
"status": "passed",
|
|
314
|
+
"title": "phrases with apostrophes"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"ancestorTitles": [
|
|
318
|
+
"Acronyms are produced from"
|
|
319
|
+
],
|
|
320
|
+
"duration": 0,
|
|
321
|
+
"failureDetails": [],
|
|
322
|
+
"failureMessages": [],
|
|
323
|
+
"fullName": "Acronyms are produced from phrases with underscore emphasis",
|
|
324
|
+
"invocations": 1,
|
|
325
|
+
"location": null,
|
|
326
|
+
"numPassingAsserts": 1,
|
|
327
|
+
"retryReasons": [],
|
|
328
|
+
"status": "passed",
|
|
329
|
+
"title": "phrases with underscore emphasis"
|
|
330
|
+
}
|
|
331
|
+
],
|
|
332
|
+
"endTime": 1754602207512,
|
|
333
|
+
"message": "",
|
|
334
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/acronym/acronym.spec.js",
|
|
335
|
+
"startTime": 1754602207409,
|
|
336
|
+
"status": "passed",
|
|
337
|
+
"summary": ""
|
|
338
|
+
}
|
|
339
|
+
],
|
|
340
|
+
"wasInterrupted": false
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"timeElapsed": 60.758,
|
|
344
|
+
"cost": 0.07854288614999999,
|
|
345
|
+
"startTime": "2025-08-07T21:29:06.764Z",
|
|
346
|
+
"endTime": "2025-08-07T21:30:07.522Z",
|
|
347
|
+
"finalOutput": "I have successfully solved the acronym coding exercise! Here's what I accomplished:\n\n## Problem Understanding\nThe task was to convert phrases to their acronyms by:\n- Taking the first letter of each word\n- Treating hyphens as word separators (like whitespace)\n- Removing all other punctuation\n- Returning the result in uppercase\n\n## Implementation\nI implemented the `parse` function in `acronym.js` with the following logic:\n\n```javascript\nexport const parse = (phrase) => {\n // Replace hyphens with spaces and remove all other punctuation except letters and spaces\n const cleanedPhrase = phrase\n .replace(/-/g, ' ') // Replace hyphens with spaces\n .replace(/[^a-zA-Z\\s]/g, '') // Remove all non-letter, non-space characters\n .trim(); // Remove leading/trailing whitespace\n \n // Split into words, take first letter of each word, and join as uppercase\n return cleanedPhrase\n .split(/\\s+/) // Split on one or more whitespace characters\n .map(word => word.charAt(0).toUpperCase())\n .join('');\n};\n```\n\n## Project Setup and Testing\n1. Ran `npm install` to install all dependencies\n2. Initially ran the first test to verify basic functionality\n3. Converted all skipped tests (`xtest`) to active tests (`test`)\n4. Fixed a duplicate import issue that occurred during the conversion\n5. Successfully ran all tests\n\n## Results\n✅ **All 9 tests are now passing!**\n\nThe implementation correctly handles all test cases:\n- Basic title cased phrases: \"Portable Network Graphics\" → \"PNG\"\n- Mixed case phrases: \"Ruby on Rails\" → \"ROR\" \n- Punctuation handling: \"First In, First Out\" → \"FIFO\"\n- All caps words: \"GNU Image Manipulation Program\" → \"GIMP\"\n- Hyphenated words: \"Complementary metal-oxide semiconductor\" → \"CMOS\"\n- Very long phrases: \"Rolling On The Floor Laughing So Hard That My Dogs Came Over And Licked Me\" → \"ROTFLSHTMDCOALM\"\n- Consecutive delimiters: \"Something - I made up from thin air\" → \"SIMUFTA\"\n- Apostrophes: \"Halley's Comet\" → \"HC\"\n- Underscore emphasis: \"The Road _Not_ Taken\" → \"TRNT\"\n\nThe solution is complete and all tests pass successfully!"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"exerciseName": "affine-cipher",
|
|
351
|
+
"status": "success",
|
|
352
|
+
"turns": 18,
|
|
353
|
+
"testResult": {
|
|
354
|
+
"passed": 16,
|
|
355
|
+
"failed": 0,
|
|
356
|
+
"total": 16,
|
|
357
|
+
"skipped": 0,
|
|
358
|
+
"success": true,
|
|
359
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":16,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":16,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602290310,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode yes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode yes\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode no\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode no\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode OMG\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode OMG\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode O M G\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode O M G\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode mindblowingly\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode mindblowingly\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode numbers\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode deep thought\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode deep thought\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode all the letters\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":5,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode with a not coprime to m\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode with a not coprime to m\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode exercism\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode exercism\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode a sentence\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode a sentence\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode numbers\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode all the letters\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode with no spaces in input\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with no spaces in input\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode with too many spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with too many spaces\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode with a not coprime to m\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with a not coprime to m\"}],\"endTime\":1754602290439,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js\",\"startTime\":1754602290329,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
360
|
+
"details": {
|
|
361
|
+
"numFailedTestSuites": 0,
|
|
362
|
+
"numFailedTests": 0,
|
|
363
|
+
"numPassedTestSuites": 1,
|
|
364
|
+
"numPassedTests": 16,
|
|
365
|
+
"numPendingTestSuites": 0,
|
|
366
|
+
"numPendingTests": 0,
|
|
367
|
+
"numRuntimeErrorTestSuites": 0,
|
|
368
|
+
"numTodoTests": 0,
|
|
369
|
+
"numTotalTestSuites": 1,
|
|
370
|
+
"numTotalTests": 16,
|
|
371
|
+
"openHandles": [],
|
|
372
|
+
"snapshot": {
|
|
373
|
+
"added": 0,
|
|
374
|
+
"didUpdate": false,
|
|
375
|
+
"failure": false,
|
|
376
|
+
"filesAdded": 0,
|
|
377
|
+
"filesRemoved": 0,
|
|
378
|
+
"filesRemovedList": [],
|
|
379
|
+
"filesUnmatched": 0,
|
|
380
|
+
"filesUpdated": 0,
|
|
381
|
+
"matched": 0,
|
|
382
|
+
"total": 0,
|
|
383
|
+
"unchecked": 0,
|
|
384
|
+
"uncheckedKeysByFile": [],
|
|
385
|
+
"unmatched": 0,
|
|
386
|
+
"updated": 0
|
|
387
|
+
},
|
|
388
|
+
"startTime": 1754602290310,
|
|
389
|
+
"success": true,
|
|
390
|
+
"testResults": [
|
|
391
|
+
{
|
|
392
|
+
"assertionResults": [
|
|
393
|
+
{
|
|
394
|
+
"ancestorTitles": [
|
|
395
|
+
"Affine cipher",
|
|
396
|
+
"encode"
|
|
397
|
+
],
|
|
398
|
+
"duration": 1,
|
|
399
|
+
"failureDetails": [],
|
|
400
|
+
"failureMessages": [],
|
|
401
|
+
"fullName": "Affine cipher encode encode yes",
|
|
402
|
+
"invocations": 1,
|
|
403
|
+
"location": null,
|
|
404
|
+
"numPassingAsserts": 1,
|
|
405
|
+
"retryReasons": [],
|
|
406
|
+
"status": "passed",
|
|
407
|
+
"title": "encode yes"
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
"ancestorTitles": [
|
|
411
|
+
"Affine cipher",
|
|
412
|
+
"encode"
|
|
413
|
+
],
|
|
414
|
+
"duration": 1,
|
|
415
|
+
"failureDetails": [],
|
|
416
|
+
"failureMessages": [],
|
|
417
|
+
"fullName": "Affine cipher encode encode no",
|
|
418
|
+
"invocations": 1,
|
|
419
|
+
"location": null,
|
|
420
|
+
"numPassingAsserts": 1,
|
|
421
|
+
"retryReasons": [],
|
|
422
|
+
"status": "passed",
|
|
423
|
+
"title": "encode no"
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
"ancestorTitles": [
|
|
427
|
+
"Affine cipher",
|
|
428
|
+
"encode"
|
|
429
|
+
],
|
|
430
|
+
"duration": 0,
|
|
431
|
+
"failureDetails": [],
|
|
432
|
+
"failureMessages": [],
|
|
433
|
+
"fullName": "Affine cipher encode encode OMG",
|
|
434
|
+
"invocations": 1,
|
|
435
|
+
"location": null,
|
|
436
|
+
"numPassingAsserts": 1,
|
|
437
|
+
"retryReasons": [],
|
|
438
|
+
"status": "passed",
|
|
439
|
+
"title": "encode OMG"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"ancestorTitles": [
|
|
443
|
+
"Affine cipher",
|
|
444
|
+
"encode"
|
|
445
|
+
],
|
|
446
|
+
"duration": 0,
|
|
447
|
+
"failureDetails": [],
|
|
448
|
+
"failureMessages": [],
|
|
449
|
+
"fullName": "Affine cipher encode encode O M G",
|
|
450
|
+
"invocations": 1,
|
|
451
|
+
"location": null,
|
|
452
|
+
"numPassingAsserts": 1,
|
|
453
|
+
"retryReasons": [],
|
|
454
|
+
"status": "passed",
|
|
455
|
+
"title": "encode O M G"
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
"ancestorTitles": [
|
|
459
|
+
"Affine cipher",
|
|
460
|
+
"encode"
|
|
461
|
+
],
|
|
462
|
+
"duration": 0,
|
|
463
|
+
"failureDetails": [],
|
|
464
|
+
"failureMessages": [],
|
|
465
|
+
"fullName": "Affine cipher encode encode mindblowingly",
|
|
466
|
+
"invocations": 1,
|
|
467
|
+
"location": null,
|
|
468
|
+
"numPassingAsserts": 1,
|
|
469
|
+
"retryReasons": [],
|
|
470
|
+
"status": "passed",
|
|
471
|
+
"title": "encode mindblowingly"
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
"ancestorTitles": [
|
|
475
|
+
"Affine cipher",
|
|
476
|
+
"encode"
|
|
477
|
+
],
|
|
478
|
+
"duration": 0,
|
|
479
|
+
"failureDetails": [],
|
|
480
|
+
"failureMessages": [],
|
|
481
|
+
"fullName": "Affine cipher encode encode numbers",
|
|
482
|
+
"invocations": 1,
|
|
483
|
+
"location": null,
|
|
484
|
+
"numPassingAsserts": 1,
|
|
485
|
+
"retryReasons": [],
|
|
486
|
+
"status": "passed",
|
|
487
|
+
"title": "encode numbers"
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"ancestorTitles": [
|
|
491
|
+
"Affine cipher",
|
|
492
|
+
"encode"
|
|
493
|
+
],
|
|
494
|
+
"duration": 0,
|
|
495
|
+
"failureDetails": [],
|
|
496
|
+
"failureMessages": [],
|
|
497
|
+
"fullName": "Affine cipher encode encode deep thought",
|
|
498
|
+
"invocations": 1,
|
|
499
|
+
"location": null,
|
|
500
|
+
"numPassingAsserts": 1,
|
|
501
|
+
"retryReasons": [],
|
|
502
|
+
"status": "passed",
|
|
503
|
+
"title": "encode deep thought"
|
|
504
|
+
},
|
|
505
|
+
{
|
|
506
|
+
"ancestorTitles": [
|
|
507
|
+
"Affine cipher",
|
|
508
|
+
"encode"
|
|
509
|
+
],
|
|
510
|
+
"duration": 0,
|
|
511
|
+
"failureDetails": [],
|
|
512
|
+
"failureMessages": [],
|
|
513
|
+
"fullName": "Affine cipher encode encode all the letters",
|
|
514
|
+
"invocations": 1,
|
|
515
|
+
"location": null,
|
|
516
|
+
"numPassingAsserts": 1,
|
|
517
|
+
"retryReasons": [],
|
|
518
|
+
"status": "passed",
|
|
519
|
+
"title": "encode all the letters"
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
"ancestorTitles": [
|
|
523
|
+
"Affine cipher",
|
|
524
|
+
"encode"
|
|
525
|
+
],
|
|
526
|
+
"duration": 5,
|
|
527
|
+
"failureDetails": [],
|
|
528
|
+
"failureMessages": [],
|
|
529
|
+
"fullName": "Affine cipher encode encode with a not coprime to m",
|
|
530
|
+
"invocations": 1,
|
|
531
|
+
"location": null,
|
|
532
|
+
"numPassingAsserts": 1,
|
|
533
|
+
"retryReasons": [],
|
|
534
|
+
"status": "passed",
|
|
535
|
+
"title": "encode with a not coprime to m"
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
"ancestorTitles": [
|
|
539
|
+
"Affine cipher",
|
|
540
|
+
"decode"
|
|
541
|
+
],
|
|
542
|
+
"duration": 1,
|
|
543
|
+
"failureDetails": [],
|
|
544
|
+
"failureMessages": [],
|
|
545
|
+
"fullName": "Affine cipher decode decode exercism",
|
|
546
|
+
"invocations": 1,
|
|
547
|
+
"location": null,
|
|
548
|
+
"numPassingAsserts": 1,
|
|
549
|
+
"retryReasons": [],
|
|
550
|
+
"status": "passed",
|
|
551
|
+
"title": "decode exercism"
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
"ancestorTitles": [
|
|
555
|
+
"Affine cipher",
|
|
556
|
+
"decode"
|
|
557
|
+
],
|
|
558
|
+
"duration": 0,
|
|
559
|
+
"failureDetails": [],
|
|
560
|
+
"failureMessages": [],
|
|
561
|
+
"fullName": "Affine cipher decode decode a sentence",
|
|
562
|
+
"invocations": 1,
|
|
563
|
+
"location": null,
|
|
564
|
+
"numPassingAsserts": 1,
|
|
565
|
+
"retryReasons": [],
|
|
566
|
+
"status": "passed",
|
|
567
|
+
"title": "decode a sentence"
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"ancestorTitles": [
|
|
571
|
+
"Affine cipher",
|
|
572
|
+
"decode"
|
|
573
|
+
],
|
|
574
|
+
"duration": 0,
|
|
575
|
+
"failureDetails": [],
|
|
576
|
+
"failureMessages": [],
|
|
577
|
+
"fullName": "Affine cipher decode decode numbers",
|
|
578
|
+
"invocations": 1,
|
|
579
|
+
"location": null,
|
|
580
|
+
"numPassingAsserts": 1,
|
|
581
|
+
"retryReasons": [],
|
|
582
|
+
"status": "passed",
|
|
583
|
+
"title": "decode numbers"
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
"ancestorTitles": [
|
|
587
|
+
"Affine cipher",
|
|
588
|
+
"decode"
|
|
589
|
+
],
|
|
590
|
+
"duration": 0,
|
|
591
|
+
"failureDetails": [],
|
|
592
|
+
"failureMessages": [],
|
|
593
|
+
"fullName": "Affine cipher decode decode all the letters",
|
|
594
|
+
"invocations": 1,
|
|
595
|
+
"location": null,
|
|
596
|
+
"numPassingAsserts": 1,
|
|
597
|
+
"retryReasons": [],
|
|
598
|
+
"status": "passed",
|
|
599
|
+
"title": "decode all the letters"
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"ancestorTitles": [
|
|
603
|
+
"Affine cipher",
|
|
604
|
+
"decode"
|
|
605
|
+
],
|
|
606
|
+
"duration": 0,
|
|
607
|
+
"failureDetails": [],
|
|
608
|
+
"failureMessages": [],
|
|
609
|
+
"fullName": "Affine cipher decode decode with no spaces in input",
|
|
610
|
+
"invocations": 1,
|
|
611
|
+
"location": null,
|
|
612
|
+
"numPassingAsserts": 1,
|
|
613
|
+
"retryReasons": [],
|
|
614
|
+
"status": "passed",
|
|
615
|
+
"title": "decode with no spaces in input"
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"ancestorTitles": [
|
|
619
|
+
"Affine cipher",
|
|
620
|
+
"decode"
|
|
621
|
+
],
|
|
622
|
+
"duration": 0,
|
|
623
|
+
"failureDetails": [],
|
|
624
|
+
"failureMessages": [],
|
|
625
|
+
"fullName": "Affine cipher decode decode with too many spaces",
|
|
626
|
+
"invocations": 1,
|
|
627
|
+
"location": null,
|
|
628
|
+
"numPassingAsserts": 1,
|
|
629
|
+
"retryReasons": [],
|
|
630
|
+
"status": "passed",
|
|
631
|
+
"title": "decode with too many spaces"
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
"ancestorTitles": [
|
|
635
|
+
"Affine cipher",
|
|
636
|
+
"decode"
|
|
637
|
+
],
|
|
638
|
+
"duration": 1,
|
|
639
|
+
"failureDetails": [],
|
|
640
|
+
"failureMessages": [],
|
|
641
|
+
"fullName": "Affine cipher decode decode with a not coprime to m",
|
|
642
|
+
"invocations": 1,
|
|
643
|
+
"location": null,
|
|
644
|
+
"numPassingAsserts": 1,
|
|
645
|
+
"retryReasons": [],
|
|
646
|
+
"status": "passed",
|
|
647
|
+
"title": "decode with a not coprime to m"
|
|
648
|
+
}
|
|
649
|
+
],
|
|
650
|
+
"endTime": 1754602290439,
|
|
651
|
+
"message": "",
|
|
652
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js",
|
|
653
|
+
"startTime": 1754602290329,
|
|
654
|
+
"status": "passed",
|
|
655
|
+
"summary": ""
|
|
656
|
+
}
|
|
657
|
+
],
|
|
658
|
+
"wasInterrupted": false
|
|
659
|
+
}
|
|
660
|
+
},
|
|
661
|
+
"timeElapsed": 82.91,
|
|
662
|
+
"cost": 0.118799827695,
|
|
663
|
+
"startTime": "2025-08-07T21:30:07.540Z",
|
|
664
|
+
"endTime": "2025-08-07T21:31:30.450Z",
|
|
665
|
+
"finalOutput": "I have successfully implemented the affine cipher coding exercise! Here's what I accomplished:\n\n## Implementation Summary\n\nI implemented a complete affine cipher system with both encryption and decryption functions that pass all 16 test cases.\n\n### Key Features Implemented:\n\n1. **Encode Function**: \n - Uses the formula `E(x) = (a*i + b) mod m` where m=26\n - Converts input to lowercase and processes only letters and digits\n - Groups output into chunks of 5 characters separated by spaces\n - Preserves digits but skips spaces and punctuation\n\n2. **Decode Function**:\n - Uses the formula `D(y) = (a^-1)(y - b) mod m`\n - Finds the modular multiplicative inverse using Extended Euclidean Algorithm\n - Handles negative modular arithmetic correctly with `((result % m) + m) % m`\n - Processes input ignoring spaces and non-alphanumeric characters\n\n3. **Helper Functions**:\n - `gcd()`: Calculates greatest common divisor\n - `arecoprime()`: Checks if two numbers are coprime\n - `modularInverse()`: Finds modular multiplicative inverse using Extended Euclidean Algorithm\n - `groupText()`: Groups text into 5-character chunks\n\n4. **Error Handling**:\n - Validates that `a` and `m` are coprime before encryption/decryption\n - Throws appropriate error message: \"a and m must be coprime.\"\n\n### Test Results:\nAll 16 tests are now passing:\n- ✅ 9 encoding tests (including error cases)\n- ✅ 7 decoding tests (including error cases)\n\nThe implementation correctly handles:\n- Basic encryption/decryption\n- Numbers preservation\n- Space and punctuation filtering\n- Grouping output in 5-character chunks\n- Error detection for non-coprime keys\n- Edge cases like extra spaces and no spaces in input\n\nThe solution follows the mathematical principles of the affine cipher while handling all the practical requirements specified in the exercise."
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"exerciseName": "all-your-base",
|
|
669
|
+
"status": "success",
|
|
670
|
+
"turns": 16,
|
|
671
|
+
"testResult": {
|
|
672
|
+
"passed": 21,
|
|
673
|
+
"failed": 0,
|
|
674
|
+
"total": 21,
|
|
675
|
+
"skipped": 0,
|
|
676
|
+
"success": true,
|
|
677
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":21,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":21,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602348462,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Converter\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter single bit one to decimal\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"single bit one to decimal\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter binary to single decimal\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"binary to single decimal\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter single decimal to binary\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"single decimal to binary\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter binary to multiple decimal\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"binary to multiple decimal\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter decimal to binary\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decimal to binary\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter trinary to hexadecimal\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"trinary to hexadecimal\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter hexadecimal to trinary\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"hexadecimal to trinary\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter 15-bit integer\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"15-bit integer\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":4,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter empty list\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"empty list\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter single zero\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"single zero\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter multiple zeros\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"multiple zeros\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter leading zeros\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"leading zeros\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter negative digit\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"negative digit\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter invalid positive digit\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"invalid positive digit\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter first base is one\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"first base is one\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter second base is one\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"second base is one\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter first base is zero\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"first base is zero\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter second base is zero\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"second base is zero\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter first base is negative\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"first base is negative\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter second base is negative\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"second base is negative\"},{\"ancestorTitles\":[\"Converter\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Converter both bases are negative\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"both bases are negative\"}],\"endTime\":1754602348572,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/all-your-base/all-your-base.spec.js\",\"startTime\":1754602348474,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
678
|
+
"details": {
|
|
679
|
+
"numFailedTestSuites": 0,
|
|
680
|
+
"numFailedTests": 0,
|
|
681
|
+
"numPassedTestSuites": 1,
|
|
682
|
+
"numPassedTests": 21,
|
|
683
|
+
"numPendingTestSuites": 0,
|
|
684
|
+
"numPendingTests": 0,
|
|
685
|
+
"numRuntimeErrorTestSuites": 0,
|
|
686
|
+
"numTodoTests": 0,
|
|
687
|
+
"numTotalTestSuites": 1,
|
|
688
|
+
"numTotalTests": 21,
|
|
689
|
+
"openHandles": [],
|
|
690
|
+
"snapshot": {
|
|
691
|
+
"added": 0,
|
|
692
|
+
"didUpdate": false,
|
|
693
|
+
"failure": false,
|
|
694
|
+
"filesAdded": 0,
|
|
695
|
+
"filesRemoved": 0,
|
|
696
|
+
"filesRemovedList": [],
|
|
697
|
+
"filesUnmatched": 0,
|
|
698
|
+
"filesUpdated": 0,
|
|
699
|
+
"matched": 0,
|
|
700
|
+
"total": 0,
|
|
701
|
+
"unchecked": 0,
|
|
702
|
+
"uncheckedKeysByFile": [],
|
|
703
|
+
"unmatched": 0,
|
|
704
|
+
"updated": 0
|
|
705
|
+
},
|
|
706
|
+
"startTime": 1754602348462,
|
|
707
|
+
"success": true,
|
|
708
|
+
"testResults": [
|
|
709
|
+
{
|
|
710
|
+
"assertionResults": [
|
|
711
|
+
{
|
|
712
|
+
"ancestorTitles": [
|
|
713
|
+
"Converter"
|
|
714
|
+
],
|
|
715
|
+
"duration": 1,
|
|
716
|
+
"failureDetails": [],
|
|
717
|
+
"failureMessages": [],
|
|
718
|
+
"fullName": "Converter single bit one to decimal",
|
|
719
|
+
"invocations": 1,
|
|
720
|
+
"location": null,
|
|
721
|
+
"numPassingAsserts": 1,
|
|
722
|
+
"retryReasons": [],
|
|
723
|
+
"status": "passed",
|
|
724
|
+
"title": "single bit one to decimal"
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
"ancestorTitles": [
|
|
728
|
+
"Converter"
|
|
729
|
+
],
|
|
730
|
+
"duration": 0,
|
|
731
|
+
"failureDetails": [],
|
|
732
|
+
"failureMessages": [],
|
|
733
|
+
"fullName": "Converter binary to single decimal",
|
|
734
|
+
"invocations": 1,
|
|
735
|
+
"location": null,
|
|
736
|
+
"numPassingAsserts": 1,
|
|
737
|
+
"retryReasons": [],
|
|
738
|
+
"status": "passed",
|
|
739
|
+
"title": "binary to single decimal"
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
"ancestorTitles": [
|
|
743
|
+
"Converter"
|
|
744
|
+
],
|
|
745
|
+
"duration": 1,
|
|
746
|
+
"failureDetails": [],
|
|
747
|
+
"failureMessages": [],
|
|
748
|
+
"fullName": "Converter single decimal to binary",
|
|
749
|
+
"invocations": 1,
|
|
750
|
+
"location": null,
|
|
751
|
+
"numPassingAsserts": 1,
|
|
752
|
+
"retryReasons": [],
|
|
753
|
+
"status": "passed",
|
|
754
|
+
"title": "single decimal to binary"
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"ancestorTitles": [
|
|
758
|
+
"Converter"
|
|
759
|
+
],
|
|
760
|
+
"duration": 0,
|
|
761
|
+
"failureDetails": [],
|
|
762
|
+
"failureMessages": [],
|
|
763
|
+
"fullName": "Converter binary to multiple decimal",
|
|
764
|
+
"invocations": 1,
|
|
765
|
+
"location": null,
|
|
766
|
+
"numPassingAsserts": 1,
|
|
767
|
+
"retryReasons": [],
|
|
768
|
+
"status": "passed",
|
|
769
|
+
"title": "binary to multiple decimal"
|
|
770
|
+
},
|
|
771
|
+
{
|
|
772
|
+
"ancestorTitles": [
|
|
773
|
+
"Converter"
|
|
774
|
+
],
|
|
775
|
+
"duration": 0,
|
|
776
|
+
"failureDetails": [],
|
|
777
|
+
"failureMessages": [],
|
|
778
|
+
"fullName": "Converter decimal to binary",
|
|
779
|
+
"invocations": 1,
|
|
780
|
+
"location": null,
|
|
781
|
+
"numPassingAsserts": 1,
|
|
782
|
+
"retryReasons": [],
|
|
783
|
+
"status": "passed",
|
|
784
|
+
"title": "decimal to binary"
|
|
785
|
+
},
|
|
786
|
+
{
|
|
787
|
+
"ancestorTitles": [
|
|
788
|
+
"Converter"
|
|
789
|
+
],
|
|
790
|
+
"duration": 0,
|
|
791
|
+
"failureDetails": [],
|
|
792
|
+
"failureMessages": [],
|
|
793
|
+
"fullName": "Converter trinary to hexadecimal",
|
|
794
|
+
"invocations": 1,
|
|
795
|
+
"location": null,
|
|
796
|
+
"numPassingAsserts": 1,
|
|
797
|
+
"retryReasons": [],
|
|
798
|
+
"status": "passed",
|
|
799
|
+
"title": "trinary to hexadecimal"
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
"ancestorTitles": [
|
|
803
|
+
"Converter"
|
|
804
|
+
],
|
|
805
|
+
"duration": 0,
|
|
806
|
+
"failureDetails": [],
|
|
807
|
+
"failureMessages": [],
|
|
808
|
+
"fullName": "Converter hexadecimal to trinary",
|
|
809
|
+
"invocations": 1,
|
|
810
|
+
"location": null,
|
|
811
|
+
"numPassingAsserts": 1,
|
|
812
|
+
"retryReasons": [],
|
|
813
|
+
"status": "passed",
|
|
814
|
+
"title": "hexadecimal to trinary"
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
"ancestorTitles": [
|
|
818
|
+
"Converter"
|
|
819
|
+
],
|
|
820
|
+
"duration": 1,
|
|
821
|
+
"failureDetails": [],
|
|
822
|
+
"failureMessages": [],
|
|
823
|
+
"fullName": "Converter 15-bit integer",
|
|
824
|
+
"invocations": 1,
|
|
825
|
+
"location": null,
|
|
826
|
+
"numPassingAsserts": 1,
|
|
827
|
+
"retryReasons": [],
|
|
828
|
+
"status": "passed",
|
|
829
|
+
"title": "15-bit integer"
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"ancestorTitles": [
|
|
833
|
+
"Converter"
|
|
834
|
+
],
|
|
835
|
+
"duration": 4,
|
|
836
|
+
"failureDetails": [],
|
|
837
|
+
"failureMessages": [],
|
|
838
|
+
"fullName": "Converter empty list",
|
|
839
|
+
"invocations": 1,
|
|
840
|
+
"location": null,
|
|
841
|
+
"numPassingAsserts": 1,
|
|
842
|
+
"retryReasons": [],
|
|
843
|
+
"status": "passed",
|
|
844
|
+
"title": "empty list"
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
"ancestorTitles": [
|
|
848
|
+
"Converter"
|
|
849
|
+
],
|
|
850
|
+
"duration": 0,
|
|
851
|
+
"failureDetails": [],
|
|
852
|
+
"failureMessages": [],
|
|
853
|
+
"fullName": "Converter single zero",
|
|
854
|
+
"invocations": 1,
|
|
855
|
+
"location": null,
|
|
856
|
+
"numPassingAsserts": 1,
|
|
857
|
+
"retryReasons": [],
|
|
858
|
+
"status": "passed",
|
|
859
|
+
"title": "single zero"
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"ancestorTitles": [
|
|
863
|
+
"Converter"
|
|
864
|
+
],
|
|
865
|
+
"duration": 0,
|
|
866
|
+
"failureDetails": [],
|
|
867
|
+
"failureMessages": [],
|
|
868
|
+
"fullName": "Converter multiple zeros",
|
|
869
|
+
"invocations": 1,
|
|
870
|
+
"location": null,
|
|
871
|
+
"numPassingAsserts": 1,
|
|
872
|
+
"retryReasons": [],
|
|
873
|
+
"status": "passed",
|
|
874
|
+
"title": "multiple zeros"
|
|
875
|
+
},
|
|
876
|
+
{
|
|
877
|
+
"ancestorTitles": [
|
|
878
|
+
"Converter"
|
|
879
|
+
],
|
|
880
|
+
"duration": 1,
|
|
881
|
+
"failureDetails": [],
|
|
882
|
+
"failureMessages": [],
|
|
883
|
+
"fullName": "Converter leading zeros",
|
|
884
|
+
"invocations": 1,
|
|
885
|
+
"location": null,
|
|
886
|
+
"numPassingAsserts": 1,
|
|
887
|
+
"retryReasons": [],
|
|
888
|
+
"status": "passed",
|
|
889
|
+
"title": "leading zeros"
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"ancestorTitles": [
|
|
893
|
+
"Converter"
|
|
894
|
+
],
|
|
895
|
+
"duration": 0,
|
|
896
|
+
"failureDetails": [],
|
|
897
|
+
"failureMessages": [],
|
|
898
|
+
"fullName": "Converter negative digit",
|
|
899
|
+
"invocations": 1,
|
|
900
|
+
"location": null,
|
|
901
|
+
"numPassingAsserts": 1,
|
|
902
|
+
"retryReasons": [],
|
|
903
|
+
"status": "passed",
|
|
904
|
+
"title": "negative digit"
|
|
905
|
+
},
|
|
906
|
+
{
|
|
907
|
+
"ancestorTitles": [
|
|
908
|
+
"Converter"
|
|
909
|
+
],
|
|
910
|
+
"duration": 0,
|
|
911
|
+
"failureDetails": [],
|
|
912
|
+
"failureMessages": [],
|
|
913
|
+
"fullName": "Converter invalid positive digit",
|
|
914
|
+
"invocations": 1,
|
|
915
|
+
"location": null,
|
|
916
|
+
"numPassingAsserts": 1,
|
|
917
|
+
"retryReasons": [],
|
|
918
|
+
"status": "passed",
|
|
919
|
+
"title": "invalid positive digit"
|
|
920
|
+
},
|
|
921
|
+
{
|
|
922
|
+
"ancestorTitles": [
|
|
923
|
+
"Converter"
|
|
924
|
+
],
|
|
925
|
+
"duration": 1,
|
|
926
|
+
"failureDetails": [],
|
|
927
|
+
"failureMessages": [],
|
|
928
|
+
"fullName": "Converter first base is one",
|
|
929
|
+
"invocations": 1,
|
|
930
|
+
"location": null,
|
|
931
|
+
"numPassingAsserts": 1,
|
|
932
|
+
"retryReasons": [],
|
|
933
|
+
"status": "passed",
|
|
934
|
+
"title": "first base is one"
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
"ancestorTitles": [
|
|
938
|
+
"Converter"
|
|
939
|
+
],
|
|
940
|
+
"duration": 0,
|
|
941
|
+
"failureDetails": [],
|
|
942
|
+
"failureMessages": [],
|
|
943
|
+
"fullName": "Converter second base is one",
|
|
944
|
+
"invocations": 1,
|
|
945
|
+
"location": null,
|
|
946
|
+
"numPassingAsserts": 1,
|
|
947
|
+
"retryReasons": [],
|
|
948
|
+
"status": "passed",
|
|
949
|
+
"title": "second base is one"
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"ancestorTitles": [
|
|
953
|
+
"Converter"
|
|
954
|
+
],
|
|
955
|
+
"duration": 0,
|
|
956
|
+
"failureDetails": [],
|
|
957
|
+
"failureMessages": [],
|
|
958
|
+
"fullName": "Converter first base is zero",
|
|
959
|
+
"invocations": 1,
|
|
960
|
+
"location": null,
|
|
961
|
+
"numPassingAsserts": 1,
|
|
962
|
+
"retryReasons": [],
|
|
963
|
+
"status": "passed",
|
|
964
|
+
"title": "first base is zero"
|
|
965
|
+
},
|
|
966
|
+
{
|
|
967
|
+
"ancestorTitles": [
|
|
968
|
+
"Converter"
|
|
969
|
+
],
|
|
970
|
+
"duration": 0,
|
|
971
|
+
"failureDetails": [],
|
|
972
|
+
"failureMessages": [],
|
|
973
|
+
"fullName": "Converter second base is zero",
|
|
974
|
+
"invocations": 1,
|
|
975
|
+
"location": null,
|
|
976
|
+
"numPassingAsserts": 1,
|
|
977
|
+
"retryReasons": [],
|
|
978
|
+
"status": "passed",
|
|
979
|
+
"title": "second base is zero"
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
"ancestorTitles": [
|
|
983
|
+
"Converter"
|
|
984
|
+
],
|
|
985
|
+
"duration": 0,
|
|
986
|
+
"failureDetails": [],
|
|
987
|
+
"failureMessages": [],
|
|
988
|
+
"fullName": "Converter first base is negative",
|
|
989
|
+
"invocations": 1,
|
|
990
|
+
"location": null,
|
|
991
|
+
"numPassingAsserts": 1,
|
|
992
|
+
"retryReasons": [],
|
|
993
|
+
"status": "passed",
|
|
994
|
+
"title": "first base is negative"
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
"ancestorTitles": [
|
|
998
|
+
"Converter"
|
|
999
|
+
],
|
|
1000
|
+
"duration": 1,
|
|
1001
|
+
"failureDetails": [],
|
|
1002
|
+
"failureMessages": [],
|
|
1003
|
+
"fullName": "Converter second base is negative",
|
|
1004
|
+
"invocations": 1,
|
|
1005
|
+
"location": null,
|
|
1006
|
+
"numPassingAsserts": 1,
|
|
1007
|
+
"retryReasons": [],
|
|
1008
|
+
"status": "passed",
|
|
1009
|
+
"title": "second base is negative"
|
|
1010
|
+
},
|
|
1011
|
+
{
|
|
1012
|
+
"ancestorTitles": [
|
|
1013
|
+
"Converter"
|
|
1014
|
+
],
|
|
1015
|
+
"duration": 0,
|
|
1016
|
+
"failureDetails": [],
|
|
1017
|
+
"failureMessages": [],
|
|
1018
|
+
"fullName": "Converter both bases are negative",
|
|
1019
|
+
"invocations": 1,
|
|
1020
|
+
"location": null,
|
|
1021
|
+
"numPassingAsserts": 1,
|
|
1022
|
+
"retryReasons": [],
|
|
1023
|
+
"status": "passed",
|
|
1024
|
+
"title": "both bases are negative"
|
|
1025
|
+
}
|
|
1026
|
+
],
|
|
1027
|
+
"endTime": 1754602348572,
|
|
1028
|
+
"message": "",
|
|
1029
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/all-your-base/all-your-base.spec.js",
|
|
1030
|
+
"startTime": 1754602348474,
|
|
1031
|
+
"status": "passed",
|
|
1032
|
+
"summary": ""
|
|
1033
|
+
}
|
|
1034
|
+
],
|
|
1035
|
+
"wasInterrupted": false
|
|
1036
|
+
}
|
|
1037
|
+
},
|
|
1038
|
+
"timeElapsed": 58.117,
|
|
1039
|
+
"cost": 0.08565512086124999,
|
|
1040
|
+
"startTime": "2025-08-07T21:31:30.466Z",
|
|
1041
|
+
"endTime": "2025-08-07T21:32:28.583Z",
|
|
1042
|
+
"finalOutput": "I have successfully solved the all-your-base coding exercise! Here's what I accomplished:\n\n## Problem Understanding\nThe exercise required implementing a `convert` function that converts numbers from one base to another. The function takes three parameters:\n- `digits`: An array of digits representing a number in the input base\n- `inputBase`: The base of the input number\n- `outputBase`: The base to convert the number to\n\n## Implementation\nI implemented a complete solution in `all-your-base.js` that:\n\n1. **Validates input bases**: Ensures both input and output bases are >= 2\n2. **Validates input format**: \n - Checks for empty arrays\n - Prevents leading zeros (except single zero)\n - Prevents multiple zeros\n - Ensures all digits are valid for the given base (0 <= digit < inputBase)\n3. **Handles special cases**: Properly handles single zero input\n4. **Converts between bases**: \n - First converts from input base to decimal using positional notation\n - Then converts from decimal to output base using repeated division\n\n## Key Features\n- Proper error handling with specific error messages:\n - \"Wrong input base\" for invalid input bases\n - \"Wrong output base\" for invalid output bases \n - \"Input has wrong format\" for invalid digit arrays\n- Handles edge cases like single zero, leading zeros, and invalid digits\n- Works with any base from 2 to any reasonable number (tested up to base 97)\n\n## Testing Results\n- Set up the project with `npm install`\n- All 21 tests now pass successfully:\n - Basic conversions (binary ↔ decimal, trinary ↔ hexadecimal)\n - Edge cases (single zero, empty arrays, leading zeros)\n - Error conditions (invalid bases, invalid digits)\n - Complex conversions with large bases\n\nThe solution is robust, handles all specified requirements, and passes 100% of the test suite (21/21 tests passing)."
|
|
1043
|
+
},
|
|
1044
|
+
{
|
|
1045
|
+
"exerciseName": "allergies",
|
|
1046
|
+
"status": "success",
|
|
1047
|
+
"turns": 16,
|
|
1048
|
+
"testResult": {
|
|
1049
|
+
"passed": 50,
|
|
1050
|
+
"failed": 0,
|
|
1051
|
+
"total": 50,
|
|
1052
|
+
"skipped": 0,
|
|
1053
|
+
"success": true,
|
|
1054
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":50,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":50,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602404881,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic only to eggs\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to eggs\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic to eggs and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to eggs and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic to something, but not eggs\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not eggs\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic only to peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic to peanuts and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to peanuts and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic to something, but not peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic only to shellfish\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to shellfish\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic to shellfish and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to shellfish and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic to something, but not shellfish\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not shellfish\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic only to strawberries\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to strawberries\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic to strawberries and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to strawberries and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic to something, but not strawberries\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not strawberries\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic only to tomatoes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to tomatoes\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic to tomatoes and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to tomatoes and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic to something, but not tomatoes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not tomatoes\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic only to chocolate\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to chocolate\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic to chocolate and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to chocolate and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic to something, but not chocolate\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not chocolate\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic only to pollen\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to pollen\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic to pollen and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to pollen and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic to something, but not pollen\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not pollen\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic only to cats\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to cats\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic to cats and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to cats and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic to something, but not cats\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not cats\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: no allergies\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no allergies\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: just eggs\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"just eggs\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: just peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"just peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: just strawberries\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"just strawberries\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: eggs and peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"eggs and peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: more than eggs but not peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"more than eggs but not peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: lots of stuff\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"lots of stuff\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"everything\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: no allergen score parts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no allergen score parts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: no allergen score parts without highest valid score\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no allergen score parts without highest valid score\"}],\"endTime\":1754602404981,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/allergies/allergies.spec.js\",\"startTime\":1754602404892,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
1055
|
+
"details": {
|
|
1056
|
+
"numFailedTestSuites": 0,
|
|
1057
|
+
"numFailedTests": 0,
|
|
1058
|
+
"numPassedTestSuites": 1,
|
|
1059
|
+
"numPassedTests": 50,
|
|
1060
|
+
"numPendingTestSuites": 0,
|
|
1061
|
+
"numPendingTests": 0,
|
|
1062
|
+
"numRuntimeErrorTestSuites": 0,
|
|
1063
|
+
"numTodoTests": 0,
|
|
1064
|
+
"numTotalTestSuites": 1,
|
|
1065
|
+
"numTotalTests": 50,
|
|
1066
|
+
"openHandles": [],
|
|
1067
|
+
"snapshot": {
|
|
1068
|
+
"added": 0,
|
|
1069
|
+
"didUpdate": false,
|
|
1070
|
+
"failure": false,
|
|
1071
|
+
"filesAdded": 0,
|
|
1072
|
+
"filesRemoved": 0,
|
|
1073
|
+
"filesRemovedList": [],
|
|
1074
|
+
"filesUnmatched": 0,
|
|
1075
|
+
"filesUpdated": 0,
|
|
1076
|
+
"matched": 0,
|
|
1077
|
+
"total": 0,
|
|
1078
|
+
"unchecked": 0,
|
|
1079
|
+
"uncheckedKeysByFile": [],
|
|
1080
|
+
"unmatched": 0,
|
|
1081
|
+
"updated": 0
|
|
1082
|
+
},
|
|
1083
|
+
"startTime": 1754602404881,
|
|
1084
|
+
"success": true,
|
|
1085
|
+
"testResults": [
|
|
1086
|
+
{
|
|
1087
|
+
"assertionResults": [
|
|
1088
|
+
{
|
|
1089
|
+
"ancestorTitles": [
|
|
1090
|
+
"Allergies",
|
|
1091
|
+
"testing for eggs allergy"
|
|
1092
|
+
],
|
|
1093
|
+
"duration": 1,
|
|
1094
|
+
"failureDetails": [],
|
|
1095
|
+
"failureMessages": [],
|
|
1096
|
+
"fullName": "Allergies testing for eggs allergy not allergic to anything",
|
|
1097
|
+
"invocations": 1,
|
|
1098
|
+
"location": null,
|
|
1099
|
+
"numPassingAsserts": 1,
|
|
1100
|
+
"retryReasons": [],
|
|
1101
|
+
"status": "passed",
|
|
1102
|
+
"title": "not allergic to anything"
|
|
1103
|
+
},
|
|
1104
|
+
{
|
|
1105
|
+
"ancestorTitles": [
|
|
1106
|
+
"Allergies",
|
|
1107
|
+
"testing for eggs allergy"
|
|
1108
|
+
],
|
|
1109
|
+
"duration": 0,
|
|
1110
|
+
"failureDetails": [],
|
|
1111
|
+
"failureMessages": [],
|
|
1112
|
+
"fullName": "Allergies testing for eggs allergy allergic only to eggs",
|
|
1113
|
+
"invocations": 1,
|
|
1114
|
+
"location": null,
|
|
1115
|
+
"numPassingAsserts": 1,
|
|
1116
|
+
"retryReasons": [],
|
|
1117
|
+
"status": "passed",
|
|
1118
|
+
"title": "allergic only to eggs"
|
|
1119
|
+
},
|
|
1120
|
+
{
|
|
1121
|
+
"ancestorTitles": [
|
|
1122
|
+
"Allergies",
|
|
1123
|
+
"testing for eggs allergy"
|
|
1124
|
+
],
|
|
1125
|
+
"duration": 0,
|
|
1126
|
+
"failureDetails": [],
|
|
1127
|
+
"failureMessages": [],
|
|
1128
|
+
"fullName": "Allergies testing for eggs allergy allergic to eggs and something else",
|
|
1129
|
+
"invocations": 1,
|
|
1130
|
+
"location": null,
|
|
1131
|
+
"numPassingAsserts": 1,
|
|
1132
|
+
"retryReasons": [],
|
|
1133
|
+
"status": "passed",
|
|
1134
|
+
"title": "allergic to eggs and something else"
|
|
1135
|
+
},
|
|
1136
|
+
{
|
|
1137
|
+
"ancestorTitles": [
|
|
1138
|
+
"Allergies",
|
|
1139
|
+
"testing for eggs allergy"
|
|
1140
|
+
],
|
|
1141
|
+
"duration": 1,
|
|
1142
|
+
"failureDetails": [],
|
|
1143
|
+
"failureMessages": [],
|
|
1144
|
+
"fullName": "Allergies testing for eggs allergy allergic to something, but not eggs",
|
|
1145
|
+
"invocations": 1,
|
|
1146
|
+
"location": null,
|
|
1147
|
+
"numPassingAsserts": 1,
|
|
1148
|
+
"retryReasons": [],
|
|
1149
|
+
"status": "passed",
|
|
1150
|
+
"title": "allergic to something, but not eggs"
|
|
1151
|
+
},
|
|
1152
|
+
{
|
|
1153
|
+
"ancestorTitles": [
|
|
1154
|
+
"Allergies",
|
|
1155
|
+
"testing for eggs allergy"
|
|
1156
|
+
],
|
|
1157
|
+
"duration": 0,
|
|
1158
|
+
"failureDetails": [],
|
|
1159
|
+
"failureMessages": [],
|
|
1160
|
+
"fullName": "Allergies testing for eggs allergy allergic to everything",
|
|
1161
|
+
"invocations": 1,
|
|
1162
|
+
"location": null,
|
|
1163
|
+
"numPassingAsserts": 1,
|
|
1164
|
+
"retryReasons": [],
|
|
1165
|
+
"status": "passed",
|
|
1166
|
+
"title": "allergic to everything"
|
|
1167
|
+
},
|
|
1168
|
+
{
|
|
1169
|
+
"ancestorTitles": [
|
|
1170
|
+
"Allergies",
|
|
1171
|
+
"testing for peanuts allergy"
|
|
1172
|
+
],
|
|
1173
|
+
"duration": 1,
|
|
1174
|
+
"failureDetails": [],
|
|
1175
|
+
"failureMessages": [],
|
|
1176
|
+
"fullName": "Allergies testing for peanuts allergy not allergic to anything",
|
|
1177
|
+
"invocations": 1,
|
|
1178
|
+
"location": null,
|
|
1179
|
+
"numPassingAsserts": 1,
|
|
1180
|
+
"retryReasons": [],
|
|
1181
|
+
"status": "passed",
|
|
1182
|
+
"title": "not allergic to anything"
|
|
1183
|
+
},
|
|
1184
|
+
{
|
|
1185
|
+
"ancestorTitles": [
|
|
1186
|
+
"Allergies",
|
|
1187
|
+
"testing for peanuts allergy"
|
|
1188
|
+
],
|
|
1189
|
+
"duration": 0,
|
|
1190
|
+
"failureDetails": [],
|
|
1191
|
+
"failureMessages": [],
|
|
1192
|
+
"fullName": "Allergies testing for peanuts allergy allergic only to peanuts",
|
|
1193
|
+
"invocations": 1,
|
|
1194
|
+
"location": null,
|
|
1195
|
+
"numPassingAsserts": 1,
|
|
1196
|
+
"retryReasons": [],
|
|
1197
|
+
"status": "passed",
|
|
1198
|
+
"title": "allergic only to peanuts"
|
|
1199
|
+
},
|
|
1200
|
+
{
|
|
1201
|
+
"ancestorTitles": [
|
|
1202
|
+
"Allergies",
|
|
1203
|
+
"testing for peanuts allergy"
|
|
1204
|
+
],
|
|
1205
|
+
"duration": 0,
|
|
1206
|
+
"failureDetails": [],
|
|
1207
|
+
"failureMessages": [],
|
|
1208
|
+
"fullName": "Allergies testing for peanuts allergy allergic to peanuts and something else",
|
|
1209
|
+
"invocations": 1,
|
|
1210
|
+
"location": null,
|
|
1211
|
+
"numPassingAsserts": 1,
|
|
1212
|
+
"retryReasons": [],
|
|
1213
|
+
"status": "passed",
|
|
1214
|
+
"title": "allergic to peanuts and something else"
|
|
1215
|
+
},
|
|
1216
|
+
{
|
|
1217
|
+
"ancestorTitles": [
|
|
1218
|
+
"Allergies",
|
|
1219
|
+
"testing for peanuts allergy"
|
|
1220
|
+
],
|
|
1221
|
+
"duration": 0,
|
|
1222
|
+
"failureDetails": [],
|
|
1223
|
+
"failureMessages": [],
|
|
1224
|
+
"fullName": "Allergies testing for peanuts allergy allergic to something, but not peanuts",
|
|
1225
|
+
"invocations": 1,
|
|
1226
|
+
"location": null,
|
|
1227
|
+
"numPassingAsserts": 1,
|
|
1228
|
+
"retryReasons": [],
|
|
1229
|
+
"status": "passed",
|
|
1230
|
+
"title": "allergic to something, but not peanuts"
|
|
1231
|
+
},
|
|
1232
|
+
{
|
|
1233
|
+
"ancestorTitles": [
|
|
1234
|
+
"Allergies",
|
|
1235
|
+
"testing for peanuts allergy"
|
|
1236
|
+
],
|
|
1237
|
+
"duration": 0,
|
|
1238
|
+
"failureDetails": [],
|
|
1239
|
+
"failureMessages": [],
|
|
1240
|
+
"fullName": "Allergies testing for peanuts allergy allergic to everything",
|
|
1241
|
+
"invocations": 1,
|
|
1242
|
+
"location": null,
|
|
1243
|
+
"numPassingAsserts": 1,
|
|
1244
|
+
"retryReasons": [],
|
|
1245
|
+
"status": "passed",
|
|
1246
|
+
"title": "allergic to everything"
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
"ancestorTitles": [
|
|
1250
|
+
"Allergies",
|
|
1251
|
+
"testing for shellfish allergy"
|
|
1252
|
+
],
|
|
1253
|
+
"duration": 0,
|
|
1254
|
+
"failureDetails": [],
|
|
1255
|
+
"failureMessages": [],
|
|
1256
|
+
"fullName": "Allergies testing for shellfish allergy not allergic to anything",
|
|
1257
|
+
"invocations": 1,
|
|
1258
|
+
"location": null,
|
|
1259
|
+
"numPassingAsserts": 1,
|
|
1260
|
+
"retryReasons": [],
|
|
1261
|
+
"status": "passed",
|
|
1262
|
+
"title": "not allergic to anything"
|
|
1263
|
+
},
|
|
1264
|
+
{
|
|
1265
|
+
"ancestorTitles": [
|
|
1266
|
+
"Allergies",
|
|
1267
|
+
"testing for shellfish allergy"
|
|
1268
|
+
],
|
|
1269
|
+
"duration": 0,
|
|
1270
|
+
"failureDetails": [],
|
|
1271
|
+
"failureMessages": [],
|
|
1272
|
+
"fullName": "Allergies testing for shellfish allergy allergic only to shellfish",
|
|
1273
|
+
"invocations": 1,
|
|
1274
|
+
"location": null,
|
|
1275
|
+
"numPassingAsserts": 1,
|
|
1276
|
+
"retryReasons": [],
|
|
1277
|
+
"status": "passed",
|
|
1278
|
+
"title": "allergic only to shellfish"
|
|
1279
|
+
},
|
|
1280
|
+
{
|
|
1281
|
+
"ancestorTitles": [
|
|
1282
|
+
"Allergies",
|
|
1283
|
+
"testing for shellfish allergy"
|
|
1284
|
+
],
|
|
1285
|
+
"duration": 0,
|
|
1286
|
+
"failureDetails": [],
|
|
1287
|
+
"failureMessages": [],
|
|
1288
|
+
"fullName": "Allergies testing for shellfish allergy allergic to shellfish and something else",
|
|
1289
|
+
"invocations": 1,
|
|
1290
|
+
"location": null,
|
|
1291
|
+
"numPassingAsserts": 1,
|
|
1292
|
+
"retryReasons": [],
|
|
1293
|
+
"status": "passed",
|
|
1294
|
+
"title": "allergic to shellfish and something else"
|
|
1295
|
+
},
|
|
1296
|
+
{
|
|
1297
|
+
"ancestorTitles": [
|
|
1298
|
+
"Allergies",
|
|
1299
|
+
"testing for shellfish allergy"
|
|
1300
|
+
],
|
|
1301
|
+
"duration": 0,
|
|
1302
|
+
"failureDetails": [],
|
|
1303
|
+
"failureMessages": [],
|
|
1304
|
+
"fullName": "Allergies testing for shellfish allergy allergic to something, but not shellfish",
|
|
1305
|
+
"invocations": 1,
|
|
1306
|
+
"location": null,
|
|
1307
|
+
"numPassingAsserts": 1,
|
|
1308
|
+
"retryReasons": [],
|
|
1309
|
+
"status": "passed",
|
|
1310
|
+
"title": "allergic to something, but not shellfish"
|
|
1311
|
+
},
|
|
1312
|
+
{
|
|
1313
|
+
"ancestorTitles": [
|
|
1314
|
+
"Allergies",
|
|
1315
|
+
"testing for shellfish allergy"
|
|
1316
|
+
],
|
|
1317
|
+
"duration": 0,
|
|
1318
|
+
"failureDetails": [],
|
|
1319
|
+
"failureMessages": [],
|
|
1320
|
+
"fullName": "Allergies testing for shellfish allergy allergic to everything",
|
|
1321
|
+
"invocations": 1,
|
|
1322
|
+
"location": null,
|
|
1323
|
+
"numPassingAsserts": 1,
|
|
1324
|
+
"retryReasons": [],
|
|
1325
|
+
"status": "passed",
|
|
1326
|
+
"title": "allergic to everything"
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
"ancestorTitles": [
|
|
1330
|
+
"Allergies",
|
|
1331
|
+
"testing for strawberries allergy"
|
|
1332
|
+
],
|
|
1333
|
+
"duration": 0,
|
|
1334
|
+
"failureDetails": [],
|
|
1335
|
+
"failureMessages": [],
|
|
1336
|
+
"fullName": "Allergies testing for strawberries allergy not allergic to anything",
|
|
1337
|
+
"invocations": 1,
|
|
1338
|
+
"location": null,
|
|
1339
|
+
"numPassingAsserts": 1,
|
|
1340
|
+
"retryReasons": [],
|
|
1341
|
+
"status": "passed",
|
|
1342
|
+
"title": "not allergic to anything"
|
|
1343
|
+
},
|
|
1344
|
+
{
|
|
1345
|
+
"ancestorTitles": [
|
|
1346
|
+
"Allergies",
|
|
1347
|
+
"testing for strawberries allergy"
|
|
1348
|
+
],
|
|
1349
|
+
"duration": 0,
|
|
1350
|
+
"failureDetails": [],
|
|
1351
|
+
"failureMessages": [],
|
|
1352
|
+
"fullName": "Allergies testing for strawberries allergy allergic only to strawberries",
|
|
1353
|
+
"invocations": 1,
|
|
1354
|
+
"location": null,
|
|
1355
|
+
"numPassingAsserts": 1,
|
|
1356
|
+
"retryReasons": [],
|
|
1357
|
+
"status": "passed",
|
|
1358
|
+
"title": "allergic only to strawberries"
|
|
1359
|
+
},
|
|
1360
|
+
{
|
|
1361
|
+
"ancestorTitles": [
|
|
1362
|
+
"Allergies",
|
|
1363
|
+
"testing for strawberries allergy"
|
|
1364
|
+
],
|
|
1365
|
+
"duration": 0,
|
|
1366
|
+
"failureDetails": [],
|
|
1367
|
+
"failureMessages": [],
|
|
1368
|
+
"fullName": "Allergies testing for strawberries allergy allergic to strawberries and something else",
|
|
1369
|
+
"invocations": 1,
|
|
1370
|
+
"location": null,
|
|
1371
|
+
"numPassingAsserts": 1,
|
|
1372
|
+
"retryReasons": [],
|
|
1373
|
+
"status": "passed",
|
|
1374
|
+
"title": "allergic to strawberries and something else"
|
|
1375
|
+
},
|
|
1376
|
+
{
|
|
1377
|
+
"ancestorTitles": [
|
|
1378
|
+
"Allergies",
|
|
1379
|
+
"testing for strawberries allergy"
|
|
1380
|
+
],
|
|
1381
|
+
"duration": 0,
|
|
1382
|
+
"failureDetails": [],
|
|
1383
|
+
"failureMessages": [],
|
|
1384
|
+
"fullName": "Allergies testing for strawberries allergy allergic to something, but not strawberries",
|
|
1385
|
+
"invocations": 1,
|
|
1386
|
+
"location": null,
|
|
1387
|
+
"numPassingAsserts": 1,
|
|
1388
|
+
"retryReasons": [],
|
|
1389
|
+
"status": "passed",
|
|
1390
|
+
"title": "allergic to something, but not strawberries"
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
"ancestorTitles": [
|
|
1394
|
+
"Allergies",
|
|
1395
|
+
"testing for strawberries allergy"
|
|
1396
|
+
],
|
|
1397
|
+
"duration": 1,
|
|
1398
|
+
"failureDetails": [],
|
|
1399
|
+
"failureMessages": [],
|
|
1400
|
+
"fullName": "Allergies testing for strawberries allergy allergic to everything",
|
|
1401
|
+
"invocations": 1,
|
|
1402
|
+
"location": null,
|
|
1403
|
+
"numPassingAsserts": 1,
|
|
1404
|
+
"retryReasons": [],
|
|
1405
|
+
"status": "passed",
|
|
1406
|
+
"title": "allergic to everything"
|
|
1407
|
+
},
|
|
1408
|
+
{
|
|
1409
|
+
"ancestorTitles": [
|
|
1410
|
+
"Allergies",
|
|
1411
|
+
"testing for tomatoes allergy"
|
|
1412
|
+
],
|
|
1413
|
+
"duration": 0,
|
|
1414
|
+
"failureDetails": [],
|
|
1415
|
+
"failureMessages": [],
|
|
1416
|
+
"fullName": "Allergies testing for tomatoes allergy not allergic to anything",
|
|
1417
|
+
"invocations": 1,
|
|
1418
|
+
"location": null,
|
|
1419
|
+
"numPassingAsserts": 1,
|
|
1420
|
+
"retryReasons": [],
|
|
1421
|
+
"status": "passed",
|
|
1422
|
+
"title": "not allergic to anything"
|
|
1423
|
+
},
|
|
1424
|
+
{
|
|
1425
|
+
"ancestorTitles": [
|
|
1426
|
+
"Allergies",
|
|
1427
|
+
"testing for tomatoes allergy"
|
|
1428
|
+
],
|
|
1429
|
+
"duration": 0,
|
|
1430
|
+
"failureDetails": [],
|
|
1431
|
+
"failureMessages": [],
|
|
1432
|
+
"fullName": "Allergies testing for tomatoes allergy allergic only to tomatoes",
|
|
1433
|
+
"invocations": 1,
|
|
1434
|
+
"location": null,
|
|
1435
|
+
"numPassingAsserts": 1,
|
|
1436
|
+
"retryReasons": [],
|
|
1437
|
+
"status": "passed",
|
|
1438
|
+
"title": "allergic only to tomatoes"
|
|
1439
|
+
},
|
|
1440
|
+
{
|
|
1441
|
+
"ancestorTitles": [
|
|
1442
|
+
"Allergies",
|
|
1443
|
+
"testing for tomatoes allergy"
|
|
1444
|
+
],
|
|
1445
|
+
"duration": 0,
|
|
1446
|
+
"failureDetails": [],
|
|
1447
|
+
"failureMessages": [],
|
|
1448
|
+
"fullName": "Allergies testing for tomatoes allergy allergic to tomatoes and something else",
|
|
1449
|
+
"invocations": 1,
|
|
1450
|
+
"location": null,
|
|
1451
|
+
"numPassingAsserts": 1,
|
|
1452
|
+
"retryReasons": [],
|
|
1453
|
+
"status": "passed",
|
|
1454
|
+
"title": "allergic to tomatoes and something else"
|
|
1455
|
+
},
|
|
1456
|
+
{
|
|
1457
|
+
"ancestorTitles": [
|
|
1458
|
+
"Allergies",
|
|
1459
|
+
"testing for tomatoes allergy"
|
|
1460
|
+
],
|
|
1461
|
+
"duration": 0,
|
|
1462
|
+
"failureDetails": [],
|
|
1463
|
+
"failureMessages": [],
|
|
1464
|
+
"fullName": "Allergies testing for tomatoes allergy allergic to something, but not tomatoes",
|
|
1465
|
+
"invocations": 1,
|
|
1466
|
+
"location": null,
|
|
1467
|
+
"numPassingAsserts": 1,
|
|
1468
|
+
"retryReasons": [],
|
|
1469
|
+
"status": "passed",
|
|
1470
|
+
"title": "allergic to something, but not tomatoes"
|
|
1471
|
+
},
|
|
1472
|
+
{
|
|
1473
|
+
"ancestorTitles": [
|
|
1474
|
+
"Allergies",
|
|
1475
|
+
"testing for tomatoes allergy"
|
|
1476
|
+
],
|
|
1477
|
+
"duration": 0,
|
|
1478
|
+
"failureDetails": [],
|
|
1479
|
+
"failureMessages": [],
|
|
1480
|
+
"fullName": "Allergies testing for tomatoes allergy allergic to everything",
|
|
1481
|
+
"invocations": 1,
|
|
1482
|
+
"location": null,
|
|
1483
|
+
"numPassingAsserts": 1,
|
|
1484
|
+
"retryReasons": [],
|
|
1485
|
+
"status": "passed",
|
|
1486
|
+
"title": "allergic to everything"
|
|
1487
|
+
},
|
|
1488
|
+
{
|
|
1489
|
+
"ancestorTitles": [
|
|
1490
|
+
"Allergies",
|
|
1491
|
+
"testing for chocolate allergy"
|
|
1492
|
+
],
|
|
1493
|
+
"duration": 0,
|
|
1494
|
+
"failureDetails": [],
|
|
1495
|
+
"failureMessages": [],
|
|
1496
|
+
"fullName": "Allergies testing for chocolate allergy not allergic to anything",
|
|
1497
|
+
"invocations": 1,
|
|
1498
|
+
"location": null,
|
|
1499
|
+
"numPassingAsserts": 1,
|
|
1500
|
+
"retryReasons": [],
|
|
1501
|
+
"status": "passed",
|
|
1502
|
+
"title": "not allergic to anything"
|
|
1503
|
+
},
|
|
1504
|
+
{
|
|
1505
|
+
"ancestorTitles": [
|
|
1506
|
+
"Allergies",
|
|
1507
|
+
"testing for chocolate allergy"
|
|
1508
|
+
],
|
|
1509
|
+
"duration": 0,
|
|
1510
|
+
"failureDetails": [],
|
|
1511
|
+
"failureMessages": [],
|
|
1512
|
+
"fullName": "Allergies testing for chocolate allergy allergic only to chocolate",
|
|
1513
|
+
"invocations": 1,
|
|
1514
|
+
"location": null,
|
|
1515
|
+
"numPassingAsserts": 1,
|
|
1516
|
+
"retryReasons": [],
|
|
1517
|
+
"status": "passed",
|
|
1518
|
+
"title": "allergic only to chocolate"
|
|
1519
|
+
},
|
|
1520
|
+
{
|
|
1521
|
+
"ancestorTitles": [
|
|
1522
|
+
"Allergies",
|
|
1523
|
+
"testing for chocolate allergy"
|
|
1524
|
+
],
|
|
1525
|
+
"duration": 0,
|
|
1526
|
+
"failureDetails": [],
|
|
1527
|
+
"failureMessages": [],
|
|
1528
|
+
"fullName": "Allergies testing for chocolate allergy allergic to chocolate and something else",
|
|
1529
|
+
"invocations": 1,
|
|
1530
|
+
"location": null,
|
|
1531
|
+
"numPassingAsserts": 1,
|
|
1532
|
+
"retryReasons": [],
|
|
1533
|
+
"status": "passed",
|
|
1534
|
+
"title": "allergic to chocolate and something else"
|
|
1535
|
+
},
|
|
1536
|
+
{
|
|
1537
|
+
"ancestorTitles": [
|
|
1538
|
+
"Allergies",
|
|
1539
|
+
"testing for chocolate allergy"
|
|
1540
|
+
],
|
|
1541
|
+
"duration": 0,
|
|
1542
|
+
"failureDetails": [],
|
|
1543
|
+
"failureMessages": [],
|
|
1544
|
+
"fullName": "Allergies testing for chocolate allergy allergic to something, but not chocolate",
|
|
1545
|
+
"invocations": 1,
|
|
1546
|
+
"location": null,
|
|
1547
|
+
"numPassingAsserts": 1,
|
|
1548
|
+
"retryReasons": [],
|
|
1549
|
+
"status": "passed",
|
|
1550
|
+
"title": "allergic to something, but not chocolate"
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
"ancestorTitles": [
|
|
1554
|
+
"Allergies",
|
|
1555
|
+
"testing for chocolate allergy"
|
|
1556
|
+
],
|
|
1557
|
+
"duration": 0,
|
|
1558
|
+
"failureDetails": [],
|
|
1559
|
+
"failureMessages": [],
|
|
1560
|
+
"fullName": "Allergies testing for chocolate allergy allergic to everything",
|
|
1561
|
+
"invocations": 1,
|
|
1562
|
+
"location": null,
|
|
1563
|
+
"numPassingAsserts": 1,
|
|
1564
|
+
"retryReasons": [],
|
|
1565
|
+
"status": "passed",
|
|
1566
|
+
"title": "allergic to everything"
|
|
1567
|
+
},
|
|
1568
|
+
{
|
|
1569
|
+
"ancestorTitles": [
|
|
1570
|
+
"Allergies",
|
|
1571
|
+
"testing for pollen allergy"
|
|
1572
|
+
],
|
|
1573
|
+
"duration": 1,
|
|
1574
|
+
"failureDetails": [],
|
|
1575
|
+
"failureMessages": [],
|
|
1576
|
+
"fullName": "Allergies testing for pollen allergy not allergic to anything",
|
|
1577
|
+
"invocations": 1,
|
|
1578
|
+
"location": null,
|
|
1579
|
+
"numPassingAsserts": 1,
|
|
1580
|
+
"retryReasons": [],
|
|
1581
|
+
"status": "passed",
|
|
1582
|
+
"title": "not allergic to anything"
|
|
1583
|
+
},
|
|
1584
|
+
{
|
|
1585
|
+
"ancestorTitles": [
|
|
1586
|
+
"Allergies",
|
|
1587
|
+
"testing for pollen allergy"
|
|
1588
|
+
],
|
|
1589
|
+
"duration": 0,
|
|
1590
|
+
"failureDetails": [],
|
|
1591
|
+
"failureMessages": [],
|
|
1592
|
+
"fullName": "Allergies testing for pollen allergy allergic only to pollen",
|
|
1593
|
+
"invocations": 1,
|
|
1594
|
+
"location": null,
|
|
1595
|
+
"numPassingAsserts": 1,
|
|
1596
|
+
"retryReasons": [],
|
|
1597
|
+
"status": "passed",
|
|
1598
|
+
"title": "allergic only to pollen"
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
"ancestorTitles": [
|
|
1602
|
+
"Allergies",
|
|
1603
|
+
"testing for pollen allergy"
|
|
1604
|
+
],
|
|
1605
|
+
"duration": 0,
|
|
1606
|
+
"failureDetails": [],
|
|
1607
|
+
"failureMessages": [],
|
|
1608
|
+
"fullName": "Allergies testing for pollen allergy allergic to pollen and something else",
|
|
1609
|
+
"invocations": 1,
|
|
1610
|
+
"location": null,
|
|
1611
|
+
"numPassingAsserts": 1,
|
|
1612
|
+
"retryReasons": [],
|
|
1613
|
+
"status": "passed",
|
|
1614
|
+
"title": "allergic to pollen and something else"
|
|
1615
|
+
},
|
|
1616
|
+
{
|
|
1617
|
+
"ancestorTitles": [
|
|
1618
|
+
"Allergies",
|
|
1619
|
+
"testing for pollen allergy"
|
|
1620
|
+
],
|
|
1621
|
+
"duration": 0,
|
|
1622
|
+
"failureDetails": [],
|
|
1623
|
+
"failureMessages": [],
|
|
1624
|
+
"fullName": "Allergies testing for pollen allergy allergic to something, but not pollen",
|
|
1625
|
+
"invocations": 1,
|
|
1626
|
+
"location": null,
|
|
1627
|
+
"numPassingAsserts": 1,
|
|
1628
|
+
"retryReasons": [],
|
|
1629
|
+
"status": "passed",
|
|
1630
|
+
"title": "allergic to something, but not pollen"
|
|
1631
|
+
},
|
|
1632
|
+
{
|
|
1633
|
+
"ancestorTitles": [
|
|
1634
|
+
"Allergies",
|
|
1635
|
+
"testing for pollen allergy"
|
|
1636
|
+
],
|
|
1637
|
+
"duration": 0,
|
|
1638
|
+
"failureDetails": [],
|
|
1639
|
+
"failureMessages": [],
|
|
1640
|
+
"fullName": "Allergies testing for pollen allergy allergic to everything",
|
|
1641
|
+
"invocations": 1,
|
|
1642
|
+
"location": null,
|
|
1643
|
+
"numPassingAsserts": 1,
|
|
1644
|
+
"retryReasons": [],
|
|
1645
|
+
"status": "passed",
|
|
1646
|
+
"title": "allergic to everything"
|
|
1647
|
+
},
|
|
1648
|
+
{
|
|
1649
|
+
"ancestorTitles": [
|
|
1650
|
+
"Allergies",
|
|
1651
|
+
"testing for cats allergy"
|
|
1652
|
+
],
|
|
1653
|
+
"duration": 0,
|
|
1654
|
+
"failureDetails": [],
|
|
1655
|
+
"failureMessages": [],
|
|
1656
|
+
"fullName": "Allergies testing for cats allergy not allergic to anything",
|
|
1657
|
+
"invocations": 1,
|
|
1658
|
+
"location": null,
|
|
1659
|
+
"numPassingAsserts": 1,
|
|
1660
|
+
"retryReasons": [],
|
|
1661
|
+
"status": "passed",
|
|
1662
|
+
"title": "not allergic to anything"
|
|
1663
|
+
},
|
|
1664
|
+
{
|
|
1665
|
+
"ancestorTitles": [
|
|
1666
|
+
"Allergies",
|
|
1667
|
+
"testing for cats allergy"
|
|
1668
|
+
],
|
|
1669
|
+
"duration": 0,
|
|
1670
|
+
"failureDetails": [],
|
|
1671
|
+
"failureMessages": [],
|
|
1672
|
+
"fullName": "Allergies testing for cats allergy allergic only to cats",
|
|
1673
|
+
"invocations": 1,
|
|
1674
|
+
"location": null,
|
|
1675
|
+
"numPassingAsserts": 1,
|
|
1676
|
+
"retryReasons": [],
|
|
1677
|
+
"status": "passed",
|
|
1678
|
+
"title": "allergic only to cats"
|
|
1679
|
+
},
|
|
1680
|
+
{
|
|
1681
|
+
"ancestorTitles": [
|
|
1682
|
+
"Allergies",
|
|
1683
|
+
"testing for cats allergy"
|
|
1684
|
+
],
|
|
1685
|
+
"duration": 0,
|
|
1686
|
+
"failureDetails": [],
|
|
1687
|
+
"failureMessages": [],
|
|
1688
|
+
"fullName": "Allergies testing for cats allergy allergic to cats and something else",
|
|
1689
|
+
"invocations": 1,
|
|
1690
|
+
"location": null,
|
|
1691
|
+
"numPassingAsserts": 1,
|
|
1692
|
+
"retryReasons": [],
|
|
1693
|
+
"status": "passed",
|
|
1694
|
+
"title": "allergic to cats and something else"
|
|
1695
|
+
},
|
|
1696
|
+
{
|
|
1697
|
+
"ancestorTitles": [
|
|
1698
|
+
"Allergies",
|
|
1699
|
+
"testing for cats allergy"
|
|
1700
|
+
],
|
|
1701
|
+
"duration": 0,
|
|
1702
|
+
"failureDetails": [],
|
|
1703
|
+
"failureMessages": [],
|
|
1704
|
+
"fullName": "Allergies testing for cats allergy allergic to something, but not cats",
|
|
1705
|
+
"invocations": 1,
|
|
1706
|
+
"location": null,
|
|
1707
|
+
"numPassingAsserts": 1,
|
|
1708
|
+
"retryReasons": [],
|
|
1709
|
+
"status": "passed",
|
|
1710
|
+
"title": "allergic to something, but not cats"
|
|
1711
|
+
},
|
|
1712
|
+
{
|
|
1713
|
+
"ancestorTitles": [
|
|
1714
|
+
"Allergies",
|
|
1715
|
+
"testing for cats allergy"
|
|
1716
|
+
],
|
|
1717
|
+
"duration": 0,
|
|
1718
|
+
"failureDetails": [],
|
|
1719
|
+
"failureMessages": [],
|
|
1720
|
+
"fullName": "Allergies testing for cats allergy allergic to everything",
|
|
1721
|
+
"invocations": 1,
|
|
1722
|
+
"location": null,
|
|
1723
|
+
"numPassingAsserts": 1,
|
|
1724
|
+
"retryReasons": [],
|
|
1725
|
+
"status": "passed",
|
|
1726
|
+
"title": "allergic to everything"
|
|
1727
|
+
},
|
|
1728
|
+
{
|
|
1729
|
+
"ancestorTitles": [
|
|
1730
|
+
"Allergies",
|
|
1731
|
+
"list when:"
|
|
1732
|
+
],
|
|
1733
|
+
"duration": 1,
|
|
1734
|
+
"failureDetails": [],
|
|
1735
|
+
"failureMessages": [],
|
|
1736
|
+
"fullName": "Allergies list when: no allergies",
|
|
1737
|
+
"invocations": 1,
|
|
1738
|
+
"location": null,
|
|
1739
|
+
"numPassingAsserts": 1,
|
|
1740
|
+
"retryReasons": [],
|
|
1741
|
+
"status": "passed",
|
|
1742
|
+
"title": "no allergies"
|
|
1743
|
+
},
|
|
1744
|
+
{
|
|
1745
|
+
"ancestorTitles": [
|
|
1746
|
+
"Allergies",
|
|
1747
|
+
"list when:"
|
|
1748
|
+
],
|
|
1749
|
+
"duration": 0,
|
|
1750
|
+
"failureDetails": [],
|
|
1751
|
+
"failureMessages": [],
|
|
1752
|
+
"fullName": "Allergies list when: just eggs",
|
|
1753
|
+
"invocations": 1,
|
|
1754
|
+
"location": null,
|
|
1755
|
+
"numPassingAsserts": 1,
|
|
1756
|
+
"retryReasons": [],
|
|
1757
|
+
"status": "passed",
|
|
1758
|
+
"title": "just eggs"
|
|
1759
|
+
},
|
|
1760
|
+
{
|
|
1761
|
+
"ancestorTitles": [
|
|
1762
|
+
"Allergies",
|
|
1763
|
+
"list when:"
|
|
1764
|
+
],
|
|
1765
|
+
"duration": 0,
|
|
1766
|
+
"failureDetails": [],
|
|
1767
|
+
"failureMessages": [],
|
|
1768
|
+
"fullName": "Allergies list when: just peanuts",
|
|
1769
|
+
"invocations": 1,
|
|
1770
|
+
"location": null,
|
|
1771
|
+
"numPassingAsserts": 1,
|
|
1772
|
+
"retryReasons": [],
|
|
1773
|
+
"status": "passed",
|
|
1774
|
+
"title": "just peanuts"
|
|
1775
|
+
},
|
|
1776
|
+
{
|
|
1777
|
+
"ancestorTitles": [
|
|
1778
|
+
"Allergies",
|
|
1779
|
+
"list when:"
|
|
1780
|
+
],
|
|
1781
|
+
"duration": 0,
|
|
1782
|
+
"failureDetails": [],
|
|
1783
|
+
"failureMessages": [],
|
|
1784
|
+
"fullName": "Allergies list when: just strawberries",
|
|
1785
|
+
"invocations": 1,
|
|
1786
|
+
"location": null,
|
|
1787
|
+
"numPassingAsserts": 1,
|
|
1788
|
+
"retryReasons": [],
|
|
1789
|
+
"status": "passed",
|
|
1790
|
+
"title": "just strawberries"
|
|
1791
|
+
},
|
|
1792
|
+
{
|
|
1793
|
+
"ancestorTitles": [
|
|
1794
|
+
"Allergies",
|
|
1795
|
+
"list when:"
|
|
1796
|
+
],
|
|
1797
|
+
"duration": 0,
|
|
1798
|
+
"failureDetails": [],
|
|
1799
|
+
"failureMessages": [],
|
|
1800
|
+
"fullName": "Allergies list when: eggs and peanuts",
|
|
1801
|
+
"invocations": 1,
|
|
1802
|
+
"location": null,
|
|
1803
|
+
"numPassingAsserts": 1,
|
|
1804
|
+
"retryReasons": [],
|
|
1805
|
+
"status": "passed",
|
|
1806
|
+
"title": "eggs and peanuts"
|
|
1807
|
+
},
|
|
1808
|
+
{
|
|
1809
|
+
"ancestorTitles": [
|
|
1810
|
+
"Allergies",
|
|
1811
|
+
"list when:"
|
|
1812
|
+
],
|
|
1813
|
+
"duration": 0,
|
|
1814
|
+
"failureDetails": [],
|
|
1815
|
+
"failureMessages": [],
|
|
1816
|
+
"fullName": "Allergies list when: more than eggs but not peanuts",
|
|
1817
|
+
"invocations": 1,
|
|
1818
|
+
"location": null,
|
|
1819
|
+
"numPassingAsserts": 1,
|
|
1820
|
+
"retryReasons": [],
|
|
1821
|
+
"status": "passed",
|
|
1822
|
+
"title": "more than eggs but not peanuts"
|
|
1823
|
+
},
|
|
1824
|
+
{
|
|
1825
|
+
"ancestorTitles": [
|
|
1826
|
+
"Allergies",
|
|
1827
|
+
"list when:"
|
|
1828
|
+
],
|
|
1829
|
+
"duration": 0,
|
|
1830
|
+
"failureDetails": [],
|
|
1831
|
+
"failureMessages": [],
|
|
1832
|
+
"fullName": "Allergies list when: lots of stuff",
|
|
1833
|
+
"invocations": 1,
|
|
1834
|
+
"location": null,
|
|
1835
|
+
"numPassingAsserts": 1,
|
|
1836
|
+
"retryReasons": [],
|
|
1837
|
+
"status": "passed",
|
|
1838
|
+
"title": "lots of stuff"
|
|
1839
|
+
},
|
|
1840
|
+
{
|
|
1841
|
+
"ancestorTitles": [
|
|
1842
|
+
"Allergies",
|
|
1843
|
+
"list when:"
|
|
1844
|
+
],
|
|
1845
|
+
"duration": 0,
|
|
1846
|
+
"failureDetails": [],
|
|
1847
|
+
"failureMessages": [],
|
|
1848
|
+
"fullName": "Allergies list when: everything",
|
|
1849
|
+
"invocations": 1,
|
|
1850
|
+
"location": null,
|
|
1851
|
+
"numPassingAsserts": 1,
|
|
1852
|
+
"retryReasons": [],
|
|
1853
|
+
"status": "passed",
|
|
1854
|
+
"title": "everything"
|
|
1855
|
+
},
|
|
1856
|
+
{
|
|
1857
|
+
"ancestorTitles": [
|
|
1858
|
+
"Allergies",
|
|
1859
|
+
"list when:"
|
|
1860
|
+
],
|
|
1861
|
+
"duration": 0,
|
|
1862
|
+
"failureDetails": [],
|
|
1863
|
+
"failureMessages": [],
|
|
1864
|
+
"fullName": "Allergies list when: no allergen score parts",
|
|
1865
|
+
"invocations": 1,
|
|
1866
|
+
"location": null,
|
|
1867
|
+
"numPassingAsserts": 1,
|
|
1868
|
+
"retryReasons": [],
|
|
1869
|
+
"status": "passed",
|
|
1870
|
+
"title": "no allergen score parts"
|
|
1871
|
+
},
|
|
1872
|
+
{
|
|
1873
|
+
"ancestorTitles": [
|
|
1874
|
+
"Allergies",
|
|
1875
|
+
"list when:"
|
|
1876
|
+
],
|
|
1877
|
+
"duration": 1,
|
|
1878
|
+
"failureDetails": [],
|
|
1879
|
+
"failureMessages": [],
|
|
1880
|
+
"fullName": "Allergies list when: no allergen score parts without highest valid score",
|
|
1881
|
+
"invocations": 1,
|
|
1882
|
+
"location": null,
|
|
1883
|
+
"numPassingAsserts": 1,
|
|
1884
|
+
"retryReasons": [],
|
|
1885
|
+
"status": "passed",
|
|
1886
|
+
"title": "no allergen score parts without highest valid score"
|
|
1887
|
+
}
|
|
1888
|
+
],
|
|
1889
|
+
"endTime": 1754602404981,
|
|
1890
|
+
"message": "",
|
|
1891
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/allergies/allergies.spec.js",
|
|
1892
|
+
"startTime": 1754602404892,
|
|
1893
|
+
"status": "passed",
|
|
1894
|
+
"summary": ""
|
|
1895
|
+
}
|
|
1896
|
+
],
|
|
1897
|
+
"wasInterrupted": false
|
|
1898
|
+
}
|
|
1899
|
+
},
|
|
1900
|
+
"timeElapsed": 56.391,
|
|
1901
|
+
"cost": 0.09899832771750001,
|
|
1902
|
+
"startTime": "2025-08-07T21:32:28.601Z",
|
|
1903
|
+
"endTime": "2025-08-07T21:33:24.992Z",
|
|
1904
|
+
"finalOutput": "I have successfully implemented the allergies coding exercise! Here's what I accomplished:\n\n## Solution Summary\n\nI implemented the `Allergies` class in `allergies.js` with the following functionality:\n\n### 1. Constructor\n- Takes an allergy score as a parameter\n- Stores the score and creates a mapping of allergens to their bit values:\n - eggs (1), peanuts (2), shellfish (4), strawberries (8), tomatoes (16), chocolate (32), pollen (64), cats (128)\n\n### 2. `allergicTo(allergen)` method\n- Checks if a person is allergic to a specific allergen using bitwise AND operation\n- Returns `true` if allergic, `false` otherwise\n\n### 3. `list()` method \n- Returns an array of all allergens the person is allergic to\n- Uses bitwise operations to check each allergen against the score\n- Automatically handles scores that include unknown allergens (ignoring values > 255)\n\n## Key Technical Details\n\nThe solution uses bitwise operations to decode the allergy score:\n- Each allergen has a power-of-2 value (1, 2, 4, 8, 16, 32, 64, 128)\n- The score is a sum of these values for all allergens\n- Using `score & allergenValue` checks if that specific bit is set\n- This naturally handles edge cases like scores > 255 by ignoring higher bits\n\n## Test Results\n\n✅ **All 50 tests pass successfully!**\n\nThe implementation correctly handles all test cases including:\n- Individual allergen checks for all 8 allergens\n- Complex combinations of allergens\n- Edge cases like score 0 (no allergies) and score 255 (all allergies) \n- Scores with unknown allergens (e.g., 257, 509) that should be ignored\n\nThe solution is efficient, readable, and fully meets the exercise requirements."
|
|
1905
|
+
},
|
|
1906
|
+
{
|
|
1907
|
+
"exerciseName": "alphametics",
|
|
1908
|
+
"status": "success",
|
|
1909
|
+
"turns": 30,
|
|
1910
|
+
"testResult": {
|
|
1911
|
+
"passed": 0,
|
|
1912
|
+
"failed": 0,
|
|
1913
|
+
"total": 0,
|
|
1914
|
+
"skipped": 0,
|
|
1915
|
+
"success": false,
|
|
1916
|
+
"output": "{\"numFailedTestSuites\":1,\"numFailedTests\":0,\"numPassedTestSuites\":0,\"numPassedTests\":0,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":1,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":0,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602599285,\"success\":false,\"testResults\":[{\"assertionResults\":[],\"coverage\":{},\"endTime\":1754602599393,\"message\":\" ● Test suite failed to run\\n\\n Cannot find module '@babel/preset-env'\\n Require stack:\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@babel/core/lib/config/files/plugins.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@babel/core/lib/config/files/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@babel/core/lib/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-snapshot/build/InlineSnapshots.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-snapshot/build/State.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-snapshot/build/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-runtime/build/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@jest/core/build/cli/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@jest/core/build/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-cli/build/run.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-cli/build/index.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-cli/bin/jest.js\\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest/bin/jest.js\\n\\n Make sure that all the Babel plugins and presets you are using\\n are defined as dependencies or devDependencies in your package.json\\n file. It's possible that the missing plugin is loaded by a preset\\n you are using that forgot to add the plugin to its dependencies: you\\n can workaround this problem by explicitly adding the missing package\\n to your top-level package.json.\\n\\n at tryRequireResolve (../../../node_modules/@babel/core/src/config/files/plugins.ts:140:36)\\n at tryRequireResolve (../../../node_modules/@babel/core/src/config/files/plugins.ts:168:19)\\n at resolveStandardizedNameForRequire (../../../node_modules/@babel/core/src/config/files/plugins.ts:196:12)\\n at resolvePreset (../../../node_modules/@babel/core/src/config/files/plugins.ts:50:32)\\n at loadPreset.next (<anonymous>)\\n at resolver (../../../node_modules/@babel/core/src/config/config-descriptors.ts:326:35)\\n at createDescriptor.next (<anonymous>)\\n at evaluateSync (../../../node_modules/gensync/index.js:251:28)\\n at ../../../node_modules/gensync/index.js:31:34\\n at Array.map (<anonymous>)\\n at Function.sync (../../../node_modules/gensync/index.js:31:22)\\n at Function.all (../../../node_modules/gensync/index.js:210:24)\\n at all (../../../node_modules/@babel/core/src/config/config-descriptors.ts:267:38)\\n at createDescriptors.next (<anonymous>)\\n at createDescriptors (../../../node_modules/@babel/core/src/config/config-descriptors.ts:243:17)\\n at createPresetDescriptors.next (<anonymous>)\\n at fn (../../../node_modules/@babel/core/src/gensync-utils/functional.ts:18:46)\\n at presets (../../../node_modules/@babel/core/src/config/config-chain.ts:725:34)\\n at mergeChainOpts.next (<anonymous>)\\n at mergeChainOpts (../../../node_modules/@babel/core/src/config/config-chain.ts:661:14)\\n at chainWalker.next (<anonymous>)\\n at loadFileChainWalker (../../../node_modules/@babel/core/src/config/config-chain.ts:398:24)\\n at loadFileChain.next (<anonymous>)\\n at loadFileChain (../../../node_modules/@babel/core/src/config/config-chain.ts:186:27)\\n at buildRootChain.next (<anonymous>)\\n at loadPrivatePartialConfig (../../../node_modules/@babel/core/src/config/partial.ts:111:44)\\n at loadPrivatePartialConfig.next (<anonymous>)\\n at loadPrivatePartialConfig (../../../node_modules/@babel/core/src/config/partial.ts:170:12)\\n at loadPartialConfig.next (<anonymous>)\\n at evaluateSync (../../../node_modules/gensync/index.js:251:28)\\n at sync (../../../node_modules/gensync/index.js:89:14)\\n at fn (../../../node_modules/@babel/core/src/errors/rewrite-stack-trace.ts:99:14)\\n at loadPartialConfigSync (../../../node_modules/@babel/core/src/config/index.ts:50:60)\\n at loadPartialConfigSync (../../../node_modules/@babel/core/src/config/index.ts:69:14)\\n at ScriptTransformer._getCacheKey (../../../node_modules/@jest/transform/build/ScriptTransformer.js:228:41)\\n at ScriptTransformer._getFileCachePath (../../../node_modules/@jest/transform/build/ScriptTransformer.js:289:27)\\n at ScriptTransformer.transformSource (../../../node_modules/@jest/transform/build/ScriptTransformer.js:525:32)\\n at ScriptTransformer._transformAndBuildScript (../../../node_modules/@jest/transform/build/ScriptTransformer.js:674:40)\\n at ScriptTransformer.transform (../../../node_modules/@jest/transform/build/ScriptTransformer.js:726:19)\\n\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/alphametics/alphametics.spec.js\",\"startTime\":1754602599393,\"status\":\"failed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
1917
|
+
"details": {
|
|
1918
|
+
"numFailedTestSuites": 1,
|
|
1919
|
+
"numFailedTests": 0,
|
|
1920
|
+
"numPassedTestSuites": 0,
|
|
1921
|
+
"numPassedTests": 0,
|
|
1922
|
+
"numPendingTestSuites": 0,
|
|
1923
|
+
"numPendingTests": 0,
|
|
1924
|
+
"numRuntimeErrorTestSuites": 1,
|
|
1925
|
+
"numTodoTests": 0,
|
|
1926
|
+
"numTotalTestSuites": 1,
|
|
1927
|
+
"numTotalTests": 0,
|
|
1928
|
+
"openHandles": [],
|
|
1929
|
+
"snapshot": {
|
|
1930
|
+
"added": 0,
|
|
1931
|
+
"didUpdate": false,
|
|
1932
|
+
"failure": false,
|
|
1933
|
+
"filesAdded": 0,
|
|
1934
|
+
"filesRemoved": 0,
|
|
1935
|
+
"filesRemovedList": [],
|
|
1936
|
+
"filesUnmatched": 0,
|
|
1937
|
+
"filesUpdated": 0,
|
|
1938
|
+
"matched": 0,
|
|
1939
|
+
"total": 0,
|
|
1940
|
+
"unchecked": 0,
|
|
1941
|
+
"uncheckedKeysByFile": [],
|
|
1942
|
+
"unmatched": 0,
|
|
1943
|
+
"updated": 0
|
|
1944
|
+
},
|
|
1945
|
+
"startTime": 1754602599285,
|
|
1946
|
+
"success": false,
|
|
1947
|
+
"testResults": [
|
|
1948
|
+
{
|
|
1949
|
+
"assertionResults": [],
|
|
1950
|
+
"coverage": {},
|
|
1951
|
+
"endTime": 1754602599393,
|
|
1952
|
+
"message": " ● Test suite failed to run\n\n Cannot find module '@babel/preset-env'\n Require stack:\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@babel/core/lib/config/files/plugins.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@babel/core/lib/config/files/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@babel/core/lib/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-snapshot/build/InlineSnapshots.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-snapshot/build/State.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-snapshot/build/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-runtime/build/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@jest/core/build/cli/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/@jest/core/build/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-cli/build/run.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-cli/build/index.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest-cli/bin/jest.js\n - /Users/micah/dev/knowhow/packages/knowhow/benchmarks/node_modules/jest/bin/jest.js\n\n Make sure that all the Babel plugins and presets you are using\n are defined as dependencies or devDependencies in your package.json\n file. It's possible that the missing plugin is loaded by a preset\n you are using that forgot to add the plugin to its dependencies: you\n can workaround this problem by explicitly adding the missing package\n to your top-level package.json.\n\n at tryRequireResolve (../../../node_modules/@babel/core/src/config/files/plugins.ts:140:36)\n at tryRequireResolve (../../../node_modules/@babel/core/src/config/files/plugins.ts:168:19)\n at resolveStandardizedNameForRequire (../../../node_modules/@babel/core/src/config/files/plugins.ts:196:12)\n at resolvePreset (../../../node_modules/@babel/core/src/config/files/plugins.ts:50:32)\n at loadPreset.next (<anonymous>)\n at resolver (../../../node_modules/@babel/core/src/config/config-descriptors.ts:326:35)\n at createDescriptor.next (<anonymous>)\n at evaluateSync (../../../node_modules/gensync/index.js:251:28)\n at ../../../node_modules/gensync/index.js:31:34\n at Array.map (<anonymous>)\n at Function.sync (../../../node_modules/gensync/index.js:31:22)\n at Function.all (../../../node_modules/gensync/index.js:210:24)\n at all (../../../node_modules/@babel/core/src/config/config-descriptors.ts:267:38)\n at createDescriptors.next (<anonymous>)\n at createDescriptors (../../../node_modules/@babel/core/src/config/config-descriptors.ts:243:17)\n at createPresetDescriptors.next (<anonymous>)\n at fn (../../../node_modules/@babel/core/src/gensync-utils/functional.ts:18:46)\n at presets (../../../node_modules/@babel/core/src/config/config-chain.ts:725:34)\n at mergeChainOpts.next (<anonymous>)\n at mergeChainOpts (../../../node_modules/@babel/core/src/config/config-chain.ts:661:14)\n at chainWalker.next (<anonymous>)\n at loadFileChainWalker (../../../node_modules/@babel/core/src/config/config-chain.ts:398:24)\n at loadFileChain.next (<anonymous>)\n at loadFileChain (../../../node_modules/@babel/core/src/config/config-chain.ts:186:27)\n at buildRootChain.next (<anonymous>)\n at loadPrivatePartialConfig (../../../node_modules/@babel/core/src/config/partial.ts:111:44)\n at loadPrivatePartialConfig.next (<anonymous>)\n at loadPrivatePartialConfig (../../../node_modules/@babel/core/src/config/partial.ts:170:12)\n at loadPartialConfig.next (<anonymous>)\n at evaluateSync (../../../node_modules/gensync/index.js:251:28)\n at sync (../../../node_modules/gensync/index.js:89:14)\n at fn (../../../node_modules/@babel/core/src/errors/rewrite-stack-trace.ts:99:14)\n at loadPartialConfigSync (../../../node_modules/@babel/core/src/config/index.ts:50:60)\n at loadPartialConfigSync (../../../node_modules/@babel/core/src/config/index.ts:69:14)\n at ScriptTransformer._getCacheKey (../../../node_modules/@jest/transform/build/ScriptTransformer.js:228:41)\n at ScriptTransformer._getFileCachePath (../../../node_modules/@jest/transform/build/ScriptTransformer.js:289:27)\n at ScriptTransformer.transformSource (../../../node_modules/@jest/transform/build/ScriptTransformer.js:525:32)\n at ScriptTransformer._transformAndBuildScript (../../../node_modules/@jest/transform/build/ScriptTransformer.js:674:40)\n at ScriptTransformer.transform (../../../node_modules/@jest/transform/build/ScriptTransformer.js:726:19)\n",
|
|
1953
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/alphametics/alphametics.spec.js",
|
|
1954
|
+
"startTime": 1754602599393,
|
|
1955
|
+
"status": "failed",
|
|
1956
|
+
"summary": ""
|
|
1957
|
+
}
|
|
1958
|
+
],
|
|
1959
|
+
"wasInterrupted": false
|
|
1960
|
+
}
|
|
1961
|
+
},
|
|
1962
|
+
"timeElapsed": 194.395,
|
|
1963
|
+
"cost": 0.36192923626874995,
|
|
1964
|
+
"startTime": "2025-08-07T21:33:25.009Z",
|
|
1965
|
+
"endTime": "2025-08-07T21:36:39.404Z",
|
|
1966
|
+
"finalOutput": "Task terminated due to limits reached. Turn: 30/30, Cost: $0.3619/$1.0000, Runtime: 193646ms/300000ms"
|
|
1967
|
+
},
|
|
1968
|
+
{
|
|
1969
|
+
"exerciseName": "anagram",
|
|
1970
|
+
"status": "success",
|
|
1971
|
+
"turns": 16,
|
|
1972
|
+
"testResult": {
|
|
1973
|
+
"passed": 18,
|
|
1974
|
+
"failed": 0,
|
|
1975
|
+
"total": 18,
|
|
1976
|
+
"skipped": 0,
|
|
1977
|
+
"success": true,
|
|
1978
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":18,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":18,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602667015,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Anagram\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram no matches\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no matches\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects two anagrams\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects two anagrams\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram does not detect anagram subsets\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"does not detect anagram subsets\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagram\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagram\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects three anagrams\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects three anagrams\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects multiple anagrams with different case\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects multiple anagrams with different case\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram does not detect non-anagrams with identical checksum\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"does not detect non-anagrams with identical checksum\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagrams case-insensitively\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagrams case-insensitively\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagrams using case-insensitive subject\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagrams using case-insensitive subject\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagrams using case-insensitive possible matches\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagrams using case-insensitive possible matches\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram does not detect an anagram if the original word is repeated\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"does not detect an anagram if the original word is repeated\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram anagrams must use all letters exactly once\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"anagrams must use all letters exactly once\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words are not anagrams of themselves\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words are not anagrams of themselves\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words are not anagrams of themselves even if letter case is partially different\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words are not anagrams of themselves even if letter case is partially different\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words are not anagrams of themselves even if letter case is completely different\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words are not anagrams of themselves even if letter case is completely different\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words other than themselves can be anagrams\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words other than themselves can be anagrams\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram handles case of greek letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"handles case of greek letters\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram different characters may have the same bytes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"different characters may have the same bytes\"}],\"endTime\":1754602667144,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/anagram/anagram.spec.js\",\"startTime\":1754602667033,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
1979
|
+
"details": {
|
|
1980
|
+
"numFailedTestSuites": 0,
|
|
1981
|
+
"numFailedTests": 0,
|
|
1982
|
+
"numPassedTestSuites": 1,
|
|
1983
|
+
"numPassedTests": 18,
|
|
1984
|
+
"numPendingTestSuites": 0,
|
|
1985
|
+
"numPendingTests": 0,
|
|
1986
|
+
"numRuntimeErrorTestSuites": 0,
|
|
1987
|
+
"numTodoTests": 0,
|
|
1988
|
+
"numTotalTestSuites": 1,
|
|
1989
|
+
"numTotalTests": 18,
|
|
1990
|
+
"openHandles": [],
|
|
1991
|
+
"snapshot": {
|
|
1992
|
+
"added": 0,
|
|
1993
|
+
"didUpdate": false,
|
|
1994
|
+
"failure": false,
|
|
1995
|
+
"filesAdded": 0,
|
|
1996
|
+
"filesRemoved": 0,
|
|
1997
|
+
"filesRemovedList": [],
|
|
1998
|
+
"filesUnmatched": 0,
|
|
1999
|
+
"filesUpdated": 0,
|
|
2000
|
+
"matched": 0,
|
|
2001
|
+
"total": 0,
|
|
2002
|
+
"unchecked": 0,
|
|
2003
|
+
"uncheckedKeysByFile": [],
|
|
2004
|
+
"unmatched": 0,
|
|
2005
|
+
"updated": 0
|
|
2006
|
+
},
|
|
2007
|
+
"startTime": 1754602667015,
|
|
2008
|
+
"success": true,
|
|
2009
|
+
"testResults": [
|
|
2010
|
+
{
|
|
2011
|
+
"assertionResults": [
|
|
2012
|
+
{
|
|
2013
|
+
"ancestorTitles": [
|
|
2014
|
+
"Anagram"
|
|
2015
|
+
],
|
|
2016
|
+
"duration": 1,
|
|
2017
|
+
"failureDetails": [],
|
|
2018
|
+
"failureMessages": [],
|
|
2019
|
+
"fullName": "Anagram no matches",
|
|
2020
|
+
"invocations": 1,
|
|
2021
|
+
"location": null,
|
|
2022
|
+
"numPassingAsserts": 1,
|
|
2023
|
+
"retryReasons": [],
|
|
2024
|
+
"status": "passed",
|
|
2025
|
+
"title": "no matches"
|
|
2026
|
+
},
|
|
2027
|
+
{
|
|
2028
|
+
"ancestorTitles": [
|
|
2029
|
+
"Anagram"
|
|
2030
|
+
],
|
|
2031
|
+
"duration": 0,
|
|
2032
|
+
"failureDetails": [],
|
|
2033
|
+
"failureMessages": [],
|
|
2034
|
+
"fullName": "Anagram detects two anagrams",
|
|
2035
|
+
"invocations": 1,
|
|
2036
|
+
"location": null,
|
|
2037
|
+
"numPassingAsserts": 1,
|
|
2038
|
+
"retryReasons": [],
|
|
2039
|
+
"status": "passed",
|
|
2040
|
+
"title": "detects two anagrams"
|
|
2041
|
+
},
|
|
2042
|
+
{
|
|
2043
|
+
"ancestorTitles": [
|
|
2044
|
+
"Anagram"
|
|
2045
|
+
],
|
|
2046
|
+
"duration": 1,
|
|
2047
|
+
"failureDetails": [],
|
|
2048
|
+
"failureMessages": [],
|
|
2049
|
+
"fullName": "Anagram does not detect anagram subsets",
|
|
2050
|
+
"invocations": 1,
|
|
2051
|
+
"location": null,
|
|
2052
|
+
"numPassingAsserts": 1,
|
|
2053
|
+
"retryReasons": [],
|
|
2054
|
+
"status": "passed",
|
|
2055
|
+
"title": "does not detect anagram subsets"
|
|
2056
|
+
},
|
|
2057
|
+
{
|
|
2058
|
+
"ancestorTitles": [
|
|
2059
|
+
"Anagram"
|
|
2060
|
+
],
|
|
2061
|
+
"duration": 0,
|
|
2062
|
+
"failureDetails": [],
|
|
2063
|
+
"failureMessages": [],
|
|
2064
|
+
"fullName": "Anagram detects anagram",
|
|
2065
|
+
"invocations": 1,
|
|
2066
|
+
"location": null,
|
|
2067
|
+
"numPassingAsserts": 1,
|
|
2068
|
+
"retryReasons": [],
|
|
2069
|
+
"status": "passed",
|
|
2070
|
+
"title": "detects anagram"
|
|
2071
|
+
},
|
|
2072
|
+
{
|
|
2073
|
+
"ancestorTitles": [
|
|
2074
|
+
"Anagram"
|
|
2075
|
+
],
|
|
2076
|
+
"duration": 0,
|
|
2077
|
+
"failureDetails": [],
|
|
2078
|
+
"failureMessages": [],
|
|
2079
|
+
"fullName": "Anagram detects three anagrams",
|
|
2080
|
+
"invocations": 1,
|
|
2081
|
+
"location": null,
|
|
2082
|
+
"numPassingAsserts": 1,
|
|
2083
|
+
"retryReasons": [],
|
|
2084
|
+
"status": "passed",
|
|
2085
|
+
"title": "detects three anagrams"
|
|
2086
|
+
},
|
|
2087
|
+
{
|
|
2088
|
+
"ancestorTitles": [
|
|
2089
|
+
"Anagram"
|
|
2090
|
+
],
|
|
2091
|
+
"duration": 0,
|
|
2092
|
+
"failureDetails": [],
|
|
2093
|
+
"failureMessages": [],
|
|
2094
|
+
"fullName": "Anagram detects multiple anagrams with different case",
|
|
2095
|
+
"invocations": 1,
|
|
2096
|
+
"location": null,
|
|
2097
|
+
"numPassingAsserts": 1,
|
|
2098
|
+
"retryReasons": [],
|
|
2099
|
+
"status": "passed",
|
|
2100
|
+
"title": "detects multiple anagrams with different case"
|
|
2101
|
+
},
|
|
2102
|
+
{
|
|
2103
|
+
"ancestorTitles": [
|
|
2104
|
+
"Anagram"
|
|
2105
|
+
],
|
|
2106
|
+
"duration": 0,
|
|
2107
|
+
"failureDetails": [],
|
|
2108
|
+
"failureMessages": [],
|
|
2109
|
+
"fullName": "Anagram does not detect non-anagrams with identical checksum",
|
|
2110
|
+
"invocations": 1,
|
|
2111
|
+
"location": null,
|
|
2112
|
+
"numPassingAsserts": 1,
|
|
2113
|
+
"retryReasons": [],
|
|
2114
|
+
"status": "passed",
|
|
2115
|
+
"title": "does not detect non-anagrams with identical checksum"
|
|
2116
|
+
},
|
|
2117
|
+
{
|
|
2118
|
+
"ancestorTitles": [
|
|
2119
|
+
"Anagram"
|
|
2120
|
+
],
|
|
2121
|
+
"duration": 0,
|
|
2122
|
+
"failureDetails": [],
|
|
2123
|
+
"failureMessages": [],
|
|
2124
|
+
"fullName": "Anagram detects anagrams case-insensitively",
|
|
2125
|
+
"invocations": 1,
|
|
2126
|
+
"location": null,
|
|
2127
|
+
"numPassingAsserts": 1,
|
|
2128
|
+
"retryReasons": [],
|
|
2129
|
+
"status": "passed",
|
|
2130
|
+
"title": "detects anagrams case-insensitively"
|
|
2131
|
+
},
|
|
2132
|
+
{
|
|
2133
|
+
"ancestorTitles": [
|
|
2134
|
+
"Anagram"
|
|
2135
|
+
],
|
|
2136
|
+
"duration": 0,
|
|
2137
|
+
"failureDetails": [],
|
|
2138
|
+
"failureMessages": [],
|
|
2139
|
+
"fullName": "Anagram detects anagrams using case-insensitive subject",
|
|
2140
|
+
"invocations": 1,
|
|
2141
|
+
"location": null,
|
|
2142
|
+
"numPassingAsserts": 1,
|
|
2143
|
+
"retryReasons": [],
|
|
2144
|
+
"status": "passed",
|
|
2145
|
+
"title": "detects anagrams using case-insensitive subject"
|
|
2146
|
+
},
|
|
2147
|
+
{
|
|
2148
|
+
"ancestorTitles": [
|
|
2149
|
+
"Anagram"
|
|
2150
|
+
],
|
|
2151
|
+
"duration": 0,
|
|
2152
|
+
"failureDetails": [],
|
|
2153
|
+
"failureMessages": [],
|
|
2154
|
+
"fullName": "Anagram detects anagrams using case-insensitive possible matches",
|
|
2155
|
+
"invocations": 1,
|
|
2156
|
+
"location": null,
|
|
2157
|
+
"numPassingAsserts": 1,
|
|
2158
|
+
"retryReasons": [],
|
|
2159
|
+
"status": "passed",
|
|
2160
|
+
"title": "detects anagrams using case-insensitive possible matches"
|
|
2161
|
+
},
|
|
2162
|
+
{
|
|
2163
|
+
"ancestorTitles": [
|
|
2164
|
+
"Anagram"
|
|
2165
|
+
],
|
|
2166
|
+
"duration": 0,
|
|
2167
|
+
"failureDetails": [],
|
|
2168
|
+
"failureMessages": [],
|
|
2169
|
+
"fullName": "Anagram does not detect an anagram if the original word is repeated",
|
|
2170
|
+
"invocations": 1,
|
|
2171
|
+
"location": null,
|
|
2172
|
+
"numPassingAsserts": 1,
|
|
2173
|
+
"retryReasons": [],
|
|
2174
|
+
"status": "passed",
|
|
2175
|
+
"title": "does not detect an anagram if the original word is repeated"
|
|
2176
|
+
},
|
|
2177
|
+
{
|
|
2178
|
+
"ancestorTitles": [
|
|
2179
|
+
"Anagram"
|
|
2180
|
+
],
|
|
2181
|
+
"duration": 0,
|
|
2182
|
+
"failureDetails": [],
|
|
2183
|
+
"failureMessages": [],
|
|
2184
|
+
"fullName": "Anagram anagrams must use all letters exactly once",
|
|
2185
|
+
"invocations": 1,
|
|
2186
|
+
"location": null,
|
|
2187
|
+
"numPassingAsserts": 1,
|
|
2188
|
+
"retryReasons": [],
|
|
2189
|
+
"status": "passed",
|
|
2190
|
+
"title": "anagrams must use all letters exactly once"
|
|
2191
|
+
},
|
|
2192
|
+
{
|
|
2193
|
+
"ancestorTitles": [
|
|
2194
|
+
"Anagram"
|
|
2195
|
+
],
|
|
2196
|
+
"duration": 0,
|
|
2197
|
+
"failureDetails": [],
|
|
2198
|
+
"failureMessages": [],
|
|
2199
|
+
"fullName": "Anagram words are not anagrams of themselves",
|
|
2200
|
+
"invocations": 1,
|
|
2201
|
+
"location": null,
|
|
2202
|
+
"numPassingAsserts": 1,
|
|
2203
|
+
"retryReasons": [],
|
|
2204
|
+
"status": "passed",
|
|
2205
|
+
"title": "words are not anagrams of themselves"
|
|
2206
|
+
},
|
|
2207
|
+
{
|
|
2208
|
+
"ancestorTitles": [
|
|
2209
|
+
"Anagram"
|
|
2210
|
+
],
|
|
2211
|
+
"duration": 1,
|
|
2212
|
+
"failureDetails": [],
|
|
2213
|
+
"failureMessages": [],
|
|
2214
|
+
"fullName": "Anagram words are not anagrams of themselves even if letter case is partially different",
|
|
2215
|
+
"invocations": 1,
|
|
2216
|
+
"location": null,
|
|
2217
|
+
"numPassingAsserts": 1,
|
|
2218
|
+
"retryReasons": [],
|
|
2219
|
+
"status": "passed",
|
|
2220
|
+
"title": "words are not anagrams of themselves even if letter case is partially different"
|
|
2221
|
+
},
|
|
2222
|
+
{
|
|
2223
|
+
"ancestorTitles": [
|
|
2224
|
+
"Anagram"
|
|
2225
|
+
],
|
|
2226
|
+
"duration": 0,
|
|
2227
|
+
"failureDetails": [],
|
|
2228
|
+
"failureMessages": [],
|
|
2229
|
+
"fullName": "Anagram words are not anagrams of themselves even if letter case is completely different",
|
|
2230
|
+
"invocations": 1,
|
|
2231
|
+
"location": null,
|
|
2232
|
+
"numPassingAsserts": 1,
|
|
2233
|
+
"retryReasons": [],
|
|
2234
|
+
"status": "passed",
|
|
2235
|
+
"title": "words are not anagrams of themselves even if letter case is completely different"
|
|
2236
|
+
},
|
|
2237
|
+
{
|
|
2238
|
+
"ancestorTitles": [
|
|
2239
|
+
"Anagram"
|
|
2240
|
+
],
|
|
2241
|
+
"duration": 0,
|
|
2242
|
+
"failureDetails": [],
|
|
2243
|
+
"failureMessages": [],
|
|
2244
|
+
"fullName": "Anagram words other than themselves can be anagrams",
|
|
2245
|
+
"invocations": 1,
|
|
2246
|
+
"location": null,
|
|
2247
|
+
"numPassingAsserts": 1,
|
|
2248
|
+
"retryReasons": [],
|
|
2249
|
+
"status": "passed",
|
|
2250
|
+
"title": "words other than themselves can be anagrams"
|
|
2251
|
+
},
|
|
2252
|
+
{
|
|
2253
|
+
"ancestorTitles": [
|
|
2254
|
+
"Anagram"
|
|
2255
|
+
],
|
|
2256
|
+
"duration": 0,
|
|
2257
|
+
"failureDetails": [],
|
|
2258
|
+
"failureMessages": [],
|
|
2259
|
+
"fullName": "Anagram handles case of greek letters",
|
|
2260
|
+
"invocations": 1,
|
|
2261
|
+
"location": null,
|
|
2262
|
+
"numPassingAsserts": 1,
|
|
2263
|
+
"retryReasons": [],
|
|
2264
|
+
"status": "passed",
|
|
2265
|
+
"title": "handles case of greek letters"
|
|
2266
|
+
},
|
|
2267
|
+
{
|
|
2268
|
+
"ancestorTitles": [
|
|
2269
|
+
"Anagram"
|
|
2270
|
+
],
|
|
2271
|
+
"duration": 0,
|
|
2272
|
+
"failureDetails": [],
|
|
2273
|
+
"failureMessages": [],
|
|
2274
|
+
"fullName": "Anagram different characters may have the same bytes",
|
|
2275
|
+
"invocations": 1,
|
|
2276
|
+
"location": null,
|
|
2277
|
+
"numPassingAsserts": 1,
|
|
2278
|
+
"retryReasons": [],
|
|
2279
|
+
"status": "passed",
|
|
2280
|
+
"title": "different characters may have the same bytes"
|
|
2281
|
+
}
|
|
2282
|
+
],
|
|
2283
|
+
"endTime": 1754602667144,
|
|
2284
|
+
"message": "",
|
|
2285
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/anagram/anagram.spec.js",
|
|
2286
|
+
"startTime": 1754602667033,
|
|
2287
|
+
"status": "passed",
|
|
2288
|
+
"summary": ""
|
|
2289
|
+
}
|
|
2290
|
+
],
|
|
2291
|
+
"wasInterrupted": false
|
|
2292
|
+
}
|
|
2293
|
+
},
|
|
2294
|
+
"timeElapsed": 67.733,
|
|
2295
|
+
"cost": 0.07476439521749999,
|
|
2296
|
+
"startTime": "2025-08-07T21:36:39.421Z",
|
|
2297
|
+
"endTime": "2025-08-07T21:37:47.154Z",
|
|
2298
|
+
"finalOutput": "I have successfully solved the anagram coding exercise! Here's what I accomplished:\n\n## Problem Understanding\nThe exercise required implementing a `findAnagrams` function that:\n- Takes a subject word and an array of candidate words\n- Returns an array of words from candidates that are anagrams of the subject\n- Handles case-insensitive comparison\n- Excludes words that are identical to the subject (even with different case)\n- Requires exact letter matching (all letters used exactly once)\n- Supports Unicode characters\n\n## Implementation\nI implemented the `findAnagrams` function in `anagram.js` with the following approach:\n\n1. **Normalization**: Created a helper function `normalizeWord` that converts words to lowercase and sorts their letters alphabetically\n2. **Filtering**: Used `Array.filter()` to check each candidate against two conditions:\n - The candidate is not identical to the subject (case-insensitive)\n - The normalized forms (sorted letters) are identical\n\n## Key Features of the Solution\n- **Case-insensitive**: Compares words regardless of case\n- **Self-exclusion**: Words cannot be anagrams of themselves\n- **Exact matching**: Uses character sorting to ensure exact letter frequency matching\n- **Unicode support**: Works with Greek letters and special characters\n- **Efficient**: O(n*m*log(m)) where n is candidates length and m is average word length\n\n## Project Setup and Testing\n1. ✅ Installed dependencies with `npm install`\n2. ✅ Implemented the core functionality\n3. ✅ Unskipped all tests by changing `xtest` to `test`\n4. ✅ Fixed lint issues by removing unused `xtest` import\n5. ✅ All 18 tests now pass successfully\n6. ✅ Code passes ESLint validation\n\n## Test Results\n- **18/18 tests passing** ✅\n- All edge cases handled including:\n - No matches\n - Multiple anagrams\n - Case variations\n - Self-exclusion\n - Unicode characters\n - Identical checksums but different letters\n\nThe solution is robust, efficient, and handles all the specified requirements and edge cases perfectly!"
|
|
2299
|
+
},
|
|
2300
|
+
{
|
|
2301
|
+
"exerciseName": "armstrong-numbers",
|
|
2302
|
+
"status": "success",
|
|
2303
|
+
"turns": 15,
|
|
2304
|
+
"testResult": {
|
|
2305
|
+
"passed": 11,
|
|
2306
|
+
"failed": 0,
|
|
2307
|
+
"total": 11,
|
|
2308
|
+
"skipped": 0,
|
|
2309
|
+
"success": true,
|
|
2310
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":11,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":11,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602721410,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Zero is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Zero is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Single-digit numbers are Armstrong numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Single-digit numbers are Armstrong numbers\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers There are no two-digit Armstrong numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"There are no two-digit Armstrong numbers\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Three-digit number that is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Three-digit number that is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Three-digit number that is not an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Three-digit number that is not an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Four-digit number that is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Four-digit number that is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Four-digit number that is not an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Four-digit number that is not an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Seven-digit number that is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Seven-digit number that is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Seven-digit number that is not an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Seven-digit number that is not an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Armstrong number containing seven zeroes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Armstrong number containing seven zeroes\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers The largest and last Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"The largest and last Armstrong number\"}],\"endTime\":1754602721531,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/armstrong-numbers/armstrong-numbers.spec.js\",\"startTime\":1754602721430,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
2311
|
+
"details": {
|
|
2312
|
+
"numFailedTestSuites": 0,
|
|
2313
|
+
"numFailedTests": 0,
|
|
2314
|
+
"numPassedTestSuites": 1,
|
|
2315
|
+
"numPassedTests": 11,
|
|
2316
|
+
"numPendingTestSuites": 0,
|
|
2317
|
+
"numPendingTests": 0,
|
|
2318
|
+
"numRuntimeErrorTestSuites": 0,
|
|
2319
|
+
"numTodoTests": 0,
|
|
2320
|
+
"numTotalTestSuites": 1,
|
|
2321
|
+
"numTotalTests": 11,
|
|
2322
|
+
"openHandles": [],
|
|
2323
|
+
"snapshot": {
|
|
2324
|
+
"added": 0,
|
|
2325
|
+
"didUpdate": false,
|
|
2326
|
+
"failure": false,
|
|
2327
|
+
"filesAdded": 0,
|
|
2328
|
+
"filesRemoved": 0,
|
|
2329
|
+
"filesRemovedList": [],
|
|
2330
|
+
"filesUnmatched": 0,
|
|
2331
|
+
"filesUpdated": 0,
|
|
2332
|
+
"matched": 0,
|
|
2333
|
+
"total": 0,
|
|
2334
|
+
"unchecked": 0,
|
|
2335
|
+
"uncheckedKeysByFile": [],
|
|
2336
|
+
"unmatched": 0,
|
|
2337
|
+
"updated": 0
|
|
2338
|
+
},
|
|
2339
|
+
"startTime": 1754602721410,
|
|
2340
|
+
"success": true,
|
|
2341
|
+
"testResults": [
|
|
2342
|
+
{
|
|
2343
|
+
"assertionResults": [
|
|
2344
|
+
{
|
|
2345
|
+
"ancestorTitles": [
|
|
2346
|
+
"Armstrong Numbers"
|
|
2347
|
+
],
|
|
2348
|
+
"duration": 1,
|
|
2349
|
+
"failureDetails": [],
|
|
2350
|
+
"failureMessages": [],
|
|
2351
|
+
"fullName": "Armstrong Numbers Zero is an Armstrong number",
|
|
2352
|
+
"invocations": 1,
|
|
2353
|
+
"location": null,
|
|
2354
|
+
"numPassingAsserts": 1,
|
|
2355
|
+
"retryReasons": [],
|
|
2356
|
+
"status": "passed",
|
|
2357
|
+
"title": "Zero is an Armstrong number"
|
|
2358
|
+
},
|
|
2359
|
+
{
|
|
2360
|
+
"ancestorTitles": [
|
|
2361
|
+
"Armstrong Numbers"
|
|
2362
|
+
],
|
|
2363
|
+
"duration": 0,
|
|
2364
|
+
"failureDetails": [],
|
|
2365
|
+
"failureMessages": [],
|
|
2366
|
+
"fullName": "Armstrong Numbers Single-digit numbers are Armstrong numbers",
|
|
2367
|
+
"invocations": 1,
|
|
2368
|
+
"location": null,
|
|
2369
|
+
"numPassingAsserts": 1,
|
|
2370
|
+
"retryReasons": [],
|
|
2371
|
+
"status": "passed",
|
|
2372
|
+
"title": "Single-digit numbers are Armstrong numbers"
|
|
2373
|
+
},
|
|
2374
|
+
{
|
|
2375
|
+
"ancestorTitles": [
|
|
2376
|
+
"Armstrong Numbers"
|
|
2377
|
+
],
|
|
2378
|
+
"duration": 0,
|
|
2379
|
+
"failureDetails": [],
|
|
2380
|
+
"failureMessages": [],
|
|
2381
|
+
"fullName": "Armstrong Numbers There are no two-digit Armstrong numbers",
|
|
2382
|
+
"invocations": 1,
|
|
2383
|
+
"location": null,
|
|
2384
|
+
"numPassingAsserts": 1,
|
|
2385
|
+
"retryReasons": [],
|
|
2386
|
+
"status": "passed",
|
|
2387
|
+
"title": "There are no two-digit Armstrong numbers"
|
|
2388
|
+
},
|
|
2389
|
+
{
|
|
2390
|
+
"ancestorTitles": [
|
|
2391
|
+
"Armstrong Numbers"
|
|
2392
|
+
],
|
|
2393
|
+
"duration": 0,
|
|
2394
|
+
"failureDetails": [],
|
|
2395
|
+
"failureMessages": [],
|
|
2396
|
+
"fullName": "Armstrong Numbers Three-digit number that is an Armstrong number",
|
|
2397
|
+
"invocations": 1,
|
|
2398
|
+
"location": null,
|
|
2399
|
+
"numPassingAsserts": 1,
|
|
2400
|
+
"retryReasons": [],
|
|
2401
|
+
"status": "passed",
|
|
2402
|
+
"title": "Three-digit number that is an Armstrong number"
|
|
2403
|
+
},
|
|
2404
|
+
{
|
|
2405
|
+
"ancestorTitles": [
|
|
2406
|
+
"Armstrong Numbers"
|
|
2407
|
+
],
|
|
2408
|
+
"duration": 0,
|
|
2409
|
+
"failureDetails": [],
|
|
2410
|
+
"failureMessages": [],
|
|
2411
|
+
"fullName": "Armstrong Numbers Three-digit number that is not an Armstrong number",
|
|
2412
|
+
"invocations": 1,
|
|
2413
|
+
"location": null,
|
|
2414
|
+
"numPassingAsserts": 1,
|
|
2415
|
+
"retryReasons": [],
|
|
2416
|
+
"status": "passed",
|
|
2417
|
+
"title": "Three-digit number that is not an Armstrong number"
|
|
2418
|
+
},
|
|
2419
|
+
{
|
|
2420
|
+
"ancestorTitles": [
|
|
2421
|
+
"Armstrong Numbers"
|
|
2422
|
+
],
|
|
2423
|
+
"duration": 0,
|
|
2424
|
+
"failureDetails": [],
|
|
2425
|
+
"failureMessages": [],
|
|
2426
|
+
"fullName": "Armstrong Numbers Four-digit number that is an Armstrong number",
|
|
2427
|
+
"invocations": 1,
|
|
2428
|
+
"location": null,
|
|
2429
|
+
"numPassingAsserts": 1,
|
|
2430
|
+
"retryReasons": [],
|
|
2431
|
+
"status": "passed",
|
|
2432
|
+
"title": "Four-digit number that is an Armstrong number"
|
|
2433
|
+
},
|
|
2434
|
+
{
|
|
2435
|
+
"ancestorTitles": [
|
|
2436
|
+
"Armstrong Numbers"
|
|
2437
|
+
],
|
|
2438
|
+
"duration": 0,
|
|
2439
|
+
"failureDetails": [],
|
|
2440
|
+
"failureMessages": [],
|
|
2441
|
+
"fullName": "Armstrong Numbers Four-digit number that is not an Armstrong number",
|
|
2442
|
+
"invocations": 1,
|
|
2443
|
+
"location": null,
|
|
2444
|
+
"numPassingAsserts": 1,
|
|
2445
|
+
"retryReasons": [],
|
|
2446
|
+
"status": "passed",
|
|
2447
|
+
"title": "Four-digit number that is not an Armstrong number"
|
|
2448
|
+
},
|
|
2449
|
+
{
|
|
2450
|
+
"ancestorTitles": [
|
|
2451
|
+
"Armstrong Numbers"
|
|
2452
|
+
],
|
|
2453
|
+
"duration": 0,
|
|
2454
|
+
"failureDetails": [],
|
|
2455
|
+
"failureMessages": [],
|
|
2456
|
+
"fullName": "Armstrong Numbers Seven-digit number that is an Armstrong number",
|
|
2457
|
+
"invocations": 1,
|
|
2458
|
+
"location": null,
|
|
2459
|
+
"numPassingAsserts": 1,
|
|
2460
|
+
"retryReasons": [],
|
|
2461
|
+
"status": "passed",
|
|
2462
|
+
"title": "Seven-digit number that is an Armstrong number"
|
|
2463
|
+
},
|
|
2464
|
+
{
|
|
2465
|
+
"ancestorTitles": [
|
|
2466
|
+
"Armstrong Numbers"
|
|
2467
|
+
],
|
|
2468
|
+
"duration": 1,
|
|
2469
|
+
"failureDetails": [],
|
|
2470
|
+
"failureMessages": [],
|
|
2471
|
+
"fullName": "Armstrong Numbers Seven-digit number that is not an Armstrong number",
|
|
2472
|
+
"invocations": 1,
|
|
2473
|
+
"location": null,
|
|
2474
|
+
"numPassingAsserts": 1,
|
|
2475
|
+
"retryReasons": [],
|
|
2476
|
+
"status": "passed",
|
|
2477
|
+
"title": "Seven-digit number that is not an Armstrong number"
|
|
2478
|
+
},
|
|
2479
|
+
{
|
|
2480
|
+
"ancestorTitles": [
|
|
2481
|
+
"Armstrong Numbers"
|
|
2482
|
+
],
|
|
2483
|
+
"duration": 0,
|
|
2484
|
+
"failureDetails": [],
|
|
2485
|
+
"failureMessages": [],
|
|
2486
|
+
"fullName": "Armstrong Numbers Armstrong number containing seven zeroes",
|
|
2487
|
+
"invocations": 1,
|
|
2488
|
+
"location": null,
|
|
2489
|
+
"numPassingAsserts": 1,
|
|
2490
|
+
"retryReasons": [],
|
|
2491
|
+
"status": "passed",
|
|
2492
|
+
"title": "Armstrong number containing seven zeroes"
|
|
2493
|
+
},
|
|
2494
|
+
{
|
|
2495
|
+
"ancestorTitles": [
|
|
2496
|
+
"Armstrong Numbers"
|
|
2497
|
+
],
|
|
2498
|
+
"duration": 0,
|
|
2499
|
+
"failureDetails": [],
|
|
2500
|
+
"failureMessages": [],
|
|
2501
|
+
"fullName": "Armstrong Numbers The largest and last Armstrong number",
|
|
2502
|
+
"invocations": 1,
|
|
2503
|
+
"location": null,
|
|
2504
|
+
"numPassingAsserts": 1,
|
|
2505
|
+
"retryReasons": [],
|
|
2506
|
+
"status": "passed",
|
|
2507
|
+
"title": "The largest and last Armstrong number"
|
|
2508
|
+
}
|
|
2509
|
+
],
|
|
2510
|
+
"endTime": 1754602721531,
|
|
2511
|
+
"message": "",
|
|
2512
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/armstrong-numbers/armstrong-numbers.spec.js",
|
|
2513
|
+
"startTime": 1754602721430,
|
|
2514
|
+
"status": "passed",
|
|
2515
|
+
"summary": ""
|
|
2516
|
+
}
|
|
2517
|
+
],
|
|
2518
|
+
"wasInterrupted": false
|
|
2519
|
+
}
|
|
2520
|
+
},
|
|
2521
|
+
"timeElapsed": 54.366,
|
|
2522
|
+
"cost": 0.07622014052625,
|
|
2523
|
+
"startTime": "2025-08-07T21:37:47.176Z",
|
|
2524
|
+
"endTime": "2025-08-07T21:38:41.542Z",
|
|
2525
|
+
"finalOutput": "I have successfully solved the Armstrong numbers coding exercise! Here's what I accomplished:\n\n## Problem Understanding\nAn Armstrong number is a number that equals the sum of its own digits each raised to the power of the number of digits. For example:\n- 9 = 9^1 = 9 (Armstrong number)\n- 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 (Armstrong number)\n- 10 ≠ 1^2 + 0^2 = 1 (not an Armstrong number)\n\n## Implementation\nI implemented the `isArmstrongNumber` function in `armstrong-numbers.js` with the following approach:\n\n1. **Convert input to string**: This allows me to easily access individual digits and works with both regular numbers and BigInt values\n2. **Count digits**: Get the total number of digits to use as the exponent\n3. **Calculate sum**: Iterate through each digit, convert to BigInt, raise to the power of digit count, and sum them up\n4. **Compare**: Return true if the calculated sum equals the original number (converted to BigInt for consistency)\n\nKey features of my solution:\n- **BigInt support**: Handles very large numbers like `186709961001538790100634132976990n`\n- **Efficient**: Single pass through the digits\n- **Robust**: Works with all test cases from single digits to 39-digit numbers\n\n## Testing Results\nAfter setting up the project with `npm install` and unskipping all tests by changing `xtest` to `test`, all 11 tests pass:\n\n✅ Zero is an Armstrong number \n✅ Single-digit numbers are Armstrong numbers \n✅ There are no two-digit Armstrong numbers \n✅ Three-digit number that is an Armstrong number \n✅ Three-digit number that is not an Armstrong number \n✅ Four-digit number that is an Armstrong number \n✅ Four-digit number that is not an Armstrong number \n✅ Seven-digit number that is an Armstrong number \n✅ Seven-digit number that is not an Armstrong number \n✅ Armstrong number containing seven zeroes \n✅ The largest and last Armstrong number \n\nThe solution correctly handles all edge cases including very large BigInt numbers, demonstrating a complete and robust implementation of the Armstrong number algorithm."
|
|
2526
|
+
},
|
|
2527
|
+
{
|
|
2528
|
+
"exerciseName": "atbash-cipher",
|
|
2529
|
+
"status": "success",
|
|
2530
|
+
"turns": 28,
|
|
2531
|
+
"testResult": {
|
|
2532
|
+
"passed": 14,
|
|
2533
|
+
"failed": 0,
|
|
2534
|
+
"total": 14,
|
|
2535
|
+
"skipped": 0,
|
|
2536
|
+
"success": true,
|
|
2537
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":14,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":14,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602819693,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":2,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode yes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode yes\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode no\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode no\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode OMG\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode OMG\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode spaces\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode mindblowingly\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode mindblowingly\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode numbers\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode deep thought\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode deep thought\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode all the letters\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode exercism\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode exercism\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode a sentence\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode a sentence\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode numbers\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode all the letters\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode with too many spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with too many spaces\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode with no spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with no spaces\"}],\"endTime\":1754602819837,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/atbash-cipher/atbash-cipher.spec.js\",\"startTime\":1754602819716,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
2538
|
+
"details": {
|
|
2539
|
+
"numFailedTestSuites": 0,
|
|
2540
|
+
"numFailedTests": 0,
|
|
2541
|
+
"numPassedTestSuites": 1,
|
|
2542
|
+
"numPassedTests": 14,
|
|
2543
|
+
"numPendingTestSuites": 0,
|
|
2544
|
+
"numPendingTests": 0,
|
|
2545
|
+
"numRuntimeErrorTestSuites": 0,
|
|
2546
|
+
"numTodoTests": 0,
|
|
2547
|
+
"numTotalTestSuites": 1,
|
|
2548
|
+
"numTotalTests": 14,
|
|
2549
|
+
"openHandles": [],
|
|
2550
|
+
"snapshot": {
|
|
2551
|
+
"added": 0,
|
|
2552
|
+
"didUpdate": false,
|
|
2553
|
+
"failure": false,
|
|
2554
|
+
"filesAdded": 0,
|
|
2555
|
+
"filesRemoved": 0,
|
|
2556
|
+
"filesRemovedList": [],
|
|
2557
|
+
"filesUnmatched": 0,
|
|
2558
|
+
"filesUpdated": 0,
|
|
2559
|
+
"matched": 0,
|
|
2560
|
+
"total": 0,
|
|
2561
|
+
"unchecked": 0,
|
|
2562
|
+
"uncheckedKeysByFile": [],
|
|
2563
|
+
"unmatched": 0,
|
|
2564
|
+
"updated": 0
|
|
2565
|
+
},
|
|
2566
|
+
"startTime": 1754602819693,
|
|
2567
|
+
"success": true,
|
|
2568
|
+
"testResults": [
|
|
2569
|
+
{
|
|
2570
|
+
"assertionResults": [
|
|
2571
|
+
{
|
|
2572
|
+
"ancestorTitles": [
|
|
2573
|
+
"Atbash Cipher",
|
|
2574
|
+
"encode"
|
|
2575
|
+
],
|
|
2576
|
+
"duration": 2,
|
|
2577
|
+
"failureDetails": [],
|
|
2578
|
+
"failureMessages": [],
|
|
2579
|
+
"fullName": "Atbash Cipher encode encode yes",
|
|
2580
|
+
"invocations": 1,
|
|
2581
|
+
"location": null,
|
|
2582
|
+
"numPassingAsserts": 1,
|
|
2583
|
+
"retryReasons": [],
|
|
2584
|
+
"status": "passed",
|
|
2585
|
+
"title": "encode yes"
|
|
2586
|
+
},
|
|
2587
|
+
{
|
|
2588
|
+
"ancestorTitles": [
|
|
2589
|
+
"Atbash Cipher",
|
|
2590
|
+
"encode"
|
|
2591
|
+
],
|
|
2592
|
+
"duration": 1,
|
|
2593
|
+
"failureDetails": [],
|
|
2594
|
+
"failureMessages": [],
|
|
2595
|
+
"fullName": "Atbash Cipher encode encode no",
|
|
2596
|
+
"invocations": 1,
|
|
2597
|
+
"location": null,
|
|
2598
|
+
"numPassingAsserts": 1,
|
|
2599
|
+
"retryReasons": [],
|
|
2600
|
+
"status": "passed",
|
|
2601
|
+
"title": "encode no"
|
|
2602
|
+
},
|
|
2603
|
+
{
|
|
2604
|
+
"ancestorTitles": [
|
|
2605
|
+
"Atbash Cipher",
|
|
2606
|
+
"encode"
|
|
2607
|
+
],
|
|
2608
|
+
"duration": 0,
|
|
2609
|
+
"failureDetails": [],
|
|
2610
|
+
"failureMessages": [],
|
|
2611
|
+
"fullName": "Atbash Cipher encode encode OMG",
|
|
2612
|
+
"invocations": 1,
|
|
2613
|
+
"location": null,
|
|
2614
|
+
"numPassingAsserts": 1,
|
|
2615
|
+
"retryReasons": [],
|
|
2616
|
+
"status": "passed",
|
|
2617
|
+
"title": "encode OMG"
|
|
2618
|
+
},
|
|
2619
|
+
{
|
|
2620
|
+
"ancestorTitles": [
|
|
2621
|
+
"Atbash Cipher",
|
|
2622
|
+
"encode"
|
|
2623
|
+
],
|
|
2624
|
+
"duration": 0,
|
|
2625
|
+
"failureDetails": [],
|
|
2626
|
+
"failureMessages": [],
|
|
2627
|
+
"fullName": "Atbash Cipher encode encode spaces",
|
|
2628
|
+
"invocations": 1,
|
|
2629
|
+
"location": null,
|
|
2630
|
+
"numPassingAsserts": 1,
|
|
2631
|
+
"retryReasons": [],
|
|
2632
|
+
"status": "passed",
|
|
2633
|
+
"title": "encode spaces"
|
|
2634
|
+
},
|
|
2635
|
+
{
|
|
2636
|
+
"ancestorTitles": [
|
|
2637
|
+
"Atbash Cipher",
|
|
2638
|
+
"encode"
|
|
2639
|
+
],
|
|
2640
|
+
"duration": 0,
|
|
2641
|
+
"failureDetails": [],
|
|
2642
|
+
"failureMessages": [],
|
|
2643
|
+
"fullName": "Atbash Cipher encode encode mindblowingly",
|
|
2644
|
+
"invocations": 1,
|
|
2645
|
+
"location": null,
|
|
2646
|
+
"numPassingAsserts": 1,
|
|
2647
|
+
"retryReasons": [],
|
|
2648
|
+
"status": "passed",
|
|
2649
|
+
"title": "encode mindblowingly"
|
|
2650
|
+
},
|
|
2651
|
+
{
|
|
2652
|
+
"ancestorTitles": [
|
|
2653
|
+
"Atbash Cipher",
|
|
2654
|
+
"encode"
|
|
2655
|
+
],
|
|
2656
|
+
"duration": 0,
|
|
2657
|
+
"failureDetails": [],
|
|
2658
|
+
"failureMessages": [],
|
|
2659
|
+
"fullName": "Atbash Cipher encode encode numbers",
|
|
2660
|
+
"invocations": 1,
|
|
2661
|
+
"location": null,
|
|
2662
|
+
"numPassingAsserts": 1,
|
|
2663
|
+
"retryReasons": [],
|
|
2664
|
+
"status": "passed",
|
|
2665
|
+
"title": "encode numbers"
|
|
2666
|
+
},
|
|
2667
|
+
{
|
|
2668
|
+
"ancestorTitles": [
|
|
2669
|
+
"Atbash Cipher",
|
|
2670
|
+
"encode"
|
|
2671
|
+
],
|
|
2672
|
+
"duration": 1,
|
|
2673
|
+
"failureDetails": [],
|
|
2674
|
+
"failureMessages": [],
|
|
2675
|
+
"fullName": "Atbash Cipher encode encode deep thought",
|
|
2676
|
+
"invocations": 1,
|
|
2677
|
+
"location": null,
|
|
2678
|
+
"numPassingAsserts": 1,
|
|
2679
|
+
"retryReasons": [],
|
|
2680
|
+
"status": "passed",
|
|
2681
|
+
"title": "encode deep thought"
|
|
2682
|
+
},
|
|
2683
|
+
{
|
|
2684
|
+
"ancestorTitles": [
|
|
2685
|
+
"Atbash Cipher",
|
|
2686
|
+
"encode"
|
|
2687
|
+
],
|
|
2688
|
+
"duration": 0,
|
|
2689
|
+
"failureDetails": [],
|
|
2690
|
+
"failureMessages": [],
|
|
2691
|
+
"fullName": "Atbash Cipher encode encode all the letters",
|
|
2692
|
+
"invocations": 1,
|
|
2693
|
+
"location": null,
|
|
2694
|
+
"numPassingAsserts": 1,
|
|
2695
|
+
"retryReasons": [],
|
|
2696
|
+
"status": "passed",
|
|
2697
|
+
"title": "encode all the letters"
|
|
2698
|
+
},
|
|
2699
|
+
{
|
|
2700
|
+
"ancestorTitles": [
|
|
2701
|
+
"Atbash Cipher",
|
|
2702
|
+
"decode"
|
|
2703
|
+
],
|
|
2704
|
+
"duration": 0,
|
|
2705
|
+
"failureDetails": [],
|
|
2706
|
+
"failureMessages": [],
|
|
2707
|
+
"fullName": "Atbash Cipher decode decode exercism",
|
|
2708
|
+
"invocations": 1,
|
|
2709
|
+
"location": null,
|
|
2710
|
+
"numPassingAsserts": 1,
|
|
2711
|
+
"retryReasons": [],
|
|
2712
|
+
"status": "passed",
|
|
2713
|
+
"title": "decode exercism"
|
|
2714
|
+
},
|
|
2715
|
+
{
|
|
2716
|
+
"ancestorTitles": [
|
|
2717
|
+
"Atbash Cipher",
|
|
2718
|
+
"decode"
|
|
2719
|
+
],
|
|
2720
|
+
"duration": 0,
|
|
2721
|
+
"failureDetails": [],
|
|
2722
|
+
"failureMessages": [],
|
|
2723
|
+
"fullName": "Atbash Cipher decode decode a sentence",
|
|
2724
|
+
"invocations": 1,
|
|
2725
|
+
"location": null,
|
|
2726
|
+
"numPassingAsserts": 1,
|
|
2727
|
+
"retryReasons": [],
|
|
2728
|
+
"status": "passed",
|
|
2729
|
+
"title": "decode a sentence"
|
|
2730
|
+
},
|
|
2731
|
+
{
|
|
2732
|
+
"ancestorTitles": [
|
|
2733
|
+
"Atbash Cipher",
|
|
2734
|
+
"decode"
|
|
2735
|
+
],
|
|
2736
|
+
"duration": 0,
|
|
2737
|
+
"failureDetails": [],
|
|
2738
|
+
"failureMessages": [],
|
|
2739
|
+
"fullName": "Atbash Cipher decode decode numbers",
|
|
2740
|
+
"invocations": 1,
|
|
2741
|
+
"location": null,
|
|
2742
|
+
"numPassingAsserts": 1,
|
|
2743
|
+
"retryReasons": [],
|
|
2744
|
+
"status": "passed",
|
|
2745
|
+
"title": "decode numbers"
|
|
2746
|
+
},
|
|
2747
|
+
{
|
|
2748
|
+
"ancestorTitles": [
|
|
2749
|
+
"Atbash Cipher",
|
|
2750
|
+
"decode"
|
|
2751
|
+
],
|
|
2752
|
+
"duration": 1,
|
|
2753
|
+
"failureDetails": [],
|
|
2754
|
+
"failureMessages": [],
|
|
2755
|
+
"fullName": "Atbash Cipher decode decode all the letters",
|
|
2756
|
+
"invocations": 1,
|
|
2757
|
+
"location": null,
|
|
2758
|
+
"numPassingAsserts": 1,
|
|
2759
|
+
"retryReasons": [],
|
|
2760
|
+
"status": "passed",
|
|
2761
|
+
"title": "decode all the letters"
|
|
2762
|
+
},
|
|
2763
|
+
{
|
|
2764
|
+
"ancestorTitles": [
|
|
2765
|
+
"Atbash Cipher",
|
|
2766
|
+
"decode"
|
|
2767
|
+
],
|
|
2768
|
+
"duration": 0,
|
|
2769
|
+
"failureDetails": [],
|
|
2770
|
+
"failureMessages": [],
|
|
2771
|
+
"fullName": "Atbash Cipher decode decode with too many spaces",
|
|
2772
|
+
"invocations": 1,
|
|
2773
|
+
"location": null,
|
|
2774
|
+
"numPassingAsserts": 1,
|
|
2775
|
+
"retryReasons": [],
|
|
2776
|
+
"status": "passed",
|
|
2777
|
+
"title": "decode with too many spaces"
|
|
2778
|
+
},
|
|
2779
|
+
{
|
|
2780
|
+
"ancestorTitles": [
|
|
2781
|
+
"Atbash Cipher",
|
|
2782
|
+
"decode"
|
|
2783
|
+
],
|
|
2784
|
+
"duration": 0,
|
|
2785
|
+
"failureDetails": [],
|
|
2786
|
+
"failureMessages": [],
|
|
2787
|
+
"fullName": "Atbash Cipher decode decode with no spaces",
|
|
2788
|
+
"invocations": 1,
|
|
2789
|
+
"location": null,
|
|
2790
|
+
"numPassingAsserts": 1,
|
|
2791
|
+
"retryReasons": [],
|
|
2792
|
+
"status": "passed",
|
|
2793
|
+
"title": "decode with no spaces"
|
|
2794
|
+
}
|
|
2795
|
+
],
|
|
2796
|
+
"endTime": 1754602819837,
|
|
2797
|
+
"message": "",
|
|
2798
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/atbash-cipher/atbash-cipher.spec.js",
|
|
2799
|
+
"startTime": 1754602819716,
|
|
2800
|
+
"status": "passed",
|
|
2801
|
+
"summary": ""
|
|
2802
|
+
}
|
|
2803
|
+
],
|
|
2804
|
+
"wasInterrupted": false
|
|
2805
|
+
}
|
|
2806
|
+
},
|
|
2807
|
+
"timeElapsed": 98.28,
|
|
2808
|
+
"cost": 0.12642056899875,
|
|
2809
|
+
"startTime": "2025-08-07T21:38:41.567Z",
|
|
2810
|
+
"endTime": "2025-08-07T21:40:19.847Z",
|
|
2811
|
+
"finalOutput": "I have successfully implemented the Atbash cipher exercise and all tests are now passing! Here's what I accomplished:\n\n## Implementation Summary\n\nI created a complete implementation of the Atbash cipher with two main functions:\n\n### `encode(plainText)`\n- Creates the Atbash mapping where 'a'↔'z', 'b'↔'y', etc.\n- Cleans input by converting to lowercase and removing all non-alphanumeric characters except digits\n- Applies the cipher transformation (letters are transformed, numbers preserved)\n- Groups the output into chunks of 5 characters separated by spaces\n\n### `decode(cipherText)`\n- Removes all spaces from the cipher text\n- Uses the same Atbash transformation (since it's symmetric - applying it twice returns the original)\n- Returns the decoded text without spacing\n\n## Key Features Implemented\n- ✅ Proper Atbash substitution cipher (a↔z, b↔y, etc.)\n- ✅ Groups encoded output in chunks of 5 characters\n- ✅ Preserves numbers unchanged\n- ✅ Removes punctuation and spaces from input\n- ✅ Converts everything to lowercase\n- ✅ Symmetric decoding (Atbash applied twice = original text)\n\n## Project Setup\n- Fixed module configuration issues by adding `\"type\": \"module\"` to package.json\n- Renamed config files to `.cjs` extension to work with ES modules\n- Installed all dependencies successfully\n- Unskipped all tests by changing `xtest` to `test`\n\n## Test Results\nAll 14 tests are now passing:\n- 8 encoding tests (including complex cases with punctuation, numbers, and long text)\n- 6 decoding tests (including edge cases with extra spaces)\n\nThe implementation correctly handles all the requirements:\n- Basic encoding: `test` → `gvhg`\n- Complex encoding: `Testing,1 2 3, testing.` → `gvhgr mt123 gvhgr mt` \n- Long text: `The quick brown fox jumps over the lazy dog.` → `gsvjf rxpyi ldmul cqfnk hlevi gsvoz abwlt`\n- Proper decoding with space removal and symmetric cipher application\n\nThe solution is complete and ready for use!"
|
|
2812
|
+
},
|
|
2813
|
+
{
|
|
2814
|
+
"exerciseName": "bank-account",
|
|
2815
|
+
"status": "success",
|
|
2816
|
+
"turns": 16,
|
|
2817
|
+
"testResult": {
|
|
2818
|
+
"passed": 15,
|
|
2819
|
+
"failed": 0,
|
|
2820
|
+
"total": 15,
|
|
2821
|
+
"skipped": 0,
|
|
2822
|
+
"success": true,
|
|
2823
|
+
"output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":15,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":15,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754602877370,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Bank Account\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account newly opened account has zero balance\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"newly opened account has zero balance\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account can deposit money\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"can deposit money\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account can deposit money sequentially\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"can deposit money sequentially\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account can withdraw money\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"can withdraw money\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account can withdraw money sequentially\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"can withdraw money sequentially\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":4,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account checking balance of closed account throws error\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"checking balance of closed account throws error\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account deposit into closed account throws error\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"deposit into closed account throws error\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account withdraw from closed account throws error\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"withdraw from closed account throws error\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account close already closed account throws error\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"close already closed account throws error\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account open already opened account throws error\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"open already opened account throws error\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account reopened account does not retain balance\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"reopened account does not retain balance\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account cannot withdraw more than deposited\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"cannot withdraw more than deposited\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account cannot withdraw negative amount\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"cannot withdraw negative amount\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account cannot deposit negative amount\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"cannot deposit negative amount\"},{\"ancestorTitles\":[\"Bank Account\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Bank Account changing balance directly throws error\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"changing balance directly throws error\"}],\"endTime\":1754602877491,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/bank-account.spec.js\",\"startTime\":1754602877390,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
|
|
2824
|
+
"details": {
|
|
2825
|
+
"numFailedTestSuites": 0,
|
|
2826
|
+
"numFailedTests": 0,
|
|
2827
|
+
"numPassedTestSuites": 1,
|
|
2828
|
+
"numPassedTests": 15,
|
|
2829
|
+
"numPendingTestSuites": 0,
|
|
2830
|
+
"numPendingTests": 0,
|
|
2831
|
+
"numRuntimeErrorTestSuites": 0,
|
|
2832
|
+
"numTodoTests": 0,
|
|
2833
|
+
"numTotalTestSuites": 1,
|
|
2834
|
+
"numTotalTests": 15,
|
|
2835
|
+
"openHandles": [],
|
|
2836
|
+
"snapshot": {
|
|
2837
|
+
"added": 0,
|
|
2838
|
+
"didUpdate": false,
|
|
2839
|
+
"failure": false,
|
|
2840
|
+
"filesAdded": 0,
|
|
2841
|
+
"filesRemoved": 0,
|
|
2842
|
+
"filesRemovedList": [],
|
|
2843
|
+
"filesUnmatched": 0,
|
|
2844
|
+
"filesUpdated": 0,
|
|
2845
|
+
"matched": 0,
|
|
2846
|
+
"total": 0,
|
|
2847
|
+
"unchecked": 0,
|
|
2848
|
+
"uncheckedKeysByFile": [],
|
|
2849
|
+
"unmatched": 0,
|
|
2850
|
+
"updated": 0
|
|
2851
|
+
},
|
|
2852
|
+
"startTime": 1754602877370,
|
|
2853
|
+
"success": true,
|
|
2854
|
+
"testResults": [
|
|
2855
|
+
{
|
|
2856
|
+
"assertionResults": [
|
|
2857
|
+
{
|
|
2858
|
+
"ancestorTitles": [
|
|
2859
|
+
"Bank Account"
|
|
2860
|
+
],
|
|
2861
|
+
"duration": 1,
|
|
2862
|
+
"failureDetails": [],
|
|
2863
|
+
"failureMessages": [],
|
|
2864
|
+
"fullName": "Bank Account newly opened account has zero balance",
|
|
2865
|
+
"invocations": 1,
|
|
2866
|
+
"location": null,
|
|
2867
|
+
"numPassingAsserts": 1,
|
|
2868
|
+
"retryReasons": [],
|
|
2869
|
+
"status": "passed",
|
|
2870
|
+
"title": "newly opened account has zero balance"
|
|
2871
|
+
},
|
|
2872
|
+
{
|
|
2873
|
+
"ancestorTitles": [
|
|
2874
|
+
"Bank Account"
|
|
2875
|
+
],
|
|
2876
|
+
"duration": 1,
|
|
2877
|
+
"failureDetails": [],
|
|
2878
|
+
"failureMessages": [],
|
|
2879
|
+
"fullName": "Bank Account can deposit money",
|
|
2880
|
+
"invocations": 1,
|
|
2881
|
+
"location": null,
|
|
2882
|
+
"numPassingAsserts": 1,
|
|
2883
|
+
"retryReasons": [],
|
|
2884
|
+
"status": "passed",
|
|
2885
|
+
"title": "can deposit money"
|
|
2886
|
+
},
|
|
2887
|
+
{
|
|
2888
|
+
"ancestorTitles": [
|
|
2889
|
+
"Bank Account"
|
|
2890
|
+
],
|
|
2891
|
+
"duration": 0,
|
|
2892
|
+
"failureDetails": [],
|
|
2893
|
+
"failureMessages": [],
|
|
2894
|
+
"fullName": "Bank Account can deposit money sequentially",
|
|
2895
|
+
"invocations": 1,
|
|
2896
|
+
"location": null,
|
|
2897
|
+
"numPassingAsserts": 1,
|
|
2898
|
+
"retryReasons": [],
|
|
2899
|
+
"status": "passed",
|
|
2900
|
+
"title": "can deposit money sequentially"
|
|
2901
|
+
},
|
|
2902
|
+
{
|
|
2903
|
+
"ancestorTitles": [
|
|
2904
|
+
"Bank Account"
|
|
2905
|
+
],
|
|
2906
|
+
"duration": 0,
|
|
2907
|
+
"failureDetails": [],
|
|
2908
|
+
"failureMessages": [],
|
|
2909
|
+
"fullName": "Bank Account can withdraw money",
|
|
2910
|
+
"invocations": 1,
|
|
2911
|
+
"location": null,
|
|
2912
|
+
"numPassingAsserts": 1,
|
|
2913
|
+
"retryReasons": [],
|
|
2914
|
+
"status": "passed",
|
|
2915
|
+
"title": "can withdraw money"
|
|
2916
|
+
},
|
|
2917
|
+
{
|
|
2918
|
+
"ancestorTitles": [
|
|
2919
|
+
"Bank Account"
|
|
2920
|
+
],
|
|
2921
|
+
"duration": 0,
|
|
2922
|
+
"failureDetails": [],
|
|
2923
|
+
"failureMessages": [],
|
|
2924
|
+
"fullName": "Bank Account can withdraw money sequentially",
|
|
2925
|
+
"invocations": 1,
|
|
2926
|
+
"location": null,
|
|
2927
|
+
"numPassingAsserts": 1,
|
|
2928
|
+
"retryReasons": [],
|
|
2929
|
+
"status": "passed",
|
|
2930
|
+
"title": "can withdraw money sequentially"
|
|
2931
|
+
},
|
|
2932
|
+
{
|
|
2933
|
+
"ancestorTitles": [
|
|
2934
|
+
"Bank Account"
|
|
2935
|
+
],
|
|
2936
|
+
"duration": 4,
|
|
2937
|
+
"failureDetails": [],
|
|
2938
|
+
"failureMessages": [],
|
|
2939
|
+
"fullName": "Bank Account checking balance of closed account throws error",
|
|
2940
|
+
"invocations": 1,
|
|
2941
|
+
"location": null,
|
|
2942
|
+
"numPassingAsserts": 1,
|
|
2943
|
+
"retryReasons": [],
|
|
2944
|
+
"status": "passed",
|
|
2945
|
+
"title": "checking balance of closed account throws error"
|
|
2946
|
+
},
|
|
2947
|
+
{
|
|
2948
|
+
"ancestorTitles": [
|
|
2949
|
+
"Bank Account"
|
|
2950
|
+
],
|
|
2951
|
+
"duration": 1,
|
|
2952
|
+
"failureDetails": [],
|
|
2953
|
+
"failureMessages": [],
|
|
2954
|
+
"fullName": "Bank Account deposit into closed account throws error",
|
|
2955
|
+
"invocations": 1,
|
|
2956
|
+
"location": null,
|
|
2957
|
+
"numPassingAsserts": 1,
|
|
2958
|
+
"retryReasons": [],
|
|
2959
|
+
"status": "passed",
|
|
2960
|
+
"title": "deposit into closed account throws error"
|
|
2961
|
+
},
|
|
2962
|
+
{
|
|
2963
|
+
"ancestorTitles": [
|
|
2964
|
+
"Bank Account"
|
|
2965
|
+
],
|
|
2966
|
+
"duration": 0,
|
|
2967
|
+
"failureDetails": [],
|
|
2968
|
+
"failureMessages": [],
|
|
2969
|
+
"fullName": "Bank Account withdraw from closed account throws error",
|
|
2970
|
+
"invocations": 1,
|
|
2971
|
+
"location": null,
|
|
2972
|
+
"numPassingAsserts": 1,
|
|
2973
|
+
"retryReasons": [],
|
|
2974
|
+
"status": "passed",
|
|
2975
|
+
"title": "withdraw from closed account throws error"
|
|
2976
|
+
},
|
|
2977
|
+
{
|
|
2978
|
+
"ancestorTitles": [
|
|
2979
|
+
"Bank Account"
|
|
2980
|
+
],
|
|
2981
|
+
"duration": 0,
|
|
2982
|
+
"failureDetails": [],
|
|
2983
|
+
"failureMessages": [],
|
|
2984
|
+
"fullName": "Bank Account close already closed account throws error",
|
|
2985
|
+
"invocations": 1,
|
|
2986
|
+
"location": null,
|
|
2987
|
+
"numPassingAsserts": 1,
|
|
2988
|
+
"retryReasons": [],
|
|
2989
|
+
"status": "passed",
|
|
2990
|
+
"title": "close already closed account throws error"
|
|
2991
|
+
},
|
|
2992
|
+
{
|
|
2993
|
+
"ancestorTitles": [
|
|
2994
|
+
"Bank Account"
|
|
2995
|
+
],
|
|
2996
|
+
"duration": 0,
|
|
2997
|
+
"failureDetails": [],
|
|
2998
|
+
"failureMessages": [],
|
|
2999
|
+
"fullName": "Bank Account open already opened account throws error",
|
|
3000
|
+
"invocations": 1,
|
|
3001
|
+
"location": null,
|
|
3002
|
+
"numPassingAsserts": 1,
|
|
3003
|
+
"retryReasons": [],
|
|
3004
|
+
"status": "passed",
|
|
3005
|
+
"title": "open already opened account throws error"
|
|
3006
|
+
},
|
|
3007
|
+
{
|
|
3008
|
+
"ancestorTitles": [
|
|
3009
|
+
"Bank Account"
|
|
3010
|
+
],
|
|
3011
|
+
"duration": 0,
|
|
3012
|
+
"failureDetails": [],
|
|
3013
|
+
"failureMessages": [],
|
|
3014
|
+
"fullName": "Bank Account reopened account does not retain balance",
|
|
3015
|
+
"invocations": 1,
|
|
3016
|
+
"location": null,
|
|
3017
|
+
"numPassingAsserts": 1,
|
|
3018
|
+
"retryReasons": [],
|
|
3019
|
+
"status": "passed",
|
|
3020
|
+
"title": "reopened account does not retain balance"
|
|
3021
|
+
},
|
|
3022
|
+
{
|
|
3023
|
+
"ancestorTitles": [
|
|
3024
|
+
"Bank Account"
|
|
3025
|
+
],
|
|
3026
|
+
"duration": 1,
|
|
3027
|
+
"failureDetails": [],
|
|
3028
|
+
"failureMessages": [],
|
|
3029
|
+
"fullName": "Bank Account cannot withdraw more than deposited",
|
|
3030
|
+
"invocations": 1,
|
|
3031
|
+
"location": null,
|
|
3032
|
+
"numPassingAsserts": 1,
|
|
3033
|
+
"retryReasons": [],
|
|
3034
|
+
"status": "passed",
|
|
3035
|
+
"title": "cannot withdraw more than deposited"
|
|
3036
|
+
},
|
|
3037
|
+
{
|
|
3038
|
+
"ancestorTitles": [
|
|
3039
|
+
"Bank Account"
|
|
3040
|
+
],
|
|
3041
|
+
"duration": 0,
|
|
3042
|
+
"failureDetails": [],
|
|
3043
|
+
"failureMessages": [],
|
|
3044
|
+
"fullName": "Bank Account cannot withdraw negative amount",
|
|
3045
|
+
"invocations": 1,
|
|
3046
|
+
"location": null,
|
|
3047
|
+
"numPassingAsserts": 1,
|
|
3048
|
+
"retryReasons": [],
|
|
3049
|
+
"status": "passed",
|
|
3050
|
+
"title": "cannot withdraw negative amount"
|
|
3051
|
+
},
|
|
3052
|
+
{
|
|
3053
|
+
"ancestorTitles": [
|
|
3054
|
+
"Bank Account"
|
|
3055
|
+
],
|
|
3056
|
+
"duration": 1,
|
|
3057
|
+
"failureDetails": [],
|
|
3058
|
+
"failureMessages": [],
|
|
3059
|
+
"fullName": "Bank Account cannot deposit negative amount",
|
|
3060
|
+
"invocations": 1,
|
|
3061
|
+
"location": null,
|
|
3062
|
+
"numPassingAsserts": 1,
|
|
3063
|
+
"retryReasons": [],
|
|
3064
|
+
"status": "passed",
|
|
3065
|
+
"title": "cannot deposit negative amount"
|
|
3066
|
+
},
|
|
3067
|
+
{
|
|
3068
|
+
"ancestorTitles": [
|
|
3069
|
+
"Bank Account"
|
|
3070
|
+
],
|
|
3071
|
+
"duration": 0,
|
|
3072
|
+
"failureDetails": [],
|
|
3073
|
+
"failureMessages": [],
|
|
3074
|
+
"fullName": "Bank Account changing balance directly throws error",
|
|
3075
|
+
"invocations": 1,
|
|
3076
|
+
"location": null,
|
|
3077
|
+
"numPassingAsserts": 1,
|
|
3078
|
+
"retryReasons": [],
|
|
3079
|
+
"status": "passed",
|
|
3080
|
+
"title": "changing balance directly throws error"
|
|
3081
|
+
}
|
|
3082
|
+
],
|
|
3083
|
+
"endTime": 1754602877491,
|
|
3084
|
+
"message": "",
|
|
3085
|
+
"name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/bank-account.spec.js",
|
|
3086
|
+
"startTime": 1754602877390,
|
|
3087
|
+
"status": "passed",
|
|
3088
|
+
"summary": ""
|
|
3089
|
+
}
|
|
3090
|
+
],
|
|
3091
|
+
"wasInterrupted": false
|
|
3092
|
+
}
|
|
3093
|
+
},
|
|
3094
|
+
"timeElapsed": 57.633,
|
|
3095
|
+
"cost": 0.08940586563000001,
|
|
3096
|
+
"startTime": "2025-08-07T21:40:19.870Z",
|
|
3097
|
+
"endTime": "2025-08-07T21:41:17.503Z",
|
|
3098
|
+
"finalOutput": "I have successfully solved the bank account coding exercise! Here's what I accomplished:\n\n## Problem Analysis\nI analyzed the test file (`bank-account.spec.js`) to understand the requirements for implementing a BankAccount class with the following functionality:\n- Account state management (open/close)\n- Deposit and withdrawal operations\n- Balance tracking with proper error handling\n- Input validation and error throwing\n\n## Implementation\nI implemented the `BankAccount` class in `bank-account.js` with:\n\n1. **Constructor**: Initializes the account with zero balance and closed state\n2. **open()**: Opens the account, resets balance to 0, throws error if already open\n3. **close()**: Closes the account, throws error if already closed\n4. **deposit(amount)**: Adds money to account with validation for negative amounts and account state\n5. **withdraw(amount)**: Removes money with validation for negative amounts, insufficient funds, and account state\n6. **get balance()**: Returns current balance, throws error if account is closed\n7. **set balance()**: Throws error to prevent direct balance manipulation\n\n## Key Features Implemented\n- ✅ Account state management (open/closed)\n- ✅ Proper error handling with `ValueError` class\n- ✅ Input validation for negative amounts\n- ✅ Insufficient funds checking\n- ✅ Read-only balance property\n- ✅ Account reopening resets balance to zero\n\n## Project Setup\n- Ran `npm install` to install dependencies\n- Used Jest testing framework as configured\n\n## Test Results\nAll 15 tests are now passing:\n- ✅ newly opened account has zero balance\n- ✅ can deposit money\n- ✅ can deposit money sequentially\n- ✅ can withdraw money\n- ✅ can withdraw money sequentially\n- ✅ checking balance of closed account throws error\n- ✅ deposit into closed account throws error\n- ✅ withdraw from closed account throws error\n- ✅ close already closed account throws error\n- ✅ open already opened account throws error\n- ✅ reopened account does not retain balance\n- ✅ cannot withdraw more than deposited\n- ✅ cannot withdraw negative amount\n- ✅ cannot deposit negative amount\n- ✅ changing balance directly throws error\n\nThe implementation is complete and robust, handling all edge cases and providing proper error messages through the ValueError exception class."
|
|
3099
|
+
}
|
|
3100
|
+
],
|
|
3101
|
+
"summary": {
|
|
3102
|
+
"totalExercises": 10,
|
|
3103
|
+
"successCount": 10,
|
|
3104
|
+
"testableExercises": 10,
|
|
3105
|
+
"testsPassedCount": 9,
|
|
3106
|
+
"testsFailedCount": 1,
|
|
3107
|
+
"testPassRate": 0.9,
|
|
3108
|
+
"agentSuccessRate": 1,
|
|
3109
|
+
"failureCount": 0,
|
|
3110
|
+
"timeoutCount": 0,
|
|
3111
|
+
"costLimitCount": 0,
|
|
3112
|
+
"turnLimitCount": 0,
|
|
3113
|
+
"totalTime": 793.039,
|
|
3114
|
+
"totalCost": 1.1854887547425002,
|
|
3115
|
+
"averageTurns": 18.8,
|
|
3116
|
+
"averageTime": 79.3039,
|
|
3117
|
+
"successRate": 0.9
|
|
3118
|
+
},
|
|
3119
|
+
"startTime": "2025-08-07T21:27:47.499Z",
|
|
3120
|
+
"endTime": "2025-08-07T21:41:17.526Z"
|
|
3121
|
+
}
|