ruchy 4.1.2

A systems scripting language that transpiles to idiomatic Rust with extreme quality engineering
Documentation
# Sprint 8: Test Suite Modernization & Parser Unit Tests

**Status**: Planning
**Blockers**: Waiting for Sprint 7 mutation test completion
**Estimated Duration**: 3-4 weeks
**Priority**: P0 - Critical Quality Debt

---

## Executive Summary

Sprint 7 mutation testing revealed **0% catch rate** in parser module, exposing critical test coverage gaps. Sprint 8 will systematically add parser unit tests to achieve 80%+ mutation coverage.

---

## Root Cause Analysis (Toyota Way)

**Problem**: 0% mutation catch rate (43+ mutants, 0 caught)

**Five Whys**:
1. **Why 0% catch rate?** Parser has no unit tests
2. **Why no unit tests?** Only integration tests via transpiler/REPL
3. **Why only integration tests?** Parser development focused on features, not isolated testing
4. **Why no isolated testing?** No TDD discipline enforced during parser implementation
5. **Root Cause**: Technical debt accumulated from feature-first development without test-first discipline

**Solution**: Implement systematic parser unit testing with TDD discipline

---

## Sprint 8 Goals

### Primary Goal
**Achieve 80%+ mutation coverage** on parser module (industry standard)

### Success Criteria
- [ ] Add 200+ parser unit tests (doctests + integration)
- [ ] Mutation catch rate: 0% → 80%+
- [ ] All 43+ identified test gaps covered
- [ ] Zero SATD comments in test files
- [ ] 100% of new tests follow TDD protocol

---

## Sprint 8 Phases

### Phase 1: Critical Test Gaps (Week 1)
**Goal**: Address the 15 highest-priority test gaps identified in Sprint 7

**Test Gaps to Fix** (from mutation testing):
1. Range operator precedence (`try_range_operators`)
2. F-string parsing (`parse_literal_token`)
3. Turbofish generics (`parse_turbofish_generics`)
4. Assignment operators (`try_assignment_operators`)
5. URL import validation (`parse_url_import`)
6. Comprehension detection (`looks_like_comprehension`)
7. Character quote processing (`should_process_char_quote`)
8. Constructor patterns (`parse_constructor_pattern`)
9. Declaration keywords as keys (`declaration_token_to_key`)
10. Actor receive blocks (`parse_actor_receive_block`)
11. Module visibility (`parse_module_item`)
12. Use path parsing (`parse_use_path`)
13. Prefix operators (`is_prefix_operator`)
14. Dataframe syntax (`is_dataframe_legacy_syntax_token`)
15. Method call parsing (`parse_method_call`)

**Deliverables**:
- [ ] 15 new test files (one per gap)
- [ ] Property tests for each function
- [ ] Doctests for all public parser functions
- [ ] Mutation retest: verify 15 mutants now caught

**Estimated Effort**: 40 hours (8 hours/day × 5 days)

### Phase 2: Systematic Parser Coverage (Week 2)
**Goal**: Add comprehensive unit tests for all parser modules

**Modules to Test**:
- `mod.rs` - Core parser logic (86.72% line coverage, 0% mutation)
- `expressions.rs` - Expression parsing (59.48% line, needs unit tests)
- `collections.rs` - Collection literals (45.64% line, critical gaps)
- `utils.rs` - Parser utilities (70.28% line, edge cases missing)
- `operator_precedence.rs` - Precedence logic (64.37% line, 0% mutation)

**Test Strategy**:
1. **Doctests**: Every public function gets runnable example
2. **Unit Tests**: Edge cases, error conditions, boundary values
3. **Property Tests**: Invariants (e.g., `parse(unparse(x)) == x`)
4. **Fuzz Tests**: Random input stress testing

**Deliverables**:
- [ ] 100+ parser unit tests added
- [ ] All parser functions have doctests
- [ ] Property test suite (10,000+ iterations per function)
- [ ] Coverage: 45-70% → 85%+ line coverage

**Estimated Effort**: 60 hours (12 hours/day × 5 days)

### Phase 3: Integration Test Modernization (Week 3)
**Goal**: Fix 21+ disabled integration tests from Sprint 7

**Disabled Tests to Fix** (with `.NEEDS_REWRITE` files):
- REPL tests (7 files) - API refactoring issues
- Interpreter tests (4 files) - eval_binary_op now private
- Value migration tests (3 files) - Rc<str> updates
- Doctest updates (7+ files) - Current API examples

**Modernization Strategy**:
1. Read `.NEEDS_REWRITE` documentation
2. Update to current API (REPL, Interpreter, Value types)
3. Add missing test coverage revealed by mutations
4. Re-enable tests one by one
5. Verify all 450+ integration tests compile

**Deliverables**:
- [ ] All 21+ disabled tests fixed and re-enabled
- [ ] All 450+ integration tests compiling
- [ ] Integration test suite 100% healthy
- [ ] Pre-commit hooks enforcing test compilation

**Estimated Effort**: 50 hours (10 hours/day × 5 days)

### Phase 4: Mutation Coverage Validation (Week 4)
**Goal**: Verify 80%+ mutation coverage achieved

**Tasks**:
1. Re-run full parser mutation tests (cargo-mutants)
2. Analyze remaining test gaps
3. Add targeted tests for survived mutants
4. Document final mutation coverage metrics
5. Add mutation testing to CI/CD pipeline

**Deliverables**:
- [ ] Mutation coverage report (baseline vs final)
- [ ] Test gap remediation complete
- [ ] CI/CD mutation testing integration
- [ ] Sprint 8 completion summary

**Estimated Effort**: 30 hours (6 hours/day × 5 days)

---

## Test Development Protocol (Mandatory)

### TDD Discipline (EXTREME TDD)
**CRITICAL**: Sprint 8 uses **Extreme TDD** - test FIRST, then implementation fixes.

**Protocol**:
1. **RED**: Write failing test for identified mutation gap
2. **GREEN**: Verify test catches the mutation
3. **REFACTOR**: Improve test quality (readability, property tests)
4. **VERIFY**: Re-run mutation test to confirm catch

**Example** (Range operator precedence):
```rust
// STEP 1: RED - Write failing test
#[test]
fn test_range_operator_precedence() {
    let source = "1..5 + 2"; // Should parse as (1..5) + 2, not 1..(5+2)
    let result = parse(source);
    assert_eq!(result, /* expected AST */);
}

// STEP 2: GREEN - Verify mutation caught
// Run: cargo mutants --file src/frontend/parser/mod.rs -F try_range_operators
// Expected: CAUGHT (not MISSED)

// STEP 3: REFACTOR - Add property test
#[cfg(test)]
proptest! {
    #[test]
    fn test_range_precedence_never_panics(a: i32, b: i32, op in "[+\\-*/]") {
        let source = format!("{a}..{b} {op} 2");
        let _ = parse(&source); // Should not panic
    }
}
```

### Quality Standards (A+ Code)
- **Cyclomatic Complexity**: ≤10 per test function
- **Cognitive Complexity**: ≤10 per test function
- **SATD**: Zero TODO/FIXME comments
- **Coverage**: 100% for test gaps
- **PMAT TDG**: A- grade minimum

---

## Metrics & Tracking

### Baseline (Sprint 7 End)
- **Parser Unit Tests**: 0
- **Mutation Catch Rate**: 0% (0/43+ mutants)
- **Line Coverage**: 45-99% (misleading)
- **Disabled Integration Tests**: 21+
- **Test Gaps Identified**: 43+

### Target (Sprint 8 End)
- **Parser Unit Tests**: 200+
- **Mutation Catch Rate**: 80%+ (industry standard)
- **Line Coverage**: 85%+ (meaningful)
- **Disabled Integration Tests**: 0
- **Test Gaps Remaining**: <20% (acceptable for non-critical paths)

### Weekly Tracking
- **Week 1**: Critical gaps → 15/15 fixed, mutation rate 0% → 35%
- **Week 2**: Systematic coverage → 100+ tests added, mutation rate 35% → 60%
- **Week 3**: Integration tests → 21+ re-enabled, all tests compiling
- **Week 4**: Validation → mutation rate 60% → 80%+, CI/CD integrated

---

## Risk Mitigation

### Risk 1: Mutation Testing Takes Too Long
**Mitigation**: Use incremental mutation testing on changed files only
```bash
cargo mutants --file src/frontend/parser/mod.rs  # Test one file at a time
```

### Risk 2: Test Gaps Too Complex
**Mitigation**: Start with simplest gaps (precedence, match arms), defer complex ones
**Priority Order**: Deletions > Replacements > Complex logic

### Risk 3: API Instability
**Mitigation**: Fix integration tests early (Week 3) to catch API changes
**Protocol**: Test compilation before ANY API changes

### Risk 4: Scope Creep
**Mitigation**: Strict focus on parser module only, defer other modules to Sprint 9+
**Rule**: No new features, only test coverage

---

## Dependencies & Blockers

### Current Blockers
- ⏳ Sprint 7 mutation testing in progress (2.7% complete, ~10 hours remaining)
- ⏳ Final test gap count unknown (43+ identified so far)

### Prerequisites
- ✅ Mutation testing framework working (cargo-mutants v25.3.1)
- ✅ Test gaps documented (SPRINT_7_SUMMARY.md)
- ✅ Quality gates enforced (PMAT, pre-commit hooks)

---

## Success Indicators

### Sprint 8 Success = ALL of:
1. ✅ 80%+ mutation coverage on parser module
2. ✅ All 21+ disabled integration tests re-enabled
3. ✅ Zero SATD comments in test files
4. ✅ Mutation testing in CI/CD pipeline
5. ✅ All pre-commit hooks passing

### Sprint 8 Failure = ANY of:
1. ❌ Mutation coverage <60%
2. ❌ Integration tests still disabled
3. ❌ SATD comments in test code
4. ❌ Manual mutation testing only (no CI/CD)
5. ❌ Pre-commit hooks bypassed

---

## Lessons from Sprint 7 (Applied to Sprint 8)

### ✅ What Worked (Continue)
1. **Toyota Way root cause analysis** - Applied to test gap prioritization
2. **Systematic documentation** - Every test gap gets detailed explanation
3. **Empirical validation** - cargo-mutants over PMAT predictions
4. **Property testing** - Will be primary test strategy

### ⚠️ What Didn't Work (Avoid)
1. **Feature-first development** - Sprint 8 is TEST-first only
2. **Deferred test updates** - Fix tests atomically with code changes
3. **Line coverage metrics** - Focus on mutation coverage instead
4. **Integration-only testing** - Add unit tests for fast feedback

---

## Commit Strategy

**Sprint 8 Commit Pattern**:
```
[SPRINT8-TEST-XXX] Add parser unit tests for <function>

- Test gap: <mutation that survived>
- Added: <number> unit tests, <number> property tests
- Mutation coverage: <before>% → <after>%
- PMAT TDG: <grade>

Mutation retest: CAUGHT (was MISSED)
```

---

## Next Steps (Immediate)

1. **Wait for Sprint 7 completion** (~10 hours)
2. **Analyze final mutation results** (identify all test gaps)
3. **Prioritize test gaps** (complexity, impact, effort)
4. **Create Sprint 8 tickets** (one per test gap + integration test)
5. **Begin Phase 1** (critical test gaps)

---

**Last Updated**: 2025-10-05
**Status**: DRAFT - Pending Sprint 7 completion