summaryrefslogtreecommitdiffstats
path: root/third_party/wasm2c/src/test-wast-parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/wasm2c/src/test-wast-parser.cc')
-rw-r--r--third_party/wasm2c/src/test-wast-parser.cc88
1 files changed, 88 insertions, 0 deletions
diff --git a/third_party/wasm2c/src/test-wast-parser.cc b/third_party/wasm2c/src/test-wast-parser.cc
new file mode 100644
index 0000000000..60fc601dbd
--- /dev/null
+++ b/third_party/wasm2c/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 "wabt/wast-lexer.h"
+#include "wabt/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;
+}
+
+Errors ParseInvalidModule(std::string text) {
+ Errors errors;
+ auto lexer =
+ WastLexer::CreateBufferLexer("test", text.c_str(), text.size(), &errors);
+ std::unique_ptr<Module> module;
+ Features features;
+ WastParseOptions options(features);
+ Result result = ParseWatModule(lexer.get(), &module, &errors, &options);
+ EXPECT_EQ(Result::Error, result);
+
+ return errors;
+}
+
+} // end of anonymous namespace
+
+TEST(WastParser, LongToken) {
+ std::string text;
+ text = "(module (memory ";
+ text += repeat("a", 0x5000);
+ text += "))";
+
+ Errors errors = ParseInvalidModule(text);
+ ASSERT_EQ(1u, errors.size());
+
+ ASSERT_EQ(ErrorLevel::Error, errors[0].error_level);
+ ASSERT_EQ(1, errors[0].loc.line);
+ ASSERT_EQ(17, errors[0].loc.first_column);
+ ASSERT_STREQ(
+ R"(unexpected token "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...", expected a natural number (e.g. 123).)",
+ errors[0].message.c_str());
+}
+
+TEST(WastParser, LongTokenSpace) {
+ std::string text;
+ text = "notparen";
+ text += repeat(" ", 0x10000);
+ text += "notmodule";
+
+ Errors errors = ParseInvalidModule(text);
+ ASSERT_EQ(2u, errors.size());
+
+ ASSERT_EQ(ErrorLevel::Error, errors[0].error_level);
+ ASSERT_EQ(1, errors[0].loc.line);
+ ASSERT_EQ(1, errors[0].loc.first_column);
+ ASSERT_STREQ(
+ R"(unexpected token "notparen", expected a module field or a module.)",
+ errors[0].message.c_str());
+
+ ASSERT_EQ(1, errors[1].loc.line);
+ ASSERT_EQ(65545, errors[1].loc.first_column);
+ ASSERT_STREQ(R"(unexpected token notmodule, expected EOF.)",
+ errors[1].message.c_str());
+}