@@ -161,6 +161,29 @@ return {
161
161
end
162
162
}
163
163
}
164
+ )X" );
165
+
166
+ constexpr VFS::Path::NormalizedView customDataPath (" customdata.lua" );
167
+
168
+ VFSTestFile customDataScript (R"X(
169
+ data = nil
170
+ return {
171
+ engineHandlers = {
172
+ onSave = function()
173
+ return data
174
+ end,
175
+ onLoad = function(state)
176
+ data = state
177
+ end,
178
+ onInit = function(state)
179
+ data = state
180
+ end
181
+ },
182
+ eventHandlers = {
183
+ WakeUp = function()
184
+ end
185
+ }
186
+ }
164
187
)X" );
165
188
166
189
struct LuaScriptsContainerTest : Test
@@ -178,6 +201,7 @@ return {
178
201
{ overrideInterfacePath, &overrideInterfaceScript },
179
202
{ useInterfacePath, &useInterfaceScript },
180
203
{ unloadPath, &unloadScript },
204
+ { customDataPath, &customDataScript },
181
205
});
182
206
183
207
LuaUtil::ScriptsConfiguration mCfg ;
@@ -199,6 +223,7 @@ CUSTOM, PLAYER: testInterface.lua
199
223
CUSTOM, PLAYER: overrideInterface.lua
200
224
CUSTOM, PLAYER: useInterface.lua
201
225
CUSTOM: unload.lua
226
+ CUSTOM: customdata.lua
202
227
)X" );
203
228
mCfg .init (std::move (cfg));
204
229
}
@@ -570,4 +595,58 @@ CUSTOM: unload.lua
570
595
scripts1.load (data);
571
596
EXPECT_EQ (tracker.size (), 0 );
572
597
}
598
+
599
+ TEST_F (LuaScriptsContainerTest, LoadOrderChange)
600
+ {
601
+ LuaUtil::ScriptTracker tracker;
602
+ LuaUtil::ScriptsContainer scripts1 (&mLua , " Test" , &tracker, false );
603
+ LuaUtil::BasicSerializer serializer1;
604
+ LuaUtil::BasicSerializer serializer2 ([](int contentFileIndex) -> int {
605
+ if (contentFileIndex == 12 )
606
+ return 34 ;
607
+ else if (contentFileIndex == 37 )
608
+ return 12 ;
609
+ return contentFileIndex;
610
+ });
611
+ scripts1.setSerializer (&serializer1);
612
+ scripts1.setSavedDataDeserializer (&serializer2);
613
+
614
+ mLua .protectedCall ([&](LuaUtil::LuaView& lua) {
615
+ sol::object id1 = sol::make_object_userdata (lua.sol (), ESM::RefNum{ 42 , 12 });
616
+ sol::object id2 = sol::make_object_userdata (lua.sol (), ESM::RefNum{ 13 , 37 });
617
+ sol::table table = lua.newTable ();
618
+ table[id1] = id2;
619
+ LuaUtil::BinaryData serialized = LuaUtil::serialize (table, &serializer1);
620
+
621
+ EXPECT_TRUE (scripts1.addCustomScript (*mCfg .findId (customDataPath), serialized));
622
+ EXPECT_EQ (tracker.size (), 1 );
623
+ for (int i = 0 ; i < 600 ; ++i)
624
+ tracker.unloadInactiveScripts (lua);
625
+ EXPECT_EQ (tracker.size (), 0 );
626
+ scripts1.receiveEvent (" WakeUp" , {});
627
+ EXPECT_EQ (tracker.size (), 1 );
628
+ });
629
+
630
+ ESM::LuaScripts data1;
631
+ ESM::LuaScripts data2;
632
+ scripts1.save (data1);
633
+ scripts1.load (data1);
634
+ scripts1.save (data2);
635
+ EXPECT_NE (data1.mScripts [0 ].mData , data2.mScripts [0 ].mData );
636
+
637
+ mLua .protectedCall ([&](LuaUtil::LuaView& lua) {
638
+ sol::object deserialized = LuaUtil::deserialize (lua.sol (), data2.mScripts [0 ].mData , &serializer1);
639
+ EXPECT_TRUE (deserialized.is <sol::table>());
640
+ sol::table table = deserialized;
641
+ for (const auto & [key, value] : table)
642
+ {
643
+ EXPECT_TRUE (key.is <ESM::RefNum>());
644
+ EXPECT_TRUE (value.is <ESM::RefNum>());
645
+ EXPECT_EQ (key.as <ESM::RefNum>(), (ESM::RefNum{ 42 , 34 }));
646
+ EXPECT_EQ (value.as <ESM::RefNum>(), (ESM::RefNum{ 13 , 12 }));
647
+ return ;
648
+ }
649
+ EXPECT_FALSE (true );
650
+ });
651
+ }
573
652
}
0 commit comments