summaryrefslogtreecommitdiffstats
path: root/libdimension/tests/tests.h
blob: 6e9ad2190b3bfd169798373f224946ee1aaacaaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*************************************************************************
 * Copyright (C) 2009-2012 Tavian Barnes <tavianator@tavianator.com>     *
 *                                                                       *
 * This file is part of The Dimension Test Suite.                        *
 *                                                                       *
 * The Dimension Test Suite is free software; you can redistribute it    *
 * and/or modify it under the terms of the GNU General Public License as *
 * published by the Free Software Foundation; either version 3 of the    *
 * License, or (at your option) any later version.                       *
 *                                                                       *
 * The Dimension Test Suite is distributed in the hope that it will be   *
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty   *
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
 * General Public License for more details.                              *
 *                                                                       *
 * You should have received a copy of the GNU General Public License     *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. *
 *************************************************************************/

#ifndef TESTS_H
#define TESTS_H

#include "dimension.h"
#include <check.h>

#ifdef __cplusplus
// We've been included from a C++ file; mark everything here as extern "C"
extern "C" {
#endif

/// @internal Map to known test cases from their names.
extern dmnsn_dictionary* dmnsn_test_cases;

/// @internal Get the test case with the given name, possibly creating it.
TCase *dmnsn_get_test_case(const char* name);

/// @internal Default test fixture.
void dmnsn_test_setup(void);
/// @internal Default test fixture.
void dmnsn_test_teardown(void);

/**
 * Defines a test.
 * @param[in] tcase  The name of the test case for this test.
 * @param[in] test   The name of the test itself.
 */
#define DMNSN_TEST(tcase, test)                 \
  DMNSN_TEST_IMPL(#tcase, tcase##_test_##test)

#define DMNSN_TEST_IMPL(tcase, test)            \
  DMNSN_TEST_IMPL2(tcase,                       \
                   dmnsn_##test,                \
                   dmnsn_##test##_impl,         \
                   dmnsn_add_##test)

#define DMNSN_TEST_IMPL2(tcase, test, test_impl, add_test)      \
  static void test(int _i);                                     \
  static void test_impl(int _i);                                \
                                                                \
  __attribute__((constructor))                                  \
  static void                                                   \
  add_test(void)                                                \
  {                                                             \
    TCase *tc = dmnsn_get_test_case(tcase);                     \
    tcase_add_test(tc, test);                                   \
  }                                                             \
                                                                \
  START_TEST(test)                                              \
  {                                                             \
    test_impl(_i);                                              \
  }                                                             \
  END_TEST                                                      \
                                                                \
  static void                                                   \
  test_impl(int _i)

/**
 * Defines the setup method for a test case.
 * @param[in] tcase  The name of the test case.
 */
#define DMNSN_TEST_SETUP(tcase)                                 \
  DMNSN_TEST_FIXTURE(#tcase, tcase##_test_fixture_setup, true)

/**
 * Defines the teardown method for a test case.
 * @param[in] tcase  The name of the test case.
 */
#define DMNSN_TEST_TEARDOWN(tcase)                                      \
  DMNSN_TEST_FIXTURE(#tcase, tcase##_test_fixture_teardown, false)

#define DMNSN_TEST_FIXTURE(tcase, fixture, is_setup)                     \
  DMNSN_TEST_FIXTURE2(tcase, dmnsn_##fixture, dmnsn_add_##fixture, is_setup)

#define DMNSN_TEST_FIXTURE2(tcase, fixture, add_fixture, is_setup)      \
  static void fixture(void);                                            \
                                                                        \
  __attribute__((constructor))                                          \
  static void                                                           \
  add_fixture(void)                                                     \
  {                                                                     \
    TCase *tc = dmnsn_get_test_case(tcase);                             \
    tcase_add_checked_fixture(tc,                                       \
                              is_setup ? fixture : NULL,                \
                              !is_setup ? fixture : NULL);              \
  }                                                                     \
                                                                        \
  static void                                                           \
  fixture(void)

/*
 * Test canvas
 */
void dmnsn_paint_test_canvas(dmnsn_canvas *canvas);

/*
 * Windowing
 */

typedef struct dmnsn_display dmnsn_display;

dmnsn_display *dmnsn_new_display(const dmnsn_canvas *canvas);
void dmnsn_delete_display(dmnsn_display *display);

// Flush the GL buffers
void dmnsn_display_flush(dmnsn_display *display);

#ifdef __cplusplus
}
#endif

#endif // TESTS_H