//===- Test.h - Simple macros for API unit tests ----------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file define simple macros for declaring test functions and running them.
// The actual checking must be performed on the outputs with FileCheck.
//
//===----------------------------------------------------------------------===//

#ifndef MLIR_TEST_TEST_H_
#define MLIR_TEST_TEST_H_

#include <functional>
#include <vector>

namespace test_detail {
// Returns a mutable list of known test functions.  Used internally by test
// macros to add and run tests.  This function is static to ensure it creates a
// new list in each test file.
static std::vector<std::function<void()>> &tests() {
  static std::vector<std::function<void()>> list;
  return list;
}

// Test registration class.  Used internally by test macros to register tests
// during static allocation.
struct TestRegistration {
  explicit TestRegistration(std::function<void()> func) {
    test_detail::tests().push_back(func);
  }
};
} // namespace test_detail

/// Declares a test function with the given name and adds it to the list of
/// known tests.  The body of the function must follow immediately.  Example:
///
/// TEST_FUNC(mytest) {
///   // CHECK: expected-output-here
///   emitSomethingToStdOut();
/// }
///
#define TEST_FUNC(name)                                                        \
  void name();                                                                 \
  static test_detail::TestRegistration name##Registration(name);               \
  void name()

/// Runs all registered tests.  Example:
///
/// int main() {
///   RUN_TESTS();
///   return 0;
/// }
#define RUN_TESTS                                                              \
  []() {                                                                       \
    for (auto f : test_detail::tests())                                        \
      f();                                                                     \
  }

#endif // MLIR_TEST_TEST_H_
