فهرست منبع

Add tests for loading a texture file from a material instead of depending on the uniform.
Also show exception handling fallback.

Fails in test because of OSX bullshit with resource files.

Sam Jaffe 6 سال پیش
والد
کامیت
5af90c7170
4فایلهای تغییر یافته به همراه39 افزوده شده و 0 حذف شده
  1. 6 0
      graphics/graphics.xcodeproj/project.pbxproj
  2. 3 0
      graphics/src/texture.cpp
  3. 30 0
      graphics/test/manager_test.cxx
  4. BIN
      graphics/test/resources/black.bmp

+ 6 - 0
graphics/graphics.xcodeproj/project.pbxproj

@@ -29,6 +29,8 @@
 		CDED9C4722A308AE00AE5CE5 /* libmath.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CDA34D9922517A3D008036A7 /* libmath.dylib */; };
 		CDED9C5422A465DB00AE5CE5 /* opengl_renderer.h in Headers */ = {isa = PBXBuildFile; fileRef = CDED9C5322A465DB00AE5CE5 /* opengl_renderer.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CDED9C6322A961CE00AE5CE5 /* manager_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDED9C5E22A961CA00AE5CE5 /* manager_test.cxx */; };
+		CDED9C6822A9AD2300AE5CE5 /* resources in Resources */ = {isa = PBXBuildFile; fileRef = CDED9C6422A9AC7B00AE5CE5 /* resources */; };
+		CDED9C6922A9B26400AE5CE5 /* libgameutils.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD62FD052291970F00376440 /* libgameutils.dylib */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -102,6 +104,7 @@
 		CDED9C4222A2FACB00AE5CE5 /* renderer_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = renderer_test.cxx; sourceTree = "<group>"; };
 		CDED9C5322A465DB00AE5CE5 /* opengl_renderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opengl_renderer.h; sourceTree = "<group>"; };
 		CDED9C5E22A961CA00AE5CE5 /* manager_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = manager_test.cxx; sourceTree = "<group>"; };
+		CDED9C6422A9AC7B00AE5CE5 /* resources */ = {isa = PBXFileReference; lastKnownFileType = folder; path = resources; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -119,6 +122,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				CDED9C6922A9B26400AE5CE5 /* libgameutils.dylib in Frameworks */,
 				CDED9C4722A308AE00AE5CE5 /* libmath.dylib in Frameworks */,
 				CDED9C4622A2FCA100AE5CE5 /* GoogleMock.framework in Frameworks */,
 				CDED9C1922A2D6CE00AE5CE5 /* libgraphics.dylib in Frameworks */,
@@ -228,6 +232,7 @@
 		CDED9C3D22A2F52500AE5CE5 /* test */ = {
 			isa = PBXGroup;
 			children = (
+				CDED9C6422A9AC7B00AE5CE5 /* resources */,
 				CDED9C4222A2FACB00AE5CE5 /* renderer_test.cxx */,
 				CDED9C5E22A961CA00AE5CE5 /* manager_test.cxx */,
 			);
@@ -365,6 +370,7 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				CDED9C6822A9AD2300AE5CE5 /* resources in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 3 - 0
graphics/src/texture.cpp

@@ -42,6 +42,9 @@ external_data::external_data(std::string const & rel_path) {
   std::string abs_path = env::resource_file(rel_path);
   int components = 0;
   buffer = stbi_load(abs_path.c_str(), &size.x(), &size.y(), &components, 0);
+  if (!buffer) {
+    throw std::runtime_error("Unable to read file: '" + rel_path + "'");
+  }
   color = as_format(components);
 }
 

+ 30 - 0
graphics/test/manager_test.cxx

@@ -159,6 +159,36 @@ TEST_F(MaterialTest, DifferentProgramDoesntChangeUniformId) {
   EXPECT_THAT(mat_1.uniforms[0].texture, Eq(mat_2.uniforms[0].texture));
 }
 
+TEST_F(MaterialTest, TexFileSkipsUniformLoad) {
+  using graphics::materials::uniform;
+  EXPECT_CALL(mock, compile(_, make_vector(1, 1), _)).Times(1);
+  auto material =
+      mock.get(mock.get(cast_p(1), "resources/black.bmp", "u_normalMap"));
+  EXPECT_THAT(material.uniforms, SizeIs(1));
+  // Because we never initialize any textures, we are within the first three
+  // texture ID units.
+  EXPECT_THAT(material.uniforms[0].texture.id, Eq(1));
+  // Test the mapping from "u_normalMap" to uniform::NORMAL
+  EXPECT_THAT(material.uniforms[0].uniform_id, Eq(uniform::NORMAL));
+}
+
+TEST_F(MaterialTest, MissingFileNoExcept) {
+  EXPECT_NO_THROW(
+      mock.get(mock.get(cast_p(1), "resources/missing.png", "u_normalMap")));
+}
+
+TEST_F(MaterialTest, MissingFileFallsBackOnUniform) {
+  using graphics::materials::uniform;
+  auto material =
+      mock.get(mock.get(cast_p(1), "resources/missing.png", "u_normalMap"));
+  EXPECT_THAT(material.uniforms, SizeIs(1));
+  // Because we never initialize any textures, we are within the first three
+  // texture ID units.
+  EXPECT_THAT(material.uniforms[0].texture.id, AllOf(Ge(1), Le(3)));
+  // Test the mapping from "u_normalMap" to uniform::NORMAL
+  EXPECT_THAT(material.uniforms[0].uniform_id, Eq(uniform::NORMAL));
+}
+
 using ShaderTest = ManagerTest;
 TEST_F(ShaderTest, CanCreateShaders) {
   using graphics::shaders::type;

BIN
graphics/test/resources/black.bmp