2 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include "platform/text/DateTimeFormat.h"
29 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
30 #include "wtf/text/CString.h"
31 #include "wtf/text/StringBuilder.h"
32 #include <gtest/gtest.h>
34 using namespace blink;
36 class DateTimeFormatTest : public ::testing::Test {
38 typedef DateTimeFormat::FieldType FieldType;
45 Token(FieldType fieldType, int count = 1)
47 , fieldType(fieldType)
49 ASSERT(fieldType != DateTimeFormat::FieldTypeLiteral);
52 Token(const String& string)
55 , fieldType(DateTimeFormat::FieldTypeLiteral)
59 bool operator==(const Token& other) const
61 return fieldType == other.fieldType && count == other.count && string == other.string;
64 String toString() const
67 case DateTimeFormat::FieldTypeInvalid:
69 case DateTimeFormat::FieldTypeLiteral: {
70 StringBuilder builder;
72 builder.append(string);
74 return builder.toString();
77 return String::format("Token(%d, %d)", fieldType, count);
86 explicit Tokens(const Vector<Token> tokens)
91 explicit Tokens(const String& string)
93 m_tokens.append(Token(string));
96 explicit Tokens(Token token1)
98 m_tokens.append(token1);
101 Tokens(Token token1, Token token2)
103 m_tokens.append(token1);
104 m_tokens.append(token2);
107 Tokens(Token token1, Token token2, Token token3)
109 m_tokens.append(token1);
110 m_tokens.append(token2);
111 m_tokens.append(token3);
114 Tokens(Token token1, Token token2, Token token3, Token token4)
116 m_tokens.append(token1);
117 m_tokens.append(token2);
118 m_tokens.append(token3);
119 m_tokens.append(token4);
122 Tokens(Token token1, Token token2, Token token3, Token token4, Token token5)
124 m_tokens.append(token1);
125 m_tokens.append(token2);
126 m_tokens.append(token3);
127 m_tokens.append(token4);
128 m_tokens.append(token5);
131 Tokens(Token token1, Token token2, Token token3, Token token4, Token token5, Token token6)
133 m_tokens.append(token1);
134 m_tokens.append(token2);
135 m_tokens.append(token3);
136 m_tokens.append(token4);
137 m_tokens.append(token5);
138 m_tokens.append(token6);
141 bool operator==(const Tokens& other) const
143 return m_tokens == other.m_tokens;
146 String toString() const
148 StringBuilder builder;
149 builder.append("Tokens(");
150 for (unsigned index = 0; index < m_tokens.size(); ++index) {
153 builder.append(m_tokens[index].toString());
156 return builder.toString();
160 Vector<Token> m_tokens;
164 Tokens parse(const String& formatString)
166 TokenHandler handler;
167 if (!DateTimeFormat::parse(formatString, handler))
168 return Tokens(Token("*failed*"));
169 return handler.tokens();
172 FieldType single(const char ch)
174 char formatString[2];
175 formatString[0] = ch;
177 TokenHandler handler;
178 if (!DateTimeFormat::parse(formatString, handler))
179 return DateTimeFormat::FieldTypeInvalid;
180 return handler.fieldType(0);
184 class TokenHandler : public DateTimeFormat::TokenHandler {
186 virtual ~TokenHandler() { }
188 FieldType fieldType(int index) const
190 return index >=0 && index < static_cast<int>(m_tokens.size()) ? m_tokens[index].fieldType : DateTimeFormat::FieldTypeInvalid;
193 Tokens tokens() const { return Tokens(m_tokens); }
196 virtual void visitField(FieldType fieldType, int count) override
198 m_tokens.append(Token(fieldType, count));
201 virtual void visitLiteral(const String& string) override
203 m_tokens.append(Token(string));
206 Vector<Token> m_tokens;
210 std::ostream& operator<<(std::ostream& os, const DateTimeFormatTest::Tokens& tokens)
212 return os << tokens.toString().ascii().data();
215 TEST_F(DateTimeFormatTest, CommonPattern)
217 EXPECT_EQ(Tokens(), parse(""));
221 Token(DateTimeFormat::FieldTypeYear, 4), Token("-"),
222 Token(DateTimeFormat::FieldTypeMonth, 2), Token("-"),
223 Token(DateTimeFormat::FieldTypeDayOfMonth, 2)),
224 parse("yyyy-MM-dd"));
228 Token(DateTimeFormat::FieldTypeHour24, 2), Token(":"),
229 Token(DateTimeFormat::FieldTypeMinute, 2), Token(":"),
230 Token(DateTimeFormat::FieldTypeSecond, 2)),
235 Token(DateTimeFormat::FieldTypeHour12), Token(":"),
236 Token(DateTimeFormat::FieldTypeMinute), Token(" "),
237 Token(DateTimeFormat::FieldTypePeriod)),
242 Token(DateTimeFormat::FieldTypeYear), Token("Nen "),
243 Token(DateTimeFormat::FieldTypeMonth), Token("Getsu "),
244 Token(DateTimeFormat::FieldTypeDayOfMonth), Token("Nichi")),
245 parse("y'Nen' M'Getsu' d'Nichi'"));
248 TEST_F(DateTimeFormatTest, MissingClosingQuote)
250 EXPECT_EQ(Tokens("*failed*"), parse("'foo"));
251 EXPECT_EQ(Tokens("*failed*"), parse("fo'o"));
252 EXPECT_EQ(Tokens("*failed*"), parse("foo'"));
255 TEST_F(DateTimeFormatTest, Quote)
257 EXPECT_EQ(Tokens("FooBar"), parse("'FooBar'"));
258 EXPECT_EQ(Tokens("'"), parse("''"));
259 EXPECT_EQ(Tokens("'-'"), parse("''-''"));
260 EXPECT_EQ(Tokens("Foo'Bar"), parse("'Foo''Bar'"));
262 Tokens(Token(DateTimeFormat::FieldTypeEra), Token("'s")),
265 Tokens(Token(DateTimeFormat::FieldTypeEra), Token("'"), Token(DateTimeFormat::FieldTypeSecond)),
269 TEST_F(DateTimeFormatTest, SingleLowerCaseCharacter)
271 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('b'));
272 EXPECT_EQ(DateTimeFormat::FieldTypeLocalDayOfWeekStandAlon, single('c'));
273 EXPECT_EQ(DateTimeFormat::FieldTypeDayOfMonth, single('d'));
274 EXPECT_EQ(DateTimeFormat::FieldTypeLocalDayOfWeek, single('e'));
275 EXPECT_EQ(DateTimeFormat::FieldTypeModifiedJulianDay, single('g'));
276 EXPECT_EQ(DateTimeFormat::FieldTypeHour12, single('h'));
277 EXPECT_EQ(DateTimeFormat::FieldTypeHour24, single('k'));
278 EXPECT_EQ(DateTimeFormat::FieldTypeMinute, single('m'));
279 EXPECT_EQ(DateTimeFormat::FieldTypeQuaterStandAlone, single('q'));
280 EXPECT_EQ(DateTimeFormat::FieldTypeSecond, single('s'));
281 EXPECT_EQ(DateTimeFormat::FieldTypeExtendedYear, single('u'));
282 EXPECT_EQ(DateTimeFormat::FieldTypeNonLocationZone, single('v'));
283 EXPECT_EQ(DateTimeFormat::FieldTypeWeekOfMonth, single('W'));
284 EXPECT_EQ(DateTimeFormat::FieldTypeYear, single('y'));
285 EXPECT_EQ(DateTimeFormat::FieldTypeZone, single('z'));
288 TEST_F(DateTimeFormatTest, SingleLowerCaseInvalid)
290 EXPECT_EQ(DateTimeFormat::FieldTypePeriod, single('a'));
291 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('f'));
292 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('i'));
293 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('j'));
294 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('l'));
295 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('n'));
296 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('o'));
297 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('p'));
298 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('r'));
299 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('t'));
300 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('x'));
303 TEST_F(DateTimeFormatTest, SingleUpperCaseCharacter)
305 EXPECT_EQ(DateTimeFormat::FieldTypeMillisecondsInDay, single('A'));
306 EXPECT_EQ(DateTimeFormat::FieldTypeDayOfYear, single('D'));
307 EXPECT_EQ(DateTimeFormat::FieldTypeDayOfWeek, single('E'));
308 EXPECT_EQ(DateTimeFormat::FieldTypeDayOfWeekInMonth, single('F'));
309 EXPECT_EQ(DateTimeFormat::FieldTypeEra, single('G'));
310 EXPECT_EQ(DateTimeFormat::FieldTypeHour23, single('H'));
311 EXPECT_EQ(DateTimeFormat::FieldTypeHour11, single('K'));
312 EXPECT_EQ(DateTimeFormat::FieldTypeMonthStandAlone, single('L'));
313 EXPECT_EQ(DateTimeFormat::FieldTypeMonth, single('M'));
314 EXPECT_EQ(DateTimeFormat::FieldTypeQuater, single('Q'));
315 EXPECT_EQ(DateTimeFormat::FieldTypeFractionalSecond, single('S'));
316 EXPECT_EQ(DateTimeFormat::FieldTypeWeekOfYear, single('w'));
317 EXPECT_EQ(DateTimeFormat::FieldTypeYearOfWeekOfYear, single('Y'));
318 EXPECT_EQ(DateTimeFormat::FieldTypeRFC822Zone, single('Z'));
321 TEST_F(DateTimeFormatTest, SingleUpperCaseInvalid)
323 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('B'));
324 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('C'));
325 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('I'));
326 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('J'));
327 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('N'));
328 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('O'));
329 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('P'));
330 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('R'));
331 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('T'));
332 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('U'));
333 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('V'));
334 EXPECT_EQ(DateTimeFormat::FieldTypeInvalid, single('X'));