dvander@2762: // Copyright 2003 and onwards Google Inc. dvander@2762: // Author: Sanjay Ghemawat dvander@2762: dvander@2762: #ifdef HAVE_CONFIG_H dvander@2762: #include "config.h" dvander@2762: #endif dvander@2762: dvander@2762: #include dvander@2762: #include dvander@2762: #include // for make_pair dvander@2762: dvander@2762: #include "pcrecpp.h" dvander@2762: #include "pcre_stringpiece.h" dvander@2762: dvander@2762: // CHECK dies with a fatal error if condition is not true. It is *not* dvander@2762: // controlled by NDEBUG, so the check will be executed regardless of dvander@2762: // compilation mode. Therefore, it is safe to do things like: dvander@2762: // CHECK(fp->Write(x) == 4) dvander@2762: #define CHECK(condition) do { \ dvander@2762: if (!(condition)) { \ dvander@2762: fprintf(stderr, "%s:%d: Check failed: %s\n", \ dvander@2762: __FILE__, __LINE__, #condition); \ dvander@2762: exit(1); \ dvander@2762: } \ dvander@2762: } while (0) dvander@2762: dvander@2762: using std::map; dvander@2762: using std::make_pair; dvander@2762: using pcrecpp::StringPiece; dvander@2762: dvander@2762: static void CheckSTLComparator() { dvander@2762: string s1("foo"); dvander@2762: string s2("bar"); dvander@2762: string s3("baz"); dvander@2762: dvander@2762: StringPiece p1(s1); dvander@2762: StringPiece p2(s2); dvander@2762: StringPiece p3(s3); dvander@2762: dvander@2762: typedef map TestMap; dvander@2762: TestMap map; dvander@2762: dvander@2762: map.insert(make_pair(p1, 0)); dvander@2762: map.insert(make_pair(p2, 1)); dvander@2762: map.insert(make_pair(p3, 2)); dvander@2762: CHECK(map.size() == 3); dvander@2762: dvander@2762: TestMap::const_iterator iter = map.begin(); dvander@2762: CHECK(iter->second == 1); dvander@2762: ++iter; dvander@2762: CHECK(iter->second == 2); dvander@2762: ++iter; dvander@2762: CHECK(iter->second == 0); dvander@2762: ++iter; dvander@2762: CHECK(iter == map.end()); dvander@2762: dvander@2762: TestMap::iterator new_iter = map.find("zot"); dvander@2762: CHECK(new_iter == map.end()); dvander@2762: dvander@2762: new_iter = map.find("bar"); dvander@2762: CHECK(new_iter != map.end()); dvander@2762: dvander@2762: map.erase(new_iter); dvander@2762: CHECK(map.size() == 2); dvander@2762: dvander@2762: iter = map.begin(); dvander@2762: CHECK(iter->second == 2); dvander@2762: ++iter; dvander@2762: CHECK(iter->second == 0); dvander@2762: ++iter; dvander@2762: CHECK(iter == map.end()); dvander@2762: } dvander@2762: dvander@2762: static void CheckComparisonOperators() { dvander@2762: #define CMP_Y(op, x, y) \ dvander@2762: CHECK( (StringPiece((x)) op StringPiece((y)))); \ dvander@2762: CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0)) dvander@2762: dvander@2762: #define CMP_N(op, x, y) \ dvander@2762: CHECK(!(StringPiece((x)) op StringPiece((y)))); \ dvander@2762: CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0)) dvander@2762: dvander@2762: CMP_Y(==, "", ""); dvander@2762: CMP_Y(==, "a", "a"); dvander@2762: CMP_Y(==, "aa", "aa"); dvander@2762: CMP_N(==, "a", ""); dvander@2762: CMP_N(==, "", "a"); dvander@2762: CMP_N(==, "a", "b"); dvander@2762: CMP_N(==, "a", "aa"); dvander@2762: CMP_N(==, "aa", "a"); dvander@2762: dvander@2762: CMP_N(!=, "", ""); dvander@2762: CMP_N(!=, "a", "a"); dvander@2762: CMP_N(!=, "aa", "aa"); dvander@2762: CMP_Y(!=, "a", ""); dvander@2762: CMP_Y(!=, "", "a"); dvander@2762: CMP_Y(!=, "a", "b"); dvander@2762: CMP_Y(!=, "a", "aa"); dvander@2762: CMP_Y(!=, "aa", "a"); dvander@2762: dvander@2762: CMP_Y(<, "a", "b"); dvander@2762: CMP_Y(<, "a", "aa"); dvander@2762: CMP_Y(<, "aa", "b"); dvander@2762: CMP_Y(<, "aa", "bb"); dvander@2762: CMP_N(<, "a", "a"); dvander@2762: CMP_N(<, "b", "a"); dvander@2762: CMP_N(<, "aa", "a"); dvander@2762: CMP_N(<, "b", "aa"); dvander@2762: CMP_N(<, "bb", "aa"); dvander@2762: dvander@2762: CMP_Y(<=, "a", "a"); dvander@2762: CMP_Y(<=, "a", "b"); dvander@2762: CMP_Y(<=, "a", "aa"); dvander@2762: CMP_Y(<=, "aa", "b"); dvander@2762: CMP_Y(<=, "aa", "bb"); dvander@2762: CMP_N(<=, "b", "a"); dvander@2762: CMP_N(<=, "aa", "a"); dvander@2762: CMP_N(<=, "b", "aa"); dvander@2762: CMP_N(<=, "bb", "aa"); dvander@2762: dvander@2762: CMP_N(>=, "a", "b"); dvander@2762: CMP_N(>=, "a", "aa"); dvander@2762: CMP_N(>=, "aa", "b"); dvander@2762: CMP_N(>=, "aa", "bb"); dvander@2762: CMP_Y(>=, "a", "a"); dvander@2762: CMP_Y(>=, "b", "a"); dvander@2762: CMP_Y(>=, "aa", "a"); dvander@2762: CMP_Y(>=, "b", "aa"); dvander@2762: CMP_Y(>=, "bb", "aa"); dvander@2762: dvander@2762: CMP_N(>, "a", "a"); dvander@2762: CMP_N(>, "a", "b"); dvander@2762: CMP_N(>, "a", "aa"); dvander@2762: CMP_N(>, "aa", "b"); dvander@2762: CMP_N(>, "aa", "bb"); dvander@2762: CMP_Y(>, "b", "a"); dvander@2762: CMP_Y(>, "aa", "a"); dvander@2762: CMP_Y(>, "b", "aa"); dvander@2762: CMP_Y(>, "bb", "aa"); dvander@2762: dvander@2762: #undef CMP_Y dvander@2762: #undef CMP_N dvander@2762: } dvander@2762: dvander@2762: int main(int argc, char** argv) { dvander@2762: CheckComparisonOperators(); dvander@2762: CheckSTLComparator(); dvander@2762: dvander@2762: printf("OK\n"); dvander@2762: return 0; dvander@2762: }