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
12TEST(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
69TEST(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