|
1 | 1 | #include "swift/Basic/OptionSet.h"
|
| 2 | +#include "swift/Basic/ValueEnumerator.h" |
2 | 3 | #include "gtest/gtest.h"
|
3 | 4 |
|
4 | 5 | using namespace swift;
|
@@ -99,3 +100,62 @@ TEST(OptionSet, intptr_t_isConstructible) {
|
99 | 100 | }
|
100 | 101 |
|
101 | 102 |
|
| 103 | +TEST(ValueEnumerator, basic) { |
| 104 | + |
| 105 | + { |
| 106 | + ValueEnumerator<int> Trans; |
| 107 | + // Check that indexing is persistent. |
| 108 | + EXPECT_EQ(Trans.getIndex(99), Trans.getIndex(99)); |
| 109 | + EXPECT_EQ(Trans.getIndex(100), Trans.getIndex(100)); |
| 110 | + |
| 111 | + // Check that we don't have collisions. |
| 112 | + bool SameIndex = Trans.getIndex(82) == Trans.getIndex(73); |
| 113 | + EXPECT_FALSE(SameIndex); |
| 114 | + |
| 115 | + // Check that invalidation works. |
| 116 | + // After invalidation the old index must not be equal to the new index. |
| 117 | + size_t oldIndex = Trans.getIndex(99); |
| 118 | + Trans.invalidateValue(99); |
| 119 | + size_t newIndex = Trans.getIndex(99); |
| 120 | + EXPECT_FALSE(newIndex == oldIndex); |
| 121 | + } |
| 122 | + |
| 123 | + { |
| 124 | + const char *string_1 = "hello"; |
| 125 | + const char *string_2 = "goodbye"; |
| 126 | + const char *string_3 = ":-)"; |
| 127 | + ValueEnumerator<const char*> Trans; |
| 128 | + EXPECT_EQ(Trans.getIndex(nullptr), Trans.getIndex(nullptr)); |
| 129 | + EXPECT_EQ(Trans.getIndex(string_1), Trans.getIndex(string_1)); |
| 130 | + EXPECT_EQ(Trans.getIndex(string_2), Trans.getIndex(string_2)); |
| 131 | + |
| 132 | + // Check that invalidation works. |
| 133 | + size_t oldIndex = Trans.getIndex(string_3); |
| 134 | + Trans.invalidateValue(string_3); |
| 135 | + size_t newIndex = Trans.getIndex(string_3); |
| 136 | + EXPECT_FALSE(newIndex == oldIndex); |
| 137 | + |
| 138 | + // Check that different values don't give the same index. |
| 139 | + EXPECT_FALSE(Trans.getIndex(string_2) == Trans.getIndex(string_3)); |
| 140 | + } |
| 141 | + |
| 142 | + |
| 143 | + { |
| 144 | + ValueEnumerator<int> Trans; |
| 145 | + // Check a bunch of integers. |
| 146 | + for (int i = 1; i < 10000; i++) { |
| 147 | + EXPECT_TRUE(Trans.getIndex(0) != Trans.getIndex(i)); |
| 148 | + } |
| 149 | + |
| 150 | + // Check that there are no accidental collisions. |
| 151 | + for (int i = 0; i < 10000; i++) { |
| 152 | + for (int j = 1; j < 10; j++) { |
| 153 | + EXPECT_TRUE(Trans.getIndex(i) != Trans.getIndex(i + j)); |
| 154 | + } |
| 155 | + } |
| 156 | + |
| 157 | + // Check that indexing is still persistent. |
| 158 | + EXPECT_EQ(Trans.getIndex(100), Trans.getIndex(100)); |
| 159 | + } |
| 160 | + |
| 161 | +} |
0 commit comments