Linux Perf
expr.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
2 #include "util/debug.h"
3 #include "util/expr.h"
4 #include "tests.h"
5 #include <stdlib.h>
6 
7 static int test(struct parse_ctx *ctx, const char *e, double val2)
8 {
9  double val;
10 
11  if (expr__parse(&val, ctx, &e))
12  TEST_ASSERT_VAL("parse test failed", 0);
13  TEST_ASSERT_VAL("unexpected value", val == val2);
14  return 0;
15 }
16 
17 int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
18 {
19  const char *p;
20  const char **other;
21  double val;
22  int ret;
23  struct parse_ctx ctx;
24  int num_other;
25 
26  expr__ctx_init(&ctx);
27  expr__add_id(&ctx, "FOO", 1);
28  expr__add_id(&ctx, "BAR", 2);
29 
30  ret = test(&ctx, "1+1", 2);
31  ret |= test(&ctx, "FOO+BAR", 3);
32  ret |= test(&ctx, "(BAR/2)%2", 1);
33  ret |= test(&ctx, "1 - -4", 5);
34  ret |= test(&ctx, "(FOO-1)*2 + (BAR/2)%2 - -4", 5);
35  ret |= test(&ctx, "1-1 | 1", 1);
36  ret |= test(&ctx, "1-1 & 1", 0);
37  ret |= test(&ctx, "min(1,2) + 1", 2);
38  ret |= test(&ctx, "max(1,2) + 1", 3);
39  ret |= test(&ctx, "1+1 if 3*4 else 0", 2);
40 
41  if (ret)
42  return ret;
43 
44  p = "FOO/0";
45  ret = expr__parse(&val, &ctx, &p);
46  TEST_ASSERT_VAL("division by zero", ret == 1);
47 
48  p = "BAR/";
49  ret = expr__parse(&val, &ctx, &p);
50  TEST_ASSERT_VAL("missing operand", ret == 1);
51 
52  TEST_ASSERT_VAL("find other",
53  expr__find_other("FOO + BAR + BAZ + BOZO", "FOO", &other, &num_other) == 0);
54  TEST_ASSERT_VAL("find other", num_other == 3);
55  TEST_ASSERT_VAL("find other", !strcmp(other[0], "BAR"));
56  TEST_ASSERT_VAL("find other", !strcmp(other[1], "BAZ"));
57  TEST_ASSERT_VAL("find other", !strcmp(other[2], "BOZO"));
58  TEST_ASSERT_VAL("find other", other[3] == NULL);
59  free((void *)other);
60 
61  return 0;
62 }
#define TEST_ASSERT_VAL(text, cond)
Definition: tests.h:7
int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
Definition: expr.c:17
void expr__ctx_init(struct parse_ctx *ctx)
Definition: expr-bison.c:1604
static int test(struct parse_ctx *ctx, const char *e, double val2)
Definition: expr.c:7
Definition: expr.h:13
Definition: tests.h:30
void free(void *)
int expr__parse(double *final_val, struct parse_ctx *ctx, const char **pp)
void expr__add_id(struct parse_ctx *ctx, const char *name, double val)
Definition: expr-bison.c:1595
int expr__find_other(const char *p, const char *one, const char ***other, int *num_otherp)
Definition: expr-bison.c:1609