/* 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 <stddef.h>

#include "cmSystemTools.h"

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

#define cmAssert(exp, m)                                                      \
  do {                                                                        \
    if ((exp)) {                                                              \
      cmPassed(m);                                                            \
    } else {                                                                  \
      cmFailed(m);                                                            \
    }                                                                         \
  } while (false)

int testSystemTools(int /*unused*/, char* /*unused*/ [])
{
  int failed = 0;
  // ----------------------------------------------------------------------
  // Test cmSystemTools::UpperCase
  std::string str = "abc";
  std::string strupper = "ABC";
  cmAssert(cmSystemTools::UpperCase(str) == strupper,
           "cmSystemTools::UpperCase");

  // ----------------------------------------------------------------------
  // Test cmSystemTools::strverscmp
  cmAssert(cmSystemTools::strverscmp("", "") == 0, "strverscmp empty string");
  cmAssert(cmSystemTools::strverscmp("abc", "") > 0,
           "strverscmp string vs empty string");
  cmAssert(cmSystemTools::strverscmp("abc", "abc") == 0,
           "strverscmp same string");
  cmAssert(cmSystemTools::strverscmp("abd", "abc") > 0,
           "strverscmp character string");
  cmAssert(cmSystemTools::strverscmp("abc", "abd") < 0,
           "strverscmp symmetric");
  cmAssert(cmSystemTools::strverscmp("12345", "12344") > 0,
           "strverscmp natural numbers");
  cmAssert(cmSystemTools::strverscmp("100", "99") > 0,
           "strverscmp natural numbers different digits");
  cmAssert(cmSystemTools::strverscmp("12345", "00345") > 0,
           "strverscmp natural against decimal (same length)");
  cmAssert(cmSystemTools::strverscmp("99999999999999", "99999999999991") > 0,
           "strverscmp natural overflow");
  cmAssert(cmSystemTools::strverscmp("00000000000009", "00000000000001") > 0,
           "strverscmp decimal precision");
  cmAssert(cmSystemTools::strverscmp("a.b.c.0", "a.b.c.000") > 0,
           "strverscmp multiple zeros");
  cmAssert(cmSystemTools::strverscmp("lib_1.2_10", "lib_1.2_2") > 0,
           "strverscmp last number ");
  cmAssert(cmSystemTools::strverscmp("12lib", "2lib") > 0,
           "strverscmp first number ");
  cmAssert(cmSystemTools::strverscmp("02lib", "002lib") > 0,
           "strverscmp first number decimal ");
  cmAssert(cmSystemTools::strverscmp("10", "9a") > 0,
           "strverscmp letter filler ");
  cmAssert(cmSystemTools::strverscmp("000", "0001") > 0,
           "strverscmp zero and leading zeros  ");

  // test sorting using standard strvercmp input
  std::vector<std::string> testString;
  testString.push_back("000");
  testString.push_back("00");
  testString.push_back("01");
  testString.push_back("010");
  testString.push_back("09");
  testString.push_back("0");
  testString.push_back("1");
  testString.push_back("9");
  testString.push_back("10");

  // test global ordering of input strings
  for (size_t i = 0; i < testString.size() - 1; i++) {
    for (size_t j = i + 1; j < testString.size(); j++) {
      if (cmSystemTools::strverscmp(testString[i], testString[j]) >= 0) {
        cmFailed("cmSystemTools::strverscmp error in comparing strings " +
                 testString[i] + " " + testString[j]);
      }
    }
  }

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

  return failed;
}
