| // Copyright 2026 WebAssembly Community Group participants | |
| // | |
| // 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 "support/istring.h" | |
| #include "gtest/gtest.h" | |
| using namespace wasm; | |
| using IStringTest = ::testing::Test; | |
| TEST_F(IStringTest, Empty) { | |
| // Null and empty strings differ. | |
| auto null = IString(); | |
| auto empty = IString(""); | |
| EXPECT_NE(null, empty); | |
| EXPECT_FALSE(null.is()); | |
| EXPECT_TRUE(empty.is()); | |
| // But they are equal to themselves. | |
| EXPECT_EQ(null, null); | |
| EXPECT_EQ(empty, empty); | |
| // A default string_view is the empty string, and has data == nullptr. | |
| auto stdViewDefault1 = std::string_view(); | |
| EXPECT_EQ(stdViewDefault1.data(), nullptr); | |
| auto stdViewDefault2 = std::string_view{}; | |
| EXPECT_EQ(stdViewDefault2.data(), nullptr); | |
| EXPECT_EQ(empty, stdViewDefault1); | |
| EXPECT_EQ(empty, stdViewDefault2); | |
| // The same when going through the IString constructor. | |
| EXPECT_EQ(empty, IString(std::string_view{})); | |
| // An empty string_view is equal to those, even though its data != nullptr. | |
| auto stdViewEmpty = std::string_view(""); | |
| EXPECT_NE(stdViewEmpty.data(), nullptr); | |
| EXPECT_EQ(empty, stdViewEmpty); | |
| } | |
| TEST_F(IStringTest, Interning) { | |
| // The same string interned twice is equal. | |
| auto foo1 = IString("foo"); | |
| auto foo2 = IString("foo"); | |
| EXPECT_EQ(foo1, foo2); | |
| // The internal pointers are equal too. | |
| EXPECT_EQ(foo1.str.data(), foo2.str.data()); | |
| // Other things are different. | |
| auto bar = IString("bar"); | |
| EXPECT_NE(foo1, bar); | |
| EXPECT_NE(foo2, bar); | |
| // Things are equal to themselves. | |
| EXPECT_EQ(foo1, foo1); | |
| EXPECT_EQ(foo2, foo2); | |
| EXPECT_EQ(bar, bar); | |
| } | |
| TEST_F(IStringTest, StartsWith) { | |
| auto foo = IString("foo"); | |
| EXPECT_TRUE(foo.startsWith("f")); | |
| EXPECT_TRUE(foo.startsWith("fo")); | |
| EXPECT_TRUE(foo.startsWith("foo")); | |
| EXPECT_FALSE(foo.startsWith("oo")); | |
| EXPECT_FALSE(foo.startsWith("o")); | |
| EXPECT_FALSE(foo.startsWith("foobar")); | |
| EXPECT_FALSE(foo.startsWith("bar")); | |
| } | |
| TEST_F(IStringTest, EndsWith) { | |
| auto foo = IString("foo"); | |
| EXPECT_TRUE(foo.endsWith("o")); | |
| EXPECT_TRUE(foo.endsWith("oo")); | |
| EXPECT_TRUE(foo.endsWith("foo")); | |
| EXPECT_FALSE(foo.endsWith("f")); | |
| EXPECT_FALSE(foo.endsWith("fo")); | |
| EXPECT_FALSE(foo.endsWith("foobar")); | |
| EXPECT_FALSE(foo.endsWith("bar")); | |
| } |