Skip to content

Commit

Permalink
wip: argument_name_refactor - some errors occured
Browse files Browse the repository at this point in the history
  • Loading branch information
SpectraL519 committed Mar 30, 2024
1 parent 2415be8 commit 0d1755c
Show file tree
Hide file tree
Showing 7 changed files with 286 additions and 332 deletions.
246 changes: 102 additions & 144 deletions include/ap/argument_parser.hpp

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions test/include/argument_parser_test_fixture.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ struct argument_parser_test_fixture {
using invalid_argument_value_type = int;

// test utility functions
[[nodiscard]] std::string prepare_arg_flag(std::size_t i) const {
[[nodiscard]] std::string prepare_arg_flag_primary(std::size_t i) const {
return "--test_arg_" + std::to_string(i);
}

[[nodiscard]] std::string prepare_arg_flag_short(std::size_t i) const {
[[nodiscard]] std::string prepare_arg_flag_secondary(std::size_t i) const {
return "-ta_" + std::to_string(i);
}

Expand Down Expand Up @@ -58,7 +58,7 @@ struct argument_parser_test_fixture {
}

for (std::size_t i = args_split; i < num_args; i++) { // optional args
std::string arg = prepare_arg_flag(i);
std::string arg = prepare_arg_flag_primary(i);
std::string arg_v = prepare_arg_value(i);

const std::size_t arg_i = 2 * i - args_split + 1;
Expand Down
58 changes: 28 additions & 30 deletions test/source/test_argument_name.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ constexpr std::string_view secondary_name = "t";
constexpr std::string_view other_primary_name = "other";
constexpr std::string_view other_secondary_name = "o";

argument_name default_argument_name_long_name() {
argument_name default_argument_name_primary() {
return argument_name(primary_name);
}

argument_name default_argument_name_both_names() {
argument_name default_argument_name_primary_and_secondary() {
return argument_name(primary_name, secondary_name);
}

Expand All @@ -32,14 +32,14 @@ TEST_SUITE_BEGIN("test_argument_name");

TEST_CASE("argument_name.primary member should be correctly "
"initialized") {
const auto arg_name = default_argument_name_long_name();
const auto arg_name = default_argument_name_primary();

REQUIRE_EQ(arg_name.primary, primary_name);
}

TEST_CASE("argument_name members should be correctly "
"initialized") {
const auto arg_name = default_argument_name_both_names();
const auto arg_name = default_argument_name_primary_and_secondary();

REQUIRE_EQ(arg_name.primary, primary_name);

Expand All @@ -49,65 +49,63 @@ TEST_CASE("argument_name members should be correctly "

TEST_CASE("argument_name::operator==(argument_name) should "
"return true if primary names are equal") {
const auto arg_name_a = default_argument_name_long_name();
const auto arg_name_b = default_argument_name_both_names();
const auto arg_name_a = default_argument_name_primary();
const auto arg_name_b = default_argument_name_primary_and_secondary();

REQUIRE(arg_name_a == arg_name_b);
REQUIRE_EQ(arg_name_a, arg_name_b);
}

TEST_CASE("argument_name::operator==(argument_name) should "
"return false if primary names are not equal") {
const auto arg_name_a = default_argument_name_long_name();
const auto arg_name_b = argument_name(other_primary_name, other_secondary_name);
const auto arg_name_a = default_argument_name_primary();
const auto arg_name_b = argument_name{other_primary_name, other_secondary_name};

REQUIRE_FALSE(arg_name_a == arg_name_b);
REQUIRE_NE(arg_name_a, arg_name_b);
}

TEST_CASE("argument_name::operator==(string_view) should "
"return true if at "
"least one primary_name matches") {
SUBCASE("argument_name with long primary_name only") {
const auto arg_name = default_argument_name_long_name();
"return true if at least one primary name matches") {
SUBCASE("argument_name with primary name only") {
const auto arg_name = default_argument_name_primary();

REQUIRE(arg_name == primary_name);
REQUIRE_EQ(arg_name, primary_name);
}

SUBCASE("argument_name with both names") {
const auto arg_name = default_argument_name_both_names();
const auto arg_name = default_argument_name_primary_and_secondary();

REQUIRE(arg_name == primary_name);
REQUIRE(arg_name == secondary_name);
REQUIRE_EQ(arg_name, primary_name);
REQUIRE_EQ(arg_name, secondary_name);
}
}

TEST_CASE("argument_name::operator==(string_view) should "
"return false if no "
"primary_name matches") {
SUBCASE("argument_name with long primary_name only") {
const auto arg_name = default_argument_name_long_name();
"return false if no primary name matches") {
SUBCASE("argument_name with primary name only") {
const auto arg_name = default_argument_name_primary();

REQUIRE_FALSE(arg_name == other_primary_name);
REQUIRE_FALSE(arg_name == other_secondary_name);
REQUIRE_NE(arg_name, other_primary_name);
REQUIRE_NE(arg_name, other_secondary_name);
}

SUBCASE("argument_name with both names") {
const auto arg_name = default_argument_name_both_names();
const auto arg_name = default_argument_name_primary_and_secondary();

REQUIRE_FALSE(arg_name == other_primary_name);
REQUIRE_FALSE(arg_name == other_secondary_name);
REQUIRE_NE(arg_name, other_primary_name);
REQUIRE_NE(arg_name, other_secondary_name);
}
}

TEST_CASE("operator<< should push correct data to the output stream") {
std::stringstream ss, expected_ss;

SUBCASE("argument_name with long primary_name only") {
ss << default_argument_name_long_name();
SUBCASE("argument_name with primary name only") {
ss << default_argument_name_primary();
expected_ss << "[" << primary_name << "]";
}

SUBCASE("argument_name with both names") {
ss << default_argument_name_both_names();
ss << default_argument_name_primary_and_secondary();
expected_ss << "[" << primary_name << "," << secondary_name << "]";
}

Expand Down
53 changes: 29 additions & 24 deletions test/source/test_argument_parser_add_argument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ using namespace ap::argument;

namespace {

constexpr std::string_view name = "test";
constexpr std::string_view short_name = "t";
constexpr std::string_view primary_name = "test";
constexpr std::string_view secondary_name = "t";

constexpr std::string_view other_name = "other";
constexpr std::string_view other_short_name = "o";
constexpr std::string_view other_primary_name = "other";
constexpr std::string_view other_secondary_name = "o";

} // namespace

Expand All @@ -28,8 +28,13 @@ TEST_CASE_FIXTURE(argument_parser_test_fixture, "default_positional_arguments sh
{ ap::default_argument::positional::input, ap::default_argument::positional::output }
);

std::cout << ">>> add - ok" << std::endl;

REQUIRE_FALSE(sut_get_argument("input")->get().is_optional());
std::cout << ">>> input - ok" << std::endl;

REQUIRE_FALSE(sut_get_argument("output")->get().is_optional());
std::cout << ">>> output - ok" << std::endl;
}

TEST_CASE_FIXTURE(argument_parser_test_fixture, "default_optional_arguments should add the specified arguments") {
Expand All @@ -50,7 +55,7 @@ TEST_CASE_FIXTURE(argument_parser_test_fixture, "default_optional_arguments shou
}

TEST_CASE_FIXTURE(argument_parser_test_fixture, "add_positional_argument should return a positional argument reference") {
const auto& argument = sut.add_positional_argument(name, short_name);
const auto& argument = sut.add_positional_argument(primary_name, secondary_name);
REQUIRE_FALSE(argument.is_optional());
}

Expand All @@ -59,23 +64,23 @@ TEST_CASE_FIXTURE(
"add_positional_argument should throw only when adding an"
"argument with a previously used name"
) {
sut.add_positional_argument(name, short_name);
sut.add_positional_argument(primary_name, secondary_name);

SUBCASE("adding argument with a unique name") {
REQUIRE_NOTHROW(sut.add_positional_argument(other_name, other_short_name));
REQUIRE_NOTHROW(sut.add_positional_argument(other_primary_name, other_secondary_name));
}

SUBCASE("adding argument with a previously used primary name") {
REQUIRE_THROWS_AS(sut.add_positional_argument(name, other_short_name), ap::error::argument_name_used_error);
REQUIRE_THROWS_AS(sut.add_positional_argument(primary_name, other_secondary_name), ap::error::argument_name_used_error);
}

SUBCASE("adding argument with a previously used secondary name") {
REQUIRE_THROWS_AS(sut.add_positional_argument(other_name, short_name), ap::error::argument_name_used_error);
REQUIRE_THROWS_AS(sut.add_positional_argument(other_primary_name, secondary_name), ap::error::argument_name_used_error);
}
}

TEST_CASE_FIXTURE(argument_parser_test_fixture, "add_optional_argument should return an optional argument reference") {
const auto& argument = sut.add_optional_argument(name, short_name);
const auto& argument = sut.add_optional_argument(primary_name, secondary_name);
REQUIRE(argument.is_optional());
}

Expand All @@ -84,58 +89,58 @@ TEST_CASE_FIXTURE(
"add_optional_argument should throw only when adding an"
"argument with a previously used name"
) {
sut.add_optional_argument(name, short_name);
sut.add_optional_argument(primary_name, secondary_name);

SUBCASE("adding argument with a unique name") {
REQUIRE_NOTHROW(sut.add_optional_argument(other_name, other_short_name));
REQUIRE_NOTHROW(sut.add_optional_argument(other_primary_name, other_secondary_name));
}

SUBCASE("adding argument with a previously used primary name") {
REQUIRE_THROWS_AS(sut.add_optional_argument(name, other_short_name), ap::error::argument_name_used_error);
REQUIRE_THROWS_AS(sut.add_optional_argument(primary_name, other_secondary_name), ap::error::argument_name_used_error);
}

SUBCASE("adding argument with a previously used secondary name") {
REQUIRE_THROWS_AS(sut.add_optional_argument(other_name, short_name), ap::error::argument_name_used_error);
REQUIRE_THROWS_AS(sut.add_optional_argument(other_primary_name, secondary_name), ap::error::argument_name_used_error);
}
}

TEST_CASE_FIXTURE(argument_parser_test_fixture, "add_flag should return an optional argument reference with flag parameters") {
const optional_argument_test_fixture opt_arg_fixture;

SUBCASE("StoreImplicitly = true") {
auto& argument = sut.add_flag(name, short_name);
auto& argument = sut.add_flag(primary_name, secondary_name);

REQUIRE(argument.is_optional());
REQUIRE_FALSE(sut.value<bool>(name));
REQUIRE_FALSE(sut.value<bool>(primary_name));

opt_arg_fixture.sut_set_used(argument);
REQUIRE(sut.value<bool>(name));
REQUIRE(sut.value<bool>(primary_name));
}

SUBCASE("StoreImplicitly = false") {
auto& argument = sut.add_flag<false>(name, short_name);
auto& argument = sut.add_flag<false>(primary_name, secondary_name);

REQUIRE(argument.is_optional());
REQUIRE(sut.value<bool>(name));
REQUIRE(sut.value<bool>(primary_name));

opt_arg_fixture.sut_set_used(argument);
REQUIRE_FALSE(sut.value<bool>(name));
REQUIRE_FALSE(sut.value<bool>(primary_name));
}
}

TEST_CASE_FIXTURE(argument_parser_test_fixture, "add_flag should throw only when adding and argument with a previously used name") {
sut.add_flag(name, short_name);
sut.add_flag(primary_name, secondary_name);

SUBCASE("adding argument with a unique name") {
REQUIRE_NOTHROW(sut.add_flag(other_name, other_short_name));
REQUIRE_NOTHROW(sut.add_flag(other_primary_name, other_secondary_name));
}

SUBCASE("adding argument with a previously used primary name") {
REQUIRE_THROWS_AS(sut.add_flag(name, other_short_name), ap::error::argument_name_used_error);
REQUIRE_THROWS_AS(sut.add_flag(primary_name, other_secondary_name), ap::error::argument_name_used_error);
}

SUBCASE("adding argument with a previously used secondary name") {
REQUIRE_THROWS_AS(sut.add_flag(other_name, short_name), ap::error::argument_name_used_error);
REQUIRE_THROWS_AS(sut.add_flag(other_primary_name, secondary_name), ap::error::argument_name_used_error);
}
}

Expand Down
Loading

0 comments on commit 0d1755c

Please sign in to comment.