Home | History | Annotate | Download | only in testsuite
      1 // test.h -- simplistic test framework for gold unittests -*- C++ -*-
      2 
      3 // Copyright (C) 2006-2016 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) 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)
    146