| | #include "catch.hpp" |
| | #include "internal/catch_xmlwriter.h" |
| |
|
| | #include <sstream> |
| |
|
| | inline std::string encode( std::string const& str, Catch::XmlEncode::ForWhat forWhat = Catch::XmlEncode::ForTextNodes ) { |
| | std::ostringstream oss; |
| | oss << Catch::XmlEncode( str, forWhat ); |
| | return oss.str(); |
| | } |
| |
|
| | TEST_CASE( "XmlEncode", "[XML]" ) { |
| | SECTION( "normal string" ) { |
| | REQUIRE( encode( "normal string" ) == "normal string" ); |
| | } |
| | SECTION( "empty string" ) { |
| | REQUIRE( encode( "" ) == "" ); |
| | } |
| | SECTION( "string with ampersand" ) { |
| | REQUIRE( encode( "smith & jones" ) == "smith & jones" ); |
| | } |
| | SECTION( "string with less-than" ) { |
| | REQUIRE( encode( "smith < jones" ) == "smith < jones" ); |
| | } |
| | SECTION( "string with greater-than" ) { |
| | REQUIRE( encode( "smith > jones" ) == "smith > jones" ); |
| | REQUIRE( encode( "smith ]]> jones" ) == "smith ]]> jones" ); |
| | } |
| | SECTION( "string with quotes" ) { |
| | std::string stringWithQuotes = "don't \"quote\" me on that"; |
| | REQUIRE( encode( stringWithQuotes ) == stringWithQuotes ); |
| | REQUIRE( encode( stringWithQuotes, Catch::XmlEncode::ForAttributes ) == "don't "quote" me on that" ); |
| | } |
| | SECTION( "string with control char (1)" ) { |
| | REQUIRE( encode( "[\x01]" ) == "[\\x01]" ); |
| | } |
| | SECTION( "string with control char (x7F)" ) { |
| | REQUIRE( encode( "[\x7F]" ) == "[\\x7F]" ); |
| | } |
| | } |
| |
|
| | |
| | TEST_CASE("XmlEncode: UTF-8", "[XML][UTF-8][approvals]") { |
| | #define ESC(lit) (char*)(lit) |
| | SECTION("Valid utf-8 strings") { |
| | CHECK(encode(ESC(u8"Here be 👾")) == ESC(u8"Here be 👾")); |
| | CHECK(encode(ESC(u8"šš")) == ESC(u8"šš")); |
| |
|
| | CHECK(encode("\xDF\xBF") == "\xDF\xBF"); |
| | CHECK(encode("\xE0\xA0\x80") == "\xE0\xA0\x80"); |
| | CHECK(encode("\xED\x9F\xBF") == "\xED\x9F\xBF"); |
| | CHECK(encode("\xEE\x80\x80") == "\xEE\x80\x80"); |
| | CHECK(encode("\xEF\xBF\xBF") == "\xEF\xBF\xBF"); |
| | CHECK(encode("\xF0\x90\x80\x80") == "\xF0\x90\x80\x80"); |
| | CHECK(encode("\xF4\x8F\xBF\xBF") == "\xF4\x8F\xBF\xBF"); |
| | } |
| | SECTION("Invalid utf-8 strings") { |
| | SECTION("Various broken strings") { |
| | CHECK(encode(ESC("Here \xFF be \xF0\x9F\x91\xBE")) == ESC(u8"Here \\xFF be 👾")); |
| | CHECK(encode("\xFF") == "\\xFF"); |
| | CHECK(encode("\xC5\xC5\xA0") == ESC(u8"\\xC5Š")); |
| | CHECK(encode("\xF4\x90\x80\x80") == ESC(u8"\\xF4\\x90\\x80\\x80")); |
| | } |
| |
|
| | SECTION("Overlong encodings") { |
| | CHECK(encode("\xC0\x80") == "\\xC0\\x80"); |
| | CHECK(encode("\xF0\x80\x80\x80") == "\\xF0\\x80\\x80\\x80"); |
| | CHECK(encode("\xC1\xBF") == "\\xC1\\xBF"); |
| | CHECK(encode("\xE0\x9F\xBF") == "\\xE0\\x9F\\xBF"); |
| | CHECK(encode("\xF0\x8F\xBF\xBF") == "\\xF0\\x8F\\xBF\\xBF"); |
| | } |
| |
|
| | |
| | SECTION("Surrogate pairs") { |
| | CHECK(encode("\xED\xA0\x80") == "\xED\xA0\x80"); |
| | CHECK(encode("\xED\xAF\xBF") == "\xED\xAF\xBF"); |
| | CHECK(encode("\xED\xB0\x80") == "\xED\xB0\x80"); |
| | CHECK(encode("\xED\xBF\xBF") == "\xED\xBF\xBF"); |
| | } |
| |
|
| | SECTION("Invalid start byte") { |
| | CHECK(encode("\x80") == "\\x80"); |
| | CHECK(encode("\x81") == "\\x81"); |
| | CHECK(encode("\xBC") == "\\xBC"); |
| | CHECK(encode("\xBF") == "\\xBF"); |
| | |
| | CHECK(encode("\xF5\x80\x80\x80") == "\\xF5\\x80\\x80\\x80"); |
| | CHECK(encode("\xF6\x80\x80\x80") == "\\xF6\\x80\\x80\\x80"); |
| | CHECK(encode("\xF7\x80\x80\x80") == "\\xF7\\x80\\x80\\x80"); |
| | } |
| |
|
| | SECTION("Missing continuation byte(s)") { |
| | |
| | CHECK(encode("\xDE") == "\\xDE"); |
| | CHECK(encode("\xDF") == "\\xDF"); |
| | CHECK(encode("\xE0") == "\\xE0"); |
| | CHECK(encode("\xEF") == "\\xEF"); |
| | CHECK(encode("\xF0") == "\\xF0"); |
| | CHECK(encode("\xF4") == "\\xF4"); |
| |
|
| | |
| | CHECK(encode("\xE0\x80") == "\\xE0\\x80"); |
| | CHECK(encode("\xE0\xBF") == "\\xE0\\xBF"); |
| | CHECK(encode("\xE1\x80") == "\\xE1\\x80"); |
| | CHECK(encode("\xF0\x80") == "\\xF0\\x80"); |
| | CHECK(encode("\xF4\x80") == "\\xF4\\x80"); |
| |
|
| | |
| | CHECK(encode("\xF0\x80\x80") == "\\xF0\\x80\\x80"); |
| | CHECK(encode("\xF4\x80\x80") == "\\xF4\\x80\\x80"); |
| | } |
| | } |
| | #undef ESC |
| | } |
| |
|