name: Multi-Scheme Testing on: push: branches: [ main, master, develop ] paths: - 'src/animation/**' - 'src/core/OwenAnimationContext.js' - 'examples/**' pull_request: branches: [ main, master ] paths: - 'src/animation/**' - 'src/core/OwenAnimationContext.js' - 'examples/**' schedule: # Run daily at 2 AM UTC - cron: '0 2 * * *' env: NODE_VERSION: '20.x' jobs: scheme-validation: name: Validate Naming Schemes runs-on: ubuntu-latest strategy: matrix: scheme: [legacy, artist, hierarchical, semantic] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Test ${{ matrix.scheme }} scheme run: | node -e " const { AnimationNameMapper } = require('./src/animation/AnimationNameMapper.js'); const mapper = new AnimationNameMapper(); console.log('Testing ${{ matrix.scheme }} scheme...'); // Test all animations in this scheme const animations = mapper.getAllAnimationsByScheme('${{ matrix.scheme }}'); console.log('Found', animations.length, 'animations'); // Test conversions let errors = 0; animations.forEach(anim => { try { const converted = mapper.convert(anim, '${{ matrix.scheme }}'); if (converted !== anim) { console.error('Conversion error:', anim, '->', converted); errors++; } } catch (e) { console.error('Error processing:', anim, e.message); errors++; } }); if (errors > 0) { console.error('Found', errors, 'errors in ${{ matrix.scheme }} scheme'); process.exit(1); } else { console.log('All ${{ matrix.scheme }} animations validated successfully'); } " conversion-matrix: name: Test Scheme Conversions runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Test all scheme conversions run: | node -e " const { AnimationNameMapper } = require('./src/animation/AnimationNameMapper.js'); const mapper = new AnimationNameMapper(); const schemes = ['legacy', 'artist', 'hierarchical', 'semantic']; const testAnimations = [ 'wait_idle_L', 'Owen_ReactAngry', 'owen.state.type.idle.loop', 'OwenSleepToWaitTransition' ]; console.log('Testing conversion matrix...'); let totalTests = 0; let passedTests = 0; testAnimations.forEach(anim => { schemes.forEach(fromScheme => { schemes.forEach(toScheme => { totalTests++; try { const result = mapper.convert(anim, toScheme); console.log('✓', anim, '->', result, '(' + fromScheme + ' to ' + toScheme + ')'); passedTests++; } catch (e) { console.log('✗', anim, 'failed conversion from', fromScheme, 'to', toScheme, ':', e.message); } }); }); }); console.log('Conversion matrix results:', passedTests + '/' + totalTests, 'passed'); if (passedTests < totalTests * 0.9) { console.error('Too many conversion failures'); process.exit(1); } " demo-validation: name: Validate Demo Functionality runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Install Playwright run: npx playwright install --with-deps chromium - name: Start demo server run: | cd examples/mock-demo python -m http.server 8080 & sleep 5 - name: Test demo functionality run: | npx playwright test --config=playwright.config.js - name: Upload test results uses: actions/upload-artifact@v4 if: always() with: name: demo-test-results path: | test-results/ playwright-report/ performance-benchmark: name: Performance Benchmarks runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Install dependencies run: npm ci - name: Run performance benchmarks run: | node -e " const { AnimationNameMapper } = require('./src/animation/AnimationNameMapper.js'); const mapper = new AnimationNameMapper(); console.log('Running performance benchmarks...'); // Benchmark conversion speed const testAnim = 'wait_idle_L'; const iterations = 10000; console.time('10k conversions'); for (let i = 0; i < iterations; i++) { mapper.convert(testAnim, 'semantic'); } console.timeEnd('10k conversions'); // Benchmark validation speed console.time('10k validations'); for (let i = 0; i < iterations; i++) { mapper.validateAnimationName(testAnim); } console.timeEnd('10k validations'); // Memory usage test const used = process.memoryUsage(); console.log('Memory usage:'); for (let key in used) { console.log(key + ':', Math.round(used[key] / 1024 / 1024 * 100) / 100, 'MB'); } " - name: Comment PR with benchmark results if: github.event_name == 'pull_request' uses: actions/github-script@v7 with: script: | const fs = require('fs'); // Read benchmark results (would need to be saved to file in previous step) const comment = ` ## 🏃‍♂️ Performance Benchmark Results Multi-scheme animation system performance test completed: - ✅ Conversion speed: 10k operations completed - ✅ Validation speed: 10k operations completed - ✅ Memory usage: Within acceptable limits Full results available in the workflow logs. `; github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: comment });