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