OLD | NEW |
| (Empty) |
1 // Copyright 2008 The RE2 Authors. All Rights Reserved. | |
2 // Use of this source code is governed by a BSD-style | |
3 // license that can be found in the LICENSE file. | |
4 | |
5 // Test StringGenerator. | |
6 | |
7 #include <stdlib.h> | |
8 #include <string> | |
9 #include <vector> | |
10 #include "util/test.h" | |
11 #include "re2/testing/string_generator.h" | |
12 #include "re2/testing/regexp_generator.h" | |
13 | |
14 namespace re2 { | |
15 | |
16 // Returns i to the e. | |
17 static int64 IntegerPower(int i, int e) { | |
18 int64 p = 1; | |
19 while (e-- > 0) | |
20 p *= i; | |
21 return p; | |
22 } | |
23 | |
24 // Checks that for given settings of the string generator: | |
25 // * it generates strings that are non-decreasing in length. | |
26 // * strings of the same length are sorted in alphabet order. | |
27 // * it doesn't generate the same string twice. | |
28 // * it generates the right number of strings. | |
29 // | |
30 // If all of these hold, the StringGenerator is behaving. | |
31 // Assumes that the alphabet is sorted, so that the generated | |
32 // strings can just be compared lexicographically. | |
33 static void RunTest(int len, string alphabet, bool donull) { | |
34 StringGenerator g(len, Explode(alphabet)); | |
35 | |
36 int n = 0; | |
37 int last_l = -1; | |
38 string last_s; | |
39 | |
40 if (donull) { | |
41 g.GenerateNULL(); | |
42 EXPECT_TRUE(g.HasNext()); | |
43 StringPiece sp = g.Next(); | |
44 EXPECT_EQ(sp.data(), static_cast<const char*>(NULL)); | |
45 EXPECT_EQ(sp.size(), 0); | |
46 } | |
47 | |
48 while (g.HasNext()) { | |
49 string s = g.Next().as_string(); | |
50 n++; | |
51 | |
52 // Check that all characters in s appear in alphabet. | |
53 for (const char *p = s.c_str(); *p != '\0'; ) { | |
54 Rune r; | |
55 p += chartorune(&r, p); | |
56 EXPECT_TRUE(utfrune(alphabet.c_str(), r) != NULL); | |
57 } | |
58 | |
59 // Check that string is properly ordered w.r.t. previous string. | |
60 int l = utflen(s.c_str()); | |
61 EXPECT_LE(l, len); | |
62 if (last_l < l) { | |
63 last_l = l; | |
64 } else { | |
65 EXPECT_EQ(last_l, l); | |
66 EXPECT_LT(last_s, s); | |
67 } | |
68 last_s = s; | |
69 } | |
70 | |
71 // Check total string count. | |
72 int64 m = 0; | |
73 int alpha = utflen(alphabet.c_str()); | |
74 if (alpha == 0) // Degenerate case. | |
75 len = 0; | |
76 for (int i = 0; i <= len; i++) | |
77 m += IntegerPower(alpha, i); | |
78 EXPECT_EQ(n, m); | |
79 } | |
80 | |
81 TEST(StringGenerator, NoLength) { | |
82 RunTest(0, "abc", false); | |
83 } | |
84 | |
85 TEST(StringGenerator, NoLengthNoAlphabet) { | |
86 RunTest(0, "", false); | |
87 } | |
88 | |
89 TEST(StringGenerator, NoAlphabet) { | |
90 RunTest(5, "", false); | |
91 } | |
92 | |
93 TEST(StringGenerator, Simple) { | |
94 RunTest(3, "abc", false); | |
95 } | |
96 | |
97 TEST(StringGenerator, UTF8) { | |
98 RunTest(4, "abc\xE2\x98\xBA", false); | |
99 } | |
100 | |
101 TEST(StringGenerator, GenNULL) { | |
102 RunTest(0, "abc", true); | |
103 RunTest(0, "", true); | |
104 RunTest(5, "", true); | |
105 RunTest(3, "abc", true); | |
106 RunTest(4, "abc\xE2\x98\xBA", true); | |
107 } | |
108 | |
109 } // namespace re2 | |
OLD | NEW |