16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/* 26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License. 66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at 76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * 106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and 146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License. 156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */ 166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "test/Common.h" 181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/StringPiece.h" 191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/Util.h" 201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <gtest/gtest.h> 226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string> 236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt { 256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, TrimOnlyWhitespace) { 276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski const std::u16string full = u"\n "; 286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski StringPiece16 trimmed = util::trimWhitespace(full); 306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_TRUE(trimmed.empty()); 316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(0u, trimmed.size()); 326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, StringEndsWith) { 354d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski EXPECT_TRUE(util::stringEndsWith<char>("hello.xml", ".xml")); 364d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski} 374d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski 384d3a987694f6f6b95d8a0f1542618223ce253e6dAdam LesinskiTEST(UtilTest, StringStartsWith) { 394d3a987694f6f6b95d8a0f1542618223ce253e6dAdam Lesinski EXPECT_TRUE(util::stringStartsWith<char>("hello.xml", "he")); 406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 4290959887e9a61ff83097b2789f8b3243ad817decAdam LesinskiTEST(UtilTest, StringBuilderSplitEscapeSequence) { 4390959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski EXPECT_EQ(StringPiece16(u"this is a new\nline."), 441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u"this is a new\\") 451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .append(u"nline.") 461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 4790959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski} 4890959887e9a61ff83097b2789f8b3243ad817decAdam Lesinski 496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, StringBuilderWhitespaceRemoval) { 506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(StringPiece16(u"hey guys this is so cool"), 511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u" hey guys ") 521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .append(u" this is so cool ") 531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(StringPiece16(u" wow, so many \t spaces. what?"), 561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u" \" wow, so many \t ") 571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .append(u"spaces. \"what? ") 581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(StringPiece16(u"where is the pie?"), 611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u" where \t ") 621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .append(u" \nis the "" pie?") 631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, StringBuilderEscaping) { 676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(StringPiece16(u"hey guys\n this \t is so\\ cool"), 681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u" hey guys\\n ") 691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .append(u" this \\t is so\\\\ cool ") 701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(StringPiece16(u"@?#\\\'"), 731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u"\\@\\?\\#\\\\\\'") 741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, StringBuilderMisplacedQuote) { 786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski util::StringBuilder builder{}; 796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_FALSE(builder.append(u"they're coming!")); 806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, StringBuilderUnicodeCodes) { 836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_EQ(StringPiece16(u"\u00AF\u0AF0 woah"), 841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::StringBuilder().append(u"\\u00AF\\u0AF0 woah") 851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .str()); 866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski EXPECT_FALSE(util::StringBuilder().append(u"\\u00 yo")); 886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(UtilTest, TokenizeInput) { 916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski auto tokenizer = util::tokenize(StringPiece16(u"this| is|the|end"), u'|'); 926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski auto iter = tokenizer.begin(); 936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ASSERT_EQ(*iter, StringPiece16(u"this")); 946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ++iter; 956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ASSERT_EQ(*iter, StringPiece16(u" is")); 966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ++iter; 976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ASSERT_EQ(*iter, StringPiece16(u"the")); 986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ++iter; 996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ASSERT_EQ(*iter, StringPiece16(u"end")); 1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ++iter; 1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski ASSERT_EQ(tokenizer.end(), iter); 1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} 1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski 104cf95a580149ec03588b1c75f036c924730f83615Adam LesinskiTEST(UtilTest, TokenizeEmptyString) { 105cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski auto tokenizer = util::tokenize(StringPiece16(u""), u'|'); 106cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski auto iter = tokenizer.begin(); 107cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski ASSERT_NE(tokenizer.end(), iter); 108cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski ASSERT_EQ(StringPiece16(), *iter); 109cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski ++iter; 110cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski ASSERT_EQ(tokenizer.end(), iter); 111cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski} 112cf95a580149ec03588b1c75f036c924730f83615Adam Lesinski 1131ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(UtilTest, TokenizeAtEnd) { 1141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski auto tokenizer = util::tokenize(StringPiece16(u"one."), u'.'); 1151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski auto iter = tokenizer.begin(); 1161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_EQ(*iter, StringPiece16(u"one")); 1171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ++iter; 1181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_NE(iter, tokenizer.end()); 1191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_EQ(*iter, StringPiece16()); 1201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 1211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 122a1ad4a812a87642ad259ff4478159e8cc8194680Adam LesinskiTEST(UtilTest, IsJavaClassName) { 123a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_TRUE(util::isJavaClassName(u"android.test.Class")); 124a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_TRUE(util::isJavaClassName(u"android.test.Class$Inner")); 125a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_TRUE(util::isJavaClassName(u"android_test.test.Class")); 126a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_TRUE(util::isJavaClassName(u"_android_.test._Class_")); 127a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_FALSE(util::isJavaClassName(u"android.test.$Inner")); 128a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_FALSE(util::isJavaClassName(u"android.test.Inner$")); 129a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_FALSE(util::isJavaClassName(u".test.Class")); 130a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_FALSE(util::isJavaClassName(u"android")); 131a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski} 132a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 1331ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(UtilTest, IsJavaPackageName) { 1341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(util::isJavaPackageName(u"android")); 1351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(util::isJavaPackageName(u"android.test")); 1361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(util::isJavaPackageName(u"android.test_thing")); 1371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::isJavaPackageName(u"_android")); 1381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::isJavaPackageName(u"android_")); 1391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::isJavaPackageName(u"android.")); 1401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::isJavaPackageName(u".android")); 1411ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::isJavaPackageName(u"android._test")); 1421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::isJavaPackageName(u"..")); 1431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 1441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 145a1ad4a812a87642ad259ff4478159e8cc8194680Adam LesinskiTEST(UtilTest, FullyQualifiedClassName) { 146a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski Maybe<std::u16string> res = util::getFullyQualifiedClassName(u"android", u"asdf"); 14752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski AAPT_ASSERT_FALSE(res); 148a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 149a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski res = util::getFullyQualifiedClassName(u"android", u".asdf"); 1501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_TRUE(res); 151a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_EQ(res.value(), u"android.asdf"); 152a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 153a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski res = util::getFullyQualifiedClassName(u"android", u".a.b"); 1541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_TRUE(res); 155a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_EQ(res.value(), u"android.a.b"); 156a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 157a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski res = util::getFullyQualifiedClassName(u"android", u"a.b"); 1581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_TRUE(res); 159a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_EQ(res.value(), u"a.b"); 160a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 161a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski res = util::getFullyQualifiedClassName(u"", u"a.b"); 1621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_TRUE(res); 163a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski EXPECT_EQ(res.value(), u"a.b"); 164a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 165a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski res = util::getFullyQualifiedClassName(u"", u""); 1661ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_FALSE(res); 167a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 168a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski res = util::getFullyQualifiedClassName(u"android", u"./Apple"); 1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AAPT_ASSERT_FALSE(res); 170a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski} 171a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 1721ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(UtilTest, ExtractResourcePathComponents) { 1731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StringPiece16 prefix, entry, suffix; 1741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_TRUE(util::extractResFilePathParts(u"res/xml-sw600dp/entry.xml", &prefix, &entry, 1751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski &suffix)); 1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(prefix, u"res/xml-sw600dp/"); 1771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(entry, u"entry"); 1781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(suffix, u".xml"); 1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_TRUE(util::extractResFilePathParts(u"res/xml-sw600dp/entry.9.png", &prefix, &entry, 1811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski &suffix)); 1821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(prefix, u"res/xml-sw600dp/"); 1841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(entry, u"entry"); 1851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(suffix, u".9.png"); 1861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::extractResFilePathParts(u"AndroidManifest.xml", &prefix, &entry, &suffix)); 1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_FALSE(util::extractResFilePathParts(u"res/.xml", &prefix, &entry, &suffix)); 1891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_TRUE(util::extractResFilePathParts(u"res//.", &prefix, &entry, &suffix)); 1911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(prefix, u"res//"); 1921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(entry, u""); 1931ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_EQ(suffix, u"."); 1941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 195a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski 196b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam LesinskiTEST(UtilTest, VerifyJavaStringFormat) { 197b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski ASSERT_TRUE(util::verifyJavaStringFormat(u"%09.34f")); 198b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski ASSERT_TRUE(util::verifyJavaStringFormat(u"%9$.34f %8$")); 199b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski ASSERT_TRUE(util::verifyJavaStringFormat(u"%% %%")); 200b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski ASSERT_FALSE(util::verifyJavaStringFormat(u"%09$f %f")); 201b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski ASSERT_FALSE(util::verifyJavaStringFormat(u"%09f %08s")); 202b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski} 203b23f1e077b02a1d62bcf5e34655e8dc979e124faAdam Lesinski 2046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt 205