testCTestResourceGroups.cxx 3.36 KB
Newer Older
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
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */

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

#include "cmCTestTestHandler.h"

struct ExpectedParseResult
{
  std::string String;
  bool ExpectedReturnValue;
  std::vector<std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>>
    ExpectedValue;
};

static const std::vector<ExpectedParseResult> expectedResults{
  /* clang-format off */
  { "threads:2", true, {
    { { "threads", 2, 1 } },
  } },
  { "3,threads:2", true, {
    { { "threads", 2, 1 } },
    { { "threads", 2, 1 } },
    { { "threads", 2, 1 } },
  } },
  { "3,threads:2,gpus:4", true, {
    { { "threads", 2, 1 }, { "gpus", 4, 1 } },
    { { "threads", 2, 1 }, { "gpus", 4, 1 } },
    { { "threads", 2, 1 }, { "gpus", 4, 1 } },
  } },
  { "2,threads:2;gpus:4", true, {
    { { "threads", 2, 1 } },
    { { "threads", 2, 1 } },
    { { "gpus", 4, 1 } },
  } },
  { "threads:2;2,gpus:4", true, {
    { { "threads", 2, 1 } },
    { { "gpus", 4, 1 } },
    { { "gpus", 4, 1 } },
  } },
  { "threads:2;gpus:4", true, {
    { { "threads", 2, 1 } },
    { { "gpus", 4, 1 } },
  } },
  { "1,threads:2;0,gpus:4", true, {
    { { "threads", 2, 1 } },
  } },
  { "1,_:1", true, {
    { { "_", 1, 1 } },
  } },
  { "1,a:1", true, {
    { { "a", 1, 1 } },
  } },
  { "2", true, {
    {},
    {},
  } },
  { "1;2,threads:1", true, {
    {},
    { { "threads", 1, 1 } },
    { { "threads", 1, 1 } },
  } },
  { "1,,threads:1", true, {
    { { "threads", 1, 1 } },
  } },
  { ";1,threads:1", true, {
    { { "threads", 1, 1 } },
  } },
  { "1,threads:1;", true, {
    { { "threads", 1, 1 } },
  } },
  { "1,threads:1,", true, {
    { { "threads", 1, 1 } },
  } },
  { "threads:1;;threads:2", true, {
    { { "threads", 1, 1 } },
    { { "threads", 2, 1 } },
  } },
  { "1,", true, {
    {},
  } },
  { ";", true, {} },
  { "", true, {} },
  { ",", false, {} },
  { "1,0:1", false, {} },
  { "1,A:1", false, {} },
  { "1,a-b:1", false, {} },
  { "invalid", false, {} },
  { ",1,invalid:1", false, {} },
  { "1,1", false, {} },
  { "-1,invalid:1", false, {} },
  { "1,invalid:*", false, {} },
  { "1,invalid:-1", false, {} },
  { "1,invalid:-", false, {} },
  { "1,invalid:ab2", false, {} },
  { "1,invalid :2", false, {} },
  { "1, invalid:2", false, {} },
  { "1,invalid:ab", false, {} },
  /* clang-format on */
};

bool TestExpectedParseResult(const ExpectedParseResult& expected)
{
  std::vector<std::vector<cmCTestTestHandler::cmCTestTestResourceRequirement>>
    result;
  bool retval;
109
  if ((retval = cmCTestTestHandler::ParseResourceGroupsProperty(
110
         expected.String, result)) != expected.ExpectedReturnValue) {
111
    std::cout << "ParseResourceGroupsProperty(\"" << expected.String
112 113 114 115 116 117
              << "\") returned " << retval << ", should be "
              << expected.ExpectedReturnValue << std::endl;
    return false;
  }

  if (result != expected.ExpectedValue) {
118 119 120
    std::cout << "ParseResourceGroupsProperty(\"" << expected.String
              << "\") did not yield expected set of resource groups"
              << std::endl;
121 122 123 124 125 126
    return false;
  }

  return true;
}

127
int testCTestResourceGroups(int /*unused*/, char* /*unused*/ [])
128 129 130 131 132 133 134 135 136 137 138
{
  int retval = 0;

  for (auto const& expected : expectedResults) {
    if (!TestExpectedParseResult(expected)) {
      retval = 1;
    }
  }

  return retval;
}