/* Host unit tests for shellui ps5ui::Page fluent XML builder (no PS5 SDK). */ #include "test_harness.h" #include "ps5_settings_ui.hpp" #include using namespace ps5ui; static int test_escape_special_chars(void) { const std::string a = escape("a&b"); const std::string b = escape(""); const std::string c = escape("\"q\""); const std::string d = escape("/user/data/OnionHEN"); const std::string e = escape("金手指"); TEST_ASSERT_STREQ("a&b", a.c_str()); TEST_ASSERT_STREQ("<tag>", b.c_str()); TEST_ASSERT_STREQ(""q"", c.c_str()); /* escape() is for icon paths: / → // ; escape_xml keeps single / for display */ TEST_ASSERT_STREQ("//user//data//OnionHEN", d.c_str()); const std::string d_xml = escape_xml("/user/data/OnionHEN"); TEST_ASSERT_STREQ("/user/data/OnionHEN", d_xml.c_str()); /* CJK unchanged */ TEST_ASSERT_STREQ("金手指", e.c_str()); return 0; } static int test_minimal_page_shell(void) { const std::string xml = Page("id_root", "Root Title").build(); TEST_ASSERT_TRUE(xml.find("") != std::string::npos); TEST_ASSERT_TRUE(xml.find("") != std::string::npos); TEST_ASSERT_TRUE(xml.find("") != std::string::npos); TEST_ASSERT_TRUE(xml.find("") != std::string::npos); TEST_ASSERT_TRUE(xml.find("") != std::string::npos); return 0; } static int test_toggle_button_label_attrs(void) { const std::string xml = Page("id_page", "Page") .label("id_lbl", "Hello", Style::Center, "/user/data/OnionHEN/assets/qr.png") .toggle("id_sw", "Switch", true, "second", "desc", "tex_icon") .button("id_btn", "Btn", "sec", "d", "icn", Style::Center) .build(); TEST_ASSERT_TRUE( xml.find("