import { ellipsis , fixEol } from '../utils/markdown-utils' ; import { TestRunResult } from '../test-results' ; import { getFirstNonEmptyLine } from '../utils/parse-utils' ; type Annotation = { path : string ; start_line : number ; end_line : number ; start_column ? : number ; end_column ? : number ; annotation_level : 'notice' | 'warning' | 'failure' ; message : string ; title ? : string ; raw_details ? : string ; } ; interface TestError { testRunPaths : string [ ] ; suiteName : string ; testName : string ; path : string ; line : number ; message : string ; details : string ; } export function getAnnotations ( results , maxCount ) { if ( maxCount === 0 ) { return [ ] ; } const errors = [ ] ; const mergeDup = results . length > 1 ; for ( const tr of results ) { for ( const ts of tr . suites ) { for ( const tg of ts . groups ) { for ( const tc of tg . tests ) { const err = tc . error ; if ( err === undefined ) { continue ; } const path = err . path ?? tr . path ; const line = err . line ?? 0 ; if ( mergeDup ) { const dup = errors . find ( e => path === e . path && line === e . line && err . details === e . details ) ; if ( dup !== undefined ) { dup . testRunPaths . push ( tr . path ) ; continue ; } } errors . push ( { testRunPaths : [ tr . path ] , suiteName : ts . name , testName : tg . name ? `${ tg . name } ► ${ tc . name }` : tc . name , details : err . details , message : err . message ?? getFirstNonEmptyLine ( err . details ) ?? 'Test failed' , path , line } ) ; } } } } errors . splice ( maxCount + 1 ) ; const annotations = errors . map ( e => { const message = [ 'Failed test found in:' , e . testRunPaths . map ( p => `  ${ p }` ) . join ( '\n' ) , 'Error:' , ident ( fixEol ( e . message ) , '  ' ) ] . join ( '\n' ) ; return enforceCheckRunLimits ( { path : e . path , start_line : e . line , end_line : e . line , annotation_level : 'failure' , title : `${ e . suiteName } ► ${ e . testName }` , raw_details : fixEol ( e . details ) , message } ) ; } ) ; return annotations ; } function enforceCheckRunLimits ( err ) { err . title = ellipsis ( err . title || '' , 255 ) ; err . message = ellipsis ( err . message , 65535 ) ; if ( err . raw_details ) { err . raw_details = ellipsis ( err . raw_details , 65535 ) ; } return err ; } function ident ( text , prefix ) { return text . split ( /\n/g ) . map ( line => prefix + line ) . join ( '\n' ) ; }