summaryrefslogtreecommitdiff
path: root/Tests/CMakeLib/testSystemTools.cxx
blob: 0f0c025d464c52df96aaae49713945defcab2538 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* 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::VersionCompare
  cmAssert(cmSystemTools::VersionCompareEqual("", ""),
           "VersionCompareEqual empty string");
  cmAssert(!cmSystemTools::VersionCompareGreater("", ""),
           "VersionCompareGreater empty string");
  cmAssert(cmSystemTools::VersionCompareEqual("1", "1a"),
           "VersionCompareEqual letters");
  cmAssert(!cmSystemTools::VersionCompareGreater("1", "1a"),
           "VersionCompareGreater letters");
  cmAssert(cmSystemTools::VersionCompareEqual("001", "1"),
           "VersionCompareEqual leading zeros equal");
  cmAssert(!cmSystemTools::VersionCompareGreater("001", "1"),
           "VersionCompareGreater leading zeros equal");
  cmAssert(!cmSystemTools::VersionCompareEqual("002", "1"),
           "VersionCompareEqual leading zeros greater");
  cmAssert(cmSystemTools::VersionCompareGreater("002", "1"),
           "VersionCompareGreater leading zeros greater");
  cmAssert(!cmSystemTools::VersionCompareEqual("6.2.1", "6.3.1"),
           "VersionCompareEqual components less");
  cmAssert(!cmSystemTools::VersionCompareGreater("6.2.1", "6.3.1"),
           "VersionCompareGreater components less");
  cmAssert(!cmSystemTools::VersionCompareEqual("6.2.1", "6.2"),
           "VersionCompareEqual different length");
  cmAssert(cmSystemTools::VersionCompareGreater("6.2.1", "6.2"),
           "VersionCompareGreater different length");
  cmAssert(
    !cmSystemTools::VersionCompareEqual(
      "3.14159265358979323846264338327950288419716939937510582097494459230",
      "3.14159265358979323846264338327950288419716939937510582097494459231"),
    "VersionCompareEqual long number");
  cmAssert(
    !cmSystemTools::VersionCompareGreater(
      "3.14159265358979323846264338327950288419716939937510582097494459230",
      "3.14159265358979323846264338327950288419716939937510582097494459231"),
    "VersionCompareGreater long number");
  cmAssert(
    !cmSystemTools::VersionCompareEqual(
      "3.141592653589793238462643383279502884197169399375105820974944592307",
      "3.14159265358979323846264338327950288419716939937510582097494459231"),
    "VersionCompareEqual more digits");
  cmAssert(
    cmSystemTools::VersionCompareGreater(
      "3.141592653589793238462643383279502884197169399375105820974944592307",
      "3.14159265358979323846264338327950288419716939937510582097494459231"),
    "VersionCompareGreater more digits");

  // ----------------------------------------------------------------------
  // 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;
}