libkernaux/tests/test_cmdline.c

101 lines
2.8 KiB
C
Raw Normal View History

2020-12-01 19:55:16 +00:00
#include <kernaux/cmdline.h>
2020-12-01 20:22:38 +00:00
#include <assert.h>
2020-12-01 21:40:41 +00:00
#include <stdbool.h>
2020-12-01 20:29:45 +00:00
#include <string.h>
2020-12-01 20:22:38 +00:00
2020-12-01 21:34:46 +00:00
static const unsigned int ARGV_COUNT_MAX = 100;
2020-12-01 20:22:38 +00:00
static const unsigned int ARG_SIZE_MAX = 4096;
2020-12-01 21:34:46 +00:00
static void test(
const char *cmdline,
unsigned int argv_count_max,
unsigned int arg_size_max,
2020-12-01 20:22:38 +00:00
2020-12-01 21:40:41 +00:00
bool expected_result,
2020-12-01 21:34:46 +00:00
const char *expected_error_msg,
unsigned int expected_argc,
const char *const *const expected_argv
);
2020-12-01 20:32:35 +00:00
2020-12-01 21:34:46 +00:00
static const char *const argv0[] = {};
2020-12-01 20:22:38 +00:00
2020-12-01 21:34:46 +00:00
static const char *const argv_foo[] = {"foo"};
2020-12-01 20:29:45 +00:00
2020-12-01 21:34:46 +00:00
static const char *const argv_foo_bar[] = {"foo", "bar"};
2020-12-01 20:32:35 +00:00
2020-12-01 21:34:46 +00:00
static const char *const argv_foo_bar_car[] = {"foo", "bar", "car"};
2020-12-01 20:32:35 +00:00
2020-12-01 21:34:46 +00:00
int main()
{
2020-12-01 21:40:41 +00:00
test("", 0, 0, true, "", 0, argv0);
test(" ", 0, 0, true, "", 0, argv0);
test("foo", 0, 0, true, "", 1, argv_foo);
test("foo bar", 0, 0, true, "", 2, argv_foo_bar);
test(" foo bar", 0, 0, true, "", 2, argv_foo_bar);
test("foo bar ", 0, 0, true, "", 2, argv_foo_bar);
test(" foo bar ", 0, 0, true, "", 2, argv_foo_bar);
test("foo bar", 0, 0, true, "", 2, argv_foo_bar);
test(" foo bar", 0, 0, true, "", 2, argv_foo_bar);
test("foo bar ", 0, 0, true, "", 2, argv_foo_bar);
test(" foo bar ", 0, 0, true, "", 2, argv_foo_bar);
test("foo bar car", 0, 0, true, "", 3, argv_foo_bar_car);
2020-12-01 21:34:46 +00:00
2020-12-05 21:50:36 +00:00
test("foo bar car", 3, 0, true, "", 3, argv_foo_bar_car);
test("foo bar car", 0, 4, true, "", 3, argv_foo_bar_car);
2020-12-01 21:56:30 +00:00
test("foo bar car", 3, 4, true, "", 3, argv_foo_bar_car);
2020-12-01 21:54:18 +00:00
test("foo bar car", 2, 0, false, "too many args", 0, argv0);
2020-12-01 21:56:30 +00:00
test("foo bar car", 0, 3, false, "arg too long", 0, argv0);
2020-12-05 21:50:36 +00:00
test("foo bar car", 2, 3, false, "arg too long", 0, argv0);
2020-12-01 21:54:18 +00:00
2020-12-01 21:34:46 +00:00
return 0;
}
void test(
const char *const cmdline,
2020-12-01 21:36:46 +00:00
unsigned int argv_count_max,
unsigned int arg_size_max,
2020-12-01 21:34:46 +00:00
2020-12-01 21:40:41 +00:00
const bool expected_result,
2020-12-01 21:34:46 +00:00
const char *const expected_error_msg,
unsigned int expected_argc,
const char *const *const expected_argv
) {
2020-12-01 21:36:46 +00:00
if (argv_count_max == 0) {
argv_count_max = ARGV_COUNT_MAX;
}
if (arg_size_max == 0) {
arg_size_max = ARG_SIZE_MAX;
}
2020-12-01 21:34:46 +00:00
char error_msg[KERNAUX_CMDLINE_ERROR_MSG_SIZE_MAX];
unsigned int argc = 1234;
char *argv[argv_count_max];
char buffer[argv_count_max * arg_size_max];
assert(
kernaux_cmdline_parse(
cmdline,
error_msg,
&argc,
argv,
buffer,
argv_count_max,
arg_size_max
) == !!expected_result
);
assert(strcmp(error_msg, expected_error_msg) == 0);
assert(argc == expected_argc);
for (unsigned int index = 0; index < argc; ++index) {
assert(strcmp(argv[index], expected_argv[index]) == 0);
}
2020-12-01 20:59:53 +00:00
2020-12-01 21:54:18 +00:00
for (unsigned int index = argc; index < argv_count_max; ++index) {
2020-12-01 20:59:53 +00:00
assert(argv[index] == KERNAUX_NULL);
}
2020-12-01 19:55:16 +00:00
}