universe_test.cxx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //
  2. // universe_test.cxx
  3. // pokemon_test_xc
  4. //
  5. // Created by Sam Jaffe on 1/12/19.
  6. // Copyright © 2019 Sam Jaffe. All rights reserved.
  7. //
  8. #include <engine/universe.h>
  9. #include <map>
  10. #include <engine/universe.tpp>
  11. #include <serializer/jsonizer.tpp>
  12. #include <serializer/shared_cache.h>
  13. #include "stub_config.h"
  14. #include "xcode_gtest_helper.h"
  15. using testing::Eq;
  16. using testing::NotNull;
  17. using testing::TestWithParam;
  18. using testing::Values;
  19. struct Object {
  20. std::string name;
  21. std::map<std::string, int> data;
  22. };
  23. template <>
  24. void serializer::Jsonizer::from_json(Object & value,
  25. Json::Value const & json) const {
  26. from_json(value.name, json["name"]);
  27. from_json(value.data, json["data"]);
  28. }
  29. struct SharedCache : serializer::SharedCache {
  30. struct Impl : serializer::SharedCache::Impl {
  31. std::map<SharedCache::Key, SharedCache::Record<Object>> objects_;
  32. };
  33. SharedCache() : serializer::SharedCache(std::make_unique<Impl>()) {}
  34. };
  35. #define IMPL() dynamic_cast<::SharedCache::Impl &>(*p_impl)
  36. template <>
  37. SharedCache::Record<Object>
  38. serializer::SharedCache::store<Object>(Key const & key, Object const & value) {
  39. auto & ptr = IMPL().objects_[key];
  40. if (!ptr) { ptr = std::make_shared<Object>(value); }
  41. return ptr;
  42. }
  43. template <>
  44. SharedCache::Record<Object>
  45. serializer::SharedCache::fetch<Object>(Key const & key) const {
  46. return IMPL().objects_[key];
  47. }
  48. struct Universe : engine::Universe {
  49. Universe(std::filesystem::path const & cfg)
  50. : engine::Universe(nullptr, Config::from_dir(cfg),
  51. std::make_shared<SharedCache>(), nullptr) {
  52. load<Object>("object");
  53. }
  54. auto read(std::string const & name) const {
  55. return jsonizer().from_json<SharedCache::Record<Object>>(name);
  56. }
  57. };
  58. TEST(UniverseTest, CanLoadFromFile) {
  59. Universe const univ("universe_test/1");
  60. auto const ptr = univ.read("A");
  61. EXPECT_THAT(ptr, NotNull());
  62. }
  63. class PreloadTest : public TestWithParam<std::string> {};
  64. TEST_P(PreloadTest, CanLoadFromDirectory) {
  65. Universe const univ("universe_test/2");
  66. auto const ptr = univ.read(GetParam());
  67. EXPECT_THAT(ptr, NotNull());
  68. EXPECT_THAT(ptr->name, GetParam());
  69. }
  70. TEST_P(PreloadTest, CanLoadFromArrayFile) {
  71. Universe const univ("universe_test/3");
  72. auto const ptr = univ.read(GetParam());
  73. EXPECT_THAT(ptr, NotNull());
  74. EXPECT_THAT(ptr->name, GetParam());
  75. }
  76. INSTANTIATE_TEST_SUITE_P(Universe, PreloadTest, Values("A", "B"));