Commit 268c26ad62667ae891cad167eca36085e7478859

Authored by Henry Fredrick Schreiner
Committed by Henry Schreiner
1 parent 2b4780d7

Fix #64 by auto-adding symmetric excludes

CHANGELOG.md
1 ## In progress 1 ## In progress
2 2
3 -* Fix unlimited short options eating two values before checking for positionals when no space present #90 3 +* Fix unlimited short options eating two values before checking for positionals when no space present [#90]
  4 +* Symmetric exclude text when excluding options, exclude can be called multiple times [#64]
  5 +
  6 +[#64]: https://github.com/CLIUtils/CLI11/issues/64
  7 +[#90]: https://github.com/CLIUtils/CLI11/issues/90
  8 +
4 9
5 ## Version 1.4: More feedback 10 ## Version 1.4: More feedback
6 11
include/CLI/Option.hpp
@@ -315,9 +315,14 @@ class Option : public OptionBase<Option> { @@ -315,9 +315,14 @@ class Option : public OptionBase<Option> {
315 315
316 /// Sets excluded options 316 /// Sets excluded options
317 Option *excludes(Option *opt) { 317 Option *excludes(Option *opt) {
318 - auto tup = excludes_.insert(opt);  
319 - if(!tup.second)  
320 - throw OptionAlreadyAdded::Excludes(get_name(), opt->get_name()); 318 + excludes_.insert(opt);
  319 +
  320 + // Help text should be symmetric - excluding a should exclude b
  321 + opt->excludes_.insert(this);
  322 +
  323 + // Ignoring the insert return value, excluding twice is now allowed.
  324 + // (Mostly to allow both directions to be excluded by user, even though the library does it for you.)
  325 +
321 return this; 326 return this;
322 } 327 }
323 328
tests/CreationTest.cpp
@@ -187,18 +187,20 @@ TEST_F(TApp, IncorrectConstructionDuplicateNeedsTxt) { @@ -187,18 +187,20 @@ TEST_F(TApp, IncorrectConstructionDuplicateNeedsTxt) {
187 EXPECT_THROW(cat->needs("--other"), CLI::OptionAlreadyAdded); 187 EXPECT_THROW(cat->needs("--other"), CLI::OptionAlreadyAdded);
188 } 188 }
189 189
190 -TEST_F(TApp, IncorrectConstructionDuplicateExcludes) { 190 +// Now allowed
  191 +TEST_F(TApp, CorrectConstructionDuplicateExcludes) {
191 auto cat = app.add_flag("--cat"); 192 auto cat = app.add_flag("--cat");
192 auto other = app.add_flag("--other"); 193 auto other = app.add_flag("--other");
193 ASSERT_NO_THROW(cat->excludes(other)); 194 ASSERT_NO_THROW(cat->excludes(other));
194 - EXPECT_THROW(cat->excludes(other), CLI::OptionAlreadyAdded); 195 + ASSERT_NO_THROW(other->excludes(cat));
195 } 196 }
196 197
197 -TEST_F(TApp, IncorrectConstructionDuplicateExcludesTxt) { 198 +// Now allowed
  199 +TEST_F(TApp, CorrectConstructionDuplicateExcludesTxt) {
198 auto cat = app.add_flag("--cat"); 200 auto cat = app.add_flag("--cat");
199 - app.add_flag("--other"); 201 + auto other = app.add_flag("--other");
200 ASSERT_NO_THROW(cat->excludes("--other")); 202 ASSERT_NO_THROW(cat->excludes("--other"));
201 - EXPECT_THROW(cat->excludes("--other"), CLI::OptionAlreadyAdded); 203 + ASSERT_NO_THROW(other->excludes("--cat"));
202 } 204 }
203 205
204 TEST_F(TApp, CheckName) { 206 TEST_F(TApp, CheckName) {
tests/HelpTest.cpp
@@ -203,6 +203,17 @@ TEST(THelp, ExcludesPositional) { @@ -203,6 +203,17 @@ TEST(THelp, ExcludesPositional) {
203 EXPECT_THAT(help, HasSubstr("Excludes: op1")); 203 EXPECT_THAT(help, HasSubstr("Excludes: op1"));
204 } 204 }
205 205
  206 +TEST(THelp, ExcludesSymmetric) {
  207 + CLI::App app{"My prog"};
  208 +
  209 + CLI::Option *op1 = app.add_flag("--op1");
  210 + app.add_flag("--op2")->excludes(op1);
  211 +
  212 + std::string help = app.help();
  213 +
  214 + EXPECT_THAT(help, HasSubstr("Excludes: --op2"));
  215 +}
  216 +
206 TEST(THelp, ManualSetters) { 217 TEST(THelp, ManualSetters) {
207 218
208 CLI::App app{"My prog"}; 219 CLI::App app{"My prog"};