OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/payments/content/payments_validators.h" | |
6 | |
7 #include <ostream> // NOLINT | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace payments { | |
11 namespace { | |
12 | |
13 struct CurrencyCodeTestCase { | |
14 CurrencyCodeTestCase(const char* code, const char* system, bool expectedValid) | |
15 : code(code), system(system), expectedValid(expectedValid) {} | |
16 ~CurrencyCodeTestCase() {} | |
17 | |
18 const char* code; | |
19 const char* system; | |
20 bool expectedValid; | |
21 }; | |
22 | |
23 class PaymentsCurrencyValidatorTest | |
24 : public testing::TestWithParam<CurrencyCodeTestCase> {}; | |
25 | |
26 const char* longString2048() { | |
27 static char longString[2049]; | |
28 for (int i = 0; i < 2048; i++) | |
29 longString[i] = 'a'; | |
30 longString[2048] = '\0'; | |
31 return longString; | |
32 } | |
33 | |
34 const char* longString2049() { | |
35 static char longString[2050]; | |
36 for (int i = 0; i < 2049; i++) | |
37 longString[i] = 'a'; | |
38 longString[2049] = '\0'; | |
39 return longString; | |
40 } | |
41 | |
42 TEST_P(PaymentsCurrencyValidatorTest, IsValidCurrencyCodeFormat) { | |
43 std::string errorMessage; | |
44 EXPECT_EQ(GetParam().expectedValid, | |
45 payments::PaymentsValidators::isValidCurrencyCodeFormat( | |
46 GetParam().code, GetParam().system, &errorMessage)) | |
47 << errorMessage; | |
48 EXPECT_EQ(GetParam().expectedValid, errorMessage.empty()) << errorMessage; | |
49 | |
50 EXPECT_EQ(GetParam().expectedValid, | |
51 payments::PaymentsValidators::isValidCurrencyCodeFormat( | |
52 GetParam().code, GetParam().system, nullptr)); | |
53 } | |
54 | |
55 INSTANTIATE_TEST_CASE_P( | |
56 CurrencyCodes, | |
57 PaymentsCurrencyValidatorTest, | |
58 testing::Values( | |
59 // The most common identifiers are three-letter alphabetic codes as | |
60 // defined by [ISO4217] (for example, "USD" for US Dollars). | |
61 // |system| is a URL that indicates the currency system that the | |
62 // currency identifier belongs to. By default, | |
63 // the value is urn:iso:std:iso:4217 indicating that currency is defined | |
64 // by [[ISO4217]], however any string of at most 2048 | |
65 // characters is considered valid in other currencySystem. Returns false | |
66 // if currency |code| is too long (greater than 2048). | |
67 CurrencyCodeTestCase("USD", "urn:iso:std:iso:4217", true), | |
68 CurrencyCodeTestCase("US1", "http://www.example.com", true), | |
69 CurrencyCodeTestCase("US1", "urn:iso:std:iso:4217", false), | |
70 CurrencyCodeTestCase("US", "http://www.example.com", true), | |
71 CurrencyCodeTestCase("US", "urn:iso:std:iso:4217", false), | |
72 CurrencyCodeTestCase("USDO", "http://www.example.com", true), | |
73 CurrencyCodeTestCase("USDO", "urn:iso:std:iso:4217", false), | |
74 CurrencyCodeTestCase("usd", "http://www.example.com", true), | |
75 CurrencyCodeTestCase("usd", "urn:iso:std:iso:4217", false), | |
76 CurrencyCodeTestCase("ANYSTRING", "http://www.example.com", true), | |
77 CurrencyCodeTestCase("ANYSTRING", "urn:iso:std:iso:4217", false), | |
78 CurrencyCodeTestCase("", "http://www.example.com", true), | |
79 CurrencyCodeTestCase("", "urn:iso:std:iso:4217", false), | |
80 CurrencyCodeTestCase(longString2048(), "http://www.example.com", true), | |
81 CurrencyCodeTestCase(longString2048(), "urn:iso:std:iso:4217", false), | |
82 CurrencyCodeTestCase(longString2049(), | |
83 "http://www.example.com", | |
84 false))); | |
85 | |
86 struct TestCase { | |
87 TestCase(const char* input, bool expectedValid) | |
88 : input(input), expectedValid(expectedValid) {} | |
89 ~TestCase() {} | |
90 | |
91 const char* input; | |
92 bool expectedValid; | |
93 }; | |
94 | |
95 std::ostream& operator<<(std::ostream& out, const TestCase& testCase) { | |
96 out << "'" << testCase.input << "' is expected to be " | |
97 << (testCase.expectedValid ? "valid" : "invalid"); | |
98 return out; | |
99 } | |
100 | |
101 class PaymentsAmountValidatorTest : public testing::TestWithParam<TestCase> {}; | |
102 | |
103 TEST_P(PaymentsAmountValidatorTest, IsValidAmountFormat) { | |
104 std::string errorMessage; | |
105 EXPECT_EQ(GetParam().expectedValid, | |
106 payments::PaymentsValidators::isValidAmountFormat(GetParam().input, | |
107 &errorMessage)) | |
108 << errorMessage; | |
109 EXPECT_EQ(GetParam().expectedValid, errorMessage.empty()) << errorMessage; | |
110 | |
111 EXPECT_EQ(GetParam().expectedValid, | |
112 payments::PaymentsValidators::isValidAmountFormat(GetParam().input, | |
113 nullptr)); | |
114 } | |
115 | |
116 INSTANTIATE_TEST_CASE_P( | |
117 Amounts, | |
118 PaymentsAmountValidatorTest, | |
119 testing::Values(TestCase("0", true), | |
120 TestCase("-0", true), | |
121 TestCase("1", true), | |
122 TestCase("10", true), | |
123 TestCase("-3", true), | |
124 TestCase("10.99", true), | |
125 TestCase("-3.00", true), | |
126 TestCase("01234567890123456789.0123456789", true), | |
127 TestCase("01234567890123456789012345678.9", true), | |
128 TestCase("012345678901234567890123456789", true), | |
129 TestCase("-01234567890123456789.0123456789", true), | |
130 TestCase("-01234567890123456789012345678.9", true), | |
131 TestCase("-012345678901234567890123456789", true), | |
132 // Invalid amount formats | |
133 TestCase("", false), | |
134 TestCase("-", false), | |
135 TestCase("notdigits", false), | |
136 TestCase("ALSONOTDIGITS", false), | |
137 TestCase("10.", false), | |
138 TestCase(".99", false), | |
139 TestCase("-10.", false), | |
140 TestCase("-.99", false), | |
141 TestCase("10-", false), | |
142 TestCase("1-0", false), | |
143 TestCase("1.0.0", false), | |
144 TestCase("1/3", false))); | |
145 | |
146 class PaymentsRegionValidatorTest : public testing::TestWithParam<TestCase> {}; | |
147 | |
148 TEST_P(PaymentsRegionValidatorTest, IsValidCountryCodeFormat) { | |
149 std::string errorMessage; | |
150 EXPECT_EQ(GetParam().expectedValid, | |
151 payments::PaymentsValidators::isValidCountryCodeFormat( | |
152 GetParam().input, &errorMessage)) | |
153 << errorMessage; | |
154 EXPECT_EQ(GetParam().expectedValid, errorMessage.empty()) << errorMessage; | |
155 | |
156 EXPECT_EQ(GetParam().expectedValid, | |
157 payments::PaymentsValidators::isValidCountryCodeFormat( | |
158 GetParam().input, nullptr)); | |
159 } | |
160 | |
161 INSTANTIATE_TEST_CASE_P(CountryCodes, | |
162 PaymentsRegionValidatorTest, | |
163 testing::Values(TestCase("US", true), | |
164 // Invalid country code formats | |
165 TestCase("U1", false), | |
166 TestCase("U", false), | |
167 TestCase("us", false), | |
168 TestCase("USA", false), | |
169 TestCase("", false))); | |
170 | |
171 class PaymentsLanguageValidatorTest : public testing::TestWithParam<TestCase> { | |
172 }; | |
173 | |
174 TEST_P(PaymentsLanguageValidatorTest, IsValidLanguageCodeFormat) { | |
175 std::string errorMessage; | |
176 EXPECT_EQ(GetParam().expectedValid, | |
177 payments::PaymentsValidators::isValidLanguageCodeFormat( | |
178 GetParam().input, &errorMessage)) | |
179 << errorMessage; | |
180 EXPECT_EQ(GetParam().expectedValid, errorMessage.empty()) << errorMessage; | |
181 | |
182 EXPECT_EQ(GetParam().expectedValid, | |
183 payments::PaymentsValidators::isValidLanguageCodeFormat( | |
184 GetParam().input, nullptr)); | |
185 } | |
186 | |
187 INSTANTIATE_TEST_CASE_P(LanguageCodes, | |
188 PaymentsLanguageValidatorTest, | |
189 testing::Values(TestCase("", true), | |
190 TestCase("en", true), | |
191 TestCase("eng", true), | |
192 // Invalid language code formats | |
193 TestCase("e1", false), | |
194 TestCase("en1", false), | |
195 TestCase("e", false), | |
196 TestCase("engl", false), | |
197 TestCase("EN", false))); | |
198 | |
199 class PaymentsScriptValidatorTest : public testing::TestWithParam<TestCase> {}; | |
200 | |
201 TEST_P(PaymentsScriptValidatorTest, IsValidScriptCodeFormat) { | |
202 std::string errorMessage; | |
203 EXPECT_EQ(GetParam().expectedValid, | |
204 payments::PaymentsValidators::isValidScriptCodeFormat( | |
205 GetParam().input, &errorMessage)) | |
206 << errorMessage; | |
207 EXPECT_EQ(GetParam().expectedValid, errorMessage.empty()) << errorMessage; | |
208 | |
209 EXPECT_EQ(GetParam().expectedValid, | |
210 payments::PaymentsValidators::isValidScriptCodeFormat( | |
211 GetParam().input, nullptr)); | |
212 } | |
213 | |
214 INSTANTIATE_TEST_CASE_P(ScriptCodes, | |
215 PaymentsScriptValidatorTest, | |
216 testing::Values(TestCase("", true), | |
217 TestCase("Latn", true), | |
218 // Invalid script code formats | |
219 TestCase("Lat1", false), | |
220 TestCase("1lat", false), | |
221 TestCase("Latin", false), | |
222 TestCase("Lat", false), | |
223 TestCase("latn", false), | |
224 TestCase("LATN", false))); | |
225 | |
226 struct ShippingAddressTestCase { | |
227 ShippingAddressTestCase(const char* countryCode, | |
228 const char* languageCode, | |
229 const char* scriptCode, | |
230 bool expectedValid) | |
231 : countryCode(countryCode), | |
232 languageCode(languageCode), | |
233 scriptCode(scriptCode), | |
234 expectedValid(expectedValid) {} | |
235 ~ShippingAddressTestCase() {} | |
236 | |
237 const char* countryCode; | |
238 const char* languageCode; | |
239 const char* scriptCode; | |
240 bool expectedValid; | |
241 }; | |
242 | |
243 class PaymentsShippingAddressValidatorTest | |
244 : public testing::TestWithParam<ShippingAddressTestCase> {}; | |
245 | |
246 TEST_P(PaymentsShippingAddressValidatorTest, IsValidShippingAddress) { | |
247 payments::mojom::PaymentAddressPtr address = | |
248 payments::mojom::PaymentAddress::New(); | |
249 address->country = GetParam().countryCode; | |
250 address->language_code = GetParam().languageCode; | |
251 address->script_code = GetParam().scriptCode; | |
252 | |
253 std::string errorMessage; | |
254 EXPECT_EQ(GetParam().expectedValid, | |
255 payments::PaymentsValidators::isValidShippingAddress(address, | |
256 &errorMessage)) | |
257 << errorMessage; | |
258 EXPECT_EQ(GetParam().expectedValid, errorMessage.empty()) << errorMessage; | |
259 | |
260 EXPECT_EQ( | |
261 GetParam().expectedValid, | |
262 payments::PaymentsValidators::isValidShippingAddress(address, nullptr)); | |
263 } | |
264 | |
265 INSTANTIATE_TEST_CASE_P( | |
266 ShippingAddresses, | |
267 PaymentsShippingAddressValidatorTest, | |
268 testing::Values( | |
269 ShippingAddressTestCase("US", "en", "Latn", true), | |
270 ShippingAddressTestCase("US", "en", "", true), | |
271 ShippingAddressTestCase("US", "", "", true), | |
272 // Invalid shipping addresses | |
273 ShippingAddressTestCase("", "", "", false), | |
274 ShippingAddressTestCase("InvalidCountryCode", "", "", false), | |
275 ShippingAddressTestCase("US", "InvalidLanguageCode", "", false), | |
276 ShippingAddressTestCase("US", "en", "InvalidScriptCode", false), | |
277 ShippingAddressTestCase("US", "", "Latn", false))); | |
278 | |
279 } // namespace | |
280 } // namespace payments | |
OLD | NEW |