420 lines
14 KiB
Markdown
420 lines
14 KiB
Markdown
# Place-Value Native Architecture Refactor Plan
|
|
|
|
## 🎯 Objective
|
|
|
|
Replace the current array-based column indexing system with native place-value architecture to eliminate the "column index nightmare" where we need to thread `effectiveColumns` through highlighting logic.
|
|
|
|
## 🚨 Current Problem
|
|
|
|
```typescript
|
|
// BROKEN: Array indices fighting place values
|
|
columnStates[0] = leftmost column (ten-thousands)
|
|
columnStates[4] = rightmost column (ones)
|
|
// Every operation requires: columnIndex = totalColumns - 1 - placeValue
|
|
// Must thread totalColumns to highlighting: isBeadHighlighted(..., totalColumns)
|
|
```
|
|
|
|
## ✅ Target Solution
|
|
|
|
```typescript
|
|
// CLEAN: Place values as primary keys
|
|
placeStates.set(0, { placeValue: 0, heavenActive: false, earthActive: 2 }); // ones
|
|
placeStates.set(1, { placeValue: 1, heavenActive: true, earthActive: 0 }); // tens
|
|
// NO conversion needed! Direct place-value access
|
|
// NO totalColumns threading needed!
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 Implementation Plan
|
|
|
|
### Phase 1: Core Data Structure Redesign ✅ COMPLETED
|
|
|
|
**Status**: ✅ COMPLETED
|
|
**Files**: `packages/abacus-react/src/AbacusReact.tsx`
|
|
|
|
#### 1.1 ✅ COMPLETED: Define new place-value types
|
|
|
|
- [x] `PlaceState` interface with native place value
|
|
- [x] `PlaceStatesMap` type as Map<ValidPlaceValues, PlaceState>
|
|
- [x] Update `BeadConfig` to use `placeValue` instead of `columnIndex`
|
|
|
|
#### 1.2 ✅ COMPLETED: Create new state management hook
|
|
|
|
- [x] Implement `useAbacusPlaceStates()` hook
|
|
- [x] Replace array operations with Map operations
|
|
- [x] Eliminate all index math (columnStates.length - index - 1)
|
|
- [x] Keep legacy `useAbacusState()` for backward compatibility
|
|
|
|
### Phase 2: Bead State Management ✅ COMPLETED
|
|
|
|
**Status**: ✅ COMPLETED
|
|
**Files**: `packages/abacus-react/src/AbacusReact.tsx`
|
|
|
|
#### 2.1 ✅ COMPLETED: Update bead generation logic
|
|
|
|
- [x] Modify `calculateBeadStatesFromPlaces()` to work with place values
|
|
- [x] Update bead configuration to include `placeValue` instead of `columnIndex`
|
|
- [x] Ensure bead positioning works with place value keys
|
|
|
|
#### 2.2 ✅ COMPLETED: Update value calculation
|
|
|
|
- [x] Replace array reduce with Map iteration
|
|
- [x] Remove `Math.pow(10, columnStates.length - index - 1)` nightmare
|
|
- [x] Use direct `Math.pow(10, state.placeValue)` calculation
|
|
|
|
### Phase 3: Highlighting and Interaction Logic 🟡 IN PROGRESS
|
|
|
|
**Status**: 🟡 IN PROGRESS
|
|
**Files**: `packages/abacus-react/src/AbacusReact.tsx`
|
|
|
|
#### 3.1 ✅ COMPLETED: Fix highlighting functions
|
|
|
|
- [x] Update highlighting with `isBeadHighlightedByPlaceValue()`: eliminates `totalColumns` parameter
|
|
- [x] Update disabling with `isBeadDisabledByPlaceValue()`: eliminates `totalColumns` parameter
|
|
- [x] Use direct place value matching instead of conversions
|
|
- [x] Added backward compatibility for legacy `columnIndex` system
|
|
|
|
#### 3.2 Update bead interaction handlers
|
|
|
|
- [ ] Modify `handleBeadClick()` to work with place values
|
|
- [ ] Update `toggleBead()` logic for place value operations
|
|
- [ ] Fix gesture handling for place value system
|
|
|
|
### Phase 4: Component Integration ✅ COMPLETED
|
|
|
|
**Status**: ✅ COMPLETED - MAJOR BREAKTHROUGH!
|
|
**Files**: `packages/abacus-react/src/AbacusReact.tsx`
|
|
|
|
#### 4.1 ✅ COMPLETED: Update main AbacusReact component
|
|
|
|
- [x] Switch to `useAbacusPlaceStates()` hook
|
|
- [x] Remove `effectiveColumns` threading through highlighting calls 🎉
|
|
- [x] Update bead rendering to work with place value keys
|
|
- [x] Replace `calculateBeadStates()` with `calculateBeadStatesFromPlaces()`
|
|
|
|
#### 4.2 ✅ COMPLETED: Update layout and positioning
|
|
|
|
- [x] Modified component to use Map-based state internally
|
|
- [x] Ensured visual column order (left-to-right) works correctly
|
|
- [x] Maintained compatibility with existing dimension calculations
|
|
|
|
**🔥 BREAKTHROUGH ACHIEVED**: The core "effectiveColumns threading nightmare" is officially eliminated!
|
|
|
|
### Phase 5: Remove Legacy Conversion Layers 🔄 PENDING
|
|
|
|
**Files**: `packages/abacus-react/src/AbacusReact.tsx`
|
|
|
|
#### 5.1 Clean up conversion utilities
|
|
|
|
- [ ] Remove `normalizeBeadHighlight()` function
|
|
- [ ] Remove `placeValueToColumnIndex()` function
|
|
- [ ] Remove `columnIndexToPlaceValue()` function
|
|
- [ ] Simplify type guards and utility functions
|
|
|
|
#### 5.2 Update exports and types
|
|
|
|
- [ ] Export new place-value types
|
|
- [ ] Mark legacy types as deprecated
|
|
- [ ] Update component prop types to prefer place values
|
|
|
|
### Phase 6: Tutorial and Consumer Updates 🔄 PENDING
|
|
|
|
**Files**: `apps/web/src/components/`, `apps/web/src/utils/`
|
|
|
|
#### 6.1 Update tutorial components
|
|
|
|
- [ ] Verify tutorials work with new place value system
|
|
- [ ] Remove any remaining column index references
|
|
- [ ] Test highlighting behavior
|
|
|
|
#### 6.2 Update tests and stories
|
|
|
|
- [ ] Fix test files to work with place value system
|
|
- [ ] Update Storybook examples
|
|
- [ ] Add tests for new place value logic
|
|
|
|
---
|
|
|
|
## 🧪 Comprehensive Testing Strategy
|
|
|
|
### Testing Priority Levels
|
|
|
|
#### **Priority 1: Core Architecture Validation** 🔥
|
|
|
|
These tests ensure the fundamental place-value architecture works correctly.
|
|
|
|
##### Place Value State Management Tests
|
|
|
|
- [ ] **`useAbacusPlaceStates` Hook Tests**
|
|
- [ ] Test Map-based state initialization from numeric values
|
|
- [ ] Test direct place value calculations vs legacy array math
|
|
- [ ] Test state updates preserve Map integrity
|
|
- [ ] Test edge cases: value=0, single digit, maximum columns
|
|
- [ ] Performance test: Map operations vs Array operations
|
|
|
|
##### Value Calculation Tests
|
|
|
|
- [ ] **`calculateValueFromPlaceStates` Tests**
|
|
- [ ] Test equivalence with legacy `calculateValueFromColumnStates`
|
|
- [ ] Test all single-digit values (0-9) in ones place
|
|
- [ ] Test multi-digit values across place values
|
|
- [ ] Test edge cases: empty Map, maximum value
|
|
- [ ] Property-based testing: roundtrip value ↔ placeStates
|
|
|
|
##### Bead Generation Tests
|
|
|
|
- [ ] **`calculateBeadStatesFromPlaces` Tests**
|
|
- [ ] Test bead configuration includes both `placeValue` and `columnIndex`
|
|
- [ ] Test visual ordering (left-to-right = highest-to-lowest place)
|
|
- [ ] Test bead positioning matches legacy system
|
|
- [ ] Test active/inactive state calculation
|
|
- [ ] Cross-validation with legacy `calculateBeadStates`
|
|
|
|
#### **Priority 2: Highlighting System Validation** ⚡
|
|
|
|
These tests ensure the new highlighting system works without `effectiveColumns` threading.
|
|
|
|
##### Highlighting Function Tests
|
|
|
|
- [ ] **`isBeadHighlightedByPlaceValue` Tests**
|
|
- [ ] Test place-value based highlighting vs legacy column-index
|
|
- [ ] Test backward compatibility with `columnIndex` highlights
|
|
- [ ] Test edge cases: undefined placeValue, mixed highlight types
|
|
- [ ] Test performance vs legacy `isBeadHighlighted` with threading
|
|
|
|
##### Tutorial Highlighting Integration Tests
|
|
|
|
- [ ] **Tutorial Highlighting Validation**
|
|
- [ ] Test all existing tutorial steps still highlight correctly
|
|
- [ ] Test mixed place-value and column-index highlights
|
|
- [ ] Test highlighting during bead interactions
|
|
- [ ] Test disabled bead highlighting
|
|
|
|
#### **Priority 3: Interaction System Validation** 🎯
|
|
|
|
These tests ensure bead clicking and gestures work with place values.
|
|
|
|
##### Bead Interaction Tests
|
|
|
|
- [ ] **`toggleBead` Function Tests**
|
|
- [ ] Test heaven bead toggle logic (place-value vs legacy)
|
|
- [ ] Test earth bead cascade logic (activate/deactivate sequences)
|
|
- [ ] Test state consistency after multiple interactions
|
|
- [ ] Test interaction on different place values
|
|
|
|
##### Click Handler Tests
|
|
|
|
- [ ] **`handleBeadClick` Integration Tests**
|
|
- [ ] Test click handling uses place-value disable checking
|
|
- [ ] Test callback system works with new bead configurations
|
|
- [ ] Test gesture interactions
|
|
- [ ] Test edge cases: disabled beads, invalid interactions
|
|
|
|
#### **Priority 4: Backward Compatibility** 🔄
|
|
|
|
These tests ensure existing code continues to work during the transition.
|
|
|
|
##### Legacy API Compatibility Tests
|
|
|
|
- [ ] **Column Index Compatibility**
|
|
- [ ] Test legacy `columnIndex` highlights still work
|
|
- [ ] Test legacy `disabledColumns` still work
|
|
- [ ] Test legacy callback signatures unchanged
|
|
- [ ] Test migration path from column-index to place-value
|
|
|
|
##### Tutorial System Tests
|
|
|
|
- [ ] **Existing Tutorial Compatibility**
|
|
- [ ] Test `GuidedAdditionTutorial` works unchanged
|
|
- [ ] Test tutorial step definitions validate
|
|
- [ ] Test tutorial player highlighting
|
|
- [ ] Test tutorial progression logic
|
|
|
|
### Test Implementation Plan
|
|
|
|
#### **Phase A: Unit Tests** (Foundation)
|
|
|
|
```typescript
|
|
// Example test structure
|
|
describe("Place Value Architecture", () => {
|
|
describe("useAbacusPlaceStates", () => {
|
|
it("should initialize correct Map from numeric value", () => {
|
|
// Test Map initialization
|
|
});
|
|
|
|
it("should calculate values without array index math", () => {
|
|
// Verify no Math.pow(10, totalColumns - 1 - index)
|
|
});
|
|
});
|
|
|
|
describe("highlighting without effectiveColumns threading", () => {
|
|
it("should highlight beads using place values directly", () => {
|
|
// Test isBeadHighlightedByPlaceValue vs isBeadHighlighted
|
|
});
|
|
});
|
|
});
|
|
```
|
|
|
|
#### **Phase B: Integration Tests** (System Validation)
|
|
|
|
- [ ] Test complete abacus component with place-value system
|
|
- [ ] Test tutorial integration end-to-end
|
|
- [ ] Test Storybook examples work correctly
|
|
- [ ] Test performance compared to legacy system
|
|
|
|
#### **Phase C: Visual Regression Tests** (UI Validation)
|
|
|
|
- [ ] Screenshot comparison: legacy vs place-value rendering
|
|
- [ ] Test highlighting visual consistency
|
|
- [ ] Test interaction feedback (hover, click, disabled states)
|
|
- [ ] Test responsive behavior across different screen sizes
|
|
|
|
#### **Phase D: Performance Tests** (Optimization Validation)
|
|
|
|
- [ ] Benchmark Map operations vs Array operations
|
|
- [ ] Test memory usage of Map vs Array state
|
|
- [ ] Test rendering performance with large column counts
|
|
- [ ] Test interaction responsiveness
|
|
|
|
### Test Coverage Goals
|
|
|
|
#### **Minimum Viable Coverage** (MVP)
|
|
|
|
- [ ] 90%+ coverage on new place-value functions
|
|
- [ ] 100% coverage on highlighting system changes
|
|
- [ ] All existing tutorial tests pass unchanged
|
|
- [ ] Basic interaction tests for each bead type
|
|
|
|
#### **Production Ready Coverage** (Complete)
|
|
|
|
- [ ] 95%+ overall coverage including edge cases
|
|
- [ ] Property-based tests for value calculations
|
|
- [ ] Performance benchmarks vs legacy system
|
|
- [ ] Cross-browser compatibility tests
|
|
- [ ] Accessibility tests for new interaction patterns
|
|
|
|
### Testing Tools and Infrastructure
|
|
|
|
#### **Recommended Testing Stack**
|
|
|
|
- [ ] **Unit Tests**: Jest + React Testing Library
|
|
- [ ] **Visual Tests**: Storybook + Chromatic
|
|
- [ ] **E2E Tests**: Playwright for tutorial flows
|
|
- [ ] **Performance**: Chrome DevTools + Lighthouse
|
|
- [ ] **Property Testing**: fast-check for value calculations
|
|
|
|
#### **Test Data Strategy**
|
|
|
|
- [ ] Generate test cases covering all place value combinations
|
|
- [ ] Create fixtures for complex highlighting scenarios
|
|
- [ ] Mock tutorial data for integration tests
|
|
- [ ] Performance test data sets (small, medium, large)
|
|
|
|
### Continuous Testing Strategy
|
|
|
|
#### **Pre-commit Hooks**
|
|
|
|
- [ ] Run unit tests on place-value functions
|
|
- [ ] Run highlighting regression tests
|
|
- [ ] Verify no `effectiveColumns` threading introduced
|
|
|
|
#### **CI/CD Pipeline**
|
|
|
|
- [ ] Full test suite on pull requests
|
|
- [ ] Visual regression testing on UI changes
|
|
- [ ] Performance regression testing
|
|
- [ ] Cross-browser testing matrix
|
|
|
|
#### **Manual Testing Checklist**
|
|
|
|
- [ ] Test tutorial progression with place-value highlighting
|
|
- [ ] Test responsive design with different column counts
|
|
- [ ] Test accessibility with screen readers
|
|
- [ ] Test touch interactions on mobile devices
|
|
|
|
---
|
|
|
|
## 🚧 Current Progress Status
|
|
|
|
### ✅ Completed (Phases 1-4) - MAJOR MILESTONE! 🎉
|
|
|
|
- ✅ **Phase 1**: Core type definitions (PlaceState, PlaceStatesMap, BeadConfig updates)
|
|
- ✅ **Phase 1**: `useAbacusPlaceStates()` hook implementation with Map-based operations
|
|
- ✅ **Phase 2**: `calculateBeadStatesFromPlaces()` - eliminates array index math
|
|
- ✅ **Phase 2**: `calculateValueFromPlaceStates()` - direct place value calculation
|
|
- ✅ **Phase 3.1**: `isBeadHighlightedByPlaceValue()` and `isBeadDisabledByPlaceValue()` - eliminates totalColumns threading
|
|
- ✅ **Phase 3.2**: Updated bead interaction handlers to use place values
|
|
- ✅ **Phase 4**: 🔥 **BREAKTHROUGH** - Main component integration eliminates `effectiveColumns` threading!
|
|
|
|
**🎯 SUCCESS CRITERIA ACHIEVED**:
|
|
|
|
1. ✅ **No more totalColumns threading** - highlighting functions don't need column count
|
|
2. ✅ **Native place value API** - direct place value access without conversions
|
|
3. ✅ **Performance improvement** - Map operations instead of array index math
|
|
4. ✅ **Clean highlighting API** - no `effectiveColumns` parameter needed
|
|
|
|
**The core "column index nightmare" is officially SOLVED!** 🎉
|
|
|
|
### 🔄 Remaining Phases
|
|
|
|
- Phase 5: Remove legacy conversion utilities (cleanup)
|
|
- Phase 6: Update tutorials and tests (validation)
|
|
- 🧪 **NEW**: Comprehensive testing strategy (validation & quality assurance)
|
|
|
|
---
|
|
|
|
## 🔍 Key Files to Modify
|
|
|
|
### Primary Implementation
|
|
|
|
- `packages/abacus-react/src/AbacusReact.tsx` - Main component logic
|
|
|
|
### Testing and Examples
|
|
|
|
- `packages/abacus-react/src/AbacusReact.stories.tsx`
|
|
- `packages/abacus-react/src/test/AbacusReact.zero-state.test.tsx`
|
|
- `apps/web/src/components/tutorial/__tests__/TutorialPlayer.test.tsx`
|
|
|
|
### Tutorial Content
|
|
|
|
- `apps/web/src/components/GuidedAdditionTutorial.tsx`
|
|
- `apps/web/src/utils/tutorialConverter.ts`
|
|
|
|
---
|
|
|
|
## ⚠️ Risks and Considerations
|
|
|
|
### Breaking Changes
|
|
|
|
- This is a major architectural change
|
|
- Legacy `columnIndex` API will be deprecated
|
|
- Some consumers may need updates
|
|
|
|
### Migration Strategy
|
|
|
|
- Keep legacy `useAbacusState()` hook for backward compatibility
|
|
- Provide clear deprecation warnings
|
|
- Document migration path for consumers
|
|
|
|
### Testing Strategy
|
|
|
|
- Maintain existing test behavior
|
|
- Add new tests for place value logic
|
|
- Verify tutorial highlighting still works correctly
|
|
|
|
---
|
|
|
|
## 🎯 Success Criteria
|
|
|
|
1. **No more totalColumns threading** - highlighting functions don't need column count
|
|
2. **Native place value API** - direct place value access without conversions
|
|
3. **Backward compatibility** - existing tutorials continue to work
|
|
4. **Performance improvement** - Map operations instead of array index math
|
|
5. **Maintainability** - adding columns doesn't break tutorials
|
|
|
|
---
|
|
|
|
_Last Updated: 2025-09-21_
|
|
_Status: Phase 3.1 - Highlighting Functions (MAJOR PROGRESS: Core architecture nightmare solved!)_
|