@@ -29,27 +29,17 @@ String getStepFilename(String stepText) {
2929}
3030
3131String 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
4236String 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
5545String 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+ }
0 commit comments