108334c51SBrooks Davis // Copyright 2015 The Kyua Authors.
208334c51SBrooks Davis // All rights reserved.
308334c51SBrooks Davis //
408334c51SBrooks Davis // Redistribution and use in source and binary forms, with or without
508334c51SBrooks Davis // modification, are permitted provided that the following conditions are
608334c51SBrooks Davis // met:
708334c51SBrooks Davis //
808334c51SBrooks Davis // * Redistributions of source code must retain the above copyright
908334c51SBrooks Davis // notice, this list of conditions and the following disclaimer.
1008334c51SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
1108334c51SBrooks Davis // notice, this list of conditions and the following disclaimer in the
1208334c51SBrooks Davis // documentation and/or other materials provided with the distribution.
1308334c51SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
1408334c51SBrooks Davis // may be used to endorse or promote products derived from this software
1508334c51SBrooks Davis // without specific prior written permission.
1608334c51SBrooks Davis //
1708334c51SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1808334c51SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1908334c51SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2008334c51SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2108334c51SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2208334c51SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2308334c51SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2408334c51SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2508334c51SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2608334c51SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2708334c51SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2808334c51SBrooks Davis
2908334c51SBrooks Davis #include "engine/tap_parser.hpp"
3008334c51SBrooks Davis
3108334c51SBrooks Davis #include <fstream>
3208334c51SBrooks Davis
3308334c51SBrooks Davis #include <atf-c++.hpp>
3408334c51SBrooks Davis
3508334c51SBrooks Davis #include "engine/exceptions.hpp"
3608334c51SBrooks Davis #include "utils/format/containers.ipp"
3708334c51SBrooks Davis #include "utils/format/macros.hpp"
3808334c51SBrooks Davis #include "utils/fs/path.hpp"
3908334c51SBrooks Davis
4008334c51SBrooks Davis namespace fs = utils::fs;
4108334c51SBrooks Davis
4208334c51SBrooks Davis
4308334c51SBrooks Davis namespace {
4408334c51SBrooks Davis
4508334c51SBrooks Davis
4608334c51SBrooks Davis /// Helper to execute parse_tap_output() on inline text contents.
4708334c51SBrooks Davis ///
4808334c51SBrooks Davis /// \param contents The TAP output to parse.
4908334c51SBrooks Davis ///
5008334c51SBrooks Davis /// \return The tap_summary object resultingafter the parse.
5108334c51SBrooks Davis ///
5208334c51SBrooks Davis /// \throw engine::load_error If parse_tap_output() fails.
5308334c51SBrooks Davis static engine::tap_summary
do_parse(const std::string & contents)5408334c51SBrooks Davis do_parse(const std::string& contents)
5508334c51SBrooks Davis {
5608334c51SBrooks Davis std::ofstream output("tap.txt");
5708334c51SBrooks Davis ATF_REQUIRE(output);
5808334c51SBrooks Davis output << contents;
5908334c51SBrooks Davis output.close();
6008334c51SBrooks Davis return engine::parse_tap_output(fs::path("tap.txt"));
6108334c51SBrooks Davis }
6208334c51SBrooks Davis
6308334c51SBrooks Davis
6408334c51SBrooks Davis } // anonymous namespace
6508334c51SBrooks Davis
6608334c51SBrooks Davis
6708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(tap_summary__bailed_out);
ATF_TEST_CASE_BODY(tap_summary__bailed_out)6808334c51SBrooks Davis ATF_TEST_CASE_BODY(tap_summary__bailed_out)
6908334c51SBrooks Davis {
7008334c51SBrooks Davis const engine::tap_summary summary = engine::tap_summary::new_bailed_out();
7108334c51SBrooks Davis ATF_REQUIRE(summary.bailed_out());
7208334c51SBrooks Davis }
7308334c51SBrooks Davis
7408334c51SBrooks Davis
7508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(tap_summary__some_results);
ATF_TEST_CASE_BODY(tap_summary__some_results)7608334c51SBrooks Davis ATF_TEST_CASE_BODY(tap_summary__some_results)
7708334c51SBrooks Davis {
7808334c51SBrooks Davis const engine::tap_summary summary = engine::tap_summary::new_results(
7908334c51SBrooks Davis engine::tap_plan(1, 5), 3, 2);
8008334c51SBrooks Davis ATF_REQUIRE(!summary.bailed_out());
8108334c51SBrooks Davis ATF_REQUIRE_EQ(engine::tap_plan(1, 5), summary.plan());
8208334c51SBrooks Davis ATF_REQUIRE_EQ(3, summary.ok_count());
8308334c51SBrooks Davis ATF_REQUIRE_EQ(2, summary.not_ok_count());
8408334c51SBrooks Davis }
8508334c51SBrooks Davis
8608334c51SBrooks Davis
8708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(tap_summary__all_skipped);
ATF_TEST_CASE_BODY(tap_summary__all_skipped)8808334c51SBrooks Davis ATF_TEST_CASE_BODY(tap_summary__all_skipped)
8908334c51SBrooks Davis {
9008334c51SBrooks Davis const engine::tap_summary summary = engine::tap_summary::new_all_skipped(
9108334c51SBrooks Davis "Skipped");
9208334c51SBrooks Davis ATF_REQUIRE(!summary.bailed_out());
9308334c51SBrooks Davis ATF_REQUIRE_EQ(engine::tap_plan(1, 0), summary.plan());
9408334c51SBrooks Davis ATF_REQUIRE_EQ("Skipped", summary.all_skipped_reason());
9508334c51SBrooks Davis }
9608334c51SBrooks Davis
9708334c51SBrooks Davis
9808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(tap_summary__equality_operators);
ATF_TEST_CASE_BODY(tap_summary__equality_operators)9908334c51SBrooks Davis ATF_TEST_CASE_BODY(tap_summary__equality_operators)
10008334c51SBrooks Davis {
10108334c51SBrooks Davis const engine::tap_summary bailed_out =
10208334c51SBrooks Davis engine::tap_summary::new_bailed_out();
10308334c51SBrooks Davis const engine::tap_summary all_skipped_1 =
10408334c51SBrooks Davis engine::tap_summary::new_all_skipped("Reason 1");
10508334c51SBrooks Davis const engine::tap_summary results_1 =
10608334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 5), 3, 2);
10708334c51SBrooks Davis
10808334c51SBrooks Davis // Self-equality checks.
10908334c51SBrooks Davis ATF_REQUIRE( bailed_out == bailed_out);
11008334c51SBrooks Davis ATF_REQUIRE(!(bailed_out != bailed_out));
11108334c51SBrooks Davis ATF_REQUIRE( all_skipped_1 == all_skipped_1);
11208334c51SBrooks Davis ATF_REQUIRE(!(all_skipped_1 != all_skipped_1));
11308334c51SBrooks Davis ATF_REQUIRE( results_1 == results_1);
11408334c51SBrooks Davis ATF_REQUIRE(!(results_1 != results_1));
11508334c51SBrooks Davis
11608334c51SBrooks Davis // Cross-equality checks.
11708334c51SBrooks Davis ATF_REQUIRE(!(bailed_out == all_skipped_1));
11808334c51SBrooks Davis ATF_REQUIRE( bailed_out != all_skipped_1);
11908334c51SBrooks Davis ATF_REQUIRE(!(bailed_out == results_1));
12008334c51SBrooks Davis ATF_REQUIRE( bailed_out != results_1);
12108334c51SBrooks Davis ATF_REQUIRE(!(all_skipped_1 == results_1));
12208334c51SBrooks Davis ATF_REQUIRE( all_skipped_1 != results_1);
12308334c51SBrooks Davis
12408334c51SBrooks Davis // Checks for the all_skipped "type".
12508334c51SBrooks Davis const engine::tap_summary all_skipped_2 =
12608334c51SBrooks Davis engine::tap_summary::new_all_skipped("Reason 2");
12708334c51SBrooks Davis ATF_REQUIRE(!(all_skipped_1 == all_skipped_2));
12808334c51SBrooks Davis ATF_REQUIRE( all_skipped_1 != all_skipped_2);
12908334c51SBrooks Davis
13008334c51SBrooks Davis
13108334c51SBrooks Davis // Checks for the results "type", different plan.
13208334c51SBrooks Davis const engine::tap_summary results_2 =
13308334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(2, 6),
13408334c51SBrooks Davis results_1.ok_count(),
13508334c51SBrooks Davis results_1.not_ok_count());
13608334c51SBrooks Davis ATF_REQUIRE(!(results_1 == results_2));
13708334c51SBrooks Davis ATF_REQUIRE( results_1 != results_2);
13808334c51SBrooks Davis
13908334c51SBrooks Davis
14008334c51SBrooks Davis // Checks for the results "type", different counts.
14108334c51SBrooks Davis const engine::tap_summary results_3 =
14208334c51SBrooks Davis engine::tap_summary::new_results(results_1.plan(),
14308334c51SBrooks Davis results_1.not_ok_count(),
14408334c51SBrooks Davis results_1.ok_count());
14508334c51SBrooks Davis ATF_REQUIRE(!(results_1 == results_3));
14608334c51SBrooks Davis ATF_REQUIRE( results_1 != results_3);
14708334c51SBrooks Davis }
14808334c51SBrooks Davis
14908334c51SBrooks Davis
15008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(tap_summary__output);
ATF_TEST_CASE_BODY(tap_summary__output)15108334c51SBrooks Davis ATF_TEST_CASE_BODY(tap_summary__output)
15208334c51SBrooks Davis {
15308334c51SBrooks Davis {
15408334c51SBrooks Davis const engine::tap_summary summary =
15508334c51SBrooks Davis engine::tap_summary::new_bailed_out();
15608334c51SBrooks Davis ATF_REQUIRE_EQ(
15708334c51SBrooks Davis "tap_summary{bailed_out=true}",
15808334c51SBrooks Davis (F("%s") % summary).str());
15908334c51SBrooks Davis }
16008334c51SBrooks Davis
16108334c51SBrooks Davis {
16208334c51SBrooks Davis const engine::tap_summary summary =
16308334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(5, 10), 2, 4);
16408334c51SBrooks Davis ATF_REQUIRE_EQ(
16508334c51SBrooks Davis "tap_summary{bailed_out=false, plan=5..10, ok_count=2, "
16608334c51SBrooks Davis "not_ok_count=4}",
16708334c51SBrooks Davis (F("%s") % summary).str());
16808334c51SBrooks Davis }
16908334c51SBrooks Davis
17008334c51SBrooks Davis {
17108334c51SBrooks Davis const engine::tap_summary summary =
17208334c51SBrooks Davis engine::tap_summary::new_all_skipped("Who knows");
17308334c51SBrooks Davis ATF_REQUIRE_EQ(
17408334c51SBrooks Davis "tap_summary{bailed_out=false, plan=1..0, "
17508334c51SBrooks Davis "all_skipped_reason=Who knows}",
17608334c51SBrooks Davis (F("%s") % summary).str());
17708334c51SBrooks Davis }
17808334c51SBrooks Davis }
17908334c51SBrooks Davis
18008334c51SBrooks Davis
18108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__only_one_result);
ATF_TEST_CASE_BODY(parse_tap_output__only_one_result)18208334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__only_one_result)
18308334c51SBrooks Davis {
18408334c51SBrooks Davis const engine::tap_summary summary = do_parse(
18508334c51SBrooks Davis "1..1\n"
18608334c51SBrooks Davis "ok - 1\n");
18708334c51SBrooks Davis
18808334c51SBrooks Davis const engine::tap_summary exp_summary =
18908334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 1), 1, 0);
19008334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
19108334c51SBrooks Davis }
19208334c51SBrooks Davis
19308334c51SBrooks Davis
19408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__all_pass);
ATF_TEST_CASE_BODY(parse_tap_output__all_pass)19508334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__all_pass)
19608334c51SBrooks Davis {
19708334c51SBrooks Davis const engine::tap_summary summary = do_parse(
19808334c51SBrooks Davis "1..8\n"
19908334c51SBrooks Davis "ok - 1\n"
20008334c51SBrooks Davis " Some diagnostic message\n"
20108334c51SBrooks Davis "ok - 2 This test also passed\n"
20208334c51SBrooks Davis "garbage line\n"
20308334c51SBrooks Davis "ok - 3 This test passed\n"
20408334c51SBrooks Davis "not ok 4 # SKIP Some reason\n"
20508334c51SBrooks Davis "not ok 5 # TODO Another reason\n"
20608334c51SBrooks Davis "ok - 6 Doesn't make a difference SKIP\n"
20708334c51SBrooks Davis "ok - 7 Doesn't make a difference either TODO\n"
20808334c51SBrooks Davis "ok # Also works without a number\n");
20908334c51SBrooks Davis
21008334c51SBrooks Davis const engine::tap_summary exp_summary =
21108334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 8), 8, 0);
21208334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
21308334c51SBrooks Davis }
21408334c51SBrooks Davis
21508334c51SBrooks Davis
21608334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__some_fail);
ATF_TEST_CASE_BODY(parse_tap_output__some_fail)21708334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__some_fail)
21808334c51SBrooks Davis {
21908334c51SBrooks Davis const engine::tap_summary summary = do_parse(
22008334c51SBrooks Davis "garbage line\n"
22108334c51SBrooks Davis "not ok - 1 This test failed\n"
22208334c51SBrooks Davis "ok - 2 This test passed\n"
22308334c51SBrooks Davis "not ok - 3 This test failed\n"
22408334c51SBrooks Davis "1..6\n"
22508334c51SBrooks Davis "not ok - 4 This test failed\n"
22608334c51SBrooks Davis "ok - 5 This test passed\n"
22708334c51SBrooks Davis "not ok # Fails as well without a number\n");
22808334c51SBrooks Davis
22908334c51SBrooks Davis const engine::tap_summary exp_summary =
23008334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 6), 2, 4);
23108334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
23208334c51SBrooks Davis }
23308334c51SBrooks Davis
23408334c51SBrooks Davis
23508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__skip_and_todo_variants);
ATF_TEST_CASE_BODY(parse_tap_output__skip_and_todo_variants)23608334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__skip_and_todo_variants)
23708334c51SBrooks Davis {
23808334c51SBrooks Davis const engine::tap_summary summary = do_parse(
23908334c51SBrooks Davis "1..8\n"
24008334c51SBrooks Davis "not ok - 1 # SKIP Some reason\n"
24108334c51SBrooks Davis "not ok - 2 # skip Some reason\n"
24208334c51SBrooks Davis "not ok - 3 # Skipped Some reason\n"
24308334c51SBrooks Davis "not ok - 4 # skipped Some reason\n"
24408334c51SBrooks Davis "not ok - 5 # Skipped: Some reason\n"
24508334c51SBrooks Davis "not ok - 6 # skipped: Some reason\n"
24608334c51SBrooks Davis "not ok - 7 # TODO Some reason\n"
24708334c51SBrooks Davis "not ok - 8 # todo Some reason\n");
24808334c51SBrooks Davis
24908334c51SBrooks Davis const engine::tap_summary exp_summary =
25008334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 8), 8, 0);
25108334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
25208334c51SBrooks Davis }
25308334c51SBrooks Davis
25408334c51SBrooks Davis
25508334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__skip_all_with_reason);
ATF_TEST_CASE_BODY(parse_tap_output__skip_all_with_reason)25608334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__skip_all_with_reason)
25708334c51SBrooks Davis {
25808334c51SBrooks Davis const engine::tap_summary summary = do_parse(
25908334c51SBrooks Davis "1..0 SKIP Some reason for skipping\n"
26008334c51SBrooks Davis "ok - 1\n"
26108334c51SBrooks Davis " Some diagnostic message\n"
26208334c51SBrooks Davis "ok - 6 Doesn't make a difference SKIP\n"
26308334c51SBrooks Davis "ok - 7 Doesn't make a difference either TODO\n");
26408334c51SBrooks Davis
26508334c51SBrooks Davis const engine::tap_summary exp_summary =
26608334c51SBrooks Davis engine::tap_summary::new_all_skipped("Some reason for skipping");
26708334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
26808334c51SBrooks Davis }
26908334c51SBrooks Davis
27008334c51SBrooks Davis
27108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__skip_all_without_reason);
ATF_TEST_CASE_BODY(parse_tap_output__skip_all_without_reason)27208334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__skip_all_without_reason)
27308334c51SBrooks Davis {
27408334c51SBrooks Davis const engine::tap_summary summary = do_parse(
27508334c51SBrooks Davis "1..0 unrecognized # garbage skip\n");
27608334c51SBrooks Davis
27708334c51SBrooks Davis const engine::tap_summary exp_summary =
27808334c51SBrooks Davis engine::tap_summary::new_all_skipped("No reason specified");
27908334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
28008334c51SBrooks Davis }
28108334c51SBrooks Davis
28208334c51SBrooks Davis
28308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__skip_all_invalid);
ATF_TEST_CASE_BODY(parse_tap_output__skip_all_invalid)28408334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__skip_all_invalid)
28508334c51SBrooks Davis {
28608334c51SBrooks Davis ATF_REQUIRE_THROW_RE(engine::load_error,
28708334c51SBrooks Davis "Skipped plan must be 1\\.\\.0",
28808334c51SBrooks Davis do_parse("1..3 # skip\n"));
28908334c51SBrooks Davis }
29008334c51SBrooks Davis
29108334c51SBrooks Davis
29208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__plan_at_end);
ATF_TEST_CASE_BODY(parse_tap_output__plan_at_end)29308334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__plan_at_end)
29408334c51SBrooks Davis {
29508334c51SBrooks Davis const engine::tap_summary summary = do_parse(
29608334c51SBrooks Davis "ok - 1\n"
29708334c51SBrooks Davis " Some diagnostic message\n"
29808334c51SBrooks Davis "ok - 2 This test also passed\n"
29908334c51SBrooks Davis "garbage line\n"
30008334c51SBrooks Davis "ok - 3 This test passed\n"
30108334c51SBrooks Davis "not ok 4 # SKIP Some reason\n"
30208334c51SBrooks Davis "not ok 5 # TODO Another reason\n"
30308334c51SBrooks Davis "ok - 6 Doesn't make a difference SKIP\n"
30408334c51SBrooks Davis "ok - 7 Doesn't make a difference either TODO\n"
30508334c51SBrooks Davis "1..7\n");
30608334c51SBrooks Davis
30708334c51SBrooks Davis const engine::tap_summary exp_summary =
30808334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 7), 7, 0);
30908334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
31008334c51SBrooks Davis }
31108334c51SBrooks Davis
31208334c51SBrooks Davis
31308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__stray_oks);
ATF_TEST_CASE_BODY(parse_tap_output__stray_oks)31408334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__stray_oks)
31508334c51SBrooks Davis {
31608334c51SBrooks Davis const engine::tap_summary summary = do_parse(
31708334c51SBrooks Davis "1..3\n"
31808334c51SBrooks Davis "ok - 1\n"
31908334c51SBrooks Davis "ok\n"
32008334c51SBrooks Davis "ok - 2 This test also passed\n"
32108334c51SBrooks Davis "not ok\n"
32208334c51SBrooks Davis "ok - 3 This test passed\n");
32308334c51SBrooks Davis
32408334c51SBrooks Davis const engine::tap_summary exp_summary =
32508334c51SBrooks Davis engine::tap_summary::new_results(engine::tap_plan(1, 3), 3, 0);
32608334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
32708334c51SBrooks Davis }
32808334c51SBrooks Davis
32908334c51SBrooks Davis
33008334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__no_plan);
ATF_TEST_CASE_BODY(parse_tap_output__no_plan)33108334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__no_plan)
33208334c51SBrooks Davis {
33308334c51SBrooks Davis ATF_REQUIRE_THROW_RE(
33408334c51SBrooks Davis engine::load_error,
33508334c51SBrooks Davis "Output did not contain any TAP plan",
33608334c51SBrooks Davis do_parse(
33708334c51SBrooks Davis "not ok - 1 This test failed\n"
33808334c51SBrooks Davis "ok - 2 This test passed\n"));
33908334c51SBrooks Davis }
34008334c51SBrooks Davis
34108334c51SBrooks Davis
34208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__double_plan);
ATF_TEST_CASE_BODY(parse_tap_output__double_plan)34308334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__double_plan)
34408334c51SBrooks Davis {
34508334c51SBrooks Davis ATF_REQUIRE_THROW_RE(
34608334c51SBrooks Davis engine::load_error,
34708334c51SBrooks Davis "Found duplicate plan",
34808334c51SBrooks Davis do_parse(
34908334c51SBrooks Davis "garbage line\n"
35008334c51SBrooks Davis "1..5\n"
35108334c51SBrooks Davis "not ok - 1 This test failed\n"
35208334c51SBrooks Davis "ok - 2 This test passed\n"
35308334c51SBrooks Davis "1..8\n"
35408334c51SBrooks Davis "ok\n"));
35508334c51SBrooks Davis }
35608334c51SBrooks Davis
35708334c51SBrooks Davis
35808334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__inconsistent_plan);
ATF_TEST_CASE_BODY(parse_tap_output__inconsistent_plan)35908334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__inconsistent_plan)
36008334c51SBrooks Davis {
36108334c51SBrooks Davis ATF_REQUIRE_THROW_RE(
36208334c51SBrooks Davis engine::load_error,
36308334c51SBrooks Davis "Reported plan differs from actual executed tests",
36408334c51SBrooks Davis do_parse(
36508334c51SBrooks Davis "1..3\n"
36608334c51SBrooks Davis "not ok - 1 This test failed\n"
36708334c51SBrooks Davis "ok - 2 This test passed\n"));
36808334c51SBrooks Davis }
36908334c51SBrooks Davis
37008334c51SBrooks Davis
37108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__inconsistent_trailing_plan);
ATF_TEST_CASE_BODY(parse_tap_output__inconsistent_trailing_plan)37208334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__inconsistent_trailing_plan)
37308334c51SBrooks Davis {
37408334c51SBrooks Davis ATF_REQUIRE_THROW_RE(
37508334c51SBrooks Davis engine::load_error,
37608334c51SBrooks Davis "Reported plan differs from actual executed tests",
37708334c51SBrooks Davis do_parse(
37808334c51SBrooks Davis "not ok - 1 This test failed\n"
37908334c51SBrooks Davis "ok - 2 This test passed\n"
38008334c51SBrooks Davis "1..3\n"));
38108334c51SBrooks Davis }
38208334c51SBrooks Davis
38308334c51SBrooks Davis
38408334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__insane_plan);
ATF_TEST_CASE_BODY(parse_tap_output__insane_plan)38508334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__insane_plan)
38608334c51SBrooks Davis {
38708334c51SBrooks Davis ATF_REQUIRE_THROW_RE(
38808334c51SBrooks Davis engine::load_error, "Invalid value",
38908334c51SBrooks Davis do_parse("120830981209831..234891793874080981092803981092312\n"));
39008334c51SBrooks Davis }
39108334c51SBrooks Davis
39208334c51SBrooks Davis
39308334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__reversed_plan);
ATF_TEST_CASE_BODY(parse_tap_output__reversed_plan)39408334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__reversed_plan)
39508334c51SBrooks Davis {
39608334c51SBrooks Davis ATF_REQUIRE_THROW_RE(engine::load_error,
39708334c51SBrooks Davis "Found reversed plan 8\\.\\.5",
39808334c51SBrooks Davis do_parse("8..5\n"));
39908334c51SBrooks Davis }
40008334c51SBrooks Davis
40108334c51SBrooks Davis
40208334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__bail_out);
ATF_TEST_CASE_BODY(parse_tap_output__bail_out)40308334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__bail_out)
40408334c51SBrooks Davis {
40508334c51SBrooks Davis const engine::tap_summary summary = do_parse(
40608334c51SBrooks Davis "1..3\n"
40708334c51SBrooks Davis "not ok - 1 This test failed\n"
40808334c51SBrooks Davis "Bail out! There is some unknown problem\n"
40908334c51SBrooks Davis "ok - 2 This test passed\n");
41008334c51SBrooks Davis
41108334c51SBrooks Davis const engine::tap_summary exp_summary =
41208334c51SBrooks Davis engine::tap_summary::new_bailed_out();
41308334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
41408334c51SBrooks Davis }
41508334c51SBrooks Davis
41608334c51SBrooks Davis
41708334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__bail_out_wins_over_no_plan);
ATF_TEST_CASE_BODY(parse_tap_output__bail_out_wins_over_no_plan)41808334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__bail_out_wins_over_no_plan)
41908334c51SBrooks Davis {
42008334c51SBrooks Davis const engine::tap_summary summary = do_parse(
42108334c51SBrooks Davis "not ok - 1 This test failed\n"
42208334c51SBrooks Davis "Bail out! There is some unknown problem\n"
42308334c51SBrooks Davis "ok - 2 This test passed\n");
42408334c51SBrooks Davis
42508334c51SBrooks Davis const engine::tap_summary exp_summary =
42608334c51SBrooks Davis engine::tap_summary::new_bailed_out();
42708334c51SBrooks Davis ATF_REQUIRE_EQ(exp_summary, summary);
42808334c51SBrooks Davis }
42908334c51SBrooks Davis
43008334c51SBrooks Davis
43108334c51SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(parse_tap_output__open_failure);
ATF_TEST_CASE_BODY(parse_tap_output__open_failure)43208334c51SBrooks Davis ATF_TEST_CASE_BODY(parse_tap_output__open_failure)
43308334c51SBrooks Davis {
43408334c51SBrooks Davis ATF_REQUIRE_THROW_RE(engine::load_error, "hello.txt.*Failed to open",
43508334c51SBrooks Davis engine::parse_tap_output(fs::path("hello.txt")));
43608334c51SBrooks Davis }
43708334c51SBrooks Davis
43808334c51SBrooks Davis
ATF_INIT_TEST_CASES(tcs)43908334c51SBrooks Davis ATF_INIT_TEST_CASES(tcs)
44008334c51SBrooks Davis {
44108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, tap_summary__bailed_out);
44208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, tap_summary__some_results);
44308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, tap_summary__all_skipped);
44408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, tap_summary__equality_operators);
44508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, tap_summary__output);
44608334c51SBrooks Davis
44708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__only_one_result);
44808334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__all_pass);
44908334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__some_fail);
45008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__skip_and_todo_variants);
45108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__skip_all_without_reason);
45208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__skip_all_with_reason);
45308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__skip_all_invalid);
45408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__plan_at_end);
45508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__stray_oks);
45608334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__no_plan);
45708334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__double_plan);
45808334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__inconsistent_plan);
45908334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__inconsistent_trailing_plan);
46008334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__insane_plan);
46108334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__reversed_plan);
46208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__bail_out);
46308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__bail_out_wins_over_no_plan);
46408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, parse_tap_output__open_failure);
46508334c51SBrooks Davis }
466