瀏覽代碼

Add tests to cover all parts of deserializing an object.

Sam Jaffe 6 年之前
父節點
當前提交
3b8d5160ca
共有 4 個文件被更改,包括 96 次插入0 次删除
  1. 2 0
      engine/engine.xcodeproj/project.pbxproj
  2. 1 0
      engine/src/serial.cxx
  3. 23 0
      engine/test/mock_renderer.h
  4. 70 0
      engine/test/serial_test.cxx

+ 2 - 0
engine/engine.xcodeproj/project.pbxproj

@@ -17,6 +17,7 @@
 		CD62FD3C229370E200376440 /* libjsoncpp.1.8.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD62FD3922936E9C00376440 /* libjsoncpp.1.8.4.dylib */; };
 		CD62FD402293746900376440 /* serial.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD62FD3E2293746900376440 /* serial.cxx */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
 		CD7E87792295FAB400D877FE /* libgameutils.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7E87782295FAB400D877FE /* libgameutils.dylib */; };
+		CD8064EF22D21EB500B9B4E4 /* libgraphics.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD62D8452251A94C0023219A /* libgraphics.dylib */; };
 		CDB1F8C81D7A312B00700C6B /* game_dispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDB1F8C61D7A312B00700C6B /* game_dispatch.cpp */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
 		CDB1F8CC1D7A319A00700C6B /* scene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDB1F8CA1D7A319A00700C6B /* scene.cpp */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
 		CDB1F8D21D7A32A300700C6B /* events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDB1F8D01D7A32A300700C6B /* events.cpp */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
@@ -95,6 +96,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				CD8064EF22D21EB500B9B4E4 /* libgraphics.dylib in Frameworks */,
 				CDED9C5222A4130700AE5CE5 /* libjsoncpp.1.8.4.dylib in Frameworks */,
 				CD62FCD622904A9B00376440 /* GoogleMock.framework in Frameworks */,
 				CD62FCCE22904A8900376440 /* libengine.dylib in Frameworks */,

+ 1 - 0
engine/src/serial.cxx

@@ -39,6 +39,7 @@ namespace engine {
 
   identity<graphics::shader_program> to_program(Json::Value const & json,
                                                 graphics::manager const & mgr) {
+    // TODO (sjaffe): This should be an error, not defaulting to OpenGL...
     if (json.empty()) {
       return mgr.get("data/shaders/BlankShader.fragment.glsl",
                      "data/shaders/BlankShader.vertex.glsl");

+ 23 - 0
engine/test/mock_renderer.h

@@ -8,9 +8,32 @@
 
 #pragma once
 
+#include "game/graphics/manager.hpp"
 #include "game/graphics/renderer.hpp"
+#include "game/graphics/shader.hpp"
+#include "game/graphics/shader_program.hpp"
+#include "game/graphics/texture.hpp"
 #include "game/util/identity.hpp"
 
 template <typename T> inline identity<T> cast(unsigned int id) {
   return *reinterpret_cast<identity<T> *>(&id);
 }
+
+struct stub_manager_impl : graphics::manager {
+  using shader = graphics::shader;
+  using shader_program = graphics::shader_program;
+  using texture = graphics::texture;
+
+  shader compile(graphics::shaders::type t,
+                 std::string const & s) const override {
+    return {0, t, s};
+  }
+  shader_program compile(identity<shader> f,
+                         identity<shader> v) const override {
+    return {0, f, v};
+  }
+  texture compile(graphics::textures::format, math::vec2i dims,
+                  void const *) const override {
+    return {0, dims};
+  }
+};

+ 70 - 0
engine/test/serial_test.cxx

@@ -15,6 +15,7 @@
 #include <json/reader.h>
 
 #include "game/engine/serial.hpp"
+#include "game/graphics/object.hpp"
 
 Json::Value to_json(std::string const & str) {
   Json::Value json;
@@ -67,3 +68,72 @@ TEST_F(SerialTest, FallbackReaderActivatesOnNull) {
   std::string const data = "null";
   EXPECT_THAT(engine::to_vec2(to_json(data), {{1, 5}}), Eq(expected));
 }
+
+std::string const object_data = R"(
+{
+  "material": {
+    "shaderProgram": {
+      "fragmentShader": "serial/fragment.test",
+      "vertexShader": "serial/vertex.test"
+    },
+    "texture": {
+      "uniform": "u_normalMap"
+    }
+  },
+  "position": [0, 0],
+  "scale": 1.0
+}
+)";
+
+struct ObjectSerialTest : testing::Test {
+  stub_manager_impl mgr;
+};
+
+TEST_F(ObjectSerialTest, CanConstructFromJson) {
+  EXPECT_NO_THROW(engine::to_object(to_json(object_data), mgr));
+}
+
+TEST_F(ObjectSerialTest, DoesNotRequireShaderProgramDefinition) {
+  Json::Value json = to_json(object_data);
+  json["material"].removeMember("shaderProgram");
+  EXPECT_NO_THROW(engine::to_object(json, mgr));
+}
+
+TEST_F(ObjectSerialTest, UsesPositionFromJsonForLocation) {
+  Json::Value json = to_json(object_data);
+  {
+    graphics::object const obj = engine::to_object(json, mgr);
+    EXPECT_THAT(obj.location.origin, Eq(make_vector(0.0f, 0.0f)));
+  }
+  {
+    json["position"][0] = 5.f;
+    graphics::object const obj = engine::to_object(json, mgr);
+    EXPECT_THAT(obj.location.origin, Eq(make_vector(5.0f, 0.0f)));
+  }
+}
+
+TEST_F(ObjectSerialTest, SizeIsTextureSizeTimesScale) {
+  Json::Value json = to_json(object_data);
+  {
+    graphics::object const obj = engine::to_object(json, mgr);
+    EXPECT_THAT(obj.location.size, Eq(make_vector(1.0f, 1.0f)));
+  }
+  {
+    json["scale"] = 0.5f;
+    graphics::object const obj = engine::to_object(json, mgr);
+    EXPECT_THAT(obj.location.size, Eq(make_vector(0.5f, 0.5f)));
+  }
+}
+
+TEST_F(ObjectSerialTest, DefaultFrameIsEntireTex) {
+  graphics::object const obj = engine::to_object(to_json(object_data), mgr);
+  EXPECT_THAT(obj.frame.size, Eq(make_vector(1.f, 1.f)));
+}
+
+TEST_F(ObjectSerialTest, OverridesFrameSize) {
+  Json::Value json = to_json(object_data);
+  json["frameSize"][0] = 0.125f;
+  json["frameSize"][1] = 0.125f;
+  graphics::object const obj = engine::to_object(json, mgr);
+  EXPECT_THAT(obj.frame.size, Eq(make_vector(0.125f, 0.125f)));
+}