diff options
author | Vic Yang <victoryang@google.com> | 2019-08-06 12:58:44 -0700 |
---|---|---|
committer | Vic Yang <victoryang@google.com> | 2019-08-09 11:01:37 -0700 |
commit | d4cb4894348818b90457d94580ed4d611c5d11b0 (patch) | |
tree | 04c04ac544f15721ce76c203f927eb0a48976adf /libutils/String16_test.cpp | |
parent | 23a87716b57114e9b4f607042e3ec1af90d68c0a (diff) |
libutils: Introduce StaticString16
This is a backward compatible implementation of compile time
constructed String16 support.
As much as we'd like a regular constexpr constructor for String16, we
want to make sure the regular non-static String16 does not regress.
We also need to make sure prebuilts built with previous version of
String16 still works with new libutils. This means we cannot change
the size of String16 objects and we cannot make anything virtual.
To add a flag to indicate whether a String16 is static without
increasing the size of non-static String16 objects, we repurpose a
reserved field in SharedBuffer as "for client use". With this, we can
tag every String16 and perform memory operation differently based on
how the underlying buffers are allocated.
By using StaticString16, we are able to eliminate the runtime
construction of a String16 and move it out of .bss section.
Bug: 138856262
Test: Run newly added unit tests.
Change-Id: I72bb8dc27a59b9ef34e0d934bc1e00b0f675855a
Diffstat (limited to 'libutils/String16_test.cpp')
-rw-r--r-- | libutils/String16_test.cpp | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/libutils/String16_test.cpp b/libutils/String16_test.cpp new file mode 100644 index 000000000..f1f24c394 --- /dev/null +++ b/libutils/String16_test.cpp @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * 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 <utils/String16.h> +#include <utils/String8.h> + +#include <gtest/gtest.h> + +namespace android { + +::testing::AssertionResult Char16_tStringEquals(const char16_t* a, const char16_t* b) { + if (strcmp16(a, b) != 0) { + return ::testing::AssertionFailure() + << "\"" << String8(a).c_str() << "\" not equal to \"" << String8(b).c_str() << "\""; + } + return ::testing::AssertionSuccess(); +} + +#define EXPECT_STR16EQ(a, b) EXPECT_TRUE(Char16_tStringEquals(a, b)) + +TEST(String16Test, FromChar16_t) { + String16 tmp(u"Verify me"); + EXPECT_STR16EQ(u"Verify me", tmp); +} + +TEST(String16Test, FromChar16_tSized) { + String16 tmp(u"Verify me", 7); + EXPECT_STR16EQ(u"Verify ", tmp); +} + +TEST(String16Test, FromChar) { + String16 tmp("Verify me"); + EXPECT_STR16EQ(u"Verify me", tmp); +} + +TEST(String16Test, FromCharSized) { + String16 tmp("Verify me", 7); + EXPECT_STR16EQ(u"Verify ", tmp); +} + +TEST(String16Test, Copy) { + String16 tmp("Verify me"); + String16 another = tmp; + EXPECT_STR16EQ(u"Verify me", tmp); + EXPECT_STR16EQ(u"Verify me", another); +} + +TEST(String16Test, Move) { + String16 tmp("Verify me"); + String16 another(std::move(tmp)); + EXPECT_STR16EQ(u"Verify me", another); +} + +TEST(String16Test, Size) { + String16 tmp("Verify me"); + EXPECT_EQ(9U, tmp.size()); +} + +TEST(String16Test, setTo) { + String16 tmp("Verify me"); + tmp.setTo(u"New content"); + EXPECT_EQ(11U, tmp.size()); + EXPECT_STR16EQ(u"New content", tmp); +} + +TEST(String16Test, Append) { + String16 tmp("Verify me"); + tmp.append(String16("Hello")); + EXPECT_EQ(14U, tmp.size()); + EXPECT_STR16EQ(u"Verify meHello", tmp); +} + +TEST(String16Test, Insert) { + String16 tmp("Verify me"); + tmp.insert(6, u"Insert"); + EXPECT_EQ(15U, tmp.size()); + EXPECT_STR16EQ(u"VerifyInsert me", tmp); +} + +TEST(String16Test, Remove) { + String16 tmp("Verify me"); + tmp.remove(2, 6); + EXPECT_EQ(2U, tmp.size()); + EXPECT_STR16EQ(u" m", tmp); +} + +TEST(String16Test, MakeLower) { + String16 tmp("Verify Me!"); + tmp.makeLower(); + EXPECT_EQ(10U, tmp.size()); + EXPECT_STR16EQ(u"verify me!", tmp); +} + +TEST(String16Test, ReplaceAll) { + String16 tmp("Verify verify Verify"); + tmp.replaceAll(u'r', u'!'); + EXPECT_STR16EQ(u"Ve!ify ve!ify Ve!ify", tmp); +} + +TEST(String16Test, Compare) { + String16 tmp("Verify me"); + EXPECT_EQ(String16(u"Verify me"), tmp); +} + +TEST(String16Test, StaticString) { + String16 nonStaticString("NonStatic"); + StaticString16 staticString(u"Static"); + + EXPECT_TRUE(staticString.isStaticString()); + EXPECT_FALSE(nonStaticString.isStaticString()); +} + +TEST(String16Test, StaticStringCopy) { + StaticString16 tmp(u"Verify me"); + String16 another = tmp; + EXPECT_STR16EQ(u"Verify me", tmp); + EXPECT_STR16EQ(u"Verify me", another); + EXPECT_TRUE(tmp.isStaticString()); + EXPECT_TRUE(another.isStaticString()); +} + +TEST(String16Test, StaticStringMove) { + StaticString16 tmp(u"Verify me"); + String16 another(std::move(tmp)); + EXPECT_STR16EQ(u"Verify me", another); + EXPECT_TRUE(another.isStaticString()); +} + +TEST(String16Test, StaticStringSize) { + StaticString16 tmp(u"Verify me"); + EXPECT_EQ(9U, tmp.size()); +} + +TEST(String16Test, StaticStringSetTo) { + StaticString16 tmp(u"Verify me"); + tmp.setTo(u"New content"); + EXPECT_EQ(11U, tmp.size()); + EXPECT_STR16EQ(u"New content", tmp); + EXPECT_FALSE(tmp.isStaticString()); +} + +TEST(String16Test, StaticStringAppend) { + StaticString16 tmp(u"Verify me"); + tmp.append(String16("Hello")); + EXPECT_EQ(14U, tmp.size()); + EXPECT_STR16EQ(u"Verify meHello", tmp); + EXPECT_FALSE(tmp.isStaticString()); +} + +TEST(String16Test, StaticStringInsert) { + StaticString16 tmp(u"Verify me"); + tmp.insert(6, u"Insert"); + EXPECT_EQ(15U, tmp.size()); + EXPECT_STR16EQ(u"VerifyInsert me", tmp); + EXPECT_FALSE(tmp.isStaticString()); +} + +TEST(String16Test, StaticStringRemove) { + StaticString16 tmp(u"Verify me"); + tmp.remove(2, 6); + EXPECT_EQ(2U, tmp.size()); + EXPECT_STR16EQ(u" m", tmp); + EXPECT_FALSE(tmp.isStaticString()); +} + +TEST(String16Test, StaticStringMakeLower) { + StaticString16 tmp(u"Verify me!"); + tmp.makeLower(); + EXPECT_EQ(10U, tmp.size()); + EXPECT_STR16EQ(u"verify me!", tmp); + EXPECT_FALSE(tmp.isStaticString()); +} + +TEST(String16Test, StaticStringReplaceAll) { + StaticString16 tmp(u"Verify verify Verify"); + tmp.replaceAll(u'r', u'!'); + EXPECT_STR16EQ(u"Ve!ify ve!ify Ve!ify", tmp); + EXPECT_FALSE(tmp.isStaticString()); +} + +TEST(String16Test, StaticStringCompare) { + StaticString16 tmp(u"Verify me"); + EXPECT_EQ(String16(u"Verify me"), tmp); +} + +TEST(String16Test, StringSetToStaticString) { + StaticString16 tmp(u"Verify me"); + String16 another(u"nonstatic"); + another = tmp; + EXPECT_STR16EQ(u"Verify me", tmp); + EXPECT_STR16EQ(u"Verify me", another); +} + +TEST(String16Test, StringMoveFromStaticString) { + StaticString16 tmp(u"Verify me"); + String16 another(std::move(tmp)); + EXPECT_STR16EQ(u"Verify me", another); +} + +TEST(String16Test, EmptyStringIsStatic) { + String16 tmp(""); + EXPECT_TRUE(tmp.isStaticString()); +} + +} // namespace android |