summaryrefslogtreecommitdiffstats
path: root/libdimension/tests/tests.h
blob: 2ce2f016ca791a5f525a5a0b04079fa077b60c66 (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
/*************************************************************************
 * Copyright (C) 2009-2014 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>

#if DMNSN_CXX
// 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);

#if DMNSN_CXX
}
#endif

#endif // TESTS_H