@crownpeak/dqm-react-component-dev-mcp 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
|
@@ -0,0 +1,843 @@
|
|
|
1
|
+
use anyhow::Result;
|
|
2
|
+
use std::fs;
|
|
3
|
+
use tempfile::TempDir;
|
|
4
|
+
|
|
5
|
+
mod common;
|
|
6
|
+
use common::TestContext;
|
|
7
|
+
|
|
8
|
+
#[test]
|
|
9
|
+
fn test_rust_outline_basic_symbols() -> Result<()> {
|
|
10
|
+
let temp_dir = TempDir::new()?;
|
|
11
|
+
let test_file = temp_dir.path().join("basic.rs");
|
|
12
|
+
|
|
13
|
+
let content = r#"use std::collections::HashMap;
|
|
14
|
+
|
|
15
|
+
/// A simple calculator struct for arithmetic operations.
|
|
16
|
+
pub struct Calculator {
|
|
17
|
+
pub name: String,
|
|
18
|
+
history: Vec<f64>,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
impl Calculator {
|
|
22
|
+
/// Creates a new calculator instance.
|
|
23
|
+
pub fn new(name: String) -> Self {
|
|
24
|
+
Self {
|
|
25
|
+
name,
|
|
26
|
+
history: Vec::new(),
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// Adds two numbers and returns the result.
|
|
31
|
+
pub fn add(&mut self, x: f64, y: f64) -> f64 {
|
|
32
|
+
let result = x + y;
|
|
33
|
+
self.history.push(result);
|
|
34
|
+
result
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// Gets the calculation history.
|
|
38
|
+
pub fn get_history(&self) -> &[f64] {
|
|
39
|
+
&self.history
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Trait for mathematical operations.
|
|
44
|
+
pub trait MathOperations {
|
|
45
|
+
fn multiply(&self, a: f64, b: f64) -> f64;
|
|
46
|
+
fn divide(&self, a: f64, b: f64) -> Option<f64>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// Enumeration of supported number types.
|
|
50
|
+
#[derive(Debug, Clone)]
|
|
51
|
+
pub enum NumberType {
|
|
52
|
+
Integer(i64),
|
|
53
|
+
Float(f64),
|
|
54
|
+
Complex { real: f64, imaginary: f64 },
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// Main function to demonstrate calculator usage.
|
|
58
|
+
pub fn main() {
|
|
59
|
+
let mut calc = Calculator::new("Test Calculator".to_string());
|
|
60
|
+
let result = calc.add(10.0, 20.0);
|
|
61
|
+
println!("Result: {}", result);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#[cfg(test)]
|
|
65
|
+
mod tests {
|
|
66
|
+
use super::*;
|
|
67
|
+
|
|
68
|
+
#[test]
|
|
69
|
+
fn test_calculator_add() {
|
|
70
|
+
let mut calc = Calculator::new("Test".to_string());
|
|
71
|
+
assert_eq!(calc.add(2.0, 3.0), 5.0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#[test]
|
|
75
|
+
fn test_calculator_history() {
|
|
76
|
+
let mut calc = Calculator::new("Test".to_string());
|
|
77
|
+
calc.add(1.0, 2.0);
|
|
78
|
+
assert_eq!(calc.get_history().len(), 1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
"#;
|
|
82
|
+
|
|
83
|
+
fs::write(&test_file, content)?;
|
|
84
|
+
|
|
85
|
+
let ctx = TestContext::new();
|
|
86
|
+
let output = ctx.run_probe(&[
|
|
87
|
+
"search",
|
|
88
|
+
"Calculator", // Search term that will match multiple symbols
|
|
89
|
+
test_file.to_str().unwrap(),
|
|
90
|
+
"--format",
|
|
91
|
+
"outline",
|
|
92
|
+
"--allow-tests",
|
|
93
|
+
])?;
|
|
94
|
+
|
|
95
|
+
// Verify Rust symbols are extracted in outline format
|
|
96
|
+
assert!(
|
|
97
|
+
output.contains("pub struct Calculator"),
|
|
98
|
+
"Missing Calculator struct - output: {}",
|
|
99
|
+
output
|
|
100
|
+
);
|
|
101
|
+
assert!(
|
|
102
|
+
output.contains("Calculator::new"),
|
|
103
|
+
"Missing Calculator impl methods - output: {}",
|
|
104
|
+
output
|
|
105
|
+
);
|
|
106
|
+
assert!(
|
|
107
|
+
output.contains("pub fn main"),
|
|
108
|
+
"Missing main function - output: {}",
|
|
109
|
+
output
|
|
110
|
+
);
|
|
111
|
+
// In outline format, we should see the search results properly formatted
|
|
112
|
+
assert!(
|
|
113
|
+
output.contains("---\nFile:"),
|
|
114
|
+
"Missing file delimiter - output: {}",
|
|
115
|
+
output
|
|
116
|
+
);
|
|
117
|
+
// We expect multiple search results since Calculator appears in multiple places
|
|
118
|
+
assert!(
|
|
119
|
+
output.contains("Found") && output.contains("search results"),
|
|
120
|
+
"Missing search results summary - output: {}",
|
|
121
|
+
output
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
Ok(())
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#[test]
|
|
128
|
+
fn test_rust_outline_control_flow_statements() -> Result<()> {
|
|
129
|
+
let temp_dir = TempDir::new()?;
|
|
130
|
+
let test_file = temp_dir.path().join("control_flow.rs");
|
|
131
|
+
|
|
132
|
+
let content = r#"use std::collections::HashMap;
|
|
133
|
+
|
|
134
|
+
/// Function demonstrating various control flow statements with gaps.
|
|
135
|
+
pub fn complex_algorithm(data: Vec<i32>, threshold: i32) -> HashMap<String, i32> {
|
|
136
|
+
let mut result = HashMap::new();
|
|
137
|
+
let mut counter = 0;
|
|
138
|
+
|
|
139
|
+
// First processing phase
|
|
140
|
+
for item in &data {
|
|
141
|
+
if *item > threshold {
|
|
142
|
+
counter += 1;
|
|
143
|
+
|
|
144
|
+
// Complex nested conditions
|
|
145
|
+
if counter % 2 == 0 {
|
|
146
|
+
result.insert(format!("even_{}", counter), *item);
|
|
147
|
+
} else {
|
|
148
|
+
result.insert(format!("odd_{}", counter), *item);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Second processing phase
|
|
154
|
+
let mut index = 0;
|
|
155
|
+
while index < data.len() {
|
|
156
|
+
match data[index] {
|
|
157
|
+
x if x < 0 => {
|
|
158
|
+
result.insert(format!("negative_{}", index), x);
|
|
159
|
+
index += 1;
|
|
160
|
+
}
|
|
161
|
+
x if x == 0 => {
|
|
162
|
+
result.insert("zero".to_string(), 0);
|
|
163
|
+
index += 1;
|
|
164
|
+
}
|
|
165
|
+
x => {
|
|
166
|
+
result.insert(format!("positive_{}", index), x);
|
|
167
|
+
index += 1;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
result
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/// Function with nested loops demonstrating closing brace comments.
|
|
176
|
+
pub fn process_matrix(matrix: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
|
|
177
|
+
let mut processed = Vec::new();
|
|
178
|
+
|
|
179
|
+
for row in matrix.iter() {
|
|
180
|
+
let mut new_row = Vec::new();
|
|
181
|
+
|
|
182
|
+
for &cell in row.iter() {
|
|
183
|
+
let processed_cell = if cell > 0 {
|
|
184
|
+
cell * 2
|
|
185
|
+
} else if cell < 0 {
|
|
186
|
+
cell.abs()
|
|
187
|
+
} else {
|
|
188
|
+
1
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
new_row.push(processed_cell);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
processed.push(new_row);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
processed
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/// Function with match statements and complex patterns.
|
|
201
|
+
pub fn analyze_data(input: &str) -> Result<String, String> {
|
|
202
|
+
match input.trim() {
|
|
203
|
+
"" => Err("Empty input".to_string()),
|
|
204
|
+
s if s.len() > 100 => {
|
|
205
|
+
Ok("Large input detected".to_string())
|
|
206
|
+
}
|
|
207
|
+
s if s.chars().all(|c| c.is_ascii_digit()) => {
|
|
208
|
+
let num: i32 = s.parse().map_err(|e| format!("Parse error: {}", e))?;
|
|
209
|
+
|
|
210
|
+
match num {
|
|
211
|
+
0..=10 => Ok("Small number".to_string()),
|
|
212
|
+
11..=100 => Ok("Medium number".to_string()),
|
|
213
|
+
_ => Ok("Large number".to_string()),
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
_ => Ok("Text input".to_string()),
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
"#;
|
|
220
|
+
|
|
221
|
+
fs::write(&test_file, content)?;
|
|
222
|
+
|
|
223
|
+
let ctx = TestContext::new();
|
|
224
|
+
let output = ctx.run_probe(&[
|
|
225
|
+
"search",
|
|
226
|
+
"algorithm", // Search for function names that will match
|
|
227
|
+
test_file.to_str().unwrap(),
|
|
228
|
+
"--format",
|
|
229
|
+
"outline",
|
|
230
|
+
])?;
|
|
231
|
+
|
|
232
|
+
// Verify control flow functions are found
|
|
233
|
+
assert!(
|
|
234
|
+
output.contains("complex_algorithm") || output.contains("process_matrix"),
|
|
235
|
+
"Missing control flow functions - output: {}",
|
|
236
|
+
output
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
// Should contain control flow keywords highlighted in the outline
|
|
240
|
+
let has_control_flow = output.contains("for ")
|
|
241
|
+
|| output.contains("while ")
|
|
242
|
+
|| output.contains("match ")
|
|
243
|
+
|| output.contains("if ");
|
|
244
|
+
assert!(
|
|
245
|
+
has_control_flow,
|
|
246
|
+
"Missing control flow statements - output: {}",
|
|
247
|
+
output
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
// Should contain closing braces for large blocks with gaps
|
|
251
|
+
assert!(
|
|
252
|
+
output.contains("}"),
|
|
253
|
+
"Missing closing braces - output: {}",
|
|
254
|
+
output
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
// Should be in outline format with file delimiter
|
|
258
|
+
assert!(
|
|
259
|
+
output.contains("---\nFile:"),
|
|
260
|
+
"Missing file delimiter in outline format - output: {}",
|
|
261
|
+
output
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
Ok(())
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
#[test]
|
|
268
|
+
fn test_rust_outline_macros_and_attributes() -> Result<()> {
|
|
269
|
+
let temp_dir = TempDir::new()?;
|
|
270
|
+
let test_file = temp_dir.path().join("macros.rs");
|
|
271
|
+
|
|
272
|
+
let content = r#"use serde::{Deserialize, Serialize};
|
|
273
|
+
use std::fmt;
|
|
274
|
+
|
|
275
|
+
/// Custom derive macro demonstration.
|
|
276
|
+
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
277
|
+
pub struct Person {
|
|
278
|
+
pub name: String,
|
|
279
|
+
pub age: u32,
|
|
280
|
+
pub email: String,
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/// Custom attribute macro demonstration.
|
|
284
|
+
#[cfg(feature = "advanced")]
|
|
285
|
+
pub fn advanced_feature() -> String {
|
|
286
|
+
"This is an advanced feature".to_string()
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/// Procedural macro definition.
|
|
290
|
+
macro_rules! create_function {
|
|
291
|
+
($func_name:ident, $return_type:ty, $value:expr) => {
|
|
292
|
+
pub fn $func_name() -> $return_type {
|
|
293
|
+
$value
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Generate functions using macro
|
|
299
|
+
create_function!(get_pi, f64, 3.14159);
|
|
300
|
+
create_function!(get_greeting, String, "Hello, World!".to_string());
|
|
301
|
+
create_function!(get_answer, i32, 42);
|
|
302
|
+
|
|
303
|
+
/// Implementation with custom Display trait.
|
|
304
|
+
impl fmt::Display for Person {
|
|
305
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
306
|
+
write!(f, "{} (age: {}, email: {})", self.name, self.age, self.email)
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/// Generic implementation with constraints.
|
|
311
|
+
impl<T> From<T> for Person
|
|
312
|
+
where
|
|
313
|
+
T: AsRef<str>,
|
|
314
|
+
{
|
|
315
|
+
fn from(name: T) -> Self {
|
|
316
|
+
Person {
|
|
317
|
+
name: name.as_ref().to_string(),
|
|
318
|
+
age: 0,
|
|
319
|
+
email: String::new(),
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
#[cfg(test)]
|
|
325
|
+
mod tests {
|
|
326
|
+
use super::*;
|
|
327
|
+
|
|
328
|
+
#[test]
|
|
329
|
+
fn test_person_creation() {
|
|
330
|
+
let person = Person {
|
|
331
|
+
name: "John".to_string(),
|
|
332
|
+
age: 30,
|
|
333
|
+
email: "john@example.com".to_string(),
|
|
334
|
+
};
|
|
335
|
+
assert_eq!(person.name, "John");
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
#[test]
|
|
339
|
+
fn test_macro_generated_functions() {
|
|
340
|
+
assert_eq!(get_pi(), 3.14159);
|
|
341
|
+
assert_eq!(get_answer(), 42);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
"#;
|
|
345
|
+
|
|
346
|
+
fs::write(&test_file, content)?;
|
|
347
|
+
|
|
348
|
+
let ctx = TestContext::new();
|
|
349
|
+
let output = ctx.run_probe(&[
|
|
350
|
+
"search",
|
|
351
|
+
"create_function", // Search for a term that will match
|
|
352
|
+
test_file.to_str().unwrap(),
|
|
353
|
+
"--format",
|
|
354
|
+
"outline",
|
|
355
|
+
"--allow-tests",
|
|
356
|
+
])?;
|
|
357
|
+
|
|
358
|
+
// Verify macro handling in outline format
|
|
359
|
+
assert!(
|
|
360
|
+
output.contains("macro_rules!") || output.contains("create_function"),
|
|
361
|
+
"Missing macro definition - output: {}",
|
|
362
|
+
output
|
|
363
|
+
);
|
|
364
|
+
|
|
365
|
+
// Should be in outline format with file delimiter
|
|
366
|
+
assert!(
|
|
367
|
+
output.contains("---\nFile:"),
|
|
368
|
+
"Missing file delimiter in outline format - output: {}",
|
|
369
|
+
output
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
// Should have found at least one result
|
|
373
|
+
assert!(
|
|
374
|
+
output.contains("Found") && output.contains("search results"),
|
|
375
|
+
"Missing search results summary - output: {}",
|
|
376
|
+
output
|
|
377
|
+
);
|
|
378
|
+
|
|
379
|
+
Ok(())
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
#[test]
|
|
383
|
+
fn test_rust_outline_async_and_errors() -> Result<()> {
|
|
384
|
+
let temp_dir = TempDir::new()?;
|
|
385
|
+
let test_file = temp_dir.path().join("async_errors.rs");
|
|
386
|
+
|
|
387
|
+
let content = r#"use std::error::Error;
|
|
388
|
+
use std::fmt;
|
|
389
|
+
use tokio::time::{sleep, Duration};
|
|
390
|
+
|
|
391
|
+
/// Custom error type for demonstration.
|
|
392
|
+
#[derive(Debug)]
|
|
393
|
+
pub enum ProcessingError {
|
|
394
|
+
NetworkError(String),
|
|
395
|
+
TimeoutError,
|
|
396
|
+
ValidationError { field: String, message: String },
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
impl fmt::Display for ProcessingError {
|
|
400
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
401
|
+
match self {
|
|
402
|
+
ProcessingError::NetworkError(msg) => write!(f, "Network error: {}", msg),
|
|
403
|
+
ProcessingError::TimeoutError => write!(f, "Operation timed out"),
|
|
404
|
+
ProcessingError::ValidationError { field, message } => {
|
|
405
|
+
write!(f, "Validation error in {}: {}", field, message)
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
impl Error for ProcessingError {}
|
|
412
|
+
|
|
413
|
+
/// Async function with error handling.
|
|
414
|
+
pub async fn fetch_data(url: &str) -> Result<String, ProcessingError> {
|
|
415
|
+
// Simulate network delay
|
|
416
|
+
sleep(Duration::from_millis(100)).await;
|
|
417
|
+
|
|
418
|
+
// Simulate validation
|
|
419
|
+
if url.is_empty() {
|
|
420
|
+
return Err(ProcessingError::ValidationError {
|
|
421
|
+
field: "url".to_string(),
|
|
422
|
+
message: "URL cannot be empty".to_string(),
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
if url.len() > 1000 {
|
|
427
|
+
return Err(ProcessingError::ValidationError {
|
|
428
|
+
field: "url".to_string(),
|
|
429
|
+
message: "URL too long".to_string(),
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Simulate successful fetch
|
|
434
|
+
Ok(format!("Data from {}", url))
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/// Async function with complex error handling and retries.
|
|
438
|
+
pub async fn fetch_with_retry(url: &str, max_retries: u32) -> Result<String, ProcessingError> {
|
|
439
|
+
let mut attempts = 0;
|
|
440
|
+
|
|
441
|
+
while attempts < max_retries {
|
|
442
|
+
match fetch_data(url).await {
|
|
443
|
+
Ok(data) => return Ok(data),
|
|
444
|
+
Err(ProcessingError::NetworkError(msg)) => {
|
|
445
|
+
eprintln!("Attempt {} failed: {}", attempts + 1, msg);
|
|
446
|
+
attempts += 1;
|
|
447
|
+
|
|
448
|
+
if attempts < max_retries {
|
|
449
|
+
sleep(Duration::from_millis(1000)).await;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
Err(other_error) => return Err(other_error),
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
Err(ProcessingError::TimeoutError)
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/// Generic async function with bounds.
|
|
460
|
+
pub async fn process_items<T, E, F>(items: Vec<T>, processor: F) -> Result<Vec<String>, E>
|
|
461
|
+
where
|
|
462
|
+
T: Send + Sync,
|
|
463
|
+
E: Send,
|
|
464
|
+
F: Fn(T) -> Result<String, E> + Send + Sync,
|
|
465
|
+
{
|
|
466
|
+
let mut results = Vec::new();
|
|
467
|
+
|
|
468
|
+
for item in items {
|
|
469
|
+
match processor(item) {
|
|
470
|
+
Ok(result) => results.push(result),
|
|
471
|
+
Err(e) => return Err(e),
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
Ok(results)
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
#[cfg(test)]
|
|
479
|
+
mod tests {
|
|
480
|
+
use super::*;
|
|
481
|
+
use tokio_test;
|
|
482
|
+
|
|
483
|
+
#[tokio::test]
|
|
484
|
+
async fn test_fetch_data_success() {
|
|
485
|
+
let result = fetch_data("https://example.com").await;
|
|
486
|
+
assert!(result.is_ok());
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
#[tokio::test]
|
|
490
|
+
async fn test_fetch_data_validation_error() {
|
|
491
|
+
let result = fetch_data("").await;
|
|
492
|
+
assert!(result.is_err());
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
#[tokio::test]
|
|
496
|
+
async fn test_fetch_with_retry() {
|
|
497
|
+
let result = fetch_with_retry("https://example.com", 3).await;
|
|
498
|
+
assert!(result.is_ok());
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
"#;
|
|
502
|
+
|
|
503
|
+
fs::write(&test_file, content)?;
|
|
504
|
+
|
|
505
|
+
let ctx = TestContext::new();
|
|
506
|
+
let output = ctx.run_probe(&[
|
|
507
|
+
"search",
|
|
508
|
+
"fetch_data", // Search for a function name that exists
|
|
509
|
+
test_file.to_str().unwrap(),
|
|
510
|
+
"--format",
|
|
511
|
+
"outline",
|
|
512
|
+
"--allow-tests",
|
|
513
|
+
])?;
|
|
514
|
+
|
|
515
|
+
// Verify async functions are found in outline format
|
|
516
|
+
assert!(
|
|
517
|
+
output.contains("fetch_data") || output.contains("async"),
|
|
518
|
+
"Missing async functions - output: {}",
|
|
519
|
+
output
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
// Should be in outline format with file delimiter
|
|
523
|
+
assert!(
|
|
524
|
+
output.contains("---\nFile:"),
|
|
525
|
+
"Missing file delimiter in outline format - output: {}",
|
|
526
|
+
output
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
// Should have found at least one result
|
|
530
|
+
assert!(
|
|
531
|
+
output.contains("Found") && output.contains("search results"),
|
|
532
|
+
"Missing search results summary - output: {}",
|
|
533
|
+
output
|
|
534
|
+
);
|
|
535
|
+
|
|
536
|
+
Ok(())
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
#[test]
|
|
540
|
+
fn test_rust_outline_large_function_closing_braces() -> Result<()> {
|
|
541
|
+
let temp_dir = TempDir::new()?;
|
|
542
|
+
let test_file = temp_dir.path().join("large_function.rs");
|
|
543
|
+
|
|
544
|
+
// Create a large function with multiple control flow blocks and gaps
|
|
545
|
+
let content = r#"/// Large function with multiple nested blocks to test closing brace comments.
|
|
546
|
+
pub fn complex_data_processor(data: Vec<i32>) -> Vec<String> {
|
|
547
|
+
let mut results = Vec::new();
|
|
548
|
+
let mut categories = std::collections::HashMap::new();
|
|
549
|
+
|
|
550
|
+
// Phase 1: Categorization
|
|
551
|
+
for (index, &value) in data.iter().enumerate() {
|
|
552
|
+
let category = match value {
|
|
553
|
+
x if x < 0 => "negative",
|
|
554
|
+
0 => "zero",
|
|
555
|
+
x if x < 100 => "small_positive",
|
|
556
|
+
x if x < 1000 => "medium_positive",
|
|
557
|
+
_ => "large_positive",
|
|
558
|
+
};
|
|
559
|
+
|
|
560
|
+
categories.entry(category.to_string())
|
|
561
|
+
.or_insert_with(Vec::new)
|
|
562
|
+
.push((index, value));
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Phase 2: Processing each category
|
|
566
|
+
for (category, items) in categories {
|
|
567
|
+
if category == "negative" {
|
|
568
|
+
for (index, value) in items {
|
|
569
|
+
results.push(format!("NEG[{}]: {}", index, value.abs()));
|
|
570
|
+
}
|
|
571
|
+
} else if category == "zero" {
|
|
572
|
+
for (index, _) in items {
|
|
573
|
+
results.push(format!("ZERO[{}]: neutral", index));
|
|
574
|
+
}
|
|
575
|
+
} else {
|
|
576
|
+
// Positive number processing
|
|
577
|
+
for (index, value) in items {
|
|
578
|
+
let processed = if value < 10 {
|
|
579
|
+
format!("SINGLE_DIGIT[{}]: {}", index, value)
|
|
580
|
+
} else if value < 100 {
|
|
581
|
+
format!("DOUBLE_DIGIT[{}]: {}", index, value)
|
|
582
|
+
} else {
|
|
583
|
+
format!("MULTI_DIGIT[{}]: {}", index, value)
|
|
584
|
+
};
|
|
585
|
+
results.push(processed);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// Phase 3: Final sorting and validation
|
|
591
|
+
results.sort();
|
|
592
|
+
|
|
593
|
+
// Validation phase
|
|
594
|
+
let mut validated_results = Vec::new();
|
|
595
|
+
for result in results {
|
|
596
|
+
if result.len() > 5 {
|
|
597
|
+
validated_results.push(result);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
validated_results
|
|
602
|
+
}
|
|
603
|
+
"#;
|
|
604
|
+
|
|
605
|
+
fs::write(&test_file, content)?;
|
|
606
|
+
|
|
607
|
+
let ctx = TestContext::new();
|
|
608
|
+
let output = ctx.run_probe(&[
|
|
609
|
+
"search",
|
|
610
|
+
"complex_data_processor", // Search for the large function name
|
|
611
|
+
test_file.to_str().unwrap(),
|
|
612
|
+
"--format",
|
|
613
|
+
"outline",
|
|
614
|
+
])?;
|
|
615
|
+
|
|
616
|
+
// Verify large function is shown with closing braces for major blocks
|
|
617
|
+
assert!(
|
|
618
|
+
output.contains("complex_data_processor"),
|
|
619
|
+
"Missing complex_data_processor function - output: {}",
|
|
620
|
+
output
|
|
621
|
+
);
|
|
622
|
+
|
|
623
|
+
// Should have a closing brace with comment for the large function
|
|
624
|
+
let has_closing_brace_comment = output.contains("} //") || output.contains("} /*");
|
|
625
|
+
assert!(
|
|
626
|
+
has_closing_brace_comment,
|
|
627
|
+
"Should have closing brace comment for large function - output: {}",
|
|
628
|
+
output
|
|
629
|
+
);
|
|
630
|
+
|
|
631
|
+
// Should be in outline format with file delimiter
|
|
632
|
+
assert!(
|
|
633
|
+
output.contains("---\nFile:"),
|
|
634
|
+
"Missing file delimiter in outline format - output: {}",
|
|
635
|
+
output
|
|
636
|
+
);
|
|
637
|
+
|
|
638
|
+
Ok(())
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
#[test]
|
|
642
|
+
fn test_rust_outline_keyword_highlighting() -> Result<()> {
|
|
643
|
+
let temp_dir = TempDir::new()?;
|
|
644
|
+
let test_file = temp_dir.path().join("keywords.rs");
|
|
645
|
+
|
|
646
|
+
let content = r#"/// Function containing various Rust keywords for highlighting test.
|
|
647
|
+
pub fn keyword_demonstration() {
|
|
648
|
+
// Keywords in variables and control structures
|
|
649
|
+
let mut counter = 0;
|
|
650
|
+
let const_value = 42;
|
|
651
|
+
|
|
652
|
+
while counter < 10 {
|
|
653
|
+
if counter % 2 == 0 {
|
|
654
|
+
println!("Even number: {}", counter);
|
|
655
|
+
} else {
|
|
656
|
+
println!("Odd number: {}", counter);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
match counter {
|
|
660
|
+
0 => println!("Starting"),
|
|
661
|
+
5 => println!("Halfway"),
|
|
662
|
+
9 => println!("Almost done"),
|
|
663
|
+
_ => println!("Continuing..."),
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
counter += 1;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// Loop and break/continue keywords
|
|
670
|
+
loop {
|
|
671
|
+
if counter > 20 {
|
|
672
|
+
break;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
if counter % 3 == 0 {
|
|
676
|
+
counter += 1;
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
counter += 1;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// Return keyword
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
"#;
|
|
687
|
+
|
|
688
|
+
fs::write(&test_file, content)?;
|
|
689
|
+
|
|
690
|
+
let ctx = TestContext::new();
|
|
691
|
+
let output = ctx.run_probe(&[
|
|
692
|
+
"search",
|
|
693
|
+
"counter",
|
|
694
|
+
test_file.to_str().unwrap(),
|
|
695
|
+
"--format",
|
|
696
|
+
"outline",
|
|
697
|
+
])?;
|
|
698
|
+
|
|
699
|
+
// Should find the keyword in the function
|
|
700
|
+
assert!(
|
|
701
|
+
output.contains("keyword_demonstration") || output.contains("counter"),
|
|
702
|
+
"Should find keyword 'counter' - output: {}",
|
|
703
|
+
output
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
// Should have reasonable length (truncated for outline)
|
|
707
|
+
let line_count = output.lines().count();
|
|
708
|
+
assert!(
|
|
709
|
+
line_count < 100,
|
|
710
|
+
"Output should be reasonably sized, got {} lines",
|
|
711
|
+
line_count
|
|
712
|
+
);
|
|
713
|
+
|
|
714
|
+
Ok(())
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
#[test]
|
|
718
|
+
fn test_rust_outline_test_detection() -> Result<()> {
|
|
719
|
+
let temp_dir = TempDir::new()?;
|
|
720
|
+
let test_file = temp_dir.path().join("test_detection.rs");
|
|
721
|
+
|
|
722
|
+
let content = r#"use std::collections::HashMap;
|
|
723
|
+
|
|
724
|
+
pub fn add_numbers(a: i32, b: i32) -> i32 {
|
|
725
|
+
a + b
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
pub fn multiply_numbers(a: i32, b: i32) -> i32 {
|
|
729
|
+
a * b
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// Unit tests
|
|
733
|
+
#[cfg(test)]
|
|
734
|
+
mod tests {
|
|
735
|
+
use super::*;
|
|
736
|
+
|
|
737
|
+
#[test]
|
|
738
|
+
fn test_add_positive_numbers() {
|
|
739
|
+
assert_eq!(add_numbers(2, 3), 5);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
#[test]
|
|
743
|
+
fn test_add_negative_numbers() {
|
|
744
|
+
assert_eq!(add_numbers(-2, -3), -5);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
#[test]
|
|
748
|
+
fn test_multiply_positive_numbers() {
|
|
749
|
+
assert_eq!(multiply_numbers(4, 5), 20);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
#[test]
|
|
753
|
+
fn test_multiply_with_zero() {
|
|
754
|
+
assert_eq!(multiply_numbers(0, 5), 0);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
#[should_panic]
|
|
758
|
+
#[test]
|
|
759
|
+
fn test_panic_scenario() {
|
|
760
|
+
panic!("This test is expected to panic");
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
#[ignore]
|
|
764
|
+
#[test]
|
|
765
|
+
fn test_ignored() {
|
|
766
|
+
// This test is ignored
|
|
767
|
+
assert!(true);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// Integration test module
|
|
772
|
+
#[cfg(test)]
|
|
773
|
+
mod integration_tests {
|
|
774
|
+
use super::*;
|
|
775
|
+
|
|
776
|
+
#[test]
|
|
777
|
+
fn test_integration_scenario() {
|
|
778
|
+
let sum = add_numbers(10, 20);
|
|
779
|
+
let product = multiply_numbers(sum, 2);
|
|
780
|
+
assert_eq!(product, 60);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// Benchmark tests (using criterion would be more typical)
|
|
785
|
+
#[cfg(test)]
|
|
786
|
+
mod benches {
|
|
787
|
+
use super::*;
|
|
788
|
+
use std::hint::black_box;
|
|
789
|
+
|
|
790
|
+
#[test]
|
|
791
|
+
fn bench_add_numbers() {
|
|
792
|
+
for i in 0..1000 {
|
|
793
|
+
black_box(add_numbers(i, i + 1));
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
"#;
|
|
798
|
+
|
|
799
|
+
fs::write(&test_file, content)?;
|
|
800
|
+
|
|
801
|
+
let ctx = TestContext::new();
|
|
802
|
+
let output = ctx.run_probe(&[
|
|
803
|
+
"search",
|
|
804
|
+
"test", // Search for test keyword
|
|
805
|
+
test_file.to_str().unwrap(),
|
|
806
|
+
"--format",
|
|
807
|
+
"outline",
|
|
808
|
+
"--allow-tests",
|
|
809
|
+
])?;
|
|
810
|
+
|
|
811
|
+
// Verify test-related content is found in outline format
|
|
812
|
+
assert!(
|
|
813
|
+
output.contains("test") && output.contains("#[test]"),
|
|
814
|
+
"Missing test annotations - output: {}",
|
|
815
|
+
output
|
|
816
|
+
);
|
|
817
|
+
|
|
818
|
+
// Should be in outline format with file delimiter
|
|
819
|
+
assert!(
|
|
820
|
+
output.contains("---\nFile:"),
|
|
821
|
+
"Missing file delimiter in outline format - output: {}",
|
|
822
|
+
output
|
|
823
|
+
);
|
|
824
|
+
|
|
825
|
+
// Should have found at least one result
|
|
826
|
+
assert!(
|
|
827
|
+
output.contains("Found") && output.contains("search results"),
|
|
828
|
+
"Missing search results summary - output: {}",
|
|
829
|
+
output
|
|
830
|
+
);
|
|
831
|
+
|
|
832
|
+
// Should include test functions or modules
|
|
833
|
+
let has_test_content = output.contains("mod tests")
|
|
834
|
+
|| output.contains("fn test_")
|
|
835
|
+
|| output.contains("add_numbers");
|
|
836
|
+
assert!(
|
|
837
|
+
has_test_content,
|
|
838
|
+
"Missing test content - output: {}",
|
|
839
|
+
output
|
|
840
|
+
);
|
|
841
|
+
|
|
842
|
+
Ok(())
|
|
843
|
+
}
|