/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst 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;
}
