diff --git a/src/main/java/graphql/parser/GraphqlAntlrToLanguage.java b/src/main/java/graphql/parser/GraphqlAntlrToLanguage.java index 2a07f04d47..8461a5e55f 100644 --- a/src/main/java/graphql/parser/GraphqlAntlrToLanguage.java +++ b/src/main/java/graphql/parser/GraphqlAntlrToLanguage.java @@ -15,7 +15,7 @@ public class GraphqlAntlrToLanguage extends GraphqlBaseVisitor { - Document result; + private Document result; private enum ContextProperty { OperationDefinition, @@ -109,6 +109,9 @@ private void newField(Field field) { ((SelectionSet) getFromContextStack(ContextProperty.SelectionSet)).getSelections().add(field); } + Document getResult() { + return result; + } @Override public Void visitDocument(GraphqlParser.DocumentContext ctx) { @@ -688,9 +691,12 @@ private Value getValue(GraphqlParser.ValueContext ctx) { throw new ShouldNotHappenException(); } - private String parseString(String string) { + static String parseString(String string) { + assert string.length() >= 2; StringWriter writer = new StringWriter(string.length() - 2); int end = string.length() - 1; + assert string.charAt(0) == '"' : "string did not start with '\"'"; + assert string.charAt(end) == '"' : "string did not end with '\"'"; for (int i = 1; i < end; i++) { char c = string.charAt(i); if (c != '\\') { diff --git a/src/main/java/graphql/parser/Parser.java b/src/main/java/graphql/parser/Parser.java index 6aed97b204..a029b6211d 100644 --- a/src/main/java/graphql/parser/Parser.java +++ b/src/main/java/graphql/parser/Parser.java @@ -24,9 +24,8 @@ public Document parseDocument(String input) { parser.setErrorHandler(new BailErrorStrategy()); GraphqlParser.DocumentContext document = parser.document(); - GraphqlAntlrToLanguage antlrToLanguage = new GraphqlAntlrToLanguage(); antlrToLanguage.visitDocument(document); - return antlrToLanguage.result; + return antlrToLanguage.getResult(); } } diff --git a/src/test/groovy/graphql/parser/GraphqlAntlrToLanguageTest.groovy b/src/test/groovy/graphql/parser/GraphqlAntlrToLanguageTest.groovy new file mode 100644 index 0000000000..081d005c66 --- /dev/null +++ b/src/test/groovy/graphql/parser/GraphqlAntlrToLanguageTest.groovy @@ -0,0 +1,66 @@ +package graphql.parser + +import spock.lang.Ignore +import spock.lang.Specification +/** + * Created by jiayu on 9/3/16. + */ +class GraphqlAntlrToLanguageTest extends Specification { + + def "parsing quoted string should work"() { + given: + def input = '''"simple quoted"''' + + when: + String parsed = GraphqlAntlrToLanguage.parseString(input) + + then: + parsed == "simple quoted" + } + + def "parsing escaped json should work"() { + given: + def input = '''"{\"name\": \"graphql\", \"year\": 2015}"''' + + when: + String parsed = GraphqlAntlrToLanguage.parseString(input) + + then: + parsed == '''{\"name\": \"graphql\", \"year\": 2015}''' + } + + def "parsing quoted quote should work"() { + given: + def input = '''"""''' + + when: + String parsed = GraphqlAntlrToLanguage.parseString(input) + + then: + parsed == '''"''' + } + + @Ignore("sadly this does not work yet") + def "parsing emoji should work"() { + given: + def input = '''"\\u1f37a"''' + + when: + String parsed = GraphqlAntlrToLanguage.parseString(input) + + then: + parsed == '''🍺''' + } + + def "parsing simple unicode should work"() { + given: + def input = '''"\\u56fe"''' + + when: + String parsed = GraphqlAntlrToLanguage.parseString(input) + + then: + parsed == '''图''' + } + +}