Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** 00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating, 00003 * storing and accessing finite element mesh data. 00004 * 00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract 00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00007 * retains certain rights in this software. 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 */ 00015 00016 /** TSTT Mesh Interface Unit Test 00017 * 00018 * This program tests TSTT mesh interface functions through the SIDL interface. 00019 * In a nutshell, the test creates (or accesses) an implementation instance, 00020 * tells it to load a file (specified on the command line), then calls a 00021 * number of functions evaluating that mesh. This test also tests mesh, set 00022 * and tag creation and evaluation functions. 00023 * 00024 * Usage: testcxx <mesh_file_name> 00025 * 00026 * Compiling 00027 * --------- 00028 * 1. Build your server (your implementation of the TSTT mesh interface) under 00029 * SIDL/Babel and put it in a library in the Babel-generated server directory, 00030 * ${SERVER_DIR}/libimpl.so. Any include files needed to instantiate this 00031 * server from applications should also be in that directory. See note a) below. 00032 * 2. Change the definition of IMPLEMENTATION_CLASS below to be the 00033 * namespace-qualified name of your implementation class. This definition is 00034 * used in the main to instantiate the server using the SIDL _create function, e.g. 00035 * . TSTTB::Mesh mesh = IMPLEMENTATION_CLASS._create(); 00036 * (we put the definition of IMPLEMENTATION_CLASS at the top of this file so that 00037 * you don't have to understand the rest of the source code to use this test). See 00038 * note b) below. 00039 * 3. Include the file(s) needed which declare the implementation's namespace and 00040 * class 00041 * 4. Compile this test file to an object file: 00042 * g++ -fpic -I. -I${BABEL}/include -I${SERVER_DIR} -c testcxx.cpp 00043 * 5. Link the application: 00044 * g++ -o testcxx testcxx.o -ltest -L${BABEL_LIBS} -lsidl 00045 * 00046 * Notes 00047 * ----- 00048 * a) The files don't absolutely need to be arranged as described above. For 00049 * example, some projects put their custom implementation files somewhere besides 00050 * ${SERVER_DIR}, to keep them separate from Babel-generated files. 00051 * b) This test assumes interface instances are created using a direct call to the 00052 * SIDL _create() function for that class. Another way to do this would be to 00053 * call a factory linked into the test. To change the method used to construct 00054 * the interface instance for this test, see the use of IMPLEMENTATION_CLASS towards 00055 * the end of this file. 00056 */ 00057 00058 #include <cstdio> 00059 #include <cstring> 00060 #include <cstdlib> 00061 #include "iMesh.h" 00062 #include "iMesh_extensions.h" 00063 #include "moab/Types.hpp" 00064 #include "TestUtil.hpp" 00065 using namespace moab; 00066 extern enum iBase_ErrorType iBase_ERROR_MAP[MB_FAILURE + 1]; 00067 00068 #define FALSE 0 00069 #define TRUE 1 00070 00071 #define DEFAULT_TEST_FILE brick.vtk 00072 00073 // clang-format off 00074 00075 #ifdef SRCDIR 00076 #define DEFAULT_INPUT_FILE STRINGIFY( SRCDIR/DEFAULT_TEST_FILE ) 00077 #else 00078 #define DEFAULT_INPUT_FILE STRINGIFY( DEFAULT_TEST_FILE ) 00079 #endif 00080 00081 static bool assert_pass; 00082 #define ASSERT( COND ) \ 00083 assert_pass = true; \ 00084 if( !( COND ) ) \ 00085 { \ 00086 PRINT_ASSERT_FAILURE( #COND, __FILE__, __LINE__ ); \ 00087 assert_pass = false; \ 00088 } 00089 00090 void PRINT_ASSERT_FAILURE( const char* cond, const char* file, int line ) 00091 { 00092 printf( "Condition: %s\n", cond ); 00093 printf( " failed at %s line %d\n", file, line ); 00094 } 00095 00096 #define CHK( err ) \ 00097 if( (err) != iBase_SUCCESS ) do \ 00098 { \ 00099 printf( "%s:%d ITAPS error %d\n", __FILE__, __LINE__, err ); \ 00100 return 0; \ 00101 } while( 0 ) 00102 00103 // clang-format on 00104 00105 static iBase_EntitySetHandle root_set; 00106 00107 /*! 00108 prints out a result string based on the value of error_code 00109 */ 00110 void handle_error_code( const int result, int* number_failed, int* /*number_not_implemented*/, int* number_successful ) 00111 { 00112 if( result ) 00113 { 00114 printf( "Success\n" ); 00115 ( *number_successful )++; 00116 } 00117 else 00118 { 00119 printf( "Failure\n" ); 00120 ( *number_failed )++; 00121 } 00122 } 00123 00124 /*! 00125 @test 00126 Load Mesh 00127 @li Load a mesh file 00128 */ 00129 int load_mesh_test( const char* filename, iMesh_Instance mesh ) 00130 { 00131 /* load a mesh */ 00132 int result; 00133 iMesh_load( mesh, root_set, filename, NULL, &result, strlen( filename ), 0 ); 00134 if( iBase_SUCCESS != result ) 00135 { 00136 printf( "ERROR : can not load a mesh from file %s\n", filename ); 00137 return FALSE; 00138 } 00139 00140 return TRUE; 00141 } 00142 00143 #define TEST_ERROR_CODE( A, B ) \ 00144 if( iBase_ERROR_MAP[( A )] != ( B ) ) \ 00145 { \ 00146 printf( "ERROR: Invalid mapping for MOAB error code %s\n", #A ); \ 00147 printf( " Expected %d, actual is %d\n", (int)iBase_ERROR_MAP[( A )], (int)( B ) ); \ 00148 return FALSE; \ 00149 } 00150 00151 int error_code_test( iMesh_Instance /*mesh*/ ) 00152 { 00153 TEST_ERROR_CODE( MB_SUCCESS, iBase_SUCCESS ) 00154 TEST_ERROR_CODE( MB_TYPE_OUT_OF_RANGE, iBase_INVALID_ENTITY_TYPE ) 00155 TEST_ERROR_CODE( MB_MEMORY_ALLOCATION_FAILED, iBase_MEMORY_ALLOCATION_FAILED ) 00156 TEST_ERROR_CODE( MB_ENTITY_NOT_FOUND, iBase_INVALID_ENTITY_HANDLE ) 00157 TEST_ERROR_CODE( MB_TAG_NOT_FOUND, iBase_TAG_NOT_FOUND ) 00158 TEST_ERROR_CODE( MB_FILE_DOES_NOT_EXIST, iBase_FILE_NOT_FOUND ) 00159 TEST_ERROR_CODE( MB_UNSUPPORTED_OPERATION, iBase_NOT_SUPPORTED ) 00160 TEST_ERROR_CODE( MB_UNHANDLED_OPTION, iBase_INVALID_ARGUMENT ) 00161 TEST_ERROR_CODE( MB_FAILURE, iBase_FAILURE ) 00162 return TRUE; 00163 } 00164 00165 /*! 00166 @test 00167 TSTT topology dimension Test 00168 @li Check 2d topology dimensions 00169 */ 00170 int topology_dimension_test( iMesh_Instance mesh ) 00171 { 00172 iBase_EntityHandle* faces = NULL; 00173 int faces_alloc = 0, faces_size; 00174 int result, i; 00175 int* dimensions = NULL; 00176 int dimensions_alloc = 0, dimensions_size; 00177 00178 /* first get 2D entities */ 00179 iMesh_getEntities( mesh, root_set, iBase_FACE, iMesh_ALL_TOPOLOGIES, &faces, &faces_alloc, &faces_size, &result ); 00180 if( iBase_SUCCESS != result ) 00181 { 00182 printf( "Failed to get faces in entity_sets_test.\n" ); 00183 return FALSE; 00184 } 00185 00186 /* get dimensions of faces */ 00187 iMesh_getEntArrType( mesh, faces, faces_size, &dimensions, &dimensions_alloc, &dimensions_size, &result ); 00188 if( iBase_SUCCESS != result ) 00189 { 00190 printf( "Failed to get dimensions of faces in topology_test.\n" ); 00191 free( faces ); 00192 return FALSE; 00193 } 00194 00195 if( dimensions_size != faces_size ) 00196 { 00197 printf( "Didn't get the right number of types in topology_test.\n" ); 00198 free( faces ); 00199 free( dimensions ); 00200 return FALSE; 00201 } 00202 00203 /* make sure all elements are 2D */ 00204 for( i = 0; i < faces_size; i++ ) 00205 { 00206 if( dimensions[i] != iBase_FACE ) 00207 { 00208 free( faces ); 00209 free( dimensions ); 00210 return FALSE; 00211 } 00212 } 00213 00214 free( faces ); 00215 free( dimensions ); 00216 00217 return TRUE; 00218 } 00219 00220 /*! 00221 @test 00222 TSTT topology adjacency Test 00223 @li Check topology information 00224 @li Check adjacency 00225 @li Get interior and exterior elements 00226 */ 00227 /* make each topological entity vectors, check their topology */ 00228 /* types, get interior and exterior faces of hexes */ 00229 int topology_adjacency_test( iMesh_Instance mesh ) 00230 { 00231 int result, i, j, entities_alloc, entities_size, *topologies; 00232 int topologies_alloc, topologies_size; 00233 iBase_EntityHandle *entities, *entity_vectors[iMesh_ALL_TOPOLOGIES] = { NULL }; 00234 int entity_vectors_sizes[iMesh_ALL_TOPOLOGIES] = { 0 }; 00235 int top_j, num_tops, region_type, num_region; 00236 iBase_EntityHandle* adj_faces = NULL; 00237 int adj_faces_alloc = 0, adj_faces_size; 00238 int* face_offsets = NULL; 00239 int face_offsets_alloc = 0, face_offsets_size, face_loaded; 00240 iBase_EntityHandle* adj_regions = NULL; 00241 int adj_regions_alloc = 0, adj_regions_size; 00242 int* region_offsets = NULL; 00243 int region_offsets_alloc = 0, region_offsets_size; 00244 iBase_EntityHandle *interior, *exterior; 00245 int num_int = 0, num_ext = 0, found, next_offset, iter; 00246 int num_faces_per_region; 00247 ; 00248 00249 /* fill the vectors of each topology entities */ 00250 /* like lines vector, polygon vector, triangle vector, */ 00251 /* quadrilateral, polyhedrron, tet, hex, prism, pyramid, */ 00252 /* septahedron vectors */ 00253 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00254 { 00255 entities = NULL; 00256 entities_alloc = 0; 00257 iMesh_getEntities( mesh, root_set, iBase_ALL_TYPES, i, &entities, &entities_alloc, &entities_size, &result ); 00258 if( iBase_SUCCESS != result ) 00259 { 00260 printf( "Failed to get entities in adjacencies_test.\n" ); 00261 return FALSE; 00262 } 00263 00264 if( entities_alloc > 0 ) 00265 { 00266 topologies = NULL; 00267 topologies_alloc = 0; 00268 iMesh_getEntArrTopo( mesh, entities, entities_alloc, &topologies, &topologies_alloc, &topologies_size, 00269 &result ); 00270 if( iBase_SUCCESS != result ) 00271 { 00272 printf( "Failed to get topologies in adjacencies_test.\n" ); 00273 return FALSE; 00274 } 00275 00276 if( topologies_size != entities_size ) 00277 { 00278 printf( "Didn't get the right number of topologies " 00279 "in topology_adjacency_test.\n" ); 00280 free( topologies ); 00281 free( entities ); 00282 return FALSE; 00283 } 00284 00285 /* put entities into vectors of each topology */ 00286 entity_vectors[i] = (iBase_EntityHandle*)malloc( entities_size * sizeof( iBase_EntityHandle ) ); 00287 00288 for( j = 0; j < entities_size; j++ ) 00289 { 00290 if( topologies[j] < iMesh_POINT || topologies[j] >= iMesh_ALL_TOPOLOGIES ) 00291 printf( "Didn't find entity type for this topology." ); 00292 else 00293 { 00294 entity_vectors[i][entity_vectors_sizes[i]] = entities[j]; 00295 entity_vectors_sizes[i]++; 00296 } 00297 } 00298 00299 free( topologies ); 00300 } 00301 00302 free( entities ); 00303 } 00304 00305 /* check number of entities for each topology */ 00306 for( top_j = 0; top_j < iMesh_ALL_TOPOLOGIES; top_j++ ) 00307 { 00308 num_tops = 0; 00309 iMesh_getNumOfTopo( mesh, root_set, top_j, &num_tops, &result ); 00310 if( iBase_SUCCESS != result ) 00311 { 00312 printf( "Failed to get number of topologies in adjacencies_test.\n" ); 00313 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00314 free( entity_vectors[i] ); 00315 return FALSE; 00316 } 00317 00318 if( entity_vectors_sizes[top_j] != num_tops ) 00319 { 00320 printf( "Topology count mismatch.\n" ); 00321 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00322 free( entity_vectors[i] ); 00323 return FALSE; 00324 } 00325 } 00326 00327 /* change if 3d topology entities are added or removed */ 00328 for( region_type = iMesh_TETRAHEDRON; region_type < iMesh_ALL_TOPOLOGIES; region_type++ ) 00329 { 00330 /* get all adjacent faces of regions */ 00331 iBase_EntityHandle* region_vector = entity_vectors[region_type]; 00332 00333 num_region = entity_vectors_sizes[region_type]; 00334 00335 if( num_region > 0 ) 00336 { 00337 adj_faces = NULL; 00338 adj_faces_alloc = 0; 00339 face_offsets = NULL; 00340 face_offsets_alloc = 0; 00341 00342 iMesh_getEntArrAdj( mesh, region_vector, num_region, iBase_FACE, &adj_faces, &adj_faces_alloc, 00343 &adj_faces_size, &face_offsets, &face_offsets_alloc, &face_offsets_size, &result ); 00344 if( iBase_SUCCESS != result ) 00345 { 00346 printf( "Failed to get adjacent faces of regions in adjacencies_test.\n" ); 00347 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00348 free( entity_vectors[i] ); 00349 return FALSE; 00350 } 00351 00352 if( num_region + 1 != face_offsets_size ) 00353 { 00354 printf( "Number of offsets didn't agree with number of " 00355 "regions in topology_adjacency_test.\n" ); 00356 free( face_offsets ); 00357 free( adj_faces ); 00358 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00359 free( entity_vectors[i] ); 00360 return FALSE; 00361 } 00362 00363 face_loaded = FALSE; 00364 00365 /* check # of faces really loaded */ 00366 if( region_type == iMesh_TETRAHEDRON ) 00367 { 00368 if( adj_faces_size == 4 * num_region ) face_loaded = TRUE; 00369 } 00370 else if( region_type == iMesh_HEXAHEDRON ) 00371 { 00372 if( adj_faces_size == 6 * num_region ) face_loaded = TRUE; 00373 } 00374 else if( region_type == iMesh_PRISM ) 00375 { 00376 if( adj_faces_size == 5 * num_region ) face_loaded = TRUE; 00377 } 00378 else if( region_type == iMesh_PYRAMID ) 00379 { 00380 if( adj_faces_size == 5 * num_region ) face_loaded = TRUE; 00381 } 00382 else if( region_type == iMesh_SEPTAHEDRON ) 00383 { 00384 if( adj_faces_size == 7 * num_region ) face_loaded = TRUE; 00385 } 00386 else 00387 face_loaded = FALSE; 00388 00389 /* get all adjacent regions of adjacent faces */ 00390 adj_regions = NULL; 00391 adj_regions_alloc = 0; 00392 region_offsets = NULL; 00393 region_offsets_alloc = 0; 00394 iMesh_getEntArrAdj( mesh, adj_faces, adj_faces_size, iBase_REGION, &adj_regions, &adj_regions_alloc, 00395 &adj_regions_size, ®ion_offsets, ®ion_offsets_alloc, ®ion_offsets_size, 00396 &result ); 00397 if( iBase_SUCCESS != result ) 00398 { 00399 printf( "Failed to get regions from faces in adjacencies_test.\n" ); 00400 free( face_offsets ); 00401 free( adj_faces ); 00402 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00403 free( entity_vectors[i] ); 00404 return FALSE; 00405 } 00406 00407 if( adj_faces_size + 1 != region_offsets_size ) 00408 { 00409 printf( "Number of offsets didn't agree with number of faces in " 00410 "topology_adjacency_test.\n" ); 00411 free( face_offsets ); 00412 free( region_offsets ); 00413 free( adj_faces ); 00414 free( adj_regions ); 00415 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00416 free( entity_vectors[i] ); 00417 return FALSE; 00418 } 00419 00420 interior = (iBase_EntityHandle*)malloc( adj_faces_size * sizeof( iBase_EntityHandle ) ), 00421 exterior = (iBase_EntityHandle*)malloc( adj_faces_size * sizeof( iBase_EntityHandle ) ); 00422 num_int = 0; 00423 num_ext = 0; 00424 00425 /* find the interior faces having two adjacent regions */ 00426 for( i = 0; i < adj_faces_size; i++ ) 00427 { 00428 next_offset = 0; 00429 if( i == adj_faces_size - 1 ) 00430 next_offset = adj_regions_size; 00431 else 00432 next_offset = region_offsets[i + 1]; 00433 00434 if( next_offset - region_offsets[i] == 2 ) 00435 { 00436 found = FALSE; 00437 for( iter = 0; iter < num_int; iter++ ) 00438 { 00439 if( interior[iter] == adj_faces[i] ) 00440 { 00441 found = TRUE; 00442 break; 00443 } 00444 } 00445 if( !found ) interior[num_int++] = adj_faces[i]; 00446 } 00447 } 00448 00449 /* now remove any interior faces from the previous adjacent faces list */ 00450 /* and we should be left with exterior faces */ 00451 for( i = 0; i < adj_faces_size; i++ ) 00452 { 00453 found = FALSE; 00454 for( iter = 0; iter < num_int; iter++ ) 00455 { 00456 if( interior[iter] == adj_faces[i] ) 00457 { 00458 found = TRUE; 00459 break; 00460 } 00461 } 00462 if( !found ) exterior[num_ext++] = adj_faces[i]; 00463 } 00464 00465 num_faces_per_region = face_offsets[1] - face_offsets[0]; 00466 00467 /* check # of exterior and interior faces */ 00468 /* should be #exterior_faces + 2 * #interior_faces = #faces_per_region */ 00469 /* * #regions */ 00470 if( face_loaded ) 00471 { 00472 if( num_ext + 2 * num_int != num_faces_per_region * num_region ) 00473 { 00474 printf( "exterior/interior failure: %d ext, %d int, %d regions, %d faces per\n", num_ext, num_int, 00475 num_region, num_faces_per_region ); 00476 free( face_offsets ); 00477 free( region_offsets ); 00478 free( adj_faces ); 00479 free( adj_regions ); 00480 free( interior ); 00481 free( exterior ); 00482 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00483 free( entity_vectors[i] ); 00484 return FALSE; 00485 } 00486 } 00487 00488 free( face_offsets ); 00489 free( region_offsets ); 00490 free( adj_faces ); 00491 free( adj_regions ); 00492 free( interior ); 00493 free( exterior ); 00494 } 00495 } 00496 00497 for( i = 0; i < iMesh_ALL_TOPOLOGIES; i++ ) 00498 free( entity_vectors[i] ); 00499 00500 return TRUE; 00501 } 00502 00503 int qsort_comp_handles( const void* h1, const void* h2 ) 00504 { 00505 return *(char**)h1 - *(char**)h2; 00506 } 00507 00508 /*! 00509 @test 00510 TSTT EntityType Connectivity Test 00511 @li Get coordinates for all type enities 00512 */ 00513 00514 int entity_connectivity_test( iMesh_Instance mesh ) 00515 { 00516 int type, result; 00517 int *offsets, offsets_alloc, offsets_size; 00518 int *indices, indices_alloc, indices_size; 00519 iBase_EntityHandle *entities, *adj_ents, *entities2, *sorted; 00520 int entities_alloc, entities_size, adj_ents_alloc, adj_ents_size; 00521 int entities2_alloc, entities2_size; 00522 iBase_EntityHandle adj_ents2[27], *adj_ents2_ptr = adj_ents2; 00523 int adj_ents2_alloc = 27, adj_ents2_size, i, size; 00524 00525 for( type = iBase_EDGE; type < iBase_ALL_TYPES; type++ ) 00526 { 00527 entities = NULL; 00528 entities_alloc = 0; 00529 adj_ents = NULL; 00530 adj_ents_alloc = 0; 00531 indices = NULL; 00532 indices_alloc = 0; 00533 offsets = NULL; 00534 offsets_alloc = 0; 00535 iMesh_getAdjEntIndices( mesh, root_set, type, iMesh_ALL_TOPOLOGIES, iBase_VERTEX, &entities, &entities_alloc, 00536 &entities_size, &adj_ents, &adj_ents_alloc, &adj_ents_size, &indices, &indices_alloc, 00537 &indices_size, &offsets, &offsets_alloc, &offsets_size, &result ); 00538 if( iBase_SUCCESS != result ) 00539 { 00540 printf( "Failed to get indices of vertices in connectivity_test, type=%d.\n", type ); 00541 return FALSE; 00542 } 00543 00544 if( entities_alloc != entities_size ) 00545 { 00546 printf( "Number of entities didn't agree with array size in connectivity_test.\n" ); 00547 free( entities ); 00548 free( adj_ents ); 00549 free( indices ); 00550 free( offsets ); 00551 return FALSE; 00552 } 00553 00554 if( offsets_alloc != offsets_size ) 00555 { 00556 printf( "Number of offsets didn't agree with array size in connectivity_test.\n" ); 00557 free( entities ); 00558 free( adj_ents ); 00559 free( indices ); 00560 free( offsets ); 00561 return FALSE; 00562 } 00563 00564 if( indices_alloc != indices_size ) 00565 { 00566 printf( "Number of indices didn't agree with array size in connectivity_test.\n" ); 00567 free( entities ); 00568 free( adj_ents ); 00569 free( indices ); 00570 free( offsets ); 00571 return FALSE; 00572 } 00573 00574 if( adj_ents_alloc != adj_ents_size ) 00575 { 00576 printf( "Number of adjacent entities didn't agree with array size in " 00577 "connectivity_test.\n" ); 00578 free( entities ); 00579 free( adj_ents ); 00580 free( indices ); 00581 free( offsets ); 00582 return FALSE; 00583 } 00584 00585 if( offsets_size != entities_size + 1 ) 00586 { 00587 printf( "Invalid/inconsistent offset size from iMesh_getAdjEntIndices.\n" ); 00588 free( entities ); 00589 free( adj_ents ); 00590 free( indices ); 00591 free( offsets ); 00592 return FALSE; 00593 } 00594 00595 /* check that results are valid */ 00596 for( i = 0; i < entities_size; ++i ) 00597 { 00598 ASSERT( offsets[i] < offsets[i + 1] && offsets[i] < indices_size ); 00599 if( !assert_pass ) 00600 { 00601 free( entities ); 00602 free( adj_ents ); 00603 free( indices ); 00604 free( offsets ); 00605 return FALSE; 00606 } 00607 } 00608 00609 for( i = 0; i < indices_size; ++i ) 00610 { 00611 ASSERT( indices[i] >= 0 && indices[i] < adj_ents_size ); 00612 if( !assert_pass ) 00613 { 00614 free( entities ); 00615 free( adj_ents ); 00616 free( indices ); 00617 free( offsets ); 00618 return FALSE; 00619 } 00620 } 00621 00622 /* compare initial entity list against result of iMesh_getEntities */ 00623 entities2 = NULL; 00624 entities2_alloc = 0; 00625 iMesh_getEntities( mesh, root_set, type, iMesh_ALL_TOPOLOGIES, &entities2, &entities2_alloc, &entities2_size, 00626 &result ); 00627 ASSERT( iBase_SUCCESS == result ); 00628 if( !assert_pass ) 00629 { 00630 free( entities ); 00631 free( adj_ents ); 00632 free( indices ); 00633 free( offsets ); 00634 return FALSE; 00635 } 00636 00637 size = sizeof( iBase_EntityHandle ) * entities_size; 00638 sorted = (iBase_EntityHandle*)malloc( size ); 00639 memcpy( sorted, entities, size ); 00640 qsort( sorted, entities_size, sizeof( iBase_EntityHandle ), &qsort_comp_handles ); 00641 qsort( entities2, entities2_size, sizeof( iBase_EntityHandle ), &qsort_comp_handles ); 00642 00643 ASSERT( entities_size == entities2_size && !memcmp( sorted, entities2, size ) ); 00644 if( !assert_pass ) 00645 { 00646 free( entities ); 00647 free( adj_ents ); 00648 free( indices ); 00649 free( offsets ); 00650 free( entities2 ); 00651 free( sorted ); 00652 return FALSE; 00653 } 00654 00655 free( entities2 ); 00656 free( sorted ); 00657 00658 /* compare results against output of iMesh_getEntAdj */ 00659 for( i = 0; i < entities_size; ++i ) 00660 { 00661 iMesh_getEntAdj( mesh, entities[i], iBase_VERTEX, &adj_ents2_ptr, &adj_ents2_alloc, &adj_ents2_size, 00662 &result ); 00663 ASSERT( iBase_SUCCESS == result ); 00664 if( !assert_pass ) 00665 { 00666 free( entities ); 00667 free( adj_ents ); 00668 free( indices ); 00669 free( offsets ); 00670 return FALSE; 00671 } 00672 00673 ASSERT( adj_ents2_ptr == adj_ents2 ); /* shouldn't change */ 00674 if( !assert_pass ) 00675 { 00676 free( entities ); 00677 free( adj_ents ); 00678 free( indices ); 00679 free( offsets ); 00680 return FALSE; 00681 } 00682 00683 ASSERT( adj_ents2_alloc == 27 ); /* shouldn't change */ 00684 if( !assert_pass ) 00685 { 00686 free( entities ); 00687 free( adj_ents ); 00688 free( indices ); 00689 free( offsets ); 00690 return FALSE; 00691 } 00692 00693 /* compare results */ 00694 size = offsets[i + 1] - offsets[i]; 00695 ASSERT( size == adj_ents2_size ); 00696 while( --size >= 0 ) 00697 { 00698 ASSERT( adj_ents2[size] == adj_ents[indices[offsets[i] + size]] ); 00699 if( !assert_pass ) 00700 { 00701 free( entities ); 00702 free( adj_ents ); 00703 free( indices ); 00704 free( offsets ); 00705 return FALSE; 00706 } 00707 } 00708 } 00709 00710 free( entities ); 00711 free( adj_ents ); 00712 free( indices ); 00713 free( offsets ); 00714 00715 /* 00716 offsets = NULL; 00717 offsets_alloc = 0; 00718 entities = NULL; 00719 entities_alloc = 0; 00720 00721 iMesh_getAdjEntities(mesh, root_set, type, 00722 iMesh_ALL_TOPOLOGIES, iBase_VERTEX, 00723 &entities, &entities_alloc, &entities_size, 00724 &offsets, &offsets_alloc, &offsets_size, 00725 &result); 00726 if (iBase_SUCCESS != result) { 00727 printf("Failed to get indices of adjacent entity vertices in connectivity_test.\n"); 00728 return FALSE; 00729 } 00730 00731 if (entities_alloc != entities_size || 00732 offsets_alloc != offsets_size) { 00733 printf("Number of elements didn't agree with array size for an array in 00734 connectivity_test.\n"); return FALSE; 00735 } 00736 00737 free(offsets); 00738 free(entities); 00739 */ 00740 } 00741 00742 return TRUE; 00743 } 00744 00745 /*! 00746 @test 00747 TSTT entity sets sub test 00748 @li Check entity sets 00749 */ 00750 00751 /* helper function used to report errors in # sets */ 00752 int check_esets( iMesh_Instance mesh, const int num_sets ); 00753 00754 int entity_sets_subtest( iMesh_Instance mesh, int is_list, int /*num_iter*/ ) 00755 { 00756 int i, num_type = iBase_ALL_TYPES - iBase_VERTEX; 00757 // int num_all_entities_super = 0; 00758 iBase_EntitySetHandle es_array[iBase_ALL_TYPES - iBase_VERTEX]; 00759 int number_array[iBase_ALL_TYPES - iBase_VERTEX]; 00760 int ent_type = iBase_VERTEX; 00761 iBase_EntityHandle* entities = NULL; 00762 int entities_alloc = 0, entities_size; 00763 iBase_EntitySetHandle parent_child, super_set = NULL; 00764 iBase_EntitySetHandle temp_es1, temp_es2, temp_es3; 00765 iBase_EntityHandle *edges = NULL, *faces = NULL, *temp_entities1 = NULL, *temp_entities2 = NULL; 00766 int edges_alloc = 0, faces_alloc = 0, temp_entities1_alloc = 0, temp_entities2_alloc = 0; 00767 int edges_size, faces_size, temp_entities1_size, temp_entities2_size; 00768 int* types = NULL; 00769 int types_alloc = 0, types_size; 00770 int num_rest, num_regions; 00771 iBase_EntityHandle* regions = NULL; 00772 int regions_alloc = 0, regions_size; 00773 iBase_EntitySetHandle* parents = NULL; 00774 int parents_alloc = 0, parents_size, temp_numb, is_child; 00775 iBase_EntitySetHandle* es_array1 = NULL; 00776 int es_array1_alloc = 0, es_array1_size, num_super; 00777 iBase_EntityHandle* all_entities = NULL; 00778 int all_entities_alloc = 0, all_entities_size, k, l; 00779 iBase_EntityHandle* adj_faces = NULL; 00780 int adj_faces_alloc = 0, adj_faces_size; 00781 int* face_offsets = NULL; 00782 int face_offsets_alloc = 0, face_offsets_size; 00783 iBase_EntityHandle* hexes = NULL; 00784 int hexes_alloc = 0, hexes_size; 00785 iBase_EntitySetHandle hex_set; 00786 00787 /* get the number of whole mesh */ 00788 int n_whole_mesh = 0; 00789 int result; 00790 iMesh_getNumEntSets( mesh, root_set, 1, &n_whole_mesh, &result ); 00791 if( iBase_SUCCESS != result ) 00792 { 00793 printf( "Problem to get the number of all entity sets in whole mesh.\n" ); 00794 return FALSE; 00795 } 00796 00797 /* add entities to entitysets by type */ 00798 for( ; ent_type < num_type; ent_type++ ) 00799 { 00800 /* initialize the entityset */ 00801 iMesh_createEntSet( mesh, is_list, &es_array[ent_type], &result ); 00802 if( iBase_SUCCESS != result ) 00803 { 00804 printf( "Problem creating entityset.\n" ); 00805 return FALSE; 00806 } 00807 00808 /* get entities by type in total "mesh" */ 00809 entities = NULL; 00810 entities_alloc = 0; 00811 iMesh_getEntities( mesh, root_set, ent_type, iMesh_ALL_TOPOLOGIES, &entities, &entities_alloc, &entities_size, 00812 &result ); 00813 if( iBase_SUCCESS != result ) 00814 { 00815 printf( "Failed to get entities by type in entity_sets_test.\n" ); 00816 return FALSE; 00817 } 00818 00819 if( entities_alloc != entities_size ) 00820 { 00821 printf( "Number of entities didn't agree with array size in entity_sets_subtest.\n" ); 00822 free( entities ); 00823 return FALSE; 00824 } 00825 00826 /* add entities into entity set */ 00827 if( 0 != entities_size ) 00828 { 00829 iMesh_addEntArrToSet( mesh, entities, entities_size, es_array[ent_type], &result ); 00830 if( iBase_SUCCESS != result ) 00831 { 00832 printf( "Failed to add entities in entity_sets_test.\n" ); 00833 free( entities ); 00834 return FALSE; 00835 } 00836 } 00837 00838 /* Check to make sure entity set really has correct number of entities in it */ 00839 iMesh_getNumOfType( mesh, es_array[ent_type], ent_type, number_array + ent_type, &result ); 00840 00841 if( iBase_SUCCESS != result ) 00842 { 00843 printf( "Failed to get number of entities by type in entity_sets_test.\n" ); 00844 free( entities ); 00845 return FALSE; 00846 } 00847 00848 /* compare the number of entities by type */ 00849 if( number_array[ent_type] != entities_size ) 00850 { 00851 printf( "Number of entities by type is not correct\n" ); 00852 free( entities ); 00853 return FALSE; 00854 } 00855 00856 /* add to number of all entities in super set */ 00857 // num_all_entities_super += entities_size; 00858 00859 free( entities ); 00860 } 00861 00862 if( !check_esets( mesh, n_whole_mesh + num_type ) ) return FALSE; 00863 00864 /* make a super set having all entitysets */ 00865 super_set = NULL; 00866 iMesh_createEntSet( mesh, is_list, &super_set, &result ); 00867 if( iBase_SUCCESS != result ) 00868 { 00869 printf( "Failed to create a super set in entity_sets_test.\n" ); 00870 return FALSE; 00871 } 00872 00873 for( i = 0; i < num_type; i++ ) 00874 { 00875 iMesh_addEntSet( mesh, es_array[i], super_set, &result ); 00876 if( iBase_SUCCESS != result ) 00877 { 00878 printf( "Failed to add a set to a super set in entity_sets_test.\n" ); 00879 return FALSE; 00880 } 00881 } 00882 00883 if( !check_esets( mesh, n_whole_mesh + num_type + 1 ) ) return FALSE; 00884 00885 /*----------TEST intEAN OPERATIONS----------------*/ 00886 00887 iMesh_createEntSet( mesh, is_list, &temp_es1, &result ); 00888 if( iBase_SUCCESS != result ) 00889 { 00890 printf( "Failed to create a super set in entity_sets_test.\n" ); 00891 return FALSE; 00892 } 00893 00894 if( !check_esets( mesh, n_whole_mesh + num_type + 2 ) ) 00895 { 00896 return FALSE; 00897 } 00898 00899 /* Subtract */ 00900 /* add all EDGEs and FACEs to temp_es1 */ 00901 /* get all EDGE entities */ 00902 edges = NULL; 00903 edges_alloc = 0; 00904 iMesh_getEntities( mesh, es_array[iBase_EDGE], iBase_EDGE, iMesh_ALL_TOPOLOGIES, &edges, &edges_alloc, &edges_size, 00905 &result ); 00906 00907 if( iBase_SUCCESS != result ) 00908 { 00909 printf( "Failed to get edge entities in entity_sets_test.\n" ); 00910 return FALSE; 00911 } 00912 00913 /* add EDGEs to es1 */ 00914 iMesh_addEntArrToSet( mesh, edges, edges_size, temp_es1, &result ); 00915 if( iBase_SUCCESS != result ) 00916 { 00917 printf( "Failed to add edge entities in entity_sets_test.\n" ); 00918 free( edges ); 00919 return FALSE; 00920 } 00921 00922 /* get all FACE entities */ 00923 faces = NULL; 00924 faces_alloc = 0; 00925 iMesh_getEntities( mesh, es_array[iBase_FACE], iBase_FACE, iMesh_ALL_TOPOLOGIES, &faces, &faces_alloc, &faces_size, 00926 &result ); 00927 if( iBase_SUCCESS != result ) 00928 { 00929 printf( "Failed to get face entities in entity_sets_test.\n" ); 00930 free( edges ); 00931 return FALSE; 00932 } 00933 00934 /* add FACEs to es1 */ 00935 iMesh_addEntArrToSet( mesh, faces, faces_size, temp_es1, &result ); 00936 if( iBase_SUCCESS != result ) 00937 { 00938 printf( "Failed to add face entities in entity_sets_test.\n" ); 00939 free( edges ); 00940 free( faces ); 00941 return FALSE; 00942 } 00943 00944 /* subtract EDGEs */ 00945 00946 iMesh_subtract( mesh, temp_es1, es_array[iBase_EDGE], &temp_es2, &result ); 00947 if( iBase_SUCCESS != result ) 00948 { 00949 printf( "Failed to subtract entitysets in entity_sets_test.\n" ); 00950 free( edges ); 00951 free( faces ); 00952 return FALSE; 00953 } 00954 00955 temp_entities1 = NULL; 00956 temp_entities1_alloc = 0; 00957 iMesh_getEntities( mesh, temp_es2, iBase_FACE, iMesh_ALL_TOPOLOGIES, &temp_entities1, &temp_entities1_alloc, 00958 &temp_entities1_size, &result ); 00959 if( iBase_SUCCESS != result ) 00960 { 00961 printf( "Failed to get face entities in entity_sets_test.\n" ); 00962 free( edges ); 00963 free( faces ); 00964 return FALSE; 00965 } 00966 00967 if( faces_size != temp_entities1_size ) 00968 { 00969 printf( "not match number of entitysets after subtraction " 00970 "in entity_sets_test.\n" ); 00971 free( edges ); 00972 free( faces ); 00973 free( temp_entities1 ); 00974 return FALSE; 00975 } 00976 00977 /* check there's nothing but faces in face_es */ 00978 types = NULL; 00979 types_alloc = 0; 00980 iMesh_getEntArrType( mesh, temp_entities1, temp_entities1_size, &types, &types_alloc, &types_size, &result ); 00981 if( iBase_SUCCESS != result ) 00982 { 00983 printf( "Failed to get types of entities in entity_sets_test.\n" ); 00984 free( edges ); 00985 free( faces ); 00986 free( temp_entities1 ); 00987 return FALSE; 00988 } 00989 for( i = 0; i < types_size; i++ ) 00990 { 00991 if( types[i] != iBase_FACE ) 00992 { 00993 printf( "wrong entity type for face test in entity_sets_test.\n" ); 00994 free( edges ); 00995 free( faces ); 00996 free( temp_entities1 ); 00997 free( types ); 00998 return FALSE; 00999 } 01000 } 01001 01002 iMesh_destroyEntSet( mesh, temp_es2, &result ); 01003 if( iBase_SUCCESS != result ) 01004 { 01005 printf( "Failed to destroy temp es2.\n" ); 01006 free( edges ); 01007 free( faces ); 01008 free( temp_entities1 ); 01009 free( types ); 01010 return FALSE; 01011 } 01012 01013 if( !check_esets( mesh, n_whole_mesh + num_type + 2 ) ) 01014 { 01015 free( edges ); 01016 free( faces ); 01017 free( temp_entities1 ); 01018 free( types ); 01019 return FALSE; 01020 } 01021 01022 /*------------Intersect------------ */ 01023 01024 /* clean out the temp_ms1 */ 01025 iMesh_rmvEntArrFromSet( mesh, faces, faces_size, temp_es1, &result ); 01026 if( iBase_SUCCESS != result ) 01027 { 01028 printf( "Failed to remove face entities in entity_sets_test.\n" ); 01029 free( edges ); 01030 free( faces ); 01031 free( temp_entities1 ); 01032 free( types ); 01033 return FALSE; 01034 } 01035 01036 /* check if it is really cleaned out */ 01037 iMesh_getNumOfType( mesh, temp_es1, iBase_FACE, &num_rest, &result ); 01038 if( iBase_SUCCESS != result ) 01039 { 01040 printf( "Failed to get number of entities by type in entity_sets_test.\n" ); 01041 free( edges ); 01042 free( faces ); 01043 free( temp_entities1 ); 01044 free( types ); 01045 return FALSE; 01046 } 01047 01048 if( num_rest != 0 ) 01049 { 01050 printf( "failed to remove correctly.\n" ); 01051 free( edges ); 01052 free( faces ); 01053 free( temp_entities1 ); 01054 free( types ); 01055 return FALSE; 01056 } 01057 01058 /* add EDGEs to temp es1 */ 01059 iMesh_addEntArrToSet( mesh, edges, edges_size, temp_es1, &result ); 01060 if( iBase_SUCCESS != result ) 01061 { 01062 printf( "Failed to add edge entities in entity_sets_test.\n" ); 01063 free( edges ); 01064 free( faces ); 01065 free( temp_entities1 ); 01066 free( types ); 01067 return FALSE; 01068 } 01069 01070 /* add FACEs to temp es1 */ 01071 iMesh_addEntArrToSet( mesh, faces, faces_size, temp_es1, &result ); 01072 if( iBase_SUCCESS != result ) 01073 { 01074 printf( "Failed to add edge entities in entity_sets_test.\n" ); 01075 free( edges ); 01076 free( faces ); 01077 free( temp_entities1 ); 01078 free( types ); 01079 return FALSE; 01080 } 01081 01082 /* intersect temp_es1 with edges meshset */ 01083 /* temp_ms1 entityset is altered */ 01084 iMesh_intersect( mesh, temp_es1, es_array[iBase_EDGE], &temp_es2, &result ); 01085 if( iBase_SUCCESS != result ) 01086 { 01087 printf( "Failed to intersect in entity_sets_test.\n" ); 01088 free( edges ); 01089 free( faces ); 01090 free( temp_entities1 ); 01091 free( types ); 01092 return FALSE; 01093 } 01094 01095 temp_entities2 = NULL; 01096 temp_entities2_alloc = 0; 01097 iMesh_getEntities( mesh, temp_es2, iBase_FACE, iMesh_ALL_TOPOLOGIES, &temp_entities2, &temp_entities2_alloc, 01098 &temp_entities2_size, &result ); 01099 if( iBase_SUCCESS != result ) 01100 { 01101 printf( "Failed to get face entities in entity_sets_test.\n" ); 01102 free( edges ); 01103 free( faces ); 01104 free( temp_entities1 ); 01105 free( types ); 01106 return FALSE; 01107 } 01108 01109 if( temp_entities2_size != 0 ) 01110 { 01111 printf( "wrong number of faces.\n" ); 01112 free( edges ); 01113 free( faces ); 01114 free( temp_entities1 ); 01115 free( temp_entities2 ); 01116 free( types ); 01117 return FALSE; 01118 } 01119 01120 iMesh_destroyEntSet( mesh, temp_es2, &result ); 01121 if( iBase_SUCCESS != result ) 01122 { 01123 printf( "Failed to destroy temp es2.\n" ); 01124 free( edges ); 01125 free( faces ); 01126 free( temp_entities1 ); 01127 free( temp_entities2 ); 01128 free( types ); 01129 return FALSE; 01130 } 01131 01132 if( !check_esets( mesh, n_whole_mesh + num_type + 2 ) ) 01133 { 01134 free( edges ); 01135 free( faces ); 01136 free( temp_entities1 ); 01137 free( temp_entities2 ); 01138 free( types ); 01139 return FALSE; 01140 } 01141 01142 /*-------------Unite-------------- */ 01143 01144 iMesh_createEntSet( mesh, is_list, &temp_es2, &result ); 01145 if( iBase_SUCCESS != result ) 01146 { 01147 printf( "Failed to create a temp entityset in entity_sets_test.\n" ); 01148 free( edges ); 01149 free( faces ); 01150 free( temp_entities1 ); 01151 free( temp_entities2 ); 01152 free( types ); 01153 return FALSE; 01154 } 01155 01156 /* get all regions */ 01157 regions = NULL; 01158 regions_alloc = 0; 01159 iMesh_getEntities( mesh, es_array[iBase_REGION], iBase_REGION, iMesh_ALL_TOPOLOGIES, ®ions, ®ions_alloc, 01160 ®ions_size, &result ); 01161 if( iBase_SUCCESS != result ) 01162 { 01163 printf( "Failed to get region entities in entity_sets_test.\n" ); 01164 free( edges ); 01165 free( faces ); 01166 free( temp_entities1 ); 01167 free( temp_entities2 ); 01168 free( types ); 01169 return FALSE; 01170 } 01171 01172 /* add REGIONs to temp es2 */ 01173 iMesh_addEntArrToSet( mesh, regions, regions_size, temp_es2, &result ); 01174 if( iBase_SUCCESS != result ) 01175 { 01176 printf( "Failed to add region entities in entity_sets_test.\n" ); 01177 free( edges ); 01178 free( faces ); 01179 free( temp_entities1 ); 01180 free( temp_entities2 ); 01181 free( types ); 01182 free( regions ); 01183 return FALSE; 01184 } 01185 01186 /* unite temp_es1 and temp_es2 */ 01187 iMesh_unite( mesh, temp_es1, temp_es2, &temp_es3, &result ); 01188 if( iBase_SUCCESS != result ) 01189 { 01190 printf( "Failed to unite in entity_sets_test.\n" ); 01191 free( edges ); 01192 free( faces ); 01193 free( temp_entities1 ); 01194 free( temp_entities2 ); 01195 free( types ); 01196 free( regions ); 01197 return FALSE; 01198 } 01199 01200 /* perform the check */ 01201 iMesh_getNumOfType( mesh, temp_es3, iBase_REGION, &num_regions, &result ); 01202 if( iBase_SUCCESS != result ) 01203 { 01204 printf( "Failed to get number of region entities by type in entity_sets_test.\n" ); 01205 free( edges ); 01206 free( faces ); 01207 free( temp_entities1 ); 01208 free( temp_entities2 ); 01209 free( types ); 01210 free( regions ); 01211 return FALSE; 01212 } 01213 01214 if( num_regions != number_array[iBase_REGION] ) 01215 { 01216 printf( "different number of regions in entity_sets_test.\n" ); 01217 free( edges ); 01218 free( faces ); 01219 free( temp_entities1 ); 01220 free( temp_entities2 ); 01221 free( types ); 01222 free( regions ); 01223 return FALSE; 01224 } 01225 01226 if( !check_esets( mesh, n_whole_mesh + num_type + 4 ) ) 01227 { 01228 free( edges ); 01229 free( faces ); 01230 free( temp_entities1 ); 01231 free( temp_entities2 ); 01232 free( types ); 01233 free( regions ); 01234 return FALSE; 01235 } 01236 01237 /*--------Test parent/child stuff in entiysets----------- */ 01238 01239 /* Add 2 meshsets as children to another */ 01240 iMesh_createEntSet( mesh, is_list, &parent_child, &result ); 01241 if( iBase_SUCCESS != result ) 01242 { 01243 printf( "Problem creating entityset in entity_sets_test.\n" ); 01244 free( edges ); 01245 free( faces ); 01246 free( temp_entities1 ); 01247 free( temp_entities2 ); 01248 free( types ); 01249 free( regions ); 01250 return FALSE; 01251 } 01252 01253 iMesh_addPrntChld( mesh, es_array[iBase_VERTEX], parent_child, &result ); 01254 if( iBase_SUCCESS != result ) 01255 { 01256 printf( "Problem add parent in entity_sets_test.\n" ); 01257 free( edges ); 01258 free( faces ); 01259 free( temp_entities1 ); 01260 free( temp_entities2 ); 01261 free( types ); 01262 free( regions ); 01263 return FALSE; 01264 } 01265 01266 /* check if parent is really added */ 01267 parents = NULL; 01268 parents_alloc = 0; 01269 iMesh_getPrnts( mesh, parent_child, 0, &parents, &parents_alloc, &parents_size, &result ); 01270 if( iBase_SUCCESS != result ) 01271 { 01272 printf( "Problem getting parents in entity_sets_test.\n" ); 01273 free( edges ); 01274 free( faces ); 01275 free( temp_entities1 ); 01276 free( temp_entities2 ); 01277 free( types ); 01278 free( regions ); 01279 return FALSE; 01280 } 01281 01282 if( parents_size != 1 ) 01283 { 01284 printf( "number of parents is not correct in entity_sets_test.\n" ); 01285 free( edges ); 01286 free( faces ); 01287 free( temp_entities1 ); 01288 free( temp_entities2 ); 01289 free( types ); 01290 free( regions ); 01291 free( parents ); 01292 return FALSE; 01293 } 01294 01295 /* get the number of child entitysets */ 01296 iMesh_getNumChld( mesh, es_array[iBase_VERTEX], 0, &temp_numb, &result ); 01297 if( iBase_SUCCESS != result ) 01298 { 01299 printf( "Problem getting number of children in entity_sets_test.\n" ); 01300 free( edges ); 01301 free( faces ); 01302 free( temp_entities1 ); 01303 free( temp_entities2 ); 01304 free( types ); 01305 free( regions ); 01306 free( parents ); 01307 return FALSE; 01308 } 01309 01310 if( temp_numb != 1 ) 01311 { 01312 printf( "number of children is not correct in entity_sets_test.\n" ); 01313 free( edges ); 01314 free( faces ); 01315 free( temp_entities1 ); 01316 free( temp_entities2 ); 01317 free( types ); 01318 free( regions ); 01319 free( parents ); 01320 return FALSE; 01321 } 01322 01323 /* parent_child and es_array[iBase_VERTEX] should be related */ 01324 is_child = 0; 01325 iMesh_isChildOf( mesh, es_array[iBase_VERTEX], parent_child, &is_child, &result ); 01326 if( iBase_SUCCESS != result ) 01327 { 01328 printf( "Problem checking relation in entity_sets_test.\n" ); 01329 free( edges ); 01330 free( faces ); 01331 free( temp_entities1 ); 01332 free( temp_entities2 ); 01333 free( types ); 01334 free( regions ); 01335 free( parents ); 01336 return FALSE; 01337 } 01338 if( !is_child ) 01339 { 01340 printf( "parent_child and es_array[iBase_VERTEX] should be related\n" ); 01341 free( edges ); 01342 free( faces ); 01343 free( temp_entities1 ); 01344 free( temp_entities2 ); 01345 free( types ); 01346 free( regions ); 01347 free( parents ); 01348 return FALSE; 01349 } 01350 01351 /* es_array[iBase_FACE] and es_array[iBase_REGION] are not related */ 01352 is_child = FALSE; 01353 iMesh_isChildOf( mesh, es_array[iBase_FACE], es_array[iBase_REGION], &is_child, &result ); 01354 if( iBase_SUCCESS != result ) 01355 { 01356 printf( "Problem checking relation in entity_sets_test.\n" ); 01357 free( edges ); 01358 free( faces ); 01359 free( temp_entities1 ); 01360 free( temp_entities2 ); 01361 free( types ); 01362 free( regions ); 01363 free( parents ); 01364 return FALSE; 01365 } 01366 if( is_child ) 01367 { 01368 printf( "es_array[iBase_REGION] and es_array[iBase_FACE] should not be related\n" ); 01369 free( edges ); 01370 free( faces ); 01371 free( temp_entities1 ); 01372 free( temp_entities2 ); 01373 free( types ); 01374 free( regions ); 01375 free( parents ); 01376 return FALSE; 01377 } 01378 01379 if( !check_esets( mesh, n_whole_mesh + num_type + 5 ) ) 01380 { 01381 free( edges ); 01382 free( faces ); 01383 free( temp_entities1 ); 01384 free( temp_entities2 ); 01385 free( types ); 01386 free( regions ); 01387 free( parents ); 01388 return FALSE; 01389 } 01390 01391 /*--------test modify and query functions----------------------------- */ 01392 01393 /* get all entity sets in super set */ 01394 es_array1 = NULL; 01395 es_array1_alloc = 0; 01396 iMesh_getEntSets( mesh, super_set, 0, &es_array1, &es_array1_alloc, &es_array1_size, &result ); 01397 if( iBase_SUCCESS != result ) 01398 { 01399 printf( "Problem to get entity sets in super set.\n" ); 01400 free( edges ); 01401 free( faces ); 01402 free( temp_entities1 ); 01403 free( temp_entities2 ); 01404 free( types ); 01405 free( regions ); 01406 free( parents ); 01407 return FALSE; 01408 } 01409 01410 /* get the number of entity sets in super set */ 01411 iMesh_getNumEntSets( mesh, super_set, 0, &num_super, &result ); 01412 if( iBase_SUCCESS != result ) 01413 { 01414 printf( "Problem to get the number of all entity sets in super set.\n" ); 01415 free( edges ); 01416 free( faces ); 01417 free( temp_entities1 ); 01418 free( temp_entities2 ); 01419 free( types ); 01420 free( regions ); 01421 free( parents ); 01422 free( es_array1 ); 01423 return FALSE; 01424 } 01425 01426 /* the number of entity sets in super set should be same */ 01427 if( num_super != es_array1_size ) 01428 { 01429 printf( "the number of entity sets in super set should be same.\n" ); 01430 return FALSE; 01431 } 01432 01433 /* get all entities in super set */ 01434 all_entities = NULL; 01435 all_entities_alloc = 0; 01436 iMesh_getEntities( mesh, super_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &all_entities, &all_entities_alloc, 01437 &all_entities_size, &result ); 01438 if( iBase_SUCCESS != result ) 01439 { 01440 printf( "Problem to get all entities in super set.\n" ); 01441 free( edges ); 01442 free( faces ); 01443 free( temp_entities1 ); 01444 free( temp_entities2 ); 01445 free( types ); 01446 free( regions ); 01447 free( parents ); 01448 free( es_array1 ); 01449 return FALSE; 01450 } 01451 01452 /* compare the number of all entities in super set */ 01453 /* NOTE: TEST COMMENTED OUT UNTIL RESOLUTION OF WHETHER GETENTITIES */ 01454 /* SHOULD GET A NUM_HOPS ARGUMENT */ 01455 /* if (num_all_entities_super != all_entities_size) { */ 01456 /* printf("number of all entities in super set should be same.\n"); */ 01457 /* return FALSE; */ 01458 /* } */ 01459 01460 /* test add, remove and get all entity sets using super set */ 01461 /* check GetAllEntitySets works recursively and dosen't return */ 01462 /* multi sets */ 01463 for( k = 0; k < num_super; k++ ) 01464 { 01465 /* add entity sets of super set to each entity set of super set */ 01466 /* make multiple child super sets */ 01467 iBase_EntitySetHandle es_k = es_array1[k]; 01468 for( l = 0; l < es_array1_size; l++ ) 01469 { 01470 iMesh_addEntSet( mesh, es_array1[l], es_k, &result ); 01471 if( iBase_SUCCESS != result ) 01472 { 01473 printf( "Problem to add entity set to entityset.\n" ); 01474 free( edges ); 01475 free( faces ); 01476 free( temp_entities1 ); 01477 free( temp_entities2 ); 01478 free( types ); 01479 free( regions ); 01480 free( parents ); 01481 free( es_array1 ); 01482 free( all_entities ); 01483 return FALSE; 01484 } 01485 } 01486 01487 /* add super set to each entity set */ 01488 iMesh_addEntSet( mesh, super_set, es_k, &result ); 01489 if( iBase_SUCCESS != result ) 01490 { 01491 printf( "Problem to add super set to entitysets.\n" ); 01492 free( edges ); 01493 free( faces ); 01494 free( temp_entities1 ); 01495 free( temp_entities2 ); 01496 free( types ); 01497 free( regions ); 01498 free( parents ); 01499 free( es_array1 ); 01500 free( all_entities ); 01501 return FALSE; 01502 } 01503 01504 /* add one entity sets multiple times */ 01505 for( l = 0; l < 3; l++ ) 01506 { 01507 iMesh_addEntSet( mesh, temp_es1, es_k, &result ); 01508 if( iBase_SUCCESS != result ) 01509 { 01510 printf( "Problem to add temp set to entitysets.\n" ); 01511 free( edges ); 01512 free( faces ); 01513 free( temp_entities1 ); 01514 free( temp_entities2 ); 01515 free( types ); 01516 free( regions ); 01517 free( parents ); 01518 free( es_array1 ); 01519 free( all_entities ); 01520 return FALSE; 01521 } 01522 } 01523 } 01524 01525 /* get all hexes and get faces of that hexes */ 01526 hexes = NULL; 01527 hexes_alloc = 0; 01528 01529 iMesh_getEntities( mesh, root_set, iBase_ALL_TYPES, iMesh_HEXAHEDRON, &hexes, &hexes_alloc, &hexes_size, &result ); 01530 if( iBase_SUCCESS != result ) 01531 { 01532 printf( "Failed to get hexes in entity_sets_test.\n" ); 01533 free( edges ); 01534 free( faces ); 01535 free( temp_entities1 ); 01536 free( temp_entities2 ); 01537 free( types ); 01538 free( regions ); 01539 free( parents ); 01540 free( es_array1 ); 01541 free( all_entities ); 01542 return FALSE; 01543 } 01544 01545 /* get adjacent face of hexes */ 01546 adj_faces = NULL; 01547 adj_faces_alloc = 0; 01548 face_offsets = NULL; 01549 face_offsets_alloc = 0; 01550 01551 iMesh_getEntArrAdj( mesh, hexes, hexes_size, iBase_FACE, &adj_faces, &adj_faces_alloc, &adj_faces_size, 01552 &face_offsets, &face_offsets_alloc, &face_offsets_size, &result ); 01553 if( iBase_SUCCESS != result ) 01554 { 01555 printf( "Problem to get adjacent entities in entitysets_test.\n" ); 01556 free( edges ); 01557 free( faces ); 01558 free( temp_entities1 ); 01559 free( temp_entities2 ); 01560 free( types ); 01561 free( regions ); 01562 free( parents ); 01563 free( es_array1 ); 01564 free( all_entities ); 01565 free( hexes ); 01566 return FALSE; 01567 } 01568 01569 iMesh_createEntSet( mesh, FALSE, &hex_set, &result ); 01570 if( iBase_SUCCESS != result ) 01571 { 01572 printf( "Problem creating entityset in entity_sets_test.\n" ); 01573 free( edges ); 01574 free( faces ); 01575 free( temp_entities1 ); 01576 free( temp_entities2 ); 01577 free( types ); 01578 free( regions ); 01579 free( parents ); 01580 free( es_array1 ); 01581 free( all_entities ); 01582 free( hexes ); 01583 free( adj_faces ); 01584 free( face_offsets ); 01585 return FALSE; 01586 } 01587 01588 iMesh_addEntArrToSet( mesh, hexes, hexes_size, hex_set, &result ); 01589 if( iBase_SUCCESS != result ) 01590 { 01591 printf( "Failed to add hexes in entity_sets_test.\n" ); 01592 free( edges ); 01593 free( faces ); 01594 free( temp_entities1 ); 01595 free( temp_entities2 ); 01596 free( types ); 01597 free( regions ); 01598 free( parents ); 01599 free( es_array1 ); 01600 free( all_entities ); 01601 free( hexes ); 01602 free( adj_faces ); 01603 free( face_offsets ); 01604 return FALSE; 01605 } 01606 01607 free( edges ); 01608 free( faces ); 01609 free( temp_entities1 ); 01610 free( temp_entities2 ); 01611 free( types ); 01612 free( regions ); 01613 free( parents ); 01614 free( es_array1 ); 01615 free( all_entities ); 01616 free( hexes ); 01617 free( adj_faces ); 01618 free( face_offsets ); 01619 01620 return TRUE; 01621 } 01622 01623 int check_esets( iMesh_Instance mesh, const int num_sets ) 01624 { 01625 int entity_sets_size; 01626 01627 int result; 01628 iMesh_getNumEntSets( mesh, root_set, 1, &entity_sets_size, &result ); 01629 if( iBase_SUCCESS != result ) 01630 { 01631 printf( "Problem to get all entity sets in mesh.\n" ); 01632 return FALSE; 01633 } 01634 if( entity_sets_size != num_sets ) 01635 { 01636 printf( "the number of entity sets in whole mesh should be %d" 01637 ", actual number is %d.\n", 01638 num_sets, entity_sets_size ); 01639 return FALSE; 01640 } 01641 01642 return TRUE; 01643 } 01644 01645 /*! 01646 @test 01647 TSTT entity sets Test 01648 @li Check entity sets 01649 */ 01650 int entity_sets_test( iMesh_Instance mesh ) 01651 { 01652 int iter_num = 0, result; 01653 /* check */ 01654 int i; 01655 for( i = 0; i < 2; i++ ) 01656 { 01657 iter_num++; 01658 01659 result = entity_sets_subtest( mesh, i, iter_num ); 01660 if( !result ) return result; 01661 } 01662 01663 return TRUE; 01664 } 01665 01666 /*! 01667 @test 01668 Vertex Coordinates 01669 @li Get coordinates of vertices by 2 different methods then compare them 01670 */ 01671 int vertex_coordinates_test( iMesh_Instance mesh ) 01672 { 01673 iBase_EntityHandle* verts = NULL; 01674 int verts_alloc = 0, verts_size; 01675 double* vert_coords = NULL; 01676 int vert_coords_alloc = 0, vert_coords_size; 01677 01678 /* check storage order */ 01679 int result; 01680 int this_order; 01681 iMesh_getDfltStorage( mesh, &this_order, &result ); 01682 if( iBase_SUCCESS != result ) 01683 { 01684 printf( "failed to get preferred storage order in vertex_coordinates_test.\n" ); 01685 return FALSE; 01686 } 01687 01688 /* now get the vertex coordinates from a vertex array */ 01689 /* need to get the vertices in the model */ 01690 verts = NULL; 01691 verts_alloc = 0; 01692 iMesh_getEntities( mesh, root_set, iBase_VERTEX, iMesh_POINT, &verts, &verts_alloc, &verts_size, &result ); 01693 if( iBase_SUCCESS != result ) 01694 { 01695 printf( "failed to get entities in vertex_coordinates_test.\n" ); 01696 return FALSE; 01697 } 01698 01699 /* get the coordinates in one array */ 01700 vert_coords = NULL; 01701 vert_coords_alloc = 0; 01702 01703 iMesh_getVtxArrCoords( mesh, verts, verts_size, iBase_INTERLEAVED, &vert_coords, &vert_coords_alloc, 01704 &vert_coords_size, &result ); 01705 if( iBase_SUCCESS != result ) 01706 { 01707 printf( "failed to get vertex cooridinate of entities in vertex_coordinates_test.\n" ); 01708 free( verts ); 01709 return FALSE; 01710 } 01711 01712 free( verts ); 01713 free( vert_coords ); 01714 01715 /* if we get here, this test was successful */ 01716 return TRUE; 01717 } 01718 01719 /*! 01720 @test 01721 TSTT Tag Info test 01722 @li Tests tagCreate, tagDelete, tagGetName, tagGetSize, tagGetHandle 01723 */ 01724 int tag_info_test( iMesh_Instance mesh ) 01725 { 01726 char dum_name[120]; 01727 int dum_name_size = 120; 01728 int dum_size; 01729 int error = FALSE; 01730 iBase_TagHandle dum_handle; 01731 /* Create a tag */ 01732 int result; 01733 iBase_TagHandle tag_handle = NULL; 01734 const char* tag_name = "int_tag"; 01735 int tag_name_size = 8; 01736 iMesh_createTag( mesh, tag_name, 1, iBase_INTEGER, &tag_handle, &result, tag_name_size ); 01737 if( iBase_SUCCESS != result ) 01738 { 01739 printf( "Failed to create tag int_tag in vertex_tag_test." ); 01740 return FALSE; 01741 } 01742 01743 /* check tag info functions */ 01744 iMesh_getTagName( mesh, tag_handle, dum_name, &result, dum_name_size ); 01745 if( iBase_SUCCESS != result ) 01746 { 01747 printf( "Couldn't get name of tag just created.\n" ); 01748 return FALSE; 01749 } 01750 if( strcmp( dum_name, "int_tag" ) != 0 ) 01751 { 01752 printf( "Tag names didn't match.\n" ); 01753 return FALSE; 01754 } 01755 01756 iMesh_getTagSizeBytes( mesh, tag_handle, &dum_size, &result ); 01757 if( iBase_SUCCESS != result ) 01758 { 01759 printf( "Couldn't get size of tag just created.\n" ); 01760 return FALSE; 01761 } 01762 if( dum_size != sizeof( int ) ) 01763 { 01764 printf( "Tag sizes didn't match.\n" ); 01765 return FALSE; 01766 } 01767 01768 iMesh_getTagHandle( mesh, tag_name, &dum_handle, &result, tag_name_size ); 01769 if( iBase_SUCCESS != result ) 01770 { 01771 printf( "Couldn't get handle of tag just created.\n" ); 01772 return FALSE; 01773 } 01774 if( dum_handle != tag_handle ) 01775 { 01776 printf( "Tag handles didn't match.\n" ); 01777 return FALSE; 01778 } 01779 01780 /* test non-forced version of tagDelete; forced version tested later, */ 01781 /* when we have entities around */ 01782 iMesh_destroyTag( mesh, tag_handle, FALSE, &result ); 01783 if( iBase_SUCCESS != result ) 01784 { 01785 printf( "Couldn't delete tag just created.\n" ); 01786 return FALSE; 01787 } 01788 01789 /* look for that tag, to make sure it got deleted */ 01790 iMesh_getTagHandle( mesh, tag_name, &tag_handle, &result, tag_name_size ); 01791 if( iBase_SUCCESS != result ) 01792 { 01793 error = TRUE; 01794 } 01795 if( !error ) 01796 { 01797 printf( "tagGetHandle was able to find handle for deleted tag.\n" ); 01798 return FALSE; 01799 } 01800 01801 return TRUE; 01802 } 01803 01804 int vertex_int_tag_test( iMesh_Instance mesh, iBase_EntityHandle* verts, int /*verts_size*/, iBase_TagHandle* int_tag ) 01805 { 01806 int result; 01807 iBase_EntityHandle dum_vert = verts[0]; 01808 01809 int dum_val = 11, dum_val2; 01810 void* dum_val2_ptr = &dum_val2; 01811 int dum_val2_alloc = sizeof( int ), dum_val2_size; 01812 01813 /* create a tag */ 01814 const char* tag_name = "int_tag"; 01815 int tag_name_size = 8; 01816 iMesh_createTag( mesh, tag_name, 1, iBase_INTEGER, int_tag, &result, tag_name_size ); 01817 if( iBase_SUCCESS != result ) 01818 { 01819 printf( "Failed to create tag int_tag in vertex_int_tag_test.\n" ); 01820 return FALSE; 01821 } 01822 01823 /* put a value in the first vertex and retrieve */ 01824 iMesh_setArrData( mesh, &dum_vert, 1, *int_tag, (const char*)( &dum_val ), sizeof( int ), &result ); 01825 if( iBase_SUCCESS != result ) 01826 { 01827 printf( "Failed to set int tag (val=11) in vertex_int_tag_test.\n" ); 01828 return FALSE; 01829 } 01830 01831 iMesh_getArrData( mesh, &dum_vert, 1, *int_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 01832 if( iBase_SUCCESS != result || dum_val2 != 11 ) 01833 { 01834 printf( "Failed to get int tag (val=11) in vertex_int_tag_test.\n" ); 01835 return FALSE; 01836 } 01837 01838 if( dum_val2 != 11 ) 01839 { 01840 01841 printf( "Value of vertex tag (val=11) wrong.\n" ); 01842 return FALSE; 01843 } 01844 01845 /* put a value in the last vertex and retrieve */ 01846 dum_val = 12; 01847 01848 iMesh_setArrData( mesh, &dum_vert, 1, *int_tag, (char*)( &dum_val ), sizeof( int ), &result ); 01849 if( iBase_SUCCESS != result ) 01850 { 01851 printf( "Failed to set int tag (val=12) in vertex_int_tag_test.\n" ); 01852 return FALSE; 01853 } 01854 01855 iMesh_getArrData( mesh, &dum_vert, 1, *int_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 01856 if( iBase_SUCCESS != result ) 01857 { 01858 printf( "Failed to get int tag (val=12) in vertex_int_tag_test.\n" ); 01859 return FALSE; 01860 } 01861 01862 if( dum_val2 != 12 ) 01863 { 01864 01865 printf( "Value of vertex tag (val=12) wrong.\n" ); 01866 return FALSE; 01867 } 01868 01869 /* ok, the int tag test worked */ 01870 return TRUE; 01871 } 01872 01873 int vertex_double_tag_test( iMesh_Instance mesh, 01874 iBase_EntityHandle* verts, 01875 int /*verts_size*/, 01876 iBase_TagHandle* double_tag ) 01877 { 01878 int result; 01879 01880 iBase_EntityHandle dum_vert = verts[0]; 01881 double dum_val = 1.0e6, dum_val2; 01882 void* dum_val2_ptr = &dum_val2; 01883 int dum_val2_alloc = sizeof( double ), dum_val2_size; 01884 01885 /* create a tag */ 01886 const char* tag_name = "double_tag"; 01887 int tag_name_size = 11; 01888 iMesh_createTag( mesh, tag_name, 1, iBase_DOUBLE, double_tag, &result, tag_name_size ); 01889 if( iBase_SUCCESS != result ) 01890 { 01891 printf( "Failed to create tag double_tag in vertex_double_tag_test.\n" ); 01892 return FALSE; 01893 } 01894 01895 /* put a value in the first vertex and retrieve */ 01896 iMesh_setArrData( mesh, &dum_vert, 1, *double_tag, (char*)( &dum_val ), sizeof( double ), &result ); 01897 if( iBase_SUCCESS != result ) 01898 { 01899 printf( "Failed to set double tag (val=1.0e6) in vertex_double_tag_test.\n" ); 01900 return FALSE; 01901 } 01902 01903 iMesh_getArrData( mesh, &dum_vert, 1, *double_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 01904 if( iBase_SUCCESS != result ) 01905 { 01906 printf( "Failed to get double tag (val=1.0e6) in vertex_double_tag_test.\n" ); 01907 return FALSE; 01908 } 01909 01910 if( dum_val2 != 1.0e6 ) 01911 { 01912 printf( "Value of vertex tag (val=1.0e6) wrong.\n" ); 01913 return FALSE; 01914 } 01915 01916 /* put a value in the last vertex and retrieve */ 01917 dum_val = 2.0e9; 01918 01919 iMesh_setArrData( mesh, &dum_vert, 1, *double_tag, (char*)( &dum_val ), sizeof( double ), &result ); 01920 if( iBase_SUCCESS != result ) 01921 { 01922 printf( "Failed to set double tag (val=2.0e9) in vertex_double_tag_test.\n" ); 01923 return FALSE; 01924 } 01925 01926 iMesh_getArrData( mesh, &dum_vert, 1, *double_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 01927 if( iBase_SUCCESS != result ) 01928 { 01929 printf( "Failed to get double tag (val=2.0e9) in vertex_double_tag_test.\n" ); 01930 return FALSE; 01931 } 01932 01933 if( dum_val2 != 2.0e9 ) 01934 { 01935 printf( "Value of vertex tag (val=2.0e9) wrong.\n" ); 01936 return FALSE; 01937 } 01938 01939 /* ok, the double tag test worked */ 01940 return TRUE; 01941 } 01942 01943 /* Add a struct Vertex Tag to the database */ 01944 struct TagStruct 01945 { 01946 double test_double; 01947 int test_int1, test_int2; 01948 }; 01949 01950 int vertex_struct_tag_test( iMesh_Instance mesh, 01951 iBase_EntityHandle* verts, 01952 int /*verts_size*/, 01953 iBase_TagHandle* struct_tag ) 01954 { 01955 int result; 01956 iBase_EntityHandle dum_vert = verts[0]; 01957 struct TagStruct dum_struct = { 3.0e12, 2, 3 }, dum_struct2; 01958 void* dum_struct2_ptr = &dum_struct2; 01959 int dum_struct_alloc = sizeof( struct TagStruct ), dum_struct_size; 01960 01961 /* create a tag */ 01962 const char* tag_name = "struct_tag"; 01963 int tag_name_size = 11; 01964 iMesh_createTag( mesh, tag_name, sizeof( struct TagStruct ), iBase_BYTES, struct_tag, &result, tag_name_size ); 01965 if( iBase_SUCCESS != result ) 01966 { 01967 printf( "Failed to create tag struct_tag in vertex_struct_tag_test.\n" ); 01968 return FALSE; 01969 } 01970 01971 /* put a value in the first vertex and retrieve */ 01972 01973 /* careful setting the value, since tags are opaque */ 01974 iMesh_setArrData( mesh, &dum_vert, 1, *struct_tag, (const char*)&dum_struct, sizeof( struct TagStruct ), &result ); 01975 if( iBase_SUCCESS != result ) 01976 { 01977 printf( "Failed to set struct tag in vertex_struct_tag_test.\n" ); 01978 return FALSE; 01979 } 01980 01981 iMesh_getArrData( mesh, &dum_vert, 1, *struct_tag, &dum_struct2_ptr, &dum_struct_alloc, &dum_struct_size, &result ); 01982 if( iBase_SUCCESS != result ) 01983 { 01984 printf( "Failed to get struct tag in vertex_struct_tag_test.\n" ); 01985 return FALSE; 01986 } 01987 01988 if( dum_struct_size != sizeof( struct TagStruct ) ) 01989 { 01990 printf( "Size of vertex struct tag wrong.\n" ); 01991 return FALSE; 01992 } 01993 if( dum_struct2.test_int1 != dum_struct.test_int1 || dum_struct2.test_int2 != dum_struct.test_int2 || 01994 dum_struct2.test_double != dum_struct.test_double ) 01995 { 01996 printf( "Value of vertex struct tag wrong.\n" ); 01997 return FALSE; 01998 } 01999 02000 /* ok, the int tag test worked */ 02001 return TRUE; 02002 } 02003 02004 int vertex_tag_delete_test( iMesh_Instance mesh, iBase_EntityHandle* verts, int /*verts_size*/ ) 02005 { 02006 int result; 02007 int delete_err = FALSE; 02008 02009 /* test forced, unforced deletion of tags from entities */ 02010 02011 /* test getAlliBase_TagHandles for first entity */ 02012 iBase_TagHandle* all_tags = NULL; 02013 iBase_EntityHandle dum_entity = verts[0]; 02014 int all_tags_alloc = 0, all_tags_size; 02015 iMesh_getAllTags( mesh, verts[0], &all_tags, &all_tags_alloc, &all_tags_size, &result ); 02016 if( iBase_SUCCESS != result ) 02017 { 02018 printf( "Couldn't get all tag handles from vertex.\n" ); 02019 return FALSE; 02020 } 02021 02022 iMesh_rmvArrTag( mesh, &dum_entity, 1, all_tags[0], &result ); 02023 if( iBase_SUCCESS != result ) 02024 { 02025 printf( "Couldn't remove tag from vertex.\n" ); 02026 free( all_tags ); 02027 return FALSE; 02028 } 02029 02030 iMesh_destroyTag( mesh, all_tags[1], FALSE, &result ); 02031 if( iBase_SUCCESS != result ) 02032 { 02033 delete_err = TRUE; 02034 } 02035 if( !delete_err ) 02036 { 02037 printf( "Error when unforced-deleting tag in use on a vertex.\n" ); 02038 free( all_tags ); 02039 return FALSE; 02040 } 02041 02042 iMesh_destroyTag( mesh, all_tags[1], TRUE, &result ); 02043 if( iBase_SUCCESS != result ) 02044 { 02045 printf( "Couldn't force-delete a tag in use on a vertex.\n" ); 02046 free( all_tags ); 02047 return FALSE; 02048 } 02049 02050 free( all_tags ); 02051 02052 /* ok, we're done */ 02053 return TRUE; 02054 } 02055 02056 int vertex_tag_test( iMesh_Instance mesh ) 02057 { 02058 int result; 02059 02060 iBase_TagHandle int_tag, double_tag, struct_tag; 02061 int int_err, double_err, struct_err, tag_delete_err; 02062 02063 int info_err = tag_info_test( mesh ); 02064 02065 /* get all the vertices */ 02066 iBase_EntityHandle* verts = NULL; 02067 int verts_alloc = 0, verts_size; 02068 iMesh_getEntities( mesh, root_set, iBase_ALL_TYPES, iMesh_POINT, &verts, &verts_alloc, &verts_size, &result ); 02069 if( iBase_SUCCESS != result ) 02070 { 02071 printf( "entitysetGetEntities failed in vertex_tag_test.\n" ); 02072 return FALSE; 02073 } 02074 02075 /* vertex int tag */ 02076 int_err = vertex_int_tag_test( mesh, verts, verts_size, &int_tag ); 02077 02078 /* vertex double tag */ 02079 double_err = vertex_double_tag_test( mesh, verts, verts_size, &double_tag ); 02080 02081 /* vertex struct tag */ 02082 struct_err = vertex_struct_tag_test( mesh, verts, verts_size, &struct_tag ); 02083 02084 tag_delete_err = vertex_tag_delete_test( mesh, verts, verts_size ); 02085 02086 free( verts ); 02087 02088 return ( info_err && int_err && double_err && struct_err && tag_delete_err ); 02089 } 02090 02091 int entityset_int_tag_test( iMesh_Instance mesh, iBase_EntitySetHandle* sets, int sets_size, iBase_TagHandle* int_tag ) 02092 { 02093 int result; 02094 int dum_val = 11, dum_val2; 02095 void* dum_val2_ptr = &dum_val2; 02096 int dum_val2_alloc = sizeof( int ), dum_val2_size; 02097 02098 /* create a tag */ 02099 const char* tag_name = "set_int_tag"; 02100 iMesh_createTag( mesh, tag_name, 1, iBase_INTEGER, int_tag, &result, 12 ); 02101 if( iBase_SUCCESS != result ) 02102 { 02103 printf( "Failed to create tag int_tag in entityset_int_tag_test.\n" ); 02104 return FALSE; 02105 } 02106 02107 /* put a value in the first set and retrieve */ 02108 02109 iMesh_setEntSetData( mesh, sets[0], *int_tag, (char*)( &dum_val ), sizeof( int ), &result ); 02110 if( iBase_SUCCESS != result ) 02111 { 02112 printf( "Failed to set int tag (val=11) in entityset_int_tag_test.\n" ); 02113 return FALSE; 02114 } 02115 02116 dum_val2 = 0; 02117 iMesh_getEntSetData( mesh, sets[0], *int_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02118 if( iBase_SUCCESS != result ) 02119 { 02120 printf( "Failed to get int tag (val=11) in entityset_int_tag_test." ); 02121 return FALSE; 02122 } 02123 02124 if( dum_val2 != 11 ) 02125 { 02126 printf( "Value of entityset tag (val=11) wrong.\n" ); 02127 return FALSE; 02128 } 02129 02130 /* put a value in the last faces and retrieve */ 02131 dum_val = 12; 02132 iMesh_setEntSetData( mesh, sets[sets_size - 1], *int_tag, (char*)( &dum_val ), sizeof( int ), &result ); 02133 if( iBase_SUCCESS != result ) 02134 { 02135 printf( "Failed to set int tag (val=12) in entityset_int_tag_test." ); 02136 return FALSE; 02137 } 02138 02139 iMesh_getEntSetData( mesh, sets[sets_size - 1], *int_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02140 if( iBase_SUCCESS != result ) 02141 { 02142 printf( "Failed to get int tag (val=12) in entityset_int_tag_test." ); 02143 return FALSE; 02144 } 02145 02146 if( dum_val2 != 12 ) 02147 { 02148 printf( "Value of entityset tag (val=12) wrong.\n" ); 02149 return FALSE; 02150 } 02151 02152 /* ok, the int tag test worked */ 02153 return TRUE; 02154 } 02155 02156 int entityset_double_tag_test( iMesh_Instance mesh, 02157 iBase_EntitySetHandle* sets, 02158 int sets_size, 02159 iBase_TagHandle* double_tag ) 02160 { 02161 int result; 02162 double dum_val = 1.0e6, dum_val2; 02163 void* dum_val2_ptr = &dum_val2; 02164 int dum_val2_alloc = sizeof( double ), dum_val2_size; 02165 02166 /* create a tag */ 02167 const char* tag_name = "set_double_tag"; 02168 iMesh_createTag( mesh, tag_name, 1, iBase_DOUBLE, double_tag, &result, 15 ); 02169 if( iBase_SUCCESS != result ) 02170 { 02171 printf( "Failed to create tag double_tag in entityset_double_tag_test.\n" ); 02172 return FALSE; 02173 } 02174 02175 /* put a value in the first set and retrieve */ 02176 02177 iMesh_setEntSetData( mesh, sets[0], *double_tag, (char*)( &dum_val ), sizeof( double ), &result ); 02178 if( iBase_SUCCESS != result ) 02179 { 02180 printf( "Failed to set double tag (val=11) in entityset_double_tag_test.\n" ); 02181 return FALSE; 02182 } 02183 02184 dum_val2 = 0; 02185 iMesh_getEntSetData( mesh, sets[0], *double_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02186 if( iBase_SUCCESS != result ) 02187 { 02188 printf( "Failed to get double tag (val=1.0e6) in entityset_double_tag_test." ); 02189 return FALSE; 02190 } 02191 02192 if( dum_val2 != 1.0e6 ) 02193 { 02194 printf( "Value of entityset tag (val=11) wrong.\n" ); 02195 return FALSE; 02196 } 02197 02198 /* put a value in the last faces and retrieve */ 02199 dum_val = 2.0e9; 02200 iMesh_setEntSetData( mesh, sets[sets_size - 1], *double_tag, (char*)( &dum_val ), sizeof( double ), &result ); 02201 if( iBase_SUCCESS != result ) 02202 { 02203 printf( "Failed to set double tag (val=2.0e9) in entityset_double_tag_test." ); 02204 return FALSE; 02205 } 02206 02207 iMesh_getEntSetData( mesh, sets[sets_size - 1], *double_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, 02208 &result ); 02209 if( iBase_SUCCESS != result ) 02210 { 02211 printf( "Failed to get double tag (val=2.0e9) in entityset_double_tag_test." ); 02212 return FALSE; 02213 } 02214 02215 if( dum_val2 != 2.0e9 ) 02216 { 02217 printf( "Value of entityset tag (val=2.0e9) wrong.\n" ); 02218 return FALSE; 02219 } 02220 02221 /* ok, the double tag test worked */ 02222 return TRUE; 02223 } 02224 02225 int entityset_struct_tag_test( iMesh_Instance mesh, 02226 iBase_EntitySetHandle* /*sets*/, 02227 int /*sets_size*/, 02228 iBase_TagHandle* struct_tag ) 02229 { 02230 int result; 02231 struct TagStruct dum_struct = { 3.0e12, 2, 3 }, dum_struct2; 02232 void* dum_struct2_ptr = &dum_struct2; 02233 int dum_struct_alloc = sizeof( struct TagStruct ), dum_struct_size; 02234 02235 /* create a tag */ 02236 const char* tag_name = "set_struct_tag"; 02237 iMesh_createTag( mesh, tag_name, sizeof( struct TagStruct ), iBase_BYTES, struct_tag, &result, 11 ); 02238 if( iBase_SUCCESS != result ) 02239 { 02240 printf( "Failed to create tag struct_tag in entityset_struct_tag_test.\n" ); 02241 return FALSE; 02242 } 02243 02244 /* put a value in the first vertex and retrieve */ 02245 02246 /* careful setting the value, since tags are opaque */ 02247 iMesh_setEntSetData( mesh, root_set, *struct_tag, (const char*)&dum_struct, sizeof( struct TagStruct ), &result ); 02248 if( iBase_SUCCESS != result ) 02249 { 02250 printf( "Failed to set struct tag in entityset_struct_tag_test.\n" ); 02251 return FALSE; 02252 } 02253 02254 iMesh_getEntSetData( mesh, root_set, *struct_tag, &dum_struct2_ptr, &dum_struct_alloc, &dum_struct_size, &result ); 02255 if( iBase_SUCCESS != result ) 02256 { 02257 printf( "Failed to get struct tag in entityset_struct_tag_test.\n" ); 02258 return FALSE; 02259 } 02260 02261 if( dum_struct_size != sizeof( struct TagStruct ) ) 02262 { 02263 printf( "Size of entityset struct tag wrong.\n" ); 02264 return FALSE; 02265 } 02266 if( dum_struct2.test_int1 != dum_struct.test_int1 || dum_struct2.test_int2 != dum_struct.test_int2 || 02267 dum_struct2.test_double != dum_struct.test_double ) 02268 { 02269 printf( "Value of entityset struct tag wrong.\n" ); 02270 return FALSE; 02271 } 02272 02273 /* ok, the int tag test worked */ 02274 return TRUE; 02275 } 02276 02277 int entityset_tag_delete_test( iMesh_Instance mesh, iBase_EntitySetHandle* sets, int sets_size ) 02278 { 02279 /* test forced, unforced deletion of tags from entities */ 02280 int result; 02281 int delete_err = FALSE; 02282 02283 /* test getAlliBase_TagHandles for first entity */ 02284 iBase_TagHandle* all_tags = NULL; 02285 if( sets_size < 1 ) 02286 { 02287 printf( "no sets.\n" ); 02288 return FALSE; 02289 } 02290 iBase_EntitySetHandle dum_entity = sets[0]; 02291 int all_tags_alloc = 0, all_tags_size; 02292 iMesh_getAllEntSetTags( mesh, sets[0], &all_tags, &all_tags_alloc, &all_tags_size, &result ); 02293 if( iBase_SUCCESS != result ) 02294 { 02295 printf( "Couldn't get all tag handles from entityset.\n" ); 02296 free( all_tags ); 02297 return FALSE; 02298 } 02299 02300 iMesh_rmvEntSetTag( mesh, dum_entity, all_tags[0], &result ); 02301 if( iBase_SUCCESS != result ) 02302 { 02303 printf( "Couldn't remove tag from entityset.\n" ); 02304 free( all_tags ); 02305 return FALSE; 02306 } 02307 02308 iMesh_destroyTag( mesh, all_tags[1], FALSE, &result ); 02309 if( iBase_SUCCESS != result ) 02310 { 02311 delete_err = TRUE; 02312 } 02313 if( !delete_err ) 02314 { 02315 printf( "Error when unforced-deleting tag in use on a entityset.\n" ); 02316 free( all_tags ); 02317 return FALSE; 02318 } 02319 02320 iMesh_destroyTag( mesh, all_tags[1], TRUE, &result ); 02321 if( iBase_SUCCESS != result ) 02322 { 02323 printf( "Couldn't force-delete a tag in use on a entityset.\n" ); 02324 free( all_tags ); 02325 return FALSE; 02326 } 02327 02328 free( all_tags ); 02329 02330 /* ok, we're done */ 02331 return TRUE; 02332 } 02333 02334 /*! 02335 @test 02336 TSTT entityset tag Test 02337 @li Check entityset tags 02338 */ 02339 int entityset_tag_test( iMesh_Instance mesh ) 02340 { 02341 int result; 02342 iBase_TagHandle int_tag, double_tag, struct_tag; 02343 int int_success, double_success, struct_success, tag_delete_success; 02344 02345 /* get the sets */ 02346 iBase_EntitySetHandle* esets = NULL; 02347 int esets_alloc = 0, esets_size; 02348 iMesh_getEntSets( mesh, root_set, 1, &esets, &esets_alloc, &esets_size, &result ); 02349 if( iBase_SUCCESS != result ) 02350 { 02351 printf( "entitysetGetEntities failed in entityset_tag_test.\n" ); 02352 free( esets ); 02353 return FALSE; 02354 } 02355 02356 /* entityset int tag */ 02357 int_success = entityset_int_tag_test( mesh, esets, esets_size, &int_tag ); 02358 02359 /* entityeset double tag */ 02360 double_success = entityset_double_tag_test( mesh, esets, esets_size, &double_tag ); 02361 02362 /* entityset struct tag */ 02363 struct_success = entityset_struct_tag_test( mesh, esets, esets_size, &struct_tag ); 02364 02365 tag_delete_success = entityset_tag_delete_test( mesh, esets, esets_size ); 02366 02367 free( esets ); 02368 02369 return ( int_success && double_success && struct_success && tag_delete_success ); 02370 } 02371 02372 int mesh_int_tag_test( iMesh_Instance mesh, iBase_TagHandle* int_tag ) 02373 { 02374 int result; 02375 int dum_val = 11, dum_val2; 02376 void* dum_val2_ptr = &dum_val2; 02377 int dum_val2_alloc = sizeof( int ), dum_val2_size; 02378 02379 /* create a tag */ 02380 const char* tag_name = "mesh_int_tag"; 02381 iMesh_createTag( mesh, tag_name, 1, iBase_INTEGER, int_tag, &result, 12 ); 02382 if( iBase_SUCCESS != result ) 02383 { 02384 printf( "Failed to create tag int_tag in mesh_int_tag_test.\n" ); 02385 return FALSE; 02386 } 02387 02388 /* put a value in the first set and retrieve */ 02389 02390 iMesh_setEntSetData( mesh, root_set, *int_tag, (char*)( &dum_val ), sizeof( int ), &result ); 02391 if( iBase_SUCCESS != result ) 02392 { 02393 printf( "Failed to set int tag (val=11) in mesh_int_tag_test.\n" ); 02394 return FALSE; 02395 } 02396 02397 dum_val2 = 0; 02398 iMesh_getEntSetData( mesh, root_set, *int_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02399 if( iBase_SUCCESS != result ) 02400 { 02401 printf( "Failed to get int tag (val=11) in mesh_int_tag_test." ); 02402 return FALSE; 02403 } 02404 02405 if( dum_val2 != 11 ) 02406 { 02407 printf( "Value of entityset tag (val=11) wrong.\n" ); 02408 return FALSE; 02409 } 02410 02411 /* put a value in the last faces and retrieve */ 02412 dum_val = 12; 02413 iMesh_setEntSetData( mesh, root_set, *int_tag, (char*)( &dum_val ), sizeof( int ), &result ); 02414 if( iBase_SUCCESS != result ) 02415 { 02416 printf( "Failed to set int tag (val=12) in mesh_int_tag_test." ); 02417 return FALSE; 02418 } 02419 02420 iMesh_getEntSetData( mesh, root_set, *int_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02421 if( iBase_SUCCESS != result ) 02422 { 02423 printf( "Failed to get int tag (val=12) in mesh_int_tag_test." ); 02424 return FALSE; 02425 } 02426 02427 if( dum_val2 != 12 ) 02428 { 02429 printf( "Value of entityset tag (val=12) wrong.\n" ); 02430 return FALSE; 02431 } 02432 02433 /* ok, the int tag test worked */ 02434 return TRUE; 02435 } 02436 02437 int mesh_double_tag_test( iMesh_Instance mesh, iBase_TagHandle* double_tag ) 02438 { 02439 int result; 02440 double dum_val = 1.0e6, dum_val2; 02441 void* dum_val2_ptr = &dum_val2; 02442 int dum_val2_alloc = sizeof( double ), dum_val2_size; 02443 02444 /* create a tag */ 02445 const char* tag_name = "mesh_double_tag"; 02446 iMesh_createTag( mesh, tag_name, 1, iBase_DOUBLE, double_tag, &result, 15 ); 02447 if( iBase_SUCCESS != result ) 02448 { 02449 printf( "Failed to create tag double_tag in mesh_double_tag_test.\n" ); 02450 return FALSE; 02451 } 02452 02453 /* put a value in the first set and retrieve */ 02454 02455 iMesh_setEntSetData( mesh, root_set, *double_tag, (char*)( &dum_val ), sizeof( double ), &result ); 02456 if( iBase_SUCCESS != result ) 02457 { 02458 printf( "Failed to set double tag (val=11) in mesh_double_tag_test.\n" ); 02459 return FALSE; 02460 } 02461 02462 dum_val2 = 0; 02463 iMesh_getEntSetData( mesh, root_set, *double_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02464 if( iBase_SUCCESS != result ) 02465 { 02466 printf( "Failed to get double tag (val=1.0e6) in mesh_double_tag_test." ); 02467 return FALSE; 02468 } 02469 02470 if( dum_val2 != 1.0e6 ) 02471 { 02472 printf( "Value of entityset tag (val=11) wrong.\n" ); 02473 return FALSE; 02474 } 02475 02476 /* put a value in the last faces and retrieve */ 02477 dum_val = 2.0e9; 02478 iMesh_setEntSetData( mesh, root_set, *double_tag, (char*)( &dum_val ), sizeof( double ), &result ); 02479 if( iBase_SUCCESS != result ) 02480 { 02481 printf( "Failed to set double tag (val=2.0e9) in mesh_double_tag_test." ); 02482 return FALSE; 02483 } 02484 02485 iMesh_getEntSetData( mesh, root_set, *double_tag, &dum_val2_ptr, &dum_val2_alloc, &dum_val2_size, &result ); 02486 if( iBase_SUCCESS != result ) 02487 { 02488 printf( "Failed to get double tag (val=2.0e9) in mesh_double_tag_test." ); 02489 return FALSE; 02490 } 02491 02492 if( dum_val2 != 2.0e9 ) 02493 { 02494 printf( "Value of entityset tag (val=2.0e9) wrong.\n" ); 02495 return FALSE; 02496 } 02497 02498 /* ok, the double tag test worked */ 02499 return TRUE; 02500 } 02501 02502 int mesh_struct_tag_test( iMesh_Instance mesh, iBase_TagHandle* struct_tag ) 02503 { 02504 int result; 02505 struct TagStruct dum_struct = { 3.0e12, 2, 3 }, dum_struct2; 02506 void* dum_struct2_ptr = &dum_struct2; 02507 int dum_struct_alloc = sizeof( struct TagStruct ), dum_struct_size; 02508 02509 /* create a tag */ 02510 const char* tag_name = "mesh_struct_tag"; 02511 iMesh_createTag( mesh, tag_name, sizeof( struct TagStruct ), iBase_BYTES, struct_tag, &result, 11 ); 02512 if( iBase_SUCCESS != result ) 02513 { 02514 printf( "Failed to create tag struct_tag in vertex_struct_tag_test.\n" ); 02515 return FALSE; 02516 } 02517 02518 /* put a value in the first vertex and retrieve */ 02519 02520 /* careful setting the value, since tags are opaque */ 02521 iMesh_setEntSetData( mesh, root_set, *struct_tag, (const char*)&dum_struct, sizeof( struct TagStruct ), &result ); 02522 if( iBase_SUCCESS != result ) 02523 { 02524 printf( "Failed to set struct tag in mesh_struct_tag_test.\n" ); 02525 return FALSE; 02526 } 02527 02528 iMesh_getEntSetData( mesh, root_set, *struct_tag, &dum_struct2_ptr, &dum_struct_alloc, &dum_struct_size, &result ); 02529 if( iBase_SUCCESS != result ) 02530 { 02531 printf( "Failed to get struct tag in mesh_struct_tag_test.\n" ); 02532 return FALSE; 02533 } 02534 02535 if( dum_struct_size != sizeof( struct TagStruct ) ) 02536 { 02537 printf( "Size of entityset struct tag wrong.\n" ); 02538 return FALSE; 02539 } 02540 if( dum_struct2.test_int1 != dum_struct.test_int1 || dum_struct2.test_int2 != dum_struct.test_int2 || 02541 dum_struct2.test_double != dum_struct.test_double ) 02542 { 02543 printf( "Value of entityset struct tag wrong.\n" ); 02544 return FALSE; 02545 } 02546 02547 /* ok, the int tag test worked */ 02548 return TRUE; 02549 } 02550 02551 int mesh_tag_delete_test( iMesh_Instance mesh ) 02552 { 02553 /* test forced, unforced deletion of tags from entities */ 02554 int result; 02555 int delete_err = FALSE; 02556 02557 /* test getAlliBase_TagHandles for first entity */ 02558 iBase_TagHandle* all_tags = NULL; 02559 int all_tags_alloc = 0, all_tags_size; 02560 iMesh_getAllEntSetTags( mesh, root_set, &all_tags, &all_tags_alloc, &all_tags_size, &result ); 02561 if( iBase_SUCCESS != result ) 02562 { 02563 printf( "Couldn't get all tag handles from entityset.\n" ); 02564 return FALSE; 02565 } 02566 02567 iMesh_rmvEntSetTag( mesh, root_set, all_tags[0], &result ); 02568 if( iBase_SUCCESS != result ) 02569 { 02570 printf( "Couldn't remove tag from entityset.\n" ); 02571 free( all_tags ); 02572 return FALSE; 02573 } 02574 02575 iMesh_destroyTag( mesh, all_tags[1], FALSE, &result ); 02576 if( iBase_SUCCESS != result ) 02577 { 02578 delete_err = TRUE; 02579 } 02580 if( !delete_err ) 02581 { 02582 printf( "Error when unforced-deleting tag in use on a entityset.\n" ); 02583 free( all_tags ); 02584 return FALSE; 02585 } 02586 02587 iMesh_destroyTag( mesh, all_tags[1], TRUE, &result ); 02588 if( iBase_SUCCESS != result ) 02589 { 02590 printf( "Couldn't force-delete a tag in use on a entityset.\n" ); 02591 free( all_tags ); 02592 return FALSE; 02593 } 02594 02595 free( all_tags ); 02596 02597 /* ok, we're done */ 02598 return TRUE; 02599 } 02600 02601 /*! 02602 @test 02603 TSTT entityset tag Test 02604 @li Check entityset tags 02605 */ 02606 int mesh_tag_test( iMesh_Instance mesh ) 02607 { 02608 iBase_TagHandle int_tag, double_tag, struct_tag; 02609 02610 /* entityset int tag */ 02611 int int_success = mesh_int_tag_test( mesh, &int_tag ); 02612 02613 /* entityeset double tag */ 02614 int double_success = mesh_double_tag_test( mesh, &double_tag ); 02615 02616 /* entityset struct tag */ 02617 int struct_success = mesh_struct_tag_test( mesh, &struct_tag ); 02618 02619 int tag_delete_success = mesh_tag_delete_test( mesh ); 02620 02621 return ( int_success && double_success && struct_success && tag_delete_success ); 02622 } 02623 02624 int set_remove_contained_regression( iMesh_Instance mesh ) 02625 { 02626 int err, contained; 02627 iBase_EntitySetHandle set, sub; 02628 02629 iMesh_createEntSet( mesh, 0, &set, &err ); 02630 if( iBase_SUCCESS != err ) return 0; 02631 iMesh_createEntSet( mesh, 1, &sub, &err ); 02632 if( iBase_SUCCESS != err ) return 0; 02633 02634 iMesh_addEntSet( mesh, sub, set, &err ); 02635 if( iBase_SUCCESS != err ) return 0; 02636 02637 iMesh_isEntSetContained( mesh, set, sub, &contained, &err ); 02638 if( iBase_SUCCESS != err ) return 0; 02639 if( !contained ) 02640 { 02641 fprintf( stderr, "isEntSetContained returned false for contained set\n" ); 02642 return 0; 02643 } 02644 02645 iMesh_rmvEntSet( mesh, sub, set, &err ); 02646 if( iBase_SUCCESS != err ) return 0; 02647 02648 iMesh_isEntSetContained( mesh, set, sub, &contained, &err ); 02649 if( iBase_SUCCESS != err ) return 0; 02650 if( contained ) 02651 { 02652 fprintf( stderr, "isEntSetContained returned true for removed set\n" ); 02653 return 0; 02654 } 02655 02656 return 1; 02657 } 02658 02659 int all_adjacency_regression( iMesh_Instance mesh ) 02660 { 02661 int err; 02662 02663 double coords[] = { 0, 0, 0, 1, 1, 1 }; 02664 02665 iBase_EntityHandle* verts = NULL; 02666 int verts_alloc = 0, verts_size; 02667 02668 iBase_EntityHandle line; 02669 int status; 02670 02671 iBase_EntityHandle* adj = NULL; 02672 int adj_alloc = 0, adj_size; 02673 02674 iMesh_newMesh( "", &mesh, &err, 0 ); 02675 if( iBase_SUCCESS != err ) return 0; 02676 02677 iMesh_createVtxArr( mesh, 2, iBase_INTERLEAVED, coords, 6, &verts, &verts_alloc, &verts_size, &err ); 02678 if( iBase_SUCCESS != err ) return 0; 02679 02680 iMesh_createEnt( mesh, iMesh_LINE_SEGMENT, verts, 2, &line, &status, &err ); 02681 if( iBase_SUCCESS != err || status != iBase_NEW ) return 0; 02682 02683 iMesh_getEntAdj( mesh, verts[0], iBase_ALL_TYPES, &adj, &adj_alloc, &adj_size, &err ); 02684 if( iBase_SUCCESS != err ) return 0; 02685 if( adj_size != 1 || adj[0] != line ) 02686 { 02687 printf( "Bad: couldn't find adjacency for vertex\n" ); 02688 return 0; 02689 } 02690 free( adj ); 02691 02692 adj_alloc = 0; 02693 adj = NULL; 02694 iMesh_getEntAdj( mesh, line, iBase_ALL_TYPES, &adj, &adj_alloc, &adj_size, &err ); 02695 if( iBase_SUCCESS != err ) return 0; 02696 if( adj_size != 2 || 02697 ( ( adj[0] != verts[0] || adj[1] != verts[1] ) && ( adj[0] != verts[1] || adj[1] != verts[0] ) ) ) 02698 { 02699 printf( "Bad: couldn't find adjacencies for line\n" ); 02700 free( adj ); 02701 free( verts ); 02702 return 0; 02703 } 02704 free( adj ); 02705 free( verts ); 02706 iMesh_dtor( mesh, &err ); 02707 if( iBase_SUCCESS != err ) return 0; 02708 return 1; 02709 } 02710 02711 static int ordered_set_regression( iMesh_Instance mesh ) 02712 { 02713 double coords[] = { 0, 0, 0, 1, 1, 1 }; 02714 iBase_EntityHandle line, *p, verts[2], ents_in[3], ents_out[3]; 02715 iBase_EntitySetHandle set; 02716 int i, err, status, two = 2, three = 3; 02717 02718 iMesh_newMesh( "", &mesh, &err, 0 ); 02719 CHK( err ); 02720 p = verts; 02721 iMesh_createVtxArr( mesh, 2, iBase_INTERLEAVED, coords, 6, &p, &two, &two, &err ); 02722 CHK( err ); 02723 iMesh_createEnt( mesh, iMesh_LINE_SEGMENT, verts, 2, &line, &status, &err ); 02724 CHK( err ); 02725 if( status != iBase_NEW ) return 0; 02726 iMesh_createEntSet( mesh, 1, &set, &err ); 02727 CHK( err ); 02728 ents_in[0] = verts[1]; 02729 ents_in[1] = line; 02730 ents_in[2] = verts[0]; 02731 iMesh_addEntArrToSet( mesh, ents_in, three, set, &err ); 02732 CHK( err ); 02733 p = ents_out; 02734 iMesh_getEntities( mesh, set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &p, &three, &three, &err ); 02735 CHK( err ); 02736 for( i = 0; i < three; i++ ) 02737 { 02738 if( ents_in[i] != ents_out[i] ) 02739 { 02740 printf( "Ordered set does not preserve order\n" ); 02741 return 0; 02742 } 02743 } 02744 iMesh_dtor( mesh, &err ); 02745 CHK( err ); 02746 return 1; 02747 } 02748 02749 int array_allocation( iMesh_Instance mesh ) 02750 { 02751 int err; 02752 02753 double coords[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 }; 02754 02755 iBase_EntityHandle* verts = NULL; 02756 int verts_alloc = 0, verts_size; 02757 02758 iBase_EntityHandle* ents; 02759 int ents_alloc, ents_size; 02760 02761 iMesh_newMesh( "", &mesh, &err, 0 ); 02762 if( iBase_SUCCESS != err ) return 0; 02763 02764 iMesh_getRootSet( mesh, &root_set, &err ); 02765 if( iBase_SUCCESS != err ) 02766 { 02767 printf( "Failed to return a root set.\n" ); 02768 return 0; 02769 } 02770 02771 iMesh_createVtxArr( mesh, 4, iBase_INTERLEAVED, coords, 12, &verts, &verts_alloc, &verts_size, &err ); 02772 if( iBase_SUCCESS != err ) return 0; 02773 02774 free( verts ); 02775 02776 /* test for proper allocation when array pointer passed in null but alloc'd size not */ 02777 ents_alloc = 3; 02778 ents = NULL; 02779 iMesh_getEntities( mesh, root_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &ents, &ents_alloc, &ents_size, &err ); 02780 CHK( err ); 02781 02782 free( ents ); 02783 02784 /* test for proper allocation when array pointer passed in non-null but alloc'd size 0 */ 02785 ents_alloc = 0; 02786 iMesh_getEntities( mesh, root_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &ents, &ents_alloc, &ents_size, &err ); 02787 CHK( err ); 02788 02789 free( ents ); 02790 02791 /* test for failure when passed in alloc'd size is smaller than it should be */ 02792 ents_alloc -= 1; 02793 iMesh_getEntities( mesh, root_set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &ents, &ents_alloc, &ents_size, &err ); 02794 if( iBase_BAD_ARRAY_SIZE != err && iBase_BAD_ARRAY_DIMENSION != err ) 02795 { 02796 err = iBase_FAILURE; 02797 CHK( err ); 02798 } 02799 02800 iMesh_dtor( mesh, &err ); 02801 CHK( err ); 02802 02803 return 1; 02804 } 02805 02806 int compare_single_iter( const char* info, 02807 iMesh_Instance mesh, 02808 iBase_EntitySetHandle set, 02809 iBase_EntityHandle* contents, 02810 int contents_size, 02811 enum iBase_EntityType type, 02812 enum iMesh_EntityTopology topo ) 02813 { 02814 iBase_EntityIterator iter = 0; 02815 int i, twice, has_data, result = iBase_SUCCESS, result2; 02816 iBase_EntityHandle value; 02817 02818 iMesh_initEntIter( mesh, set, type, topo, 0, &iter, &result ); 02819 if( iBase_SUCCESS != result ) 02820 { 02821 printf( "%s:%d: Error %d initializing %s iterator for type %d/topo %d\n", __FILE__, __LINE__, result, info, 02822 (int)type, (int)topo ); 02823 return result; 02824 } 02825 02826 for( twice = 0; twice < 2; ++twice ) 02827 { 02828 02829 for( i = 0; i < contents_size; ++i ) 02830 { 02831 iMesh_getNextEntIter( mesh, iter, &value, &has_data, &result ); 02832 if( iBase_SUCCESS != result ) 02833 { 02834 printf( "%s:%d: Error %d stepping %s iterator for type %d/topo %d\n", __FILE__, __LINE__, result, info, 02835 (int)type, (int)topo ); 02836 goto end_single_iter; 02837 } 02838 02839 if( !has_data ) 02840 { 02841 printf( "%s:%d: %s iterator for type %d/topo %d ended prematurely at %d of %d\n", __FILE__, __LINE__, 02842 info, (int)type, (int)topo, i, contents_size ); 02843 result = iBase_FAILURE; 02844 goto end_single_iter; 02845 } 02846 02847 if( value != contents[i] ) 02848 { 02849 printf( "%s:%d: %s iterator for type %d/topo %d returned incorrect value at %d of %d\n", __FILE__, 02850 __LINE__, info, (int)type, (int)topo, i, contents_size ); 02851 result = iBase_FAILURE; 02852 goto end_single_iter; 02853 } 02854 } 02855 02856 iMesh_getNextEntIter( mesh, iter, &value, &has_data, &result ); 02857 if( iBase_SUCCESS != result ) 02858 { 02859 printf( "%s:%d: Error %d stepping %s iterator for type %d/topo %d\n", __FILE__, __LINE__, result, info, 02860 (int)type, (int)topo ); 02861 goto end_single_iter; 02862 } 02863 02864 if( has_data ) 02865 { 02866 printf( "%s:%d: %s iterator for type %d/topo %d did not end after %d values\n", __FILE__, __LINE__, info, 02867 (int)type, (int)topo, contents_size ); 02868 result = iBase_FAILURE; 02869 goto end_single_iter; 02870 } 02871 02872 iMesh_resetEntIter( mesh, iter, &result ); 02873 if( iBase_SUCCESS != result ) 02874 { 02875 printf( "%s:%d: Error %d resetting %s iterator for type %d/topo %d\n", __FILE__, __LINE__, result, info, 02876 (int)type, (int)topo ); 02877 result = iBase_FAILURE; 02878 goto end_single_iter; 02879 } 02880 } 02881 02882 end_single_iter: 02883 iMesh_endEntIter( mesh, iter, &result2 ); 02884 if( iBase_SUCCESS != result2 ) 02885 { 02886 printf( "%s:%d: Error %d releasing %s iterator for type %d/topo %d\n", __FILE__, __LINE__, result, info, 02887 (int)type, (int)topo ); 02888 if( iBase_SUCCESS == result ) result = result2; 02889 } 02890 return result; 02891 } 02892 02893 int compare_array_iter( const char* info, 02894 iMesh_Instance mesh, 02895 iBase_EntitySetHandle set, 02896 iBase_EntityHandle* contents, 02897 int contents_size, 02898 int array_size, 02899 enum iBase_EntityType type, 02900 enum iMesh_EntityTopology topo ) 02901 { 02902 iBase_EntityArrIterator iter = 0; 02903 int i, j, twice, has_data, result = iBase_SUCCESS, result2; 02904 iBase_EntityHandle* values; 02905 int values_size, values_alloc = array_size; 02906 values = (iBase_EntityHandle*)malloc( array_size * sizeof( iBase_EntityHandle ) ); 02907 02908 iMesh_initEntArrIter( mesh, set, type, topo, array_size, 0, &iter, &result ); 02909 if( iBase_SUCCESS != result ) 02910 { 02911 printf( "%s:%d: Error %d initializing %s array iterator for type %d/topo %d\n", __FILE__, __LINE__, result, 02912 info, (int)type, (int)topo ); 02913 free( values ); 02914 return result; 02915 } 02916 02917 for( twice = 0; twice < 2; ++twice ) 02918 { 02919 i = 0; 02920 while( i < contents_size ) 02921 { 02922 02923 iMesh_getNextEntArrIter( mesh, iter, &values, &values_alloc, &values_size, &has_data, &result ); 02924 if( iBase_SUCCESS != result ) 02925 { 02926 printf( "%s:%d: Error %d stepping %s array iterator for type %d/topo %d\n", __FILE__, __LINE__, result, 02927 info, (int)type, (int)topo ); 02928 goto end_arr_iter; 02929 } 02930 02931 if( !has_data || !values_size ) 02932 { 02933 printf( "%s:%d: %s array iterator for type %d/topo %d ended prematurely at %d of %d\n", __FILE__, 02934 __LINE__, info, (int)type, (int)topo, i, contents_size ); 02935 result = iBase_FAILURE; 02936 goto end_arr_iter; 02937 } 02938 02939 if( i + values_size > contents_size ) 02940 { 02941 printf( "%s:%d: %s array iterator for type %d/topo %d returned more than %d handles\n", __FILE__, 02942 __LINE__, info, (int)type, (int)topo, contents_size ); 02943 result = iBase_FAILURE; 02944 goto end_arr_iter; 02945 } 02946 02947 if( contents_size - i >= array_size && values_size < array_size ) 02948 { 02949 printf( "%s:%d: %s array iterator for type %d/topo %d returned fewer than %d handles\n", __FILE__, 02950 __LINE__, info, (int)type, (int)topo, array_size ); 02951 result = iBase_FAILURE; 02952 goto end_arr_iter; 02953 } 02954 02955 for( j = 0; j < values_size; ++j, ++i ) 02956 { 02957 if( values[j] != contents[i] ) 02958 { 02959 printf( "%s:%d: %s array iterator for type %d/topo %d returned incorrect value " 02960 "at %d of %d\n", 02961 __FILE__, __LINE__, info, (int)type, (int)topo, i, contents_size ); 02962 result = iBase_FAILURE; 02963 goto end_arr_iter; 02964 } 02965 } 02966 } 02967 02968 iMesh_getNextEntArrIter( mesh, iter, &values, &values_alloc, &values_size, &has_data, &result ); 02969 if( iBase_SUCCESS != result ) 02970 { 02971 printf( "%s:%d: Error %d stepping %s array iterator for type %d/topo %d\n", __FILE__, __LINE__, result, 02972 info, (int)type, (int)topo ); 02973 goto end_arr_iter; 02974 } 02975 02976 if( has_data || values_size ) 02977 { 02978 printf( "%s:%d: %s array iterator for type %d/topo %d did not end after %d values\n", __FILE__, __LINE__, 02979 info, (int)type, (int)topo, contents_size ); 02980 result = iBase_FAILURE; 02981 goto end_arr_iter; 02982 } 02983 02984 iMesh_resetEntArrIter( mesh, iter, &result ); 02985 if( iBase_SUCCESS != result ) 02986 { 02987 printf( "%s:%d: Error %d resetting %s array iterator for type %d/topo %d\n", __FILE__, __LINE__, result, 02988 info, (int)type, (int)topo ); 02989 result = iBase_FAILURE; 02990 goto end_arr_iter; 02991 } 02992 } 02993 02994 end_arr_iter: 02995 free( values ); 02996 iMesh_endEntArrIter( mesh, iter, &result2 ); 02997 if( iBase_SUCCESS != result2 ) 02998 { 02999 printf( "%s:%d: Error %d releasing %s array iterator for type %d/topo %d\n", __FILE__, __LINE__, result, info, 03000 (int)type, (int)topo ); 03001 if( iBase_SUCCESS == result ) result = result2; 03002 } 03003 return result; 03004 } 03005 03006 int test_iterator_common( const char* info, 03007 iMesh_Instance mesh, 03008 iBase_EntitySetHandle set, 03009 int array_size, 03010 enum iBase_EntityType type, 03011 enum iMesh_EntityTopology topo ) 03012 { 03013 iBase_EntityHandle* contents = NULL; 03014 int content_size = 0, content_alloc = 0; 03015 int result; 03016 03017 iMesh_getEntities( mesh, set, type, topo, &contents, &content_alloc, &content_size, &result ); 03018 CHK( result ); 03019 if( array_size == 1 ) 03020 result = compare_single_iter( info, mesh, set, contents, content_size, type, topo ); 03021 else 03022 result = compare_array_iter( info, mesh, set, contents, content_size, array_size, type, topo ); 03023 free( contents ); 03024 return result; 03025 } 03026 03027 int test_iterator( iMesh_Instance mesh ) 03028 { 03029 int result, i; 03030 iBase_EntitySetHandle root, list, set, *setptr; 03031 iBase_EntityHandle* array = NULL; 03032 int array_len = 0, array_size = 0; 03033 03034 iMesh_getRootSet( mesh, &root, &result ); 03035 CHK( result ); 03036 03037 /* create some sets containing every other handle */ 03038 iMesh_getEntities( mesh, root, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &array, &array_size, &array_len, &result ); 03039 CHK( result ); 03040 for( i = 1; i < array_size; i += 2 ) 03041 array[i] = array[i - 1]; 03042 for( i = 0; i < 2; ++i ) 03043 { 03044 setptr = i ? &list : &set; 03045 iMesh_createEntSet( mesh, i, setptr, &result ); 03046 if( iBase_SUCCESS != result ) free( array ); 03047 CHK( result ); 03048 iMesh_addEntArrToSet( mesh, array, array_size, *setptr, &result ); 03049 if( iBase_SUCCESS != result ) free( array ); 03050 CHK( result ); 03051 } 03052 free( array ); 03053 03054 /* test single iterator and array iterator for all types */ 03055 for( i = 0; i < iBase_ALL_TYPES; ++i ) 03056 { 03057 array_size = 2 * i + 2; 03058 result = test_iterator_common( "root", mesh, root, 1, (enum iBase_EntityType)i, iMesh_ALL_TOPOLOGIES ); 03059 CHK( result ); 03060 result = test_iterator_common( "root", mesh, root, array_size, (enum iBase_EntityType)i, iMesh_ALL_TOPOLOGIES ); 03061 CHK( result ); 03062 result = test_iterator_common( "list", mesh, list, 1, (enum iBase_EntityType)i, iMesh_ALL_TOPOLOGIES ); 03063 CHK( result ); 03064 result = test_iterator_common( "list", mesh, list, array_size, (enum iBase_EntityType)i, iMesh_ALL_TOPOLOGIES ); 03065 CHK( result ); 03066 result = test_iterator_common( "set", mesh, set, 1, (enum iBase_EntityType)i, iMesh_ALL_TOPOLOGIES ); 03067 CHK( result ); 03068 result = test_iterator_common( "set", mesh, set, array_size, (enum iBase_EntityType)i, iMesh_ALL_TOPOLOGIES ); 03069 CHK( result ); 03070 } 03071 03072 /* test single iterator and array iterator for all types */ 03073 for( i = 0; i < iMesh_ALL_TOPOLOGIES; ++i ) 03074 { 03075 array_size = 2 * i + 2; 03076 result = test_iterator_common( "root", mesh, root, 1, iBase_ALL_TYPES, (enum iMesh_EntityTopology)i ); 03077 CHK( result ); 03078 result = test_iterator_common( "root", mesh, root, array_size, iBase_ALL_TYPES, (enum iMesh_EntityTopology)i ); 03079 CHK( result ); 03080 result = test_iterator_common( "list", mesh, list, 1, iBase_ALL_TYPES, (enum iMesh_EntityTopology)i ); 03081 CHK( result ); 03082 result = test_iterator_common( "list", mesh, list, array_size, iBase_ALL_TYPES, (enum iMesh_EntityTopology)i ); 03083 CHK( result ); 03084 result = test_iterator_common( "set", mesh, set, 1, iBase_ALL_TYPES, (enum iMesh_EntityTopology)i ); 03085 CHK( result ); 03086 result = test_iterator_common( "set", mesh, set, array_size, iBase_ALL_TYPES, (enum iMesh_EntityTopology)i ); 03087 CHK( result ); 03088 } 03089 03090 return 1; 03091 } 03092 03093 int main( int argc, char* argv[] ) 03094 { 03095 /* Check command line arg */ 03096 const char* filename; 03097 int number_tests = 0; 03098 int number_tests_successful = 0; 03099 int number_tests_not_implemented = 0; 03100 int number_tests_failed = 0; 03101 int result; 03102 iMesh_Instance mesh = NULL; 03103 03104 if( argc == 2 ) 03105 { 03106 filename = argv[1]; 03107 } 03108 else 03109 { 03110 printf( "Usage: %s <mesh_filename>\n", argv[0] ); 03111 if( argc != 1 ) return 1; 03112 printf( " No file specified. Defaulting to: %s\n", DEFAULT_INPUT_FILE ); 03113 filename = DEFAULT_INPUT_FILE; 03114 } 03115 03116 /* initialize the Mesh */ 03117 iMesh_newMesh( NULL, &mesh, &result, 0 ); 03118 if( iBase_SUCCESS != result ) 03119 { 03120 printf( "Failed to create a mesh instance.\n" ); 03121 return 1; 03122 } 03123 iMesh_getRootSet( mesh, &root_set, &result ); 03124 if( iBase_SUCCESS != result ) 03125 { 03126 printf( "Failed to return a root set.\n" ); 03127 return 1; 03128 } 03129 03130 /* Print out Header information */ 03131 printf( "\n\nTSTT TEST PROGRAM:\n\n" ); 03132 03133 /* load_mesh test */ 03134 printf( " load_mesh: " ); 03135 result = load_mesh_test( filename, mesh ); 03136 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03137 number_tests++; 03138 printf( "\n" ); 03139 03140 /* topology_adjacency_test */ 03141 printf( " topology_adjacency_test: " ); 03142 result = topology_adjacency_test( mesh ); 03143 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03144 number_tests++; 03145 printf( "\n" ); 03146 03147 /* entity connectivity test */ 03148 printf( " entity_connectivity_test: " ); 03149 result = entity_connectivity_test( mesh ); 03150 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03151 number_tests++; 03152 printf( "\n" ); 03153 03154 /* vertex_coordinates_test */ 03155 printf( " vertex_coordinates_test: " ); 03156 result = vertex_coordinates_test( mesh ); 03157 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03158 number_tests++; 03159 printf( "\n" ); 03160 03161 /* topology dimension test */ 03162 printf( " topology_dimension_test: " ); 03163 result = topology_dimension_test( mesh ); 03164 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03165 number_tests++; 03166 printf( "\n" ); 03167 03168 /* entity sets test */ 03169 printf( " entity_sets_test: " ); 03170 result = entity_sets_test( mesh ); 03171 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03172 number_tests++; 03173 printf( "\n" ); 03174 03175 /* vertex tag test */ 03176 printf( " vertex_tag_test: " ); 03177 result = vertex_tag_test( mesh ); 03178 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03179 number_tests++; 03180 printf( "\n" ); 03181 03182 /* entityset tag test */ 03183 printf( " entityset_tag_test: " ); 03184 result = entityset_tag_test( mesh ); 03185 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03186 number_tests++; 03187 printf( "\n" ); 03188 03189 /* mesh tag test */ 03190 printf( " mesh_tag_test: " ); 03191 result = mesh_tag_test( mesh ); 03192 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03193 number_tests++; 03194 printf( "\n" ); 03195 03196 /* iterator test */ 03197 printf( " test_iterator: " ); 03198 result = test_iterator( mesh ); 03199 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03200 number_tests++; 03201 printf( "\n" ); 03202 03203 /* regression test for remove/contained bug */ 03204 printf( " set_remove_contained_regression: " ); 03205 result = set_remove_contained_regression( mesh ); 03206 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03207 number_tests++; 03208 printf( "\n" ); 03209 03210 /* regression test for adjacencies with iBase_ALL_TYPES bug */ 03211 printf( " all_adjacency_regression: " ); 03212 result = all_adjacency_regression( mesh ); 03213 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03214 number_tests++; 03215 printf( "\n" ); 03216 03217 /* test for error codes */ 03218 printf( " error_code_test: " ); 03219 result = error_code_test( mesh ); 03220 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03221 number_tests++; 03222 printf( "\n" ); 03223 03224 /* regression test for ordered sets not preserving order */ 03225 printf( " ordered_set_regression: " ); 03226 result = ordered_set_regression( mesh ); 03227 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03228 number_tests++; 03229 printf( "\n" ); 03230 03231 /* test for array allocation behavior */ 03232 printf( " array_allocation_regression: " ); 03233 result = array_allocation( mesh ); 03234 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful ); 03235 number_tests++; 03236 printf( "\n" ); 03237 03238 /* summary */ 03239 03240 printf( "\nTSTT TEST SUMMARY: \n" ); 03241 03242 printf( " Number Tests: %d\n", number_tests ); 03243 printf( " Number Successful: %d\n", number_tests_successful ); 03244 printf( " Number Not Implemented: %d\n", number_tests_not_implemented ); 03245 printf( " Number Failed: %d\n", number_tests_failed ); 03246 printf( "\n\n\n" ); 03247 03248 /* delete the mesh */ 03249 iMesh_dtor( mesh, &result ); 03250 if( iBase_SUCCESS != result ) 03251 { 03252 printf( "Failed to destruct the mesh instance.\n" ); 03253 return 1; 03254 } 03255 03256 return number_tests_failed; 03257 }