Skip to content

Commit efe7db5

Browse files
committed
Add 'After' keyword
1 parent 52085c8 commit efe7db5

4 files changed

Lines changed: 120 additions & 16 deletions

File tree

lib/src/bdd_line.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum LineType {
1313
background,
1414
scenario,
1515
step,
16+
after,
1617
unknown,
1718
}
1819

@@ -23,6 +24,9 @@ LineType _lineTypeFromString(String line) {
2324
if (backgroundMarkers.any((marker) => line.startsWith(marker))) {
2425
return LineType.background;
2526
}
27+
if (afterMarkers.any((marker) => line.startsWith(marker))) {
28+
return LineType.after;
29+
}
2630
if (scenarioMarkers.any((marker) => line.startsWith(marker))) {
2731
return LineType.scenario;
2832
}
@@ -34,6 +38,7 @@ LineType _lineTypeFromString(String line) {
3438

3539
const featureMarkers = ['Feature:'];
3640
const backgroundMarkers = ['Background:'];
41+
const afterMarkers = ['After:'];
3742
const scenarioMarkers = ['Scenario:', 'Example:'];
3843
const stepMarkers = ['Given', 'When', 'Then', 'And', 'But'];
3944

lib/src/feature_generator.dart

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:math';
2+
13
import 'package:bdd_widget_test/src/bdd_line.dart';
24
import 'package:bdd_widget_test/src/step_file.dart';
35
import 'package:bdd_widget_test/src/step_generator.dart';
@@ -29,36 +31,49 @@ String generateFeatureDart(List<BddLine> lines, List<StepFile> steps) {
2931

3032
for (final feature in features) {
3133
final backgroundOffset = _parseBackground(sb, feature);
32-
_parseFeature(sb, feature, backgroundOffset);
34+
final afterOffset = _parseAfter(sb, feature);
35+
final offset = _calculateOffset(backgroundOffset, afterOffset);
36+
_parseFeature(sb, feature, offset);
3337
}
3438
sb.writeln('}');
3539
return sb.toString();
3640
}
3741

38-
int _parseBackground(StringBuffer sb, List<BddLine> lines) {
39-
var backgroundOffset =
40-
lines.indexWhere((element) => element.type == LineType.background);
41-
if (backgroundOffset != -1) {
42-
sb.writeln(' setUp(() async {');
43-
backgroundOffset++;
44-
while (lines[backgroundOffset].type == LineType.step) {
45-
sb.writeln(
46-
' await ${getStepMethodName(lines[backgroundOffset].value)}();');
47-
backgroundOffset++;
42+
int _parseBackground(StringBuffer sb, List<BddLine> lines) =>
43+
_parseSetup(sb, lines, LineType.background, 'setUp');
44+
45+
int _parseAfter(StringBuffer sb, List<BddLine> lines) =>
46+
_parseSetup(sb, lines, LineType.after, 'tearDown');
47+
48+
int _calculateOffset(int backgroundOffset, int afterOffset) {
49+
if (backgroundOffset == -1 && afterOffset == -1) {
50+
return -1;
51+
}
52+
return max(backgroundOffset, afterOffset);
53+
}
54+
55+
int _parseSetup(
56+
StringBuffer sb, List<BddLine> lines, LineType elementType, String title) {
57+
var offset = lines.indexWhere((element) => element.type == elementType);
58+
if (offset != -1) {
59+
sb.writeln(' $title(() async {');
60+
offset++;
61+
while (lines[offset].type == LineType.step) {
62+
sb.writeln(' await ${getStepMethodName(lines[offset].value)}();');
63+
offset++;
4864
}
4965
sb.writeln(' });');
5066
}
51-
return backgroundOffset;
67+
return offset;
5268
}
5369

54-
void _parseFeature(
55-
StringBuffer sb, List<BddLine> feature, int backgroundOffset) {
70+
void _parseFeature(StringBuffer sb, List<BddLine> feature, int offset) {
5671
sb.writeln(' group(\'${feature.first.value}\', () {');
5772

5873
final scenarios = splitWhen(
59-
feature.skip(backgroundOffset == -1
74+
feature.skip(offset == -1
6075
? 1 // Skip 'Feature:'
61-
: backgroundOffset), // or 'Backround:'
76+
: offset), // or 'Backround:' / 'After:'
6277
(e) => e.type == LineType.scenario).toList();
6378
for (final scenario in scenarios) {
6479
_parseScenario(sb, scenario);

test/after_test.dart

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import 'package:bdd_widget_test/src/feature_file.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
4+
void main() {
5+
test('After steps appear after groups ', () {
6+
const featureFile = '''
7+
Feature: Testing feature
8+
After:
9+
And the test finishes
10+
Scenario: Testing scenario
11+
Given the app is running
12+
''';
13+
14+
const expectedFeatureDart = '''
15+
// GENERATED CODE - DO NOT MODIFY BY HAND
16+
// ignore_for_file: unused_import, directives_ordering
17+
18+
import 'package:flutter/material.dart';
19+
import 'package:flutter_test/flutter_test.dart';
20+
21+
import './step/the_test_finishes.dart';
22+
import './step/the_app_is_running.dart';
23+
24+
void main() {
25+
tearDown(() async {
26+
await theTestFinishes();
27+
});
28+
group('Testing feature', () {
29+
testWidgets('Testing scenario', (tester) async {
30+
await theAppIsRunning(tester);
31+
});
32+
});
33+
}
34+
''';
35+
36+
final feature = FeatureFile(path: 'test.feature', input: featureFile);
37+
expect(feature.dartContent, expectedFeatureDart);
38+
});
39+
}

test/setup_test.dart

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import 'package:bdd_widget_test/src/feature_file.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
4+
void main() {
5+
test('After steps appear after groups ', () {
6+
const featureFile = '''
7+
Feature: Testing feature
8+
Background:
9+
Given the server always return errors
10+
After:
11+
And the test finishes
12+
Scenario: Testing scenario
13+
Given the app is running
14+
''';
15+
16+
const expectedFeatureDart = '''
17+
// GENERATED CODE - DO NOT MODIFY BY HAND
18+
// ignore_for_file: unused_import, directives_ordering
19+
20+
import 'package:flutter/material.dart';
21+
import 'package:flutter_test/flutter_test.dart';
22+
23+
import './step/the_server_always_return_errors.dart';
24+
import './step/the_test_finishes.dart';
25+
import './step/the_app_is_running.dart';
26+
27+
void main() {
28+
setUp(() async {
29+
await theServerAlwaysReturnErrors();
30+
});
31+
tearDown(() async {
32+
await theTestFinishes();
33+
});
34+
group('Testing feature', () {
35+
testWidgets('Testing scenario', (tester) async {
36+
await theAppIsRunning(tester);
37+
});
38+
});
39+
}
40+
''';
41+
42+
final feature = FeatureFile(path: 'test.feature', input: featureFile);
43+
expect(feature.dartContent, expectedFeatureDart);
44+
});
45+
}

0 commit comments

Comments
 (0)