Przeglądaj źródła

Merge pull request #1089 from lukaspj/fix/datablock-substitution

Fix error in DB substitution logic and add regressiontest
Brian Roberts 2 lat temu
rodzic
commit
595e68393f

+ 1 - 1
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);

+ 67 - 0
Engine/source/testing/datablockTest.cpp

@@ -0,0 +1,67 @@
+#include <gtest/gtest.h>
+
+#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);
+}