blob: 39e9fe2d9e458f309ca31a8bb523768f7d4f2b5b [file] [log] [blame] [edit]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string_view>
#include <efi/string/string.h>
#include <fbl/vector.h>
#include <gtest/gtest.h>
namespace fbl {
template <typename T>
inline bool operator==(const Vector<T>& a, const Vector<T>& b) {
return std::equal(a.begin(), a.end(), b.begin(), b.end());
}
template <typename T>
inline bool operator!=(const Vector<T>& a, const Vector<T>& b) {
return !(a == b);
}
} // namespace fbl
namespace {
using namespace std::string_view_literals;
TEST(String, ConstructDefault) {
efi::String string;
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "");
ASSERT_EQ(string, u"");
}
TEST(String, ConstructUtf8) {
efi::String string("abc 123");
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "abc 123");
ASSERT_EQ(string, u"abc 123");
}
TEST(String, ConstructUtf16) {
efi::String string(u"abc 123");
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "abc 123");
ASSERT_EQ(string, u"abc 123");
}
TEST(String, ConstructUtf8Vector) {
fbl::Vector<char> vector{'a', 'b', 'c', ' ', '1', '2', '3', '\0'};
efi::String string(std::move(vector));
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "abc 123");
ASSERT_EQ(string, u"abc 123");
}
TEST(String, ConstructUtf16Vector) {
fbl::Vector<char16_t> vector{u'a', u'b', u'c', u' ', u'1', u'2', u'3', u'\0'};
efi::String string(std::move(vector));
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "abc 123");
ASSERT_EQ(string, u"abc 123");
}
TEST(String, Copy) {
efi::String original("abc 123");
efi::String copy(original);
for (const auto& string : {original, copy}) {
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "abc 123");
ASSERT_EQ(string, u"abc 123");
}
}
TEST(String, Move) {
efi::String original("abc 123");
efi::String final(std::move(original));
ASSERT_FALSE(original.IsValid());
ASSERT_TRUE(final.IsValid());
ASSERT_EQ(final, "abc 123");
ASSERT_EQ(final, u"abc 123");
}
// Make sure [in]equality operators are defined for String and {String, c-string, string_view}.
TEST(String, Equality) {
efi::String string("abc 123");
efi::String same(string);
efi::String different("foo bar");
ASSERT_EQ(string, same);
ASSERT_EQ(string, "abc 123");
ASSERT_EQ(string, u"abc 123");
ASSERT_EQ(string, "abc 123"sv);
ASSERT_EQ(string, u"abc 123"sv);
ASSERT_NE(string, different);
ASSERT_NE(string, "foo bar");
ASSERT_NE(string, u"foo bar");
ASSERT_NE(string, "foo bar"sv);
ASSERT_NE(string, u"foo bar"sv);
}
TEST(String, EmbeddedNulls) {
efi::String string("\0abc\0123\0"sv);
ASSERT_TRUE(string.IsValid());
ASSERT_EQ(string, "\0abc\0123\0"sv);
ASSERT_EQ(string, u"\0abc\0123\0"sv);
}
TEST(String, ToUtf8) {
ASSERT_EQ(efi::String::ToUtf8(u"abc 123"),
(fbl::Vector<char>{'a', 'b', 'c', ' ', '1', '2', '3', '\0'}));
}
TEST(String, ToUtf16) {
ASSERT_EQ(efi::String::ToUtf16("abc 123"),
(fbl::Vector<char16_t>{u'a', u'b', u'c', u' ', u'1', u'2', u'3', u'\0'}));
}
} // namespace