15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2006-2007 The RE2 Authors.  All Rights Reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// license that can be found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/test.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "re2/prog.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "re2/regexp.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "re2/testing/tester.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "re2/testing/exhaustive_tester.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace re2 {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct RegexpTest {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* regexp;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* text;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RegexpTest simple_tests[] = {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "a" },
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "zyzzyva" },
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a+", "aa" },
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(a+|b)+", "ab" },
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "ab|cd", "xabcdx" },
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "h.*od?", "hello\ngoodbye\n" },
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "h.*o", "hello\ngoodbye\n" },
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "h.*o", "goodbye\nhello\n" },
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "h.*o", "hello world" },
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "h.*o", "othello, world" },
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[^\\s\\S]", "aaaaaaa" },
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "aaaaaaa" },
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a*", "aaaaaaa" },
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a*", "" },
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a*", NULL },
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "ab|cd", "xabcdx" },
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "cab" },
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a*b", "cab" },
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "((((((((((((((((((((x))))))))))))))))))))", "x" },
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[abcd]", "xxxabcdxxx" },
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[^x]", "xxxabcdxxx" },
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[abcd]+", "xxxabcdxxx" },
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[^x]+", "xxxabcdxxx" },
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(fo|foo)", "fo" },
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|fo)", "foo" },
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "aa", "aA" },
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "Aa" },
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "A" },
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "ABC", "abc" },
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "abc", "XABCY" },
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "ABC", "xabcy" },
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure ^ and $ work.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pathological cases didn't work
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the original grep code.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "foo|bar|[A-Z]", "foo" },
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo|bar|[A-Z])", "foo" },
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|bar|[A-Z])$", "foo\n" },
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|bar|[A-Z])$", "foo" },
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo|bar|[A-Z])$", "foo\n" },
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo|bar|[A-Z])$", "foo" },
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo|bar|[A-Z])$", "bar" },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo|bar|[A-Z])$", "X" },
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo|bar|[A-Z])$", "XY" },
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(fo|foo)$", "fo" },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(fo|foo)$", "foo" },
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^(fo|foo)$", "fo" },
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^(fo|foo)$", "foo" },
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$", "" },
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$", "x" },
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^$", "" },
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$$", "" },
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^$", "x" },
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$$", "x" },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^$$", "" },
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^$$", "x" },
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^$$$$$$$$", "" },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^", "x" },
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "$", "x" },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Word boundaries.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bfoo\\b", "nofoo foo that" },
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a\\b", "faoa x" },
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bbar", "bar x" },
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bbar", "foo\nbar x" },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "bar\\b", "foobar" },
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "bar\\b", "foobar\nxxx" },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|bar|[A-Z])\\b", "foo" },
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|bar|[A-Z])\\b", "foo\n" },
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b", "" },
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b", "x" },
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])", "foo" },
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])\\b", "X" },
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])\\b", "XY" },
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])\\b", "bar" },
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])\\b", "foo" },
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])\\b", "foo\n" },
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(foo|bar|[A-Z])\\b", "ffoo bbar N x" },
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(fo|foo)\\b", "fo" },
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b(fo|foo)\\b", "foo" },
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b\\b", "" },
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b\\b", "x" },
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b$", "" },
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b$", "x" },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b$", "y x" },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\b.$", "x" },
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b(fo|foo)\\b", "fo" },
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b(fo|foo)\\b", "foo" },
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b", "" },
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b", "x" },
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b\\b", "" },
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b\\b", "x" },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b$", "" },
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b$", "x" },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b.$", "x" },
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\b.\\b$", "x" },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^\\b$$$$$$$", "" },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^\\b.$$$$$$", "x" },
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^\\b$$$$$$$", "x" },
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Non-word boundaries.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\Bfoo\\B", "n foo xfoox that" },
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a\\B", "faoa x" },
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\Bbar", "bar x" },
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\Bbar", "foo\nbar x" },
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "bar\\B", "foobar" },
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "bar\\B", "foobar\nxxx" },
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|bar|[A-Z])\\B", "foox" },
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo|bar|[A-Z])\\B", "foo\n" },
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B", "" },
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B", "x" },
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])", "foo" },
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "xXy" },
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "XY" },
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "XYZ" },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "abara" },
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "xfoo_" },
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "xfoo\n" },
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|bar|[A-Z])\\B", "foo bar vNx" },
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(fo|foo)\\B", "xfoo" },
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(foo|fo)\\B", "xfooo" },
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B\\B", "" },
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B\\B", "x" },
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B$", "" },
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B$", "x" },
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B$", "y x" },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B.$", "x" },
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B(fo|foo)\\B", "fo" },
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B(fo|foo)\\B", "foo" },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B", "" },
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B", "x" },
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B\\B", "" },
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B\\B", "x" },
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B$", "" },
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B$", "x" },
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B.$", "x" },
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\B.\\B$", "x" },
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^\\B$$$$$$$", "" },
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^\\B.$$$$$$", "x" },
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^^^^^^^\\B$$$$$$$", "x" },
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PCRE uses only ASCII for \b computation.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All non-ASCII are *not* word characters.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "x" },
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "x>" },
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "<x" },
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "<x>" },
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "ax" },
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "xb" },
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "axb" },
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "«x" },
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "x»" },
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "«x»" },
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "axb" },
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\bx\\b", "áxβ" },
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\Bx\\B", "axb" },
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\Bx\\B", "áxβ" },
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weird boundary cases.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^$", "" },
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^", "" },
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "$^$", "" },
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^$", "x" },
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^", "x" },
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "$^$", "x" },
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^$", "x\ny" },
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^", "x\ny" },
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "$^$", "x\ny" },
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^$", "x\n\ny" },
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^$^", "x\n\ny" },
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "$^$", "x\n\ny" },
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^(foo\\$)$", "foo$bar" },
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(foo\\$)", "foo$bar" },
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^...$", "abc" },
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTF-8
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\xe6\x9c\xac$", "\xe6\x9c\xac" },
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^...$", "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" },
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^...$", ".\xe6\x9c\xac." },
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\C\\C\\C$", "\xe6\x9c\xac" },
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\C$", "\xe6\x9c\xac" },
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^\\C\\C\\C$", "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" },
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Latin1
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^...$", "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" },
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^.........$", "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^...$", ".\xe6\x9c\xac." },
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^.....$", ".\xe6\x9c\xac." },
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perl v Posix
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\B(fo|foo)\\B", "xfooo" },
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(fo|foo)", "foo" },
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Octal escapes.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\141", "a" },
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\060", "0" },
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\0600", "00" },
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\608", "08" },
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\01", "\01" },
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\018", "\01" "8" },
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hexadecimal escapes
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\x{61}", "a" },
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\x61", "a" },
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\x{00000061}", "a" },
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unicode scripts.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{Greek}+", "aαβb" },
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\P{Greek}+", "aαβb" },
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{^Greek}+", "aαβb" },
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\P{^Greek}+", "aαβb" },
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unicode properties.  Nd is decimal number.  N is any number.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[^0-9]+",  "abc123" },
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{Nd}+", "abc123²³¼½¾₀₉" },
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{^Nd}+", "abc123²³¼½¾₀₉" },
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\P{Nd}+", "abc123²³¼½¾₀₉" },
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\P{^Nd}+", "abc123²³¼½¾₀₉" },
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\pN+", "abc123²³¼½¾₀₉" },
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{N}+", "abc123²³¼½¾₀₉" },
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{^N}+", "abc123²³¼½¾₀₉" },
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "\\p{Any}+", "abc123" },
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Character classes & case folding.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?i)[@-A]+", "@AaB" },  // matches @Aa but not B
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?i)[A-Z]+", "aAzZ" },
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?i)[^\\\\]+", "Aa\\" },  // \\ is between A-Z and a-z -
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               // splits the ranges in an interesting way.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // would like to use, but PCRE mishandles in full-match, non-greedy mode
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // { "(?i)[\\\\]+", "Aa" },
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?i)[acegikmoqsuwy]+", "acegikmoqsuwyACEGIKMOQSUWY" },
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Character classes & case folding.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[@-A]+", "@AaB" },
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[A-Z]+", "aAzZ" },
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[^\\\\]+", "Aa\\" },
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[acegikmoqsuwy]+", "acegikmoqsuwyACEGIKMOQSUWY" },
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Anchoring.  (^abc in aabcdef was a former bug)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tester checks for a match in the text and
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // subpieces of the text with a byte removed on either side.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^abc", "abcdef" },
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^abc", "aabcdef" },
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^[ay]*[bx]+c", "abcdef" },
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^[ay]*[bx]+c", "aabcdef" },
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "def$", "abcdef" },
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "def$", "abcdeff" },
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "d[ex][fy]$", "abcdef" },
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "d[ex][fy]$", "abcdeff" },
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[dz][ex][fy]$", "abcdef" },
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "[dz][ex][fy]$", "abcdeff" },
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)^abc", "abcdef" },
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)^abc", "aabcdef" },
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)^[ay]*[bx]+c", "abcdef" },
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)^[ay]*[bx]+c", "aabcdef" },
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)def$", "abcdef" },
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)def$", "abcdeff" },
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)d[ex][fy]$", "abcdef" },
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)d[ex][fy]$", "abcdeff" },
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)[dz][ex][fy]$", "abcdef" },
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "(?m)[dz][ex][fy]$", "abcdeff" },
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^", "a" },
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "^^", "a" },
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Context.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tester checks for a match in the text and
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // subpieces of the text with a byte removed on either side.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a", "a" },
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "ab*", "a" },
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a\\C*", "a" },
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Former bugs.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { "a\\C*|ba\\C", "baba" },
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Regexp, SearchTests) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int failures = 0;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(simple_tests); i++) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const RegexpTest& t = simple_tests[i];
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!TestRegexpOnText(t.regexp, t.text))
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      failures++;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LOGGING
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Build a dummy ExhaustiveTest call that will trigger just
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this one test, so that we log the test case.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vector<string> atom, alpha, ops;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    atom.push_back(StringPiece(t.regexp).as_string());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alpha.push_back(StringPiece(t.text).as_string());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExhaustiveTest(1, 0, atom, ops, 1, alpha, "", "");
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(failures, 0);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace re2
326