要測試 C++ std::optional
類型的正確性,你可以編寫一些測試用例來驗證其行為是否符合預期
#include<iostream>
#include<optional>
#include<string>
#include<vector>
#include <stdexcept>
為了簡化測試,我們可以編寫一個輔助函數,該函數接受一個布爾表達式和一個錯誤消息。如果表達式為 false,則拋出一個異常并顯示錯誤消息。
void assertTrue(bool expr, const std::string& msg) {
if (!expr) {
throw std::runtime_error("Assertion failed: " + msg);
}
}
接下來,我們將編寫一些測試用例來驗證 std::optional
的行為。
void testOptional() {
// 測試默認構造的 optional 是否為空
std::optional<int> emptyOpt;
assertTrue(!emptyOpt, "Default constructed optional should be empty");
// 測試值構造的 optional 是否包含值
std::optional<int> valueOpt(42);
assertTrue(valueOpt, "Value constructed optional should not be empty");
assertTrue(valueOpt.value() == 42, "Value constructed optional should contain the correct value");
// 測試從值構造的 optional
std::optional<std::string> strOpt = std::string("Hello");
assertTrue(strOpt, "Optional constructed from value should not be empty");
assertTrue(strOpt.value() == "Hello", "Optional constructed from value should contain the correct value");
// 測試復制構造
std::optional<int> copiedOpt = valueOpt;
assertTrue(copiedOpt, "Copied optional should not be empty");
assertTrue(copiedOpt.value() == 42, "Copied optional should contain the correct value");
// 測試賦值操作
emptyOpt = 100;
assertTrue(emptyOpt, "Assigned optional should not be empty");
assertTrue(emptyOpt.value() == 100, "Assigned optional should contain the correct value");
// 測試重置操作
valueOpt.reset();
assertTrue(!valueOpt, "Reset optional should be empty");
}
在主函數中調用測試函數,并捕獲任何可能拋出的異常。
int main() {
try {
testOptional();
std::cout << "All tests passed!"<< std::endl;
} catch (const std::exception& e) {
std::cerr << "Test failed: " << e.what()<< std::endl;
return 1;
}
return 0;
}
使用支持 C++17 或更高版本的編譯器編譯并運行上述代碼。如果所有測試都通過,你將看到 “All tests passed!” 的輸出。如果有任何失敗的測試,你將看到相應的錯誤消息。
請注意,這只是一個簡單的測試示例,實際上你可能需要根據你的需求編寫更多的測試用例來覆蓋更多的場景和邊界情況。