// https://github.com/vinniefalco/LuaBridge
 
// Copyright 2019, Dmitry Tarakanov
 
// SPDX-License-Identifier: MIT
 
 
 
#include "TestBase.h"
 
#include "TestTypes.h"
 
 
 
#include "LuaBridge/List.h"
 
 
 
#include <list>
 
 
 
namespace {
 
 
 
template<class T>
 
 
 
std::list<T> toList(const std::vector<T>& vector)
 
{
 
    return {vector.begin(), vector.end()};
 
}
 
 
 
} // namespace
 
 
 
template<class T>
 
struct ListTest : TestBase
 
{
 
};
 
 
 
TYPED_TEST_CASE_P(ListTest);
 
 
 
TYPED_TEST_P(ListTest, LuaRef)
 
{
 
    using Traits = TypeTraits<TypeParam>;
 
 
 
    this->runLua("result = {" + Traits::list() + "}");
 
 
 
    std::list<TypeParam> expected = toList(Traits::values());
 
    std::list<TypeParam> actual = this->result();
 
    ASSERT_EQ(expected, actual);
 
}
 
 
 
REGISTER_TYPED_TEST_CASE_P(ListTest, LuaRef);
 
 
 
INSTANTIATE_TYPED_TEST_CASE_P(ListTest, ListTest, TestTypes);
 
 
 
struct ListTests : TestBase
 
{
 
};
 
 
 
TEST_F(ListTests, PassToFunction)
 
{
 
    runLua("function foo (list) "
 
           "  result = list "
 
           "end");
 
 
 
    auto foo = luabridge::getGlobal(L, "foo");
 
 
 
    resetResult();
 
 
 
    std::list<int> lvalue{10, 20, 30};
 
    foo(lvalue);
 
    ASSERT_TRUE(result().isTable());
 
    ASSERT_EQ(lvalue, result<std::list<int>>());
 
 
 
    resetResult();
 
 
 
    const std::list<int> constLvalue = lvalue;
 
    foo(constLvalue);
 
    ASSERT_TRUE(result().isTable());
 
    ASSERT_EQ(lvalue, result<std::list<int>>());
 
}