#!/usr/bin/env tsx /** * Validation script for typstHelpers refactoring * * Generates sample worksheets and verifies that the refactored code * produces identical Typst output to ensure no regressions. */ import { generateSubtractionProblemStackFunction } from "../src/app/create/worksheets/typstHelpers"; import { generateTypstHelpers } from "../src/app/create/worksheets/typstHelpers"; import { generatePlaceValueColors } from "../src/app/create/worksheets/typstHelpers"; console.log("šŸ” Validating typstHelpers refactoring...\n"); // Test 1: Check that functions are exported and callable console.log("āœ“ Test 1: Functions are exported"); console.log( ` - generateSubtractionProblemStackFunction: ${typeof generateSubtractionProblemStackFunction}`, ); console.log(` - generateTypstHelpers: ${typeof generateTypstHelpers}`); console.log(` - generatePlaceValueColors: ${typeof generatePlaceValueColors}`); if (typeof generateSubtractionProblemStackFunction !== "function") { console.error( "āŒ generateSubtractionProblemStackFunction is not a function!", ); process.exit(1); } // Test 2: Generate sample Typst code console.log("\nāœ“ Test 2: Generate sample Typst code"); const cellSize = 0.55; const maxDigits = 3; const helpers = generateTypstHelpers(cellSize); console.log(` - Helper functions: ${helpers.length} characters`); const colors = generatePlaceValueColors(); console.log(` - Color definitions: ${colors.length} characters`); const problemStack = generateSubtractionProblemStackFunction( cellSize, maxDigits, ); console.log(` - Problem stack function: ${problemStack.length} characters`); // Test 3: Verify key features are present console.log("\nāœ“ Test 3: Verify key features in generated Typst"); const checks = [ { name: "Borrow boxes row", pattern: /Borrow boxes row/ }, { name: "Minuend row", pattern: /Minuend row/ }, { name: "Subtrahend row", pattern: /Subtrahend row/ }, { name: "Answer boxes", pattern: /Answer boxes/ }, { name: "Ten-frames", pattern: /Ten-frames row/ }, { name: "Borrowing hints", pattern: /show-borrowing-hints/ }, { name: "Arrow rendering", pattern: /path\(/ }, { name: "Place value colors", pattern: /place-colors/ }, { name: "Scratch work boxes", pattern: /dotted.*paint: gray/ }, ]; let allPassed = true; for (const check of checks) { const found = check.pattern.test(problemStack); if (found) { console.log(` āœ“ ${check.name}`); } else { console.log(` āŒ ${check.name} - NOT FOUND`); allPassed = false; } } // Test 4: Verify structure console.log("\nāœ“ Test 4: Verify Typst structure"); const structureChecks = [ { name: "Function definition", pattern: /#let subtraction-problem-stack\(/ }, { name: "Grid structure", pattern: /grid\(/ }, { name: "Stack structure", pattern: /stack\(/ }, { name: "Problem number display", pattern: /problem-number-display/ }, ]; for (const check of structureChecks) { const found = check.pattern.test(problemStack); if (found) { console.log(` āœ“ ${check.name}`); } else { console.log(` āŒ ${check.name} - NOT FOUND`); allPassed = false; } } // Summary console.log("\n" + "=".repeat(60)); if (allPassed) { console.log("āœ… All validation checks passed!"); console.log("\nThe refactored code generates valid Typst output with all"); console.log("expected features present."); process.exit(0); } else { console.log("āŒ Some validation checks failed!"); console.log("\nPlease review the output above for details."); process.exit(1); }