1 #include <ctre.hpp>
2 
empty_symbol()3 void empty_symbol() { }
4 
5 using namespace ctre::test_literals;
6 
7 #if !CTRE_CNTTP_COMPILER_CHECK
8 #define CTRE_TEST(pattern) (pattern ## _ctre_test)
9 #else
10 
test()11 template <ctll::fixed_string input> constexpr bool test() {
12 	constexpr auto _input = input;
13 	return ctll::parser<ctre::pcre, _input>::template correct_with<>;
14 }
15 
16 #define CTRE_TEST(pattern) test<pattern>()
17 #endif
18 
19 
20 // basics
21 static_assert(CTRE_TEST(""));
22 static_assert(CTRE_TEST("."));
23 static_assert(CTRE_TEST("a"));
24 static_assert(CTRE_TEST("ab"));
25 static_assert(CTRE_TEST("a|b"));
26 static_assert(CTRE_TEST("n"));
27 
28 // repetation
29 static_assert(CTRE_TEST("x?")); // optional
30 static_assert(CTRE_TEST("x??")); // optional lazy
31 static_assert(CTRE_TEST("x*"));
32 static_assert(CTRE_TEST("x*+"));
33 static_assert(CTRE_TEST("x*?"));
34 static_assert(CTRE_TEST("x+"));
35 static_assert(CTRE_TEST("x++"));
36 static_assert(CTRE_TEST("x+?"));
37 static_assert(CTRE_TEST("x{1}"));
38 static_assert(CTRE_TEST("x{1,4}"));
39 static_assert(CTRE_TEST("x{1,4}+"));
40 static_assert(CTRE_TEST("x{1,4}?"));
41 static_assert(CTRE_TEST("x{1,}"));
42 static_assert(CTRE_TEST("x{1,}+"));
43 static_assert(CTRE_TEST("x{1,}?"));
44 
45 // character sets
46 static_assert(CTRE_TEST("[abc]")); // [abc]
47 static_assert(CTRE_TEST("[a-c]")); // [abc]
48 static_assert(CTRE_TEST("[a-ce-g]")); // [abcefg]
49 static_assert(CTRE_TEST("[xa-c]")); // [xabc]
50 static_assert(CTRE_TEST("[a-cy]")); // [abcy]
51 static_assert(CTRE_TEST("\\d")); // digit
52 static_assert(CTRE_TEST("\\D")); // non-digit
53 static_assert(CTRE_TEST("\\s")); // whitespace
54 static_assert(CTRE_TEST("\\S")); // non-whitespace
55 static_assert(CTRE_TEST("\\w")); // word character
56 static_assert(CTRE_TEST("\\W")); // non-word character
57 
58 // assertions
59 static_assert(CTRE_TEST("^"));
60 static_assert(CTRE_TEST("$"));
61 
62 // special characters
63 static_assert(CTRE_TEST("\\n")); // new line
64 static_assert(CTRE_TEST("\\r")); // return carriage
65 static_assert(CTRE_TEST("\\t")); // tab
66 static_assert(CTRE_TEST("\\0")); // NULL
67 static_assert(CTRE_TEST("\\xAB"));
68 static_assert(CTRE_TEST("\\x{A}"));
69 static_assert(CTRE_TEST("\\x{ABCDEF}"));
70 static_assert(not CTRE_TEST("\\x{ABCDEFG}"));
71 
72 // named sets
73 static_assert(CTRE_TEST("[[:alpha:][:digit:]]"));
74 static_assert(CTRE_TEST("[^[:alpha:][:digit:]]"));
75 static_assert(CTRE_TEST("[[:^alpha:][:^digit:]]"));
76 static_assert(CTRE_TEST("[[:alpha:][:digit:]]+"));
77 
78 // captures
79 static_assert(CTRE_TEST("<not capture>"));
80 static_assert(CTRE_TEST("(nonname)"));
81 static_assert(CTRE_TEST("(non<name>)"));
82 static_assert(CTRE_TEST("(?:noncapture)"));
83 static_assert(CTRE_TEST("(?:non<cap>ture)"));
84 static_assert(CTRE_TEST("(?<hello>:named)"));
85 
86 // LIBC++ tests
87 static_assert(CTRE_TEST(""));
88 static_assert(CTRE_TEST("(.*).*"));
89 static_assert(CTRE_TEST("(?=^)b")); // positive lookahead
90 static_assert(CTRE_TEST("(a*)*"));
91 static_assert(CTRE_TEST("(ab)*c"));
92 static_assert(CTRE_TEST("(tour|to|t)+"));
93 static_assert(CTRE_TEST("(tour|to|tournament)+"));
94 static_assert(CTRE_TEST("(tour|to|tournament)+\ntourna"));
95 static_assert(CTRE_TEST("-.*,.*-"));
96 
97 static_assert(CTRE_TEST("-\\(.*\\),\\1-"));
98 static_assert(CTRE_TEST("A[[:lower:]]B"));
99 static_assert(CTRE_TEST("A[^[:lower:]0-9]B"));
100 static_assert(CTRE_TEST("A[^[:lower:]]B"));
101 //static_assert(CTRE_TEST("Jeff(?!s\\b)")); // negative lookahead
102 //static_assert(CTRE_TEST("Jeff(?=s\\b)")); // positive lookahead
103 static_assert(CTRE_TEST("[\\n]+"));
104 static_assert(CTRE_TEST("[^\\0]*"));
105 static_assert(CTRE_TEST("[^\\W]"));
106 //static_assert(CTRE_TEST("[a[.ch.]z]"));
107 //static_assert(CTRE_TEST("[a[.hyphen.]z]"));
108 //static_assert(CTRE_TEST("[a[=M=]z]"));
109 static_assert(CTRE_TEST("[abfor]*"));
110 static_assert(CTRE_TEST("[ace1-9]*"));
111 static_assert(CTRE_TEST("[ace1-9]+"));
112 static_assert(CTRE_TEST("[ace1-9]\\{1,\\}"));
113 static_assert(CTRE_TEST("[ace1-9]{1,}"));
114 static_assert(CTRE_TEST("\\(.*\\).*"));
115 static_assert(CTRE_TEST("\\(a*\\)*"));
116 static_assert(CTRE_TEST("\\(ab\\)*c"));
117 static_assert(CTRE_TEST("\\d[\\W]k"));
118 static_assert(CTRE_TEST("^[a-f]$"));
119 static_assert(CTRE_TEST("^[a]$"));
120 static_assert(CTRE_TEST("^[ab]$"));
121 static_assert(CTRE_TEST("/"));
122 static_assert(CTRE_TEST("[/]"));
123 static_assert(CTRE_TEST("[\\[]"));
124 static_assert(CTRE_TEST("[\\[-a]"));
125 static_assert(CTRE_TEST("[\\[-\\[]"));
126 static_assert(CTRE_TEST("[/-/]"));
127 static_assert(CTRE_TEST("[!-/]"));
128 static_assert(CTRE_TEST("[|]"));
129 static_assert(CTRE_TEST("^abc"));
130 static_assert(CTRE_TEST("a"));
131 static_assert(CTRE_TEST("a(?=^)b")); // positive lookahead
132 static_assert(CTRE_TEST("a*"));
133 static_assert(CTRE_TEST("a*?"));
134 static_assert(CTRE_TEST("a.\\{3,5\\}c"));
135 static_assert(CTRE_TEST("a.c"));
136 static_assert(CTRE_TEST("a.{3,5}c"));
137 static_assert(CTRE_TEST("a\\{100000000000000000\\}"));
138 static_assert(CTRE_TEST("ab"));
139 static_assert(CTRE_TEST("ab*c"));
140 static_assert(CTRE_TEST("ab\\{3,5\\}c"));
141 static_assert(CTRE_TEST("abc$"));
142 static_assert(CTRE_TEST("ab{3,5}c"));
143 static_assert(CTRE_TEST("a{100000000000000000}"));
144 static_assert(CTRE_TEST("b*"));
145 static_assert(CTRE_TEST("ba"));
146 static_assert(CTRE_TEST("bc"));
147 static_assert(CTRE_TEST("cd((e)fg)hi"));
148 static_assert(CTRE_TEST("cd((e)fg)hi|(z)"));
149 static_assert(CTRE_TEST("cd\\(\\(e\\)fg\\)hi"));
150 static_assert(CTRE_TEST("cdefghi"));
151 static_assert(CTRE_TEST("q[^u]"));
152 static_assert(CTRE_TEST("tour\n\ntournament"));
153 static_assert(CTRE_TEST("tour\nto\ntournament"));
154 static_assert(CTRE_TEST("tour|to|tournament"));
155 static_assert(CTRE_TEST("z"));
156 static_assert(CTRE_TEST("=!"));
157 static_assert(CTRE_TEST("[=!]"));
158 static_assert(CTRE_TEST("(=!)"));
159 static_assert(CTRE_TEST("(?!test)"));
160 static_assert(CTRE_TEST("(?=test)"));
161 static_assert(CTRE_TEST("^(?=.*(.)\\g{1}+.*)[a-z]+"));
162 static_assert(CTRE_TEST("^(?=.*(a)\\g{1}.*)$"));
163 
164 static_assert(CTRE_TEST("\\b"));
165 static_assert(CTRE_TEST("\\A"));
166 static_assert(!CTRE_TEST("[\\A]"));
167 static_assert(!CTRE_TEST("\\i")); // this is not existing backslash
168 static_assert(CTRE_TEST("(.*)\\1"));
169 
170 
171