aboutsummaryrefslogtreecommitdiffstats
path: root/test/libsolidity
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-09-10 19:00:03 +0800
committerGitHub <noreply@github.com>2018-09-10 19:00:03 +0800
commitb9164eaba2a192428a27bac045c529c438599af7 (patch)
treebdc128a766c64667537ddfe8fbe9bea55025aaea /test/libsolidity
parenta1848ac9470a97bf2f158b91a558391ee9f70c11 (diff)
parent55e4532c7231ea7f4ab54402ebac84406564b64b (diff)
downloaddexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.tar
dexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.tar.gz
dexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.tar.bz2
dexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.tar.lz
dexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.tar.xz
dexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.tar.zst
dexon-solidity-b9164eaba2a192428a27bac045c529c438599af7.zip
Merge pull request #4937 from ethereum/fixNewline_0425
[backport] Fix newline bugs
Diffstat (limited to 'test/libsolidity')
-rw-r--r--test/libsolidity/SolidityScanner.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/test/libsolidity/SolidityScanner.cpp b/test/libsolidity/SolidityScanner.cpp
index 020bce7f..4ccc6788 100644
--- a/test/libsolidity/SolidityScanner.cpp
+++ b/test/libsolidity/SolidityScanner.cpp
@@ -23,6 +23,8 @@
#include <libsolidity/parsing/Scanner.h>
#include <boost/test/unit_test.hpp>
+using namespace std;
+
namespace dev
{
namespace solidity
@@ -393,6 +395,110 @@ BOOST_AUTO_TEST_CASE(invalid_hex_literal_nonhex_string)
BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
}
+BOOST_AUTO_TEST_CASE(invalid_multiline_comment_close)
+{
+ // This used to parse as "comment", "identifier"
+ Scanner scanner(CharStream("/** / x"));
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+}
+
+BOOST_AUTO_TEST_CASE(multiline_doc_comment_at_eos)
+{
+ // This used to parse as "whitespace"
+ Scanner scanner(CharStream("/**"));
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+}
+
+BOOST_AUTO_TEST_CASE(multiline_comment_at_eos)
+{
+ Scanner scanner(CharStream("/*"));
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+}
+
+BOOST_AUTO_TEST_CASE(regular_line_break_in_single_line_comment)
+{
+ for (auto const& nl: {"\r", "\n"})
+ {
+ Scanner scanner(CharStream("// abc " + string(nl) + " def "));
+ BOOST_CHECK_EQUAL(scanner.currentCommentLiteral(), "");
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Identifier);
+ BOOST_CHECK_EQUAL(scanner.currentLiteral(), "def");
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(irregular_line_breaks_in_single_line_comment)
+{
+ for (auto const& nl: {"\v", "\f", "\xE2\x80\xA8", "\xE2\x80\xA9"})
+ {
+ Scanner scanner(CharStream("// abc " + string(nl) + " def "));
+ BOOST_CHECK_EQUAL(scanner.currentCommentLiteral(), "");
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ for (size_t i = 0; i < string(nl).size() - 1; i++)
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
+ BOOST_CHECK_EQUAL(scanner.currentLiteral(), "def");
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(regular_line_breaks_in_single_line_doc_comment)
+{
+ for (auto const& nl: {"\r", "\n"})
+ {
+ Scanner scanner(CharStream("/// abc " + string(nl) + " def "));
+ BOOST_CHECK_EQUAL(scanner.currentCommentLiteral(), "abc ");
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Identifier);
+ BOOST_CHECK_EQUAL(scanner.currentLiteral(), "def");
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(irregular_line_breaks_in_single_line_doc_comment)
+{
+ for (auto const& nl: {"\v", "\f", "\xE2\x80\xA8", "\xE2\x80\xA9"})
+ {
+ Scanner scanner(CharStream("/// abc " + string(nl) + " def "));
+ BOOST_CHECK_EQUAL(scanner.currentCommentLiteral(), "abc ");
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ for (size_t i = 0; i < string(nl).size() - 1; i++)
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
+ BOOST_CHECK_EQUAL(scanner.currentLiteral(), "def");
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(regular_line_breaks_in_strings)
+{
+ for (auto const& nl: {"\n", "\r"})
+ {
+ Scanner scanner(CharStream("\"abc " + string(nl) + " def\""));
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
+ BOOST_CHECK_EQUAL(scanner.currentLiteral(), "def");
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(irregular_line_breaks_in_strings)
+{
+ for (auto const& nl: {"\v", "\f", "\xE2\x80\xA8", "\xE2\x80\xA9"})
+ {
+ Scanner scanner(CharStream("\"abc " + string(nl) + " def\""));
+ BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Illegal);
+ for (size_t i = 0; i < string(nl).size(); i++)
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
+ BOOST_CHECK_EQUAL(scanner.currentLiteral(), "def");
+ BOOST_CHECK_EQUAL(scanner.next(), Token::Illegal);
+ BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
+ }
+}
BOOST_AUTO_TEST_SUITE_END()