@@ -18,7 +18,13 @@ enum LogSeverity {
1818const kMaxLogStacks = 2 ;
1919const kMinSeverityForStack = LogSeverity . Warn ;
2020
21- function logSeverityToString ( status : LogSeverity ) : Status {
21+ function logSeverityToString ( severity : LogSeverity ) : string {
22+ return [ 'NotRun' , 'Skip' , 'Pass' , 'Warn' , 'ExpectFailed' , 'ValidationFailed' , 'ThrewException' ] [
23+ severity
24+ ] ;
25+ }
26+
27+ function logSeverityToStatus ( status : LogSeverity ) : Status {
2228 switch ( status ) {
2329 case LogSeverity . NotRun :
2430 return 'notrun' ;
@@ -42,11 +48,10 @@ export class TestCaseRecorder {
4248 private finalCaseStatus = LogSeverity . NotRun ;
4349 private hideStacksBelowSeverity = kMinSeverityForStack ;
4450 private startTime = - 1 ;
51+ private preambleLog ?: LogMessageWithStack ;
4552 private logs : LogMessageWithStack [ ] = [ ] ;
4653 private logLinesAtCurrentSeverity = 0 ;
4754 private debugging = false ;
48- /** Used to dedup log messages which have identical stacks. */
49- private messagesForPreviouslySeenStacks = new Map < string , LogMessageWithStack > ( ) ;
5055
5156 constructor ( result : LiveTestCaseResult , debugging : boolean ) {
5257 this . result = result ;
@@ -72,7 +77,7 @@ export class TestCaseRecorder {
7277 }
7378
7479 // Convert numeric enum back to string (but expose 'exception' as 'fail')
75- this . result . status = logSeverityToString ( this . finalCaseStatus ) ;
80+ this . result . status = logSeverityToStatus ( this . finalCaseStatus ) ;
7681
7782 this . result . logs = this . logs ;
7883 }
@@ -146,6 +151,18 @@ export class TestCaseRecorder {
146151 this . logImpl ( LogSeverity . ThrewException , 'EXCEPTION' , ex ) ;
147152 }
148153
154+ private updatePreamble ( ) {
155+ if ( this . preambleLog === undefined ) {
156+ const preambleError = new Error ( ) ;
157+ preambleError . stack = undefined ;
158+ this . preambleLog = new LogMessageWithStack ( 'SUMMARY' , preambleError ) ;
159+ this . logs . unshift ( this . preambleLog ) ;
160+ }
161+ this . preambleLog . message = `highest severity is ☆ ${ logSeverityToString (
162+ this . hideStacksBelowSeverity
163+ ) } `;
164+ }
165+
149166 private logImpl ( level : LogSeverity , name : string , baseException : unknown ) : void {
150167 assert ( baseException instanceof Error , 'test threw a non-Error object' ) ;
151168 globalTestConfig . testHeartbeatCallback ( ) ;
@@ -158,25 +175,26 @@ export class TestCaseRecorder {
158175 this . finalCaseStatus = Math . max ( this . finalCaseStatus , level ) ;
159176 }
160177
161- // setFirstLineOnly for all logs except `kMaxLogStacks` stacks at the highest severity
178+ // Hide stack for all logs except `kMaxLogStacks` stacks at the highest severity
162179 if ( level > this . hideStacksBelowSeverity ) {
163180 this . logLinesAtCurrentSeverity = 0 ;
164181 this . hideStacksBelowSeverity = level ;
182+ this . updatePreamble ( ) ;
165183
166- // Go back and setFirstLineOnly for everything of a lower log level
184+ // Go back and hide stack for everything of a lower log level
167185 for ( const log of this . logs ) {
168- log . setStackHidden ( 'below max severity' ) ;
186+ log . setPrintOptions ( false , 'below max severity' ) ;
169187 }
170188 }
171189 if ( level === this . hideStacksBelowSeverity ) {
172190 this . logLinesAtCurrentSeverity ++ ;
191+ if ( this . logLinesAtCurrentSeverity > kMaxLogStacks ) {
192+ logMessage . setPrintOptions ( true , `only ${ kMaxLogStacks } shown` ) ;
193+ }
173194 } else if ( level < kMinSeverityForStack ) {
174- logMessage . setStackHidden ( '' ) ;
195+ logMessage . setPrintOptions ( false , '' ) ;
175196 } else if ( level < this . hideStacksBelowSeverity ) {
176- logMessage . setStackHidden ( 'below max severity' ) ;
177- }
178- if ( this . logLinesAtCurrentSeverity > kMaxLogStacks ) {
179- logMessage . setStackHidden ( `only ${ kMaxLogStacks } shown` ) ;
197+ logMessage . setPrintOptions ( false , 'below max severity' ) ;
180198 }
181199
182200 this . logs . push ( logMessage ) ;
0 commit comments