xref: /llvm-project/llvm/unittests/ADT/StringSwitchTest.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
1c485b877SZachary Turner //===- llvm/unittest/ADT/StringSwitchTest.cpp - StringSwitch unit tests ---===//
2c485b877SZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c485b877SZachary Turner //
7c485b877SZachary Turner //===----------------------------------------------------------------------===//
8c485b877SZachary Turner 
9c485b877SZachary Turner #include "llvm/ADT/StringSwitch.h"
10c485b877SZachary Turner #include "gtest/gtest.h"
11c485b877SZachary Turner 
12c485b877SZachary Turner using namespace llvm;
13c485b877SZachary Turner 
TEST(StringSwitchTest,Case)14c485b877SZachary Turner TEST(StringSwitchTest, Case) {
15c485b877SZachary Turner   auto Translate = [](StringRef S) {
16c485b877SZachary Turner     return llvm::StringSwitch<int>(S)
17c485b877SZachary Turner         .Case("0", 0)
18c485b877SZachary Turner         .Case("1", 1)
19c485b877SZachary Turner         .Case("2", 2)
20c485b877SZachary Turner         .Case("3", 3)
21c485b877SZachary Turner         .Case("4", 4)
22c485b877SZachary Turner         .Case("5", 5)
23c485b877SZachary Turner         .Case("6", 6)
24c485b877SZachary Turner         .Case("7", 7)
25c485b877SZachary Turner         .Case("8", 8)
26c485b877SZachary Turner         .Case("9", 9)
27c485b877SZachary Turner         .Case("A", 10)
28c485b877SZachary Turner         .Case("B", 11)
29c485b877SZachary Turner         .Case("C", 12)
30c485b877SZachary Turner         .Case("D", 13)
31c485b877SZachary Turner         .Case("E", 14)
32c485b877SZachary Turner         .Case("F", 15)
33c485b877SZachary Turner         .Default(-1);
34c485b877SZachary Turner   };
35c485b877SZachary Turner   EXPECT_EQ(1, Translate("1"));
36c485b877SZachary Turner   EXPECT_EQ(2, Translate("2"));
37c485b877SZachary Turner   EXPECT_EQ(11, Translate("B"));
38c485b877SZachary Turner   EXPECT_EQ(-1, Translate("b"));
39c485b877SZachary Turner   EXPECT_EQ(-1, Translate(""));
40c485b877SZachary Turner   EXPECT_EQ(-1, Translate("Test"));
41c485b877SZachary Turner }
42c485b877SZachary Turner 
TEST(StringSwitchTest,CaseLower)43c43fa4f2SZachary Turner TEST(StringSwitchTest, CaseLower) {
44c43fa4f2SZachary Turner   auto Translate = [](StringRef S) {
45c43fa4f2SZachary Turner     return llvm::StringSwitch<int>(S)
46c43fa4f2SZachary Turner         .Case("0", 0)
47c43fa4f2SZachary Turner         .Case("1", 1)
48c43fa4f2SZachary Turner         .Case("2", 2)
49c43fa4f2SZachary Turner         .Case("3", 3)
50c43fa4f2SZachary Turner         .Case("4", 4)
51c43fa4f2SZachary Turner         .Case("5", 5)
52c43fa4f2SZachary Turner         .Case("6", 6)
53c43fa4f2SZachary Turner         .Case("7", 7)
54c43fa4f2SZachary Turner         .Case("8", 8)
55c43fa4f2SZachary Turner         .Case("9", 9)
56c43fa4f2SZachary Turner         .CaseLower("A", 10)
57c43fa4f2SZachary Turner         .CaseLower("B", 11)
58c43fa4f2SZachary Turner         .CaseLower("C", 12)
59c43fa4f2SZachary Turner         .CaseLower("D", 13)
60c43fa4f2SZachary Turner         .CaseLower("E", 14)
61c43fa4f2SZachary Turner         .CaseLower("F", 15)
62c43fa4f2SZachary Turner         .Default(-1);
63c43fa4f2SZachary Turner   };
64c43fa4f2SZachary Turner   EXPECT_EQ(1, Translate("1"));
65c43fa4f2SZachary Turner   EXPECT_EQ(2, Translate("2"));
66c43fa4f2SZachary Turner   EXPECT_EQ(11, Translate("B"));
67c43fa4f2SZachary Turner   EXPECT_EQ(11, Translate("b"));
68c43fa4f2SZachary Turner 
69c43fa4f2SZachary Turner   EXPECT_EQ(-1, Translate(""));
70c43fa4f2SZachary Turner   EXPECT_EQ(-1, Translate("Test"));
71c43fa4f2SZachary Turner }
72c43fa4f2SZachary Turner 
TEST(StringSwitchTest,StartsWith)73c485b877SZachary Turner TEST(StringSwitchTest, StartsWith) {
74c485b877SZachary Turner   auto Translate = [](StringRef S) {
75c485b877SZachary Turner     return llvm::StringSwitch<std::function<int(int, int)>>(S)
76c485b877SZachary Turner         .StartsWith("add", [](int X, int Y) { return X + Y; })
77c485b877SZachary Turner         .StartsWith("sub", [](int X, int Y) { return X - Y; })
78c485b877SZachary Turner         .StartsWith("mul", [](int X, int Y) { return X * Y; })
79c485b877SZachary Turner         .StartsWith("div", [](int X, int Y) { return X / Y; })
80c485b877SZachary Turner         .Default([](int X, int Y) { return 0; });
81c485b877SZachary Turner   };
82c485b877SZachary Turner 
83c485b877SZachary Turner   EXPECT_EQ(15, Translate("adder")(10, 5));
84c485b877SZachary Turner   EXPECT_EQ(5, Translate("subtracter")(10, 5));
85c485b877SZachary Turner   EXPECT_EQ(50, Translate("multiplier")(10, 5));
86c485b877SZachary Turner   EXPECT_EQ(2, Translate("divider")(10, 5));
87c485b877SZachary Turner 
88c485b877SZachary Turner   EXPECT_EQ(0, Translate("nothing")(10, 5));
89c485b877SZachary Turner   EXPECT_EQ(0, Translate("ADDER")(10, 5));
90c485b877SZachary Turner }
91c485b877SZachary Turner 
TEST(StringSwitchTest,StartsWithLower)92c43fa4f2SZachary Turner TEST(StringSwitchTest, StartsWithLower) {
93c43fa4f2SZachary Turner   auto Translate = [](StringRef S) {
94c43fa4f2SZachary Turner     return llvm::StringSwitch<std::function<int(int, int)>>(S)
95c43fa4f2SZachary Turner         .StartsWithLower("add", [](int X, int Y) { return X + Y; })
96c43fa4f2SZachary Turner         .StartsWithLower("sub", [](int X, int Y) { return X - Y; })
97c43fa4f2SZachary Turner         .StartsWithLower("mul", [](int X, int Y) { return X * Y; })
98c43fa4f2SZachary Turner         .StartsWithLower("div", [](int X, int Y) { return X / Y; })
99c43fa4f2SZachary Turner         .Default([](int X, int Y) { return 0; });
100c43fa4f2SZachary Turner   };
101c43fa4f2SZachary Turner 
102c43fa4f2SZachary Turner   EXPECT_EQ(15, Translate("adder")(10, 5));
103c43fa4f2SZachary Turner   EXPECT_EQ(5, Translate("subtracter")(10, 5));
104c43fa4f2SZachary Turner   EXPECT_EQ(50, Translate("multiplier")(10, 5));
105c43fa4f2SZachary Turner   EXPECT_EQ(2, Translate("divider")(10, 5));
106c43fa4f2SZachary Turner 
107c43fa4f2SZachary Turner   EXPECT_EQ(15, Translate("AdDeR")(10, 5));
108c43fa4f2SZachary Turner   EXPECT_EQ(5, Translate("SuBtRaCtEr")(10, 5));
109c43fa4f2SZachary Turner   EXPECT_EQ(50, Translate("MuLtIpLiEr")(10, 5));
110c43fa4f2SZachary Turner   EXPECT_EQ(2, Translate("DiViDeR")(10, 5));
111c43fa4f2SZachary Turner 
112c43fa4f2SZachary Turner   EXPECT_EQ(0, Translate("nothing")(10, 5));
113c43fa4f2SZachary Turner }
114c43fa4f2SZachary Turner 
TEST(StringSwitchTest,EndsWith)115c485b877SZachary Turner TEST(StringSwitchTest, EndsWith) {
116c485b877SZachary Turner   enum class Suffix { Possible, PastTense, Process, InProgressAction, Unknown };
117c485b877SZachary Turner 
118c485b877SZachary Turner   auto Translate = [](StringRef S) {
119c485b877SZachary Turner     return llvm::StringSwitch<Suffix>(S)
120c485b877SZachary Turner         .EndsWith("able", Suffix::Possible)
121c485b877SZachary Turner         .EndsWith("ed", Suffix::PastTense)
122c485b877SZachary Turner         .EndsWith("ation", Suffix::Process)
123c485b877SZachary Turner         .EndsWith("ing", Suffix::InProgressAction)
124c485b877SZachary Turner         .Default(Suffix::Unknown);
125c485b877SZachary Turner   };
126c485b877SZachary Turner 
127c485b877SZachary Turner   EXPECT_EQ(Suffix::Possible, Translate("optimizable"));
128c485b877SZachary Turner   EXPECT_EQ(Suffix::PastTense, Translate("optimized"));
129c485b877SZachary Turner   EXPECT_EQ(Suffix::Process, Translate("optimization"));
130c485b877SZachary Turner   EXPECT_EQ(Suffix::InProgressAction, Translate("optimizing"));
131c485b877SZachary Turner   EXPECT_EQ(Suffix::Unknown, Translate("optimizer"));
132c485b877SZachary Turner   EXPECT_EQ(Suffix::Unknown, Translate("OPTIMIZABLE"));
133c485b877SZachary Turner }
134c485b877SZachary Turner 
TEST(StringSwitchTest,EndsWithLower)135c43fa4f2SZachary Turner TEST(StringSwitchTest, EndsWithLower) {
136c43fa4f2SZachary Turner   enum class Suffix { Possible, PastTense, Process, InProgressAction, Unknown };
137c43fa4f2SZachary Turner 
138c43fa4f2SZachary Turner   auto Translate = [](StringRef S) {
139c43fa4f2SZachary Turner     return llvm::StringSwitch<Suffix>(S)
140c43fa4f2SZachary Turner         .EndsWithLower("able", Suffix::Possible)
141c43fa4f2SZachary Turner         .EndsWithLower("ed", Suffix::PastTense)
142c43fa4f2SZachary Turner         .EndsWithLower("ation", Suffix::Process)
143c43fa4f2SZachary Turner         .EndsWithLower("ing", Suffix::InProgressAction)
144c43fa4f2SZachary Turner         .Default(Suffix::Unknown);
145c43fa4f2SZachary Turner   };
146c43fa4f2SZachary Turner 
147c43fa4f2SZachary Turner   EXPECT_EQ(Suffix::Possible, Translate("optimizable"));
148c43fa4f2SZachary Turner   EXPECT_EQ(Suffix::Possible, Translate("OPTIMIZABLE"));
149c43fa4f2SZachary Turner   EXPECT_EQ(Suffix::PastTense, Translate("optimized"));
150c43fa4f2SZachary Turner   EXPECT_EQ(Suffix::Process, Translate("optimization"));
151c43fa4f2SZachary Turner   EXPECT_EQ(Suffix::InProgressAction, Translate("optimizing"));
152c43fa4f2SZachary Turner   EXPECT_EQ(Suffix::Unknown, Translate("optimizer"));
153c43fa4f2SZachary Turner }
154c43fa4f2SZachary Turner 
TEST(StringSwitchTest,Cases)155c485b877SZachary Turner TEST(StringSwitchTest, Cases) {
156c485b877SZachary Turner   enum class OSType { Windows, Linux, Unknown };
157c485b877SZachary Turner 
158c485b877SZachary Turner   auto Translate = [](StringRef S) {
159c485b877SZachary Turner     return llvm::StringSwitch<OSType>(S)
160d15f3193SDavid Zarzycki         .Cases(StringLiteral::withInnerNUL("wind\0ws"), "win32", "winnt",
161d15f3193SDavid Zarzycki                OSType::Windows)
162c485b877SZachary Turner         .Cases("linux", "unix", "*nix", "posix", OSType::Linux)
163c485b877SZachary Turner         .Default(OSType::Unknown);
164c485b877SZachary Turner   };
165c485b877SZachary Turner 
166c485b877SZachary Turner   EXPECT_EQ(OSType::Windows, Translate(llvm::StringRef("wind\0ws", 7)));
167c485b877SZachary Turner   EXPECT_EQ(OSType::Windows, Translate("win32"));
168c485b877SZachary Turner   EXPECT_EQ(OSType::Windows, Translate("winnt"));
169c485b877SZachary Turner 
170c485b877SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("linux"));
171c485b877SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("unix"));
172c485b877SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("*nix"));
173c485b877SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("posix"));
174c485b877SZachary Turner 
175c485b877SZachary Turner   // Note that the whole null-terminator embedded string is required for the
176c485b877SZachary Turner   // case to match.
177c485b877SZachary Turner   EXPECT_EQ(OSType::Unknown, Translate("wind"));
178c485b877SZachary Turner   EXPECT_EQ(OSType::Unknown, Translate("Windows"));
179c485b877SZachary Turner   EXPECT_EQ(OSType::Unknown, Translate(""));
180c485b877SZachary Turner }
181c43fa4f2SZachary Turner 
TEST(StringSwitchTest,CasesLower)182c43fa4f2SZachary Turner TEST(StringSwitchTest, CasesLower) {
183c43fa4f2SZachary Turner   enum class OSType { Windows, Linux, Unknown };
184c43fa4f2SZachary Turner 
185c43fa4f2SZachary Turner   auto Translate = [](StringRef S) {
186c43fa4f2SZachary Turner     return llvm::StringSwitch<OSType>(S)
187d15f3193SDavid Zarzycki         .CasesLower(StringLiteral::withInnerNUL("wind\0ws"), "win32", "winnt",
188d15f3193SDavid Zarzycki                     OSType::Windows)
189c43fa4f2SZachary Turner         .CasesLower("linux", "unix", "*nix", "posix", OSType::Linux)
190c43fa4f2SZachary Turner         .Default(OSType::Unknown);
191c43fa4f2SZachary Turner   };
192c43fa4f2SZachary Turner 
193c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Windows, Translate(llvm::StringRef("WIND\0WS", 7)));
194c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Windows, Translate("WIN32"));
195c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Windows, Translate("WINNT"));
196c43fa4f2SZachary Turner 
197c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("LINUX"));
198c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("UNIX"));
199c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("*NIX"));
200c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("POSIX"));
201c43fa4f2SZachary Turner 
202c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Windows, Translate(llvm::StringRef("wind\0ws", 7)));
203c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Linux, Translate("linux"));
204c43fa4f2SZachary Turner 
205c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Unknown, Translate("wind"));
206c43fa4f2SZachary Turner   EXPECT_EQ(OSType::Unknown, Translate(""));
207c43fa4f2SZachary Turner }
208