Skip to content
18 changes: 15 additions & 3 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,28 @@ class MyHomePage extends StatefulWidget {

class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
Color _color = Colors.blue;

void _incrementCounter() {
setState(() {
_counter++;
});
_counter++;
_changeColor(_counter);
}

void _changeColor(int counter) {
if (counter < 12) {
_color = Colors.blue;
} else if (counter < 24) {
_color = Colors.green;
} else if (counter < 35) {
_color = Colors.yellow;
}
setState(() {});
}

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: _color,
appBar: AppBar(title: Text(widget.title)),
body: Center(
child: Column(
Expand Down
13 changes: 13 additions & 0 deletions example/test/sample.feature
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ Feature: Counter
| 1 | '1' |
| 42 | '42' |

Scenario Outline: Add and remove buttons work together
Given the app is running
When I tap {Icons.add} icon <addTimes> times
Then I see result
| 'counter' | 'color' |
| <counter> | <color> |
Examples:
| addTimes | counter | color |
| 5 | '5' | 'blue' |
| 15 | '15' | 'green' |
| 30 | '30' | 'yellow' |


# Scenario: Built-in steps
# And I don't see {Icons.add} icon
# And I don't see {'text'} rich text
Expand Down
53 changes: 53 additions & 0 deletions example/test/sample_test.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions example/test/step/i_see_result.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'package:bdd_widget_test/data_table.dart' as bdd;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

/// Usage: I see result
Future<void> iSeeResult(WidgetTester tester, bdd.DataTable dataTable) async {
final counter = dataTable.asMaps().first['counter'] as String;
final color = _colorFromName(dataTable.asMaps().first['color'] as String);

expect(find.text(counter), findsOneWidget);
expect(
(tester.firstWidget(find.byType(Scaffold)) as Scaffold).backgroundColor,
color,
);
}

Color _colorFromName(String colorName) {
switch (colorName) {
case 'blue':
return Colors.blue;
case 'green':
return Colors.green;
case 'yellow':
return Colors.yellow;
default:
throw UnimplementedError('Unknown color: $colorName');
}
}
15 changes: 7 additions & 8 deletions lib/src/scenario_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -118,17 +118,16 @@ Iterable<BddLine> _processScenarioLines(
);

for (final line in lines.skip(1)) {
yield BddLine.fromValue(
line.type,
_replacePlaceholders(line.value, examples),
);
yield _replacePlaceholdersInLine(line, examples);
}
}

String _replacePlaceholders(String line, Map<String, String> example) {
var replaced = line;
BddLine _replacePlaceholdersInLine(BddLine line, Map<String, String> example) {
var replaced = line.value;
final isDataTable = line.type == LineType.dataTableStep;
for (final e in example.keys) {
replaced = replaced.replaceAll('<$e>', '{${example[e]}}');
final replaceWith = isDataTable ? '${example[e]}' : '{${example[e]}}';
replaced = replaced.replaceAll('<$e>', replaceWith);
}
return replaced;
return BddLine.fromValue(line.type, replaced);
}
51 changes: 51 additions & 0 deletions test/data_tables_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -485,4 +485,55 @@ Future<void> theFollowingSongs(WidgetTester tester, String param1, bdd.DataTable
expectedStep,
);
});

test('Scenario Outline with data table variables', () {
const featureFile = '''
Feature: Testing feature
Scenario Outline: Add and remove buttons work together
Given the app is running
When I tap add icon <times> times
Then I see result
| 'counter' | 'color' |
| <counter> | <color> |
Examples:
| times | counter | color |
| 20 | '20' | 'blue' |
| 25 | '25' | 'green' |
''';

const expectedFeatureDart = '''
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning

import 'package:bdd_widget_test/data_table.dart' as bdd;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import './step/the_app_is_running.dart';
import './step/i_tap_add_icon_times.dart';
import './step/i_see_result.dart';

void main() {
group(\'\'\'Testing feature\'\'\', () {
testWidgets(\'\'\'Outline: Add and remove buttons work together (20, '20', 'blue')\'\'\', (tester) async {
await theAppIsRunning(tester);
await iTapAddIconTimes(tester, 20);
await iSeeResult(tester, const bdd.DataTable([['counter', 'color'], ['20', 'blue']]));
});
testWidgets(\'\'\'Outline: Add and remove buttons work together (25, '25', 'green')\'\'\', (tester) async {
await theAppIsRunning(tester);
await iTapAddIconTimes(tester, 25);
await iSeeResult(tester, const bdd.DataTable([['counter', 'color'], ['25', 'green']]));
});
});
}
''';

final feature = FeatureFile(
featureDir: 'test.feature',
package: 'test',
input: featureFile,
);
expect(feature.dartContent, expectedFeatureDart);
});
}