124 parser.setExitFunction(std::bind(&ArgumentParserTests::failOnExit,
this, std::placeholders::_1));
129 auto fileArg =
Argument(
"file",
'f',
"specifies the path of the file to be opened");
130 fileArg.setValueNames({
"path" });
131 fileArg.setRequiredValueCount(1);
132 fileArg.setEnvironmentVariable(
"PATH");
133 auto filesArg =
Argument(
"files",
'f',
"specifies the path of the file(s) to be opened");
134 filesArg.setValueNames({
"path 1",
"path 2" });
148 fieldsArg.setValueNames({
"title",
"album",
"artist",
"trackpos" });
150 auto displayTagInfoArg =
Argument(
"get",
'p',
"displays the values of all specified tag fields (displays all fields if none specified)");
153 parser.setMainArguments(
157 parser.parseArgs(0,
nullptr, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
163 const char *argv[] = {
"tageditor",
"get",
"album",
"title",
"diskpos",
"-f",
"somefile" };
166 parser.parseArgs(7, argv, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
171 auto ss = std::stringstream();
174 "Error: Unable to parse arguments: The argument \"files\" can not be combined with \"fields\".\nSee --help for available commands.\n"sv,
175 std::string_view(
ss.str()));
182 parser.parseArgs(7, argv, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
197 const char *
argv2[] = {
"tageditor",
"",
"-p",
"album",
"title",
"diskpos",
"",
"--files",
"somefile" };
200 parser.parseArgs(9,
argv2, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
216 const char *
argv3[] = {
"tageditor",
"album",
"title",
"diskpos",
"--files",
"somefile" };
219 parser.parseArgs(6,
argv3, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
222 CPPUNIT_ASSERT_EQUAL(
"The specified argument \"album\" is unknown.\nDid you mean get or --help?"sv, std::string_view(
e.what()));
226 const char *
argv18[] = {
"tageditor",
"get",
"album",
"title",
"diskpos",
"--verbose",
"--fi" };
229 parser.parseArgs(7,
argv18, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
232 CPPUNIT_ASSERT_EQUAL(
"The specified argument \"--fi\" is unknown.\nDid you mean --files or --no-color?"sv, std::string_view(
e.what()));
236 parser.setUnknownArgumentBehavior(UnknownArgumentBehavior::Warn);
238#ifndef PLATFORM_WINDOWS
240 "Warning: The specified argument \"title\" is unknown and will be ignored.\n"s
241 "Warning: The specified argument \"diskpos\" is unknown and will be ignored.\n"s
242 "Warning: The specified argument \"--files\" is unknown and will be ignored.\n"s
243 "Warning: The specified argument \"somefile\" is unknown and will be ignored.\n"s,
248 parser.parseArgs(6,
argv3, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
259 const char *
argv4[] = {
"tageditor",
"-i",
"-vf",
"test" };
260 parser.setUnknownArgumentBehavior(UnknownArgumentBehavior::Fail);
262 parser.parseArgs(4,
argv4, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
276 parser.parseArgs(4,
argv4, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
280 CPPUNIT_ASSERT_EQUAL(
"The argument \"verbose\" mustn't be specified more than 1 time."sv, std::string_view(
e.what()));
287 parser.parseArgs(4,
argv4, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
293 parser.parseArgs(4,
argv4, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
297 const char *
argv5[] = {
"tageditor",
"-i",
"-f",
"test" };
302 parser.parseArgs(4,
argv5, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
306 CPPUNIT_ASSERT_EQUAL(
"The argument \"verbose\" must be specified at least 1 time."sv, std::string_view(
e.what()));
311 const char *
argv10[] = {
"tageditor",
"-pf",
"test" };
313 parser.parseArgs(3,
argv10, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
323 const char *
argv6[] = {
"tageditor",
"-g" };
325 parser.parseArgs(2,
argv6, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
329 const char *
argv7[] = {
"tageditor",
"-f",
"test" };
332 parser.parseArgs(3,
argv7, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
336 CPPUNIT_ASSERT_EQUAL(
"The specified argument \"-f\" is unknown.\nDid you mean get or --help?"sv, std::string_view(
e.what()));
340 const char *
argv11[] = {
"tageditor",
"-if=test-v" };
342 parser.parseArgs(2,
argv11, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
348 const char *
argv15[] = {
"tageditor",
"-i",
"--file=test",
"-v" };
350 parser.parseArgs(4,
argv15, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
358 const char *
argv12[] = {
"tageditor",
"-iftest" };
360 parser.parseArgs(2,
argv12, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
367 const char *
argv17[] = {
"tageditor",
"-if=test-v",
"--no-color" };
369 parser.parseArgs(3,
argv17, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
378 const char *
argv8[] = {
"tageditor" };
380 parser.parseArgs(1,
argv8, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
387 if (
const auto path = std::getenv(
"PATH")) {
395 const char *
argv13[] = {
"tageditor",
"get",
"--fields",
"album=test",
"title",
"diskpos",
"--files",
"somefile" };
398 parser.parseArgs(8,
argv13, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
414 const char *
argv9[] = {
"tageditor",
"-p",
"album",
"title",
"diskpos" };
418 parser.parseArgs(5,
argv9, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
423 "Not all parameters for argument \"fields\" provided. You have to provide the following parameters: title album artist trackpos"sv,
424 std::string_view(
e.what()));
428 const char *
argv16[] = {
"tageditor",
"--hel",
"-p",
"album",
"title",
"diskpos" };
432 parser.parseArgs(6,
argv16, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
436 CPPUNIT_ASSERT_EQUAL(
"The specified argument \"--hel\" is unknown.\nDid you mean --help or get?"sv, std::string_view(
e.what()));
440 const char *
argv14[] = {
"tageditor",
"get",
"fields",
"album=test",
"-f",
"somefile" };
443 parser.parseArgs(6,
argv14, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
451 parser.parseArgs(6,
argv14, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
458 const char *
argv19[] = {
"tageditor",
"get",
"--fields",
"foo",
"bar",
"--help" };
461 parser.parseArgs(6,
argv19, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
465 "The argument \"help\" can not be combined with \"get\"."sv, std::string_view(
e.what()));
468 fieldsArg.setFlags(Argument::Flags::Greedy,
true);
469 parser.parseArgs(6,
argv19, ParseArgumentBehavior::CheckConstraints | ParseArgumentBehavior::InvokeCallbacks);
472 CPPUNIT_ASSERT_MESSAGE(
"--help not considered an argument with greedy-flag", !parser.helpArg().isPresent());
529 parser.
setExitFunction(std::bind(&ArgumentParserTests::failOnExit,
this, std::placeholders::_1));
532 Argument filesArg(
"files",
'f',
"specifies the path of the file(s) to be opened");
543 fieldsArg.setPreDefinedCompletionValues(
"title album artist trackpos");
547 valuesArg.setPreDefinedCompletionValues(
"title album artist trackpos");
549 valuesArg.setValueCompletionBehavior(ValueCompletionBehavior::PreDefinedValues | ValueCompletionBehavior::AppendEquationSign);
552 selectorsArg.setPreDefinedCompletionValues(
"tag=id3v1 tag=id3v2 tag=matroska target=file target=track");
554 selectorsArg.setValueCompletionBehavior(ValueCompletionBehavior::PreDefinedValues);
565 const char *
const argv1[] = {
"se" };
574 getArg.setDenotesOperation(
true);
575 setArg.setDenotesOperation(
true);
583 const char *
const argv2[] = {
"set" };
594 const OutputCheck c(
"COMPREPLY=('--files' '--no-color' '--selectors' '--values' )\n");
603 const OutputCheck c(
"COMPREPLY=('files' '--no-color' '--selectors' '--values' )\n");
610 filesArg.setDenotesOperation(
false);
612 const OutputCheck c(
"COMPREPLY=('display-file-info' 'get' 'set' '--help' '--no-color' )\n");
613 reader.reset(
nullptr,
nullptr).read();
614 parser.printBashCompletion(0,
nullptr, 0,
reader);
618 const char *
const argv3[] = {
"get",
"--fields" };
621 const OutputCheck c(
"COMPREPLY=('title' 'album' 'artist' 'trackpos' '--files' '--no-color' )\n");
627 const char *
const argv4[] = {
"set",
"--values",
"a" };
630 const OutputCheck c(
"COMPREPLY=('album=' 'artist=' ); compopt -o nospace\n");
636 const char *
const argv12[] = {
"set",
"--selectors",
"tag=id3" };
639 const OutputCheck c(
"COMPREPLY=('tag=id3v1' 'tag=id3v2' )\n");
645 const char *
const argv13[] = {
"set",
"--selectors",
"tag",
"=",
"id3" };
654 const OutputCheck c(
"COMPREPLY=('id3v1' 'id3v2' 'matroska' )\n");
660 selectorsArg.setValueCompletionBehavior(
selectorsArg.valueCompletionBehaviour() | ValueCompletionBehavior::InvokeCallback);
663 const OutputCheck c(
"COMPREPLY=('matroska' 'mp4' 'vorbis' )\n");
671 const OutputCheck c(
"COMPREPLY=('title' 'album' 'artist' 'trackpos' '--fields' '--files' '--no-color' )\n");
684#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
687 "COMPREPLY=('" %
iniFilePath %
".ini' '" %
mkvFilePath +
" '\"'\"'with quote'\"'\"'.mkv' ); compopt -o filenames\n");
698 filesArg.setValueCompletionBehavior(ValueCompletionBehavior::Directories);
702#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
712 const char *
const argv6[] = {
"set",
"--" };
715 const OutputCheck c(
"COMPREPLY=('--files' '--no-color' '--selectors' '--values' )\n");
721 const char *
const argv7[] = {
"-i",
"--sub",
"--" };
724 const OutputCheck c(
"COMPREPLY=('--files' '--nested-sub' '--no-color' '--verbose' )\n");
730 const char *
const argv8[] = {
"set",
"--values",
"t" };
733 const OutputCheck c(
"COMPREPLY=('title=' 'trackpos=' ); compopt -o nospace\n");
739 const char *
const argv9[] = {
"-gf" };
757 const char *
const argv10[] = {
"/some/path/tageditor",
"--bash-completion-for",
"0" };
760 const OutputCheck c(
"COMPREPLY=('display-file-info' 'get' 'set' '--help' '--no-color' )\n");
767 const char *
const argv11[] = {
"/some/path/tageditor",
"--bash-completion-for",
"ge" };