xref: /petsc/src/sys/tests/ex67.c (revision 607e733f3db3ee7f6f605a13295c517df8dbb9c9)
1 const char help[] = "Test PetscAssertPointer type generics";
2 
3 #include <petsc/private/petscimpl.h>
4 
5 #define PETSC_TEST_ASSERT_POINTER_GENERICS_SINGLE(type, PETSC_TYPE, string) \
6   do { \
7     type         *h = NULL; \
8     PetscBool     same_string; \
9     PetscDataType data_type         = PetscAssertPointer_PetscDataType(h); \
10     const char    expected_string[] = string; \
11     PetscCall(PetscInfo(NULL, "PetscAssertPointer_PetscDataType(%s *h) = PETSC_%s\n", expected_string, PetscDataTypes[data_type])); \
12     PetscCall(PetscInfo(NULL, "PetscAssertPointer_String(%s *h) = \"%s\"\n", expected_string, PetscAssertPointer_String(h))); \
13     PetscCheck(data_type == PETSC_TYPE, PETSC_COMM_SELF, PETSC_ERR_PLIB, "[PetscAssertPointer_PetscDataType(%s *h) = %s] != PETSC_%s", expected_string, PetscDataTypes[data_type], PetscDataTypes[PETSC_TYPE]); \
14     PetscCall(PetscStrcmp(PetscAssertPointer_String(h), expected_string, &same_string)); \
15     PetscCheck(same_string, PETSC_COMM_SELF, PETSC_ERR_PLIB, "[PetscAssertPointer_String(%s *h) = \"%s\"] != \"%s\"", expected_string, PetscAssertPointer_String(h), expected_string); \
16   } while (0)
17 #define PETSC_TEST_ASSERT_POINTER_GENERICS(type, PETSC_TYPE) \
18   PETSC_TEST_ASSERT_POINTER_GENERICS_SINGLE(type, PETSC_TYPE, PetscStringize(type)); \
19   PETSC_TEST_ASSERT_POINTER_GENERICS_SINGLE(const type, PETSC_TYPE, PetscStringize(type))
20 
21 int main(int argc, char **argv)
22 {
23   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
24 #if defined(PetscAssertPointer_PetscDataType) && (defined(__cplusplus) || (PETSC_C_VERSION >= 11))
25   // clang-format off
26   PETSC_TEST_ASSERT_POINTER_GENERICS(          char, PETSC_CHAR   );
27   PETSC_TEST_ASSERT_POINTER_GENERICS(   signed char, PETSC_CHAR   );
28   PETSC_TEST_ASSERT_POINTER_GENERICS( unsigned char, PETSC_CHAR   );
29   PETSC_TEST_ASSERT_POINTER_GENERICS(         short, PETSC_SHORT  );
30   PETSC_TEST_ASSERT_POINTER_GENERICS(unsigned short, PETSC_SHORT  );
31   PETSC_TEST_ASSERT_POINTER_GENERICS(         float, PETSC_FLOAT  );
32   PETSC_TEST_ASSERT_POINTER_GENERICS(        double, PETSC_DOUBLE );
33   PETSC_TEST_ASSERT_POINTER_GENERICS(  PetscComplex, PETSC_COMPLEX);
34   PETSC_TEST_ASSERT_POINTER_GENERICS(       int32_t, PETSC_INT32  );
35   PETSC_TEST_ASSERT_POINTER_GENERICS(      uint32_t, PETSC_INT32  );
36   PETSC_TEST_ASSERT_POINTER_GENERICS(       int64_t, PETSC_INT64  );
37   PETSC_TEST_ASSERT_POINTER_GENERICS(      uint64_t, PETSC_INT64  );
38   // clang-format on
39 #endif
40 #if defined(PetscAssertPointer_PetscDataType) && defined(__cplusplus)
41   PETSC_TEST_ASSERT_POINTER_GENERICS(PetscBool, PETSC_BOOL);
42 #endif
43   PetscCall(PetscFinalize());
44   return 0;
45 }
46 
47 /*TEST
48 
49   test:
50     requires: defined(PETSC_HAVE_COMPLEX)
51 
52     suffix: 0
53     output_file: output/empty.out
54 
55 TEST*/
56