// SPDX-License-Identifier: GPL-2.0
#include "util/debug.h"
#include "util/expr.h"
#include "tests.h"
#include <stdlib.h>
#include <string.h>
#include <linux/zalloc.h>

static int test(struct parse_ctx *ctx, const char *e, double val2)
{
	double val;

	if (expr__parse(&val, ctx, e))
		TEST_ASSERT_VAL("parse test failed", 0);
	TEST_ASSERT_VAL("unexpected value", val == val2);
	return 0;
}

int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
{
	const char *p;
	const char **other;
	double val;
	int i, ret;
	struct parse_ctx ctx;
	int num_other;

	expr__ctx_init(&ctx);
	expr__add_id(&ctx, "FOO", 1);
	expr__add_id(&ctx, "BAR", 2);

	ret = test(&ctx, "1+1", 2);
	ret |= test(&ctx, "FOO+BAR", 3);
	ret |= test(&ctx, "(BAR/2)%2", 1);
	ret |= test(&ctx, "1 - -4",  5);
	ret |= test(&ctx, "(FOO-1)*2 + (BAR/2)%2 - -4",  5);
	ret |= test(&ctx, "1-1 | 1", 1);
	ret |= test(&ctx, "1-1 & 1", 0);
	ret |= test(&ctx, "min(1,2) + 1", 2);
	ret |= test(&ctx, "max(1,2) + 1", 3);
	ret |= test(&ctx, "1+1 if 3*4 else 0", 2);

	if (ret)
		return ret;

	p = "FOO/0";
	ret = expr__parse(&val, &ctx, p);
	TEST_ASSERT_VAL("division by zero", ret == -1);

	p = "BAR/";
	ret = expr__parse(&val, &ctx, p);
	TEST_ASSERT_VAL("missing operand", ret == -1);

	TEST_ASSERT_VAL("find other",
			expr__find_other("FOO + BAR + BAZ + BOZO", "FOO", &other, &num_other) == 0);
	TEST_ASSERT_VAL("find other", num_other == 3);
	TEST_ASSERT_VAL("find other", !strcmp(other[0], "BAR"));
	TEST_ASSERT_VAL("find other", !strcmp(other[1], "BAZ"));
	TEST_ASSERT_VAL("find other", !strcmp(other[2], "BOZO"));
	TEST_ASSERT_VAL("find other", other[3] == NULL);

	for (i = 0; i < num_other; i++)
		zfree(&other[i]);
	free((void *)other);

	return 0;
}
