refactor parse + unit test
This commit is contained in:
129
tests/unit/parse_test.cpp
Normal file
129
tests/unit/parse_test.cpp
Normal file
@@ -0,0 +1,129 @@
|
||||
#include <variant>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "parse.hpp"
|
||||
#include "scan.hpp"
|
||||
|
||||
namespace {
|
||||
TEST(ParseFaceData, BuildsTrianglesAndIndexSets) {
|
||||
wavefront::scan_result scan_result;
|
||||
scan_result.total_lines = 26;
|
||||
scan_result.line_data = {
|
||||
{17u, "f 1/1/1 2/2/2 3/3/2"},
|
||||
{19u, "f 4/3/2 5/2/1 6/1/2"},
|
||||
{21u, "f 7/2/2 8/3/2 9/1/1"},
|
||||
{23u, "f 8/1/1 5/2/2 3/3/2"},
|
||||
{25u, "f 2/1/1 6/2/2 4/3/2"}
|
||||
};
|
||||
scan_result.category_map = {
|
||||
{"f", {17u, 19u, 21u, 23u, 25u}}
|
||||
};
|
||||
|
||||
const auto face_data = wavefront::parse_face_data(scan_result);
|
||||
|
||||
EXPECT_EQ(face_data.triangle_list.size(), 5u);
|
||||
|
||||
EXPECT_EQ(face_data.index_position_set.size(), 9u);
|
||||
EXPECT_TRUE(face_data.index_position_set.contains(1));
|
||||
EXPECT_TRUE(face_data.index_position_set.contains(9));
|
||||
|
||||
EXPECT_EQ(face_data.index_normal_set.size(), 2u);
|
||||
EXPECT_TRUE(face_data.index_normal_set.contains(1));
|
||||
EXPECT_TRUE(face_data.index_normal_set.contains(2));
|
||||
|
||||
EXPECT_EQ(face_data.index_texcoord_set.size(), 3u);
|
||||
EXPECT_TRUE(face_data.index_texcoord_set.contains(1));
|
||||
EXPECT_TRUE(face_data.index_texcoord_set.contains(3));
|
||||
|
||||
const auto &first_triangle = face_data.triangle_list.at(0);
|
||||
EXPECT_EQ(first_triangle[0].face_line_number, 17u);
|
||||
EXPECT_EQ(first_triangle[0].position_index, 1);
|
||||
EXPECT_EQ(first_triangle[0].texcoord_index, 1);
|
||||
EXPECT_EQ(first_triangle[0].normal_index, 1);
|
||||
}
|
||||
|
||||
TEST(ParseCoordinateData, MapsCoordinatesWithoutParsingFaces) {
|
||||
wavefront::scan_result scan_result;
|
||||
scan_result.total_lines = 26;
|
||||
scan_result.line_data = {
|
||||
{3u, "v 0.1 0.2 0.3"},
|
||||
{4u, "v 0.2 0.3 0.4"},
|
||||
{5u, "v 0.3 0.4 0.5"},
|
||||
{6u, "v 1.1 1.2 1.3"},
|
||||
{7u, "v 1.2 1.3 1.4"},
|
||||
{8u, "v 1.3 1.4 1.5"},
|
||||
{9u, "v 2.1 2.2 2.3"},
|
||||
{10u, "v 2.2 2.3 2.4"},
|
||||
{11u, "v 2.3 2.4 2.5"},
|
||||
{12u, "vn 0.15 0.25 0.35"},
|
||||
{13u, "vn 0.25 0.35 0.45"},
|
||||
{14u, "vn 0.35 0.45 0.55"},
|
||||
{15u, "vt 0.9 0.8"},
|
||||
{16u, "vt 0.8 0.7"},
|
||||
{17u, "f 1/1/1 2/2/2 3/3/2"},
|
||||
{19u, "f 4/3/2 5/2/1 6/1/2"},
|
||||
{21u, "f 7/2/2 8/3/2 9/1/1"},
|
||||
{23u, "f 8/1/1 5/2/2 3/3/2"},
|
||||
{25u, "f 2/1/1 6/2/2 4/3/2"}
|
||||
};
|
||||
scan_result.category_map = {
|
||||
{"v", {0u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u}},
|
||||
{"vn", {0u, 12u, 13u, 14u}},
|
||||
{"vt", {0u, 15u, 16u}},
|
||||
{"f", {17u, 19u, 21u, 23u, 25u}}
|
||||
};
|
||||
|
||||
wavefront::wavefront_face_data_result_t face_data;
|
||||
face_data.index_position_set = {1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||
face_data.index_normal_set = {1, 2, 3};
|
||||
face_data.index_texcoord_set = {1, 2};
|
||||
face_data.triangle_list = {
|
||||
{{{17u, 1, 1, 1}, {17u, 2, 2, 2}, {17u, 3, 3, 2}}},
|
||||
{{{19u, 4, 3, 2}, {19u, 5, 2, 1}, {19u, 6, 1, 2}}},
|
||||
{{{21u, 7, 2, 2}, {21u, 8, 3, 2}, {21u, 9, 1, 1}}},
|
||||
{{{23u, 8, 1, 1}, {23u, 5, 2, 2}, {23u, 3, 3, 2}}},
|
||||
{{{25u, 2, 1, 1}, {25u, 6, 2, 2}, {25u, 4, 3, 2}}}
|
||||
};
|
||||
|
||||
const auto coordinate_data = wavefront::parse_coordinate_data<float>(scan_result, face_data);
|
||||
|
||||
ASSERT_EQ(coordinate_data.position_coordinates.size(), 9u);
|
||||
const auto &pos_line_2 = coordinate_data.position_coordinates.at(3u);
|
||||
EXPECT_FLOAT_EQ(pos_line_2[0], 0.1f);
|
||||
EXPECT_FLOAT_EQ(pos_line_2[1], 0.2f);
|
||||
EXPECT_FLOAT_EQ(pos_line_2[2], 0.3f);
|
||||
|
||||
const auto &pos_line_5 = coordinate_data.position_coordinates.at(6u);
|
||||
EXPECT_FLOAT_EQ(pos_line_5[0], 1.1f);
|
||||
EXPECT_FLOAT_EQ(pos_line_5[1], 1.2f);
|
||||
EXPECT_FLOAT_EQ(pos_line_5[2], 1.3f);
|
||||
|
||||
const auto &pos_line_10 = coordinate_data.position_coordinates.at(11u);
|
||||
EXPECT_FLOAT_EQ(pos_line_10[0], 2.3f);
|
||||
EXPECT_FLOAT_EQ(pos_line_10[1], 2.4f);
|
||||
EXPECT_FLOAT_EQ(pos_line_10[2], 2.5f);
|
||||
|
||||
ASSERT_EQ(coordinate_data.normal_coordinates.size(), 3u);
|
||||
const auto &normal_line_11 = coordinate_data.normal_coordinates.at(12u);
|
||||
EXPECT_FLOAT_EQ(normal_line_11[0], 0.15f);
|
||||
EXPECT_FLOAT_EQ(normal_line_11[1], 0.25f);
|
||||
EXPECT_FLOAT_EQ(normal_line_11[2], 0.35f);
|
||||
|
||||
const auto &normal_line_13 = coordinate_data.normal_coordinates.at(14u);
|
||||
EXPECT_FLOAT_EQ(normal_line_13[0], 0.35f);
|
||||
EXPECT_FLOAT_EQ(normal_line_13[1], 0.45f);
|
||||
EXPECT_FLOAT_EQ(normal_line_13[2], 0.55f);
|
||||
|
||||
ASSERT_EQ(coordinate_data.texture_coordinates.index(), 2u);
|
||||
const auto &texcoords = std::get<2>(coordinate_data.texture_coordinates);
|
||||
ASSERT_EQ(texcoords.size(), 2u);
|
||||
const auto &tex_line_14 = texcoords.at(15u);
|
||||
EXPECT_FLOAT_EQ(tex_line_14[0], 0.9f);
|
||||
EXPECT_FLOAT_EQ(tex_line_14[1], 0.8f);
|
||||
|
||||
const auto &tex_line_15 = texcoords.at(16u);
|
||||
EXPECT_FLOAT_EQ(tex_line_15[0], 0.8f);
|
||||
EXPECT_FLOAT_EQ(tex_line_15[1], 0.7f);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user