Skip to content

Commit

Permalink
#6027: Move ShaderExpression tests to unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Jul 28, 2022
1 parent 3466b76 commit 53d2995
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 166 deletions.
166 changes: 0 additions & 166 deletions radiantcore/shaders/MaterialManager.cpp
Expand Up @@ -331,10 +331,6 @@ void MaterialManager::initialiseModule(const IApplicationContext& ctx)

construct();

#if 0
testShaderExpressionParsing();
#endif

// Register the mtr file extension
GlobalFiletypes().registerPattern("material", FileTypePattern(_("Material File"), "mtr", "*.mtr"));
}
Expand All @@ -349,168 +345,6 @@ void MaterialManager::onMaterialDefsReloaded()
});
}


// Horrible evil macro to avoid assertion failures if expr is NULL
#define GET_EXPR_OR_RETURN expr = createShaderExpressionFromString(exprStr);\
if (!expr) return;

void MaterialManager::testShaderExpressionParsing()
{
// Test a few things
std::string exprStr = "3";
IShaderExpression::Ptr expr;
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3+4";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "(3+4)";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "(4.2)";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3+5+6";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3+(5+6)";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3 * 3+5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3+3*5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "(3+3)*5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "(3+3*7)-5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3-3*5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "blinktable[0]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "blinktable[1]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "blinktable[0.3]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "blinksnaptable[0.3]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "xianjittertable[0]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "xianjittertable[time]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3-3*xianjittertable[2]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3+xianjittertable[3]*7";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "(3+xianjittertable[3])*7";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "2.3 % 2";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "2.0 % 0.5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "2 == 2";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "1 == 2";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "1 != 2";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "1.2 != 1.2";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "1.2 == 1.2*3";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "1.2*3 == 1.2*3";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3 == 3 && 1 != 0";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "1 != 1 || 3 == 3";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "4 == 3 || 1 != 0";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "time";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(2) << std::endl;

exprStr = "-3 + 5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3 * -5";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3 * -5 + 4";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3 + -5 * 4";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "3 * 5 * -6";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;

exprStr = "decalFade[(time - Parm3)/(parm4 - parm3)]";
GET_EXPR_OR_RETURN;
rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl;
}

void MaterialManager::shutdownModule()
{
rMessage() << "MaterialManager::shutdownModule called" << std::endl;
Expand Down
49 changes: 49 additions & 0 deletions test/Materials.cpp
Expand Up @@ -1527,4 +1527,53 @@ TEST_F(MaterialsTest, CoverageOfMaterialWithBlendStage)
EXPECT_EQ(material->getCoverage(), Material::MC_OPAQUE) << "Material should be opaque";
}

TEST_F(MaterialsTest, ShaderExpressionEvaluation)
{
auto testExpressions = std::map<std::string, float>
{
{ "3", 3.0f },
{ "3+4", 7.0f },
{ "(3+4)", 7.0f },
{ "(4.2)", 4.2f },
{ "3+5+6", 14.0f },
{ "3+(5+6)", 14.0f },
{ "3 * 3+5", 14.0f },
{ "3+3*5", 18.0f },
{ "(3+3)*5", 30.0f },
{ "(3+3*7)-5", 19.0f },
{ "3-3*5", -12.0f },
{ "cosTable[0]", 1.0f },
{ "cosTable[1]", 1.0f },
{ "cosTable[0.3]", -0.3090f },
{ "3-3*cosTable[2]", 0.0f },
{ "3+cosTable[3]*7", 10.0f },
{ "(3+cosTable[3])*7", 28.0f },
{ "2.3 % 2", 0.3f },
{ "2.0 % 0.5", 0.0f },
{ "2 == 2", 1.0f },
{ "1 == 2", 0.0f },
{ "1 != 2", 1.0f },
{ "1.2 != 1.2", 0.0f },
{ "1.2 == 1.2*3", 0.0f },
{ "1.2*3 == 1.2*3", 1.0f },
{ "3 == 3 && 1 != 0", 1.0f },
{ "1 != 1 || 3 == 3", 1.0f },
{ "4 == 3 || 1 != 0", 1.0f },
{ "time", 0.0f },
{ "-3 + 5", 2.0f },
{ "3 * -5", -15.0f },
{ "3 * -5 + 4", -11.0f },
{ "3 + -5 * 4", -17.0f },
{ "3 * 5 * -6", -90.0f },
};

for (const auto& [expressionString, expectedValue] : testExpressions)
{
auto expr = GlobalMaterialManager().createShaderExpressionFromString(expressionString);

EXPECT_NEAR(expr->getValue(0), expectedValue, 0.01f) <<
"Expression " << expressionString << " should evaluate to " << expectedValue;
}
}

}

0 comments on commit 53d2995

Please sign in to comment.