Skip to content

Commit bf65665

Browse files
committed
Resolves #11 Upgrade gherkin lib in version 3.1.0
1 parent 243416c commit bf65665

File tree

10 files changed

+290
-190
lines changed

10 files changed

+290
-190
lines changed

example/pubspec.lock

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ packages:
3636
url: "https://pub.dartlang.org"
3737
source: hosted
3838
version: "1.16.0"
39+
crypto:
40+
dependency: transitive
41+
description:
42+
name: crypto
43+
url: "https://pub.dartlang.org"
44+
source: hosted
45+
version: "3.0.2"
3946
cupertino_icons:
4047
dependency: "direct main"
4148
description:
@@ -75,12 +82,12 @@ packages:
7582
source: sdk
7683
version: "0.0.0"
7784
gherkin:
78-
dependency: "direct dev"
85+
dependency: transitive
7986
description:
8087
name: gherkin
8188
url: "https://pub.dartlang.org"
8289
source: hosted
83-
version: "2.0.8"
90+
version: "3.1.0"
8491
gherkin_widget_extension:
8592
dependency: "direct dev"
8693
description:
@@ -191,6 +198,20 @@ packages:
191198
url: "https://pub.dartlang.org"
192199
source: hosted
193200
version: "0.4.12"
201+
typed_data:
202+
dependency: transitive
203+
description:
204+
name: typed_data
205+
url: "https://pub.dartlang.org"
206+
source: hosted
207+
version: "1.3.2"
208+
uuid:
209+
dependency: transitive
210+
description:
211+
name: uuid
212+
url: "https://pub.dartlang.org"
213+
source: hosted
214+
version: "3.0.7"
194215
vector_math:
195216
dependency: transitive
196217
description:

example/pubspec.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ dev_dependencies:
4040
flutter_test:
4141
sdk: flutter
4242
glob: ^2.1.1
43-
gherkin: ^2.0.8
4443
gherkin_widget_extension:
4544
path: ../
4645

example/test/test_setup.dart

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,20 @@ import 'step_definitions/steps.dart';
1313
TestConfiguration testWidgetsConfiguration({
1414
String featurePath = '*.feature',
1515
}) {
16-
return TestConfiguration()
17-
..features = [Glob(featurePath)]
18-
..hooks = [WidgetHooks(dumpFolderPath: 'widget_tests_report_folder')]
19-
..order = ExecutionOrder.sequential
20-
..stopAfterTestFailed = false
21-
..reporters = [
22-
WidgetStdoutReporter(),
23-
WidgetTestRunSummaryReporter(),
24-
XmlReporter(dirRoot: Directory.current.path),
25-
]
26-
..stepDefinitions = [
27-
givenAFreshApp(),
28-
whenButtonTapped(),
29-
thenCounterIsUpdated()
30-
]
31-
..defaultTimeout =
32-
const Duration(milliseconds: 60000 * 10);
16+
return TestConfiguration(features: [
17+
Glob(featurePath)
18+
],
19+
hooks: [
20+
WidgetHooks(dumpFolderPath: 'widget_tests_report_folder')
21+
], reporters: [
22+
WidgetStdoutReporter(),
23+
WidgetTestRunSummaryReporter(),
24+
XmlReporter(dirRoot: Directory.current.path),
25+
],
26+
stepDefinitions: [
27+
givenAFreshApp(),
28+
whenButtonTapped(),
29+
thenCounterIsUpdated()
30+
],
31+
defaultTimeout: const Duration(milliseconds: 60000 * 10));
3332
}

lib/reporters/widget_stdout_reporter.dart

Lines changed: 82 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:logger/logger.dart';
33

44
import 'monochrome_printer.dart';
55

6-
class WidgetStdoutReporter extends Reporter {
6+
class WidgetStdoutReporter implements FullReporter {
77
/// https://talyian.github.io/ansicolors/
88
final AnsiColor neutralColor = AnsiColor.none();
99
final AnsiColor debugColor = AnsiColor.fg(7); // gray
@@ -15,92 +15,99 @@ class WidgetStdoutReporter extends Reporter {
1515
final logger = Logger(printer: MonochromePrinter());
1616

1717
@override
18-
Future<void> onScenarioStarted(StartedMessage message) async {
19-
logger.i(coolColor('\n${'-' * 100}\n'));
20-
logger.i(coolColor(
21-
'${DateTime.now()} - Running scenario: ${message.name + _getContext(message.context)}'));
22-
}
18+
Future<void> dispose() async {}
2319

2420
@override
25-
Future<void> onScenarioFinished(ScenarioFinishedMessage message) async {
26-
var scenarioColor = message.passed ? passColor : failColor;
27-
var scenarioStatus = message.passed ? 'PASSED' : 'FAILED';
28-
logger.i('${scenarioColor(scenarioStatus)}: Scenario ${message.name}');
29-
}
21+
ReportActionHandler<FeatureMessage> get feature => ReportActionHandler();
3022

3123
@override
32-
Future<void> onStepFinished(StepFinishedMessage message) async {
33-
var stepColor = message.result.result == StepExecutionResult.pass
34-
? passColor
35-
: failColor;
36-
String printMessage;
37-
if (message.result is ErroredStepResult) {
38-
var errorMessage = (message.result as ErroredStepResult);
39-
printMessage =
40-
failColor('${errorMessage.exception}\n${errorMessage.stackTrace}');
41-
} else {
42-
printMessage = [
43-
stepColor(' '),
44-
stepColor(_getStatePrefixIcon(message.result.result)),
45-
stepColor(message.name),
46-
neutralColor(_getExecutionDuration(message.result)),
47-
stepColor(_getReasonMessage(message.result)),
48-
stepColor(_getErrorMessage(message.result))
49-
].join((' ')).trimRight();
50-
}
51-
logger.i(printMessage);
52-
53-
// TODO adapter à cette classe
54-
// if (message.attachments.isNotEmpty) {
55-
// message.attachments.forEach(
56-
// (attachment) {
57-
// var attachment2 = attachment;
58-
// printMessageLine(
59-
// [
60-
// ' ',
61-
// 'Attachment',
62-
// '(${attachment2.mimeType})${attachment.mimeType == 'text/plain' ? ': ${attachment.data}' : ''}'
63-
// ].join((' ')).trimRight(),
64-
// StdoutReporter.RESET_COLOR,
65-
// );
66-
// },
67-
// );
68-
// }
69-
}
24+
Future<void> message(String message, MessageLevel level) async {}
7025

71-
String _getReasonMessage(StepResult stepResult) {
72-
if (stepResult.resultReason != null &&
73-
stepResult.resultReason!.isNotEmpty) {
74-
return '\n ${stepResult.resultReason}';
75-
} else {
76-
return '';
77-
}
78-
}
26+
@override
27+
Future<void> onException(Object exception, StackTrace stackTrace) async {}
7928

80-
String _getErrorMessage(StepResult stepResult) {
81-
if (stepResult is ErroredStepResult) {
82-
return '\n${stepResult.exception}\n${stepResult.stackTrace}';
83-
} else {
84-
return '';
85-
}
86-
}
29+
@override
30+
ReportActionHandler<ScenarioMessage> get scenario => ReportActionHandler(
31+
onStarted: ([message]) async {
32+
logger.i(coolColor("\n${"-" * 100}\n"));
33+
if (message == null) {
34+
logger.i(failColor('Cannot get scenario information'));
35+
} else {
36+
logger.i(coolColor(
37+
'${DateTime.now()} - Running scenario: ${message.name + _getContext(message.context)}'));
38+
}
39+
},
40+
onFinished: ([message]) async {
41+
if (message == null) {
42+
logger.i(failColor('Cannot get scenario information'));
43+
} else {
44+
var scenarioColor = message.hasPassed ? passColor : failColor;
45+
var scenarioStatus = message.hasPassed ? "PASSED" : "FAILED";
46+
logger.i(
47+
"${scenarioColor(scenarioStatus)}: Scenario ${message.name}");
48+
}
49+
},
50+
);
8751

88-
String _getContext(RunnableDebugInformation context) {
89-
return neutralColor(
90-
'\t# ${_getFeatureFilePath(context)}:${context.lineNumber}');
91-
}
52+
@override
53+
ReportActionHandler<StepMessage> get step => ReportActionHandler(
54+
onFinished: ([message]) async {
55+
if (message == null) {
56+
logger.i(failColor('Cannot get scenario information'));
57+
} else {
58+
if (message.result == null) {
59+
logger.i(failColor('Cannot get result scenario information'));
60+
} else {
61+
var stepColor =
62+
message.result!.result == StepExecutionResult.passed
63+
? passColor
64+
: failColor;
65+
String printMessage;
66+
if (message.result is ErroredStepResult) {
67+
var errorMessage = (message.result as ErroredStepResult);
68+
printMessage = failColor(
69+
'${errorMessage.exception}\n${errorMessage.stackTrace}');
70+
} else {
71+
printMessage = [
72+
stepColor(' '),
73+
stepColor(_getStatePrefixIcon(message.result!.result)),
74+
stepColor(message.name),
75+
neutralColor(_getExecutionDuration(message.result!)),
76+
stepColor(_getReasonMessage(message.result!)),
77+
stepColor(_getErrorMessage(message.result!))
78+
].join((' ')).trimRight();
79+
}
80+
logger.i(printMessage);
81+
}
82+
}
83+
},
84+
);
9285

93-
String _getFeatureFilePath(RunnableDebugInformation context) {
94-
return context.filePath.replaceAll(RegExp(r'\.\\'), '');
95-
}
86+
@override
87+
ReportActionHandler<TestMessage> get test => ReportActionHandler();
9688

97-
String _getExecutionDuration(StepResult stepResult) {
98-
return ' (${stepResult.elapsedMilliseconds}ms)';
99-
}
89+
String _getReasonMessage(StepResult stepResult) =>
90+
(stepResult.resultReason != null && stepResult.resultReason!.isNotEmpty)
91+
? '\n ${stepResult.resultReason}'
92+
: '';
93+
94+
String _getErrorMessage(StepResult stepResult) =>
95+
stepResult is ErroredStepResult
96+
? '\n${stepResult.exception}\n${stepResult.stackTrace}'
97+
: '';
98+
99+
String _getContext(RunnableDebugInformation? context) => neutralColor(
100+
"\t# ${_getFeatureFilePath(context)}:${context?.lineNumber}");
101+
102+
String _getFeatureFilePath(RunnableDebugInformation? context) =>
103+
context?.filePath.replaceAll(RegExp(r'\.\\'), '') ?? '';
104+
105+
String _getExecutionDuration(StepResult stepResult) =>
106+
' (${stepResult.elapsedMilliseconds}ms)';
100107

101108
String _getStatePrefixIcon(StepExecutionResult result) {
102109
switch (result) {
103-
case StepExecutionResult.pass:
110+
case StepExecutionResult.passed:
104111
return '√';
105112
case StepExecutionResult.error:
106113
case StepExecutionResult.fail:

lib/reporters/widget_test_run_summary_reporter.dart

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,44 @@ import 'package:gherkin_widget_extension/reporters/widget_stdout_reporter.dart';
33

44
class WidgetTestRunSummaryReporter extends WidgetStdoutReporter {
55
final _timer = Stopwatch();
6-
final List<StepFinishedMessage> _ranSteps = <StepFinishedMessage>[];
7-
final List<ScenarioFinishedMessage> _ranScenarios = <ScenarioFinishedMessage>[];
86

9-
@override
10-
Future<void> onScenarioStarted(StartedMessage message) async {
11-
// on n'implémente rien pour pas appeler CustomStdoutReporter.onScenarioStarted() en double
12-
}
13-
14-
@override
15-
Future<void> onScenarioFinished(ScenarioFinishedMessage message) async {
16-
_ranScenarios.add(message);
17-
}
7+
final List<StepMessage> _ranSteps = <StepMessage>[];
8+
final List<ScenarioMessage> _ranScenarios = <ScenarioMessage>[];
189

1910
@override
20-
Future<void> onStepFinished(StepFinishedMessage message) async {
21-
_ranSteps.add(message);
22-
}
11+
ReportActionHandler<ScenarioMessage> get scenario => ReportActionHandler(
12+
onStarted: ([message]) async {},
13+
onFinished: ([message]) async {
14+
if (message == null) {
15+
logger.i(failColor('Cannot get scenario information'));
16+
} else {
17+
_ranScenarios.add(message);
18+
}
19+
},
20+
);
2321

2422
@override
25-
Future<void> message(String message, MessageLevel level) async {}
23+
ReportActionHandler<StepMessage> get step => ReportActionHandler(
24+
onStarted: ([message]) async {},
25+
onFinished: ([message]) async {
26+
if (message == null) {
27+
logger.i(failColor('Cannot get scenario information'));
28+
} else {
29+
_ranSteps.add(message);
30+
}
31+
},
32+
);
2633

2734
@override
28-
Future<void> onTestRunStarted() async {
29-
_timer.start();
30-
}
31-
32-
@override
33-
Future<void> onTestRunFinished() async {
34-
_timer.stop();
35-
logger.i(_getRanScenariosSummary());
36-
logger.i(_getRanStepsSummary());
37-
logger.i('${Duration(milliseconds: _timer.elapsedMilliseconds)}\n');
38-
}
35+
ReportActionHandler<TestMessage> get test => ReportActionHandler(
36+
onStarted: ([message]) async => _timer.start(),
37+
onFinished: ([message]) async {
38+
_timer.stop();
39+
logger.i(_getRanScenariosSummary());
40+
logger.i(_getRanStepsSummary());
41+
logger.i('${Duration(milliseconds: _timer.elapsedMilliseconds)}\n');
42+
},
43+
);
3944

4045
@override
4146
Future<void> dispose() async {
@@ -52,27 +57,31 @@ class WidgetTestRunSummaryReporter extends WidgetStdoutReporter {
5257
return '${_ranSteps.length} step${_ranSteps.length > 1 ? 's' : ''} (${_collectStepSummary(_ranSteps)})';
5358
}
5459

55-
String _collectScenarioSummary(Iterable<ScenarioFinishedMessage> scenarios) {
60+
String _collectScenarioSummary(Iterable<ScenarioMessage> scenarios) {
5661
final summaries = <String>[];
57-
if (scenarios.any((s) => s.passed)) {
58-
summaries.add(passColor('${scenarios.where((s) => s.passed).length} passed'));
62+
if (scenarios.any((s) => s.hasPassed)) {
63+
summaries.add(
64+
passColor("${scenarios.where((s) => s.hasPassed).length} passed"));
5965
}
6066

61-
if (scenarios.any((s) => !s.passed)) {
62-
summaries.add(failColor('${scenarios.where((s) => !s.passed).length} failed'));
67+
if (scenarios.any((s) => !s.hasPassed)) {
68+
summaries.add(
69+
failColor("${scenarios.where((s) => !s.hasPassed).length} failed"));
6370
}
6471

6572
return summaries.join(', ');
6673
}
6774

68-
String _collectStepSummary(Iterable<StepFinishedMessage> steps) {
75+
String _collectStepSummary(Iterable<StepMessage> steps) {
6976
final summaries = <String>[];
70-
final passed = steps.where((s) => s.result.result == StepExecutionResult.pass);
71-
final skipped = steps.where((s) => s.result.result == StepExecutionResult.skipped);
77+
final passed =
78+
steps.where((s) => s.result?.result == StepExecutionResult.passed);
79+
final skipped =
80+
steps.where((s) => s.result?.result == StepExecutionResult.skipped);
7281
final failed = steps.where((s) =>
73-
s.result.result == StepExecutionResult.error ||
74-
s.result.result == StepExecutionResult.fail ||
75-
s.result.result == StepExecutionResult.timeout);
82+
s.result?.result == StepExecutionResult.error ||
83+
s.result?.result == StepExecutionResult.fail ||
84+
s.result?.result == StepExecutionResult.timeout);
7685
if (passed.isNotEmpty) {
7786
summaries.add(passColor('${passed.length} passed'));
7887
}

0 commit comments

Comments
 (0)