/**
 * @file cpp_compat.c
 * @author Michal Vasko <mvasko@cesnet.cz>
 * @brief test for C++ compatibility of public headers (macros)
 *
 * Copyright (c) 2021 CESNET, z.s.p.o.
 *
 * This source code is licensed under BSD 3-Clause License (the "License").
 * You may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 */

/* LOCAL INCLUDE HEADERS */
#include "libyang.h"
#include "plugins_exts.h"
#include "plugins_types.h"

int
main(void)
{
    struct ly_ctx *ctx = NULL;
    const struct lys_module *mod;
    int *sa = NULL, *item;
    struct test_list {
        int val;
        struct test_list *next;
    } *tl = NULL, *tl_item = NULL, *tl_next;
    LY_ARRAY_COUNT_TYPE u;
    const struct lysc_node *scnode;
    struct lyd_node *data = NULL, *next, *elem, *opaq = NULL;
    LY_ERR ret = LY_SUCCESS;

    if ((ret = ly_ctx_new(NULL, 0, &ctx))) {
        goto cleanup;
    }
    if (!(mod = ly_ctx_get_module_latest(ctx, "ietf-yang-library"))) {
        ret = LY_EINT;
        goto cleanup;
    }
    if ((ret = ly_ctx_get_yanglib_data(ctx, &data, "%u", ly_ctx_get_change_count(ctx)))) {
        goto cleanup;
    }
    if ((ret = lyd_new_opaq(NULL, ctx, "name", "val", NULL, "module", &opaq))) {
        goto cleanup;
    }

    /* tree_edit.h / tree.h */
    LY_ARRAY_NEW_GOTO(ctx, sa, item, ret, cleanup);
    LY_ARRAY_NEW_GOTO(ctx, sa, item, ret, cleanup);
    LY_ARRAY_FOR(sa, int, item) {}
    LY_ARRAY_FREE(sa);
    sa = NULL;

    LY_ARRAY_CREATE_GOTO(ctx, sa, 2, ret, cleanup);
    LY_ARRAY_INCREMENT(sa);
    LY_ARRAY_INCREMENT(sa);
    LY_ARRAY_FOR(sa, u) {}
    LY_ARRAY_DECREMENT_FREE(sa);
    LY_ARRAY_DECREMENT_FREE(sa);

    LY_LIST_NEW_GOTO(ctx, &tl, tl_item, next, ret, cleanup);
    LY_LIST_NEW_GOTO(ctx, &tl, tl_item, next, ret, cleanup);
    LY_LIST_FOR(tl, tl_item) {}
    LY_LIST_FOR_SAFE(tl, tl_next, tl_item) {}
    tl_item = tl->next;

    /* tree_data.h */
    LYD_TREE_DFS_BEGIN(data, elem) {
        LYD_TREE_DFS_END(data, elem);
    }
    LYD_LIST_FOR_INST(data, data->schema, elem) {}
    LYD_LIST_FOR_INST_SAFE(data, data->schema, next, elem) {}
    (void)LYD_CTX(data);
    (void)LYD_CANON_VALUE(lyd_child(data));
    (void)LYD_NAME(data);
    (void)LYD_OPAQ_VALUE(opaq);

    /* tree_schema.h */
    LYSC_TREE_DFS_BEGIN(mod->compiled->data, scnode) {
        LYSC_TREE_DFS_END(mod->compiled->data, scnode);
    }
    (void)LYSP_MODULE_NAME(mod->parsed);
    (void)lysc_is_userordered(data->schema);
    (void)lysc_is_key(data->schema);
    (void)lysc_is_np_cont(data->schema);
    (void)lysc_is_dup_inst_list(data->schema);

cleanup:
    free(tl_item);
    free(tl);
    lyd_free_tree(opaq);
    lyd_free_all(data);
    ly_ctx_destroy(ctx);
    return ret;
}
