Skip to content

Commit bedf085

Browse files
committed
Add Background keyword
1 parent 53d7db2 commit bedf085

4 files changed

Lines changed: 90 additions & 14 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## [0.1.3] - More Gherkin keywords
22

3+
* Add `Background` keyword
34
* Add `directives_ordering` linter exception
45

56
## [0.1.2] - More Gherkin keywords

lib/src/bdd_line.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class BddLine {
1010

1111
enum LineType {
1212
feature,
13+
background,
1314
scenario,
1415
step,
1516
unknown,
@@ -19,6 +20,9 @@ LineType _lineTypeFromString(String line) {
1920
if (featureMarkers.any((marker) => line.startsWith(marker))) {
2021
return LineType.feature;
2122
}
23+
if (backgroundMarkers.any((marker) => line.startsWith(marker))) {
24+
return LineType.background;
25+
}
2226
if (scenarioMarkers.any((marker) => line.startsWith(marker))) {
2327
return LineType.scenario;
2428
}
@@ -29,6 +33,7 @@ LineType _lineTypeFromString(String line) {
2933
}
3034

3135
const featureMarkers = ['Feature:'];
36+
const backgroundMarkers = ['Background:'];
3237
const scenarioMarkers = ['Scenario:', 'Example:'];
3338
const stepMarkers = ['Given', 'When', 'Then', 'And', 'But'];
3439

lib/src/feature_generator.dart

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,59 @@ String generateFeatureDart(List<BddLine> lines, List<StepFile> steps) {
2222

2323
sb.writeln('');
2424
sb.writeln('void main() {');
25+
_parseBackground(sb, lines);
2526

2627
final features = splitWhen(
2728
lines.skipWhile((value) => value.type != LineType.feature), // skip header
2829
(e) => e.type == LineType.feature);
2930

3031
for (final feature in features) {
31-
sb.writeln(' group(\'${feature.first.value}\', () {');
32+
_parseFeature(sb, feature);
33+
}
34+
sb.writeln('}');
35+
return sb.toString();
36+
}
3237

33-
final scenarios =
34-
splitWhen(feature.skip(1), (e) => e.type == LineType.scenario).toList();
35-
for (final scenario in scenarios) {
36-
sb.writeln(
37-
' testWidgets(\'${scenario.first.value}\', (WidgetTester tester) async {');
38+
var backgroundOffset = -1;
39+
void _parseBackground(StringBuffer sb, List<BddLine> feature) {
40+
backgroundOffset =
41+
feature.indexWhere((element) => element.type == LineType.background);
42+
if (backgroundOffset == -1) {
43+
return;
44+
}
45+
sb.writeln(' setUp(() async {');
46+
backgroundOffset++;
47+
while (feature[backgroundOffset].type == LineType.step) {
48+
sb.writeln(
49+
' await ${getStepMethodCall(feature[backgroundOffset].value)};');
50+
backgroundOffset++;
51+
}
52+
sb.writeln(' });');
53+
}
3854

39-
for (final step in scenario.skip(1)) {
40-
sb.writeln(' await ${getStepMethodCall(step.value)};');
41-
}
55+
void _parseFeature(StringBuffer sb, List<BddLine> feature) {
56+
sb.writeln(' group(\'${feature.first.value}\', () {');
4257

43-
sb.writeln(' });');
44-
}
45-
sb.writeln(' });');
58+
final scenarios = splitWhen(
59+
feature.skip(backgroundOffset == -1
60+
? 1 // Skip 'Feature:'
61+
: backgroundOffset), // or 'Backround:'
62+
(e) => e.type == LineType.scenario).toList();
63+
for (final scenario in scenarios) {
64+
_parseScenario(sb, scenario);
4665
}
47-
sb.writeln('}');
48-
return sb.toString();
66+
sb.writeln(' });');
67+
}
68+
69+
void _parseScenario(StringBuffer sb, List<BddLine> scenario) {
70+
sb.writeln(
71+
' testWidgets(\'${scenario.first.value}\', (WidgetTester tester) async {');
72+
73+
for (final step in scenario.skip(1)) {
74+
sb.writeln(' await ${getStepMethodCall(step.value)};');
75+
}
76+
77+
sb.writeln(' });');
4978
}
5079

5180
List<List<T>> splitWhen<T>(Iterable<T> original, bool Function(T) predicate) =>

test/background_test.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import 'package:bdd_widget_test/src/feature_file.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
4+
import 'testing_data.dart';
5+
6+
void main() {
7+
test('Background steps appear before groups ', () {
8+
const featureFile = '''
9+
Feature: Testing feature
10+
Background:
11+
Given the server always return errors
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_app_is_running.dart';
25+
26+
void main() {
27+
setUp(() async {
28+
await theServerAlwaysReturnErrors(tester);
29+
});
30+
group('Testing feature', () {
31+
testWidgets('Testing scenario', (WidgetTester tester) async {
32+
await theAppIsRunning(tester);
33+
});
34+
});
35+
}
36+
''';
37+
38+
final feature = FeatureFile(path: 'test.feature', input: featureFile);
39+
expect(feature.dartContent, expectedFeatureDart);
40+
});
41+
}

0 commit comments

Comments
 (0)