#include <iostream>
#include <string>
#include <vector>

#include "cmCTestResourceSpec.h"

struct ExpectedSpec
{
  std::string Path;
  bool ParseResult;
  cmCTestResourceSpec Expected;
};

static const std::vector<ExpectedSpec> expectedResourceSpecs = {
  /* clang-format off */
  {"spec1.json", true, {{{
    {"gpus", {
      {"2", 4},
      {"e", 1},
    }},
    {"threads", {
    }},
  }}}},
  {"spec2.json", true, {{{
  }}}},
  {"spec3.json", false, {{{}}}},
  {"spec4.json", false, {{{}}}},
  {"spec5.json", false, {{{}}}},
  {"spec6.json", false, {{{}}}},
  {"spec7.json", false, {{{}}}},
  {"spec8.json", false, {{{}}}},
  {"spec9.json", false, {{{}}}},
  {"spec10.json", false, {{{}}}},
  {"spec11.json", false, {{{}}}},
  {"spec12.json", false, {{{}}}},
  {"spec13.json", false, {{{}}}},
  {"spec14.json", true, {{{}}}},
  {"spec15.json", true, {{{}}}},
  {"spec16.json", true, {{{}}}},
  {"spec17.json", false, {{{}}}},
  {"spec18.json", false, {{{}}}},
  {"spec19.json", false, {{{}}}},
  {"spec20.json", true, {{{}}}},
  {"spec21.json", false, {{{}}}},
  {"spec22.json", false, {{{}}}},
  {"spec23.json", false, {{{}}}},
  {"spec24.json", false, {{{}}}},
  {"spec25.json", false, {{{}}}},
  {"spec26.json", false, {{{}}}},
  {"spec27.json", false, {{{}}}},
  {"spec28.json", false, {{{}}}},
  {"spec29.json", false, {{{}}}},
  {"spec30.json", false, {{{}}}},
  {"spec31.json", false, {{{}}}},
  {"spec32.json", false, {{{}}}},
  {"spec33.json", false, {{{}}}},
  {"spec34.json", false, {{{}}}},
  {"spec35.json", false, {{{}}}},
  {"noexist.json", false, {{{}}}},
  /* clang-format on */
};

static bool testSpec(const std::string& path, bool expectedResult,
                     const cmCTestResourceSpec& expected)
{
  cmCTestResourceSpec actual;
  bool result = actual.ReadFromJSONFile(path);
  if (result != expectedResult) {
    std::cout << "ReadFromJSONFile(\"" << path << "\") returned " << result
              << ", should be " << expectedResult << std::endl;
    return false;
  }

  if (result && actual != expected) {
    std::cout << "ReadFromJSONFile(\"" << path
              << "\") did not give expected spec" << std::endl;
    return false;
  }

  return true;
}

int testCTestResourceSpec(int argc, char** const argv)
{
  if (argc < 2) {
    std::cout << "Invalid arguments.\n";
    return -1;
  }

  int retval = 0;
  for (auto const& spec : expectedResourceSpecs) {
    std::string path = argv[1];
    path += "/testCTestResourceSpec_data/";
    path += spec.Path;
    if (!testSpec(path, spec.ParseResult, spec.Expected)) {
      retval = -1;
    }
  }

  return retval;
}
