From ffea4bb58b0c9478c25fe9403d1070c1cf039ad3 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 10 Sep 2015 18:03:12 +0200 Subject: [PATCH] tests: add tests for writing in STL binary format --- tests/CMakeLists.txt | 2 + .../solid_grabcad_arm11_link0_hb.le_stlb | Bin 0 -> 71884 bytes tests/test_stl_io.c | 178 +++++++++++++++++- 3 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 tests/models/solid_grabcad_arm11_link0_hb.le_stlb diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 46ace2f..d276968 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -23,6 +23,8 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) include_directories(${CMAKE_BINARY_DIR}/src/gmio_core) # For generated cmake headers +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/temp) + # test_internal add_executable( test_internal diff --git a/tests/models/solid_grabcad_arm11_link0_hb.le_stlb b/tests/models/solid_grabcad_arm11_link0_hb.le_stlb new file mode 100644 index 0000000000000000000000000000000000000000..2a5af365ce315640b41e894f263fd7d9e19e73c1 GIT binary patch literal 71884 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 khQ|Po9zVqhjp#{Gi}44G8hC%6q6U +#include #include +GMIO_INLINE gmio_bool_t gmio_stlb_header_equal( + const gmio_stlb_header_t* lhs, const gmio_stlb_header_t* rhs) +{ + return memcmp(lhs, rhs, GMIO_STLB_HEADER_SIZE) == 0; +} + struct stl_testcase_result { char solid_name[2048]; @@ -95,6 +103,11 @@ const char* test_stl_read() GMIO_STL_FORMAT_ASCII, "a b c d e f\t\tg h" }, + { "models/solid_grabcad_arm11_link0_hb.le_stlb", + GMIO_ERROR_OK, + GMIO_STL_FORMAT_BINARY_LE, + NULL + }, { "models/solid_lack_z.stla", GMIO_STL_ERROR_PARSING, GMIO_STL_FORMAT_ASCII, @@ -185,11 +198,156 @@ struct stl_triangle_array }; typedef struct stl_triangle_array stl_triangle_array_t; -void stl_triangle_array_get_triangle( +struct stl_io_cookie +{ + gmio_stlb_header_t header; + stl_triangle_array_t tri_array; +}; +typedef struct stl_io_cookie stl_io_cookie_t; + +static void stl_io_cookie__binary_begin_solid( + void* cookie, uint32_t tri_count, const gmio_stlb_header_t* header) +{ + stl_io_cookie_t* io_cookie = (stl_io_cookie_t*)cookie; + memcpy(&io_cookie->header, header, GMIO_STLB_HEADER_SIZE); + io_cookie->tri_array.count = tri_count; + if (tri_count > 0) { + io_cookie->tri_array.ptr = + (gmio_stl_triangle_t*)malloc(tri_count * sizeof(gmio_stl_triangle_t)); + + } +} + +static void stl_io_cookie__add_triangle( + void* cookie, uint32_t tri_id, const gmio_stl_triangle_t* triangle) +{ + stl_io_cookie_t* io_cookie = (stl_io_cookie_t*)cookie; + io_cookie->tri_array.ptr[tri_id] = *triangle; +} + +static void stl_io_cookie__get_triangle( const void* cookie, uint32_t tri_id, gmio_stl_triangle_t* triangle) { - const stl_triangle_array_t* array = (const stl_triangle_array_t*)cookie; - *triangle = array->ptr[tri_id]; + const stl_io_cookie_t* io_cookie = (const stl_io_cookie_t*)cookie; + *triangle = io_cookie->tri_array.ptr[tri_id]; +} + +static gmio_stl_mesh_creator_t stl_io_mesh_creator(stl_io_cookie_t* cookie) +{ + gmio_stl_mesh_creator_t creator = {0}; + creator.cookie = cookie; + creator.func_binary_begin_solid = &stl_io_cookie__binary_begin_solid; + creator.func_add_triangle = &stl_io_cookie__add_triangle; + return creator; +} + +static gmio_stl_mesh_t stl_io_mesh(const stl_io_cookie_t* cookie) +{ + gmio_stl_mesh_t mesh = {0}; + mesh.cookie = cookie; + mesh.triangle_count = cookie->tri_array.count; + mesh.func_get_triangle = &stl_io_cookie__get_triangle; + return mesh; +} + +const char* test_stlb_write_header() +{ + const char* filepath = "temp/solid.stlb"; + gmio_stlb_header_t header = { 0 }; + const char* header_str = "temp/solid.stlb generated with gmio library"; + int error = GMIO_ERROR_OK; + + { + FILE* outfile = fopen(filepath, "wb"); + gmio_stream_t stream = gmio_stream_stdio(outfile); + memcpy(&header, + header_str, + GMIO_MIN(GMIO_STLB_HEADER_SIZE, strlen(header_str))); + error = gmio_stlb_write_header( + &stream, GMIO_ENDIANNESS_LITTLE, &header, 0); + fclose(outfile); + UTEST_ASSERT(error == GMIO_ERROR_OK); + } + + { + stl_io_cookie_t cookie = {0}; + gmio_stl_mesh_creator_t mesh_creator = stl_io_mesh_creator(&cookie); + error = gmio_stl_read_file(filepath, &mesh_creator, NULL); + UTEST_ASSERT(error == GMIO_ERROR_OK); + UTEST_ASSERT(gmio_stlb_header_equal(&header, &cookie.header)); + UTEST_ASSERT(cookie.tri_array.count == 0); + } + + return NULL; +} + +const char* test_stlb_write() +{ + const char* model_filepath = "models/solid_grabcad_arm11_link0_hb.le_stlb"; + const char* model_filepath_out = "temp/solid_grabcad_arm11_link0_hb.le_stlb"; + const char* model_filepath_out_be = "temp/solid_grabcad_arm11_link0_hb.be_stlb"; + stl_io_cookie_t cookie = {0}; + int error = GMIO_ERROR_OK; + + /* Read input model file */ + { + gmio_stl_mesh_creator_t mesh_creator = stl_io_mesh_creator(&cookie); + error = gmio_stl_read_file(model_filepath, &mesh_creator, NULL); + UTEST_ASSERT(error == GMIO_ERROR_OK); + } + + /* Write back input model file + * Write also the model file in big-endian STL format + */ + { + gmio_stl_write_options_t options = {0}; + const gmio_stl_mesh_t mesh = stl_io_mesh(&cookie); + options.stlb_header_data = &cookie.header; + error = gmio_stl_write_file( + GMIO_STL_FORMAT_BINARY_LE, model_filepath_out, &mesh, NULL, &options); + UTEST_ASSERT(error == GMIO_ERROR_OK); + + /* Big-endian version */ + error = gmio_stl_write_file( + GMIO_STL_FORMAT_BINARY_BE, model_filepath_out_be, &mesh, NULL, &options); + } + + /* Check input and output models are equal */ + { + uint8_t buffer_in[2048] = {0}; + uint8_t buffer_out[2048] = {0}; + const size_t buff_size = 2048; + size_t bytes_read_in = 0; + size_t bytes_read_out = 0; + FILE* in = fopen(model_filepath, "rb"); + FILE* out = fopen(model_filepath_out, "rb"); + UTEST_ASSERT(in != NULL && out != NULL); + do { + bytes_read_in = fread(&buffer_in[0], 1, buff_size, in); + bytes_read_out = fread(&buffer_out[0], 1, buff_size, out); + UTEST_ASSERT(bytes_read_in == bytes_read_out); + UTEST_ASSERT(memcmp(&buffer_in[0], &buffer_out[0], buff_size) == 0); + } while (!feof(in) && !feof(out) + && bytes_read_in > 0 && bytes_read_out > 0); + } + + /* Check output LE/BE models are equal */ + { + const uint32_t le_tri_count = cookie.tri_array.count; + const gmio_stl_triangle_t* le_tri_ptr = cookie.tri_array.ptr; + stl_io_cookie_t cookie_be = {0}; + gmio_stl_mesh_creator_t mesh_creator = stl_io_mesh_creator(&cookie_be); + error = gmio_stl_read_file(model_filepath_out_be, &mesh_creator, NULL); + UTEST_ASSERT(error == GMIO_ERROR_OK); + UTEST_ASSERT(gmio_stlb_header_equal(&cookie.header, &cookie_be.header)); + UTEST_ASSERT(le_tri_count == cookie_be.tri_array.count); + UTEST_ASSERT(memcmp(le_tri_ptr, cookie_be.tri_array.ptr, le_tri_count) == 0); + free(cookie_be.tri_array.ptr); + } + + free(cookie.tri_array.ptr); + + return NULL; } void generate_stlb_tests_models() @@ -210,14 +368,14 @@ void generate_stlb_tests_models() { 5.f, 10.f, 0.f }, /* v3 */ 0 /* attr */ }; - stl_triangle_array_t tri_array; + stl_io_cookie_t io_cookie = {0}; - tri_array.ptr = &tri; - tri_array.count = 1; + io_cookie.tri_array.ptr = &tri; + io_cookie.tri_array.count = 1; - mesh.cookie = &tri_array; - mesh.triangle_count = tri_array.count; - mesh.func_get_triangle = &stl_triangle_array_get_triangle; + mesh.cookie = &io_cookie; + mesh.triangle_count = io_cookie.tri_array.count; + mesh.func_get_triangle = &stl_io_cookie__get_triangle; gmio_stl_write_file( GMIO_STL_FORMAT_BINARY_LE, @@ -239,6 +397,8 @@ const char* all_tests() /*generate_stlb_tests_models();*/ UTEST_SUITE_START(); UTEST_RUN(test_stl_read); + UTEST_RUN(test_stlb_write_header); + UTEST_RUN(test_stlb_write); return NULL; }