const fs = require('fs'); const path = require('path'); const read = (...p) => fs.readFileSync(path.join(__dirname, '..', ...p), 'utf8'); const assert = (cond, msg) => { if (!cond) throw new Error(msg); }; const library = read('frontend', 'src', 'pages', 'Library.tsx'); const matcher = library.match(/const getMatchingPlatforms = [\s\S]*?\n \};/); assert(matcher, 'Library must define getMatchingPlatforms'); assert( matcher[0].includes('availablePlatformIds.includes(p.id)'), 'getMatchingPlatforms must match on the platform ids resolved by the backend' ); assert( !/\.includes\(\s*(name|p\.name)/.test(matcher[0]), 'getMatchingPlatforms must not substring-match platform names (X360 never matches "Xbox 360", "PC" matches "PC Engine")' ); assert( library.includes('getMatchingPlatforms(pendingGameToAdd.availablePlatformIds)'), 'platform picker must pass availablePlatformIds' ); const addGame = library.match(/const handleAddGame = [\s\S]*?\n \};/); assert(addGame, 'Library must define handleAddGame'); assert( !addGame[0].includes('addGameWithPlatform('), 'handleAddGame must always open the picker instead of silently adding as PC' ); assert(addGame[0].includes('setShowPlatformPicker(true)'), 'handleAddGame must open the platform picker'); assert(!/\breturn\b/.test(addGame[0]), 'handleAddGame must not skip the picker for any result'); const noMatch = library.match(/getMatchingPlatforms\(pendingGameToAdd\.availablePlatformIds\)\.length === 0 && \([\s\S]*?\n \)\}/); assert(noMatch, 'picker must still show a hint when nothing matches'); assert( !noMatch[0].includes('