// test.h -- simplistic test framework for gold unittests -*- C++ -*-

// Copyright (C) 2006-2021 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.

// This file is part of gold.

// This program 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.

// This program 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, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.

#ifndef GOLD_TESTSUITE_TEST_H
#define GOLD_TESTSUITE_TEST_H

namespace gold_testsuite
{

class Test_report;

// This class handles basic test framework functionality.

class Test_framework
{
 public:
  Test_framework()
    : testname_(NULL), current_fail_(0), passes_(0), failures_(0)
  { }

  // Return number of failures.
  unsigned int
  failures() const
  { return this->failures_; }

  // Run a test.
  void
  run(const char* name, bool (*pfn)(Test_report*));

  // Get the current Test_report.  This is used by the test support
  // macros.
  static Test_report*
  report()
  { return Test_framework::current_report; }

 private:
  friend class Test_report;

  // Cause the current test to fail.
  void
  fail(const char* filename, int lineno);

  // Report an error from the current test.
  void
  error(const char* message);

  // Current Test_report.  This is a static variable valid while a
  // test is being run.
  static Test_report* current_report;

  // Current test being run.
  const char* testname_;
  // Whether the current test is failing.
  bool current_fail_;
  // Total number of passeed tests.
  unsigned int passes_;
  // Total number of failed tests.
  unsigned int failures_;
};

// An instance of this class is passed to each test function.

class Test_report
{
public:
  Test_report(Test_framework* tf)
    : tf_(tf)
  { }

  // Mark the test as failing.
  void
  fail(const char* filename, int lineno)
  { this->tf_->fail(filename, lineno); }

  // Report an error.
  void
  error(const char* message)
  { this->tf_->error(message); }

private:
  Test_framework* tf_;
};

// This class registers a test function so that the testsuite runs it.

class Register_test
{
 public: 
  Register_test(const char* name, bool (*pfn)(Test_report*));

  // Run all registered tests.
  static void
  run_tests(Test_framework*);

 private:
  // Linked list of all tests.
  static Register_test* all_tests;

  // Test name.
  const char* name_;
  // Function to call.  It should return true if the test passes,
  // false if it fails.
  bool (*pfn_)(Test_report*);
  // Next test in linked list.
  Register_test* next_;
};

} // End namespace gold_testsuite.

// These macros are for convenient use in tests.

// Check that a condition is true.  If it is false, report a failure.

#define CHECK(cond)							\
  ((void)								\
   ((cond)								\
    ? 0									\
    : (::gold_testsuite::Test_framework::report()->fail(__FILE__,	\
							__LINE__),	\
       0)))

// Report an error during a test.

#define ERROR(msg) (::gold_testsuite::Test_framework::report()->error(msg))

#endif // !defined(GOLD_TESTSUITE_TEST_H)
