#include "buildjson/buildjson.hpp"
#include "errors/exception.hpp"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace pid_control
{
namespace
{

TEST(ConfigurationVerificationTest, VerifyHappy)
{
    /* Verify a happy configuration throws no exceptions. */
    auto j2 = R"(
      {
        "sensors": [{
          "name": "fan1",
          "type": "fan",
          "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
        }],
        "zones": [{
          "id": 1,
          "minThermalOutput": 3000.0,
          "failsafePercent": 75.0,
          "pids": [{
            "name": "fan1-5",
            "type": "fan",
            "inputs": ["fan1", "fan5"],
            "setpoint": 90.0,
            "pid": {
              "samplePeriod": 0.1,
              "proportionalCoeff": 0.0,
              "integralCoeff": 0.0,
              "feedFwdOffsetCoeff": 0.0,
              "feedFwdGainCoeff": 0.010,
              "integralLimit_min": 0.0,
              "integralLimit_max": 0.0,
              "outLim_min": 30.0,
              "outLim_max": 100.0,
              "slewNeg": 0.0,
              "slewPos": 0.0
            }
          }]
        }]
      }
    )"_json;

    validateJson(j2);
}

TEST(ConfigurationVerificationTest, VerifyNoSensorKey)
{
    /* Verify the sensors key must be present. */
    auto j2 = R"(
      {
        "zones": [{
          "id": 1,
          "minThermalOutput": 3000.0,
          "failsafePercent": 75.0,
          "pids": [{
            "name": "fan1-5",
            "type": "fan",
            "inputs": ["fan1", "fan5"],
            "setpoint": 90.0,
            "pid": {
              "samplePeriod": 0.1,
              "proportionalCoeff": 0.0,
              "integralCoeff": 0.0,
              "feedFwdOffsetCoeff": 0.0,
              "feedFwdGainCoeff": 0.010,
              "integralLimit_min": 0.0,
              "integralLimit_max": 0.0,
              "outLim_min": 30.0,
              "outLim_max": 100.0,
              "slewNeg": 0.0,
              "slewPos": 0.0
            }
          }]
        }]
      }
    )"_json;

    EXPECT_THROW(validateJson(j2), ConfigurationException);
}

TEST(ConfigurationVerificationTest, VerifyNoZoneKey)
{
    /* Verify the zones key must be present. */
    auto j2 = R"(
      {
        "sensors": [{
          "name": "fan1",
          "type": "fan",
          "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
        }]
      }
    )"_json;

    EXPECT_THROW(validateJson(j2), ConfigurationException);
}

TEST(ConfigurationVerificationTest, VerifyNoSensor)
{
    /* Verify that there needs to be at least one sensor in the sensors key. */
    auto j2 = R"(
      {
        "sensors": [],
        "zones": [{
          "id": 1,
          "minThermalOutput": 3000.0,
          "failsafePercent": 75.0,
          "pids": [{
            "name": "fan1-5",
            "type": "fan",
            "inputs": ["fan1", "fan5"],
            "setpoint": 90.0,
            "pid": {
              "samplePeriod": 0.1,
              "proportionalCoeff": 0.0,
              "integralCoeff": 0.0,
              "feedFwdOffsetCoeff": 0.0,
              "feedFwdGainCoeff": 0.010,
              "integralLimit_min": 0.0,
              "integralLimit_max": 0.0,
              "outLim_min": 30.0,
              "outLim_max": 100.0,
              "slewNeg": 0.0,
              "slewPos": 0.0
            }
          }]
        }]
      }
    )"_json;

    EXPECT_THROW(validateJson(j2), ConfigurationException);
}

TEST(ConfigurationVerificationTest, VerifyNoPidInZone)
{
    /* Verify that there needs to be at least one PID in the zone. */
    auto j2 = R"(
      {
        "sensors": [{
          "name": "fan1",
          "type": "fan",
          "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1"
        }],
        "zones": [{
          "id": 1,
          "minThermalOutput": 3000.0,
          "failsafePercent": 75.0,
          "pids": []
        }]
      }
    )"_json;

    EXPECT_THROW(validateJson(j2), ConfigurationException);
}

} // namespace
} // namespace pid_control
