1 1.1 jmmv // Copyright 2010 Google Inc. 2 1.1 jmmv // All rights reserved. 3 1.1 jmmv // 4 1.1 jmmv // Redistribution and use in source and binary forms, with or without 5 1.1 jmmv // modification, are permitted provided that the following conditions are 6 1.1 jmmv // met: 7 1.1 jmmv // 8 1.1 jmmv // * Redistributions of source code must retain the above copyright 9 1.1 jmmv // notice, this list of conditions and the following disclaimer. 10 1.1 jmmv // * Redistributions in binary form must reproduce the above copyright 11 1.1 jmmv // notice, this list of conditions and the following disclaimer in the 12 1.1 jmmv // documentation and/or other materials provided with the distribution. 13 1.1 jmmv // * Neither the name of Google Inc. nor the names of its contributors 14 1.1 jmmv // may be used to endorse or promote products derived from this software 15 1.1 jmmv // without specific prior written permission. 16 1.1 jmmv // 17 1.1 jmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 1.1 jmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 1.1 jmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 1.1 jmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 1.1 jmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 1.1 jmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 1.1 jmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 jmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 jmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 jmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 1.1 jmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 jmmv 29 1.1 jmmv #include "engine/test_result.hpp" 30 1.1 jmmv 31 1.1 jmmv #include <sstream> 32 1.1 jmmv 33 1.1 jmmv #include <atf-c++.hpp> 34 1.1 jmmv 35 1.1 jmmv #include "engine/exceptions.hpp" 36 1.1 jmmv 37 1.1 jmmv using engine::test_result; 38 1.1 jmmv 39 1.1 jmmv 40 1.1 jmmv namespace { 41 1.1 jmmv 42 1.1 jmmv 43 1.1 jmmv /// Creates a test case to validate the getters. 44 1.1 jmmv /// 45 1.1 jmmv /// \param name The name of the test case; "__getters" will be appended. 46 1.1 jmmv /// \param expected_type The expected type of the result. 47 1.1 jmmv /// \param expected_reason The expected reason for the result. 48 1.1 jmmv /// \param result The result to query. 49 1.1 jmmv #define GETTERS_TEST(name, expected_type, expected_reason, result) \ 50 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(name ## __getters); \ 51 1.1 jmmv ATF_TEST_CASE_BODY(name ## __getters) \ 52 1.1 jmmv { \ 53 1.1 jmmv ATF_REQUIRE(expected_type == result.type()); \ 54 1.1 jmmv ATF_REQUIRE_EQ(expected_reason, result.reason()); \ 55 1.1 jmmv } 56 1.1 jmmv 57 1.1 jmmv 58 1.1 jmmv /// Creates a test case to validate the good() method. 59 1.1 jmmv /// 60 1.1 jmmv /// \param name The name of the test case; "__good" will be appended. 61 1.1 jmmv /// \param expected The expected result of good(). 62 1.1 jmmv /// \param result_type The result type to check. 63 1.1 jmmv #define GOOD_TEST(name, expected, result_type) \ 64 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(name ## __good); \ 65 1.1 jmmv ATF_TEST_CASE_BODY(name ## __good) \ 66 1.1 jmmv { \ 67 1.1 jmmv ATF_REQUIRE_EQ(expected, test_result(result_type).good()); \ 68 1.1 jmmv } 69 1.1 jmmv 70 1.1 jmmv 71 1.1 jmmv /// Creates a test case to validate the operator<< method. 72 1.1 jmmv /// 73 1.1 jmmv /// \param name The name of the test case; "__output" will be appended. 74 1.1 jmmv /// \param expected The expected string in the output. 75 1.1 jmmv /// \param result The result to format. 76 1.1 jmmv #define OUTPUT_TEST(name, expected, result) \ 77 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(name ## __output); \ 78 1.1 jmmv ATF_TEST_CASE_BODY(name ## __output) \ 79 1.1 jmmv { \ 80 1.1 jmmv std::ostringstream output; \ 81 1.1 jmmv output << "prefix" << result << "suffix"; \ 82 1.1 jmmv ATF_REQUIRE_EQ("prefix" + std::string(expected) + "suffix", \ 83 1.1 jmmv output.str()); \ 84 1.1 jmmv } 85 1.1 jmmv 86 1.1 jmmv 87 1.1 jmmv /// Validates the parse() method on a particular test result type. 88 1.1 jmmv /// 89 1.1 jmmv /// \param result_name Textual representation of the type, to be written to the 90 1.1 jmmv /// input data. 91 1.1 jmmv /// \param result_type Expected result type. 92 1.1 jmmv static void 93 1.1 jmmv parse_test(const std::string& result_name, 94 1.1 jmmv const test_result::result_type result_type) 95 1.1 jmmv { 96 1.1 jmmv std::istringstream input(result_name); 97 1.1 jmmv ATF_REQUIRE(test_result(result_type) == test_result::parse(input)); 98 1.1 jmmv 99 1.1 jmmv input.clear(); 100 1.1 jmmv input.str(result_name + ": Some message"); 101 1.1 jmmv ATF_REQUIRE(test_result(result_type, "Some message") == 102 1.1 jmmv test_result::parse(input)); 103 1.1 jmmv 104 1.1 jmmv input.clear(); 105 1.1 jmmv input.str(result_name + ": Some message\n"); 106 1.1 jmmv ATF_REQUIRE(test_result(result_type, "Some message") == 107 1.1 jmmv test_result::parse(input)); 108 1.1 jmmv 109 1.1 jmmv input.clear(); 110 1.1 jmmv input.str(result_name + ": foo\nbar"); 111 1.1 jmmv ATF_REQUIRE(test_result(result_type, "foo<<NEWLINE>>bar") == 112 1.1 jmmv test_result::parse(input)); 113 1.1 jmmv 114 1.1 jmmv input.clear(); 115 1.1 jmmv input.str(result_name + ": foo\nbar\n"); 116 1.1 jmmv ATF_REQUIRE(test_result(result_type, "foo<<NEWLINE>>bar") == 117 1.1 jmmv test_result::parse(input)); 118 1.1 jmmv } 119 1.1 jmmv 120 1.1 jmmv 121 1.1 jmmv /// Creates a test case to validate the parse() method for a given type. 122 1.1 jmmv /// 123 1.1 jmmv /// \param name The name of the test case; "parse__" will be prepended. 124 1.1 jmmv #define PARSE_TEST(name) \ 125 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(parse__ ## name); \ 126 1.1 jmmv ATF_TEST_CASE_BODY(parse__ ## name) \ 127 1.1 jmmv { \ 128 1.1 jmmv parse_test(#name, test_result:: name); \ 129 1.1 jmmv } 130 1.1 jmmv 131 1.1 jmmv 132 1.1 jmmv } // anonymous namespace 133 1.1 jmmv 134 1.1 jmmv 135 1.1 jmmv PARSE_TEST(broken); 136 1.1 jmmv PARSE_TEST(expected_failure); 137 1.1 jmmv PARSE_TEST(failed); 138 1.1 jmmv PARSE_TEST(passed); 139 1.1 jmmv PARSE_TEST(skipped); 140 1.1 jmmv 141 1.1 jmmv 142 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(parse__empty); 143 1.1 jmmv ATF_TEST_CASE_BODY(parse__empty) 144 1.1 jmmv { 145 1.1 jmmv std::istringstream input(""); 146 1.1 jmmv ATF_REQUIRE(test_result(test_result::broken, "Empty result file") == 147 1.1 jmmv test_result::parse(input)); 148 1.1 jmmv } 149 1.1 jmmv 150 1.1 jmmv 151 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(parse__unknown_type); 152 1.1 jmmv ATF_TEST_CASE_BODY(parse__unknown_type) 153 1.1 jmmv { 154 1.1 jmmv std::istringstream input("passed "); 155 1.1 jmmv ATF_REQUIRE( 156 1.1 jmmv test_result(test_result::broken, "Unknown result type 'passed '") == 157 1.1 jmmv test_result::parse(input)); 158 1.1 jmmv 159 1.1 jmmv input.clear(); 160 1.1 jmmv input.str("fail"); 161 1.1 jmmv ATF_REQUIRE( 162 1.1 jmmv test_result(test_result::broken, "Unknown result type 'fail'") == 163 1.1 jmmv test_result::parse(input)); 164 1.1 jmmv 165 1.1 jmmv input.clear(); 166 1.1 jmmv input.str("a b"); 167 1.1 jmmv ATF_REQUIRE( 168 1.1 jmmv test_result(test_result::broken, "Unknown result type 'a b'") == 169 1.1 jmmv test_result::parse(input)); 170 1.1 jmmv } 171 1.1 jmmv 172 1.1 jmmv 173 1.1 jmmv GETTERS_TEST(broken, test_result::broken, "The reason", 174 1.1 jmmv test_result(test_result::broken, "The reason")); 175 1.1 jmmv GETTERS_TEST(expected_failure, test_result::expected_failure, "The reason", 176 1.1 jmmv test_result(test_result::expected_failure, "The reason")); 177 1.1 jmmv GETTERS_TEST(failed, test_result::failed, "The reason", 178 1.1 jmmv test_result(test_result::failed, "The reason")); 179 1.1 jmmv GETTERS_TEST(passed, test_result::passed, "", 180 1.1 jmmv test_result(test_result::passed)); 181 1.1 jmmv GETTERS_TEST(skipped, test_result::skipped, "The reason", 182 1.1 jmmv test_result(test_result::skipped, "The reason")); 183 1.1 jmmv 184 1.1 jmmv 185 1.1 jmmv GOOD_TEST(broken, false, test_result::broken); 186 1.1 jmmv GOOD_TEST(expected_failure, true, test_result::expected_failure); 187 1.1 jmmv GOOD_TEST(failed, false, test_result::failed); 188 1.1 jmmv GOOD_TEST(passed, true, test_result::passed); 189 1.1 jmmv GOOD_TEST(skipped, true, test_result::skipped); 190 1.1 jmmv 191 1.1 jmmv 192 1.1 jmmv OUTPUT_TEST(broken, "test_result{type='broken', reason='foo'}", 193 1.1 jmmv test_result(test_result::broken, "foo")); 194 1.1 jmmv OUTPUT_TEST(expected_failure, 195 1.1 jmmv "test_result{type='expected_failure', reason='abc def'}", 196 1.1 jmmv test_result(test_result::expected_failure, "abc def")); 197 1.1 jmmv OUTPUT_TEST(failed, "test_result{type='failed', reason='some \\'string'}", 198 1.1 jmmv test_result(test_result::failed, "some 'string")); 199 1.1 jmmv OUTPUT_TEST(passed, "test_result{type='passed'}", 200 1.1 jmmv test_result(test_result::passed, "")); 201 1.1 jmmv OUTPUT_TEST(skipped, "test_result{type='skipped', reason='last message'}", 202 1.1 jmmv test_result(test_result::skipped, "last message")); 203 1.1 jmmv 204 1.1 jmmv 205 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operator_eq); 206 1.1 jmmv ATF_TEST_CASE_BODY(operator_eq) 207 1.1 jmmv { 208 1.1 jmmv const test_result result1(test_result::broken, "Foo"); 209 1.1 jmmv const test_result result2(test_result::broken, "Foo"); 210 1.1 jmmv const test_result result3(test_result::broken, "Bar"); 211 1.1 jmmv const test_result result4(test_result::failed, "Foo"); 212 1.1 jmmv 213 1.1 jmmv ATF_REQUIRE( result1 == result1); 214 1.1 jmmv ATF_REQUIRE( result1 == result2); 215 1.1 jmmv ATF_REQUIRE(!(result1 == result3)); 216 1.1 jmmv ATF_REQUIRE(!(result1 == result4)); 217 1.1 jmmv } 218 1.1 jmmv 219 1.1 jmmv 220 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operator_ne); 221 1.1 jmmv ATF_TEST_CASE_BODY(operator_ne) 222 1.1 jmmv { 223 1.1 jmmv const test_result result1(test_result::broken, "Foo"); 224 1.1 jmmv const test_result result2(test_result::broken, "Foo"); 225 1.1 jmmv const test_result result3(test_result::broken, "Bar"); 226 1.1 jmmv const test_result result4(test_result::failed, "Foo"); 227 1.1 jmmv 228 1.1 jmmv ATF_REQUIRE(!(result1 != result1)); 229 1.1 jmmv ATF_REQUIRE(!(result1 != result2)); 230 1.1 jmmv ATF_REQUIRE( result1 != result3); 231 1.1 jmmv ATF_REQUIRE( result1 != result4); 232 1.1 jmmv } 233 1.1 jmmv 234 1.1 jmmv 235 1.1 jmmv ATF_INIT_TEST_CASES(tcs) 236 1.1 jmmv { 237 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__broken); 238 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__expected_failure); 239 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__failed); 240 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__passed); 241 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__skipped); 242 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__empty); 243 1.1 jmmv ATF_ADD_TEST_CASE(tcs, parse__unknown_type); 244 1.1 jmmv 245 1.1 jmmv ATF_ADD_TEST_CASE(tcs, broken__getters); 246 1.1 jmmv ATF_ADD_TEST_CASE(tcs, broken__good); 247 1.1 jmmv ATF_ADD_TEST_CASE(tcs, broken__output); 248 1.1 jmmv ATF_ADD_TEST_CASE(tcs, expected_failure__getters); 249 1.1 jmmv ATF_ADD_TEST_CASE(tcs, expected_failure__good); 250 1.1 jmmv ATF_ADD_TEST_CASE(tcs, expected_failure__output); 251 1.1 jmmv ATF_ADD_TEST_CASE(tcs, failed__getters); 252 1.1 jmmv ATF_ADD_TEST_CASE(tcs, failed__good); 253 1.1 jmmv ATF_ADD_TEST_CASE(tcs, failed__output); 254 1.1 jmmv ATF_ADD_TEST_CASE(tcs, passed__getters); 255 1.1 jmmv ATF_ADD_TEST_CASE(tcs, passed__good); 256 1.1 jmmv ATF_ADD_TEST_CASE(tcs, passed__output); 257 1.1 jmmv ATF_ADD_TEST_CASE(tcs, skipped__getters); 258 1.1 jmmv ATF_ADD_TEST_CASE(tcs, skipped__good); 259 1.1 jmmv ATF_ADD_TEST_CASE(tcs, skipped__output); 260 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operator_eq); 261 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operator_ne); 262 1.1 jmmv } 263