#include "unit-test.h"
#include "hex.h"
#include "parse-options.h"
#include "strbuf.h"
#include "string-list.h"
#include "strvec.h"

static const char * const unit_test_usage[] = {
	N_("unit-test [<options>]"),
	NULL,
};

int cmd_main(int argc, const char **argv)
{
	struct string_list run_args = STRING_LIST_INIT_NODUP;
	struct string_list exclude_args = STRING_LIST_INIT_NODUP;
	int immediate = 0;
	struct option options[] = {
		OPT_BOOL('i', "immediate", &immediate,
			 N_("immediately exit upon the first failed test")),
		OPT_STRING_LIST('r', "run", &run_args, N_("suite[::test]"),
				N_("run only test suite or individual test <suite[::test]>")),
		OPT_STRING_LIST(0, "exclude", &exclude_args, N_("suite"),
				N_("exclude test suite <suite>")),
		/*
		 * Compatibility wrappers so that we don't have to filter
		 * options understood by integration tests.
		 */
		OPT_NOOP_NOARG('d', "debug"),
		OPT_NOOP_NOARG(0, "github-workflow-markup"),
		OPT_NOOP_NOARG(0, "no-bin-wrappers"),
		OPT_NOOP_ARG(0, "no-chain-lint"),
		OPT_NOOP_ARG(0, "root"),
		OPT_NOOP_ARG(0, "stress"),
		OPT_NOOP_NOARG(0, "tee"),
		OPT_NOOP_NOARG(0, "with-dashes"),
		OPT_NOOP_ARG(0, "valgrind"),
		OPT_NOOP_ARG(0, "valgrind-only"),
		OPT_NOOP_NOARG('v', "verbose"),
		OPT_NOOP_NOARG('V', "verbose-log"),
		OPT_NOOP_ARG(0, "verbose-only"),
		OPT_NOOP_NOARG('x', NULL),
		OPT_END(),
	};
	struct strvec args = STRVEC_INIT;
	int ret;

	argc = parse_options(argc, argv, NULL, options,
			     unit_test_usage, PARSE_OPT_KEEP_ARGV0);
	if (argc > 1)
		usagef(_("extra command line parameter '%s'"), argv[0]);

	strvec_push(&args, argv[0]);
	strvec_push(&args, "-t");
	if (immediate)
		strvec_push(&args, "-Q");
	for (size_t i = 0; i < run_args.nr; i++)
		strvec_pushf(&args, "-s%s", run_args.items[i].string);
	for (size_t i = 0; i < exclude_args.nr; i++)
		strvec_pushf(&args, "-x%s", exclude_args.items[i].string);

	ret = clar_test(args.nr, (char **) args.v);

	string_list_clear(&run_args, 0);
	strvec_clear(&args);
	return ret;
}
