1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "Unicode_test" 18 #include <utils/Log.h> 19 #include <utils/Unicode.h> 20 21 #include <gtest/gtest.h> 22 23 namespace android { 24 25 class UnicodeTest : public testing::Test { 26 protected: 27 virtual void SetUp() { 28 } 29 30 virtual void TearDown() { 31 } 32 33 char16_t const * const kSearchString = u"I am a leaf on the wind."; 34 }; 35 36 TEST_F(UnicodeTest, UTF8toUTF16ZeroLength) { 37 ssize_t measured; 38 39 const uint8_t str[] = { }; 40 41 measured = utf8_to_utf16_length(str, 0); 42 EXPECT_EQ(0, measured) 43 << "Zero length input should return zero length output."; 44 } 45 46 TEST_F(UnicodeTest, UTF8toUTF16ASCIILength) { 47 ssize_t measured; 48 49 // U+0030 or ASCII '0' 50 const uint8_t str[] = { 0x30 }; 51 52 measured = utf8_to_utf16_length(str, sizeof(str)); 53 EXPECT_EQ(1, measured) 54 << "ASCII glyphs should have a length of 1 char16_t"; 55 } 56 57 TEST_F(UnicodeTest, UTF8toUTF16Plane1Length) { 58 ssize_t measured; 59 60 // U+2323 SMILE 61 const uint8_t str[] = { 0xE2, 0x8C, 0xA3 }; 62 63 measured = utf8_to_utf16_length(str, sizeof(str)); 64 EXPECT_EQ(1, measured) 65 << "Plane 1 glyphs should have a length of 1 char16_t"; 66 } 67 68 TEST_F(UnicodeTest, UTF8toUTF16SurrogateLength) { 69 ssize_t measured; 70 71 // U+10000 72 const uint8_t str[] = { 0xF0, 0x90, 0x80, 0x80 }; 73 74 measured = utf8_to_utf16_length(str, sizeof(str)); 75 EXPECT_EQ(2, measured) 76 << "Surrogate pairs should have a length of 2 char16_t"; 77 } 78 79 TEST_F(UnicodeTest, UTF8toUTF16TruncatedUTF8) { 80 ssize_t measured; 81 82 // Truncated U+2323 SMILE 83 // U+2323 SMILE 84 const uint8_t str[] = { 0xE2, 0x8C }; 85 86 measured = utf8_to_utf16_length(str, sizeof(str)); 87 EXPECT_EQ(-1, measured) 88 << "Truncated UTF-8 should return -1 to indicate invalid"; 89 } 90 91 TEST_F(UnicodeTest, UTF8toUTF16Normal) { 92 const uint8_t str[] = { 93 0x30, // U+0030, 1 UTF-16 character 94 0xC4, 0x80, // U+0100, 1 UTF-16 character 95 0xE2, 0x8C, 0xA3, // U+2323, 1 UTF-16 character 96 0xF0, 0x90, 0x80, 0x80, // U+10000, 2 UTF-16 character 97 }; 98 99 char16_t output[1 + 1 + 1 + 2 + 1]; // Room for NULL 100 101 utf8_to_utf16(str, sizeof(str), output); 102 103 EXPECT_EQ(0x0030, output[0]) 104 << "should be U+0030"; 105 EXPECT_EQ(0x0100, output[1]) 106 << "should be U+0100"; 107 EXPECT_EQ(0x2323, output[2]) 108 << "should be U+2323"; 109 EXPECT_EQ(0xD800, output[3]) 110 << "should be first half of surrogate U+10000"; 111 EXPECT_EQ(0xDC00, output[4]) 112 << "should be second half of surrogate U+10000"; 113 EXPECT_EQ(NULL, output[5]) 114 << "should be NULL terminated"; 115 } 116 117 TEST_F(UnicodeTest, strstr16EmptyTarget) { 118 EXPECT_EQ(strstr16(kSearchString, u""), kSearchString) 119 << "should return the original pointer"; 120 } 121 122 TEST_F(UnicodeTest, strstr16SameString) { 123 const char16_t* result = strstr16(kSearchString, kSearchString); 124 EXPECT_EQ(kSearchString, result) 125 << "should return the original pointer"; 126 } 127 128 TEST_F(UnicodeTest, strstr16TargetStartOfString) { 129 const char16_t* result = strstr16(kSearchString, u"I am"); 130 EXPECT_EQ(kSearchString, result) 131 << "should return the original pointer"; 132 } 133 134 135 TEST_F(UnicodeTest, strstr16TargetEndOfString) { 136 const char16_t* result = strstr16(kSearchString, u"wind."); 137 EXPECT_EQ(kSearchString+19, result); 138 } 139 140 TEST_F(UnicodeTest, strstr16TargetWithinString) { 141 const char16_t* result = strstr16(kSearchString, u"leaf"); 142 EXPECT_EQ(kSearchString+7, result); 143 } 144 145 TEST_F(UnicodeTest, strstr16TargetNotPresent) { 146 const char16_t* result = strstr16(kSearchString, u"soar"); 147 EXPECT_EQ(nullptr, result); 148 } 149 150 } 151