File: test_error_reporting.cpp

package info (click to toggle)
libargparse 3.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 896 kB
  • sloc: cpp: 11,319; python: 8; makefile: 4; sh: 3
file content (124 lines) | stat: -rw-r--r-- 3,830 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#ifdef WITH_MODULE
import argparse;
#else
#include <argparse/argparse.hpp>
#endif
#include <doctest.hpp>

#include <iostream>
#include <string>
#include <vector>

using doctest::test_suite;

TEST_CASE("Missing optional argument name" * test_suite("error_reporting")) {
  argparse::ArgumentParser parser("test");
  parser.add_argument("-a");
  parser.add_argument("-b");

  SUBCASE("Good case") {
    REQUIRE_NOTHROW(parser.parse_args({"test", "-a", "1", "-b", "2"}));
  }

  SUBCASE("Bad case") {
    REQUIRE_THROWS_WITH_AS(
        parser.parse_args({"test", "-a", "1", "2"}),
        "Zero positional arguments expected, did you mean -b VAR",
        std::runtime_error);
  }

  SUBCASE("Bad case 2") {
    REQUIRE_THROWS_WITH_AS(
        parser.parse_args({"test", "1", "2"}),
        "Zero positional arguments expected, did you mean -a VAR",
        std::runtime_error);
  }
}

TEST_CASE("Missing optional argument name (some flag arguments)" *
          test_suite("error_reporting")) {
  argparse::ArgumentParser parser("test");
  parser.add_argument("-a").flag();
  parser.add_argument("-b").flag();
  parser.add_argument("-c");
  parser.add_argument("-d");

  SUBCASE("Good case") {
    REQUIRE_NOTHROW(parser.parse_args({"test", "-a", "-b", "-c", "2"}));
  }

  SUBCASE("Bad case") {
    REQUIRE_THROWS_WITH_AS(
        parser.parse_args({"test", "-a", "-b", "2"}),
        "Zero positional arguments expected, did you mean -c VAR",
        std::runtime_error);
  }

  SUBCASE("Bad case 2") {
    REQUIRE_THROWS_WITH_AS(
        parser.parse_args({"test", "-abc", "1", "2"}),
        "Zero positional arguments expected, did you mean -d VAR",
        std::runtime_error);
  }
}

TEST_CASE("Missing optional argument name (multiple names)" *
          test_suite("error_reporting")) {
  argparse::ArgumentParser parser("test");
  parser.add_argument("-a", "--number-of-apples");
  parser.add_argument("-b");

  SUBCASE("Bad case 2") {
    REQUIRE_THROWS_WITH_AS(parser.parse_args({"test", "1", "2"}),
                           "Zero positional arguments expected, did you mean "
                           "-a/--number-of-apples VAR",
                           std::runtime_error);
  }
}

TEST_CASE("Missing optional argument name with other positional arguments" *
          test_suite("error_reporting")) {
  argparse::ArgumentParser parser("test");
  parser.add_argument("-a");
  parser.add_argument("-b");
  parser.add_argument("c");

  SUBCASE("Good case") {
    REQUIRE_NOTHROW(parser.parse_args({"test", "-a", "1", "-b", "2", "3"}));
  }

  SUBCASE("Bad case") {
    REQUIRE_THROWS_WITH_AS(
        parser.parse_args({"test", "-a", "1", "2", "3", "4"}),
        "Maximum number of positional arguments exceeded, failed to parse '3'",
        std::runtime_error);
  }
}

TEST_CASE("Detect unknown subcommand" * test_suite("error_reporting")) {
  argparse::ArgumentParser program("git");
  argparse::ArgumentParser log_command("log");
  argparse::ArgumentParser notes_command("notes");
  argparse::ArgumentParser add_command("add");
  program.add_subparser(log_command);
  program.add_subparser(notes_command);
  program.add_subparser(add_command);

  SUBCASE("Typo for 'notes'") {
    REQUIRE_THROWS_WITH_AS(program.parse_args({"git", "tote"}),
                           "Failed to parse 'tote', did you mean 'notes'",
                           std::runtime_error);
  }

  SUBCASE("Typo for 'add'") {
    REQUIRE_THROWS_WITH_AS(program.parse_args({"git", "bad"}),
                           "Failed to parse 'bad', did you mean 'add'",
                           std::runtime_error);
  }

  SUBCASE("Typo for 'log'") {
    REQUIRE_THROWS_WITH_AS(program.parse_args({"git", "logic"}),
                           "Failed to parse 'logic', did you mean 'log'",
                           std::runtime_error);
  }
}