Fix internal error caused by conflicting default version definitions.
[external/binutils.git] / gold / testsuite / test.h
1 // test.h -- simplistic test framework for gold unittests -*- C++ -*-
2
3 // Copyright (C) 2006-2017 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #ifndef GOLD_TESTSUITE_TEST_H
24 #define GOLD_TESTSUITE_TEST_H
25
26 namespace gold_testsuite
27 {
28
29 class Test_report;
30
31 // This class handles basic test framework functionality.
32
33 class Test_framework
34 {
35  public:
36   Test_framework()
37     : testname_(NULL), current_fail_(0), passes_(0), failures_(0)
38   { }
39
40   // Return number of failures.
41   unsigned int
42   failures() const
43   { return this->failures_; }
44
45   // Run a test.
46   void
47   run(const char* name, bool (*pfn)(Test_report*));
48
49   // Get the current Test_report.  This is used by the test support
50   // macros.
51   static Test_report*
52   report()
53   { return Test_framework::current_report; }
54
55  private:
56   friend class Test_report;
57
58   // Cause the current test to fail.
59   void
60   fail(const char* filename, int lineno);
61
62   // Report an error from the current test.
63   void
64   error(const char* message);
65
66   // Current Test_report.  This is a static variable valid while a
67   // test is being run.
68   static Test_report* current_report;
69
70   // Current test being run.
71   const char* testname_;
72   // Whether the current test is failing.
73   bool current_fail_;
74   // Total number of passeed tests.
75   unsigned int passes_;
76   // Total number of failed tests.
77   unsigned int failures_;
78 };
79
80 // An instance of this class is passed to each test function.
81
82 class Test_report
83 {
84 public:
85   Test_report(Test_framework* tf)
86     : tf_(tf)
87   { }
88
89   // Mark the test as failing.
90   void
91   fail(const char* filename, int lineno)
92   { this->tf_->fail(filename, lineno); }
93
94   // Report an error.
95   void
96   error(const char* message)
97   { this->tf_->error(message); }
98
99 private:
100   Test_framework* tf_;
101 };
102
103 // This class registers a test function so that the testsuite runs it.
104
105 class Register_test
106 {
107  public: 
108   Register_test(const char* name, bool (*pfn)(Test_report*));
109
110   // Run all registered tests.
111   static void
112   run_tests(Test_framework*);
113
114  private:
115   // Linked list of all tests.
116   static Register_test* all_tests;
117
118   // Test name.
119   const char* name_;
120   // Function to call.  It should return true if the test passes,
121   // false if it fails.
122   bool (*pfn_)(Test_report*);
123   // Next test in linked list.
124   Register_test* next_;
125 };
126
127 } // End namespace gold_testsuite.
128
129 // These macros are for convenient use in tests.
130
131 // Check that a condition is true.  If it is false, report a failure.
132
133 #define CHECK(cond)                                                     \
134   ((void)                                                               \
135    ((cond)                                                              \
136     ? 0                                                                 \
137     : (::gold_testsuite::Test_framework::report()->fail(__FILE__,       \
138                                                         __LINE__),      \
139        0)))
140
141 // Report an error during a test.
142
143 #define ERROR(msg) (::gold_testsuite::Test_framework::report()->error(msg))
144
145 #endif // !defined(GOLD_TESTSUITE_TEST_H)