CMapFormatTest.cpp 6.7 KB

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