serial_test.cxx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //
  2. // serial_test.cxx
  3. // engine-test
  4. //
  5. // Created by Sam Jaffe on 6/2/19.
  6. // Copyright © 2019 Sam Jaffe. All rights reserved.
  7. //
  8. #include "game/engine/serial.hpp"
  9. #include <sstream>
  10. #include <json/json.h>
  11. #include <json/reader.h>
  12. #include <game/graphics/object.hpp>
  13. #include <testing/xcode_gtest_helper.h>
  14. #include "mock_renderer.h"
  15. Json::Value to_json(std::string const & str) {
  16. Json::Value json;
  17. std::stringstream(str) >> json;
  18. return json;
  19. }
  20. struct SerialTest : testing::Test {};
  21. using testing::Eq;
  22. TEST_F(SerialTest, ReadsIntegerVector) {
  23. math::vec2i const expected{{1, 5}};
  24. std::string const data = "[1,5]";
  25. EXPECT_THAT(engine::to_vec2i(to_json(data)), Eq(expected));
  26. }
  27. TEST_F(SerialTest, ReadsIntegerVectorFromFloats) {
  28. math::vec2i const expected{{1, 5}};
  29. std::string const data = "[1.5,5.01]";
  30. EXPECT_THAT(engine::to_vec2i(to_json(data)), Eq(expected));
  31. }
  32. TEST_F(SerialTest, ReadsFloatVector) {
  33. math::vec2 const expected{{1.5, 5.01}};
  34. std::string const data = "[1.5,5.01]";
  35. EXPECT_THAT(engine::to_vec2(to_json(data)), Eq(expected));
  36. }
  37. TEST_F(SerialTest, ReadsFloatVectorFromInts) {
  38. math::vec2 const expected{{1, 5}};
  39. std::string const data = "[1,5]";
  40. EXPECT_THAT(engine::to_vec2(to_json(data)), Eq(expected));
  41. }
  42. TEST_F(SerialTest, MissingFloatDataIsZero) {
  43. math::vec2 const expected{{1, 0}};
  44. std::string const data = "[1]";
  45. EXPECT_THAT(engine::to_vec2(to_json(data)), Eq(expected));
  46. }
  47. TEST_F(SerialTest, FallbackReaderDoesntInvokeIfArray) {
  48. math::vec2 const expected{{0, 0}};
  49. std::string const data = "[]";
  50. EXPECT_THAT(engine::to_vec2(to_json(data), {{1, 5}}), Eq(expected));
  51. }
  52. TEST_F(SerialTest, FallbackReaderActivatesOnNull) {
  53. math::vec2 const expected{{1, 5}};
  54. std::string const data = "null";
  55. EXPECT_THAT(engine::to_vec2(to_json(data), {{1, 5}}), Eq(expected));
  56. }
  57. std::string const object_data = R"(
  58. {
  59. "material": {
  60. "shaderProgram": {
  61. "fragmentShader": "serial/fragment.test",
  62. "vertexShader": "serial/vertex.test"
  63. },
  64. "texture": {
  65. "uniform": "u_normalMap"
  66. }
  67. },
  68. "position": [0, 0],
  69. "scale": 1.0
  70. }
  71. )";
  72. struct ObjectSerialTest : testing::Test {
  73. stub_manager_impl mgr;
  74. };
  75. TEST_F(ObjectSerialTest, CanConstructFromJson) {
  76. EXPECT_NO_THROW(engine::to_object(to_json(object_data), mgr));
  77. }
  78. TEST_F(ObjectSerialTest, DoesNotRequireShaderProgramDefinition) {
  79. Json::Value json = to_json(object_data);
  80. json["material"].removeMember("shaderProgram");
  81. EXPECT_NO_THROW(engine::to_object(json, mgr));
  82. }
  83. TEST_F(ObjectSerialTest, UsesPositionFromJsonForLocation) {
  84. Json::Value json = to_json(object_data);
  85. {
  86. graphics::object const obj = engine::to_object(json, mgr);
  87. EXPECT_THAT(obj.location.origin, Eq(math::vec2(0.0f, 0.0f)));
  88. }
  89. {
  90. json["position"][0] = 5.f;
  91. graphics::object const obj = engine::to_object(json, mgr);
  92. EXPECT_THAT(obj.location.origin, Eq(math::vec2(5.0f, 0.0f)));
  93. }
  94. }
  95. TEST_F(ObjectSerialTest, SizeIsTextureSizeTimesScale) {
  96. Json::Value json = to_json(object_data);
  97. {
  98. graphics::object const obj = engine::to_object(json, mgr);
  99. EXPECT_THAT(obj.location.size, Eq(math::vec2(1.0f, 1.0f)));
  100. }
  101. {
  102. json["scale"] = 0.5f;
  103. graphics::object const obj = engine::to_object(json, mgr);
  104. EXPECT_THAT(obj.location.size, Eq(math::vec2(0.5f, 0.5f)));
  105. }
  106. }
  107. TEST_F(ObjectSerialTest, DefaultFrameIsEntireTex) {
  108. graphics::object const obj = engine::to_object(to_json(object_data), mgr);
  109. EXPECT_THAT(obj.frame.size, Eq(math::vec2(1.f, 1.f)));
  110. }
  111. TEST_F(ObjectSerialTest, OverridesFrameSize) {
  112. Json::Value json = to_json(object_data);
  113. json["frameSize"][0] = 0.125f;
  114. json["frameSize"][1] = 0.125f;
  115. graphics::object const obj = engine::to_object(json, mgr);
  116. EXPECT_THAT(obj.frame.size, Eq(math::vec2(0.125f, 0.125f)));
  117. }