| 1 | #include "test.h" |
| 2 | |
| 3 | #include <engine/shared/datafile.h> |
| 4 | #include <engine/storage.h> |
| 5 | |
| 6 | #include <game/mapitems_ex.h> |
| 7 | |
| 8 | #include <gtest/gtest.h> |
| 9 | |
| 10 | #include <memory> |
| 11 | |
| 12 | TEST(Datafile, ExtendedType) |
| 13 | { |
| 14 | std::unique_ptr<IStorage> pStorage = CreateLocalStorage(); |
| 15 | ASSERT_NE(pStorage, nullptr) << "Error creating local storage" ; |
| 16 | |
| 17 | CTestInfo Info; |
| 18 | |
| 19 | CMapItemTest ItemTest; |
| 20 | ItemTest.m_Version = 1; |
| 21 | ItemTest.m_aFields[0] = 1234; |
| 22 | ItemTest.m_aFields[1] = 5678; |
| 23 | ItemTest.m_Field3 = 9876; |
| 24 | ItemTest.m_Field4 = 5432; |
| 25 | |
| 26 | { |
| 27 | CDataFileWriter Writer; |
| 28 | ASSERT_TRUE(Writer.Open(pStorage.get(), Info.m_aFilename)); |
| 29 | |
| 30 | Writer.AddItem(Type: MAPITEMTYPE_TEST, Id: 0x8000, Size: sizeof(ItemTest), pData: &ItemTest); |
| 31 | |
| 32 | Writer.Finish(); |
| 33 | } |
| 34 | |
| 35 | { |
| 36 | CDataFileReader Reader; |
| 37 | ASSERT_TRUE(Reader.Open(pStorage.get(), Info.m_aFilename, IStorage::TYPE_ALL)); |
| 38 | |
| 39 | int Start, Num; |
| 40 | Reader.GetType(Type: MAPITEMTYPE_TEST, pStart: &Start, pNum: &Num); |
| 41 | EXPECT_EQ(Num, 1); |
| 42 | |
| 43 | int Index = Reader.FindItemIndex(Type: MAPITEMTYPE_TEST, Id: 0x8000); |
| 44 | EXPECT_EQ(Start, Index); |
| 45 | ASSERT_GE(Index, 0); |
| 46 | ASSERT_EQ(Reader.GetItemSize(Index), (int)sizeof(ItemTest)); |
| 47 | |
| 48 | int Type, Id; |
| 49 | const CMapItemTest *pTest = (const CMapItemTest *)Reader.GetItem(Index, pType: &Type, pId: &Id); |
| 50 | EXPECT_EQ(pTest, Reader.FindItem(MAPITEMTYPE_TEST, 0x8000)); |
| 51 | EXPECT_EQ(Type, MAPITEMTYPE_TEST); |
| 52 | EXPECT_EQ(Id, 0x8000); |
| 53 | |
| 54 | EXPECT_EQ(pTest->m_Version, ItemTest.m_Version); |
| 55 | EXPECT_EQ(pTest->m_aFields[0], ItemTest.m_aFields[0]); |
| 56 | EXPECT_EQ(pTest->m_aFields[1], ItemTest.m_aFields[1]); |
| 57 | EXPECT_EQ(pTest->m_Field3, ItemTest.m_Field3); |
| 58 | EXPECT_EQ(pTest->m_Field4, ItemTest.m_Field4); |
| 59 | |
| 60 | Reader.Close(); |
| 61 | } |
| 62 | |
| 63 | if(!HasFailure()) |
| 64 | { |
| 65 | pStorage->RemoveFile(pFilename: Info.m_aFilename, Type: IStorage::TYPE_SAVE); |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | TEST(Datafile, StringData) |
| 70 | { |
| 71 | std::unique_ptr<IStorage> pStorage = CreateLocalStorage(); |
| 72 | ASSERT_NE(pStorage, nullptr) << "Error creating local storage" ; |
| 73 | |
| 74 | CTestInfo Info; |
| 75 | |
| 76 | { |
| 77 | CDataFileWriter Writer; |
| 78 | ASSERT_TRUE(Writer.Open(pStorage.get(), Info.m_aFilename)); |
| 79 | |
| 80 | EXPECT_EQ(Writer.AddDataString("" ), -1); // Empty string is not added |
| 81 | EXPECT_EQ(Writer.AddDataString("Abc" ), 0); |
| 82 | EXPECT_EQ(Writer.AddDataString("DDNet最好了" ), 1); |
| 83 | EXPECT_EQ(Writer.AddDataString("aβい🐘" ), 2); |
| 84 | EXPECT_EQ(Writer.AddData(3, "Abc" ), 3); // Not zero-terminated |
| 85 | EXPECT_EQ(Writer.AddData(7, "foo\0bar" ), 4); // Early zero-terminator |
| 86 | EXPECT_EQ(Writer.AddData(5, "xyz\xff\0" ), 5); // Truncated UTF-8 |
| 87 | EXPECT_EQ(Writer.AddData(4, "XYZ\xff" ), 6); // Truncated UTF-8 and not zero-terminated |
| 88 | |
| 89 | Writer.Finish(); |
| 90 | } |
| 91 | |
| 92 | { |
| 93 | CDataFileReader Reader; |
| 94 | ASSERT_TRUE(Reader.Open(pStorage.get(), Info.m_aFilename, IStorage::TYPE_ALL)); |
| 95 | |
| 96 | EXPECT_EQ(Reader.GetDataString(-1000), nullptr); |
| 97 | EXPECT_STREQ(Reader.GetDataString(-1), "" ); |
| 98 | EXPECT_STREQ(Reader.GetDataString(0), "Abc" ); |
| 99 | EXPECT_STREQ(Reader.GetDataString(1), "DDNet最好了" ); |
| 100 | EXPECT_STREQ(Reader.GetDataString(2), "aβい🐘" ); |
| 101 | EXPECT_EQ(Reader.GetDataString(3), nullptr); |
| 102 | EXPECT_EQ(Reader.GetDataString(4), nullptr); |
| 103 | EXPECT_EQ(Reader.GetDataString(5), nullptr); |
| 104 | EXPECT_EQ(Reader.GetDataString(6), nullptr); |
| 105 | EXPECT_EQ(Reader.GetDataString(1000), nullptr); |
| 106 | |
| 107 | Reader.Close(); |
| 108 | } |
| 109 | |
| 110 | if(!HasFailure()) |
| 111 | { |
| 112 | pStorage->RemoveFile(pFilename: Info.m_aFilename, Type: IStorage::TYPE_SAVE); |
| 113 | } |
| 114 | } |
| 115 | |