Skip to content

Commit c101e3c

Browse files
rudybearmeta-codesync[bot]
authored andcommitted
igl | Add NameHandleTest for NameHandle and CRC32 utilities
Reviewed By: corporateshark Differential Revision: D109745137 fbshipit-source-id: d2f636ee7afe0e65ad452864790663d709d70ed6
1 parent 1440e89 commit c101e3c

1 file changed

Lines changed: 203 additions & 0 deletions

File tree

‎src/igl/tests/NameHandleTest.cpp‎

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#include <gtest/gtest.h>
9+
10+
#include <igl/NameHandle.h>
11+
12+
#include <functional>
13+
#include <string>
14+
#include <unordered_map>
15+
#include <utility>
16+
#include <vector>
17+
18+
namespace igl::tests {
19+
20+
TEST(NameHandleTest, DefaultConstruction) {
21+
const NameHandle nh;
22+
EXPECT_EQ(nh.getCrc32(), 0u);
23+
EXPECT_STREQ(nh.c_str(), "");
24+
EXPECT_TRUE(nh.toString().empty());
25+
}
26+
27+
TEST(NameHandleTest, ConstructFromStringAndCrc) {
28+
const std::string name = "myUniform";
29+
const uint32_t crc = iglCrc32(name.c_str(), name.length());
30+
const NameHandle nh(name, crc);
31+
EXPECT_STREQ(nh.c_str(), "myUniform");
32+
EXPECT_EQ(nh.getCrc32(), crc);
33+
}
34+
35+
TEST(NameHandleTest, ConstructFromCharPtrAndCrc) {
36+
const char* name = "position";
37+
const uint32_t crc = iglCrc32(name, 8);
38+
const NameHandle nh(name, crc);
39+
EXPECT_STREQ(nh.c_str(), "position");
40+
EXPECT_EQ(nh.getCrc32(), crc);
41+
}
42+
43+
TEST(NameHandleTest, ConstructFromStringViewAndCrc) {
44+
const std::string_view name = "texCoord";
45+
const uint32_t crc = iglCrc32ConstExpr(name);
46+
const NameHandle nh(name, crc);
47+
EXPECT_EQ(nh.toString(), "texCoord");
48+
EXPECT_EQ(nh.getCrc32(), crc);
49+
}
50+
51+
TEST(NameHandleTest, CopyConstruction) {
52+
const NameHandle original = IGL_NAMEHANDLE("color");
53+
const NameHandle copy(original);
54+
EXPECT_EQ(copy, original);
55+
EXPECT_STREQ(copy.c_str(), "color");
56+
EXPECT_EQ(copy.getCrc32(), original.getCrc32());
57+
}
58+
59+
TEST(NameHandleTest, MoveConstruction) {
60+
NameHandle original = IGL_NAMEHANDLE("normal");
61+
const uint32_t crc = original.getCrc32();
62+
const NameHandle moved(std::move(original));
63+
EXPECT_STREQ(moved.c_str(), "normal");
64+
EXPECT_EQ(moved.getCrc32(), crc);
65+
}
66+
67+
TEST(NameHandleTest, CopyAssignment) {
68+
const NameHandle src = IGL_NAMEHANDLE("alpha");
69+
NameHandle dst = IGL_NAMEHANDLE("beta");
70+
EXPECT_NE(src, dst);
71+
dst = src;
72+
EXPECT_EQ(dst, src);
73+
EXPECT_STREQ(dst.c_str(), "alpha");
74+
}
75+
76+
TEST(NameHandleTest, CopyAssignmentSameCrcSkipsUpdate) {
77+
const NameHandle nh = IGL_NAMEHANDLE("gamma");
78+
NameHandle copy = nh;
79+
copy = nh;
80+
EXPECT_EQ(copy, nh);
81+
}
82+
83+
TEST(NameHandleTest, MoveAssignment) {
84+
NameHandle src = IGL_NAMEHANDLE("delta");
85+
const uint32_t crc = src.getCrc32();
86+
NameHandle dst;
87+
dst = std::move(src);
88+
EXPECT_STREQ(dst.c_str(), "delta");
89+
EXPECT_EQ(dst.getCrc32(), crc);
90+
}
91+
92+
TEST(NameHandleTest, EqualityReflexive) {
93+
const NameHandle nh = IGL_NAMEHANDLE("test");
94+
EXPECT_EQ(nh, nh);
95+
}
96+
97+
TEST(NameHandleTest, EqualitySameString) {
98+
const NameHandle a = IGL_NAMEHANDLE("uniform");
99+
const NameHandle b = IGL_NAMEHANDLE("uniform");
100+
EXPECT_EQ(a, b);
101+
}
102+
103+
TEST(NameHandleTest, InequalityDifferentStrings) {
104+
const NameHandle a = IGL_NAMEHANDLE("foo");
105+
const NameHandle b = IGL_NAMEHANDLE("bar");
106+
EXPECT_NE(a, b);
107+
}
108+
109+
TEST(NameHandleTest, LessThanOperator) {
110+
const NameHandle a = IGL_NAMEHANDLE("aaa");
111+
const NameHandle b = IGL_NAMEHANDLE("zzz");
112+
if (a.getCrc32() < b.getCrc32()) {
113+
EXPECT_LT(a, b);
114+
EXPECT_FALSE(a > b);
115+
} else {
116+
EXPECT_GT(a, b);
117+
EXPECT_FALSE(a < b);
118+
}
119+
}
120+
121+
TEST(NameHandleTest, LessOrEqualOperator) {
122+
const NameHandle a = IGL_NAMEHANDLE("same");
123+
const NameHandle b = IGL_NAMEHANDLE("same");
124+
EXPECT_LE(a, b);
125+
EXPECT_GE(a, b);
126+
}
127+
128+
TEST(NameHandleTest, ConversionToConstCharPtr) {
129+
const NameHandle nh = IGL_NAMEHANDLE("convert");
130+
const char* str = nh;
131+
EXPECT_STREQ(str, "convert");
132+
}
133+
134+
TEST(NameHandleTest, GenNameHandle) {
135+
const std::string name = "myBuffer";
136+
const NameHandle nh = genNameHandle(name);
137+
EXPECT_STREQ(nh.c_str(), "myBuffer");
138+
EXPECT_EQ(nh.getCrc32(), iglCrc32(name.c_str(), name.length()));
139+
}
140+
141+
TEST(NameHandleTest, IglNamehandleMacro) {
142+
const NameHandle nh = IGL_NAMEHANDLE("macroTest");
143+
EXPECT_STREQ(nh.c_str(), "macroTest");
144+
EXPECT_EQ(nh.getCrc32(), iglCrc32ConstExpr("macroTest"));
145+
}
146+
147+
TEST(NameHandleTest, Crc32ConstExprCharPtrMatchesRuntime) {
148+
const char* str = "hello";
149+
const uint32_t constexprCrc = iglCrc32ConstExpr(str);
150+
const uint32_t runtimeCrc = iglCrc32(str, 5);
151+
EXPECT_EQ(constexprCrc, runtimeCrc);
152+
}
153+
154+
TEST(NameHandleTest, Crc32ConstExprStringViewMatchesCharPtr) {
155+
const char* str = "world";
156+
const std::string_view sv = str;
157+
EXPECT_EQ(iglCrc32ConstExpr(str), iglCrc32ConstExpr(sv));
158+
}
159+
160+
TEST(NameHandleTest, Crc32EmptyStringConsistent) {
161+
const uint32_t crc = iglCrc32ConstExpr("");
162+
const uint32_t crcSv = iglCrc32ConstExpr(std::string_view(""));
163+
EXPECT_EQ(crc, crcSv);
164+
}
165+
166+
TEST(NameHandleTest, HashConsistency) {
167+
const NameHandle nh = IGL_NAMEHANDLE("hashMe");
168+
const std::hash<NameHandle> hasher;
169+
EXPECT_EQ(hasher(nh), hasher(nh));
170+
}
171+
172+
TEST(NameHandleTest, HashEqualObjectsSameHash) {
173+
const NameHandle a = IGL_NAMEHANDLE("equal");
174+
const NameHandle b = IGL_NAMEHANDLE("equal");
175+
const std::hash<NameHandle> hasher;
176+
EXPECT_EQ(hasher(a), hasher(b));
177+
}
178+
179+
TEST(NameHandleTest, HashDifferentObjectsDifferentHash) {
180+
const NameHandle a = IGL_NAMEHANDLE("one");
181+
const NameHandle b = IGL_NAMEHANDLE("two");
182+
const std::hash<NameHandle> hasher;
183+
EXPECT_NE(hasher(a), hasher(b));
184+
}
185+
186+
TEST(NameHandleTest, HashPairConsistency) {
187+
const auto a = IGL_NAMEHANDLE("first");
188+
const auto b = IGL_NAMEHANDLE("second");
189+
const std::hash<std::pair<NameHandle, NameHandle>> hasher;
190+
const auto pair = std::make_pair(a, b);
191+
EXPECT_EQ(hasher(pair), hasher(pair));
192+
}
193+
194+
TEST(NameHandleTest, UsableAsUnorderedMapKey) {
195+
std::unordered_map<NameHandle, int> map;
196+
const NameHandle key = IGL_NAMEHANDLE("mapKey");
197+
map[key] = 42;
198+
EXPECT_EQ(map[key], 42);
199+
EXPECT_EQ(map.count(IGL_NAMEHANDLE("mapKey")), 1u);
200+
EXPECT_EQ(map.count(IGL_NAMEHANDLE("other")), 0u);
201+
}
202+
203+
} // namespace igl::tests

0 commit comments

Comments
 (0)