From 950612cf42b3812e5ad292d9f6e3a56f96b8f0f4 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 13 Jul 2020 18:23:42 +0100 Subject: [PATCH] Add more tests for strings with unicode (escapes) --- .../semanticTests/strings/unicode_escapes.sol | 22 +++++++++++++++++++ .../semanticTests/strings/unicode_string.sol | 7 ++++++ .../invalid_utf8_explicit_string.sol} | 0 .../string/invalid_utf8_hex_string.sol | 5 +++++ .../invalid_utf8_implicit_string.sol} | 0 .../string/invalid_utf8_in_bytes.sol | 6 +++++ .../large_utf8_codepoint.sol} | 0 .../syntaxTests/string/string_unicode.sol | 6 +++++ .../{ => string}/unicode_escape_literals.sol | 12 +--------- ...code_escape_literals_invalid_codepoint.sol | 7 ++++++ ...unicode_escape_literals_invalid_format.sol | 10 +++++++++ 11 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 test/libsolidity/semanticTests/strings/unicode_escapes.sol create mode 100644 test/libsolidity/semanticTests/strings/unicode_string.sol rename test/libsolidity/syntaxTests/{nameAndTypeResolution/186_invalid_utf8_explicit.sol => string/invalid_utf8_explicit_string.sol} (100%) create mode 100644 test/libsolidity/syntaxTests/string/invalid_utf8_hex_string.sol rename test/libsolidity/syntaxTests/{nameAndTypeResolution/185_invalid_utf8_implicit.sol => string/invalid_utf8_implicit_string.sol} (100%) create mode 100644 test/libsolidity/syntaxTests/string/invalid_utf8_in_bytes.sol rename test/libsolidity/syntaxTests/{nameAndTypeResolution/187_large_utf8_codepoint.sol => string/large_utf8_codepoint.sol} (100%) create mode 100644 test/libsolidity/syntaxTests/string/string_unicode.sol rename test/libsolidity/syntaxTests/{ => string}/unicode_escape_literals.sol (60%) create mode 100644 test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_codepoint.sol create mode 100644 test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_format.sol diff --git a/test/libsolidity/semanticTests/strings/unicode_escapes.sol b/test/libsolidity/semanticTests/strings/unicode_escapes.sol new file mode 100644 index 000000000..401d8b61e --- /dev/null +++ b/test/libsolidity/semanticTests/strings/unicode_escapes.sol @@ -0,0 +1,22 @@ +contract C { + function oneByteUTF8() public pure returns (string memory) { + return "aaa\u0024aaa"; // usdollar + } + + function twoBytesUTF8() public pure returns (string memory) { + return "aaa\u00A2aaa"; // cent + } + + function threeBytesUTF8() public pure returns (string memory) { + return "aaa\u20ACaaa"; // euro + } + + function combined() public pure returns (string memory) { + return "\u0024\u00A2\u20AC"; + } +} +// ---- +// oneByteUTF8() -> 0x20, 7, "aaa$aaa" +// twoBytesUTF8() -> 0x20, 8, "aaa\xc2\xa2aaa" +// threeBytesUTF8() -> 0x20, 9, "aaa\xe2\x82\xacaaa" +// combined() -> 0x20, 6, "$\xc2\xa2\xe2\x82\xac" diff --git a/test/libsolidity/semanticTests/strings/unicode_string.sol b/test/libsolidity/semanticTests/strings/unicode_string.sol new file mode 100644 index 000000000..c139d6b8b --- /dev/null +++ b/test/libsolidity/semanticTests/strings/unicode_string.sol @@ -0,0 +1,7 @@ +contract C { + function f() public pure returns (string memory) { + return "😃, 😭, and 😈"; + } +} +// ---- +// f() -> 0x20, 0x14, "\xf0\x9f\x98\x83, \xf0\x9f\x98\xad, and \xf0\x9f\x98\x88" diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/186_invalid_utf8_explicit.sol b/test/libsolidity/syntaxTests/string/invalid_utf8_explicit_string.sol similarity index 100% rename from test/libsolidity/syntaxTests/nameAndTypeResolution/186_invalid_utf8_explicit.sol rename to test/libsolidity/syntaxTests/string/invalid_utf8_explicit_string.sol diff --git a/test/libsolidity/syntaxTests/string/invalid_utf8_hex_string.sol b/test/libsolidity/syntaxTests/string/invalid_utf8_hex_string.sol new file mode 100644 index 000000000..d72ee5af0 --- /dev/null +++ b/test/libsolidity/syntaxTests/string/invalid_utf8_hex_string.sol @@ -0,0 +1,5 @@ +contract C { + string s = hex"a000"; +} +// ---- +// TypeError 7407: (28-37): Type literal_string (contains invalid UTF-8 sequence at position 0) is not implicitly convertible to expected type string storage ref. diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/185_invalid_utf8_implicit.sol b/test/libsolidity/syntaxTests/string/invalid_utf8_implicit_string.sol similarity index 100% rename from test/libsolidity/syntaxTests/nameAndTypeResolution/185_invalid_utf8_implicit.sol rename to test/libsolidity/syntaxTests/string/invalid_utf8_implicit_string.sol diff --git a/test/libsolidity/syntaxTests/string/invalid_utf8_in_bytes.sol b/test/libsolidity/syntaxTests/string/invalid_utf8_in_bytes.sol new file mode 100644 index 000000000..c5af0d094 --- /dev/null +++ b/test/libsolidity/syntaxTests/string/invalid_utf8_in_bytes.sol @@ -0,0 +1,6 @@ +contract C { + bytes b1 = "\xa0\x00"; + bytes32 b2 = "\xa0\x00"; + bytes b3 = hex"a000"; +} +// ---- diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/187_large_utf8_codepoint.sol b/test/libsolidity/syntaxTests/string/large_utf8_codepoint.sol similarity index 100% rename from test/libsolidity/syntaxTests/nameAndTypeResolution/187_large_utf8_codepoint.sol rename to test/libsolidity/syntaxTests/string/large_utf8_codepoint.sol diff --git a/test/libsolidity/syntaxTests/string/string_unicode.sol b/test/libsolidity/syntaxTests/string/string_unicode.sol new file mode 100644 index 000000000..380ad9e39 --- /dev/null +++ b/test/libsolidity/syntaxTests/string/string_unicode.sol @@ -0,0 +1,6 @@ +contract test { + function f() public pure returns (string memory) { + return "😃, 😭, and 😈"; + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/unicode_escape_literals.sol b/test/libsolidity/syntaxTests/string/unicode_escape_literals.sol similarity index 60% rename from test/libsolidity/syntaxTests/unicode_escape_literals.sol rename to test/libsolidity/syntaxTests/string/unicode_escape_literals.sol index d78e6aa09..011f58b40 100644 --- a/test/libsolidity/syntaxTests/unicode_escape_literals.sol +++ b/test/libsolidity/syntaxTests/string/unicode_escape_literals.sol @@ -1,5 +1,4 @@ contract test { - function oneByteUTF8() public pure returns (bytes32) { bytes32 usdollar = "aaa\u0024aaa"; return usdollar; @@ -15,17 +14,8 @@ contract test { return eur; } - function together() public pure returns (bytes32) { + function combined() public pure returns (bytes32) { bytes32 res = "\u0024\u00A2\u20AC"; return res; } - - // this function returns an invalid unicode character - function invalidLiteral() public pure returns(bytes32) { - bytes32 invalid = "\u00xx"; - return invalid; - } - } -// ---- -// ParserError 8936: (678-681): Invalid escape sequence. diff --git a/test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_codepoint.sol b/test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_codepoint.sol new file mode 100644 index 000000000..46a0de5f4 --- /dev/null +++ b/test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_codepoint.sol @@ -0,0 +1,7 @@ +contract test { + function f() public pure returns (string memory) { + return "\xc1"; + } +} +// ---- +// TypeError 6359: (86-92): Return argument type literal_string (contains invalid UTF-8 sequence at position 0) is not implicitly convertible to expected type (type of first return variable) string memory. diff --git a/test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_format.sol b/test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_format.sol new file mode 100644 index 000000000..6afcd94af --- /dev/null +++ b/test/libsolidity/syntaxTests/string/unicode_escape_literals_invalid_format.sol @@ -0,0 +1,10 @@ +contract test { + // this function returns an invalid unicode character + function invalidLiteral() public pure returns (bytes32) { + bytes32 invalid = "\u00xx"; + return invalid; + } + +} +// ---- +// ParserError 8936: (162-165): Invalid escape sequence.