From: =?utf-8?q?Timo_R=C3=B6hling?= <timo.roehling@fkie.fraunhofer.de>
Date: Fri, 13 Mar 2020 22:02:46 +0100
Subject: Integrate unit tests with CMake

---
 CMakeLists.txt       |   3 ++
 tests/CMakeLists.txt |   8 ++++
 tests/tester.cc      | 109 +++++++++++++++++++++++++--------------------------
 3 files changed, 65 insertions(+), 55 deletions(-)
 create mode 100644 tests/CMakeLists.txt

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c0ae54c..c36d2ad 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -230,3 +230,6 @@ if(NOT TARGET uninstall)
     uninstall COMMAND ${CMAKE_COMMAND} -P
                       ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
 endif()
+
+include(CTest)
+add_subdirectory(tests)
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..9ea467c
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,8 @@
+if(BUILD_TESTING)
+  add_executable(tester tester.cc)
+  target_link_libraries(tester PRIVATE tinyobjloader::tinyobjloader)
+  add_executable(tester_d tester.cc)
+  target_link_libraries(tester_d PRIVATE tinyobjloader::tinyobjloader_double)
+  add_test(NAME test_with_float COMMAND tester WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  add_test(NAME test_with_double COMMAND tester_d WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
diff --git a/tests/tester.cc b/tests/tester.cc
index 2f336c7..ea826aa 100644
--- a/tests/tester.cc
+++ b/tests/tester.cc
@@ -1,5 +1,4 @@
-#define TINYOBJLOADER_IMPLEMENTATION
-#include "../tiny_obj_loader.h"
+#include <tiny_obj_loader.h>
 
 #if defined(__clang__)
 #pragma clang diagnostic push
@@ -29,13 +28,13 @@
 #include <fstream>
 #include <iostream>
 #include <sstream>
+#include <limits>
 
-template <typename T>
-static bool FloatEquals(const T& a, const T& b) {
+static bool FloatEquals(const tinyobj::real_t& a, const tinyobj::real_t& b) {
   // Edit eps value as you wish.
-  const T eps = std::numeric_limits<T>::epsilon() * static_cast<T>(100);
+  const tinyobj::real_t eps = std::numeric_limits<tinyobj::real_t>::epsilon() * static_cast<tinyobj::real_t>(100);
 
-  const T abs_diff = std::abs(a - b);
+  const tinyobj::real_t abs_diff = std::abs(a - b);
 
   if (abs_diff < eps) {
     return true;
@@ -448,13 +447,13 @@ void test_pbr() {
   }
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(0.2f, materials[0].roughness));
-  TEST_CHECK(FloatEquals(0.3f, materials[0].metallic));
-  TEST_CHECK(FloatEquals(0.4f, materials[0].sheen));
-  TEST_CHECK(FloatEquals(0.5f, materials[0].clearcoat_thickness));
-  TEST_CHECK(FloatEquals(0.6f, materials[0].clearcoat_roughness));
-  TEST_CHECK(FloatEquals(0.7f, materials[0].anisotropy));
-  TEST_CHECK(FloatEquals(0.8f, materials[0].anisotropy_rotation));
+  TEST_CHECK(FloatEquals(0.2, materials[0].roughness));
+  TEST_CHECK(FloatEquals(0.3, materials[0].metallic));
+  TEST_CHECK(FloatEquals(0.4, materials[0].sheen));
+  TEST_CHECK(FloatEquals(0.5, materials[0].clearcoat_thickness));
+  TEST_CHECK(FloatEquals(0.6, materials[0].clearcoat_roughness));
+  TEST_CHECK(FloatEquals(0.7, materials[0].anisotropy));
+  TEST_CHECK(FloatEquals(0.8, materials[0].anisotropy_rotation));
   TEST_CHECK(0 == materials[0].roughness_texname.compare("roughness.tex"));
   TEST_CHECK(0 == materials[0].metallic_texname.compare("metallic.tex"));
   TEST_CHECK(0 == materials[0].sheen_texname.compare("sheen.tex"));
@@ -517,9 +516,9 @@ void test_transmittance_filter_issue95() {
   }
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(0.1f, materials[0].transmittance[0]));
-  TEST_CHECK(FloatEquals(0.2f, materials[0].transmittance[1]));
-  TEST_CHECK(FloatEquals(0.3f, materials[0].transmittance[2]));
+  TEST_CHECK(FloatEquals(0.1, materials[0].transmittance[0]));
+  TEST_CHECK(FloatEquals(0.2, materials[0].transmittance[1]));
+  TEST_CHECK(FloatEquals(0.3, materials[0].transmittance[2]));
 }
 
 void test_transmittance_filter_Tf_issue95() {
@@ -541,9 +540,9 @@ void test_transmittance_filter_Tf_issue95() {
   }
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(0.1f, materials[0].transmittance[0]));
-  TEST_CHECK(FloatEquals(0.2f, materials[0].transmittance[1]));
-  TEST_CHECK(FloatEquals(0.3f, materials[0].transmittance[2]));
+  TEST_CHECK(FloatEquals(0.1, materials[0].transmittance[0]));
+  TEST_CHECK(FloatEquals(0.2, materials[0].transmittance[1]));
+  TEST_CHECK(FloatEquals(0.3, materials[0].transmittance[2]));
 }
 
 void test_transmittance_filter_Kt_issue95() {
@@ -565,9 +564,9 @@ void test_transmittance_filter_Kt_issue95() {
   }
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(0.1f, materials[0].transmittance[0]));
-  TEST_CHECK(FloatEquals(0.2f, materials[0].transmittance[1]));
-  TEST_CHECK(FloatEquals(0.3f, materials[0].transmittance[2]));
+  TEST_CHECK(FloatEquals(0.1, materials[0].transmittance[0]));
+  TEST_CHECK(FloatEquals(0.2, materials[0].transmittance[1]));
+  TEST_CHECK(FloatEquals(0.3, materials[0].transmittance[2]));
 }
 
 void test_usemtl_at_last_line_issue104() {
@@ -616,24 +615,24 @@ void test_texture_opts_issue85() {
   TEST_CHECK(0 == materials[1].name.compare("bm2"));
   TEST_CHECK(0 == materials[2].name.compare("bm3"));
   TEST_CHECK(true == materials[0].ambient_texopt.clamp);
-  TEST_CHECK(FloatEquals(0.1f, materials[0].diffuse_texopt.origin_offset[0]));
-  TEST_CHECK(FloatEquals(0.0f, materials[0].diffuse_texopt.origin_offset[1]));
-  TEST_CHECK(FloatEquals(0.0f, materials[0].diffuse_texopt.origin_offset[2]));
-  TEST_CHECK(FloatEquals(0.1f, materials[0].specular_texopt.scale[0]));
-  TEST_CHECK(FloatEquals(0.2f, materials[0].specular_texopt.scale[1]));
-  TEST_CHECK(FloatEquals(1.0f, materials[0].specular_texopt.scale[2]));
+  TEST_CHECK(FloatEquals(0.1, materials[0].diffuse_texopt.origin_offset[0]));
+  TEST_CHECK(FloatEquals(0.0, materials[0].diffuse_texopt.origin_offset[1]));
+  TEST_CHECK(FloatEquals(0.0, materials[0].diffuse_texopt.origin_offset[2]));
+  TEST_CHECK(FloatEquals(0.1, materials[0].specular_texopt.scale[0]));
+  TEST_CHECK(FloatEquals(0.2, materials[0].specular_texopt.scale[1]));
+  TEST_CHECK(FloatEquals(1.0, materials[0].specular_texopt.scale[2]));
   TEST_CHECK(
-      FloatEquals(0.1f, materials[0].specular_highlight_texopt.turbulence[0]));
+      FloatEquals(0.1, materials[0].specular_highlight_texopt.turbulence[0]));
   TEST_CHECK(
-      FloatEquals(0.2f, materials[0].specular_highlight_texopt.turbulence[1]));
+      FloatEquals(0.2, materials[0].specular_highlight_texopt.turbulence[1]));
   TEST_CHECK(
-      FloatEquals(0.3f, materials[0].specular_highlight_texopt.turbulence[2]));
-  TEST_CHECK(FloatEquals(3.0f, materials[0].bump_texopt.bump_multiplier));
+      FloatEquals(0.3, materials[0].specular_highlight_texopt.turbulence[2]));
+  TEST_CHECK(FloatEquals(3.0, materials[0].bump_texopt.bump_multiplier));
 
   TEST_CHECK(
-      FloatEquals(0.1f, materials[1].specular_highlight_texopt.brightness));
+      FloatEquals(0.1, materials[1].specular_highlight_texopt.brightness));
   TEST_CHECK(
-      FloatEquals(0.3f, materials[1].specular_highlight_texopt.contrast));
+      FloatEquals(0.3, materials[1].specular_highlight_texopt.contrast));
   TEST_CHECK('r' == materials[1].bump_texopt.imfchan);
 
   TEST_CHECK(tinyobj::TEXTURE_TYPE_SPHERE == materials[2].diffuse_texopt.type);
@@ -692,8 +691,8 @@ void test_tr_and_d_issue43() {
   TEST_CHECK(true == ret);
   TEST_CHECK(2 == materials.size());
 
-  TEST_CHECK(FloatEquals(0.75f, materials[0].dissolve));
-  TEST_CHECK(FloatEquals(0.75f, materials[1].dissolve));
+  TEST_CHECK(FloatEquals(0.75, materials[0].dissolve));
+  TEST_CHECK(FloatEquals(0.75, materials[1].dissolve));
 }
 
 void test_refl() {
@@ -797,19 +796,19 @@ void test_vertex_col_ext_issue144() {
   TEST_CHECK(true == ret);
   TEST_CHECK((8 * 3) == attrib.colors.size());
 
-  TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 0 + 0]));
-  TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 0 + 1]));
-  TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 0 + 2]));
+  TEST_CHECK(FloatEquals(0.0, attrib.colors[3 * 0 + 0]));
+  TEST_CHECK(FloatEquals(0.0, attrib.colors[3 * 0 + 1]));
+  TEST_CHECK(FloatEquals(0.0, attrib.colors[3 * 0 + 2]));
 
-  TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 1 + 0]));
-  TEST_CHECK(FloatEquals(0.0f, attrib.colors[3 * 1 + 1]));
-  TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 1 + 2]));
+  TEST_CHECK(FloatEquals(0.0, attrib.colors[3 * 1 + 0]));
+  TEST_CHECK(FloatEquals(0.0, attrib.colors[3 * 1 + 1]));
+  TEST_CHECK(FloatEquals(1.0, attrib.colors[3 * 1 + 2]));
 
-  TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 4 + 0]));
+  TEST_CHECK(FloatEquals(1.0, attrib.colors[3 * 4 + 0]));
 
-  TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 7 + 0]));
-  TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 7 + 1]));
-  TEST_CHECK(FloatEquals(1.0f, attrib.colors[3 * 7 + 2]));
+  TEST_CHECK(FloatEquals(1.0, attrib.colors[3 * 7 + 0]));
+  TEST_CHECK(FloatEquals(1.0, attrib.colors[3 * 7 + 1]));
+  TEST_CHECK(FloatEquals(1.0, attrib.colors[3 * 7 + 2]));
 }
 
 void test_norm_texopts() {
@@ -833,7 +832,7 @@ void test_norm_texopts() {
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == shapes.size());
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(3.0f, materials[0].normal_texopt.bump_multiplier));
+  TEST_CHECK(FloatEquals(3.0, materials[0].normal_texopt.bump_multiplier));
 }
 
 void test_zero_face_idx_value_issue140() {
@@ -927,7 +926,7 @@ void test_texture_name_whitespace_issue145() {
 
   TEST_CHECK(0 == materials[0].diffuse_texname.compare("texture 01.png"));
   TEST_CHECK(0 == materials[1].bump_texname.compare("bump 01.png"));
-  TEST_CHECK(FloatEquals(2.0f, materials[1].bump_texopt.bump_multiplier));
+  TEST_CHECK(FloatEquals(2.0, materials[1].bump_texopt.bump_multiplier));
 }
 
 void test_smoothing_group_issue162() {
@@ -1187,11 +1186,11 @@ void test_leading_decimal_dots_issue201() {
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == shapes.size());
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(0.8e-1f, attrib.vertices[0]));
-  TEST_CHECK(FloatEquals(-.7e+2f, attrib.vertices[1]));
-  TEST_CHECK(FloatEquals(.575869f, attrib.vertices[3]));
-  TEST_CHECK(FloatEquals(-.666304f, attrib.vertices[4]));
-  TEST_CHECK(FloatEquals(.940448f, attrib.vertices[6]));
+  TEST_CHECK(FloatEquals(0.8e-1, attrib.vertices[0]));
+  TEST_CHECK(FloatEquals(-.7e+2, attrib.vertices[1]));
+  TEST_CHECK(FloatEquals(.575869, attrib.vertices[3]));
+  TEST_CHECK(FloatEquals(-.666304, attrib.vertices[4]));
+  TEST_CHECK(FloatEquals(.940448, attrib.vertices[6]));
 }
 
 void test_mtl_default_search_path_v2_API_issue208() {
@@ -1228,8 +1227,8 @@ void test_leading_zero_in_exponent_notation_issue210() {
   TEST_CHECK(true == ret);
   TEST_CHECK(1 == shapes.size());
   TEST_CHECK(1 == materials.size());
-  TEST_CHECK(FloatEquals(0.8e-001f, attrib.vertices[0]));
-  TEST_CHECK(FloatEquals(-.7e+02f, attrib.vertices[1]));
+  TEST_CHECK(FloatEquals(0.8e-001, attrib.vertices[0]));
+  TEST_CHECK(FloatEquals(-.7e+02, attrib.vertices[1]));
 
   std::cout << "exp " << 0.8e-01 << std::endl;
   std::cout << "bora " << attrib.vertices[0] << std::endl;
