CMapFormatTest.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /*
  2. * CMapFormatTest.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "../../lib/filesystem/CMemoryBuffer.h"
  12. #include "../../lib/filesystem/Filesystem.h"
  13. #include "../../lib/mapping/CMap.h"
  14. #include "../../lib/rmg/CMapGenOptions.h"
  15. #include "../../lib/rmg/CMapGenerator.h"
  16. #include "../../lib/mapping/MapFormatJson.h"
  17. #include "../lib/VCMIDirs.h"
  18. #include "MapComparer.h"
  19. #include "../JsonComparer.h"
  20. #include "mock/ZoneOptionsFake.h"
  21. static const int TEST_RANDOM_SEED = 1337;
  22. static void saveTestMap(CMemoryBuffer & serializeBuffer, const std::string & filename)
  23. {
  24. auto path = VCMIDirs::get().userDataPath() / filename;
  25. boost::filesystem::remove(path);
  26. std::ofstream tmp(path.c_str(), std::ofstream::binary);
  27. tmp.write((const char *)serializeBuffer.getBuffer().data(), serializeBuffer.getSize());
  28. tmp.flush();
  29. tmp.close();
  30. }
  31. TEST(MapFormat, DISABLED_Random)
  32. {
  33. SCOPED_TRACE("MapFormat_Random start");
  34. CMapGenOptions opt;
  35. CRmgTemplate tmpl;
  36. auto zoneOptions = std::make_shared<ZoneOptionsFake>();
  37. const_cast<CRmgTemplate::CPlayerCountRange &>(tmpl.getHumanPlayers()).addRange(1, 4);
  38. const_cast<CRmgTemplate::Zones &>(tmpl.getZones())[0] = zoneOptions;
  39. zoneOptions->setOwner(1);
  40. opt.setMapTemplate(&tmpl);
  41. opt.setHeight(CMapHeader::MAP_SIZE_MIDDLE);
  42. opt.setWidth(CMapHeader::MAP_SIZE_MIDDLE);
  43. opt.setHasTwoLevels(true);
  44. opt.setHumanOrCpuPlayerCount(4);
  45. opt.setPlayerTypeForStandardPlayer(PlayerColor(0), EPlayerType::HUMAN);
  46. opt.setPlayerTypeForStandardPlayer(PlayerColor(1), EPlayerType::AI);
  47. opt.setPlayerTypeForStandardPlayer(PlayerColor(2), EPlayerType::AI);
  48. opt.setPlayerTypeForStandardPlayer(PlayerColor(3), EPlayerType::AI);
  49. CMapGenerator gen(opt, nullptr, TEST_RANDOM_SEED);
  50. std::unique_ptr<CMap> initialMap = gen.generate();
  51. initialMap->name.appendRawString("Test");
  52. SCOPED_TRACE("MapFormat_Random generated");
  53. CMemoryBuffer serializeBuffer;
  54. {
  55. CMapSaverJson saver(&serializeBuffer);
  56. saver.saveMap(initialMap);
  57. }
  58. SCOPED_TRACE("MapFormat_Random serialized");
  59. saveTestMap(serializeBuffer, "test_random.vmap");
  60. SCOPED_TRACE("MapFormat_Random saved");
  61. serializeBuffer.seek(0);
  62. {
  63. CMapLoaderJson loader(&serializeBuffer);
  64. std::unique_ptr<CMap> serialized = loader.loadMap(nullptr);
  65. MapComparer c;
  66. c(serialized, initialMap);
  67. }
  68. SCOPED_TRACE("MapFormat_Random finish");
  69. }
  70. static JsonNode getFromArchive(CZipLoader & archive, const std::string & archiveFilename)
  71. {
  72. JsonPath resource = JsonPath::builtin(archiveFilename);
  73. if(!archive.existsResource(resource))
  74. throw std::runtime_error(archiveFilename + " not found");
  75. auto data = archive.load(resource)->readAll();
  76. JsonNode res(reinterpret_cast<char*>(data.first.get()), data.second);
  77. return res;
  78. }
  79. static void addToArchive(CZipSaver & saver, const JsonNode & data, const std::string & filename)
  80. {
  81. auto s = data.toString();
  82. std::unique_ptr<COutputStream> stream = saver.addFile(filename);
  83. if(stream->write((const ui8*)s.c_str(), s.size()) != s.size())
  84. throw std::runtime_error("CMapSaverJson::saveHeader() zip compression failed.");
  85. }
  86. static std::unique_ptr<CMap> loadOriginal(const JsonNode & header, const JsonNode & objects, const JsonNode & surface, const JsonNode & underground)
  87. {
  88. CMemoryBuffer initialBuffer;
  89. std::shared_ptr<CIOApi> originalDataIO(new CProxyIOApi(&initialBuffer));
  90. {
  91. CZipSaver initialSaver(originalDataIO, "_");
  92. addToArchive(initialSaver, header, CMapFormatJson::HEADER_FILE_NAME);
  93. addToArchive(initialSaver, objects, CMapFormatJson::OBJECTS_FILE_NAME);
  94. addToArchive(initialSaver, surface, "surface_terrain.json");
  95. addToArchive(initialSaver, underground, "underground_terrain.json");
  96. }
  97. initialBuffer.seek(0);
  98. CMapLoaderJson initialLoader(&initialBuffer);
  99. return initialLoader.loadMap(nullptr);
  100. }
  101. static void loadActual(CMemoryBuffer * serializeBuffer, const std::unique_ptr<CMap> & originalMap, JsonNode & header, JsonNode & objects, JsonNode & surface, JsonNode & underground)
  102. {
  103. {
  104. CMapSaverJson saver(serializeBuffer);
  105. saver.saveMap(originalMap);
  106. }
  107. std::shared_ptr<CIOApi> actualDataIO(new CProxyROIOApi(serializeBuffer));
  108. CZipLoader actualDataLoader("", "_", actualDataIO);
  109. header = getFromArchive(actualDataLoader, CMapFormatJson::HEADER_FILE_NAME);
  110. objects = getFromArchive(actualDataLoader, CMapFormatJson::OBJECTS_FILE_NAME);
  111. surface = getFromArchive(actualDataLoader, "surface_terrain.json");
  112. underground = getFromArchive(actualDataLoader, "underground_terrain.json");
  113. }
  114. TEST(MapFormat, DISABLED_Objects)
  115. {
  116. static const std::string MAP_DATA_PATH = "test/ObjectPropertyTest/";
  117. const JsonNode initialHeader(JsonPath::builtin(MAP_DATA_PATH + CMapFormatJson::HEADER_FILE_NAME));
  118. const JsonNode expectedHeader(JsonPath::builtin(MAP_DATA_PATH + CMapFormatJson::HEADER_FILE_NAME));//same as initial for now
  119. const JsonNode initialObjects(JsonPath::builtin(MAP_DATA_PATH + CMapFormatJson::OBJECTS_FILE_NAME));
  120. const JsonNode expectedObjects(JsonPath::builtin(MAP_DATA_PATH + "objects.ex.json"));
  121. const JsonNode expectedSurface(JsonPath::builtin(MAP_DATA_PATH + "surface_terrain.json"));
  122. const JsonNode expectedUnderground(JsonPath::builtin(MAP_DATA_PATH + "underground_terrain.json"));
  123. std::unique_ptr<CMap> originalMap = loadOriginal(initialHeader, initialObjects, expectedSurface, expectedUnderground);
  124. CMemoryBuffer serializeBuffer;
  125. JsonNode actualHeader;
  126. JsonNode actualObjects;
  127. JsonNode actualSurface;
  128. JsonNode actualUnderground;
  129. loadActual(&serializeBuffer, originalMap, actualHeader, actualObjects, actualSurface, actualUnderground);
  130. saveTestMap(serializeBuffer, "test_object_property.vmap");
  131. {
  132. JsonComparer c(false);
  133. c.compare("hdr", actualHeader, expectedHeader);
  134. c.compare("obj", actualObjects, expectedObjects);
  135. }
  136. {
  137. JsonComparer c(true);
  138. c.compare("surface", actualSurface, expectedSurface);
  139. c.compare("underground", actualUnderground, expectedUnderground);
  140. }
  141. }
  142. TEST(MapFormat, DISABLED_Terrain)
  143. {
  144. static const std::string MAP_DATA_PATH = "test/TerrainTest/";
  145. const JsonNode expectedHeader(JsonPath::builtin(MAP_DATA_PATH + CMapFormatJson::HEADER_FILE_NAME));
  146. const JsonNode expectedObjects(JsonPath::builtin(MAP_DATA_PATH + CMapFormatJson::OBJECTS_FILE_NAME));
  147. const JsonNode expectedSurface(JsonPath::builtin(MAP_DATA_PATH + "surface_terrain.json"));
  148. const JsonNode expectedUnderground(JsonPath::builtin(MAP_DATA_PATH + "underground_terrain.json"));
  149. std::unique_ptr<CMap> originalMap = loadOriginal(expectedHeader, expectedObjects, expectedSurface, expectedUnderground);
  150. CMemoryBuffer serializeBuffer;
  151. JsonNode actualHeader;
  152. JsonNode actualObjects;
  153. JsonNode actualSurface;
  154. JsonNode actualUnderground;
  155. loadActual(&serializeBuffer, originalMap, actualHeader, actualObjects, actualSurface, actualUnderground);
  156. saveTestMap(serializeBuffer, "test_terrain.vmap");
  157. {
  158. JsonComparer c(false);
  159. c.compare("hdr", actualHeader, expectedHeader);
  160. c.compare("obj", actualObjects, expectedObjects);
  161. }
  162. {
  163. JsonComparer c(true);
  164. c.compare("surface", actualSurface, expectedSurface);
  165. c.compare("underground", actualUnderground, expectedUnderground);
  166. }
  167. }