This commit enhances the visual quality of the soroban abacus cards with two key improvements: 1. Dynamic Rod Bounds: - Rod (gray column indicator) now dynamically calculates its bounds based on actual bead positions - No longer extends past outermost beads, creating a cleaner, more professional appearance - Accounts for hide-inactive option to only span visible beads - Handles edge cases like zero with hidden beads (rod spans just reckoning bar area) 2. Improved Inactive Bead Spacing: - Increased inactive bead separation from 5pt to 8pt for better visual distinction - Active beads maintain original 1pt spacing (close to reckoning bar) - Creates clearer visual separation between active and inactive states Technical Changes: - Complete rewrite of rod positioning logic with dynamic bounds calculation - Pre-calculates all bead positions before drawing rod - Rod spans from outermost heaven bead to outermost earth bead - Maintains physical abacus logic while improving aesthetics Visual Impact: - Cleaner, more professional appearance - Better distinction between active/inactive beads - Rod perfectly fits within bead boundaries for each column - Consistent across all formats (PDF, SVG, web) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| references | ||
| README.md | ||
| __init__.py | ||
| conftest.py | ||
| test_config.py | ||
| test_generation.py | ||
| test_quiz_functionality.py | ||
| test_visual.py | ||
| test_web_generation.py | ||
README.md
Testing
This directory contains automated tests for the Soroban flashcard generator.
Test Structure
test_config.py- Configuration loading and parsing teststest_generation.py- Core generation logic teststest_visual.py- Visual regression tests using image comparisonconftest.py- Pytest fixtures and configurationreferences/- Reference images for visual regression tests
Running Tests
Quick Start
make pytest-fast # Run unit tests (fast)
make pytest-visual # Run visual regression tests
make pytest # Run all tests
make pytest-cov # Run with coverage report
Direct pytest usage
# All tests
python3 -m pytest tests/ -v
# Skip slow tests
python3 -m pytest tests/ -v -m "not slow"
# Visual tests only
python3 -m pytest tests/test_visual.py -v
# With coverage
python3 -m pytest tests/ -v --cov=src
Visual Testing
The visual tests generate flashcard images and compare them against reference images using perceptual hashing. This catches visual regressions while allowing for minor differences.
Updating References
When you make intentional visual changes, manually delete the old reference images in tests/references/ and run the visual tests. They will automatically create new reference images on first run.
How Visual Tests Work
- Generate test images (PNG format, small size for speed)
- Compare against reference images using
imagehashlibrary - Allow small differences (hash distance < 5) for anti-aliasing variations
- Fail if images differ significantly, indicating a regression
Test Philosophy
- Fast unit tests for logic and configuration
- Visual regression tests for output verification
- Integration tests marked as
@pytest.mark.slow - Meaningful failures with clear error messages
- Easy maintenance when the app evolves
Adding Tests
When adding features:
- Add unit tests in relevant
test_*.pyfile - Add visual tests if output changes
- Update references if visual changes are intentional
- Use appropriate markers (
@pytest.mark.slow, etc.)
CI Integration
Tests are designed to run in CI environments:
- Skip tests requiring typst if not installed
- Use smaller images and lower DPI for speed
- Store reference images in version control
- Clear pass/fail criteria