const assert = require('assert'); const fs = require('fs'); const path = require('path'); const root = path.resolve(__dirname, '..'); const canvasHtml = fs.readFileSync(path.join(root, 'frontend', 'canvas.html'), 'utf8'); assert( canvasHtml.includes('Build GDS'), 'Project Tree header should include a Build GDS button' ); assert( canvasHtml.includes('/api/build-gds'), 'Build GDS button should call the backend build-gds API' ); assert( canvasHtml.includes(':layout'), 'Build Layout should open an SVG preview tab named like canvas_1:layout' ); assert( canvasHtml.includes('svg_url'), 'Build Layout should use the backend svg_url response' ); assert( canvasHtml.includes('layoutPreview'), 'canvas pages should support a layoutPreview tab type' ); assert( canvasHtml.includes('LayoutSvgPreview'), 'layout preview tabs should use the auto-scaling SVG viewer' ); assert( canvasHtml.includes('layoutScale'), 'layout SVG preview should expose an editable scale value' ); assert( canvasHtml.includes('objectFit: \'contain\''), '100% layout preview scale should fit the full SVG within the screen' ); assert( canvasHtml.includes('className="build-gds-btn"'), 'Build GDS should use a dedicated polished button class' ); assert( canvasHtml.includes('buildGdsBusy'), 'Build GDS should expose an in-progress state to prevent duplicate requests' ); assert( canvasHtml.includes('Build GDS network error'), 'Build GDS fetch failures should produce a specific network diagnostic' ); assert( canvasHtml.includes('className="build-layout-btn"'), 'Build Layout should use the polished primary action class' ); assert( canvasHtml.includes('Route Editor'), 'Selecting an edge should expose a route editor' ); assert( canvasHtml.includes('selectedEdge'), 'canvas should track selected edges separately from selected nodes' ); assert( canvasHtml.includes('technologyManifest'), 'canvas should load the selected technology manifest' ); assert( canvasHtml.includes('standard_bend'), 'route editor should offer standard_bend as a routing type' ); assert( canvasHtml.includes('findSameFamilyRouteCrossing'), 'canvas should validate same-family route crossings' );