// Copyright 2020 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#pragma once

namespace pw {
namespace unit_test {

// The result of a complete test run.
enum class TestResult {
  kSuccess = 0,
  kFailure = 1,
  // Test skipped at runtime. This is neither a success nor a failure.
  kSkipped = 2,
};

struct TestCase {
  // Name of the test suite to which this test case belongs.
  const char* suite_name;

  // Name of the test case.
  const char* test_name;

  // Path to the file in which the test case is defined.
  const char* file_name;
};

struct TestExpectation {
  // The source code for the expression which was run.
  const char* expression;

  // The expression with arguments evaluated.
  const char* evaluated_expression;

  // Line number at which the expectation is located.
  int line_number;

  // Whether the expectation succeeded.
  bool success;
};

struct RunTestsSummary {
  // The number of passed tests among the run tests.
  int passed_tests;

  // The number of passed tests among the run tests.
  int failed_tests;

  // The number of tests skipped or filtered out.
  int skipped_tests;

  // The number of disabled tests encountered.
  int disabled_tests;
};

struct ProgramSummary {
  // The total number of tests to run in the program.
  int tests_to_run;

  // The number of test suites included in the program.
  int test_suites;

  // Test summary for the program once complete.
  RunTestsSummary tests_summary;
};

struct TestSuite {
  // Name of the test suite.
  const char* name;

  // Total number of tests in suite to run.
  int test_to_run_count;
};

/// Collects and processes the results of a unit test run. Its interface is
/// called by the unit test framework as tests are executed and various test
/// events occur.
///
/// A program wanting to process test events must define a class implementing
/// the ``pw::unit_test::EventHandler`` interface and register it with the
/// framework. When ``RUN_ALL_TESTS()`` is called, ``pw_unit_test`` notifies
/// the handler of various events which occur in the test process.
/// For example, consider a file containing the following test definitions:
///
/// @code{.cpp}
///   TEST(MyTestSuite, MyFirstCase) {
///     EXPECT_TRUE(true);
///   }
///
///   TEST(MyTestSuite, MySecondCase) {
///     EXPECT_TRUE(false);
///   }
/// @endcode
///
/// There's one test suite consisting of two test cases. When ``pw_unit_test``
/// starts running the first test case (``MyFirstCase``), it dispatches a
/// ``TestCaseStart`` event to the event handler. It then runs the body of the
/// test, sequentially checking each expectation within. After each expectation,
/// a
/// ``TestCaseExpect`` event is sent to the event handler with the expectation's
/// result. In this case, there's only one, which passes successfully. Finally,
/// after the test is finished, a ``TestCaseEnd`` event is dispatched with the
/// overall result of the test case. ``pw_unit_test`` then runs ``MySecondCase``
/// in the same way.
class EventHandler {
 public:
  virtual ~EventHandler() = default;

  /// Called before any test activity starts.
  virtual void TestProgramStart(const ProgramSummary& program_summary) = 0;

  /// Called after environment setup for each iteration of tests ends.
  virtual void EnvironmentsSetUpEnd() = 0;

  /// Called before the test suite starts.
  virtual void TestSuiteStart(const TestSuite& test_suite) = 0;

  /// Called after the test suite ends.
  virtual void TestSuiteEnd(const TestSuite& test_suite) = 0;

  /// Called after environment teardown for each iteration of tests ends.
  virtual void EnvironmentsTearDownEnd() = 0;

  /// Called after all test activities have ended.
  virtual void TestProgramEnd(const ProgramSummary& program_summary) = 0;

  /// Called before all tests are run.
  virtual void RunAllTestsStart() = 0;

  /// Called after all tests are run.
  virtual void RunAllTestsEnd(const RunTestsSummary& run_tests_summary) = 0;

  /// Called when a new test case is started.
  virtual void TestCaseStart(const TestCase& test_case) = 0;

  /// Called when a test case completes. The overall result of the test case is
  /// provided.
  virtual void TestCaseEnd(const TestCase& test_case, TestResult result) = 0;

  /// Called when a disabled test case is encountered.
  virtual void TestCaseDisabled(const TestCase&) {}

  /// Called after each expect or assert statement within a test case with the
  /// result.
  virtual void TestCaseExpect(const TestCase& test_case,
                              const TestExpectation& expectation) = 0;
};

/// Sets the event handler for a test run. Must be called before
/// `RUN_ALL_TESTS()` to receive test output. Set `event_handler` to null
/// to disable event handling.
///
/// @warning This method is not thread-safe.
void RegisterEventHandler(EventHandler* event_handler);

}  // namespace unit_test
}  // namespace pw
