mirror of
https://gitee.com/zlgopen/awtk.git
synced 2024-11-29 18:48:09 +08:00
155 lines
4.9 KiB
C++
155 lines
4.9 KiB
C++
#include "tkc/mem.h"
|
|
#include "tkc/utils.h"
|
|
#include "tkc/darray.h"
|
|
#include "tkc/cmd_args.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
const cmd_arg_desc_t args_desc[] = {
|
|
{"auto_type_promotion", "enable auto type promotion", "atp", VALUE_TYPE_INVALID},
|
|
{"locale", "locale. eg: zh_CN", "l", VALUE_TYPE_STRING},
|
|
{"strings_file", "strings file", "s", VALUE_TYPE_STRING},
|
|
{"output", "output file name", "o", VALUE_TYPE_STRING}};
|
|
|
|
typedef struct _st_args_t {
|
|
char* output;
|
|
char* locale;
|
|
char* strings_file;
|
|
darray_t sources;
|
|
bool_t auto_type_promotion;
|
|
} st_args_t;
|
|
|
|
static st_args_t* st_args_init(st_args_t* args) {
|
|
return_value_if_fail(args != NULL, NULL);
|
|
|
|
memset(args, 0x00, sizeof(st_args_t));
|
|
darray_init(&(args->sources), 5, default_destroy, NULL);
|
|
|
|
return args;
|
|
}
|
|
|
|
static ret_t st_args_reset(st_args_t* args) {
|
|
return_value_if_fail(args != NULL, RET_BAD_PARAMS);
|
|
|
|
TKMEM_FREE(args->locale);
|
|
TKMEM_FREE(args->output);
|
|
TKMEM_FREE(args->strings_file);
|
|
darray_deinit(&(args->sources));
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
static ret_t st_args_set_locale(st_args_t* args, const char* locale) {
|
|
return_value_if_fail(args != NULL && locale != NULL, RET_BAD_PARAMS);
|
|
args->locale = tk_str_copy(args->locale, locale);
|
|
return RET_OK;
|
|
}
|
|
|
|
static ret_t st_args_set_output(st_args_t* args, const char* output) {
|
|
return_value_if_fail(args != NULL && output != NULL, RET_BAD_PARAMS);
|
|
args->output = tk_str_copy(args->output, output);
|
|
return RET_OK;
|
|
}
|
|
|
|
static ret_t st_args_set_strings_file(st_args_t* args, const char* strings_file) {
|
|
return_value_if_fail(args != NULL && strings_file != NULL, RET_BAD_PARAMS);
|
|
args->strings_file = tk_str_copy(args->strings_file, strings_file);
|
|
return RET_OK;
|
|
}
|
|
|
|
static ret_t st_args_add_source(st_args_t* args, const char* filename) {
|
|
return_value_if_fail(args != NULL && filename != NULL, RET_BAD_PARAMS);
|
|
darray_push(&(args->sources), tk_strdup(filename));
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
static ret_t st_args_on_arg(void* ctx, const char* name, const value_t* v) {
|
|
st_args_t* args = (st_args_t*)ctx;
|
|
if (tk_str_eq(name, "auto_type_promotion")) {
|
|
args->auto_type_promotion = TRUE;
|
|
} else if (tk_str_eq(name, "locale")) {
|
|
st_args_set_locale(args, value_str(v));
|
|
} else if (tk_str_eq(name, "output")) {
|
|
st_args_set_output(args, value_str(v));
|
|
} else if (tk_str_eq(name, "strings_file")) {
|
|
st_args_set_strings_file(args, value_str(v));
|
|
} else {
|
|
if (*name != '-') {
|
|
st_args_add_source(args, name);
|
|
}
|
|
}
|
|
return RET_OK;
|
|
}
|
|
|
|
TEST(CmdArgs, basic1) {
|
|
cmd_args_t parser;
|
|
st_args_t args;
|
|
const char* argv[] = {"st",
|
|
"--auto_type_promotion",
|
|
"--locale=zh_CN",
|
|
"--strings_file",
|
|
"strings.xml",
|
|
"--output",
|
|
"test.st",
|
|
"a.st",
|
|
"b.st"};
|
|
const char* usage = "parse st text";
|
|
st_args_init(&args);
|
|
cmd_args_init(&parser, usage, args_desc, ARRAY_SIZE(args_desc), st_args_on_arg, &args);
|
|
cmd_args_process(&parser, ARRAY_SIZE(argv), (char**)argv);
|
|
ASSERT_STREQ(args.locale, "zh_CN");
|
|
ASSERT_STREQ(args.output, "test.st");
|
|
ASSERT_STREQ(args.strings_file, "strings.xml");
|
|
ASSERT_EQ(args.sources.size, 2);
|
|
|
|
ASSERT_STREQ((char*)darray_get(&(args.sources), 0), "a.st");
|
|
ASSERT_STREQ((char*)darray_get(&(args.sources), 1), "b.st");
|
|
|
|
st_args_reset(&args);
|
|
}
|
|
|
|
TEST(CmdArgs, basic2) {
|
|
cmd_args_t parser;
|
|
st_args_t args;
|
|
const char* cmd_line =
|
|
"--auto_type_promotion --locale=zh_CN --strings_file strings.xml a.st b.st";
|
|
const char* usage = "parse st text";
|
|
st_args_init(&args);
|
|
cmd_args_init(&parser, usage, args_desc, ARRAY_SIZE(args_desc), st_args_on_arg, &args);
|
|
cmd_args_process_str(&parser, cmd_line);
|
|
ASSERT_STREQ(args.locale, "zh_CN");
|
|
ASSERT_STREQ(args.strings_file, "strings.xml");
|
|
ASSERT_EQ(args.sources.size, 2);
|
|
|
|
ASSERT_STREQ((char*)darray_get(&(args.sources), 0), "a.st");
|
|
ASSERT_STREQ((char*)darray_get(&(args.sources), 1), "b.st");
|
|
|
|
st_args_reset(&args);
|
|
}
|
|
|
|
TEST(CmdArgs, wstr) {
|
|
cmd_args_t parser;
|
|
st_args_t args;
|
|
const wchar_t* argv[] = {L"st",
|
|
L"--auto_type_promotion",
|
|
L"--locale=zh_CN",
|
|
L"--strings_file",
|
|
L"strings.xml",
|
|
L"--output",
|
|
L"test.st",
|
|
L"a.st",
|
|
L"b.st"};
|
|
const char* usage = "parse st text";
|
|
st_args_init(&args);
|
|
cmd_args_init(&parser, usage, args_desc, ARRAY_SIZE(args_desc), st_args_on_arg, &args);
|
|
cmd_args_process_wstr(&parser, ARRAY_SIZE(argv), (wchar_t**)argv);
|
|
|
|
ASSERT_STREQ(args.locale, "zh_CN");
|
|
ASSERT_STREQ(args.strings_file, "strings.xml");
|
|
ASSERT_EQ(args.sources.size, 2);
|
|
|
|
ASSERT_STREQ((char*)darray_get(&(args.sources), 0), "a.st");
|
|
ASSERT_STREQ((char*)darray_get(&(args.sources), 1), "b.st");
|
|
|
|
st_args_reset(&args);
|
|
} |