summaryrefslogtreecommitdiff
path: root/src/test-wast-parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/test-wast-parser.cc')
-rw-r--r--src/test-wast-parser.cc88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/test-wast-parser.cc b/src/test-wast-parser.cc
new file mode 100644
index 00000000..a4a19e22
--- /dev/null
+++ b/src/test-wast-parser.cc
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2017 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gtest/gtest.h"
+
+#include <memory>
+
+#include "src/error-handler.h"
+#include "src/wast-lexer.h"
+#include "src/wast-parser.h"
+
+using namespace wabt;
+
+namespace {
+
+std::string repeat(std::string s, size_t count) {
+ std::string result;
+ for (size_t i = 0; i < count; ++i) {
+ result += s;
+ }
+ return result;
+}
+
+std::string ParseInvalidModule(std::string text) {
+ auto lexer = WastLexer::CreateBufferLexer("test", text.c_str(), text.size());
+ const size_t source_line_max_length = 80;
+ ErrorHandlerBuffer error_handler(Location::Type::Text,
+ source_line_max_length);
+ std::unique_ptr<Module> module;
+ Result result = ParseWatModule(lexer.get(), &module, &error_handler);
+ EXPECT_EQ(Result::Error, result);
+
+ return error_handler.buffer();
+}
+
+} // end of anonymous namespace
+
+TEST(WastParser, LongToken) {
+ std::string text;
+ text = "(module (data \"";
+ text += repeat("a", 0x5000);
+ text += "\" \"";
+ text += repeat("a", 0x10000);
+ text += "\"))";
+
+ std::string output = ParseInvalidModule(text);
+
+ const char expected[] =
+ R"(test:1:15: error: unexpected token ""aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...", expected an offset expr (e.g. (i32.const 123)).
+(module (data "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+)";
+
+ ASSERT_STREQ(expected, output.c_str());
+}
+
+TEST(WastParser, LongTokenSpace) {
+ std::string text;
+ text = "notparen";
+ text += repeat(" ", 0x10000);
+ text += "notmodule";
+
+ std::string output = ParseInvalidModule(text);
+
+ const char expected[] =
+ R"(test:1:1: error: unexpected token "notparen", expected a module field or a module.
+notparen ...
+^^^^^^^^
+test:1:65545: error: unexpected token notmodule, expected EOF.
+... notmodule
+ ^^^^^^^^^
+)";
+
+ ASSERT_STREQ(expected, output.c_str());
+}