Skip to content

Commit 9690244

Browse files
authored
Merge pull request #2 from sncf-connect-tech/1-improve_exception_reporting
resolves #1 improve exception reporting
2 parents 6d2a2c5 + ec46bcf commit 9690244

File tree

3 files changed

+56
-25
lines changed

3 files changed

+56
-25
lines changed

lib/reporters/widget_stdout_reporter.dart

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ class WidgetStdoutReporter extends Reporter {
1717
@override
1818
Future<void> onScenarioStarted(StartedMessage message) async {
1919
logger.i(COOL_COLOR("\n${"-" * 100}\n"));
20-
logger.i(COOL_COLOR('${DateTime.now()} - Running scenario: ${message.name + _getContext(message.context)}'));
20+
logger.i(COOL_COLOR(
21+
'${DateTime.now()} - Running scenario: ${message.name + _getContext(message.context)}'));
2122
}
2223

2324
@override
@@ -29,15 +30,24 @@ class WidgetStdoutReporter extends Reporter {
2930

3031
@override
3132
Future<void> onStepFinished(StepFinishedMessage message) async {
32-
var stepColor = message.result.result == StepExecutionResult.pass ? PASS_COLOR : FAIL_COLOR;
33-
var printMessage = [
34-
stepColor(' '),
35-
stepColor(_getStatePrefixIcon(message.result.result)),
36-
stepColor(message.name),
37-
NEUTRAL_COLOR(_getExecutionDuration(message.result)),
38-
stepColor(_getReasonMessage(message.result)),
39-
stepColor(_getErrorMessage(message.result))
40-
].join((' ')).trimRight();
33+
var stepColor = message.result.result == StepExecutionResult.pass
34+
? PASS_COLOR
35+
: FAIL_COLOR;
36+
String printMessage;
37+
if (message.result is ErroredStepResult) {
38+
var errorMessage = (message.result as ErroredStepResult);
39+
printMessage =
40+
FAIL_COLOR('${errorMessage.exception}\n${errorMessage.stackTrace}');
41+
} else {
42+
printMessage = [
43+
stepColor(' '),
44+
stepColor(_getStatePrefixIcon(message.result.result)),
45+
stepColor(message.name),
46+
NEUTRAL_COLOR(_getExecutionDuration(message.result)),
47+
stepColor(_getReasonMessage(message.result)),
48+
stepColor(_getErrorMessage(message.result))
49+
].join((' ')).trimRight();
50+
}
4151
logger.i(printMessage);
4252

4353
// TODO adapter à cette classe
@@ -59,7 +69,8 @@ class WidgetStdoutReporter extends Reporter {
5969
}
6070

6171
String _getReasonMessage(StepResult stepResult) {
62-
if (stepResult.resultReason != null && stepResult.resultReason!.isNotEmpty) {
72+
if (stepResult.resultReason != null &&
73+
stepResult.resultReason!.isNotEmpty) {
6374
return '\n ${stepResult.resultReason}';
6475
} else {
6576
return '';
@@ -75,7 +86,8 @@ class WidgetStdoutReporter extends Reporter {
7586
}
7687

7788
String _getContext(RunnableDebugInformation context) {
78-
return NEUTRAL_COLOR("\t# ${_getFeatureFilePath(context)}:${context.lineNumber}");
89+
return NEUTRAL_COLOR(
90+
"\t# ${_getFeatureFilePath(context)}:${context.lineNumber}");
7991
}
8092

8193
String _getFeatureFilePath(RunnableDebugInformation context) {

lib/utils/widget_renderer.dart

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,43 @@ import 'dart:typed_data';
66
import 'dart:ui' as ui;
77
import 'package:flutter/rendering.dart';
88

9-
Future<void> takeScreenshot() async {
9+
Future<void> takeScreenshot({withWidgetTreeRender = false}) async {
1010
await currentWorld.tester.pumpAndSettle();
11-
RenderRepaintBoundary boundary = _getMainWidget().renderObject! as RenderRepaintBoundary;
12-
ui.Image image = await boundary.toImage();
13-
ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
14-
Uint8List pngBytes = byteData!.buffer.asUint8List();
15-
await currentWorld.screenshot?.writeAsBytes(pngBytes);
11+
RenderObject? renderObject = _getMainWidget()?.renderObject;
12+
if (renderObject != null) {
13+
RenderRepaintBoundary boundary = renderObject as RenderRepaintBoundary;
14+
ui.Image image = await boundary.toImage();
15+
ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
16+
Uint8List pngBytes = byteData!.buffer.asUint8List();
17+
await currentWorld.screenshot?.writeAsBytes(pngBytes);
18+
19+
if (withWidgetTreeRender) {
20+
await dumpWidgetRender();
21+
}
22+
} else {
23+
logger.e('Screenshot failed.');
24+
}
1625
}
1726

1827
Future<void> dumpWidgetRender() async {
19-
final widgetRendering = _printWidgetTree(_getMainWidget(), 0);
20-
logger.i("Impression widget :\n $widgetRendering");
21-
await currentWorld.dumpFile?.writeAsString(widgetRendering.toString());
28+
Element? widget = _getMainWidget();
29+
if (widget != null) {
30+
final widgetRendering = _printWidgetTree(_getMainWidget(), 0);
31+
logger.i("Impression widget :\n $widgetRendering");
32+
await currentWorld.dumpFile?.writeAsString(widgetRendering.toString());
33+
} else {
34+
logger.e('Widget render dump failed.');
35+
}
2236
}
2337

24-
Element _getMainWidget() {
25-
return currentWorld.tester.allElements.firstWhere((element) => element.widget.runtimeType == RepaintBoundary);
38+
Element? _getMainWidget() {
39+
try {
40+
return currentWorld.tester.allElements
41+
.firstWhere((element) => element.widget.runtimeType == RepaintBoundary);
42+
} catch (e) {
43+
logger.e('Cannot get a RepaintBoundary widget.');
44+
return null;
45+
}
2646
}
2747

2848
int? firstLevel;

lib/world/widget_hooks.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ class WidgetHooks implements Hook {
4141
var dumpFileName = _getDumpFilePath();
4242
currentWorld.dumpFile = File("$dumpFileName.txt");
4343
currentWorld.screenshot = File("$dumpFileName.png");
44-
await takeScreenshot();
45-
await dumpWidgetRender();
44+
await takeScreenshot(withWidgetTreeRender: true);
4645
}
4746
}
4847

0 commit comments

Comments
 (0)