xaizek / uncov (License: AGPLv3+) (since 2018-12-07)
Uncov(er) is a tool that collects and processes code coverage reports.
<root> / tests / SubCommand.cpp (7a3286522e0225db225dfd69bccba9738519dbf2) (2,595B) (mode 100644) [raw]
// Copyright (C) 2020 xaizek <xaizek@posteo.net>
//
// This file is part of uncov.
//
// uncov is free software: you can redistribute it and/or modify
// it under the terms of version 3 of the GNU Affero General Public License as
// published by the Free Software Foundation.
//
// uncov is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with uncov.  If not, see <http://www.gnu.org/licenses/>.

#include "Catch/catch.hpp"

#include <iostream>
#include <stdexcept>

#include "BuildHistory.hpp"
#include "DB.hpp"
#include "Repository.hpp"
#include "SubCommand.hpp"
#include "Uncov.hpp"

#include "TestUtils.hpp"

class TestSubCommand : public SubCommand
{
public:
    using SubCommand::SubCommand;
    using SubCommand::describe;

    virtual bool
    isGeneric() const override
    {
        return generic;
    }

    virtual void execImpl(const std::string &/*alias*/,
                          const std::vector<std::string> &/*args*/) override
    { }

    virtual void printHelp(std::ostream &/*os*/,
                           const std::string &/*alias*/) const override
    { }

    bool generic = false;
};

TEST_CASE("Description for unregistered alias is rejected", "[SubCommand]")
{
    TestSubCommand cmd({ "name" });
    CHECK_NOTHROW(cmd.describe("name", "descr"));
    CHECK_THROWS_AS(cmd.describe("not-an-alias", "descr"),
                    const std::logic_error &);
}

TEST_CASE("Alias can be described only once", "[SubCommand]")
{
    TestSubCommand cmd({ "name" });
    CHECK_NOTHROW(cmd.describe("name", "descr"));
    CHECK_THROWS_AS(cmd.describe("name", "descr"), const std::logic_error &);
}

TEST_CASE("Repo command must be called using repo method", "[SubCommand]")
{
    Uncov uncov({ "uncov", "repo" });

    TestSubCommand cmd({ "repo" });
    cmd.describe("repo", "descr");
    cmd.generic = false;

    CHECK_THROWS_AS(cmd.exec(uncov, "repo", { }), const std::logic_error &);
}

TEST_CASE("Generic command must be called using generic method", "[SubCommand]")
{
    Repository repo("tests/test-repo/subdir");
    DB db(getDbPath(repo));
    BuildHistory bh(db);

    TestSubCommand cmd({ "generic" });
    cmd.describe("generic", "descr");
    cmd.generic = true;

    CHECK_THROWS_AS(cmd.exec(getSettings(), bh, repo, "generic", { }),
                    const std::logic_error &);
}
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/uncov

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/uncov

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master