| // Copyright 2017 Google Inc. |
| // |
| // 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 "internal/string_view.h" |
| |
| #include "gtest/gtest.h" |
| |
| namespace cpu_features { |
| |
| bool operator==(const StringView& a, const StringView& b) { |
| return CpuFeatures_StringView_IsEquals(a, b); |
| } |
| |
| namespace { |
| |
| TEST(StringViewTest, Empty) { |
| EXPECT_EQ(kEmptyStringView.ptr, nullptr); |
| EXPECT_EQ(kEmptyStringView.size, 0); |
| } |
| |
| TEST(StringViewTest, Build) { |
| const auto view = str("test"); |
| EXPECT_EQ(view.ptr[0], 't'); |
| EXPECT_EQ(view.size, 4); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_IndexOfChar) { |
| // Found. |
| EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(str("test"), 'e'), 1); |
| // Not found. |
| EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(str("test"), 'z'), -1); |
| // Empty. |
| EXPECT_EQ(CpuFeatures_StringView_IndexOfChar(kEmptyStringView, 'z'), -1); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_IndexOf) { |
| // Found. |
| EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("test"), str("es")), 1); |
| // Not found. |
| EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("test"), str("aa")), -1); |
| // Empty. |
| EXPECT_EQ(CpuFeatures_StringView_IndexOf(kEmptyStringView, str("aa")), -1); |
| EXPECT_EQ(CpuFeatures_StringView_IndexOf(str("aa"), kEmptyStringView), -1); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_StartsWith) { |
| EXPECT_TRUE(CpuFeatures_StringView_StartsWith(str("test"), str("te"))); |
| EXPECT_FALSE(CpuFeatures_StringView_StartsWith(str("test"), str(""))); |
| EXPECT_FALSE( |
| CpuFeatures_StringView_StartsWith(str("test"), kEmptyStringView)); |
| EXPECT_FALSE( |
| CpuFeatures_StringView_StartsWith(kEmptyStringView, str("test"))); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_IsEquals) { |
| EXPECT_TRUE( |
| CpuFeatures_StringView_IsEquals(kEmptyStringView, kEmptyStringView)); |
| EXPECT_TRUE(CpuFeatures_StringView_IsEquals(kEmptyStringView, str(""))); |
| EXPECT_TRUE(CpuFeatures_StringView_IsEquals(str(""), kEmptyStringView)); |
| EXPECT_TRUE(CpuFeatures_StringView_IsEquals(str("a"), str("a"))); |
| EXPECT_FALSE(CpuFeatures_StringView_IsEquals(str("a"), str("b"))); |
| EXPECT_FALSE(CpuFeatures_StringView_IsEquals(str("a"), kEmptyStringView)); |
| EXPECT_FALSE(CpuFeatures_StringView_IsEquals(kEmptyStringView, str("a"))); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_PopFront) { |
| EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 2), str("st")); |
| EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 0), str("test")); |
| EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 4), str("")); |
| EXPECT_EQ(CpuFeatures_StringView_PopFront(str("test"), 100), str("")); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_ParsePositiveNumber) { |
| EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("42")), 42); |
| EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("0x2a")), 42); |
| EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("0x2A")), 42); |
| |
| EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("-0x2A")), -1); |
| EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("abc")), -1); |
| EXPECT_EQ(CpuFeatures_StringView_ParsePositiveNumber(str("")), -1); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_CopyString) { |
| char buf[4]; |
| buf[0] = 'X'; |
| |
| // Empty |
| CpuFeatures_StringView_CopyString(str(""), buf, sizeof(buf)); |
| EXPECT_STREQ(buf, ""); |
| |
| // Less |
| CpuFeatures_StringView_CopyString(str("a"), buf, sizeof(buf)); |
| EXPECT_STREQ(buf, "a"); |
| |
| // exact |
| CpuFeatures_StringView_CopyString(str("abc"), buf, sizeof(buf)); |
| EXPECT_STREQ(buf, "abc"); |
| |
| // More |
| CpuFeatures_StringView_CopyString(str("abcd"), buf, sizeof(buf)); |
| EXPECT_STREQ(buf, "abc"); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_HasWord) { |
| // Find flags at beginning, middle and end. |
| EXPECT_TRUE( |
| CpuFeatures_StringView_HasWord(str("first middle last"), "first")); |
| EXPECT_TRUE( |
| CpuFeatures_StringView_HasWord(str("first middle last"), "middle")); |
| EXPECT_TRUE(CpuFeatures_StringView_HasWord(str("first middle last"), "last")); |
| // Do not match partial flags |
| EXPECT_FALSE( |
| CpuFeatures_StringView_HasWord(str("first middle last"), "irst")); |
| EXPECT_FALSE(CpuFeatures_StringView_HasWord(str("first middle last"), "mid")); |
| EXPECT_FALSE(CpuFeatures_StringView_HasWord(str("first middle last"), "las")); |
| } |
| |
| TEST(StringViewTest, CpuFeatures_StringView_GetAttributeKeyValue) { |
| const StringView line = str(" key : first middle last "); |
| StringView key, value; |
| EXPECT_TRUE(CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)); |
| EXPECT_EQ(key, str("key")); |
| EXPECT_EQ(value, str("first middle last")); |
| } |
| |
| TEST(StringViewTest, FailingGetAttributeKeyValue) { |
| const StringView line = str("key first middle last"); |
| StringView key, value; |
| EXPECT_FALSE(CpuFeatures_StringView_GetAttributeKeyValue(line, &key, &value)); |
| } |
| |
| } // namespace |
| } // namespace cpu_features |