CMapFormatTest.cpp 7.1 KB

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