13b17b84bSPavel Labath //===---------- llvm/unittest/Support/DJBTest.cpp -------------------------===//
23b17b84bSPavel Labath //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63b17b84bSPavel Labath //
73b17b84bSPavel Labath //===----------------------------------------------------------------------===//
83b17b84bSPavel Labath
93b17b84bSPavel Labath #include "llvm/Support/DJB.h"
103b17b84bSPavel Labath #include "llvm/ADT/Twine.h"
113b17b84bSPavel Labath #include "gtest/gtest.h"
123b17b84bSPavel Labath
133b17b84bSPavel Labath using namespace llvm;
143b17b84bSPavel Labath
TEST(DJBTest,caseFolding)153b17b84bSPavel Labath TEST(DJBTest, caseFolding) {
163b17b84bSPavel Labath struct TestCase {
173b17b84bSPavel Labath StringLiteral One;
183b17b84bSPavel Labath StringLiteral Two;
193b17b84bSPavel Labath };
203b17b84bSPavel Labath
213b17b84bSPavel Labath static constexpr TestCase Tests[] = {
223b17b84bSPavel Labath {{"ASDF"}, {"asdf"}},
233b17b84bSPavel Labath {{"qWeR"}, {"QwEr"}},
243b17b84bSPavel Labath {{"qqqqqqqqqqqqqqqqqqqq"}, {"QQQQQQQQQQQQQQQQQQQQ"}},
253b17b84bSPavel Labath
263b17b84bSPavel Labath {{"I"}, {"i"}},
273b17b84bSPavel Labath // Latin Small Letter Dotless I
28*f082e54cSJens Massberg {{/*U+130*/ "\xc4\xb0"}, {"i"}},
293b17b84bSPavel Labath // Latin Capital Letter I With Dot Above
30*f082e54cSJens Massberg {{/*U+131*/ "\xc4\xb1"}, {"i"}},
313b17b84bSPavel Labath
323b17b84bSPavel Labath // Latin Capital Letter A With Grave
33*f082e54cSJens Massberg {{/*U+c0*/ "\xc3\x80"}, {/*U+e0*/ "\xc3\xa0"}},
343b17b84bSPavel Labath // Latin Capital Letter A With Macron
35*f082e54cSJens Massberg {{/*U+100*/ "\xc4\x80"}, {/*U+101*/ "\xc4\x81"}},
363b17b84bSPavel Labath // Latin Capital Letter L With Acute
37*f082e54cSJens Massberg {{/*U+139*/ "\xc4\xb9"}, {/*U+13a*/ "\xc4\xba"}},
383b17b84bSPavel Labath // Cyrillic Capital Letter Ie
39*f082e54cSJens Massberg {{/*U+415*/ "\xd0\x95"}, {/*U+435*/ "\xd0\xb5"}},
403b17b84bSPavel Labath // Latin Capital Letter A With Circumflex And Grave
41*f082e54cSJens Massberg {{/*U+1ea6*/ "\xe1\xba\xa6"}, {/*U+1ea7*/ "\xe1\xba\xa7"}},
423b17b84bSPavel Labath // Kelvin Sign
43*f082e54cSJens Massberg {{/*U+212a*/ "\xe2\x84\xaa"}, {"k"}},
443b17b84bSPavel Labath // Glagolitic Capital Letter Chrivi
45*f082e54cSJens Massberg {{/*U+2c1d*/ "\xe2\xb0\x9d"}, {/*U+2c4d*/ "\xe2\xb1\x8d"}},
463b17b84bSPavel Labath // Fullwidth Latin Capital Letter M
47*f082e54cSJens Massberg {{/*U+ff2d*/ "\xef\xbc\xad"}, {/*U+ff4d*/ "\xef\xbd\x8d"}},
483b17b84bSPavel Labath // Old Hungarian Capital Letter Ej
49*f082e54cSJens Massberg {{/*U+10c92*/ "\xf0\x90\xb2\x92"}, {/*U+10cd2*/ "\xf0\x90\xb3\x92"}},
503b17b84bSPavel Labath };
513b17b84bSPavel Labath
523b17b84bSPavel Labath for (const TestCase &T : Tests) {
533b17b84bSPavel Labath SCOPED_TRACE("Comparing '" + T.One + "' and '" + T.Two + "'");
543b17b84bSPavel Labath EXPECT_EQ(caseFoldingDjbHash(T.One), caseFoldingDjbHash(T.Two));
553b17b84bSPavel Labath }
563b17b84bSPavel Labath }
573b17b84bSPavel Labath
TEST(DJBTest,knownValuesLowerCase)583b17b84bSPavel Labath TEST(DJBTest, knownValuesLowerCase) {
593b17b84bSPavel Labath struct TestCase {
603b17b84bSPavel Labath StringLiteral Text;
613b17b84bSPavel Labath uint32_t Hash;
623b17b84bSPavel Labath };
633b17b84bSPavel Labath static constexpr TestCase Tests[] = {
643b17b84bSPavel Labath {{""}, 5381u},
653b17b84bSPavel Labath {{"f"}, 177675u},
663b17b84bSPavel Labath {{"fo"}, 5863386u},
673b17b84bSPavel Labath {{"foo"}, 193491849u},
683b17b84bSPavel Labath {{"foob"}, 2090263819u},
693b17b84bSPavel Labath {{"fooba"}, 259229388u},
703b17b84bSPavel Labath {{"foobar"}, 4259602622u},
713b17b84bSPavel Labath {{"pneumonoultramicroscopicsilicovolcanoconiosis"}, 3999417781u},
723b17b84bSPavel Labath };
733b17b84bSPavel Labath
743b17b84bSPavel Labath for (const TestCase &T : Tests) {
753b17b84bSPavel Labath SCOPED_TRACE("Text: '" + T.Text + "'");
763b17b84bSPavel Labath EXPECT_EQ(T.Hash, djbHash(T.Text));
773b17b84bSPavel Labath EXPECT_EQ(T.Hash, caseFoldingDjbHash(T.Text));
783b17b84bSPavel Labath EXPECT_EQ(T.Hash, caseFoldingDjbHash(T.Text.upper()));
793b17b84bSPavel Labath }
803b17b84bSPavel Labath }
813b17b84bSPavel Labath
TEST(DJBTest,knownValuesUnicode)823b17b84bSPavel Labath TEST(DJBTest, knownValuesUnicode) {
83*f082e54cSJens Massberg EXPECT_EQ(5866553u, djbHash(/*U+130*/ "\xc4\xb0"));
84*f082e54cSJens Massberg EXPECT_EQ(177678u, caseFoldingDjbHash(/*U+130*/ "\xc4\xb0"));
853b17b84bSPavel Labath EXPECT_EQ(
863b17b84bSPavel Labath 1302161417u,
87*f082e54cSJens Massberg djbHash("\xc4\xb0\xc4\xb1\xc3\x80\xc3\xa0\xc4\x80\xc4\x81\xc4\xb9\xc4\xba"
88*f082e54cSJens Massberg "\xd0\x95\xd0\xb5\xe1\xba\xa6\xe1\xba\xa7\xe2\x84\xaa\x6b\xe2\xb0"
89*f082e54cSJens Massberg "\x9d\xe2\xb1\x8d\xef\xbc\xad\xef\xbd\x8d\xf0\x90\xb2\x92\xf0\x90"
90*f082e54cSJens Massberg "\xb3\x92"));
913b17b84bSPavel Labath EXPECT_EQ(
923b17b84bSPavel Labath 1145571043u,
933b17b84bSPavel Labath caseFoldingDjbHash(
94*f082e54cSJens Massberg "\xc4\xb0\xc4\xb1\xc3\x80\xc3\xa0\xc4\x80\xc4\x81\xc4\xb9\xc4\xba"
95*f082e54cSJens Massberg "\xd0\x95\xd0\xb5\xe1\xba\xa6\xe1\xba\xa7\xe2\x84\xaa\x6b\xe2\xb0"
96*f082e54cSJens Massberg "\x9d\xe2\xb1\x8d\xef\xbc\xad\xef\xbd\x8d\xf0\x90\xb2\x92\xf0\x90"
97*f082e54cSJens Massberg "\xb3\x92"));
983b17b84bSPavel Labath }
99