| //===---------- llvm/unittest/Support/DJBTest.cpp -------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Support/DJB.h" |
| #include "llvm/ADT/Twine.h" |
| #include "gtest/gtest.h" |
| |
| using namespace llvm; |
| |
| TEST(DJBTest, caseFolding) { |
| struct TestCase { |
| StringLiteral One; |
| StringLiteral Two; |
| }; |
| |
| static constexpr TestCase Tests[] = { |
| {{"ASDF"}, {"asdf"}}, |
| {{"qWeR"}, {"QwEr"}}, |
| {{"qqqqqqqqqqqqqqqqqqqq"}, {"QQQQQQQQQQQQQQQQQQQQ"}}, |
| |
| {{"I"}, {"i"}}, |
| // Latin Small Letter Dotless I |
| {{/*U+130*/ "\xc4\xb0"}, {"i"}}, |
| // Latin Capital Letter I With Dot Above |
| {{/*U+131*/ "\xc4\xb1"}, {"i"}}, |
| |
| // Latin Capital Letter A With Grave |
| {{/*U+c0*/ "\xc3\x80"}, {/*U+e0*/ "\xc3\xa0"}}, |
| // Latin Capital Letter A With Macron |
| {{/*U+100*/ "\xc4\x80"}, {/*U+101*/ "\xc4\x81"}}, |
| // Latin Capital Letter L With Acute |
| {{/*U+139*/ "\xc4\xb9"}, {/*U+13a*/ "\xc4\xba"}}, |
| // Cyrillic Capital Letter Ie |
| {{/*U+415*/ "\xd0\x95"}, {/*U+435*/ "\xd0\xb5"}}, |
| // Latin Capital Letter A With Circumflex And Grave |
| {{/*U+1ea6*/ "\xe1\xba\xa6"}, {/*U+1ea7*/ "\xe1\xba\xa7"}}, |
| // Kelvin Sign |
| {{/*U+212a*/ "\xe2\x84\xaa"}, {"k"}}, |
| // Glagolitic Capital Letter Chrivi |
| {{/*U+2c1d*/ "\xe2\xb0\x9d"}, {/*U+2c4d*/ "\xe2\xb1\x8d"}}, |
| // Fullwidth Latin Capital Letter M |
| {{/*U+ff2d*/ "\xef\xbc\xad"}, {/*U+ff4d*/ "\xef\xbd\x8d"}}, |
| // Old Hungarian Capital Letter Ej |
| {{/*U+10c92*/ "\xf0\x90\xb2\x92"}, {/*U+10cd2*/ "\xf0\x90\xb3\x92"}}, |
| }; |
| |
| for (const TestCase &T : Tests) { |
| SCOPED_TRACE("Comparing '" + T.One + "' and '" + T.Two + "'"); |
| EXPECT_EQ(caseFoldingDjbHash(T.One), caseFoldingDjbHash(T.Two)); |
| } |
| } |
| |
| TEST(DJBTest, knownValuesLowerCase) { |
| struct TestCase { |
| StringLiteral Text; |
| uint32_t Hash; |
| }; |
| static constexpr TestCase Tests[] = { |
| {{""}, 5381u}, |
| {{"f"}, 177675u}, |
| {{"fo"}, 5863386u}, |
| {{"foo"}, 193491849u}, |
| {{"foob"}, 2090263819u}, |
| {{"fooba"}, 259229388u}, |
| {{"foobar"}, 4259602622u}, |
| {{"pneumonoultramicroscopicsilicovolcanoconiosis"}, 3999417781u}, |
| }; |
| |
| for (const TestCase &T : Tests) { |
| SCOPED_TRACE("Text: '" + T.Text + "'"); |
| EXPECT_EQ(T.Hash, djbHash(T.Text)); |
| EXPECT_EQ(T.Hash, caseFoldingDjbHash(T.Text)); |
| EXPECT_EQ(T.Hash, caseFoldingDjbHash(T.Text.upper())); |
| } |
| } |
| |
| TEST(DJBTest, knownValuesUnicode) { |
| EXPECT_EQ(5866553u, djbHash(/*U+130*/ "\xc4\xb0")); |
| EXPECT_EQ(177678u, caseFoldingDjbHash(/*U+130*/ "\xc4\xb0")); |
| EXPECT_EQ( |
| 1302161417u, |
| djbHash("\xc4\xb0\xc4\xb1\xc3\x80\xc3\xa0\xc4\x80\xc4\x81\xc4\xb9\xc4\xba" |
| "\xd0\x95\xd0\xb5\xe1\xba\xa6\xe1\xba\xa7\xe2\x84\xaa\x6b\xe2\xb0" |
| "\x9d\xe2\xb1\x8d\xef\xbc\xad\xef\xbd\x8d\xf0\x90\xb2\x92\xf0\x90" |
| "\xb3\x92")); |
| EXPECT_EQ( |
| 1145571043u, |
| caseFoldingDjbHash( |
| "\xc4\xb0\xc4\xb1\xc3\x80\xc3\xa0\xc4\x80\xc4\x81\xc4\xb9\xc4\xba" |
| "\xd0\x95\xd0\xb5\xe1\xba\xa6\xe1\xba\xa7\xe2\x84\xaa\x6b\xe2\xb0" |
| "\x9d\xe2\xb1\x8d\xef\xbc\xad\xef\xbd\x8d\xf0\x90\xb2\x92\xf0\x90" |
| "\xb3\x92")); |
| } |