forked from VSoftTechnologies/DUnitX
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDUnitX.TestNameParser.pas
More file actions
129 lines (114 loc) · 3.99 KB
/
DUnitX.TestNameParser.pas
File metadata and controls
129 lines (114 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
{***************************************************************************}
{ }
{ DUnitX }
{ }
{ Copyright (C) 2013 Vincent Parrett }
{ }
{ vincent@finalbuilder.com }
{ http://www.finalbuilder.com }
{ }
{ }
{***************************************************************************}
{ }
{ Licensed under the Apache License, Version 2.0 (the "License"); }
{ you may not use this file except in compliance with the License. }
{ You may obtain a copy of the License at }
{ }
{ http://www.apache.org/licenses/LICENSE-2.0 }
{ }
{ Unless required by applicable law or agreed to in writing, software }
{ distributed under the License is distributed on an "AS IS" BASIS, }
{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. }
{ See the License for the specific language governing permissions and }
{ limitations under the License. }
{ }
{ This unit is largely a port of the NUnit TestNameParser class }
{ Copyright © 2012-2014 Charlie Poole }
{ License : http://nunit.org/index.php?p=vsTestAdapterLicense&r=2.6.3 }
{ }
{***************************************************************************}
unit DUnitX.TestNameParser;
interface
{$I DUnitX.inc}
type
TTestNameParser = class
private
class function GetTestName(const arg : string; var index : integer) : string;
class function GetSeparator(const arg : string; index : integer) : integer;
public
class function Parse(const arg : string) : TArray<string>;
end;
implementation
uses
SysUtils,
Classes,
DUnitX.Utils,
Generics.Collections;
{ TTestNameParser }
class function TTestNameParser.GetSeparator(const arg: string; index: integer): integer;
var
nest : integer;
begin
nest := 0;
result := -1;
while index < Length(arg) do
begin
case arg[index] of
',' :
begin
if nest = 0 then
exit(index);
end;
'"' :
begin
Inc(index);
while (index < Length(arg)) and (arg[index] <> '"') do
Inc(index);
end;
'(','<' : Inc(nest);
')','>' : Dec(nest);
end;
Inc(index)
end;
end;
class function TTestNameParser.GetTestName(const arg: string; var index: integer): string;
var
sep : integer;
begin
result := '';
sep := GetSeparator(arg,index);
if sep > 0 then
begin
result := Trim(Copy(arg,index, sep - index));
index := sep +1;
end
else
begin
result := Trim(Copy(arg,index, Length(arg)));
index := Length(arg);
end;
end;
class function TTestNameParser.Parse(const arg: string): TArray<string>;
var
sList : TList<string>;
i : integer;
sName : string;
begin
sList := TList<string>.Create;
try
if arg <> '' then
begin
i := 1;
while i < Length(arg) do
begin
sName := GetTestName(arg,i);
if sName <> '' then
sList.Add(sName);
end;
end;
result := TListStringUtils.ToArray(sList);
finally
sList.Free;
end;
end;
end.