703 lines · 14.5 KB · C
RawDownload
/* * test_parg - parg unit test * * Written in 2015-2016 by Joergen Ibsen * * To the extent possible under law, the author(s) have dedicated all * copyright and related and neighboring rights to this software to the * public domain worldwide. This software is distributed without any * warranty. <http://creativecommons.org/publicdomain/zero/1.0/> */ #include "parg.h" #include <assert.h>#include <stdio.h>#include <stdlib.h> #include "greatest.h" #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) static const char *os_def = ":no::r:"; static const struct parg_option po_def[] = {	{ "noarg", PARG_NOARG, NULL, 'n' },	{ "optarg", PARG_OPTARG, NULL, 'o' },	{ "reqarg", PARG_REQARG, NULL, 'r' },	{ "foo", PARG_NOARG, NULL, 'f' },	{ "foobar", PARG_NOARG, NULL, 'b' },	{ 0, 0, 0, 0 }}; /* * parg_getopt tests */ TEST parg_getopt_app_only(void){	struct parg_state ps;	char *argv[] = { "app" }; 	parg_init(&ps); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(1, ps.optind); 	PASS();} TEST parg_getopt_dash(void){	struct parg_state ps;	char *argv[] = { "app", "-" }; 	parg_init(&ps); 	ASSERT_EQ(1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(argv[1], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_double_dash(void){	struct parg_state ps;	char *argv[] = { "app", "--" }; 	parg_init(&ps); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_nonopt(void){	struct parg_state ps;	char *argv[] = { "app", "foo" }; 	parg_init(&ps); 	ASSERT_EQ(1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(argv[1], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_no_match(void){	struct parg_state ps;	char *argv[] = { "app", "-u" }; 	parg_init(&ps); 	ASSERT_EQ('?', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ('u', ps.optopt);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_noarg(void){	struct parg_state ps;	char *argv[] = { "app", "-n" }; 	parg_init(&ps); 	ASSERT_EQ('n', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_optarg_missing(void){	struct parg_state ps;	char *argv[] = { "app", "-o" }; 	parg_init(&ps); 	ASSERT_EQ('o', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_optarg_inline(void){	struct parg_state ps;	char *argv[] = { "app", "-oarg" }; 	parg_init(&ps); 	ASSERT_EQ('o', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(&argv[1][2], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_reqarg_missing(void){	struct parg_state ps;	char *argv[] = { "app", "-r" }; 	parg_init(&ps); 	ASSERT_EQ(':', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ('r', ps.optopt);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_reqarg_inline(void){	struct parg_state ps;	char *argv[] = { "app", "-rarg" }; 	parg_init(&ps); 	ASSERT_EQ('r', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(&argv[1][2], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_reqarg_nextarg(void){	struct parg_state ps;	char *argv[] = { "app", "-r", "arg" }; 	parg_init(&ps); 	ASSERT_EQ('r', parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(argv[2], ps.optarg);	ASSERT_EQ(3, ps.optind); 	ASSERT_EQ(-1, parg_getopt(&ps, ARRAY_SIZE(argv), argv, os_def));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(3, ps.optind); 	PASS();} /* * parg_getopt_long tests */ TEST parg_getopt_long_app_only(void){	struct parg_state ps;	char *argv[] = { "app" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(1, ps.optind); 	PASS();} TEST parg_getopt_long_dash(void){	struct parg_state ps;	char *argv[] = { "app", "-" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ(1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(argv[1], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_double_dash(void){	struct parg_state ps;	char *argv[] = { "app", "--" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_nonopt(void){	struct parg_state ps;	char *argv[] = { "app", "foo" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ(1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(argv[1], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_no_match(void){	struct parg_state ps;	char *argv[] = { "app", "--unknown" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('?', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_flag(void){	struct parg_state ps;	char *argv[] = { "app", "--flag" };	int li = -1;	int flag = 0;	struct parg_option po_flag[] = {		{ "flag", PARG_NOARG, 0, 1 },		{ 0, 0, 0, 0 }	}; 	po_flag[0].flag = &flag; 	parg_init(&ps); 	ASSERT_EQ(0, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_flag, &li));	ASSERT_EQ(0, li);	ASSERT_EQ(1, flag);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_flag, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_noarg(void){	struct parg_state ps;	char *argv[] = { "app", "--noarg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('n', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(0, li);	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_noarg_inline(void){	struct parg_state ps;	char *argv[] = { "app", "--noarg=arg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ(':', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(0, li);	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ('n', ps.optopt);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_optarg_missing(void){	struct parg_state ps;	char *argv[] = { "app", "--optarg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('o', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(1, li);	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_optarg_inline(void){	struct parg_state ps;	char *argv[] = { "app", "--optarg=arg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('o', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(1, li);	ASSERT_EQ(&argv[1][9], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_reqarg_missing(void){	struct parg_state ps;	char *argv[] = { "app", "--reqarg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ(':', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(2, li);	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ('r', ps.optopt);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_reqarg_inline(void){	struct parg_state ps;	char *argv[] = { "app", "--reqarg=arg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('r', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(2, li);	ASSERT_EQ(&argv[1][9], ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	PASS();} TEST parg_getopt_long_reqarg_nextarg(void){	struct parg_state ps;	char *argv[] = { "app", "--reqarg", "arg" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('r', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(2, li);	ASSERT_EQ(argv[2], ps.optarg);	ASSERT_EQ(3, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(3, ps.optind); 	PASS();} TEST parg_getopt_long_prefix_ambiguous(void){	struct parg_state ps;	char *argv[] = { "app", "--fo" };	int li = -1; 	parg_init(&ps); 	ASSERT_EQ('?', parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);	ASSERT_EQ(2, ps.optind); 	ASSERT_EQ(-1, parg_getopt_long(&ps, ARRAY_SIZE(argv), argv, ":", po_def, &li));	ASSERT_EQ(NULL, ps.optarg);

Lines 1–500 of 703.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t