szAlt = L"設定値";
+
+ // ACT
+ szText = szAlt;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(std::wstring(szAlt)));
+ EXPECT_THAT(szText.length(), szAlt.length());
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * nullptrを代入する
+ */
+TEST(StringBufferW, assign101)
+{
+ // ARRANGE
+ LOGFONT lf{};
+ wcscpy_s(lf.lfFaceName, L"初期値");
+ auto szText = StringBufferW(lf.lfFaceName);
+
+ // ACT
+ szText = nullptr;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L""));
+ EXPECT_THAT(szText.length(), 0);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 文字列ポインタを代入する(値がnullptr)
+ */
+TEST(StringBufferW, assign102)
+{
+ // ARRANGE
+ LOGFONT lf{};
+ wcscpy_s(lf.lfFaceName, L"初期値");
+ auto szText = StringBufferW(lf.lfFaceName);
+ LPCWSTR pszNull = nullptr;
+
+ // ACT
+ szText = pszNull;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L""));
+ EXPECT_THAT(szText.length(), 0);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 文字列参照を代入する(サイズオーバー)
+ */
+TEST(StringBufferW, assign104)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+
+ // ACT
+ szText = L"設定値1"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設定値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT2
+ EXPECT_EQ(STRUNCATE, szText.assign(L"設定値1"sv));
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設定値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列ポインタを追加する
+ */
+TEST(StringBufferW, append002)
+{
+ // ARRANGE
+ LOGFONT lf{};
+ wcscpy_s(lf.lfFaceName, L"初期値");
+ auto szText = StringBufferW(lf.lfFaceName);
+
+ // ACT
+ szText += L"よん♪";
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値よん♪"));
+ EXPECT_THAT(szText.length(), 6);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列を追加する
+ */
+TEST(StringBufferW, append003)
+{
+ // ARRANGE
+ LOGFONT lf{};
+ wcscpy_s(lf.lfFaceName, L"初期値");
+ auto szText = StringBufferW(lf.lfFaceName);
+
+ // ACT
+ szText += L"よん♪"s;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値よん♪"));
+ EXPECT_THAT(szText.length(), 6);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列参照タを追加する
+ */
+TEST(StringBufferW, append004)
+{
+ // ARRANGE
+ LOGFONT lf{};
+ wcscpy_s(lf.lfFaceName, L"初期値");
+ auto szText = StringBufferW(lf.lfFaceName);
+
+ // ACT
+ szText += L"よん♪"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値よん♪"));
+ EXPECT_THAT(szText.length(), 6);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に1文字を追加する
+ */
+TEST(StringBufferW, append005)
+{
+ // ARRANGE
+ LOGFONT lf{};
+ wcscpy_s(lf.lfFaceName, L"初期値");
+ auto szText = StringBufferW(lf.lfFaceName);
+
+ // ACT
+ szText += L't';
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値t"));
+ EXPECT_THAT(szText.length(), 4);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾にnullptrを追加する
+ */
+TEST(StringBufferW, append101)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+
+ // ACT
+ szText += nullptr; // SALによりコンパイラ警告が発生する
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(nullptr), EINVAL);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列ポインタを追加する(値がnullptr)
+ */
+TEST(StringBufferW, append102)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+ LPCWSTR pszNull = nullptr;
+
+ // ACT
+ szText += pszNull; // SALによりコンパイラ警告が発生する
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(pszNull), EINVAL);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列を追加する(値が空文字)
+ */
+TEST(StringBufferW, append103)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+
+ // ACT
+ szText += L""s;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(L""s), EINVAL);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列参照を追加する(サイズオーバー)
+ */
+TEST(StringBufferW, append203)
+{
+ // ARRANGE
+ SString<4> szBase = L"ザクⅡ";
+ auto szText = StringBufferW(szBase);
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(L"Ⅱ MS-06F"s), STRUNCATE);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザクⅡ"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列ポインタを追加する(途中にNULを含む)
+ */
+TEST(StringBufferW, append202)
+{
+ // ARRANGE
+ SString<4> szBase = L"t";
+ auto szText = StringBufferW(szBase);
+
+ // ACT
+ szText += L"e\0t";
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"te"));
+ EXPECT_THAT(szText.length(), 2);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 末尾に文字列参照を追加する(途中にNULを含む)
+ */
+TEST(StringBufferW, append204)
+{
+ // ARRANGE
+ SString<4> szBase = L"t";
+ auto szText = StringBufferW(szBase);
+
+ // ACT
+ szText += L"e\0t"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"te"));
+ EXPECT_THAT(szText.length(), 2);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 文字列長を計算する
+ */
+TEST(StringBufferW, length)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+ const wchar_t dummy = 0x2025;
+
+ // ASSERT
+ EXPECT_EQ(szText.data()[3], 0);
+ EXPECT_EQ(szText.length(), 3);
+
+ // ACT(領域全体にゴミ投入)
+ auto_memset(szText.data(), dummy, int(std::size(szText)));
+
+ // ASSERT
+ EXPECT_EQ(szText.data()[3], dummy);
+ EXPECT_EQ(szText.length(), 0);
+
+ // ACT(NUL終端する)
+ szText[2] = 0;
+
+ // ASSERT
+ EXPECT_EQ(szText.length(), 2);
+ EXPECT_EQ(szText.data()[3], dummy);
+
+ // ACT
+ szText = dummy;
+
+ // ASSERT
+ EXPECT_EQ(szText.length(), 1);
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 文字列が空かどうか判定する
+ */
+TEST(StringBufferW, empty)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+
+ // ASSERT
+ EXPECT_FALSE(szText.empty());
+
+ // ACT
+ szText = nullptr;
+
+ // ASSERT
+ EXPECT_TRUE(szText.empty());
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * 文字列参照型に変換する
+ */
+TEST(StringBufferW, toStringView)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+
+ // ASSERT
+ EXPECT_THAT(std::wstring_view(szText), StrEq(L"初期値"));
+}
+
+/*!
+ * @brief StringBufferWのテスト
+ *
+ * ファイルパス型に変換する
+ */
+TEST(StringBufferW, toFilePath)
+{
+ // ARRANGE
+ SString<4> szBase = L"初期値";
+ auto szText = StringBufferW(szBase);
+
+ // ACT
+ auto path = std::filesystem::path(szText);
+
+ // ASSERT
+ EXPECT_FALSE(path.empty());
+
+ // ACT
+ szText = nullptr;
+ path = std::filesystem::path(szText);
+
+ // ASSERT
+ EXPECT_TRUE(path.empty());
+}
+
+} // namespace mystring
diff --git a/tests/unittests/test-file.cpp b/tests/unittests/test-file.cpp
index b8ba52b386..12533fa0d1 100644
--- a/tests/unittests/test-file.cpp
+++ b/tests/unittests/test-file.cpp
@@ -579,6 +579,8 @@ TEST(file, FileMatchScoreSepExt)
ASSERT_EQ(_countof(LR"(testXX)") - 1 + _countof(LR"(.t)") - 1, result);
}
+namespace mystring {
+
/*!
GetExtのテスト
*/
@@ -608,6 +610,8 @@ TEST(CFilePath, GetExt)
ASSERT_EQ(path.c_str() + path.Length(), path.GetExt());
}
+} // namespace mystring
+
/*!
CFileNameManager::GetFilePathFormatのテスト
*/
diff --git a/tests/unittests/test-statictype.cpp b/tests/unittests/test-statictype.cpp
index db3aff4064..db90fb79c1 100644
--- a/tests/unittests/test-statictype.cpp
+++ b/tests/unittests/test-statictype.cpp
@@ -55,3 +55,647 @@ TEST(StaticVector, push_back)
// 追加できないので、サイズをカウントアップしてはいけない
EXPECT_EQ(1, vec.size());
}
+
+namespace mystring {
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 引数なしで初期化する
+ */
+TEST(StaticString, init001)
+{
+ // ACT
+ StaticString<4> buf;
+
+ // ASSERT
+ EXPECT_THAT(buf, StrEq(L""));
+ EXPECT_THAT(buf.GetBufferPointer(), StrEq(L""));
+ EXPECT_THAT(buf.GetBufferCount(), 4);
+ EXPECT_THAT(LPWSTR(buf), StrEq(L""));
+ EXPECT_THAT(LPCWSTR(buf), StrEq(L""));
+ EXPECT_THAT(buf.empty(), IsTrue());
+ EXPECT_THAT(buf.length(), 0);
+ EXPECT_THAT(buf.Length(), 0);
+ EXPECT_THAT(std::size(buf), 4);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列ポインタで初期化する
+ */
+TEST(StaticString, init002)
+{
+ // ARRANGE
+ constexpr auto& initialValue = L"初期値";
+
+ // ACT
+ StaticString<4> buf(initialValue);
+
+ // ASSERT
+ EXPECT_THAT(buf, StrEq(L"初期値"));
+ EXPECT_THAT(buf.GetBufferPointer(), StrEq(L"初期値"));
+ EXPECT_THAT(buf.GetBufferCount(), 4);
+ EXPECT_THAT(LPWSTR(buf), StrEq(L"初期値"));
+ EXPECT_THAT(LPCWSTR(buf), StrEq(L"初期値"));
+ EXPECT_THAT(buf.empty(), IsFalse());
+ EXPECT_THAT(buf.length(), 3);
+ EXPECT_THAT(buf.Length(), 3);
+ EXPECT_THAT(std::size(buf), 4);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列で初期化する
+ */
+TEST(StaticString, init003)
+{
+ // ACT
+ StaticString<4> szText(L"初期値"s);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列参照で初期化する
+ */
+TEST(StaticString, init004)
+{
+ // ACT
+ StaticString<4> szText(L"初期値"sv);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * ファイルパスで初期化する
+ */
+TEST(StaticString, init006)
+{
+ // ARRANGE
+ std::filesystem::path path = L"初期値";
+
+ // ACT
+ StaticString<4> szText = path;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列ポインタで初期化する(値がnullptr)
+ */
+TEST(StaticString, init101)
+{
+ // ACT
+ StaticString<4> szText = nullptr; // SALによりコンパイラ警告が発生する
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L""));
+ EXPECT_THAT(szText.length(), 0);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列ポインタで初期化する
+ */
+TEST(StaticString, init102)
+{
+ // ACT
+ StaticString<4> buf(nullptr);
+
+ // ASSERT
+ EXPECT_THAT(buf, StrEq(L""));
+ EXPECT_THAT(buf.length(), 0);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列参照で初期化する(サイズオーバー)
+ */
+TEST(StaticString, init104)
+{
+ // ACT
+ StaticString<4> szText = L"長過ぎる";
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"長過ぎ"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ */
+TEST(StaticString, assign001)
+{
+ // ARRANGE
+ constexpr auto& initialValue = L"初期値";
+ StaticString<4> buf(initialValue);
+
+ // ACT
+ buf = L"設定値";
+
+ // ASSERT
+ EXPECT_THAT(buf, StrEq(L"設定値"));
+ EXPECT_THAT(buf.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列ポインタを代入する
+ */
+TEST(StaticString, assign002)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ szText = L"設定値";
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設定値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列を代入する
+ */
+TEST(StaticString, assign003)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ szText = L"設定値"s;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設定値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列参照を代入する
+ */
+TEST(StaticString, assign004)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ szText = L"設定値"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設定値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT
+ szText = std::wstring_view(szText, 1);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設"));
+ EXPECT_THAT(szText.length(), 1);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 1文字を代入する
+ */
+TEST(StaticString, assign005)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ szText = L'a';
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"a"));
+ EXPECT_THAT(szText.length(), 1);
+ EXPECT_EQ(szText[0], L'a');
+ EXPECT_EQ(szText[1], L'\0');
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * ファイルパスを代入する
+ */
+TEST(StaticString, assign006)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+ std::filesystem::path path = L"設定値";
+
+ // ACT
+ szText = path;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"設定値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * nullptrを代入する
+ */
+TEST(StaticString, assign101)
+{
+ // ARRANGE
+ constexpr auto& initialValue = L"初期値";
+ StaticString<4> buf(initialValue);
+
+ // ACT
+ buf = nullptr;
+
+ // ASSERT
+ EXPECT_THAT(buf, StrEq(L""));
+ EXPECT_THAT(buf.length(), 0);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列ポインタを代入する(値がnullptr)
+ */
+TEST(StaticString, assign102)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+ LPCWSTR pszNull = nullptr;
+
+ // ACT
+ szText = pszNull;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L""));
+ EXPECT_THAT(szText.length(), 0);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列参照を代入する(サイズオーバー)
+ */
+TEST(StaticString, assign104)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ szText = L"長過ぎる"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"長過ぎ"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT2
+ EXPECT_EQ(STRUNCATE, szText.assign(L"overflow"sv));
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ove"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列ポインタを追加する
+ */
+TEST(StaticString, append002)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザク";
+
+ // ACT
+ szText += L"Ⅱ";
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザクⅡ"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列を追加する
+ */
+TEST(StaticString, append003)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザク";
+
+ // ACT
+ szText += L"Ⅱ"s;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザクⅡ"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列参照タを追加する
+ */
+TEST(StaticString, append004)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザク";
+
+ // ACT
+ szText += L"Ⅱ"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザクⅡ"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に1文字を追加する
+ */
+TEST(StaticString, append005)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザク";
+
+ // ACT
+ szText += L'Ⅱ';
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザクⅡ"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾にnullptrを追加する
+ */
+TEST(StaticString, append101)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ szText += nullptr; // SALによりコンパイラ警告が発生する
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(nullptr), EINVAL);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列ポインタを追加する(値がnullptr)
+ */
+TEST(StaticString, append102)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+ LPCWSTR pszNull = nullptr;
+
+ // ACT
+ szText += pszNull; // SALによりコンパイラ警告が発生する
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(pszNull), EINVAL);
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列を追加する(値が空文字列)
+ */
+TEST(StaticString, append103)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(L""s), EINVAL);
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT
+ szText += L""s;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列参照を追加する(値が空文字列)
+ */
+TEST(StaticString, append104)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT & ASSERT
+ EXPECT_THAT(szText.append(L""sv), EINVAL);
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+
+ // ACT
+ szText += L""sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"初期値"));
+ EXPECT_THAT(szText.length(), 3);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列ポインタを追加する(途中にNULを含む)
+ */
+TEST(StaticString, append202)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザ";
+
+ // ACT
+ szText += L"ク\0Ⅱ";
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザク"));
+ EXPECT_THAT(szText.length(), 2);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 末尾に文字列参照を追加する(途中にNULを含む)
+ */
+TEST(StaticString, append204)
+{
+ StaticString<4> szText = L"ザ";
+
+ // ACT
+ szText += L"ク\0Ⅱ"sv;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(L"ザク"));
+ EXPECT_THAT(szText.length(), 2);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列長を計算する
+ */
+TEST(StaticString, length)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザクⅡ";
+ const wchar_t dummy = 0x2025;
+
+ // ASSERT
+ EXPECT_EQ(szText.length(), 3);
+ EXPECT_EQ(szText.data()[3], 0);
+
+ // ACT(領域全体にゴミ投入)
+ auto_memset(szText.data(), dummy, int(std::size(szText)));
+
+ // ASSERT
+ EXPECT_EQ(szText.length(), 0);
+ EXPECT_EQ(szText.data()[3], dummy);
+
+ // ACT(NUL終端する)
+ szText[2] = 0;
+
+ // ASSERT
+ EXPECT_EQ(szText.length(), 2);
+ EXPECT_EQ(szText.data()[3], dummy);
+
+ // ACT
+ szText = dummy;
+
+ // ASSERT
+ EXPECT_EQ(szText.length(), 1);
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * 文字列が空かどうか判定する
+ */
+TEST(StaticString, empty)
+{
+ // ARRANGE
+ StaticString<4> szText = L"ザクⅡ";
+
+ // ASSERT
+ EXPECT_FALSE(szText.empty());
+
+ // ACT
+ szText = nullptr;
+
+ // ASSERT
+ EXPECT_TRUE(szText.empty());
+}
+
+/*!
+ * @brief StaticStringのテスト
+ */
+TEST(StaticString, constAt)
+{
+ // ARRANGE
+ const StaticString<4> szText = L"初期値";
+
+ // ASSERT
+ EXPECT_THAT(szText.At(0), L'初');
+ EXPECT_THAT(szText.At(1), L'期');
+ EXPECT_THAT(szText.At(2), L'値');
+ EXPECT_THAT(szText.At(3), '\0');
+ EXPECT_THAT(szText.At(4), '\0');
+ EXPECT_THAT(szText.At(5), '\0');
+}
+
+/*!
+ * @brief StaticStringのテスト
+ *
+ * ファイルパス型に変換する
+ */
+TEST(StaticString, toFilePath)
+{
+ // ARRANGE
+ StaticString<4> szText = L"初期値";
+
+ // ACT
+ auto path = std::filesystem::path(szText);
+
+ // ASSERT
+ EXPECT_FALSE(path.empty());
+
+ // ACT
+ szText = nullptr;
+ path = std::filesystem::path(szText);
+
+ // ASSERT
+ EXPECT_TRUE(path.empty());
+}
+
+/*!
+ * @brief SStringのテスト
+ *
+ * ファイルパスで初期化する
+ */
+TEST(SStringA, init006)
+{
+ // ARRANGE
+ std::string_view file(__FILE__);
+ std::filesystem::path path(file);
+
+ // ACT
+ SString<_MAX_PATH, CHAR> szText = path;
+
+ // ASSERT
+ EXPECT_THAT(szText, StrEq(file));
+ EXPECT_THAT(szText.length(), file.length());
+}
+
+} // namespace mystring
diff --git a/tests/unittests/tests1.vcxproj b/tests/unittests/tests1.vcxproj
index 62dd362b0f..bb1d6c96f1 100644
--- a/tests/unittests/tests1.vcxproj
+++ b/tests/unittests/tests1.vcxproj
@@ -199,14 +199,10 @@