123456789export interface ProjectResult {10 name: string;11 totalTests: number;12 passed: number;13 skipped: number;14 flaky: number;15}1617export interface GateResult {18 projects: ProjectResult[];19}2021export const REQUIRED_BROWSER_PROJECTS = ["chrome-release", "firefox-release"] as const;222324252627export function validateGateResult(28 result: GateResult,29 requiredProjects: readonly string[] = REQUIRED_BROWSER_PROJECTS,30): string[] {31 const errors: string[] = [];3233 const totalTests = result.projects.reduce((sum, p) => sum + p.totalTests, 0);34 if (totalTests === 0) {35 errors.push("zero tests discovered across all projects");36 }3738 for (const name of requiredProjects) {39 const project = result.projects.find((p) => p.name === name);40 if (!project) {41 errors.push(`required project "${name}" is missing`);42 continue;43 }44 if (project.totalTests === 0) {45 errors.push(`project "${name}" has zero tests`);46 }47 if (project.skipped > 0) {48 errors.push(`project "${name}" has ${project.skipped} skipped test(s)`);49 }50 if (project.flaky > 0) {51 errors.push(`project "${name}" has ${project.flaky} flaky retry/retr(y)ies`);52 }53 }5455 return errors;56}