Blame engine/filters_test.cpp

Packit 209faa
// Copyright 2011 The Kyua Authors.
Packit 209faa
// All rights reserved.
Packit 209faa
//
Packit 209faa
// Redistribution and use in source and binary forms, with or without
Packit 209faa
// modification, are permitted provided that the following conditions are
Packit 209faa
// met:
Packit 209faa
//
Packit 209faa
// * Redistributions of source code must retain the above copyright
Packit 209faa
//   notice, this list of conditions and the following disclaimer.
Packit 209faa
// * Redistributions in binary form must reproduce the above copyright
Packit 209faa
//   notice, this list of conditions and the following disclaimer in the
Packit 209faa
//   documentation and/or other materials provided with the distribution.
Packit 209faa
// * Neither the name of Google Inc. nor the names of its contributors
Packit 209faa
//   may be used to endorse or promote products derived from this software
Packit 209faa
//   without specific prior written permission.
Packit 209faa
//
Packit 209faa
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 209faa
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 209faa
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 209faa
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 209faa
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 209faa
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 209faa
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 209faa
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 209faa
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 209faa
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 209faa
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 209faa
Packit 209faa
#include "engine/filters.hpp"
Packit 209faa
Packit 209faa
#include <stdexcept>
Packit 209faa
Packit 209faa
#include <atf-c++.hpp>
Packit 209faa
Packit 209faa
namespace fs = utils::fs;
Packit 209faa
Packit 209faa
Packit 209faa
namespace {
Packit 209faa
Packit 209faa
Packit 209faa
/// Syntactic sugar to instantiate engine::test_filter objects.
Packit 209faa
inline engine::test_filter
Packit 209faa
mkfilter(const char* test_program, const char* test_case)
Packit 209faa
{
Packit 209faa
    return engine::test_filter(fs::path(test_program), test_case);
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
}  // anonymous namespace
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__public_fields);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__public_fields)
Packit 209faa
{
Packit 209faa
    const engine::test_filter filter(fs::path("foo/bar"), "baz");
Packit 209faa
    ATF_REQUIRE_EQ(fs::path("foo/bar"), filter.test_program);
Packit 209faa
    ATF_REQUIRE_EQ("baz", filter.test_case);
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__parse__ok);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__parse__ok)
Packit 209faa
{
Packit 209faa
    const engine::test_filter filter(engine::test_filter::parse("foo"));
Packit 209faa
    ATF_REQUIRE_EQ(fs::path("foo"), filter.test_program);
Packit 209faa
    ATF_REQUIRE(filter.test_case.empty());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__parse__empty);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__parse__empty)
Packit 209faa
{
Packit 209faa
    ATF_REQUIRE_THROW_RE(std::runtime_error, "empty",
Packit 209faa
                         engine::test_filter::parse(""));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__parse__absolute);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__parse__absolute)
Packit 209faa
{
Packit 209faa
    ATF_REQUIRE_THROW_RE(std::runtime_error, "'/foo/bar'.*relative",
Packit 209faa
                         engine::test_filter::parse("/foo//bar"));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__parse__bad_program_name);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__parse__bad_program_name)
Packit 209faa
{
Packit 209faa
    ATF_REQUIRE_THROW_RE(std::runtime_error, "Program name.*':foo'",
Packit 209faa
                         engine::test_filter::parse(":foo"));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__parse__bad_test_case);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__parse__bad_test_case)
Packit 209faa
{
Packit 209faa
    ATF_REQUIRE_THROW_RE(std::runtime_error, "Test case.*'bar/baz:'",
Packit 209faa
                         engine::test_filter::parse("bar/baz:"));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__parse__bad_path);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__parse__bad_path)
Packit 209faa
{
Packit 209faa
    // TODO(jmmv): Not implemented.  At the moment, the only reason for a path
Packit 209faa
    // to be invalid is if it is empty... but we are checking this exact
Packit 209faa
    // condition ourselves as part of the input validation.  So we can't mock in
Packit 209faa
    // an argument with an invalid non-empty path...
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__str);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__str)
Packit 209faa
{
Packit 209faa
    const engine::test_filter filter(fs::path("foo/bar"), "baz");
Packit 209faa
    ATF_REQUIRE_EQ("foo/bar:baz", filter.str());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__contains__same);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__contains__same)
Packit 209faa
{
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("foo/bar"), "baz");
Packit 209faa
        ATF_REQUIRE(f.contains(f));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("foo/bar"), "");
Packit 209faa
        ATF_REQUIRE(f.contains(f));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("foo"), "");
Packit 209faa
        ATF_REQUIRE(f.contains(f));
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__contains__different);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__contains__different)
Packit 209faa
{
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("foo"), "");
Packit 209faa
        const engine::test_filter f2(fs::path("foo"), "bar");
Packit 209faa
        ATF_REQUIRE( f1.contains(f2));
Packit 209faa
        ATF_REQUIRE(!f2.contains(f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("foo/bar"), "");
Packit 209faa
        const engine::test_filter f2(fs::path("foo/bar"), "baz");
Packit 209faa
        ATF_REQUIRE( f1.contains(f2));
Packit 209faa
        ATF_REQUIRE(!f2.contains(f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("foo/bar"), "");
Packit 209faa
        const engine::test_filter f2(fs::path("foo/baz"), "");
Packit 209faa
        ATF_REQUIRE(!f1.contains(f2));
Packit 209faa
        ATF_REQUIRE(!f2.contains(f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("foo"), "");
Packit 209faa
        const engine::test_filter f2(fs::path("foo/bar"), "");
Packit 209faa
        ATF_REQUIRE( f1.contains(f2));
Packit 209faa
        ATF_REQUIRE(!f2.contains(f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("foo"), "bar");
Packit 209faa
        const engine::test_filter f2(fs::path("foo/bar"), "");
Packit 209faa
        ATF_REQUIRE(!f1.contains(f2));
Packit 209faa
        ATF_REQUIRE(!f2.contains(f1));
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__matches_test_program)
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__matches_test_program)
Packit 209faa
{
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("top"), "unused");
Packit 209faa
        ATF_REQUIRE( f.matches_test_program(fs::path("top")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("top2")));
Packit 209faa
    }
Packit 209faa
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("dir1/dir2"), "");
Packit 209faa
        ATF_REQUIRE( f.matches_test_program(fs::path("dir1/dir2/foo")));
Packit 209faa
        ATF_REQUIRE( f.matches_test_program(fs::path("dir1/dir2/bar")));
Packit 209faa
        ATF_REQUIRE( f.matches_test_program(fs::path("dir1/dir2/bar/baz")));
Packit 209faa
        ATF_REQUIRE( f.matches_test_program(fs::path("dir1/dir2/bar/baz")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1/bar/baz")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir2/bar/baz")));
Packit 209faa
    }
Packit 209faa
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("dir1/dir2"), "unused");
Packit 209faa
        ATF_REQUIRE( f.matches_test_program(fs::path("dir1/dir2")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1/dir2/foo")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1/dir2/bar")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1/dir2/bar/baz")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1/dir2/bar/baz")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir1/bar/baz")));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_program(fs::path("dir2/bar/baz")));
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__matches_test_case)
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__matches_test_case)
Packit 209faa
{
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("top"), "foo");
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("top"), "foo"));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_case(fs::path("top"), "bar"));
Packit 209faa
    }
Packit 209faa
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("top"), "");
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("top"), "foo"));
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("top"), "bar"));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_case(fs::path("top2"), "foo"));
Packit 209faa
    }
Packit 209faa
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("d1/d2/prog"), "t1");
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("d1/d2/prog"), "t1"));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_case(fs::path("d1/d2/prog"), "t2"));
Packit 209faa
    }
Packit 209faa
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f(fs::path("d1/d2"), "");
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("d1/d2/prog"), "t1"));
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("d1/d2/prog"), "t2"));
Packit 209faa
        ATF_REQUIRE( f.matches_test_case(fs::path("d1/d2/prog2"), "t2"));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_case(fs::path("d1/d3"), "foo"));
Packit 209faa
        ATF_REQUIRE(!f.matches_test_case(fs::path("d2"), "foo"));
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__operator_lt)
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__operator_lt)
Packit 209faa
{
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("d1/d2"), "");
Packit 209faa
        ATF_REQUIRE(!(f1 < f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("d1/d2"), "");
Packit 209faa
        const engine::test_filter f2(fs::path("d1/d3"), "");
Packit 209faa
        ATF_REQUIRE( (f1 < f2));
Packit 209faa
        ATF_REQUIRE(!(f2 < f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("d1/d2"), "");
Packit 209faa
        const engine::test_filter f2(fs::path("d1/d2"), "foo");
Packit 209faa
        ATF_REQUIRE( (f1 < f2));
Packit 209faa
        ATF_REQUIRE(!(f2 < f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("d1/d2"), "bar");
Packit 209faa
        const engine::test_filter f2(fs::path("d1/d2"), "foo");
Packit 209faa
        ATF_REQUIRE( (f1 < f2));
Packit 209faa
        ATF_REQUIRE(!(f2 < f1));
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        const engine::test_filter f1(fs::path("d1/d2"), "bar");
Packit 209faa
        const engine::test_filter f2(fs::path("d1/d3"), "");
Packit 209faa
        ATF_REQUIRE( (f1 < f2));
Packit 209faa
        ATF_REQUIRE(!(f2 < f1));
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__operator_eq)
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__operator_eq)
Packit 209faa
{
Packit 209faa
    const engine::test_filter f1(fs::path("d1/d2"), "");
Packit 209faa
    const engine::test_filter f2(fs::path("d1/d2"), "bar");
Packit 209faa
    ATF_REQUIRE( (f1 == f1));
Packit 209faa
    ATF_REQUIRE(!(f1 == f2));
Packit 209faa
    ATF_REQUIRE(!(f2 == f1));
Packit 209faa
    ATF_REQUIRE( (f2 == f2));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__operator_ne)
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__operator_ne)
Packit 209faa
{
Packit 209faa
    const engine::test_filter f1(fs::path("d1/d2"), "");
Packit 209faa
    const engine::test_filter f2(fs::path("d1/d2"), "bar");
Packit 209faa
    ATF_REQUIRE(!(f1 != f1));
Packit 209faa
    ATF_REQUIRE( (f1 != f2));
Packit 209faa
    ATF_REQUIRE( (f2 != f1));
Packit 209faa
    ATF_REQUIRE(!(f2 != f2));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filter__output);
Packit 209faa
ATF_TEST_CASE_BODY(test_filter__output)
Packit 209faa
{
Packit 209faa
    {
Packit 209faa
        std::ostringstream str;
Packit 209faa
        str << engine::test_filter(fs::path("d1/d2"), "");
Packit 209faa
        ATF_REQUIRE_EQ(
Packit 209faa
            "test_filter{test_program=d1/d2}",
Packit 209faa
            str.str());
Packit 209faa
    }
Packit 209faa
    {
Packit 209faa
        std::ostringstream str;
Packit 209faa
        str << engine::test_filter(fs::path("d1/d2"), "bar");
Packit 209faa
        ATF_REQUIRE_EQ(
Packit 209faa
            "test_filter{test_program=d1/d2, test_case=bar}",
Packit 209faa
            str.str());
Packit 209faa
    }
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__match_test_case__no_filters)
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__match_test_case__no_filters)
Packit 209faa
{
Packit 209faa
    const std::set< engine::test_filter > raw_filters;
Packit 209faa
Packit 209faa
    const engine::test_filters filters(raw_filters);
Packit 209faa
    engine::test_filters::match match;
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("foo"), "baz");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE(!match.second);
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("foo/bar"), "baz");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE(!match.second);
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__match_test_case__some_filters)
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__match_test_case__some_filters)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > raw_filters;
Packit 209faa
    raw_filters.insert(mkfilter("top_test", ""));
Packit 209faa
    raw_filters.insert(mkfilter("subdir_1", ""));
Packit 209faa
    raw_filters.insert(mkfilter("subdir_2/a_test", ""));
Packit 209faa
    raw_filters.insert(mkfilter("subdir_2/b_test", "foo"));
Packit 209faa
Packit 209faa
    const engine::test_filters filters(raw_filters);
Packit 209faa
    engine::test_filters::match match;
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("top_test"), "a");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE_EQ("top_test", match.second.get().str());
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_1/foo"), "a");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE_EQ("subdir_1", match.second.get().str());
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_1/bar"), "z");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE_EQ("subdir_1", match.second.get().str());
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_2/a_test"), "bar");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE_EQ("subdir_2/a_test", match.second.get().str());
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_2/b_test"), "foo");
Packit 209faa
    ATF_REQUIRE(match.first);
Packit 209faa
    ATF_REQUIRE_EQ("subdir_2/b_test:foo", match.second.get().str());
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_2/b_test"), "bar");
Packit 209faa
    ATF_REQUIRE(!match.first);
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_2/c_test"), "foo");
Packit 209faa
    ATF_REQUIRE(!match.first);
Packit 209faa
Packit 209faa
    match = filters.match_test_case(fs::path("subdir_3"), "hello");
Packit 209faa
    ATF_REQUIRE(!match.first);
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__match_test_program__no_filters)
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__match_test_program__no_filters)
Packit 209faa
{
Packit 209faa
    const std::set< engine::test_filter > raw_filters;
Packit 209faa
Packit 209faa
    const engine::test_filters filters(raw_filters);
Packit 209faa
    ATF_REQUIRE(filters.match_test_program(fs::path("foo")));
Packit 209faa
    ATF_REQUIRE(filters.match_test_program(fs::path("foo/bar")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__match_test_program__some_filters)
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__match_test_program__some_filters)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > raw_filters;
Packit 209faa
    raw_filters.insert(mkfilter("top_test", ""));
Packit 209faa
    raw_filters.insert(mkfilter("subdir_1", ""));
Packit 209faa
    raw_filters.insert(mkfilter("subdir_2/a_test", ""));
Packit 209faa
    raw_filters.insert(mkfilter("subdir_2/b_test", "foo"));
Packit 209faa
Packit 209faa
    const engine::test_filters filters(raw_filters);
Packit 209faa
    ATF_REQUIRE( filters.match_test_program(fs::path("top_test")));
Packit 209faa
    ATF_REQUIRE( filters.match_test_program(fs::path("subdir_1/foo")));
Packit 209faa
    ATF_REQUIRE( filters.match_test_program(fs::path("subdir_1/bar")));
Packit 209faa
    ATF_REQUIRE( filters.match_test_program(fs::path("subdir_2/a_test")));
Packit 209faa
    ATF_REQUIRE( filters.match_test_program(fs::path("subdir_2/b_test")));
Packit 209faa
    ATF_REQUIRE(!filters.match_test_program(fs::path("subdir_2/c_test")));
Packit 209faa
    ATF_REQUIRE(!filters.match_test_program(fs::path("subdir_3")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__difference__no_filters);
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__difference__no_filters)
Packit 209faa
{
Packit 209faa
    const std::set< engine::test_filter > in_filters;
Packit 209faa
    const std::set< engine::test_filter > used;
Packit 209faa
    const std::set< engine::test_filter > diff = engine::test_filters(
Packit 209faa
        in_filters).difference(used);
Packit 209faa
    ATF_REQUIRE(diff.empty());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__difference__some_filters__all_used);
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__difference__some_filters__all_used)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > in_filters;
Packit 209faa
    in_filters.insert(mkfilter("a", ""));
Packit 209faa
    in_filters.insert(mkfilter("b", "c"));
Packit 209faa
Packit 209faa
    const std::set< engine::test_filter > used = in_filters;
Packit 209faa
Packit 209faa
    const std::set< engine::test_filter > diff = engine::test_filters(
Packit 209faa
        in_filters).difference(used);
Packit 209faa
    ATF_REQUIRE(diff.empty());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(test_filters__difference__some_filters__some_unused);
Packit 209faa
ATF_TEST_CASE_BODY(test_filters__difference__some_filters__some_unused)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > in_filters;
Packit 209faa
    in_filters.insert(mkfilter("a", ""));
Packit 209faa
    in_filters.insert(mkfilter("b", "c"));
Packit 209faa
    in_filters.insert(mkfilter("d", ""));
Packit 209faa
    in_filters.insert(mkfilter("e", "f"));
Packit 209faa
Packit 209faa
    std::set< engine::test_filter > used;
Packit 209faa
    used.insert(mkfilter("b", "c"));
Packit 209faa
    used.insert(mkfilter("d", ""));
Packit 209faa
Packit 209faa
    const std::set< engine::test_filter > diff = engine::test_filters(
Packit 209faa
        in_filters).difference(used);
Packit 209faa
    ATF_REQUIRE_EQ(2, diff.size());
Packit 209faa
    ATF_REQUIRE(diff.find(mkfilter("a", "")) != diff.end());
Packit 209faa
    ATF_REQUIRE(diff.find(mkfilter("e", "f")) != diff.end());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(check_disjoint_filters__ok);
Packit 209faa
ATF_TEST_CASE_BODY(check_disjoint_filters__ok)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > filters;
Packit 209faa
    filters.insert(mkfilter("a", ""));
Packit 209faa
    filters.insert(mkfilter("b", ""));
Packit 209faa
    filters.insert(mkfilter("c", "a"));
Packit 209faa
    filters.insert(mkfilter("c", "b"));
Packit 209faa
Packit 209faa
    engine::check_disjoint_filters(filters);
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(check_disjoint_filters__fail);
Packit 209faa
ATF_TEST_CASE_BODY(check_disjoint_filters__fail)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > filters;
Packit 209faa
    filters.insert(mkfilter("a", ""));
Packit 209faa
    filters.insert(mkfilter("b", ""));
Packit 209faa
    filters.insert(mkfilter("c", "a"));
Packit 209faa
    filters.insert(mkfilter("d", "b"));
Packit 209faa
    filters.insert(mkfilter("c", ""));
Packit 209faa
Packit 209faa
    ATF_REQUIRE_THROW_RE(std::runtime_error, "'c'.*'c:a'.*not disjoint",
Packit 209faa
                         engine::check_disjoint_filters(filters));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(filters_state__match_test_program);
Packit 209faa
ATF_TEST_CASE_BODY(filters_state__match_test_program)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > filters;
Packit 209faa
    filters.insert(mkfilter("foo/bar", ""));
Packit 209faa
    filters.insert(mkfilter("baz", "tc"));
Packit 209faa
    engine::filters_state state(filters);
Packit 209faa
Packit 209faa
    ATF_REQUIRE(state.match_test_program(fs::path("foo/bar/something")));
Packit 209faa
    ATF_REQUIRE(state.match_test_program(fs::path("baz")));
Packit 209faa
Packit 209faa
    ATF_REQUIRE(!state.match_test_program(fs::path("foo/baz")));
Packit 209faa
    ATF_REQUIRE(!state.match_test_program(fs::path("hello")));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(filters_state__match_test_case);
Packit 209faa
ATF_TEST_CASE_BODY(filters_state__match_test_case)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > filters;
Packit 209faa
    filters.insert(mkfilter("foo/bar", ""));
Packit 209faa
    filters.insert(mkfilter("baz", "tc"));
Packit 209faa
    engine::filters_state state(filters);
Packit 209faa
Packit 209faa
    ATF_REQUIRE(state.match_test_case(fs::path("foo/bar/something"), "any"));
Packit 209faa
    ATF_REQUIRE(state.match_test_case(fs::path("baz"), "tc"));
Packit 209faa
Packit 209faa
    ATF_REQUIRE(!state.match_test_case(fs::path("foo/baz/something"), "tc"));
Packit 209faa
    ATF_REQUIRE(!state.match_test_case(fs::path("baz"), "tc2"));
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(filters_state__unused__none);
Packit 209faa
ATF_TEST_CASE_BODY(filters_state__unused__none)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > filters;
Packit 209faa
    filters.insert(mkfilter("a/b", ""));
Packit 209faa
    filters.insert(mkfilter("baz", "tc"));
Packit 209faa
    filters.insert(mkfilter("hey/d", "yes"));
Packit 209faa
    engine::filters_state state(filters);
Packit 209faa
Packit 209faa
    state.match_test_case(fs::path("a/b/c"), "any");
Packit 209faa
    state.match_test_case(fs::path("baz"), "tc");
Packit 209faa
    state.match_test_case(fs::path("hey/d"), "yes");
Packit 209faa
Packit 209faa
    ATF_REQUIRE(state.unused().empty());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_TEST_CASE_WITHOUT_HEAD(filters_state__unused__some);
Packit 209faa
ATF_TEST_CASE_BODY(filters_state__unused__some)
Packit 209faa
{
Packit 209faa
    std::set< engine::test_filter > filters;
Packit 209faa
    filters.insert(mkfilter("a/b", ""));
Packit 209faa
    filters.insert(mkfilter("baz", "tc"));
Packit 209faa
    filters.insert(mkfilter("hey/d", "yes"));
Packit 209faa
    engine::filters_state state(filters);
Packit 209faa
Packit 209faa
    state.match_test_program(fs::path("a/b/c"));
Packit 209faa
    state.match_test_case(fs::path("baz"), "tc");
Packit 209faa
Packit 209faa
    std::set< engine::test_filter > exp_unused;
Packit 209faa
    exp_unused.insert(mkfilter("a/b", ""));
Packit 209faa
    exp_unused.insert(mkfilter("hey/d", "yes"));
Packit 209faa
Packit 209faa
    ATF_REQUIRE(exp_unused == state.unused());
Packit 209faa
}
Packit 209faa
Packit 209faa
Packit 209faa
ATF_INIT_TEST_CASES(tcs)
Packit 209faa
{
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__public_fields);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__parse__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__parse__empty);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__parse__absolute);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__parse__bad_program_name);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__parse__bad_test_case);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__parse__bad_path);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__str);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__contains__same);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__contains__different);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__matches_test_program);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__matches_test_case);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__operator_lt);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__operator_eq);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__operator_ne);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filter__output);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__match_test_case__no_filters);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__match_test_case__some_filters);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__match_test_program__no_filters);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__match_test_program__some_filters);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__difference__no_filters);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__difference__some_filters__all_used);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, test_filters__difference__some_filters__some_unused);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, check_disjoint_filters__ok);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, check_disjoint_filters__fail);
Packit 209faa
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, filters_state__match_test_program);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, filters_state__match_test_case);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, filters_state__unused__none);
Packit 209faa
    ATF_ADD_TEST_CASE(tcs, filters_state__unused__some);
Packit 209faa
}