File: TestStringToken.cxx

package info (click to toggle)
vtk9 9.3.0%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 267,116 kB
  • sloc: cpp: 2,195,914; ansic: 285,452; python: 104,858; sh: 4,061; yacc: 4,035; java: 3,977; xml: 2,771; perl: 2,189; lex: 1,762; objc: 153; makefile: 150; javascript: 90; tcl: 59
file content (147 lines) | stat: -rw-r--r-- 5,358 bytes parent folder | download
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
147
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
// .NAME Test of vtkStringToken.
// .SECTION Description
// Tests build-time tokenizing strings using the vtkStringToken class.

#include "vtkDebugLeaks.h"
#include "vtkStringManager.h"
#include "vtkStringToken.h"

#include <string>
#include <vector>

int TestStringToken(int, char*[])
{
  using namespace vtk::literals; // for ""_token().
  int result = 0;

  vtkStringToken defaultToken; // default constructor should be Invalid token.
  vtkStringToken eid("");
  auto missing = "not present in manager because token constructed from hash, not string."_token;
  vtkStringToken fooTheBar1("foo the bar");
  auto fooTheBar2 = "foo the bar"_token;

  std::cout << "default token is " << defaultToken.GetId() << "\n";
  std::cout << "empty string is " << eid.GetId() << "\n";
  std::cout << "missing is " << missing.GetId() << "\n";
  std::cout << "foo the bar is " << fooTheBar1.GetId() << " == " << fooTheBar2.GetId() << "\n";

  if (defaultToken.GetId() != vtkStringManager::Invalid)
  {
    std::cerr << "ERROR: Default token constructor should be initialized to Invalid token\n";
  }

  std::vector<std::pair<std::string, vtkStringToken::Hash>> tests{ { { "", 2166136261u },
    { "a", 3826002220u }, { "b", 3876335077u }, { "cell", 1759288501u }, { "curve", 2570585620u },
    { "edge", 1459017788u }, { "face", 292255708u }, { "point", 414084241u },
    { "surface", 425316092u }, { "vertex", 2488493991u }, { "volume", 786459023u } } };
  for (const auto& test : tests)
  {
    vtkStringToken xx(test.first);
    std::cout << "  " << xx.GetId() << " \"" << test.first << "\"\n";
    if (test.second != xx.GetId())
    {
      std::cerr << "    ERROR: Expected " << test.second << " got " << xx.GetId() << "\n";
      result = 1;
    }
  }

  std::cout << "Now look up strings from hash values via vtkStringManager\n";
  auto* sm = const_cast<vtkStringManager*>(vtkStringToken::GetManager());
  sm->VisitMembers([&sm](vtkStringManager::Hash hh) {
    std::cout << "  " << hh << " \"" << sm->Value(hh) << "\"\n";
    return vtkStringManager::Visit::Continue;
  });
  std::cout << "Test that missing strings resolve as empty.\n";
  auto missingString = sm->Value(missing.GetId());
  std::cout << "missing string from hash: \"" << missingString << "\" (len " << missingString.size()
            << ")\n";

  // Use the string manager to group some tokens into a named set
  // (emulating a dynamic enumeration).
  std::size_t numberVisited = 0;
  vtkStringManager::Visitor visitor = [&](vtkStringManager::Hash hh) {
    std::cout << "  " << ++numberVisited << ": " << hh << "\n";
    return vtkStringManager::Visit::Continue;
  };
  // Verify that there are no enumeration-sets to begin with.
  auto outcome = sm->VisitSets(visitor);
  if (numberVisited || outcome != vtkStringManager::Visit::Continue)
  {
    std::cerr << "ERROR: Expected an empty set of keys, found " << numberVisited << "\n";
    result = 1;
  }

  // Test adding an enumeration-set.
  vtkStringToken geomEnum("geometries");
  std::cout << "Create an enumeration set for \"geometries\" (" << geomEnum.GetId() << ")\n";
  sm->Insert(geomEnum.GetId(), "point"_hash);
  sm->Insert(geomEnum.GetId(), "curve"_hash);
  sm->Insert(geomEnum.GetId(), "surface"_hash);
  sm->Insert(geomEnum.Data(), "volume"_hash);
  outcome = sm->VisitSets(visitor);
  if (numberVisited != 1)
  {
    std::cerr << "ERROR: Expected 1 key, found " << numberVisited << "\n";
    result = 1;
  }
  numberVisited = 0;
  std::cout << "Visiting members of \"geometries\"\n";
  outcome = sm->VisitMembers(visitor, geomEnum.GetId());
  if (numberVisited != 4)
  {
    std::cerr << "ERROR: Expected 4 values, found " << numberVisited << "\n";
    result = 1;
  }

  // Test removal of a string from an enumeration-set.
  std::cout << "Remove \"volume\" from \"geometries\".\nRemaining members:\n";
  if (!sm->Remove("geometries"_hash, "volume"_hash))
  {
    std::cerr << "ERROR: Expected to remove \"volume\".\n";
    result = 1;
  }
  numberVisited = 0;
  outcome = sm->VisitMembers(visitor, geomEnum.GetId());
  if (numberVisited != 3)
  {
    std::cerr << "ERROR: Expected 4 values, found " << numberVisited << "\n";
    result = 1;
  }

  // Attempt to add an invalid member to a valid set.
  if (sm->Insert(geomEnum.GetId(), "foo"_hash))
  {
    std::cerr << "ERROR: Expected failure when adding an invalid member-hash to a set.\n";
    result = 1;
  }

  // Attempt to add a valid member to an invalid set-hash.
  if (sm->Insert("foo"_hash, "point"_hash))
  {
    std::cerr << "ERROR: Expected failure when adding a member-hash to an invalid set.\n";
    result = 1;
  }

  // Erase the set (which also erases all its members).
  std::cout << "Test erasing an enumeration set.\n";
  auto numRemoved = sm->Unmanage(geomEnum.GetId());
  if (numRemoved != 4)
  {
    std::cerr << "ERROR: Removing \"geometries\" erased " << numRemoved << " items, expected 4.\n";
    result = 1;
  }
  if (sm->Find("geometries") != vtkStringManager::Invalid)
  {
    std::cerr << "ERROR: Should have unmanaged \"geometries\".\n";
    result = 1;
  }
  if (sm->Find("point") != vtkStringManager::Invalid)
  {
    std::cerr << "ERROR: Should have unmanaged \"point\".\n";
    result = 1;
  }

  return result;
}