1 /*
2 * Created by Phil on 13/5/2013.
3 * Copyright 2014 Two Blue Cubes Ltd. All rights reserved.
4 *
5 * Distributed under the Boost Software License, Version 1.0. (See accompanying
6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 */
8
9 #include "catch.hpp"
10 #include "internal/catch_test_spec_parser.hpp"
11
12 #ifdef __clang__
13 # pragma clang diagnostic ignored "-Wc++98-compat"
14 #endif
15
fakeTestCase(const char * name,const char * desc="")16 inline Catch::TestCase fakeTestCase( const char* name, const char* desc = "" ){ return Catch::makeTestCase( CATCH_NULL, "", name, desc, CATCH_INTERNAL_LINEINFO ); }
17
18 TEST_CASE( "Parse test names and tags", "" ) {
19
20 using Catch::parseTestSpec;
21 using Catch::TestSpec;
22
23 Catch::TestCase tcA = fakeTestCase( "a", "" );
24 Catch::TestCase tcB = fakeTestCase( "b", "[one][x]" );
25 Catch::TestCase tcC = fakeTestCase( "longer name with spaces", "[two][three][.][x]" );
26 Catch::TestCase tcD = fakeTestCase( "zlonger name with spacesz", "" );
27
28 SECTION( "Empty test spec should have no filters", "" ) {
29 TestSpec spec;
30 CHECK( spec.hasFilters() == false );
31 CHECK( spec.matches( tcA ) == false );
32 CHECK( spec.matches( tcB ) == false );
33 }
34
35 SECTION( "Test spec from empty string should have no filters", "" ) {
36 TestSpec spec = parseTestSpec( "" );
37 CHECK( spec.hasFilters() == false );
38 CHECK( spec.matches(tcA ) == false );
39 CHECK( spec.matches( tcB ) == false );
40 }
41
42 SECTION( "Test spec from just a comma should have no filters", "" ) {
43 TestSpec spec = parseTestSpec( "," );
44 CHECK( spec.hasFilters() == false );
45 CHECK( spec.matches( tcA ) == false );
46 CHECK( spec.matches( tcB ) == false );
47 }
48
49 SECTION( "Test spec from name should have one filter", "" ) {
50 TestSpec spec = parseTestSpec( "b" );
51 CHECK( spec.hasFilters() == true );
52 CHECK( spec.matches( tcA ) == false );
53 CHECK( spec.matches( tcB ) == true );
54 }
55
56 SECTION( "Test spec from quoted name should have one filter", "" ) {
57 TestSpec spec = parseTestSpec( "\"b\"" );
58 CHECK( spec.hasFilters() == true );
59 CHECK( spec.matches( tcA ) == false );
60 CHECK( spec.matches( tcB ) == true );
61 }
62
63 SECTION( "Test spec from name should have one filter", "" ) {
64 TestSpec spec = parseTestSpec( "b" );
65 CHECK( spec.hasFilters() == true );
66 CHECK( spec.matches( tcA ) == false );
67 CHECK( spec.matches( tcB ) == true );
68 CHECK( spec.matches( tcC ) == false );
69 }
70
71 SECTION( "Wildcard at the start", "" ) {
72 TestSpec spec = parseTestSpec( "*spaces" );
73 CHECK( spec.hasFilters() == true );
74 CHECK( spec.matches( tcA ) == false );
75 CHECK( spec.matches( tcB ) == false );
76 CHECK( spec.matches( tcC ) == true );
77 CHECK( spec.matches( tcD ) == false );
78 CHECK( parseTestSpec( "*a" ).matches( tcA ) == true );
79 }
80 SECTION( "Wildcard at the end", "" ) {
81 TestSpec spec = parseTestSpec( "long*" );
82 CHECK( spec.hasFilters() == true );
83 CHECK( spec.matches( tcA ) == false );
84 CHECK( spec.matches( tcB ) == false );
85 CHECK( spec.matches( tcC ) == true );
86 CHECK( spec.matches( tcD ) == false );
87 CHECK( parseTestSpec( "a*" ).matches( tcA ) == true );
88 }
89 SECTION( "Wildcard at both ends", "" ) {
90 TestSpec spec = parseTestSpec( "*name*" );
91 CHECK( spec.hasFilters() == true );
92 CHECK( spec.matches( tcA ) == false );
93 CHECK( spec.matches( tcB ) == false );
94 CHECK( spec.matches( tcC ) == true );
95 CHECK( spec.matches( tcD ) == true );
96 CHECK( parseTestSpec( "*a*" ).matches( tcA ) == true );
97 }
98 SECTION( "Redundant wildcard at the start", "" ) {
99 TestSpec spec = parseTestSpec( "*a" );
100 CHECK( spec.hasFilters() == true );
101 CHECK( spec.matches( tcA ) == true );
102 CHECK( spec.matches( tcB ) == false );
103 }
104 SECTION( "Redundant wildcard at the end", "" ) {
105 TestSpec spec = parseTestSpec( "a*" );
106 CHECK( spec.hasFilters() == true );
107 CHECK( spec.matches( tcA ) == true );
108 CHECK( spec.matches( tcB ) == false );
109 }
110 SECTION( "Redundant wildcard at both ends", "" ) {
111 TestSpec spec = parseTestSpec( "*a*" );
112 CHECK( spec.hasFilters() == true );
113 CHECK( spec.matches( tcA ) == true );
114 CHECK( spec.matches( tcB ) == false );
115 }
116 SECTION( "Wildcard at both ends, redundant at start", "" ) {
117 TestSpec spec = parseTestSpec( "*longer*" );
118 CHECK( spec.hasFilters() == true );
119 CHECK( spec.matches( tcA ) == false );
120 CHECK( spec.matches( tcB ) == false );
121 CHECK( spec.matches( tcC ) == true );
122 CHECK( spec.matches( tcD ) == true );
123 }
124 SECTION( "Just wildcard", "" ) {
125 TestSpec spec = parseTestSpec( "*" );
126 CHECK( spec.hasFilters() == true );
127 CHECK( spec.matches( tcA ) == true );
128 CHECK( spec.matches( tcB ) == true );
129 CHECK( spec.matches( tcC ) == true );
130 CHECK( spec.matches( tcD ) == true );
131 }
132
133 SECTION( "Single tag", "" ) {
134 TestSpec spec = parseTestSpec( "[one]" );
135 CHECK( spec.hasFilters() == true );
136 CHECK( spec.matches( tcA ) == false );
137 CHECK( spec.matches( tcB ) == true );
138 CHECK( spec.matches( tcC ) == false );
139 }
140 SECTION( "Single tag, two matches", "" ) {
141 TestSpec spec = parseTestSpec( "[x]" );
142 CHECK( spec.hasFilters() == true );
143 CHECK( spec.matches( tcA ) == false );
144 CHECK( spec.matches( tcB ) == true );
145 CHECK( spec.matches( tcC ) == true );
146 }
147 SECTION( "Two tags", "" ) {
148 TestSpec spec = parseTestSpec( "[two][x]" );
149 CHECK( spec.hasFilters() == true );
150 CHECK( spec.matches( tcA ) == false );
151 CHECK( spec.matches( tcB ) == false );
152 CHECK( spec.matches( tcC ) == true );
153 }
154 SECTION( "Two tags, spare separated", "" ) {
155 TestSpec spec = parseTestSpec( "[two] [x]" );
156 CHECK( spec.hasFilters() == true );
157 CHECK( spec.matches( tcA ) == false );
158 CHECK( spec.matches( tcB ) == false );
159 CHECK( spec.matches( tcC ) == true );
160 }
161 SECTION( "Wildcarded name and tag", "" ) {
162 TestSpec spec = parseTestSpec( "*name*[x]" );
163 CHECK( spec.hasFilters() == true );
164 CHECK( spec.matches( tcA ) == false );
165 CHECK( spec.matches( tcB ) == false );
166 CHECK( spec.matches( tcC ) == true );
167 CHECK( spec.matches( tcD ) == false );
168 }
169 SECTION( "Single tag exclusion", "" ) {
170 TestSpec spec = parseTestSpec( "~[one]" );
171 CHECK( spec.hasFilters() == true );
172 CHECK( spec.matches( tcA ) == true );
173 CHECK( spec.matches( tcB ) == false );
174 CHECK( spec.matches( tcC ) == true );
175 }
176 SECTION( "One tag exclusion and one tag inclusion", "" ) {
177 TestSpec spec = parseTestSpec( "~[two][x]" );
178 CHECK( spec.hasFilters() == true );
179 CHECK( spec.matches( tcA ) == false );
180 CHECK( spec.matches( tcB ) == true );
181 CHECK( spec.matches( tcC ) == false );
182 }
183 SECTION( "One tag exclusion and one wldcarded name inclusion", "" ) {
184 TestSpec spec = parseTestSpec( "~[two]*name*" );
185 CHECK( spec.hasFilters() == true );
186 CHECK( spec.matches( tcA ) == false );
187 CHECK( spec.matches( tcB ) == false );
188 CHECK( spec.matches( tcC ) == false );
189 CHECK( spec.matches( tcD ) == true );
190 }
191 SECTION( "One tag exclusion, using exclude:, and one wldcarded name inclusion", "" ) {
192 TestSpec spec = parseTestSpec( "exclude:[two]*name*" );
193 CHECK( spec.hasFilters() == true );
194 CHECK( spec.matches( tcA ) == false );
195 CHECK( spec.matches( tcB ) == false );
196 CHECK( spec.matches( tcC ) == false );
197 CHECK( spec.matches( tcD ) == true );
198 }
199 SECTION( "name exclusion", "" ) {
200 TestSpec spec = parseTestSpec( "~b" );
201 CHECK( spec.hasFilters() == true );
202 CHECK( spec.matches( tcA ) == true );
203 CHECK( spec.matches( tcB ) == false );
204 CHECK( spec.matches( tcC ) == true );
205 CHECK( spec.matches( tcD ) == true );
206 }
207 SECTION( "wildcarded name exclusion", "" ) {
208 TestSpec spec = parseTestSpec( "~*name*" );
209 CHECK( spec.hasFilters() == true );
210 CHECK( spec.matches( tcA ) == true );
211 CHECK( spec.matches( tcB ) == true );
212 CHECK( spec.matches( tcC ) == false );
213 CHECK( spec.matches( tcD ) == false );
214 }
215 SECTION( "wildcarded name exclusion with tag inclusion", "" ) {
216 TestSpec spec = parseTestSpec( "~*name*,[three]" );
217 CHECK( spec.hasFilters() == true );
218 CHECK( spec.matches( tcA ) == true );
219 CHECK( spec.matches( tcB ) == true );
220 CHECK( spec.matches( tcC ) == true );
221 CHECK( spec.matches( tcD ) == false );
222 }
223 SECTION( "wildcarded name exclusion, using exclude:, with tag inclusion", "" ) {
224 TestSpec spec = parseTestSpec( "exclude:*name*,[three]" );
225 CHECK( spec.hasFilters() == true );
226 CHECK( spec.matches( tcA ) == true );
227 CHECK( spec.matches( tcB ) == true );
228 CHECK( spec.matches( tcC ) == true );
229 CHECK( spec.matches( tcD ) == false );
230 }
231 SECTION( "two wildcarded names", "" ) {
232 TestSpec spec = parseTestSpec( "\"longer*\"\"*spaces\"" );
233 CHECK( spec.hasFilters() == true );
234 CHECK( spec.matches( tcA ) == false );
235 CHECK( spec.matches( tcB ) == false );
236 CHECK( spec.matches( tcC ) == true );
237 CHECK( spec.matches( tcD ) == false );
238 }
239 SECTION( "empty tag", "" ) {
240 TestSpec spec = parseTestSpec( "[]" );
241 CHECK( spec.hasFilters() == false );
242 CHECK( spec.matches( tcA ) == false );
243 CHECK( spec.matches( tcB ) == false );
244 CHECK( spec.matches( tcC ) == false );
245 CHECK( spec.matches( tcD ) == false );
246 }
247 SECTION( "empty quoted name", "" ) {
248 TestSpec spec = parseTestSpec( "\"\"" );
249 CHECK( spec.hasFilters() == false );
250 CHECK( spec.matches( tcA ) == false );
251 CHECK( spec.matches( tcB ) == false );
252 CHECK( spec.matches( tcC ) == false );
253 CHECK( spec.matches( tcD ) == false );
254 }
255 SECTION( "quoted string followed by tag exclusion", "" ) {
256 TestSpec spec = parseTestSpec( "\"*name*\"~[.]" );
257 CHECK( spec.hasFilters() == true );
258 CHECK( spec.matches( tcA ) == false );
259 CHECK( spec.matches( tcB ) == false );
260 CHECK( spec.matches( tcC ) == false );
261 CHECK( spec.matches( tcD ) == true );
262 }
263
264 }
265