/*
 * Copyright (C) 2019 Intel Corporation. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 */

#include "test_helper.h"
#include "gtest/gtest.h"

#include "bh_common.h"

class bh_common_test_suite : public testing::Test
{
  protected:
    // You should make the members protected s.t. they can be
    // accessed from sub-classes.

    // virtual void SetUp() will be called before each test is run.  You
    // should define it if you need to initialize the varaibles.
    // Otherwise, this can be skipped.
    virtual void SetUp() {}

    // virtual void TearDown() will be called after each test is run.
    // You should define it if there is cleanup work to do.  Otherwise,
    // you don't have to provide it.
    //
    virtual void TearDown() {}

  public:
    WAMRRuntimeRAII<512 * 1024> runtime;
};

#define STR_TEST "test"

TEST_F(bh_common_test_suite, wa_strdup)
{
    EXPECT_EQ(nullptr, wa_strdup(nullptr));
    EXPECT_NE(nullptr, wa_strdup(STR_TEST));
}

TEST_F(bh_common_test_suite, b_strcpy_s)
{
    char dest[10] = { 0 };

    EXPECT_EQ(0, b_strcpy_s(dest, sizeof(dest), STR_TEST));

    // Test abnormal cases.
    EXPECT_EQ(-1, b_strcpy_s(nullptr, 0, nullptr));
    EXPECT_EQ(-1, b_strcpy_s(dest, sizeof(dest), nullptr));
    EXPECT_EQ(-1, b_strcpy_s(dest, 0, STR_TEST));
}

TEST_F(bh_common_test_suite, b_strcat_s)
{
    char dest[10] = { 0 };

    EXPECT_EQ(0, b_strcat_s(dest, sizeof(dest), STR_TEST));

    // Test abnormal cases.
    EXPECT_EQ(-1, b_strcat_s(nullptr, 0, nullptr));
    EXPECT_EQ(-1, b_strcat_s(dest, sizeof(dest), nullptr));
    EXPECT_EQ(-1, b_strcat_s(dest, 0, STR_TEST));
}

TEST_F(bh_common_test_suite, bh_strdup)
{
    EXPECT_NE(nullptr, bh_strdup(STR_TEST));
    EXPECT_EQ(nullptr, bh_strdup(nullptr));
}

TEST_F(bh_common_test_suite, b_memmove_s)
{
    char dest[10] = { 0 };

    EXPECT_EQ(0, b_memmove_s(dest, sizeof(dest), STR_TEST, sizeof(STR_TEST)));

    // Test abnormal cases.
    EXPECT_EQ(0, b_memmove_s(dest, sizeof(dest), STR_TEST, 0));
    EXPECT_EQ(0, b_memmove_s(nullptr, sizeof(dest), STR_TEST, 0));

    EXPECT_EQ(0, b_memmove_s(dest, sizeof(dest), nullptr, 0));
    EXPECT_EQ(-1, b_memmove_s(dest, sizeof(dest), STR_TEST, sizeof(dest) + 1));
}

TEST_F(bh_common_test_suite, b_memcpy_s)
{
    char dest[10] = { 0 };

    EXPECT_EQ(0, b_memcpy_s(dest, sizeof(dest), STR_TEST, sizeof(STR_TEST)));

    // Test abnormal cases.
    EXPECT_EQ(0, b_memcpy_s(dest, sizeof(dest), STR_TEST, 0));
    EXPECT_EQ(-1,
              b_memcpy_s(nullptr, sizeof(dest), STR_TEST, sizeof(STR_TEST)));
    EXPECT_EQ(-1, b_memcpy_s(dest, sizeof(dest), nullptr, sizeof(STR_TEST)));
    EXPECT_EQ(-1, b_memcpy_s(dest, sizeof(dest), STR_TEST, sizeof(dest) + 1));
}