diff --git a/app/meson.build b/app/meson.build index 3e8d6063..d4dbecbb 100644 --- a/app/meson.build +++ b/app/meson.build @@ -148,6 +148,11 @@ tests = [ ['test_cbuf', [ 'tests/test_cbuf.c', ]], + ['test_cli', [ + 'tests/test_cli.c', + 'src/cli.c', + 'src/util/str_util.c', + ]], ['test_control_event_serialize', [ 'tests/test_control_msg_serialize.c', 'src/control_msg.c', diff --git a/app/src/cli.c b/app/src/cli.c index a219895b..1c393330 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -374,6 +374,8 @@ scrcpy_parse_args(struct scrcpy_cli_args *args, int argc, char *argv[]) { struct scrcpy_options *opts = &args->opts; + optind = 0; // reset to start from the first argument in tests + int c; while ((c = getopt_long(argc, argv, "b:c:fF:hm:nNp:r:s:StTv", long_options, NULL)) != -1) { diff --git a/app/tests/test_cli.c b/app/tests/test_cli.c new file mode 100644 index 00000000..83be6f5f --- /dev/null +++ b/app/tests/test_cli.c @@ -0,0 +1,127 @@ +#include + +#include "cli.h" + +static void test_flag_version(void) { + struct scrcpy_cli_args args = { + .opts = SCRCPY_OPTIONS_DEFAULT, + .help = false, + .version = false, + }; + + char *argv[] = {"scrcpy", "-v"}; + + bool ok = scrcpy_parse_args(&args, 2, argv); + assert(ok); + assert(!args.help); + assert(args.version); +} + +static void test_flag_help(void) { + struct scrcpy_cli_args args = { + .opts = SCRCPY_OPTIONS_DEFAULT, + .help = false, + .version = false, + }; + + char *argv[] = {"scrcpy", "-v"}; + + bool ok = scrcpy_parse_args(&args, 2, argv); + assert(ok); + assert(!args.help); + assert(args.version); +} + +static void test_options(void) { + struct scrcpy_cli_args args = { + .opts = SCRCPY_OPTIONS_DEFAULT, + .help = false, + .version = false, + }; + + char *argv[] = { + "scrcpy", + "--always-on-top", + "--bit-rate", "5M", + "--crop", "100:200:300:400", + "--fullscreen", + "--max-fps", "30", + "--max-size", "1024", + // "--no-control" is not compatible with "--turn-screen-off" + // "--no-display" is not compatible with "--fulscreen" + "--port", "1234", + "--push-target", "/sdcard/Movies", + "--record", "file", + "--record-format", "mkv", + "--render-expired-frames", + "--serial", "0123456789abcdef", + "--show-touches", + "--turn-screen-off", + "--prefer-text", + "--window-title", "my device", + "--window-x", "100", + "--window-y", "-1", + "--window-width", "600", + "--window-height", "0", + "--window-borderless", + }; + + bool ok = scrcpy_parse_args(&args, sizeof(argv) / sizeof(*argv), argv); + assert(ok); + + const struct scrcpy_options *opts = &args.opts; + assert(opts->always_on_top); + fprintf(stderr, "%d\n", (int) opts->bit_rate); + assert(opts->bit_rate == 5000000); + assert(!strcmp(opts->crop, "100:200:300:400")); + assert(opts->fullscreen); + assert(opts->max_fps == 30); + assert(opts->max_size == 1024); + assert(opts->port == 1234); + assert(!strcmp(opts->push_target, "/sdcard/Movies")); + assert(!strcmp(opts->record_filename, "file")); + assert(opts->record_format == RECORDER_FORMAT_MKV); + assert(opts->render_expired_frames); + assert(!strcmp(opts->serial, "0123456789abcdef")); + assert(opts->show_touches); + assert(opts->turn_screen_off); + assert(opts->prefer_text); + assert(!strcmp(opts->window_title, "my device")); + assert(opts->window_x == 100); + assert(opts->window_y == -1); + assert(opts->window_width == 600); + assert(opts->window_height == 0); + assert(opts->window_borderless); +} + +static void test_options2(void) { + struct scrcpy_cli_args args = { + .opts = SCRCPY_OPTIONS_DEFAULT, + .help = false, + .version = false, + }; + + char *argv[] = { + "scrcpy", + "--no-control", + "--no-display", + "--record", "file.mp4", // cannot enable --no-display without recording + }; + + bool ok = scrcpy_parse_args(&args, sizeof(argv) / sizeof(*argv), argv); + assert(ok); + + const struct scrcpy_options *opts = &args.opts; + assert(!opts->control); + assert(!opts->display); + assert(!strcmp(opts->record_filename, "file.mp4")); + assert(opts->record_format == RECORDER_FORMAT_MP4); +} + +int main(void) { + test_flag_version(); + test_flag_help(); + test_options(); + test_options2(); + return 0; +};