test_result_test.cpp revision 1.1 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