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