mirror of
https://github.com/OpenMW/openmw.git
synced 2025-12-26 00:03:06 +00:00
Merge branch 'lesscontentmoreengagement' into 'master'
Remove dead code See merge request OpenMW/openmw!5062
This commit is contained in:
commit
deea996a74
2 changed files with 71 additions and 140 deletions
|
|
@ -28,20 +28,12 @@ namespace
|
|||
}
|
||||
|
||||
sol::table makeTable() { return sol::table(mLuaState.unsafeState(), sol::create); }
|
||||
|
||||
sol::table makeTable(std::string name)
|
||||
{
|
||||
auto result = makeTable();
|
||||
result["name"] = name;
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LuaUiContentTest, ProtectedMetatable)
|
||||
{
|
||||
sol::state_view sol = mLuaState.unsafeState();
|
||||
sol["makeContent"] = mNew;
|
||||
sol["M"] = makeContent(makeTable()).getMetatable();
|
||||
std::string testScript = R"(
|
||||
assert(not pcall(function() setmetatable(makeContent{}, {}) end), 'Metatable is not protected')
|
||||
assert(getmetatable(makeContent{}) == false, 'Metatable is not protected')
|
||||
|
|
@ -49,6 +41,35 @@ namespace
|
|||
EXPECT_NO_THROW(sol.safe_script(testScript));
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, Insert)
|
||||
{
|
||||
mLuaState.protectedCall([&](LuaUtil::LuaView& state) {
|
||||
sol::state_view& sol = state.sol();
|
||||
sol["makeContent"] = mNew;
|
||||
EXPECT_NO_THROW(sol.safe_script(R"(
|
||||
local content = makeContent({ {}, {}, {} })
|
||||
content:insert(2, { name = 'inserted' })
|
||||
assert(#content == 4, 'Not inserted')
|
||||
local inserted = content:indexOf('inserted')
|
||||
local index = content:indexOf(content[inserted])
|
||||
assert(index ~= nil, 'Failed to find inserted')
|
||||
assert(index == 2, 'Inserted at the wrong index')
|
||||
)"));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, MakeHole)
|
||||
{
|
||||
mLuaState.protectedCall([&](LuaUtil::LuaView& state) {
|
||||
sol::state_view& sol = state.sol();
|
||||
sol["makeContent"] = mNew;
|
||||
EXPECT_NO_THROW(sol.safe_script(R"(
|
||||
local content = makeContent({ {}, {} })
|
||||
assert(not pcall(function() content[4] = {} end), 'Allowed to make hole')
|
||||
)"));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, Create)
|
||||
{
|
||||
auto table = makeTable();
|
||||
|
|
@ -59,31 +80,6 @@ namespace
|
|||
EXPECT_EQ(content.size(), 3);
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, Insert)
|
||||
{
|
||||
auto table = makeTable();
|
||||
table.add(makeTable());
|
||||
table.add(makeTable());
|
||||
table.add(makeTable());
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
content.insert(2, makeTable("inserted"));
|
||||
EXPECT_EQ(content.size(), 4);
|
||||
auto inserted = content.at("inserted");
|
||||
auto index = content.indexOf(inserted);
|
||||
EXPECT_TRUE(index.has_value());
|
||||
EXPECT_EQ(index.value(), 2);
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, MakeHole)
|
||||
{
|
||||
auto table = makeTable();
|
||||
table.add(makeTable());
|
||||
table.add(makeTable());
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
sol::table t = makeTable();
|
||||
EXPECT_ANY_THROW(content.assign(3, t));
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, WrongType)
|
||||
{
|
||||
auto table = makeTable();
|
||||
|
|
@ -95,52 +91,55 @@ namespace
|
|||
|
||||
TEST_F(LuaUiContentTest, NameAccess)
|
||||
{
|
||||
auto table = makeTable();
|
||||
table.add(makeTable());
|
||||
table.add(makeTable("a"));
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
EXPECT_NO_THROW(content.at("a"));
|
||||
content.remove("a");
|
||||
EXPECT_EQ(content.size(), 1);
|
||||
content.assign(content.size(), makeTable("b"));
|
||||
content.assign("b", makeTable());
|
||||
EXPECT_ANY_THROW(content.at("b"));
|
||||
EXPECT_EQ(content.size(), 2);
|
||||
content.assign(content.size(), makeTable("c"));
|
||||
content.assign(content.size(), makeTable("c"));
|
||||
content.remove("c");
|
||||
EXPECT_ANY_THROW(content.at("c"));
|
||||
mLuaState.protectedCall([&](LuaUtil::LuaView& state) {
|
||||
sol::state_view& sol = state.sol();
|
||||
sol["makeContent"] = mNew;
|
||||
EXPECT_NO_THROW(sol.safe_script(R"(
|
||||
local content = makeContent({ {}, { name = 'a' } })
|
||||
assert(content:indexOf('a') ~= nil, 'Could not find named table')
|
||||
content['a'] = nil
|
||||
assert(#content == 1, 'Failed to remove')
|
||||
content:add({ name = 'b' })
|
||||
content['b'] = {}
|
||||
assert(#content == 2, 'Failed to insert')
|
||||
content:add({ name = 'c' })
|
||||
content:add({ name = 'c' })
|
||||
content['c'] = nil
|
||||
assert(content:indexOf('c') == nil, 'Failed to remove value inserted twice'..#content)
|
||||
)"));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, IndexOf)
|
||||
{
|
||||
auto table = makeTable();
|
||||
table.add(makeTable());
|
||||
table.add(makeTable());
|
||||
table.add(makeTable());
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
auto child = makeTable();
|
||||
content.assign(2, child);
|
||||
EXPECT_EQ(content.indexOf(child).value(), 2);
|
||||
EXPECT_TRUE(!content.indexOf(makeTable()).has_value());
|
||||
mLuaState.protectedCall([&](LuaUtil::LuaView& state) {
|
||||
sol::state_view& sol = state.sol();
|
||||
sol["makeContent"] = mNew;
|
||||
EXPECT_NO_THROW(sol.safe_script(R"(
|
||||
local content = makeContent({ {}, {}, {} })
|
||||
local child = {}
|
||||
content[3] = child
|
||||
assert(content:indexOf(child) == 3, 'Failed to assign')
|
||||
assert(content:indexOf({}) == nil, 'Found non-existent child')
|
||||
)"));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(LuaUiContentTest, BoundsChecks)
|
||||
{
|
||||
auto table = makeTable();
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
EXPECT_ANY_THROW(content.at(0));
|
||||
EXPECT_EQ(content.size(), 0);
|
||||
content.assign(content.size(), makeTable());
|
||||
EXPECT_EQ(content.size(), 1);
|
||||
content.assign(content.size(), makeTable());
|
||||
EXPECT_EQ(content.size(), 2);
|
||||
content.assign(content.size(), makeTable());
|
||||
EXPECT_EQ(content.size(), 3);
|
||||
EXPECT_ANY_THROW(content.at(3));
|
||||
EXPECT_ANY_THROW(content.remove(3));
|
||||
content.remove(2);
|
||||
EXPECT_EQ(content.size(), 2);
|
||||
EXPECT_ANY_THROW(content.at(2));
|
||||
{
|
||||
auto table = makeTable();
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
EXPECT_ANY_THROW(content.at(0));
|
||||
EXPECT_EQ(content.size(), 0);
|
||||
}
|
||||
{
|
||||
auto table = makeTable();
|
||||
table[1] = makeTable();
|
||||
LuaUi::ContentView content = makeContent(table);
|
||||
EXPECT_EQ(content.size(), 1);
|
||||
EXPECT_ANY_THROW(content.at(1));
|
||||
content.at(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#ifndef COMPONENTS_LUAUI_CONTENT
|
||||
#define COMPONENTS_LUAUI_CONTENT
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
#include <sol/sol.hpp>
|
||||
|
||||
#include <components/lua/luastate.hpp>
|
||||
|
|
@ -27,22 +24,6 @@ namespace LuaUi
|
|||
|
||||
size_t size() const { return mTable.size(); }
|
||||
|
||||
void assign(std::string_view name, const sol::table& table)
|
||||
{
|
||||
if (indexOf(name).has_value())
|
||||
mTable[name] = table;
|
||||
else
|
||||
throw std::domain_error("Invalid Content key");
|
||||
}
|
||||
void assign(size_t index, const sol::table& table)
|
||||
{
|
||||
if (index <= size())
|
||||
mTable[toLua(index)] = table;
|
||||
else
|
||||
throw std::range_error("Invalid Content index");
|
||||
}
|
||||
void insert(size_t index, const sol::table& table) { callMethod("insert", toLua(index), table); }
|
||||
|
||||
sol::object at(size_t index) const
|
||||
{
|
||||
if (index < size())
|
||||
|
|
@ -50,60 +31,11 @@ namespace LuaUi
|
|||
else
|
||||
throw std::range_error("Invalid Content index");
|
||||
}
|
||||
sol::object at(std::string_view name) const
|
||||
{
|
||||
if (indexOf(name).has_value())
|
||||
return mTable.get<sol::object>(name);
|
||||
else
|
||||
throw std::range_error("Invalid Content key");
|
||||
}
|
||||
void remove(size_t index)
|
||||
{
|
||||
if (index < size())
|
||||
// for some reason mTable[key] = value doesn't call __newindex
|
||||
getMetatable()[sol::meta_function::new_index].get<sol::protected_function>()(
|
||||
mTable, toLua(index), sol::nil);
|
||||
else
|
||||
throw std::range_error("Invalid Content index");
|
||||
}
|
||||
void remove(std::string_view name)
|
||||
{
|
||||
auto index = indexOf(name);
|
||||
if (index.has_value())
|
||||
remove(index.value());
|
||||
else
|
||||
throw std::domain_error("Invalid Content key");
|
||||
}
|
||||
std::optional<size_t> indexOf(std::string_view name) const
|
||||
{
|
||||
sol::object result = callMethod("indexOf", name);
|
||||
if (result.is<size_t>())
|
||||
return fromLua(LuaUtil::cast<size_t>(result));
|
||||
else
|
||||
return std::nullopt;
|
||||
}
|
||||
std::optional<size_t> indexOf(const sol::table& table) const
|
||||
{
|
||||
sol::object result = callMethod("indexOf", table);
|
||||
if (result.is<size_t>())
|
||||
return fromLua(LuaUtil::cast<size_t>(result));
|
||||
else
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
sol::table getMetatable() const { return mTable[sol::metatable_key].get<sol::table>(); }
|
||||
|
||||
private:
|
||||
sol::main_table mTable;
|
||||
|
||||
template <typename... Arg>
|
||||
sol::object callMethod(std::string_view name, Arg&&... arg) const
|
||||
{
|
||||
return mTable.get<sol::protected_function>(name)(mTable, arg...);
|
||||
}
|
||||
|
||||
static inline size_t toLua(size_t index) { return index + 1; }
|
||||
static inline size_t fromLua(size_t index) { return index - 1; }
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue