Skip to content

Commit 75de4ae

Browse files
authored
Merge pull request #33 from olexale/nested_braces
Fix #22
2 parents b8318bf + f7c183f commit 75de4ae

5 files changed

Lines changed: 64 additions & 21 deletions

File tree

.github/workflows/dart.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ jobs:
2626
- name: 🛠 Install dependencies
2727
run: flutter pub get
2828

29+
- name: 👨‍🎨 Validate formatting
30+
run: flutter format --set-exit-if-changed lib test
31+
2932
- name: 🕵️‍♀️ Analyze project source
3033
run: flutter analyze . --fatal-infos
3134

lib/src/regex.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
final parametersRegExp = RegExp(r'\{(.*?)\}', caseSensitive: false);
21
final examplesRegExp = RegExp(r'\<(.*?)\>', caseSensitive: false);
32
final charactersAndNumbersRegExp = RegExp(r'[^\w\s\d]+');
43
final repeatingSpacesRegExp = RegExp(r'\s+');
5-
final parametersValueRegExp = RegExp(r'(?<=\{).+?(?=\})', caseSensitive: false);

lib/src/step/generic_step.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:bdd_widget_test/src/regex.dart';
22
import 'package:bdd_widget_test/src/step/bdd_step.dart';
3+
import 'package:bdd_widget_test/src/step_generator.dart';
34

45
class GenericStep implements BddStep {
56
GenericStep(this.methodName, this.rawLine);
@@ -17,7 +18,7 @@ ${getStepSignature(rawLine)} {
1718
''';
1819

1920
String getStepSignature(String stepLine) {
20-
final params = parametersRegExp.allMatches(stepLine);
21+
final params = parseRawStepLine(stepLine).skip(1);
2122
if (params.isEmpty) {
2223
final examples = examplesRegExp.allMatches(stepLine);
2324
if (examples.isEmpty) {

lib/src/step_generator.dart

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,17 @@ String getStepFilename(String stepText) {
2929
}
3030

3131
String getStepMethodName(String stepText) {
32-
final text = removeDiacritics(stepText)
33-
.replaceAll(parametersRegExp, '')
34-
.replaceAll(examplesRegExp, '')
35-
.replaceAll(charactersAndNumbersRegExp, '')
36-
.replaceAll(repeatingSpacesRegExp, ' ')
37-
.trim()
38-
.replaceAll(' ', '_');
39-
return camelize(text);
32+
final step = parseRawStepLine(stepText).first;
33+
return _camelizedString(step);
4034
}
4135

4236
String getStepMethodCall(String stepLine, {List<String>? forceParams}) {
43-
final name = getStepMethodName(stepLine);
44-
45-
final params = parametersValueRegExp.allMatches(stepLine);
46-
if (params.isEmpty && forceParams == null) {
47-
return '$name(tester)';
48-
}
49-
50-
final methodParameters =
51-
forceParams ?? params.map((p) => p.group(0)).join(', ');
52-
return '$name(tester, $methodParameters)';
37+
final step = parseRawStepLine(stepLine);
38+
final parameters = [
39+
'tester',
40+
if (forceParams != null) ...forceParams else ...step.skip(1)
41+
].join(', ');
42+
return '${_camelizedString(step[0])}($parameters)';
5343
}
5444

5545
String generateStepDart(String package, String line) {
@@ -85,3 +75,51 @@ final predefinedSteps = <String, BddStep Function(String, String)>{
8575
'iTapText': (_, __) => ITapText(),
8676
'iWait': (_, __) => IWait(),
8777
};
78+
79+
/// Return an array of Strings where first element is the step name and the rest
80+
/// are parameters.
81+
List<String> parseRawStepLine(String stepLine) {
82+
final name = StringBuffer();
83+
final parameters = <String>[];
84+
final parameter = StringBuffer();
85+
86+
var bracketsNesting = 0;
87+
for (var i = 0; i < stepLine.length; ++i) {
88+
final c = stepLine[i];
89+
if (c == '{') {
90+
// this is needed for cases when there is { inside parameter, like
91+
// When I run {func foo(){} func bar() {print('hey');}} code
92+
bracketsNesting++;
93+
if (bracketsNesting == 1) {
94+
// Found a parameter, skipping adding {
95+
continue;
96+
}
97+
}
98+
if (c == '}') {
99+
bracketsNesting--;
100+
if (bracketsNesting == 0) {
101+
// The end of the parameter, flushing the value, skiping }
102+
parameters.add(parameter.toString());
103+
parameter.clear();
104+
continue;
105+
}
106+
}
107+
108+
if (bracketsNesting == 0) {
109+
name.write(c);
110+
} else {
111+
parameter.write(c);
112+
}
113+
}
114+
return [name.toString(), ...parameters];
115+
}
116+
117+
String _camelizedString(String input) {
118+
final text = removeDiacritics(input)
119+
.replaceAll(examplesRegExp, '')
120+
.replaceAll(charactersAndNumbersRegExp, '')
121+
.replaceAll(repeatingSpacesRegExp, ' ')
122+
.trim()
123+
.replaceAll(' ', '_');
124+
return camelize(text);
125+
}

test/full_set_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Feature: Counter
1212
And _I do not see {'42'} text
1313
Scenario: Initial counter value is 0
1414
Given the app is running
15+
And I run {'func foo() {}; func bar() { print("hey!"); };'} code
1516
Then I see {'0'} text
1617
''';
1718

@@ -24,6 +25,7 @@ import 'package:flutter_test/flutter_test.dart';
2425
2526
import './step/the_app_is_running.dart';
2627
import './step/_i_do_not_see_text.dart';
28+
import './step/i_run_code.dart';
2729
import 'package:bdd_sample/i_see_text.dart';
2830
2931
void main() {
@@ -38,6 +40,7 @@ void main() {
3840
try {
3941
await bddSetUp(tester);
4042
await theAppIsRunning(tester);
43+
await iRunCode(tester, 'func foo() {}; func bar() { print("hey!"); };');
4144
await iSeeText(tester, '0');
4245
} finally {
4346
await bddTearDown(tester);

0 commit comments

Comments
 (0)