blob: 4c69b95ab55dc100cc9d381589f7d40c584eedd5 [file] [log] [blame]
// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <string>
#include "starboard/android/shared/jni_env_ext.h"
#include "starboard/configuration.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace starboard {
namespace android {
namespace shared {
namespace {
// UTF-16, UTF-8, and Modified UTF-8 test strings, all "𐆖€£$"
// 𐆖 U+10196 -> U16: D800 DD96 U8: F0 90 86 96 MU8: ED A0 80 ED B6 96
// € U+020AC -> U16: 20AC U8: E2 82 AC MU8: E2 82 AC
// £ U+000A3 -> U16: 00A3 U8: C2 A3 MU8: C2 A3
// $ U+00024 -> U16: 0024 U8: 24 MU8: 24
const char16_t kU16[] = u"\U00010196\u20AC\u00A3\u0024";
const char kU8[] = "\xF0\x90\x86\x96\xE2\x82\xAC\xC2\xA3\x24";
const char kMU8[] = "\xED\xA0\x80\xED\xB6\x96\xE2\x82\xAC\xC2\xA3\x24";
// Subtract one from the array size to not count the null terminator.
const int kU16Length = SB_ARRAY_SIZE(kU16) - 1;
const int kU8Length = SB_ARRAY_SIZE(kU8) - 1;
const int kMU8Length = SB_ARRAY_SIZE(kMU8) - 1;
// Note: there is no test for getting the string back as modified UTF-8 since
// on some Android devices GetStringUTFChars() may return standard UTF-8.
// (e.g. Nexus Player returns modified UTF-8, but Shield returns standard UTF-8)
// see: https://github.com/android-ndk/ndk/issues/283
TEST(JniEnvExtTest, NewStringStandardUTF) {
JniEnvExt* env = JniEnvExt::Get();
jstring j_str = env->NewStringStandardUTFOrAbort(kU8);
EXPECT_EQ(kU16Length, env->GetStringLength(j_str));
const jchar* u16_chars = env->GetStringChars(j_str, NULL);
std::u16string u16_string(
reinterpret_cast<const char16_t*>(u16_chars), kU16Length);
EXPECT_EQ(std::u16string(kU16), u16_string);
env->ReleaseStringChars(j_str, u16_chars);
}
TEST(JniEnvExtTest, NewStringModifiedUTF) {
JniEnvExt* env = JniEnvExt::Get();
jstring j_str = env->NewStringUTF(kMU8);
EXPECT_EQ(kU16Length, env->GetStringLength(j_str));
const jchar* u16_chars = env->GetStringChars(j_str, NULL);
std::u16string u16_string(
reinterpret_cast<const char16_t*>(u16_chars), kU16Length);
EXPECT_EQ(std::u16string(kU16), u16_string);
env->ReleaseStringChars(j_str, u16_chars);
}
TEST(JniEnvExtTest, EmptyNewStringStandardUTF) {
JniEnvExt* env = JniEnvExt::Get();
jstring j_str = env->NewStringStandardUTFOrAbort("");
EXPECT_EQ(0, env->GetStringLength(j_str));
}
TEST(JniEnvExtTest, GetStringStandardUTF) {
JniEnvExt* env = JniEnvExt::Get();
jstring j_str =
env->NewString(reinterpret_cast<const jchar*>(kU16), kU16Length);
std::string str = env->GetStringStandardUTFOrAbort(j_str);
EXPECT_EQ(kU8Length, str.length());
EXPECT_EQ(std::string(kU8), str);
env->DeleteLocalRef(j_str);
}
TEST(JniEnvExtTest, EmptyGetStringStandardUTF) {
JniEnvExt* env = JniEnvExt::Get();
jchar empty[] = {};
jstring j_str = env->NewString(empty, 0);
std::string str = env->GetStringStandardUTFOrAbort(j_str);
EXPECT_EQ(0, str.length());
EXPECT_EQ(std::string(), str);
env->DeleteLocalRef(j_str);
}
} // namespace
} // namespace shared
} // namespace android
} // namespace starboard