1 // Copyright 2003 and onwards Google Inc.
2 // Author: Sanjay Ghemawat
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
7
8 #include <stdio.h>
9 #include <map>
10 #include <algorithm> // for make_pair
11
12 #include "pcrecpp.h"
13 #include "pcre_stringpiece.h"
14
15 // CHECK dies with a fatal error if condition is not true. It is *not*
16 // controlled by NDEBUG, so the check will be executed regardless of
17 // compilation mode. Therefore, it is safe to do things like:
18 // CHECK(fp->Write(x) == 4)
19 #define CHECK(condition) do { \
20 if (!(condition)) { \
21 fprintf(stderr, "%s:%d: Check failed: %s\n", \
22 __FILE__, __LINE__, #condition); \
23 exit(1); \
24 } \
25 } while (0)
26
27 using pcrecpp::StringPiece;
28
CheckSTLComparator()29 static void CheckSTLComparator() {
30 string s1("foo");
31 string s2("bar");
32 string s3("baz");
33
34 StringPiece p1(s1);
35 StringPiece p2(s2);
36 StringPiece p3(s3);
37
38 typedef std::map<StringPiece, int> TestMap;
39 TestMap map;
40
41 map.insert(std::make_pair(p1, 0));
42 map.insert(std::make_pair(p2, 1));
43 map.insert(std::make_pair(p3, 2));
44
45 CHECK(map.size() == 3);
46
47 TestMap::const_iterator iter = map.begin();
48 CHECK(iter->second == 1);
49 ++iter;
50 CHECK(iter->second == 2);
51 ++iter;
52 CHECK(iter->second == 0);
53 ++iter;
54 CHECK(iter == map.end());
55
56 TestMap::iterator new_iter = map.find("zot");
57 CHECK(new_iter == map.end());
58
59 new_iter = map.find("bar");
60 CHECK(new_iter != map.end());
61
62 map.erase(new_iter);
63 CHECK(map.size() == 2);
64
65 iter = map.begin();
66 CHECK(iter->second == 2);
67 ++iter;
68 CHECK(iter->second == 0);
69 ++iter;
70 CHECK(iter == map.end());
71 }
72
CheckComparisonOperators()73 static void CheckComparisonOperators() {
74 #define CMP_Y(op, x, y) \
75 CHECK( (StringPiece((x)) op StringPiece((y)))); \
76 CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0))
77
78 #define CMP_N(op, x, y) \
79 CHECK(!(StringPiece((x)) op StringPiece((y)))); \
80 CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0))
81
82 CMP_Y(==, "", "");
83 CMP_Y(==, "a", "a");
84 CMP_Y(==, "aa", "aa");
85 CMP_N(==, "a", "");
86 CMP_N(==, "", "a");
87 CMP_N(==, "a", "b");
88 CMP_N(==, "a", "aa");
89 CMP_N(==, "aa", "a");
90
91 CMP_N(!=, "", "");
92 CMP_N(!=, "a", "a");
93 CMP_N(!=, "aa", "aa");
94 CMP_Y(!=, "a", "");
95 CMP_Y(!=, "", "a");
96 CMP_Y(!=, "a", "b");
97 CMP_Y(!=, "a", "aa");
98 CMP_Y(!=, "aa", "a");
99
100 CMP_Y(<, "a", "b");
101 CMP_Y(<, "a", "aa");
102 CMP_Y(<, "aa", "b");
103 CMP_Y(<, "aa", "bb");
104 CMP_N(<, "a", "a");
105 CMP_N(<, "b", "a");
106 CMP_N(<, "aa", "a");
107 CMP_N(<, "b", "aa");
108 CMP_N(<, "bb", "aa");
109
110 CMP_Y(<=, "a", "a");
111 CMP_Y(<=, "a", "b");
112 CMP_Y(<=, "a", "aa");
113 CMP_Y(<=, "aa", "b");
114 CMP_Y(<=, "aa", "bb");
115 CMP_N(<=, "b", "a");
116 CMP_N(<=, "aa", "a");
117 CMP_N(<=, "b", "aa");
118 CMP_N(<=, "bb", "aa");
119
120 CMP_N(>=, "a", "b");
121 CMP_N(>=, "a", "aa");
122 CMP_N(>=, "aa", "b");
123 CMP_N(>=, "aa", "bb");
124 CMP_Y(>=, "a", "a");
125 CMP_Y(>=, "b", "a");
126 CMP_Y(>=, "aa", "a");
127 CMP_Y(>=, "b", "aa");
128 CMP_Y(>=, "bb", "aa");
129
130 CMP_N(>, "a", "a");
131 CMP_N(>, "a", "b");
132 CMP_N(>, "a", "aa");
133 CMP_N(>, "aa", "b");
134 CMP_N(>, "aa", "bb");
135 CMP_Y(>, "b", "a");
136 CMP_Y(>, "aa", "a");
137 CMP_Y(>, "b", "aa");
138 CMP_Y(>, "bb", "aa");
139
140 #undef CMP_Y
141 #undef CMP_N
142 }
143
main(int argc,char ** argv)144 int main(int argc, char** argv) {
145 (void)argc;
146 (void)argv;
147 CheckComparisonOperators();
148 CheckSTLComparator();
149
150 printf("OK\n");
151 return 0;
152 }
153