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 std::string; 28 using pcrecpp::StringPiece; 29 30 static void CheckSTLComparator() { 31 string s1("foo"); 32 string s2("bar"); ~lazy_ostream()33 string s3("baz"); 34 instance()35 StringPiece p1(s1); 36 StringPiece p2(s2); operator <<(std::ostream & ostr,lazy_ostream const & o)37 StringPiece p3(s3); 38 39 typedef std::map<StringPiece, int> TestMap; empty() const40 TestMap map; 41 42 map.insert(std::make_pair(p1, 0)); operator ()(std::ostream & ostr) const43 map.insert(std::make_pair(p2, 1)); 44 map.insert(std::make_pair(p3, 2)); lazy_ostream(bool p_empty=true)45 46 CHECK(map.size() == 3); 47 48 TestMap::const_iterator iter = map.begin(); 49 CHECK(iter->second == 1); 50 ++iter; 51 CHECK(iter->second == 2); 52 ++iter; 53 CHECK(iter->second == 0); 54 ++iter; 55 CHECK(iter == map.end()); 56 lazy_ostream_impl(PrevType const & prev,T const & value)57 TestMap::iterator new_iter = map.find("zot"); 58 CHECK(new_iter == map.end()); 59 60 new_iter = map.find("bar"); 61 CHECK(new_iter != map.end()); 62 63 map.erase(new_iter); operator ()(std::ostream & ostr) const64 CHECK(map.size() == 2); 65 66 iter = map.begin(); 67 CHECK(iter->second == 2); 68 ++iter; 69 CHECK(iter->second == 0); 70 ++iter; 71 CHECK(iter == map.end()); 72 } 73 74 static void CheckComparisonOperators() { 75 #define CMP_Y(op, x, y) \ 76 CHECK( (StringPiece((x)) op StringPiece((y)))); \ 77 CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0)) operator <<(lazy_ostream const & prev,T const & v)78 79 #define CMP_N(op, x, y) \ 80 CHECK(!(StringPiece((x)) op StringPiece((y)))); \ 81 CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0)) 82 83 CMP_Y(==, "", ""); 84 CMP_Y(==, "a", "a"); 85 CMP_Y(==, "aa", "aa"); 86 CMP_N(==, "a", ""); operator <<(lazy_ostream_impl<PrevPrevType,TPrev> const & prev,T const & v)87 CMP_N(==, "", "a"); 88 CMP_N(==, "a", "b"); 89 CMP_N(==, "a", "aa"); 90 CMP_N(==, "aa", "a"); 91 92 CMP_N(!=, "", ""); 93 CMP_N(!=, "a", "a"); 94 CMP_N(!=, "aa", "aa"); 95 CMP_Y(!=, "a", ""); 96 CMP_Y(!=, "", "a"); 97 CMP_Y(!=, "a", "b"); 98 CMP_Y(!=, "a", "aa"); operator <<(lazy_ostream const & prev,R & (BOOST_TEST_CALL_DECL * man)(S &))99 CMP_Y(!=, "aa", "a"); 100 101 CMP_Y(<, "a", "b"); 102 CMP_Y(<, "a", "aa"); 103 CMP_Y(<, "aa", "b"); 104 CMP_Y(<, "aa", "bb"); 105 CMP_N(<, "a", "a"); 106 CMP_N(<, "b", "a"); 107 CMP_N(<, "aa", "a"); 108 CMP_N(<, "b", "aa"); 109 CMP_N(<, "bb", "aa"); operator <<(lazy_ostream_impl<PrevPrevType,TPrev> const & prev,R & (BOOST_TEST_CALL_DECL * man)(S &))110 111 CMP_Y(<=, "a", "a"); 112 CMP_Y(<=, "a", "b"); 113 CMP_Y(<=, "a", "aa"); 114 CMP_Y(<=, "aa", "b"); 115 CMP_Y(<=, "aa", "bb"); 116 CMP_N(<=, "b", "a"); 117 CMP_N(<=, "aa", "a"); 118 CMP_N(<=, "b", "aa"); 119 CMP_N(<=, "bb", "aa"); 120 121 CMP_N(>=, "a", "b"); 122 CMP_N(>=, "a", "aa"); 123 CMP_N(>=, "aa", "b"); 124 CMP_N(>=, "aa", "bb"); 125 CMP_Y(>=, "a", "a"); 126 CMP_Y(>=, "b", "a"); 127 CMP_Y(>=, "aa", "a"); 128 CMP_Y(>=, "b", "aa"); 129 CMP_Y(>=, "bb", "aa"); 130 131 CMP_N(>, "a", "a"); 132 CMP_N(>, "a", "b"); 133 CMP_N(>, "a", "aa"); 134 CMP_N(>, "aa", "b"); 135 CMP_N(>, "aa", "bb"); 136 CMP_Y(>, "b", "a"); 137 CMP_Y(>, "aa", "a"); 138 CMP_Y(>, "b", "aa"); 139 CMP_Y(>, "bb", "aa"); 140 141 #undef CMP_Y 142 #undef CMP_N 143 } 144 145 int main(int argc, char** argv) { 146 (void)argc; 147 (void)argv; 148 CheckComparisonOperators(); 149 CheckSTLComparator(); 150 151 printf("OK\n"); 152 return 0; 153 } 154