@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,941 @@
|
|
|
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_csharp_outline_basic_symbols() -> Result<()> {
|
|
10
|
+
let temp_dir = TempDir::new()?;
|
|
11
|
+
let test_file = temp_dir.path().join("Calculator.cs");
|
|
12
|
+
|
|
13
|
+
let content = r#"using System;
|
|
14
|
+
using System.Collections.Generic;
|
|
15
|
+
using System.Linq;
|
|
16
|
+
|
|
17
|
+
namespace Calculator
|
|
18
|
+
{
|
|
19
|
+
public interface ICalculator
|
|
20
|
+
{
|
|
21
|
+
double Add(double x, double y);
|
|
22
|
+
double Subtract(double x, double y);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public class BasicCalculator : ICalculator
|
|
26
|
+
{
|
|
27
|
+
public double Add(double x, double y) => x + y;
|
|
28
|
+
public double Subtract(double x, double y) => x - y;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
"#;
|
|
32
|
+
|
|
33
|
+
fs::write(&test_file, content)?;
|
|
34
|
+
|
|
35
|
+
let ctx = TestContext::new();
|
|
36
|
+
let output = ctx.run_probe(&[
|
|
37
|
+
"search",
|
|
38
|
+
"Calculator",
|
|
39
|
+
test_file.to_str().unwrap(),
|
|
40
|
+
"--format",
|
|
41
|
+
"outline",
|
|
42
|
+
])?;
|
|
43
|
+
|
|
44
|
+
// Verify C# symbols are found in outline format
|
|
45
|
+
assert!(
|
|
46
|
+
output.contains("ICalculator") || output.contains("BasicCalculator"),
|
|
47
|
+
"Missing C# symbols - output: {}",
|
|
48
|
+
output
|
|
49
|
+
);
|
|
50
|
+
assert!(
|
|
51
|
+
output.contains("namespace Calculator"),
|
|
52
|
+
"Missing namespace - output: {}",
|
|
53
|
+
output
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
Ok(())
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#[test]
|
|
60
|
+
fn test_csharp_outline_smart_closing_brace_comments() -> Result<()> {
|
|
61
|
+
let temp_dir = TempDir::new()?;
|
|
62
|
+
let test_file = temp_dir.path().join("smart_braces.cs");
|
|
63
|
+
|
|
64
|
+
let content = r#"using System;
|
|
65
|
+
using System.Collections.Generic;
|
|
66
|
+
using System.Linq;
|
|
67
|
+
|
|
68
|
+
namespace SmartBraces
|
|
69
|
+
{
|
|
70
|
+
/// Small method that should NOT get closing brace comments.
|
|
71
|
+
public class SmallClass
|
|
72
|
+
{
|
|
73
|
+
public void SmallMethod(int x)
|
|
74
|
+
{
|
|
75
|
+
var result = x * 2;
|
|
76
|
+
Console.WriteLine(result);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Large class that SHOULD get closing brace comments when there are gaps.
|
|
81
|
+
public class LargeClassWithGaps
|
|
82
|
+
{
|
|
83
|
+
private readonly List<string> _data = new List<string>();
|
|
84
|
+
private const int MaxRetries = 3;
|
|
85
|
+
|
|
86
|
+
// Phase 1: Initial setup methods
|
|
87
|
+
public void InitializeData()
|
|
88
|
+
{
|
|
89
|
+
for (int i = 0; i < 100; i++)
|
|
90
|
+
{
|
|
91
|
+
if (i % 2 == 0)
|
|
92
|
+
{
|
|
93
|
+
_data.Add($"Even: {i}");
|
|
94
|
+
}
|
|
95
|
+
else
|
|
96
|
+
{
|
|
97
|
+
_data.Add($"Odd: {i}");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Phase 2: Complex processing logic with nested structures
|
|
103
|
+
public void ProcessDataWithComplexLogic()
|
|
104
|
+
{
|
|
105
|
+
var processedData = new Dictionary<string, int>();
|
|
106
|
+
|
|
107
|
+
foreach (var item in _data)
|
|
108
|
+
{
|
|
109
|
+
if (item.StartsWith("Even"))
|
|
110
|
+
{
|
|
111
|
+
var number = ExtractNumber(item);
|
|
112
|
+
if (number > 50)
|
|
113
|
+
{
|
|
114
|
+
processedData[item] = number * 2;
|
|
115
|
+
}
|
|
116
|
+
else
|
|
117
|
+
{
|
|
118
|
+
processedData[item] = number;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (item.StartsWith("Odd"))
|
|
122
|
+
{
|
|
123
|
+
var number = ExtractNumber(item);
|
|
124
|
+
processedData[item] = number + 10;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Final validation and cleanup
|
|
129
|
+
var validatedData = new List<KeyValuePair<string, int>>();
|
|
130
|
+
foreach (var kvp in processedData)
|
|
131
|
+
{
|
|
132
|
+
if (kvp.Value > 0 && kvp.Key.Length > 5)
|
|
133
|
+
{
|
|
134
|
+
validatedData.Add(kvp);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Phase 3: Helper methods and utilities
|
|
140
|
+
private int ExtractNumber(string input)
|
|
141
|
+
{
|
|
142
|
+
var parts = input.Split(':');
|
|
143
|
+
if (parts.Length > 1 && int.TryParse(parts[1].Trim(), out var number))
|
|
144
|
+
{
|
|
145
|
+
return number;
|
|
146
|
+
}
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// Another large class to test closing brace behavior with control flow
|
|
152
|
+
public class ControlFlowClass
|
|
153
|
+
{
|
|
154
|
+
public void ProcessWithControlFlow(List<Item> items)
|
|
155
|
+
{
|
|
156
|
+
var accumulator = new Dictionary<ItemType, List<Item>>();
|
|
157
|
+
|
|
158
|
+
// Main processing loop with complex nested control flow
|
|
159
|
+
foreach (var item in items)
|
|
160
|
+
{
|
|
161
|
+
try
|
|
162
|
+
{
|
|
163
|
+
switch (item.Type)
|
|
164
|
+
{
|
|
165
|
+
case ItemType.Primary:
|
|
166
|
+
if (item.Weight > 50.0)
|
|
167
|
+
{
|
|
168
|
+
if (!accumulator.ContainsKey(ItemType.Primary))
|
|
169
|
+
accumulator[ItemType.Primary] = new List<Item>();
|
|
170
|
+
accumulator[ItemType.Primary].Add(item);
|
|
171
|
+
}
|
|
172
|
+
else
|
|
173
|
+
{
|
|
174
|
+
// Handle lightweight primary items
|
|
175
|
+
ProcessLightweightItem(item);
|
|
176
|
+
}
|
|
177
|
+
break;
|
|
178
|
+
case ItemType.Secondary:
|
|
179
|
+
ProcessSecondaryItem(item, accumulator);
|
|
180
|
+
break;
|
|
181
|
+
case ItemType.Auxiliary:
|
|
182
|
+
ProcessAuxiliaryItem(item);
|
|
183
|
+
break;
|
|
184
|
+
default:
|
|
185
|
+
throw new ArgumentException($"Unknown item type: {item.Type}");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (Exception ex)
|
|
189
|
+
{
|
|
190
|
+
Console.WriteLine($"Error processing item {item.Id}: {ex.Message}");
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
FinalizeProcessing(accumulator);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private void ProcessLightweightItem(Item item) { }
|
|
199
|
+
private void ProcessSecondaryItem(Item item, Dictionary<ItemType, List<Item>> acc) { }
|
|
200
|
+
private void ProcessAuxiliaryItem(Item item) { }
|
|
201
|
+
private void FinalizeProcessing(Dictionary<ItemType, List<Item>> acc) { }
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public class Item
|
|
205
|
+
{
|
|
206
|
+
public int Id { get; set; }
|
|
207
|
+
public ItemType Type { get; set; }
|
|
208
|
+
public double Weight { get; set; }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public enum ItemType
|
|
212
|
+
{
|
|
213
|
+
Primary,
|
|
214
|
+
Secondary,
|
|
215
|
+
Auxiliary
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
"#;
|
|
219
|
+
|
|
220
|
+
fs::write(&test_file, content)?;
|
|
221
|
+
|
|
222
|
+
let ctx = TestContext::new();
|
|
223
|
+
let output = ctx.run_probe(&[
|
|
224
|
+
"search",
|
|
225
|
+
"InitializeData",
|
|
226
|
+
test_file.to_str().unwrap(),
|
|
227
|
+
"--format",
|
|
228
|
+
"outline",
|
|
229
|
+
])?;
|
|
230
|
+
|
|
231
|
+
// Should find the method
|
|
232
|
+
assert!(
|
|
233
|
+
output.contains("InitializeData"),
|
|
234
|
+
"Missing InitializeData method - output: {}",
|
|
235
|
+
output
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
// Should contain the class and method structure in outline format
|
|
239
|
+
assert!(
|
|
240
|
+
output.contains("LargeClassWithGaps") || output.contains("public void InitializeData"),
|
|
241
|
+
"Should contain class or method declaration - output: {}",
|
|
242
|
+
output
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
// Should be in outline format
|
|
246
|
+
assert!(
|
|
247
|
+
output.contains("---\nFile:") || output.contains("File:"),
|
|
248
|
+
"Missing file delimiter in outline format - output: {}",
|
|
249
|
+
output
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
Ok(())
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
#[test]
|
|
256
|
+
fn test_csharp_outline_keyword_highlighting() -> Result<()> {
|
|
257
|
+
let temp_dir = TempDir::new()?;
|
|
258
|
+
let test_file = temp_dir.path().join("keywords.cs");
|
|
259
|
+
|
|
260
|
+
let content = r#"using System;
|
|
261
|
+
using System.Linq;
|
|
262
|
+
using System.Collections.Generic;
|
|
263
|
+
|
|
264
|
+
namespace KeywordTest
|
|
265
|
+
{
|
|
266
|
+
public class KeywordProcessor
|
|
267
|
+
{
|
|
268
|
+
// Methods containing various C# keywords
|
|
269
|
+
public async Task ProcessAsync()
|
|
270
|
+
{
|
|
271
|
+
var data = await GetDataAsync();
|
|
272
|
+
foreach (var item in data.Where(x => x != null))
|
|
273
|
+
{
|
|
274
|
+
if (item is string text && !string.IsNullOrEmpty(text))
|
|
275
|
+
{
|
|
276
|
+
yield return text.ToUpper();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
public void ProcessWithPatternMatching(object input)
|
|
282
|
+
{
|
|
283
|
+
var result = input switch
|
|
284
|
+
{
|
|
285
|
+
string s when s.Length > 10 => $"Long string: {s}",
|
|
286
|
+
int i when i > 0 => $"Positive number: {i}",
|
|
287
|
+
null => "Null value",
|
|
288
|
+
_ => "Unknown type"
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
public void UsingStatement()
|
|
293
|
+
{
|
|
294
|
+
using var resource = new DisposableResource();
|
|
295
|
+
using (var connection = new DatabaseConnection())
|
|
296
|
+
{
|
|
297
|
+
connection.Execute("SELECT * FROM table");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
"#;
|
|
303
|
+
|
|
304
|
+
fs::write(&test_file, content)?;
|
|
305
|
+
|
|
306
|
+
let ctx = TestContext::new();
|
|
307
|
+
let output = ctx.run_probe(&[
|
|
308
|
+
"search",
|
|
309
|
+
"ProcessAsync",
|
|
310
|
+
test_file.to_str().unwrap(),
|
|
311
|
+
"--format",
|
|
312
|
+
"outline",
|
|
313
|
+
])?;
|
|
314
|
+
|
|
315
|
+
// Should contain the async method
|
|
316
|
+
assert!(
|
|
317
|
+
output.contains("ProcessAsync"),
|
|
318
|
+
"Should contain ProcessAsync method - output: {}",
|
|
319
|
+
output
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
// Should contain Task in the return type or await keyword
|
|
323
|
+
assert!(
|
|
324
|
+
output.contains("Task") || output.contains("await"),
|
|
325
|
+
"Should contain async-related keywords - output: {}",
|
|
326
|
+
output
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
Ok(())
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
#[test]
|
|
333
|
+
fn test_csharp_outline_testing_frameworks_detection() -> Result<()> {
|
|
334
|
+
let temp_dir = TempDir::new()?;
|
|
335
|
+
let test_file = temp_dir.path().join("tests.cs");
|
|
336
|
+
|
|
337
|
+
let content = r#"using System;
|
|
338
|
+
using Xunit;
|
|
339
|
+
using NUnit.Framework;
|
|
340
|
+
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
341
|
+
|
|
342
|
+
namespace Calculator.Tests
|
|
343
|
+
{
|
|
344
|
+
// xUnit tests
|
|
345
|
+
public class XUnitCalculatorTests
|
|
346
|
+
{
|
|
347
|
+
[Fact]
|
|
348
|
+
public void Add_ShouldReturnSum_WhenGivenTwoNumbers()
|
|
349
|
+
{
|
|
350
|
+
var calc = new Calculator();
|
|
351
|
+
var result = calc.Add(2, 3);
|
|
352
|
+
Assert.Equal(5, result);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
[Theory]
|
|
356
|
+
[InlineData(2, 3, 5)]
|
|
357
|
+
[InlineData(0, 0, 0)]
|
|
358
|
+
[InlineData(-1, 1, 0)]
|
|
359
|
+
public void Add_ShouldReturnCorrectSum_ForVariousInputs(int a, int b, int expected)
|
|
360
|
+
{
|
|
361
|
+
var calc = new Calculator();
|
|
362
|
+
var result = calc.Add(a, b);
|
|
363
|
+
Assert.Equal(expected, result);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// NUnit tests
|
|
368
|
+
[TestFixture]
|
|
369
|
+
public class NUnitCalculatorTests
|
|
370
|
+
{
|
|
371
|
+
private Calculator _calculator;
|
|
372
|
+
|
|
373
|
+
[SetUp]
|
|
374
|
+
public void SetUp()
|
|
375
|
+
{
|
|
376
|
+
_calculator = new Calculator();
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
[Test]
|
|
380
|
+
public void Multiply_ShouldReturnProduct_WhenGivenTwoNumbers()
|
|
381
|
+
{
|
|
382
|
+
var result = _calculator.Multiply(3, 4);
|
|
383
|
+
Assert.AreEqual(12, result);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
[TestCase(2, 3, 6)]
|
|
387
|
+
[TestCase(0, 5, 0)]
|
|
388
|
+
[TestCase(-2, 3, -6)]
|
|
389
|
+
public void Multiply_ShouldReturnCorrectProduct_ForVariousInputs(int a, int b, int expected)
|
|
390
|
+
{
|
|
391
|
+
var result = _calculator.Multiply(a, b);
|
|
392
|
+
Assert.AreEqual(expected, result);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// MSTest tests
|
|
397
|
+
[TestClass]
|
|
398
|
+
public class MSTestCalculatorTests
|
|
399
|
+
{
|
|
400
|
+
private Calculator _calculator;
|
|
401
|
+
|
|
402
|
+
[TestInitialize]
|
|
403
|
+
public void Initialize()
|
|
404
|
+
{
|
|
405
|
+
_calculator = new Calculator();
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
[TestMethod]
|
|
409
|
+
public void Divide_ShouldReturnQuotient_WhenGivenTwoNumbers()
|
|
410
|
+
{
|
|
411
|
+
var result = _calculator.Divide(10, 2);
|
|
412
|
+
Assert.AreEqual(5, result);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
[DataTestMethod]
|
|
416
|
+
[DataRow(10, 2, 5)]
|
|
417
|
+
[DataRow(15, 3, 5)]
|
|
418
|
+
[DataRow(0, 1, 0)]
|
|
419
|
+
public void Divide_ShouldReturnCorrectQuotient_ForVariousInputs(int a, int b, int expected)
|
|
420
|
+
{
|
|
421
|
+
var result = _calculator.Divide(a, b);
|
|
422
|
+
Assert.AreEqual(expected, result);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
"#;
|
|
427
|
+
|
|
428
|
+
fs::write(&test_file, content)?;
|
|
429
|
+
|
|
430
|
+
let ctx = TestContext::new();
|
|
431
|
+
|
|
432
|
+
// Test xUnit detection
|
|
433
|
+
let output = ctx.run_probe(&[
|
|
434
|
+
"search",
|
|
435
|
+
"Fact",
|
|
436
|
+
test_file.to_str().unwrap(),
|
|
437
|
+
"--format",
|
|
438
|
+
"outline",
|
|
439
|
+
])?;
|
|
440
|
+
|
|
441
|
+
assert!(
|
|
442
|
+
output.contains("Fact") || output.contains("[Fact]"),
|
|
443
|
+
"Should detect xUnit [Fact] attribute - output: {}",
|
|
444
|
+
output
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
// Test NUnit detection
|
|
448
|
+
let output = ctx.run_probe(&[
|
|
449
|
+
"search",
|
|
450
|
+
"TestFixture",
|
|
451
|
+
test_file.to_str().unwrap(),
|
|
452
|
+
"--format",
|
|
453
|
+
"outline",
|
|
454
|
+
])?;
|
|
455
|
+
|
|
456
|
+
assert!(
|
|
457
|
+
output.contains("TestFixture") || output.contains("[TestFixture]"),
|
|
458
|
+
"Should detect NUnit [TestFixture] attribute - output: {}",
|
|
459
|
+
output
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
// Test MSTest detection
|
|
463
|
+
let output = ctx.run_probe(&[
|
|
464
|
+
"search",
|
|
465
|
+
"TestMethod",
|
|
466
|
+
test_file.to_str().unwrap(),
|
|
467
|
+
"--format",
|
|
468
|
+
"outline",
|
|
469
|
+
])?;
|
|
470
|
+
|
|
471
|
+
assert!(
|
|
472
|
+
output.contains("TestMethod") || output.contains("[TestMethod]"),
|
|
473
|
+
"Should detect MSTest [TestMethod] attribute - output: {}",
|
|
474
|
+
output
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
Ok(())
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
#[test]
|
|
481
|
+
fn test_csharp_outline_modern_features() -> Result<()> {
|
|
482
|
+
let temp_dir = TempDir::new()?;
|
|
483
|
+
let test_file = temp_dir.path().join("modern_csharp.cs");
|
|
484
|
+
|
|
485
|
+
let content = r#"using System;
|
|
486
|
+
using System.Collections.Generic;
|
|
487
|
+
using System.Linq;
|
|
488
|
+
|
|
489
|
+
namespace ModernCSharp
|
|
490
|
+
{
|
|
491
|
+
// Records (C# 9+)
|
|
492
|
+
public record Person(string Name, int Age)
|
|
493
|
+
{
|
|
494
|
+
public string? Email { get; init; }
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
public record struct Point(double X, double Y);
|
|
498
|
+
|
|
499
|
+
// Nullable reference types
|
|
500
|
+
public class DataProcessor
|
|
501
|
+
{
|
|
502
|
+
public string? ProcessData(string? input)
|
|
503
|
+
{
|
|
504
|
+
if (input is null)
|
|
505
|
+
return null;
|
|
506
|
+
|
|
507
|
+
return input.ToUpper();
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
public List<string> FilterNonNullItems(List<string?> items)
|
|
511
|
+
{
|
|
512
|
+
return items.Where(x => x is not null).ToList()!;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Pattern matching enhancements
|
|
517
|
+
public class PatternMatchingExamples
|
|
518
|
+
{
|
|
519
|
+
public string DescribeValue(object value) => value switch
|
|
520
|
+
{
|
|
521
|
+
null => "It's null",
|
|
522
|
+
string s when s.Length == 0 => "Empty string",
|
|
523
|
+
string s => $"String of length {s.Length}",
|
|
524
|
+
int i when i < 0 => "Negative number",
|
|
525
|
+
int i when i == 0 => "Zero",
|
|
526
|
+
int i => $"Positive number: {i}",
|
|
527
|
+
Person { Age: >= 18 } p => $"Adult: {p.Name}",
|
|
528
|
+
Person p => $"Minor: {p.Name}",
|
|
529
|
+
IEnumerable<string> list => $"Collection with {list.Count()} items",
|
|
530
|
+
_ => "Unknown type"
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
public bool IsValidPerson(Person person) => person switch
|
|
534
|
+
{
|
|
535
|
+
{ Name: not null, Age: >= 0 and < 150 } => true,
|
|
536
|
+
_ => false
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// Top-level programs support (would typically be in Program.cs)
|
|
541
|
+
public static class TopLevelDemo
|
|
542
|
+
{
|
|
543
|
+
public static void RunDemo(string[] args)
|
|
544
|
+
{
|
|
545
|
+
Console.WriteLine("Hello, World!");
|
|
546
|
+
|
|
547
|
+
var person = new Person("John", 30) { Email = "john@example.com" };
|
|
548
|
+
Console.WriteLine($"Person: {person}");
|
|
549
|
+
|
|
550
|
+
var point = new Point(1.0, 2.0);
|
|
551
|
+
Console.WriteLine($"Point: {point}");
|
|
552
|
+
|
|
553
|
+
var processor = new DataProcessor();
|
|
554
|
+
var result = processor.ProcessData("test");
|
|
555
|
+
Console.WriteLine($"Result: {result ?? "null"}");
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// Target-typed new expressions
|
|
560
|
+
public class ModernSyntax
|
|
561
|
+
{
|
|
562
|
+
private readonly List<Person> _people = new();
|
|
563
|
+
private readonly Dictionary<string, int> _scores = new()
|
|
564
|
+
{
|
|
565
|
+
["Alice"] = 95,
|
|
566
|
+
["Bob"] = 87
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
public void InitializationExamples()
|
|
570
|
+
{
|
|
571
|
+
Point point = new(1.0, 2.0);
|
|
572
|
+
Person person = new("Jane", 25);
|
|
573
|
+
|
|
574
|
+
var list = new List<string> { "item1", "item2" };
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// Switch expressions and property patterns
|
|
579
|
+
public class AdvancedPatterns
|
|
580
|
+
{
|
|
581
|
+
public decimal CalculateDiscount(Person customer, decimal amount) =>
|
|
582
|
+
(customer, amount) switch
|
|
583
|
+
{
|
|
584
|
+
({ Age: >= 65 }, _) => amount * 0.1m,
|
|
585
|
+
(_, >= 1000) => amount * 0.05m,
|
|
586
|
+
({ Name: "VIP" }, _) => amount * 0.15m,
|
|
587
|
+
_ => 0m
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
public string GetDayType(DateTime date) => date.DayOfWeek switch
|
|
591
|
+
{
|
|
592
|
+
DayOfWeek.Saturday or DayOfWeek.Sunday => "Weekend",
|
|
593
|
+
DayOfWeek.Monday => "Start of week",
|
|
594
|
+
DayOfWeek.Friday => "End of week",
|
|
595
|
+
_ => "Weekday"
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
"#;
|
|
600
|
+
|
|
601
|
+
fs::write(&test_file, content)?;
|
|
602
|
+
|
|
603
|
+
let ctx = TestContext::new();
|
|
604
|
+
|
|
605
|
+
// Test records
|
|
606
|
+
let output = ctx.run_probe(&[
|
|
607
|
+
"search",
|
|
608
|
+
"record",
|
|
609
|
+
test_file.to_str().unwrap(),
|
|
610
|
+
"--format",
|
|
611
|
+
"outline",
|
|
612
|
+
])?;
|
|
613
|
+
|
|
614
|
+
assert!(
|
|
615
|
+
output.contains("record") && (output.contains("Person") || output.contains("Point")),
|
|
616
|
+
"Should detect C# records - output: {}",
|
|
617
|
+
output
|
|
618
|
+
);
|
|
619
|
+
|
|
620
|
+
// Test nullable reference types
|
|
621
|
+
let output = ctx.run_probe(&[
|
|
622
|
+
"search",
|
|
623
|
+
"string?",
|
|
624
|
+
test_file.to_str().unwrap(),
|
|
625
|
+
"--format",
|
|
626
|
+
"outline",
|
|
627
|
+
])?;
|
|
628
|
+
|
|
629
|
+
assert!(
|
|
630
|
+
output.contains("string?") || output.contains("nullable"),
|
|
631
|
+
"Should detect nullable reference types - output: {}",
|
|
632
|
+
output
|
|
633
|
+
);
|
|
634
|
+
|
|
635
|
+
// Test pattern matching with a more specific search
|
|
636
|
+
let output = ctx.run_probe(&[
|
|
637
|
+
"search",
|
|
638
|
+
"DescribeValue",
|
|
639
|
+
test_file.to_str().unwrap(),
|
|
640
|
+
"--format",
|
|
641
|
+
"outline",
|
|
642
|
+
])?;
|
|
643
|
+
|
|
644
|
+
assert!(
|
|
645
|
+
output.contains("DescribeValue") && (output.contains("switch") || output.contains("=>")),
|
|
646
|
+
"Should detect pattern matching method - output: {}",
|
|
647
|
+
output
|
|
648
|
+
);
|
|
649
|
+
|
|
650
|
+
Ok(())
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
#[test]
|
|
654
|
+
fn test_csharp_outline_linq_and_generics() -> Result<()> {
|
|
655
|
+
let temp_dir = TempDir::new()?;
|
|
656
|
+
let test_file = temp_dir.path().join("linq_generics.cs");
|
|
657
|
+
|
|
658
|
+
let content = r#"using System;
|
|
659
|
+
using System.Collections.Generic;
|
|
660
|
+
using System.Linq;
|
|
661
|
+
|
|
662
|
+
namespace LinqAndGenerics
|
|
663
|
+
{
|
|
664
|
+
public class Repository<T> where T : class, IEntity
|
|
665
|
+
{
|
|
666
|
+
private readonly List<T> _items = new List<T>();
|
|
667
|
+
|
|
668
|
+
public void Add(T item)
|
|
669
|
+
{
|
|
670
|
+
_items.Add(item);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
public IEnumerable<T> FindByPredicate(Func<T, bool> predicate)
|
|
674
|
+
{
|
|
675
|
+
return _items.Where(predicate);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
public TResult? Transform<TResult>(T item, Func<T, TResult> transformer)
|
|
679
|
+
where TResult : class
|
|
680
|
+
{
|
|
681
|
+
return item != null ? transformer(item) : null;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
public interface IEntity
|
|
686
|
+
{
|
|
687
|
+
int Id { get; }
|
|
688
|
+
string Name { get; }
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
public class Customer : IEntity
|
|
692
|
+
{
|
|
693
|
+
public int Id { get; set; }
|
|
694
|
+
public string Name { get; set; } = string.Empty;
|
|
695
|
+
public string Email { get; set; } = string.Empty;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
public class LinqOperations
|
|
699
|
+
{
|
|
700
|
+
public void ComplexLinqQuery(List<Customer> customers)
|
|
701
|
+
{
|
|
702
|
+
var result = customers
|
|
703
|
+
.Where(c => c.Email.Contains("@gmail.com"))
|
|
704
|
+
.GroupBy(c => c.Name.Substring(0, 1))
|
|
705
|
+
.Select(g => new
|
|
706
|
+
{
|
|
707
|
+
FirstLetter = g.Key,
|
|
708
|
+
Count = g.Count(),
|
|
709
|
+
Customers = g.Select(c => c.Name).ToList()
|
|
710
|
+
})
|
|
711
|
+
.OrderBy(x => x.FirstLetter)
|
|
712
|
+
.ToList();
|
|
713
|
+
|
|
714
|
+
var emailDomains = customers
|
|
715
|
+
.Select(c => c.Email.Split('@').LastOrDefault())
|
|
716
|
+
.Where(domain => !string.IsNullOrEmpty(domain))
|
|
717
|
+
.GroupBy(domain => domain)
|
|
718
|
+
.ToDictionary(g => g.Key, g => g.Count());
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
public IEnumerable<TResult> ProcessItems<TSource, TResult>(
|
|
722
|
+
IEnumerable<TSource> source,
|
|
723
|
+
Func<TSource, bool> filter,
|
|
724
|
+
Func<TSource, TResult> selector)
|
|
725
|
+
{
|
|
726
|
+
return source.Where(filter).Select(selector);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// Delegates and Events
|
|
731
|
+
public delegate void DataChangedEventHandler<T>(T oldValue, T newValue);
|
|
732
|
+
|
|
733
|
+
public class DataContainer<T>
|
|
734
|
+
{
|
|
735
|
+
private T _value = default(T)!;
|
|
736
|
+
|
|
737
|
+
public event DataChangedEventHandler<T>? ValueChanged;
|
|
738
|
+
public event Action<string>? LogMessage;
|
|
739
|
+
|
|
740
|
+
public T Value
|
|
741
|
+
{
|
|
742
|
+
get => _value;
|
|
743
|
+
set
|
|
744
|
+
{
|
|
745
|
+
var oldValue = _value;
|
|
746
|
+
_value = value;
|
|
747
|
+
OnValueChanged(oldValue, value);
|
|
748
|
+
LogMessage?.Invoke($"Value changed from {oldValue} to {value}");
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
protected virtual void OnValueChanged(T oldValue, T newValue)
|
|
753
|
+
{
|
|
754
|
+
ValueChanged?.Invoke(oldValue, newValue);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
// Properties and Indexers
|
|
759
|
+
public class SmartCollection<T>
|
|
760
|
+
{
|
|
761
|
+
private readonly Dictionary<string, T> _items = new();
|
|
762
|
+
|
|
763
|
+
public T this[string key]
|
|
764
|
+
{
|
|
765
|
+
get => _items.TryGetValue(key, out var value) ? value : default(T)!;
|
|
766
|
+
set => _items[key] = value;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
public int Count => _items.Count;
|
|
770
|
+
|
|
771
|
+
public IEnumerable<string> Keys => _items.Keys;
|
|
772
|
+
|
|
773
|
+
public bool IsEmpty => _items.Count == 0;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
"#;
|
|
777
|
+
|
|
778
|
+
fs::write(&test_file, content)?;
|
|
779
|
+
|
|
780
|
+
let ctx = TestContext::new();
|
|
781
|
+
|
|
782
|
+
// Test LINQ detection
|
|
783
|
+
let output = ctx.run_probe(&[
|
|
784
|
+
"search",
|
|
785
|
+
"Where",
|
|
786
|
+
test_file.to_str().unwrap(),
|
|
787
|
+
"--format",
|
|
788
|
+
"outline",
|
|
789
|
+
])?;
|
|
790
|
+
|
|
791
|
+
assert!(
|
|
792
|
+
output.contains("Where")
|
|
793
|
+
&& (output.contains("Select") || output.contains("LINQ") || output.contains("linq")),
|
|
794
|
+
"Should detect LINQ operations - output: {}",
|
|
795
|
+
output
|
|
796
|
+
);
|
|
797
|
+
|
|
798
|
+
// Test generics
|
|
799
|
+
let output = ctx.run_probe(&[
|
|
800
|
+
"search",
|
|
801
|
+
"Repository",
|
|
802
|
+
test_file.to_str().unwrap(),
|
|
803
|
+
"--format",
|
|
804
|
+
"outline",
|
|
805
|
+
])?;
|
|
806
|
+
|
|
807
|
+
assert!(
|
|
808
|
+
output.contains("Repository") && output.contains("<T>"),
|
|
809
|
+
"Should detect generic types - output: {}",
|
|
810
|
+
output
|
|
811
|
+
);
|
|
812
|
+
|
|
813
|
+
// Test delegates
|
|
814
|
+
let output = ctx.run_probe(&[
|
|
815
|
+
"search",
|
|
816
|
+
"delegate",
|
|
817
|
+
test_file.to_str().unwrap(),
|
|
818
|
+
"--format",
|
|
819
|
+
"outline",
|
|
820
|
+
])?;
|
|
821
|
+
|
|
822
|
+
assert!(
|
|
823
|
+
output.contains("delegate") || output.contains("DataChangedEventHandler"),
|
|
824
|
+
"Should detect delegates - output: {}",
|
|
825
|
+
output
|
|
826
|
+
);
|
|
827
|
+
|
|
828
|
+
// Test events with more specific search
|
|
829
|
+
let output = ctx.run_probe(&[
|
|
830
|
+
"search",
|
|
831
|
+
"ValueChanged",
|
|
832
|
+
test_file.to_str().unwrap(),
|
|
833
|
+
"--format",
|
|
834
|
+
"outline",
|
|
835
|
+
])?;
|
|
836
|
+
|
|
837
|
+
assert!(
|
|
838
|
+
output.contains("ValueChanged") || output.contains("DataChangedEventHandler"),
|
|
839
|
+
"Should detect events - output: {}",
|
|
840
|
+
output
|
|
841
|
+
);
|
|
842
|
+
|
|
843
|
+
Ok(())
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
#[test]
|
|
847
|
+
fn test_csharp_outline_array_truncation_with_keyword_preservation() -> Result<()> {
|
|
848
|
+
let temp_dir = TempDir::new()?;
|
|
849
|
+
let test_file = temp_dir.path().join("large_arrays.cs");
|
|
850
|
+
|
|
851
|
+
let content = r#"using System;
|
|
852
|
+
using System.Collections.Generic;
|
|
853
|
+
using System.Linq;
|
|
854
|
+
|
|
855
|
+
namespace ArrayTruncation
|
|
856
|
+
{
|
|
857
|
+
public class ConfigurationManager
|
|
858
|
+
{
|
|
859
|
+
/// Configuration data that should be truncated but preserve the 'important' keyword.
|
|
860
|
+
public static readonly string[] ImportantConfiguration = {
|
|
861
|
+
"setting1=value1",
|
|
862
|
+
"setting2=value2",
|
|
863
|
+
"important=critical_value",
|
|
864
|
+
"setting3=value3",
|
|
865
|
+
"setting4=value4",
|
|
866
|
+
"setting5=value5",
|
|
867
|
+
"setting6=value6",
|
|
868
|
+
"setting7=value7",
|
|
869
|
+
"setting8=value8",
|
|
870
|
+
"setting9=value9",
|
|
871
|
+
"setting10=value10",
|
|
872
|
+
"setting11=value11",
|
|
873
|
+
"setting12=value12",
|
|
874
|
+
"important_backup=backup_value",
|
|
875
|
+
"setting13=value13",
|
|
876
|
+
"setting14=value14",
|
|
877
|
+
"setting15=value15",
|
|
878
|
+
"setting16=value16",
|
|
879
|
+
"setting17=value17",
|
|
880
|
+
"setting18=value18",
|
|
881
|
+
"setting19=value19",
|
|
882
|
+
"setting20=value20",
|
|
883
|
+
"final_important_setting=final_value"
|
|
884
|
+
};
|
|
885
|
+
|
|
886
|
+
public void ProcessLargeDataSet()
|
|
887
|
+
{
|
|
888
|
+
var keywords = new List<string> {
|
|
889
|
+
"abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char",
|
|
890
|
+
"checked", "class", "const", "continue", "decimal", "default", "delegate",
|
|
891
|
+
"do", "double", "else", "enum", "event", "explicit", "extern", "false",
|
|
892
|
+
"finally", "fixed", "float", "for", "foreach", "goto", "if", "implicit",
|
|
893
|
+
"in", "int", "interface", "internal", "is", "lock", "long", "namespace",
|
|
894
|
+
"new", "null", "object", "operator", "out", "override", "params", "private",
|
|
895
|
+
"protected", "public", "readonly", "ref", "return", "sbyte", "sealed",
|
|
896
|
+
"short", "sizeof", "stackalloc", "static", "string", "struct", "switch",
|
|
897
|
+
"this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked",
|
|
898
|
+
"unsafe", "ushort", "using", "virtual", "void", "volatile", "while"
|
|
899
|
+
};
|
|
900
|
+
|
|
901
|
+
var filteredKeywords = keywords.Where(k => k.Contains("important")).ToList();
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
"#;
|
|
906
|
+
|
|
907
|
+
fs::write(&test_file, content)?;
|
|
908
|
+
|
|
909
|
+
let ctx = TestContext::new();
|
|
910
|
+
let output = ctx.run_probe(&[
|
|
911
|
+
"search",
|
|
912
|
+
"important",
|
|
913
|
+
test_file.to_str().unwrap(),
|
|
914
|
+
"--format",
|
|
915
|
+
"outline",
|
|
916
|
+
])?;
|
|
917
|
+
|
|
918
|
+
// Should find the keyword even in truncated arrays
|
|
919
|
+
assert!(
|
|
920
|
+
output.contains("important"),
|
|
921
|
+
"Should preserve 'important' keyword in truncated arrays - output: {}",
|
|
922
|
+
output
|
|
923
|
+
);
|
|
924
|
+
|
|
925
|
+
// Should show truncation with ellipsis
|
|
926
|
+
assert!(
|
|
927
|
+
output.contains("...") || output.contains("/*"),
|
|
928
|
+
"Should show array truncation - output: {}",
|
|
929
|
+
output
|
|
930
|
+
);
|
|
931
|
+
|
|
932
|
+
// Should have reasonable length (not show entire massive array)
|
|
933
|
+
let line_count = output.lines().count();
|
|
934
|
+
assert!(
|
|
935
|
+
line_count < 100,
|
|
936
|
+
"Output should be truncated to reasonable size, got {} lines",
|
|
937
|
+
line_count
|
|
938
|
+
);
|
|
939
|
+
|
|
940
|
+
Ok(())
|
|
941
|
+
}
|