]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
07516736 AK |
2 | #include "util/debug.h" |
3 | #include "util/expr.h" | |
4 | #include "tests.h" | |
5 | #include <stdlib.h> | |
8520a98d | 6 | #include <string.h> |
d8f9da24 | 7 | #include <linux/zalloc.h> |
07516736 | 8 | |
aecce63e | 9 | static int test(struct expr_parse_ctx *ctx, const char *e, double val2) |
07516736 AK |
10 | { |
11 | double val; | |
12 | ||
1e1a873d | 13 | if (expr__parse(&val, ctx, e, 1)) |
07516736 AK |
14 | TEST_ASSERT_VAL("parse test failed", 0); |
15 | TEST_ASSERT_VAL("unexpected value", val == val2); | |
16 | return 0; | |
17 | } | |
18 | ||
81f17c90 | 19 | int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused) |
07516736 | 20 | { |
070b3b5a | 21 | struct expr_id_data *val_ptr; |
07516736 | 22 | const char *p; |
070b3b5a | 23 | double val; |
ded80bda | 24 | int ret; |
aecce63e | 25 | struct expr_parse_ctx ctx; |
07516736 AK |
26 | |
27 | expr__ctx_init(&ctx); | |
2c46f542 JO |
28 | expr__add_id_val(&ctx, strdup("FOO"), 1); |
29 | expr__add_id_val(&ctx, strdup("BAR"), 2); | |
07516736 AK |
30 | |
31 | ret = test(&ctx, "1+1", 2); | |
32 | ret |= test(&ctx, "FOO+BAR", 3); | |
33 | ret |= test(&ctx, "(BAR/2)%2", 1); | |
34 | ret |= test(&ctx, "1 - -4", 5); | |
35 | ret |= test(&ctx, "(FOO-1)*2 + (BAR/2)%2 - -4", 5); | |
d73bad06 AK |
36 | ret |= test(&ctx, "1-1 | 1", 1); |
37 | ret |= test(&ctx, "1-1 & 1", 0); | |
38 | ret |= test(&ctx, "min(1,2) + 1", 2); | |
39 | ret |= test(&ctx, "max(1,2) + 1", 3); | |
40 | ret |= test(&ctx, "1+1 if 3*4 else 0", 2); | |
63f11355 | 41 | ret |= test(&ctx, "1.1 + 2.1", 3.2); |
a45badc7 | 42 | ret |= test(&ctx, ".1 + 2.", 2.1); |
3e21a28a IR |
43 | ret |= test(&ctx, "d_ratio(1, 2)", 0.5); |
44 | ret |= test(&ctx, "d_ratio(2.5, 0)", 0); | |
ff1a12f9 IR |
45 | ret |= test(&ctx, "1.1 < 2.2", 1); |
46 | ret |= test(&ctx, "2.2 > 1.1", 1); | |
47 | ret |= test(&ctx, "1.1 < 1.1", 0); | |
48 | ret |= test(&ctx, "2.2 > 2.2", 0); | |
49 | ret |= test(&ctx, "2.2 < 1.1", 0); | |
50 | ret |= test(&ctx, "1.1 > 2.2", 0); | |
07516736 AK |
51 | |
52 | if (ret) | |
53 | return ret; | |
54 | ||
55 | p = "FOO/0"; | |
1e1a873d | 56 | ret = expr__parse(&val, &ctx, p, 1); |
d942815a | 57 | TEST_ASSERT_VAL("division by zero", ret == -1); |
07516736 AK |
58 | |
59 | p = "BAR/"; | |
1e1a873d | 60 | ret = expr__parse(&val, &ctx, p, 1); |
d942815a | 61 | TEST_ASSERT_VAL("missing operand", ret == -1); |
07516736 | 62 | |
ded80bda | 63 | expr__ctx_clear(&ctx); |
07516736 | 64 | TEST_ASSERT_VAL("find other", |
ded80bda IR |
65 | expr__find_other("FOO + BAR + BAZ + BOZO", "FOO", |
66 | &ctx, 1) == 0); | |
67 | TEST_ASSERT_VAL("find other", hashmap__size(&ctx.ids) == 3); | |
68 | TEST_ASSERT_VAL("find other", hashmap__find(&ctx.ids, "BAR", | |
69 | (void **)&val_ptr)); | |
70 | TEST_ASSERT_VAL("find other", hashmap__find(&ctx.ids, "BAZ", | |
71 | (void **)&val_ptr)); | |
72 | TEST_ASSERT_VAL("find other", hashmap__find(&ctx.ids, "BOZO", | |
73 | (void **)&val_ptr)); | |
f97a8991 | 74 | |
ded80bda | 75 | expr__ctx_clear(&ctx); |
9022608e | 76 | TEST_ASSERT_VAL("find other", |
ded80bda IR |
77 | expr__find_other("EVENT1\\,param\\=?@ + EVENT2\\,param\\=?@", |
78 | NULL, &ctx, 3) == 0); | |
79 | TEST_ASSERT_VAL("find other", hashmap__size(&ctx.ids) == 2); | |
80 | TEST_ASSERT_VAL("find other", hashmap__find(&ctx.ids, "EVENT1,param=3/", | |
81 | (void **)&val_ptr)); | |
82 | TEST_ASSERT_VAL("find other", hashmap__find(&ctx.ids, "EVENT2,param=3/", | |
83 | (void **)&val_ptr)); | |
9022608e | 84 | |
ded80bda | 85 | expr__ctx_clear(&ctx); |
07516736 AK |
86 | |
87 | return 0; | |
88 | } |