mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 03:56:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <components/shader/shadermanager.hpp>
 | 
						|
 | 
						|
#include <gtest/gtest.h>
 | 
						|
#include <gmock/gmock.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");
 | 
						|
    }
 | 
						|
}
 |