/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */

#include <cmConfigure.h> // IWYU pragma: keep

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

#include "cmFindPackageCommand.h"

#define cmPassed(m) std::cout << "Passed: " << (m) << "\n"
#define cmFailed(m)                                                           \
  std::cout << "FAILED: " << (m) << "\n";                                     \
  failed = 1

int testFindPackageCommand(int /*unused*/, char* /*unused*/[])
{
  int failed = 0;

  // ----------------------------------------------------------------------
  // Test cmFindPackage::Sort
  std::vector<std::string> testString;
  testString.push_back("lib-0.0");
  testString.push_back("lib-1.2");
  testString.push_back("lib-2.0");
  testString.push_back("lib-19.0.1");
  testString.push_back("lib-20.01.1");
  testString.push_back("lib-20.2.2a");

  cmFindPackageCommand::Sort(testString.begin(), testString.end(),
                             cmFindPackageCommand::Natural,
                             cmFindPackageCommand::Asc);
  if (!(testString[0] == "lib-0.0" && testString[1] == "lib-1.2" &&
        testString[2] == "lib-2.0" && testString[3] == "lib-19.0.1" &&
        testString[4] == "lib-20.01.1" && testString[5] == "lib-20.2.2a")) {
    cmFailed("cmSystemTools::Sort fail with Natural ASC");
  }

  cmFindPackageCommand::Sort(testString.begin(), testString.end(),
                             cmFindPackageCommand::Natural,
                             cmFindPackageCommand::Dec);
  if (!(testString[5] == "lib-0.0" && testString[4] == "lib-1.2" &&
        testString[3] == "lib-2.0" && testString[2] == "lib-19.0.1" &&
        testString[1] == "lib-20.01.1" && testString[0] == "lib-20.2.2a")) {
    cmFailed("cmSystemTools::Sort fail with Natural ASC");
  }

  cmFindPackageCommand::Sort(testString.begin(), testString.end(),
                             cmFindPackageCommand::Name_order,
                             cmFindPackageCommand::Dec);
  if (!(testString[5] == "lib-0.0" && testString[4] == "lib-1.2" &&
        testString[3] == "lib-19.0.1" && testString[2] == "lib-2.0" &&
        testString[1] == "lib-20.01.1" && testString[0] == "lib-20.2.2a")) {
    cmFailed("cmSystemTools::Sort fail with Name DEC");
  }

  cmFindPackageCommand::Sort(testString.begin(), testString.end(),
                             cmFindPackageCommand::Name_order,
                             cmFindPackageCommand::Asc);
  if (!(testString[0] == "lib-0.0" && testString[1] == "lib-1.2" &&
        testString[2] == "lib-19.0.1" && testString[3] == "lib-2.0" &&
        testString[4] == "lib-20.01.1" && testString[5] == "lib-20.2.2a")) {
    cmFailed("cmSystemTools::Sort fail with Natural ASC");
  }

  if (!failed) {
    cmPassed("cmSystemTools::Sort working");
  }
  return failed;
}
