mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-22 13:23:55 +00:00
98 lines
2.5 KiB
C++
98 lines
2.5 KiB
C++
|
#include <components/shader/shadermanager.hpp>
|
||
|
|
||
|
#include <gmock/gmock.h>
|
||
|
#include <gtest/gtest.h>
|
||
|
#include <vector>
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
using namespace testing;
|
||
|
using namespace Shader;
|
||
|
|
||
|
using DefineMap = ShaderManager::DefineMap;
|
||
|
|
||
|
struct ShaderParseLinksTest : Test
|
||
|
{
|
||
|
std::string mSource;
|
||
|
std::vector<std::string> mLinkTargets;
|
||
|
ShaderManager::DefineMap mDefines;
|
||
|
const std::string mName = "my_shader.glsl";
|
||
|
|
||
|
bool parseLinks() { return parseDirectives(mSource, mLinkTargets, mDefines, {}, mName); }
|
||
|
};
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, empty_should_succeed)
|
||
|
{
|
||
|
ASSERT_TRUE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "");
|
||
|
EXPECT_TRUE(mLinkTargets.empty());
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_fail_for_single_escape_symbol)
|
||
|
{
|
||
|
mSource = "$";
|
||
|
ASSERT_FALSE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "$");
|
||
|
EXPECT_TRUE(mLinkTargets.empty());
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_fail_on_first_found_escaped_not_valid_directive)
|
||
|
{
|
||
|
mSource = "$foo ";
|
||
|
ASSERT_FALSE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "$foo ");
|
||
|
EXPECT_TRUE(mLinkTargets.empty());
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_fail_on_absent_link_target)
|
||
|
{
|
||
|
mSource = "$link ";
|
||
|
ASSERT_FALSE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "$link ");
|
||
|
EXPECT_TRUE(mLinkTargets.empty());
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_not_require_newline)
|
||
|
{
|
||
|
mSource = "$link \"foo.glsl\"";
|
||
|
ASSERT_TRUE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "");
|
||
|
ASSERT_EQ(mLinkTargets.size(), 1);
|
||
|
EXPECT_EQ(mLinkTargets[0], "foo.glsl");
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_require_quotes)
|
||
|
{
|
||
|
mSource = "$link foo.glsl";
|
||
|
ASSERT_FALSE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "$link foo.glsl");
|
||
|
EXPECT_EQ(mLinkTargets.size(), 0);
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_be_replaced_with_empty_line)
|
||
|
{
|
||
|
mSource = "$link \"foo.glsl\"\nbar";
|
||
|
ASSERT_TRUE(parseLinks());
|
||
|
EXPECT_EQ(mSource, "\nbar");
|
||
|
ASSERT_EQ(mLinkTargets.size(), 1);
|
||
|
EXPECT_EQ(mLinkTargets[0], "foo.glsl");
|
||
|
}
|
||
|
|
||
|
TEST_F(ShaderParseLinksTest, should_only_accept_on_true_condition)
|
||
|
{
|
||
|
mSource =
|
||
|
R"glsl(
|
||
|
$link "foo.glsl" if 1
|
||
|
$link "bar.glsl" if 0
|
||
|
)glsl";
|
||
|
ASSERT_TRUE(parseLinks());
|
||
|
EXPECT_EQ(mSource,
|
||
|
R"glsl(
|
||
|
|
||
|
|
||
|
)glsl");
|
||
|
ASSERT_EQ(mLinkTargets.size(), 1);
|
||
|
EXPECT_EQ(mLinkTargets[0], "foo.glsl");
|
||
|
}
|
||
|
}
|