@@ -18,7 +18,13 @@ enum LogSeverity {
18
18
const kMaxLogStacks = 2 ;
19
19
const kMinSeverityForStack = LogSeverity . Warn ;
20
20
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 {
22
28
switch ( status ) {
23
29
case LogSeverity . NotRun :
24
30
return 'notrun' ;
@@ -42,11 +48,10 @@ export class TestCaseRecorder {
42
48
private finalCaseStatus = LogSeverity . NotRun ;
43
49
private hideStacksBelowSeverity = kMinSeverityForStack ;
44
50
private startTime = - 1 ;
51
+ private preambleLog ?: LogMessageWithStack ;
45
52
private logs : LogMessageWithStack [ ] = [ ] ;
46
53
private logLinesAtCurrentSeverity = 0 ;
47
54
private debugging = false ;
48
- /** Used to dedup log messages which have identical stacks. */
49
- private messagesForPreviouslySeenStacks = new Map < string , LogMessageWithStack > ( ) ;
50
55
51
56
constructor ( result : LiveTestCaseResult , debugging : boolean ) {
52
57
this . result = result ;
@@ -72,7 +77,7 @@ export class TestCaseRecorder {
72
77
}
73
78
74
79
// 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 ) ;
76
81
77
82
this . result . logs = this . logs ;
78
83
}
@@ -146,6 +151,18 @@ export class TestCaseRecorder {
146
151
this . logImpl ( LogSeverity . ThrewException , 'EXCEPTION' , ex ) ;
147
152
}
148
153
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
+
149
166
private logImpl ( level : LogSeverity , name : string , baseException : unknown ) : void {
150
167
assert ( baseException instanceof Error , 'test threw a non-Error object' ) ;
151
168
globalTestConfig . testHeartbeatCallback ( ) ;
@@ -158,25 +175,26 @@ export class TestCaseRecorder {
158
175
this . finalCaseStatus = Math . max ( this . finalCaseStatus , level ) ;
159
176
}
160
177
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
162
179
if ( level > this . hideStacksBelowSeverity ) {
163
180
this . logLinesAtCurrentSeverity = 0 ;
164
181
this . hideStacksBelowSeverity = level ;
182
+ this . updatePreamble ( ) ;
165
183
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
167
185
for ( const log of this . logs ) {
168
- log . setStackHidden ( 'below max severity' ) ;
186
+ log . setPrintOptions ( false , 'below max severity' ) ;
169
187
}
170
188
}
171
189
if ( level === this . hideStacksBelowSeverity ) {
172
190
this . logLinesAtCurrentSeverity ++ ;
191
+ if ( this . logLinesAtCurrentSeverity > kMaxLogStacks ) {
192
+ logMessage . setPrintOptions ( true , `only ${ kMaxLogStacks } shown` ) ;
193
+ }
173
194
} else if ( level < kMinSeverityForStack ) {
174
- logMessage . setStackHidden ( '' ) ;
195
+ logMessage . setPrintOptions ( false , '' ) ;
175
196
} 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' ) ;
180
198
}
181
199
182
200
this . logs . push ( logMessage ) ;
0 commit comments