#include "testVisualStudioSlnParser.h"

#include "cmVisualStudioSlnData.h"
#include "cmVisualStudioSlnParser.h"

#include <iostream>

static bool parsedRight(cmVisualStudioSlnParser& parser,
                        const std::string& file, cmSlnData& data,
                        cmVisualStudioSlnParser::ParseResult expected =
                          cmVisualStudioSlnParser::ResultOK)
{
  if (parser.ParseFile(SOURCE_DIR "/testVisualStudioSlnParser_data/" + file +
                         "." SLN_EXTENSION,
                       data, cmVisualStudioSlnParser::DataGroupProjects)) {
    if (expected == cmVisualStudioSlnParser::ResultOK) {
      return true;
    }
  } else {
    if (parser.GetParseResult() == expected) {
      return true;
    }
  }
  std::cerr << "cmVisualStudioSlnParser mis-parsed " << file
            << "." SLN_EXTENSION << "; expected result " << expected
            << ", got " << parser.GetParseResult() << std::endl;
  return false;
}

int testVisualStudioSlnParser(int, char* [])
{
  cmVisualStudioSlnParser parser;

  // Test clean parser
  if (parser.GetParseResult() != cmVisualStudioSlnParser::ResultOK) {
    std::cerr << "cmVisualStudioSlnParser initialisation failed" << std::endl;
    return 1;
  }

  // Test parsing valid sln
  {
    cmSlnData data;
    if (!parsedRight(parser, "valid", data)) {
      return 1;
    }
    const std::vector<cmSlnProjectEntry>& projects = data.GetProjects();
    const char* const names[] = {
      "3rdParty",
      "ALL_BUILD",
      "CMakeLib",
      "CMakeLibTests",
      "CMakePredefinedTargets",
      "CPackLib",
      "CTestDashboardTargets",
      "CTestLib",
      "Continuous",
      "Documentation",
      "Experimental",
      "INSTALL",
      "KWSys",
      "LIBCURL",
      "Nightly",
      "NightlyMemoryCheck",
      "PACKAGE",
      "RUN_TESTS",
      "Tests",
      "Utilities",
      "Win9xCompat",
      "ZERO_CHECK",
      "cmIML_test",
      "cmake",
      "cmbzip2",
      "cmcldeps",
      "cmcompress",
      "cmcurl",
      "cmexpat",
      "cmlibarchive",
      "cmsys",
      "cmsysEncodeExecutable",
      "cmsysProcessFwd9x",
      "cmsysTestDynload",
      "cmsysTestProcess",
      "cmsysTestSharedForward",
      "cmsysTestsC",
      "cmsysTestsCxx",
      "cmsys_c",
      "cmw9xcom",
      "cmzlib",
      "cpack",
      "ctest",
      "documentation",
      "memcheck_fail",
      "pseudo_BC",
      "pseudo_purify",
      "pseudo_valgrind",
      "test_clean",
      "uninstall"
      /* clang-format needs this comment to break after the opening brace */
    };
    const size_t expectedProjectCount = sizeof(names) / sizeof(*names);
    if (projects.size() != expectedProjectCount) {
      std::cerr << "cmVisualStudioSlnParser returned bad number of "
                << "projects (" << projects.size() << " instead of "
                << expectedProjectCount << ')' << std::endl;
      return 1;
    }
    for (size_t idx = 0; idx < expectedProjectCount; ++idx) {
      if (projects[idx].GetName() != names[idx]) {
        std::cerr << "cmVisualStudioSlnParser returned bad project #" << idx
                  << "; expected \"" << names[idx] << "\", got \""
                  << projects[idx].GetName() << '"' << std::endl;
        return 1;
      }
    }
    if (projects[0].GetRelativePath() != "Utilities\\3rdParty") {
      std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
                << "project 3rdParty; expected \"Utilities\\3rdParty\", "
                << "got \"" << projects[0].GetRelativePath() << '"'
                << std::endl;
      return 1;
    }
    if (projects[2].GetGUID() != "{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}") {
      std::cerr << "cmVisualStudioSlnParser returned bad relative path of "
                << "project CMakeLib; expected "
                << "\"{59BCCCCD-3AD1-4491-B8F4-C5793AC007E2}\", "
                << "got \"" << projects[2].GetGUID() << '"' << std::endl;
      return 1;
    }
  }

  // Test BOM parsing
  {
    cmSlnData data;

    if (!parsedRight(parser, "bom", data)) {
      return 1;
    }
    if (!parser.GetParseHadBOM()) {
      std::cerr << "cmVisualStudioSlnParser didn't find BOM in bom."
                << SLN_EXTENSION << std::endl;
      return 1;
    }

    if (!parsedRight(parser, "nobom", data)) {
      return 1;
    }
    if (parser.GetParseHadBOM()) {
      std::cerr << "cmVisualStudioSlnParser found BOM in nobom."
                << SLN_EXTENSION << std::endl;
      return 1;
    }
  }

  // Test invalid sln
  {
    {
      cmSlnData data;
      if (!parsedRight(parser, "err-nonexistent", data,
                       cmVisualStudioSlnParser::ResultErrorOpeningInput)) {
        return 1;
      }
    }
    {
      cmSlnData data;
      if (!parsedRight(parser, "err-empty", data,
                       cmVisualStudioSlnParser::ResultErrorReadingInput)) {
        return 1;
      }
    }
    const char* const files[] = {
      "header",         "projectArgs", "topLevel", "projectContents",
      "projectSection", "global",      "unclosed", "strayQuote",
      "strayParen",     "strayQuote2"
      /* clang-format needs this comment to break after the opening brace */
    };
    for (size_t idx = 0; idx < sizeof(files) / sizeof(files[0]); ++idx) {
      cmSlnData data;
      if (!parsedRight(parser, std::string("err-structure-") + files[idx],
                       data,
                       cmVisualStudioSlnParser::ResultErrorInputStructure)) {
        return 1;
      }
    }
    {
      cmSlnData data;
      if (!parsedRight(parser, "err-data", data,
                       cmVisualStudioSlnParser::ResultErrorInputData)) {
        return 1;
      }
    }
  }

  // All is well
  return 0;
}
