Skip to content

Commit 812d1a7

Browse files
authored
Merge pull request #1681 from east1k/main
Fix issue #1680
2 parents d36d52e + 47363f0 commit 812d1a7

File tree

2 files changed

+21
-29
lines changed

2 files changed

+21
-29
lines changed

src/NUnitEngine/nunit.engine.tests/Services/TestSelectionParserTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ public void TestParser_InvalidInput(string input, Type type)
8787
new TestCaseData("test=My.Test.Fixture.Method(\"<xyz>\")", "<test>My.Test.Fixture.Method(&quot;&lt;xyz&gt;&quot;)</test>"),
8888
new TestCaseData("test==Issue1510.TestSomething ( Option1 , \"ABC\" ) ", "<test>Issue1510.TestSomething(Option1,&quot;ABC&quot;)</test>"),
8989
new TestCaseData("test==Issue1510.TestSomething ( Option1 , \"A B C\" ) ", "<test>Issue1510.TestSomething(Option1,&quot;A B C&quot;)</test>"),
90+
new TestCaseData("test == namespace.class(1).test1(1)", "<test>namespace.class(1).test1(1)</test>"),
91+
new TestCaseData("test == \"namespace.class(1).test1(1)\"", "<test>namespace.class(1).test1(1)</test>"),
92+
new TestCaseData("test == 'namespace.class(1).test1(1)'", "<test>namespace.class(1).test1(1)</test>"),
93+
new TestCaseData("test =~ \"(namespace\\.test1\\(1\\)|namespace\\.test2\\(2\\))\"", "<test re='1'>(namespace.test1(1)|namespace.test2(2))</test>"),
94+
new TestCaseData("test =~ '(namespace\\.test1\\(1\\)|namespace\\.test2\\(2\\))'", "<test re='1'>(namespace.test1(1)|namespace.test2(2))</test>"),
95+
new TestCaseData("test =~ /(namespace\\.test1\\(1\\)|namespace\\.test2\\(2\\))/", "<test re='1'>(namespace.test1(1)|namespace.test2(2))</test>"),
96+
new TestCaseData("test =~ \"(namespace1|namespace2)\\.test1\"", "<test re='1'>(namespace1|namespace2).test1</test>"),
97+
new TestCaseData("test =~ '(namespace1|namespace2)\\.test1'", "<test re='1'>(namespace1|namespace2).test1</test>"),
98+
new TestCaseData("test =~ /(namespace1|namespace2)\\.test1/", "<test re='1'>(namespace1|namespace2).test1</test>"),
99+
new TestCaseData("test='My.Test.Fixture.Method(\" A \\\\\" B \\\\\" C \")'", "<test>My.Test.Fixture.Method(&quot; A \\&quot; B \\&quot; C &quot;)</test>"),
90100
// And Filter
91101
new TestCaseData("cat==Urgent && test=='My.Tests'", "<and><cat>Urgent</cat><test>My.Tests</test></and>"),
92102
new TestCaseData("cat==Urgent and test=='My.Tests'", "<and><cat>Urgent</cat><test>My.Tests</test></and>"),

src/NUnitEngine/nunit.engine/Services/TestSelectionParser.cs

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@ public string ParseFilterElement()
125125
{
126126
case "test":
127127
op = Expect(REL_OPS);
128-
rhs = GetTestName();
128+
rhs = op == MATCH_OP || op == NOMATCH_OP
129+
? Expect(TokenKind.String, TokenKind.Word)
130+
: GetTestName();
129131
return EmitFilterElement(lhs, op, rhs);
130132

131133
case "cat":
@@ -163,35 +165,15 @@ private Token GetTestName()
163165

164166
if (result.Kind == TokenKind.String)
165167
{
166-
int index = result.Text.IndexOf('(');
167-
168-
if (index < 0)
169-
return result;
170-
171-
// Remove white space around arguments
172-
string testName = result.Text;
173-
sb = new StringBuilder(testName.Substring(0, index).Trim());
174-
sb.Append('(');
175-
bool done = false;
176-
177-
while (++index < testName.Length && !done)
168+
var inQuotes = false;
169+
var inEscape = false;
170+
foreach (var ch in result.Text)
178171
{
179-
char ch = testName[index];
180-
switch (ch)
181-
{
182-
case '"':
183-
sb.Append(ch);
184-
while (++index < testName.Length && testName[index] != '"')
185-
sb.Append(testName[index]);
186-
sb.Append('"');
187-
break;
188-
case ' ':
189-
break;
190-
default:
191-
sb.Append(ch);
192-
done = ch == ')';
193-
break;
194-
}
172+
if (ch == ' ' && !inQuotes)
173+
continue;
174+
sb.Append(ch);
175+
inQuotes = (!inQuotes && ch == '"') || (inQuotes && ch != '"') || (inQuotes && ch == '"' && inEscape);
176+
inEscape = inQuotes && !inEscape && ch == '\\';
195177
}
196178
}
197179
else

0 commit comments

Comments
 (0)