Files
storybook/LSP_TEST_STRATEGY.md

1022 lines
26 KiB
Markdown
Raw Normal View History

# LSP Testing Strategy
**Version:** 1.0
**Date:** 2026-02-12
**Owner:** LSP Test Engineer
---
## Executive Summary
This document outlines a comprehensive testing strategy for the Storybook LSP implementation, designed to achieve **85% code coverage** and **zero critical bugs** within 4-6 weeks. The strategy is divided into 5 phases, prioritized by immediate blocking issues first, followed by coverage expansion, integration testing, automation, and finally multi-file support.
---
## Strategy Goals
### Primary Objectives
1. **Fix Critical Bugs:** Resolve 2 compilation errors blocking all tests
2. **Achieve Stability:** 100% of tests pass reliably
3. **Expand Coverage:** Reach 80%+ code coverage across all LSP features
4. **Enable Automation:** Set up CI/CD for continuous testing
5. **Support Multi-File:** Prepare infrastructure for cross-file navigation
### Success Metrics
- **Week 1:** All tests compile and run (100% pass rate)
- **Week 2:** All features have dedicated unit tests (70% coverage)
- **Week 3:** Integration tests complete (80% coverage)
- **Week 4:** CI/CD operational, benchmarks established
- **Weeks 5-6:** Multi-file support tested (85% coverage)
---
## Testing Pyramid
```
/\
/ \ E2E Tests (5%)
/____\ - Zed extension integration
/ \ - Real-world scenarios
/ INTEG \
/__________\ Integration Tests (15%)
/ \ - Multi-file scenarios
/ UNIT TESTS \ - Concurrent access
/________________\ - Document lifecycle
/ \
/ UNIT TESTS 80% \ Unit Tests (80%)
/____________________\ - Feature-specific tests
- Edge cases
- Error conditions
```
**Rationale:**
- **80% Unit Tests** - Fast feedback, easy to debug, high confidence in individual components
- **15% Integration Tests** - Validate feature interactions, realistic scenarios
- **5% E2E Tests** - Validate actual editor integration (Zed)
---
## Phase 1: Stabilization (Days 1-2)
### Objective
Fix blocking compilation errors and establish baseline test health.
### Tasks
#### 1.1 Fix Compilation Errors
**Priority:** CRITICAL
**Estimated Time:** 30 minutes
**Bug #1: Inlay Hints Import Path**
- **File:** `storybook/src/lsp/inlay_hints.rs:134`
- **Current:** `crate::project::positions::PositionTracker`
- **Fix:** `crate::position::PositionTracker`
- **Verification:** `cargo check`
**Bug #2: Completion Type Annotation**
- **File:** `storybook/src/lsp/completion.rs:421`
- **Current:** `let mut nesting_level = 0;`
- **Fix:** `let mut nesting_level: i32 = 0;`
- **Verification:** `cargo check`
#### 1.2 Baseline Test Run
**Priority:** CRITICAL
**Estimated Time:** 1 hour
```bash
# Compile tests
cd /Users/sienna/Development/storybook/storybook
cargo test --lib lsp --no-run
# Run all LSP tests
cargo test --lib lsp
# Document results
# - Total tests run
# - Pass/fail counts
# - Any flaky tests
# - Performance outliers
```
**Deliverable:** Test baseline report
- Total test count (expect ~147)
- Pass rate (target: 100%)
- Test execution time
- Flaky test identification
#### 1.3 Tree-sitter Verification
**Priority:** HIGH
**Estimated Time:** 30 minutes
```bash
cd /Users/sienna/Development/storybook/tree-sitter-storybook
npm run test
```
**Verification:** All 27 tests pass
### Phase 1 Deliverables
- ✅ All compilation errors fixed
- ✅ All tests compile successfully
- ✅ Baseline test report with 100% pass rate
- ✅ Tree-sitter tests verified
- ✅ List of any identified issues for Phase 2
---
## Phase 2: Coverage Expansion (Days 3-7)
### Objective
Fill test coverage gaps for under-tested features and add edge case testing.
### 2.1 Feature-Specific Unit Tests
#### 2.1.1 Hover Tests
**File:** Create `storybook/src/lsp/hover_tests.rs`
**Estimated Time:** 3 hours
**Target:** 15 tests
**Test Categories:**
1. **Basic Hover** (3 tests)
- Hover on character name
- Hover on template name
- Hover on behavior name
2. **Type Information** (4 tests)
- Hover on field shows type
- Hover on species reference
- Hover on template reference
- Hover on behavior reference
3. **Documentation** (4 tests)
- Hover shows field documentation
- Hover shows prose blocks
- Hover on state shows transitions
- Hover on schedule shows time blocks
4. **Edge Cases** (4 tests)
- Hover on whitespace (returns None)
- Hover on comment (returns None)
- Hover at EOF (returns None)
- Hover on invalid position (returns None)
**Coverage Target:** 85%
#### 2.1.2 Formatting Tests
**File:** Create `storybook/src/lsp/formatting_tests.rs`
**Estimated Time:** 3 hours
**Target:** 15 tests
**Test Categories:**
1. **Indentation** (5 tests)
- Character block indentation
- Template block indentation
- Nested behavior indentation
- Life arc state indentation
- Consistent tab/space usage
2. **Spacing** (4 tests)
- Spacing around colons
- Spacing around braces
- Line breaks between declarations
- Trailing whitespace removal
3. **Alignment** (3 tests)
- Field alignment in blocks
- Comment alignment
- Multiline value alignment
4. **Edge Cases** (3 tests)
- Empty document formatting
- Already-formatted document (no changes)
- Document with syntax errors (graceful handling)
**Coverage Target:** 80%
#### 2.1.3 Rename Tests
**File:** Create `storybook/src/lsp/rename_tests.rs`
**Estimated Time:** 2 hours
**Target:** 12 tests
**Test Categories:**
1. **Basic Rename** (4 tests)
- Rename character (updates all references)
- Rename template (updates all uses)
- Rename behavior (updates all calls)
- Rename field (updates all occurrences)
2. **Scope Testing** (3 tests)
- Rename doesn't affect different scope
- Rename preserves capitalization context
- Rename updates definition + all uses
3. **Validation** (3 tests)
- Reject invalid identifier names
- Reject rename to existing symbol
- Reject rename of built-in keywords
4. **Edge Cases** (2 tests)
- Rename at EOF
- Rename in comment (should fail gracefully)
**Coverage Target:** 80%
#### 2.1.4 Semantic Tokens Tests
**File:** Create `storybook/src/lsp/semantic_tokens_tests.rs`
**Estimated Time:** 3 hours
**Target:** 15 tests
**Test Categories:**
1. **Token Types** (7 tests)
- Character tokens (type.character)
- Template tokens (type.template)
- Behavior tokens (type.behavior)
- Keyword tokens (keyword.declaration)
- Field tokens (property)
- String tokens (string)
- Number tokens (constant.numeric)
2. **Token Modifiers** (3 tests)
- Definition modifier
- Reference modifier
- Deprecated modifier (if applicable)
3. **Complex Scenarios** (3 tests)
- Nested structures (correct scoping)
- Multiline declarations
- Mixed token types in single line
4. **Edge Cases** (2 tests)
- Empty document (no tokens)
- Syntax errors (partial tokenization)
**Coverage Target:** 80%
### 2.2 Edge Case Testing Suite
#### 2.2.1 Large File Tests
**File:** Create `storybook/src/lsp/stress_tests.rs`
**Estimated Time:** 4 hours
**Target:** 10 tests
**Test Categories:**
1. **Size Tests** (4 tests)
- 1,000 line document
- 10,000 line document
- 50,000 line document
- Document with 1,000+ symbols
2. **Depth Tests** (3 tests)
- 10-level nested behaviors
- 20-level nested behaviors
- Deeply nested template includes
3. **Performance Tests** (3 tests)
- Parse time < 100ms for 1,000 lines
- Symbol extraction < 50ms
- Completion latency < 20ms
**Coverage Target:** N/A (performance validation)
#### 2.2.2 Unicode and Special Characters
**File:** Add to `storybook/src/lsp/document_edge_tests.rs`
**Estimated Time:** 2 hours
**Target:** 8 tests
**Test Categories:**
1. **Unicode Identifiers** (3 tests)
- Chinese character names: `character 爱丽丝 {}`
- Emoji in prose: `---backstory\n😊\n---`
- Mixed scripts: `character Αλίκη {}`
2. **Special Characters** (3 tests)
- Underscores in identifiers
- Hyphens in strings
- Escape sequences in strings
3. **Boundary Conditions** (2 tests)
- Zero-width characters
- RTL text in prose blocks
**Coverage Target:** 85%
#### 2.2.3 Malformed Input Tests
**File:** Create `storybook/src/lsp/error_recovery_tests.rs`
**Estimated Time:** 3 hours
**Target:** 12 tests
**Test Categories:**
1. **Truncated Files** (4 tests)
- Incomplete character block
- Unclosed prose block
- Missing closing brace
- Truncated at field value
2. **Invalid UTF-8** (2 tests)
- Invalid byte sequences
- Null bytes in content
3. **Syntax Errors** (4 tests)
- Missing colons in fields
- Invalid identifiers (starting with numbers)
- Unmatched braces
- Invalid keywords
4. **Graceful Degradation** (2 tests)
- Partial symbol extraction on errors
- Diagnostics still generated
- Server doesn't crash
**Coverage Target:** 90%
### Phase 2 Deliverables
- ✅ 4 new test modules created (~57 new tests)
- ✅ Coverage increased from ~60% to 80%
- ✅ All features have dedicated unit tests
- ✅ Edge cases comprehensively tested
---
## Phase 3: Integration Testing (Days 8-12)
### Objective
Validate feature interactions and real-world scenarios.
### 3.1 Multi-File Scenarios
#### 3.1.1 Multi-File Test Suite
**File:** Create `storybook/src/lsp/integration_tests.rs`
**Estimated Time:** 6 hours
**Target:** 15 tests
**Test Categories:**
1. **Use Declarations** (3 tests)
- Import character from another file
- Import template from another file
- Wildcard imports (`use characters::*`)
2. **Cross-File References** (4 tests)
- Template include from another file
- Species reference from another file
- Behavior subtree reference (`@module::tree`)
- Relationship participants from other files
3. **Workspace State** (3 tests)
- Workspace rebuild on file add
- Workspace rebuild on file remove
- Workspace rebuild on file modify
4. **Symbol Resolution** (3 tests)
- Go-to-definition across files (even if not fully supported)
- Find references across files (even if not fully supported)
- Completion shows cross-file symbols (even if not fully supported)
5. **Edge Cases** (2 tests)
- Circular dependencies
- Missing import targets
**Note:** These tests document **expected behavior** even if cross-file support isn't fully implemented. They serve as regression tests for when Phase 5 is implemented.
**Coverage Target:** Establish baseline for multi-file features
#### 3.1.2 Concurrent Access Tests
**File:** Create `storybook/src/lsp/concurrency_tests.rs`
**Estimated Time:** 4 hours
**Target:** 8 tests
**Test Categories:**
1. **Multiple Clients** (3 tests)
- Two clients open same document
- Simultaneous edits from different clients
- One client closes while other edits
2. **Rapid Operations** (3 tests)
- Rapid did_change events
- Open/close/reopen sequences
- Completion requests during editing
3. **Locking** (2 tests)
- No deadlocks on concurrent reads
- Write lock releases properly
**Coverage Target:** Validate concurrency safety
### 3.2 Document Lifecycle Tests
#### 3.2.1 Lifecycle Integration
**File:** Add to `storybook/src/lsp/integration_tests.rs`
**Estimated Time:** 3 hours
**Target:** 10 tests
**Test Categories:**
1. **Open/Edit/Close** (4 tests)
- Normal lifecycle (open → edit → close)
- Multiple edits before close
- Close without edit
- Reopen after close
2. **State Consistency** (3 tests)
- Symbols update on edit
- Diagnostics update on edit
- Workspace rebuilds on change
3. **Error Recovery** (3 tests)
- Server survives parse errors
- Server survives malformed edits
- Server recovers from invalid positions
**Coverage Target:** 90% of document.rs
### Phase 3 Deliverables
- ✅ Integration test suite (33 tests)
- ✅ Multi-file behavior documented
- ✅ Concurrency safety validated
- ✅ Document lifecycle coverage > 90%
---
## Phase 4: Automation & Performance (Days 13-15)
### Objective
Enable automated testing and establish performance baselines.
### 4.1 CI/CD Setup
#### 4.1.1 GitHub Actions Workflow
**File:** Create `.github/workflows/lsp-tests.yml`
**Estimated Time:** 4 hours
**Workflow Components:**
1. **Test Jobs**
- Rust version: stable, nightly
- OS: ubuntu-latest, macos-latest
- Run: `cargo test --lib lsp`
2. **Coverage Job**
- Tool: cargo-tarpaulin or cargo-llvm-cov
- Upload to: codecov.io or coveralls.io
- Fail if coverage < 75%
3. **Tree-sitter Job**
- Setup: Node.js 18+
- Run: `cd tree-sitter-storybook && npm test`
4. **Benchmark Job**
- Run: `cargo bench --bench lsp_benchmarks`
- Upload results for regression tracking
**Triggers:**
- On push to main
- On pull requests
- Nightly (for performance tracking)
#### 4.1.2 Pre-commit Hooks
**File:** Update `.github/workflows/pre-commit.yml` or `lefthook.yml`
**Estimated Time:** 1 hour
**Hooks:**
- `cargo test --lib lsp` (fast tests only)
- `cargo clippy` (linting)
- `cargo fmt --check` (formatting)
### 4.2 Performance Benchmarking
#### 4.2.1 Benchmark Suite
**File:** Create `storybook/benches/lsp_benchmarks.rs`
**Estimated Time:** 6 hours
**Benchmarks:**
1. **Parse Benchmarks** (4 benchmarks)
- Small file (100 lines)
- Medium file (1,000 lines)
- Large file (10,000 lines)
- Very large file (50,000 lines)
2. **Symbol Extraction** (3 benchmarks)
- 10 symbols
- 100 symbols
- 1,000 symbols
3. **Completion** (3 benchmarks)
- Field completion (10 options)
- Template completion (100 options)
- Completion in large file
4. **Navigation** (3 benchmarks)
- Go-to-definition in small file
- Go-to-definition in large file
- Find references (100 occurrences)
5. **Workspace** (2 benchmarks)
- Workspace rebuild (10 files)
- Workspace rebuild (100 files)
**Tool:** Use `criterion.rs` for statistical analysis
**Baselines:**
- Parse: < 10ms per 1,000 lines
- Symbol extraction: < 5ms per 100 symbols
- Completion: < 20ms latency
- Navigation: < 10ms per operation
- Workspace rebuild: < 100ms per 10 files
#### 4.2.2 Memory Profiling
**Estimated Time:** 3 hours
**Profiling Scenarios:**
1. Memory usage with 100 open documents
2. Memory usage with 1,000+ symbols
3. Memory leak detection (long-running session)
**Tools:**
- `valgrind` (Linux)
- `instruments` (macOS)
- `heaptrack` (cross-platform)
### Phase 4 Deliverables
- ✅ CI/CD pipeline operational
- ✅ Code coverage reporting automated
- ✅ Benchmark suite established
- ✅ Performance baselines documented
- ✅ Memory profiling completed
---
## Phase 5: Multi-File Support (Days 16-30)
### Objective
Implement and test cross-file navigation and workspace features.
### 5.1 Architecture Implementation
#### 5.1.1 Workspace NameTable Integration
**File:** `storybook/src/lsp/server.rs`
**Estimated Time:** 8 hours
**Changes:**
1. Populate `WorkspaceState.name_table` in `rebuild()`
2. Use file indices from NameTable
3. Store symbol locations with file indices
4. Expose workspace-level symbol lookup
**Testing:**
- Unit tests for NameTable population
- Verify symbol file indices correct
- Test incremental updates
#### 5.1.2 Cross-File Go-to-Definition
**File:** `storybook/src/lsp/definition.rs`
**Estimated Time:** 6 hours
**Changes:**
1. Check local document symbols first (fast path)
2. Fall back to workspace NameTable
3. Resolve file URL from file index
4. Return Location with correct file URL
**Testing:**
- Go to character in another file
- Go to template in another file
- Go to behavior in another file
- Handle missing symbols gracefully
#### 5.1.3 Cross-File Find References
**File:** `storybook/src/lsp/references.rs`
**Estimated Time:** 6 hours
**Changes:**
1. Search all open documents (not just current)
2. Use workspace NameTable for symbol lookup
3. Aggregate results from multiple files
4. Return Locations with file URLs
**Testing:**
- Find character references across files
- Find template uses across files
- Find behavior calls across files
- Performance with 100+ open files
#### 5.1.4 Use Declaration Resolution
**File:** Create `storybook/src/lsp/imports.rs`
**Estimated Time:** 8 hours
**Changes:**
1. Parse `use` declarations
2. Resolve module paths to file URLs
3. Populate symbol table from imports
4. Handle grouped imports (`use foo::{bar, baz}`)
5. Handle wildcard imports (`use foo::*`)
**Testing:**
- Simple use declaration
- Grouped imports
- Wildcard imports
- Nested module paths
- Missing import targets
### 5.2 Multi-File Test Suite
#### 5.2.1 Cross-File Navigation Tests
**File:** Create `storybook/src/lsp/cross_file_tests.rs`
**Estimated Time:** 6 hours
**Target:** 20 tests
**Test Categories:**
1. **Go-to-Definition** (5 tests)
- Navigate to character in other file
- Navigate to template in other file
- Navigate to behavior in other file
- Navigate with nested modules
- Navigate with use declarations
2. **Find References** (5 tests)
- Find character uses across files
- Find template includes across files
- Find behavior calls across files
- Find species references across files
- Performance with 50+ files
3. **Completion** (5 tests)
- Complete imported symbols
- Complete from wildcard imports
- Complete nested module paths
- Complete with use declarations
- Don't show non-imported symbols
4. **Workspace Management** (5 tests)
- Add file updates workspace
- Remove file updates workspace
- Modify file updates workspace
- Rename file updates workspace
- Large workspace (100+ files)
**Coverage Target:** 85% of cross-file features
#### 5.2.2 Import Resolution Tests
**File:** Create `storybook/src/lsp/import_tests.rs`
**Estimated Time:** 4 hours
**Target:** 15 tests
**Test Categories:**
1. **Simple Imports** (3 tests)
- `use characters::Alice;`
- `use templates::Child;`
- `use behaviors::Walk;`
2. **Grouped Imports** (3 tests)
- `use characters::{Alice, Bob};`
- `use templates::{Child, Adult};`
- Mixed types in group
3. **Wildcard Imports** (3 tests)
- `use characters::*;`
- Multiple wildcards from different modules
- Wildcard precedence
4. **Nested Modules** (3 tests)
- `use world::characters::Alice;`
- `use world::locations::wonderland::Garden;`
- Deep nesting (5+ levels)
5. **Edge Cases** (3 tests)
- Import non-existent symbol
- Circular imports
- Import from self
**Coverage Target:** 90% of import resolution
### Phase 5 Deliverables
- ✅ Cross-file navigation implemented
- ✅ Use declaration resolution working
- ✅ Workspace NameTable populated
- ✅ 35 new multi-file tests
- ✅ Overall coverage > 85%
---
## Test Execution Strategy
### Daily Test Runs
```bash
# Quick sanity check (< 5 seconds)
cargo test --lib lsp -- --test-threads=1 --nocapture
# Full test suite (< 2 minutes)
cargo test --lib lsp
# With coverage (< 5 minutes)
cargo tarpaulin --lib --out Html --output-dir coverage
# Tree-sitter tests (< 10 seconds)
cd tree-sitter-storybook && npm test
```
### Weekly Test Runs
```bash
# Performance benchmarks (~ 10 minutes)
cargo bench --bench lsp_benchmarks
# Memory profiling (~ 15 minutes)
./scripts/memory_profile.sh
# Stress tests (~ 20 minutes)
cargo test --lib lsp --release -- stress_tests
```
### Pre-Release Test Runs
```bash
# Full suite with coverage
cargo tarpaulin --lib --out Html --output-dir coverage
# Performance regression check
cargo bench --bench lsp_benchmarks -- --save-baseline main
# Integration tests
cargo test --test '*'
# E2E tests (manual)
# 1. Build Zed extension
# 2. Test in Zed editor
# 3. Validate all LSP features work
```
---
## Coverage Measurement
### Tools
1. **cargo-tarpaulin** - Code coverage for Rust
```bash
cargo install cargo-tarpaulin
cargo tarpaulin --lib --out Html --output-dir coverage
```
2. **cargo-llvm-cov** - Alternative coverage tool
```bash
cargo install cargo-llvm-cov
cargo llvm-cov --html --lib
```
### Coverage Targets by Phase
| Phase | Target | Focus |
|-------|--------|-------|
| Phase 1 | 60% | Existing tests |
| Phase 2 | 80% | Feature coverage |
| Phase 3 | 82% | Integration |
| Phase 4 | 83% | Automation |
| Phase 5 | 85% | Multi-file |
### Coverage Exemptions
- Generated code (tree-sitter bindings)
- Test utilities and fixtures
- Deprecated code paths
- Unreachable error handling (panic paths)
---
## Risk Management
### High-Risk Areas
1. **Concurrency Bugs**
- **Risk:** Deadlocks, race conditions in RwLock usage
- **Mitigation:** Dedicated concurrency test suite, stress testing
- **Detection:** Thread sanitizer, long-running tests
2. **Performance Regressions**
- **Risk:** Features slow down with large files/workspaces
- **Mitigation:** Benchmark suite, performance tracking in CI
- **Detection:** Criterion benchmarks, regression alerts
3. **Memory Leaks**
- **Risk:** Documents not cleaned up, symbol table grows unbounded
- **Mitigation:** Memory profiling, leak detection tools
- **Detection:** Valgrind, long-running session tests
4. **Cross-File State Corruption**
- **Risk:** NameTable inconsistencies, stale file references
- **Mitigation:** Workspace state validation tests
- **Detection:** Integration tests, state invariant checks
### Medium-Risk Areas
1. **Unicode Handling**
- **Risk:** Position calculations off by one with multi-byte chars
- **Mitigation:** Comprehensive unicode test suite
- **Detection:** Unicode-heavy test files
2. **Error Recovery**
- **Risk:** Server crashes on malformed input
- **Mitigation:** Fuzz testing, malformed input tests
- **Detection:** Error recovery test suite
3. **Zed Integration**
- **Risk:** LSP features not working in actual editor
- **Mitigation:** E2E testing in Zed
- **Detection:** Manual testing, user feedback
---
## Test Maintenance
### Test Naming Convention
```rust
// Pattern: test_<feature>_<scenario>_<expected_result>
#[test]
fn test_goto_definition_character_in_same_file() { ... }
#[test]
fn test_completion_field_after_colon() { ... }
#[test]
fn test_diagnostics_parse_error_missing_brace() { ... }
```
### Test Organization
```
src/lsp/
├── *_tests.rs # Feature-specific unit tests
├── integration_tests.rs # Multi-feature integration
├── stress_tests.rs # Performance and scale
└── cross_file_tests.rs # Multi-file scenarios
```
### Test Documentation
- Each test file has module-level doc comment explaining scope
- Each test has doc comment explaining scenario
- Complex tests have inline comments for key assertions
### Test Refactoring Guidelines
- Extract common test fixtures to `test_utils.rs`
- Use builder pattern for complex test data
- Keep tests independent (no shared mutable state)
- Aim for tests < 50 lines each
---
## Appendix A: Test Counting Summary
### Current Tests (Phase 1)
- behavior_tests.rs: 7
- code_actions_tests.rs: 27
- completion_tests.rs: 10
- diagnostics_tests.rs: 20
- document_edge_tests.rs: 17
- navigation_tests.rs: 11
- validation_tests.rs: 10
- Integration tests: ~45
- **Total: ~147 tests**
### New Tests by Phase
**Phase 2 (+57 tests):**
- hover_tests.rs: 15
- formatting_tests.rs: 15
- rename_tests.rs: 12
- semantic_tokens_tests.rs: 15
**Phase 3 (+33 tests):**
- integration_tests.rs: 25
- concurrency_tests.rs: 8
**Phase 4 (+15 benchmarks):**
- lsp_benchmarks.rs: 15 benchmarks
**Phase 5 (+35 tests):**
- cross_file_tests.rs: 20
- import_tests.rs: 15
**Grand Total: ~287 tests + 15 benchmarks**
---
## Appendix B: Test Commands Reference
```bash
# === LSP Tests ===
# Run all LSP tests
cargo test --lib lsp
# Run specific test file
cargo test --lib lsp::hover_tests
# Run single test
cargo test --lib lsp::hover_tests::test_hover_on_character
# Run tests with output
cargo test --lib lsp -- --nocapture
# Run tests in single thread (for debugging)
cargo test --lib lsp -- --test-threads=1
# === Tree-sitter Tests ===
# Run all tree-sitter tests
cd tree-sitter-storybook && npm test
# Run with verbose output
cd tree-sitter-storybook && npm test -- --debug
# === Coverage ===
# Generate HTML coverage report
cargo tarpaulin --lib --out Html --output-dir coverage
# Coverage with specific minimum threshold
cargo tarpaulin --lib --fail-under 80
# === Benchmarks ===
# Run all benchmarks
cargo bench --bench lsp_benchmarks
# Run specific benchmark
cargo bench --bench lsp_benchmarks -- parse
# Save baseline
cargo bench --bench lsp_benchmarks -- --save-baseline main
# Compare to baseline
cargo bench --bench lsp_benchmarks -- --baseline main
# === Memory Profiling ===
# Linux (valgrind)
valgrind --leak-check=full --show-leak-kinds=all \
cargo test --lib lsp
# macOS (instruments)
instruments -t Leaks cargo test --lib lsp
# === Linting ===
# Run clippy
cargo clippy --lib
# Run clippy with strict rules
cargo clippy --lib -- -D warnings
# Format check
cargo fmt --check
# Auto-format
cargo fmt
```
---
## Appendix C: Coverage Report Template
```markdown
# LSP Test Coverage Report
**Date:** YYYY-MM-DD
**Commit:** <git sha>
## Summary
- **Overall Coverage:** XX%
- **Tests Run:** XXX
- **Tests Passed:** XXX
- **Tests Failed:** X
- **Duration:** XX seconds
## Coverage by Module
| Module | Coverage | Lines Covered | Total Lines |
|--------|----------|---------------|-------------|
| server.rs | XX% | XXX / XXX | XXX |
| hover.rs | XX% | XXX / XXX | XXX |
| completion.rs | XX% | XXX / XXX | XXX |
| definition.rs | XX% | XXX / XXX | XXX |
| references.rs | XX% | XXX / XXX | XXX |
| symbols.rs | XX% | XXX / XXX | XXX |
| diagnostics.rs | XX% | XXX / XXX | XXX |
| formatting.rs | XX% | XXX / XXX | XXX |
| rename.rs | XX% | XXX / XXX | XXX |
| code_actions.rs | XX% | XXX / XXX | XXX |
| semantic_tokens.rs | XX% | XXX / XXX | XXX |
| inlay_hints.rs | XX% | XXX / XXX | XXX |
## Uncovered Lines
- server.rs: lines XXX-XXX (error handling)
- completion.rs: line XXX (unreachable branch)
## Recommendations
- [ ] Add tests for uncovered error paths
- [ ] Increase coverage in completion.rs
- [ ] ...
```
---
## Conclusion
This testing strategy provides a **clear roadmap** from the current broken state (compilation errors) to a fully tested, production-ready LSP implementation with 85% coverage. The phased approach allows for **incremental progress** while maintaining **immediate value** at each phase:
- **Phase 1** - Unblocks development
- **Phase 2** - Achieves stability
- **Phase 3** - Validates integration
- **Phase 4** - Enables automation
- **Phase 5** - Adds advanced features
By following this strategy, the Storybook LSP will become **robust, maintainable, and reliable** for end users.