blob: bb103682115cad07e547d2818e32d99acd30d4ae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.netbeans.modules.javascript2.editor.parser;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.swing.text.Document;
import org.netbeans.modules.javascript2.editor.JsonTestBase;
import org.netbeans.modules.javascript2.lexer.api.JsTokenId;
import org.netbeans.modules.javascript2.editor.parser.SanitizingParser.Context;
import org.netbeans.modules.parsing.api.Snapshot;
import org.netbeans.modules.parsing.api.Source;
/**
*
* @author Petr Hejl
*/
public class JsonParserTest extends JsonTestBase {
public JsonParserTest(String testName) {
super(testName);
}
public void testComments1() throws Exception {
parse("{\n"
+ "\"name\": \"test\" //line comment\n"
+ "/*comment*/\n"
+ "}\n",
false,
Arrays.asList(
"token recognition error at: '//line comment",
"token recognition error at: '/*comment"
));
}
public void testComments2() throws Exception {
parse("{\n"
+ "\"name\": \"test\" //line comment\n"
+ "}\n",
false,
Collections.singletonList("token recognition error at: '//line comment"));
}
public void testComments3() throws Exception {
parse("{\n"
+ "\"name\": \"test\"\n"
+ "/*comment*/\n"
+ "}\n",
false,
Collections.singletonList("token recognition error at: '/*comment"));
}
public void testComments4() throws Exception {
parse("{\n"
+ "\"name\": \"test\" //line comment\n"
+ "/*comment*/\n"
+ "}\n",
true,
Collections.emptyList());
}
public void testStringLiteral1() throws Exception {
parse("{ \"a\" : \"test\\tw\" }", false, Collections.<String>emptyList());
}
public void testStringLiteral2() throws Exception {
parse("{ \"a\" : \"test\\xw\" }",
false,
//Todo: Consider to join antlr errors in String token
Arrays.asList(
"token recognition error at: '\"test\\x'",
"mismatched input '}' expecting {'{', '[', 'true', 'false', 'null', NUMBER, STRING}"));
}
public void testStringLiteral3() throws Exception {
parse("{ \"a\" : \"test\\\nw\" }",
false,
Arrays.asList(
"token recognition error at: '\"test\\\\n'",
"token recognition error at: 'w'",
"token recognition error at: '\" }'",
"mismatched input '<EOF>' expecting {'{', '[', 'true', 'false', 'null', NUMBER, STRING}"));
}
public void testStringLiteral4() throws Exception {
parse("{ \"a\" : \"test\\u000fw\" }", false, Collections.<String>emptyList());
}
public void testStringLiteral5() throws Exception {
parse("{ \"a\" : \"test\\u000gw\" }",
false,
//Todo: Consider to join antlr errors in String token
Arrays.asList(
"token recognition error at: '\"test\\u000g'",
"mismatched input '}' expecting {'{', '[', 'true', 'false', 'null', NUMBER, STRING}"
));
}
public void testStringLiteral6() throws Exception {
parse("{ \"a\" : \"t'est\" }", false, Collections.<String>emptyList());
}
public void testStringLiteral7() throws Exception {
parse("{ \"a\" : \"t\\'est\" }",
false,
//Todo: Consider to join antlr errors in String token
Arrays.asList(
"token recognition error at: '\"t\\''",
"mismatched input '}' expecting {'{', '[', 'true', 'false', 'null', NUMBER, STRING}"
));
}
public void testTrailingComma1() throws Exception {
parse("{ \"a\" : \"test\" }", false, Collections.<String>emptyList());
}
public void testTrailingComma2() throws Exception {
parse("{ \"a\" : [1, 2] }", false, Collections.<String>emptyList());
}
public void testTrailingComma3() throws Exception {
parse("{ \"a\" : \"test\", }", false, Collections.singletonList("mismatched input '}' expecting STRING"));
}
public void testTrailingComma4() throws Exception {
parse("{ \"a\" : [1, 2,] }", false, Collections.singletonList("mismatched input ']' expecting {'{', '[', 'true', 'false', 'null', NUMBER, STRING}"));
}
public void testTrailingComma5() throws Exception {
parse("{ \"a\" : [{\"w\":1}, {\"e\":2},] }", false, Collections.singletonList("mismatched input ']' expecting {'{', '[', 'true', 'false', 'null', NUMBER, STRING}"));
}
public void testEmpty() throws Exception {
try {
// NETBEANS-2881
String original = "";
JsonParser parser = new JsonParser(false);
Document doc = getDocument(original);
Snapshot snapshot = Source.create(doc).createSnapshot();
JsErrorManager manager = new JsErrorManager(snapshot, JsTokenId.jsonLanguage());
parser.parseSource(snapshot, null, JsParser.Sanitize.NEVER, manager);
} catch (StringIndexOutOfBoundsException e) {
fail("StringIndexOutOfBoundsException occurred: " + e.getMessage());
}
}
private void parse(
String original,
boolean allowComments,
List<String> errors) throws Exception {
JsonParser parser = new JsonParser(allowComments);
Document doc = getDocument(original);
Snapshot snapshot = Source.create(doc).createSnapshot();
Context context = new JsParser.Context("test.json", snapshot, -1, JsTokenId.jsonLanguage());
JsErrorManager manager = new JsErrorManager(snapshot, JsTokenId.jsonLanguage());
parser.parseContext(context, JsParser.Sanitize.NEVER, manager);
assertEquals(errors.size(), manager.getErrors().size());
for (int i = 0; i < errors.size(); i++) {
if (!manager.getErrors().get(i).getDisplayName().startsWith(errors.get(i))) {
fail("Error was expected to start with: " + errors.get(i) + " but was: "
+ manager.getErrors().get(i).getDisplayName());
}
}
}
}