diff --git a/Engine/source/console/simDatablock.cpp b/Engine/source/console/simDatablock.cpp index d200f5dfb..d3969a069 100644 --- a/Engine/source/console/simDatablock.cpp +++ b/Engine/source/console/simDatablock.cpp @@ -253,7 +253,7 @@ void SimDataBlock::performSubstitutions(SimDataBlock* dblock, const SimObject* o b[0] = '\0'; Con::EvalResult evalResult = Con::evaluate(avar("return %s;", buffer), false, 0); - if (evalResult.valid) + if (!evalResult.valid) { Con::errorf("Field Substitution Failed: field=\"%s\" substitution=\"%s\" -- syntax error", substitutions[i]->mSlot, substitutions[i]->mValue); diff --git a/Engine/source/testing/datablockTest.cpp b/Engine/source/testing/datablockTest.cpp new file mode 100644 index 000000000..5a1693c56 --- /dev/null +++ b/Engine/source/testing/datablockTest.cpp @@ -0,0 +1,67 @@ +#include + +#include "console/script.h" +#include "T3D/fx/particle.h" +#include "T3D/gameBase/gameBase.h" + +TEST(DatablockTest, Datablocks_Can_Be_Overridden) +{ + Con::EvalResult result = Con::evaluatef(R"( + datablock SimDataBlock(testDb) { + foo = 2; + }; + datablock SimDataBlock(testDb) { + foo = 3; + }; + return testDb.foo; + )", false, "datablockTest.cpp"); + + ASSERT_TRUE(result.valid); + // Successfully overrode the datablock + EXPECT_STREQ(result.value, "3"); +} + +TEST(DatablockTest, Datablocks_Must_Not_Change_Type) +{ + Con::EvalResult result = Con::evaluatef(R"( + datablock SimDataBlock(testDb) { + foo = 2; + }; + datablock ParticleData(testDb) { + foo = 3; + }; + return testDb.foo; + )", false, "datablockTest.cpp"); + + // Not a syntax error + ASSERT_TRUE(result.valid); + // Did not override the datablock + EXPECT_STREQ(result.value, "2"); +} + +TEST(DatablockTest, Datablock_Can_Substitute_String) +{ + Con::EvalResult result = Con::evaluatef(R"( + datablock ParticleData(testDb) { + lifetimeMS = "$$ %%%%.bar"; + }; + + $simObj = new GameBase(testObj) { + bar = 1234; + }; + + return "done"; + )", false, "datablockTest.cpp"); + + EXPECT_TRUE(result.valid); + EXPECT_STREQ(result.value, "done"); + + ParticleData* testDb = NULL; + Sim::findObject("testDb", testDb); + GameBase* testObj = NULL; + Sim::findObject("testObj", testObj); + + testDb->performSubstitutions(testDb, testObj); + + EXPECT_EQ(testDb->lifetimeMS, 1234); +}