You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
4.1 KiB
155 lines
4.1 KiB
/*
|
|
* test-mangle-cmdline -- testsuite for tc_mangle_cmdline() function;
|
|
* everyone feel free to add more tests and improve
|
|
* existing ones.
|
|
* (C) 2006-2010 - Francesco Romani <fromani -at- gmail -dot- com>
|
|
*
|
|
* This file is part of transcode, a video stream processing tool.
|
|
*
|
|
* transcode is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* transcode is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#include "config.h"
|
|
|
|
#define _GNU_SOURCE 1
|
|
#define MAX_OPTS (32)
|
|
|
|
#include "libtc/libtc.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
#define DUMP_OPTS(AC, AV) do { \
|
|
int i = 0; \
|
|
printf("argc=%i\n", (AC)); \
|
|
for (i = 0; i < (AC); i++) { \
|
|
printf("argv[%i] = %s\n", i, (AV)[i]); \
|
|
} \
|
|
} while (0)
|
|
|
|
|
|
static int in_set(const char *val, const char **val_set, int set_len)
|
|
{
|
|
int i = 0;
|
|
|
|
for (i = 0; i < set_len; i++) {
|
|
if (!strcmp(val_set[i], val)) {
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int test_mangle_option(int argc, char **argv, const char *option, int hasval)
|
|
{
|
|
int ac = argc, i = 0, ret;
|
|
char *av[MAX_OPTS];
|
|
const char *useless = NULL;
|
|
|
|
assert(argc <= MAX_OPTS);
|
|
|
|
for (i = 0; i < argc; i++) {
|
|
av[i] = argv[i];
|
|
}
|
|
ret = tc_mangle_cmdline(&argc, &argv, option, (hasval) ?(&useless) :NULL);
|
|
tc_info("mangling: %i", ret);
|
|
if (ret != 0) {
|
|
DUMP_OPTS(argc, argv);
|
|
if (ac != argc) {
|
|
tc_warn("missing argument (argc not changed)");
|
|
return 1;
|
|
}
|
|
for (i = 0; i < argc; i++) {
|
|
if (av[i] != argv[i]
|
|
|| strcmp(av[i], argv[i]) != 0) {
|
|
tc_warn("argument diversion (%s VS %s @ %i)", av[i], argv[i], i);
|
|
return 1;
|
|
}
|
|
}
|
|
if (!in_set(option, (const char **)argv, argc)) {
|
|
tc_warn("option still present");
|
|
return 1;
|
|
}
|
|
} else {
|
|
int na = ac - ((hasval) ?2 :1);
|
|
DUMP_OPTS(argc, argv);
|
|
if (na != argc) {
|
|
tc_warn("argument number mismatch (expected %i|got %i)", na, argc);
|
|
return 1;
|
|
}
|
|
if (in_set(option, (const char **)argv, argc)) {
|
|
tc_warn("option still present");
|
|
return 1;
|
|
}
|
|
for (i = 0; i < ac; i++) {
|
|
if (!in_set(argv[i], (const char **)av, ac)) {
|
|
tc_warn("missing argument: %s", argv[i]);
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#define TEST_OPT(OPT, HASVAL) do { \
|
|
char *argv[] = { "testprogram", "-c", "-v", "-A", "1", \
|
|
"--foo", "bar", "--baz", "-t" }; \
|
|
int argc = 9; \
|
|
int ret = 0; \
|
|
\
|
|
tc_info("TEST BEGINS HERE ==================================="); \
|
|
puts("base commandline:"); \
|
|
DUMP_OPTS(argc, argv); \
|
|
\
|
|
puts("removing " OPT ": "); \
|
|
ret = test_mangle_option(argc, argv, OPT, HASVAL); \
|
|
if (ret) { \
|
|
tc_warn("test with %s: FAILED", OPT); \
|
|
err++; \
|
|
} else { \
|
|
tc_info("test with %s: ok", OPT); \
|
|
} \
|
|
tc_info("TEST ENDS HERE ====================================="); \
|
|
} while (0)
|
|
|
|
|
|
int main(void)
|
|
{
|
|
int err = 0;
|
|
|
|
TEST_OPT("-c", TC_FALSE);
|
|
TEST_OPT("-v", TC_FALSE);
|
|
TEST_OPT("-A", TC_TRUE);
|
|
TEST_OPT("--baz", TC_FALSE);
|
|
TEST_OPT("--foo", TC_TRUE);
|
|
|
|
return (err > 0) ?1 :0;
|
|
}
|
|
|
|
/*************************************************************************/
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-file-style: "stroustrup"
|
|
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*
|
|
* vim: expandtab shiftwidth=4:
|
|
*/
|