// Copyright 2023 Google LLC
//
// 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.

#include "mpact/sim/generic/program_error.h"

#include "googlemock/include/gmock/gmock.h"
#include "googletest/include/gtest/gtest.h"

using testing::StrEq;

namespace mpact {
namespace sim {
namespace generic {
namespace {

static constexpr char kControllerName[] = "TestController";
static constexpr char kProgramError1[] = "program_error_1";
static constexpr char kMessage1[] = "message 1";

class ProgramErrorTest : public testing::Test {
 protected:
  ProgramErrorTest() {
    controller_ = new ProgramErrorController(kControllerName);
  }

  ~ProgramErrorTest() override { delete controller_; }

  ProgramErrorController* controller_;
};

TEST_F(ProgramErrorTest, ControllerInstantiation) {
  EXPECT_THAT(controller_->name(), StrEq(kControllerName));
  EXPECT_FALSE(controller_->HasError());
  EXPECT_FALSE(controller_->HasMaskedError());
  EXPECT_FALSE(controller_->HasUnmaskedError());
  EXPECT_EQ(controller_->GetMaskedErrorNames().size(), 0);
  EXPECT_EQ(controller_->GetUnmaskedErrorNames().size(), 0);
  EXPECT_TRUE(controller_->HasProgramErrorName(
      ProgramErrorController::kInternalErrorName));
}

TEST_F(ProgramErrorTest, InternalError) {
  // Trying to add a program error with the same name as the internal error name
  // will generate an internal error.
  EXPECT_FALSE(controller_->AddProgramErrorName(
      ProgramErrorController::kInternalErrorName));
  EXPECT_TRUE(controller_->HasError());
  EXPECT_FALSE(controller_->HasMaskedError());
  EXPECT_TRUE(controller_->HasUnmaskedError());
  auto errorNames = controller_->GetUnmaskedErrorNames();
  EXPECT_EQ(errorNames.size(), 1);
  EXPECT_THAT(errorNames[0], StrEq(ProgramErrorController::kInternalErrorName));
  EXPECT_EQ(controller_->GetMaskedErrorNames().size(), 0);
  EXPECT_EQ(
      controller_->GetErrorMessages(ProgramErrorController::kInternalErrorName)
          .size(),
      1);
  // Internal errors cannot be masked, so this will generate an internal error.
  controller_->Mask(ProgramErrorController::kInternalErrorName);
  EXPECT_FALSE(controller_->HasMaskedError());
  EXPECT_TRUE(controller_->HasUnmaskedError());
  EXPECT_EQ(
      controller_->GetErrorMessages(ProgramErrorController::kInternalErrorName)
          .size(),
      2);
  // Clear internal error.
  controller_->Clear(ProgramErrorController::kInternalErrorName);
  EXPECT_FALSE(controller_->HasError());
  EXPECT_FALSE(controller_->HasMaskedError());
  EXPECT_FALSE(controller_->HasUnmaskedError());
  EXPECT_EQ(
      controller_->GetErrorMessages(ProgramErrorController::kInternalErrorName)
          .size(),
      0);
  // Set another internal error and then use ClearAll()
  controller_->AddProgramErrorName(ProgramErrorController::kInternalErrorName);
  controller_->ClearAll();
  EXPECT_FALSE(controller_->HasError());
  EXPECT_FALSE(controller_->HasMaskedError());
  EXPECT_FALSE(controller_->HasUnmaskedError());
  EXPECT_EQ(
      controller_->GetErrorMessages(ProgramErrorController::kInternalErrorName)
          .size(),
      0);
}

TEST_F(ProgramErrorTest, SimpleProgramError) {
  EXPECT_FALSE(controller_->HasProgramErrorName(kProgramError1));
  EXPECT_TRUE(controller_->AddProgramErrorName(kProgramError1));
  EXPECT_TRUE(controller_->HasProgramErrorName(kProgramError1));
  auto program_error_1 = controller_->GetProgramError(kProgramError1);
  EXPECT_NE(program_error_1, nullptr);
  EXPECT_FALSE(controller_->IsMasked(kProgramError1));
  controller_->Mask(kProgramError1);
  EXPECT_TRUE(controller_->IsMasked(kProgramError1));

  // Raise masked error.
  program_error_1->Raise(kMessage1);
  EXPECT_TRUE(controller_->HasError());
  EXPECT_TRUE(controller_->HasMaskedError());
  EXPECT_FALSE(controller_->HasUnmaskedError());
  auto errorNames = controller_->GetMaskedErrorNames();
  EXPECT_EQ(errorNames.size(), 1);
  EXPECT_THAT(errorNames[0], StrEq(kProgramError1));
  auto errorMessages = controller_->GetErrorMessages(kProgramError1);
  EXPECT_EQ(errorMessages.size(), 1);
  EXPECT_THAT(errorMessages[0], StrEq(kMessage1));

  // Unmask the error.
  controller_->Unmask(kProgramError1);
  EXPECT_FALSE(controller_->IsMasked(kProgramError1));
  // The raised error should now be unmasked.
  EXPECT_TRUE(controller_->HasError());
  EXPECT_FALSE(controller_->HasMaskedError());
  EXPECT_TRUE(controller_->HasUnmaskedError());
  errorNames = controller_->GetMaskedErrorNames();
  EXPECT_EQ(errorNames.size(), 0);
  errorNames = controller_->GetUnmaskedErrorNames();
  EXPECT_EQ(errorNames.size(), 1);
  EXPECT_THAT(errorNames[0], StrEq(kProgramError1));
  errorMessages = controller_->GetErrorMessages(kProgramError1);
  EXPECT_EQ(errorMessages.size(), 1);
  EXPECT_THAT(errorMessages[0], StrEq(kMessage1));

  // Mask the error again and verify that it shows as masked.
  controller_->Mask(kProgramError1);
  EXPECT_TRUE(controller_->HasError());
  EXPECT_TRUE(controller_->HasMaskedError());
  EXPECT_FALSE(controller_->HasUnmaskedError());
  errorNames = controller_->GetMaskedErrorNames();
  EXPECT_EQ(errorNames.size(), 1);
  EXPECT_THAT(errorNames[0], StrEq(kProgramError1));
  errorMessages = controller_->GetErrorMessages(kProgramError1);
  EXPECT_EQ(errorMessages.size(), 1);
  EXPECT_THAT(errorMessages[0], StrEq(kMessage1));
  // Clear the error.
  controller_->Clear(kProgramError1);
  EXPECT_FALSE(controller_->HasError());
}

}  // namespace
}  // namespace generic
}  // namespace sim
}  // namespace mpact
