root/tools/perf/tests/demangle-ocaml-test.c
// SPDX-License-Identifier: GPL-2.0
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "debug.h"
#include "symbol.h"
#include "tests.h"

static int test__demangle_ocaml(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
{
        int ret = TEST_OK;
        char *buf = NULL;
        size_t i;

        struct {
                const char *mangled, *demangled;
        } test_cases[] = {
                { "main",
                  NULL },
                { "camlStdlib__array__map_154",
                  "Stdlib.array.map_154" },
                { "camlStdlib__anon_fn$5bstdlib$2eml$3a334$2c0$2d$2d54$5d_1453",
                  "Stdlib.anon_fn[stdlib.ml:334,0--54]_1453" },
                { "camlStdlib__bytes__$2b$2b_2205",
                  "Stdlib.bytes.++_2205" },
        };

        for (i = 0; i < ARRAY_SIZE(test_cases); i++) {
                buf = dso__demangle_sym(/*dso=*/NULL, /*kmodule=*/0, test_cases[i].mangled);
                if ((buf == NULL && test_cases[i].demangled != NULL)
                                || (buf != NULL && test_cases[i].demangled == NULL)
                                || (buf != NULL && strcmp(buf, test_cases[i].demangled))) {
                        pr_debug("FAILED: %s: %s != %s\n", test_cases[i].mangled,
                                 buf == NULL ? "(null)" : buf,
                                 test_cases[i].demangled == NULL ? "(null)" : test_cases[i].demangled);
                        ret = TEST_FAIL;
                }
                free(buf);
        }

        return ret;
}

DEFINE_SUITE("Demangle OCaml", demangle_ocaml);