#include <gtest/gtest.h>

#include <stdint.h>

extern "C" {
  #include "pa_tz_internal.h"
}

typedef struct {
  e_PaDriverAuthenticateResult authenticate_result;
  PaTzResult  test_result;
} ResultInfo;

static PaDriverCommandAuthenticateResponse_t gAuthenticateResponse;

static const ResultInfo gExpectedResults[] =
  {{PaDriverAuthenticateResult_paAuthenticated, PA_TZ_SUCCESS},
  {PaDriverAuthenticateResult_paTaskIsNotFound, PA_TZ_AF_TASK_IS_NOT_FOUND},
  {PaDriverAuthenticateResult_paIntegrityIsNone, PA_TZ_AF_INTEGRITY_IS_NONE},
  {PaDriverAuthenticateResult_paIntegrityIsNotready, PA_TZ_AF_INTEGRITY_IS_NOT_READY},
  {PaDriverAuthenticateResult_paCertificateIsAbsent, PA_TZ_AF_CERTIFICATE_IS_ABSENT},
  {PaDriverAuthenticateResult_paCertificateIsIncorrect, PA_TZ_AF_CERTIFICATE_IS_INCORRECT},
  {PaDriverAuthenticateResult_paCertificateIsNotMatch, PA_TZ_AF_CERTIFICATE_IS_NOT_MATCH},
  {PaDriverAuthenticateResult_paAppNameIsIncorrect, PA_TZ_AF_APPNAME_IS_INCORRECT},
  {PaDriverAuthenticateResult_paAppNameIsNotUnique, PA_TZ_AF_TASK_HAS_DUPLICATE},
  {/*default*/(e_PaDriverAuthenticateResult)100, PA_TZ_AUTHENTICATION_FAILED}};
                                              

class PaTzInternalTest : public ::testing::Test {
};

TEST_F(PaTzInternalTest, ConvertAuthenticateResultFail) {
  PaTzResult res = ConvertAuthenticateResult(NULL);
  EXPECT_EQ(PA_TZ_AUTHENTICATION_FAILED, res);
}

TEST_F(PaTzInternalTest, ConvertAuthenticateResultEnumeration) {
  for (int i = 0; i < sizeof(gExpectedResults) / sizeof(ResultInfo); i++) {
    gAuthenticateResponse.result = gExpectedResults[i].authenticate_result;
    PaTzResult res = ConvertAuthenticateResult(&gAuthenticateResponse);
    EXPECT_EQ(gExpectedResults[i].test_result, res);
  }
}
