public void testMapLiteralAsRecord_duplicateKeys() { SoyFileSetNode soyTree = SoyFileSetParserBuilder.forFileContents( constructTemplateSource("{let $map: ['a': 1, 'a': 2]/}")) .declaredSyntaxVersion(SyntaxVersion.V2_0) .doRunInitialParsingPasses(false) .typeRegistry(typeRegistry) .parse(); createResolveNamesVisitorForMaxSyntaxVersion().exec(soyTree); FormattingErrorReporter reporter = new FormattingErrorReporter(); new ResolveExpressionTypesVisitor(typeRegistry, SyntaxVersion.V9_9, reporter).exec(soyTree); assertThat(Iterables.getOnlyElement(reporter.getErrorMessages())) .isEqualTo("Record literals with duplicate keys are not allowed. Duplicate key: 'a'"); }
/** * Checks that the given Soy expression causes a SoySyntaxException during translation, optionally * checking the exception's error message. * * @param soyExpr The Soy expression to test. * @param expectedErrorMsgSubstrings An expected substring of the expected exception's message. * @param jsSrcOptions The JsSrc compiler options. */ private void assertSoyErrors( String soyExpr, SoyJsSrcOptions jsSrcOptions, String... expectedErrorMsgSubstrings) { ExprNode exprNode = new ExpressionParser(soyExpr, SourceLocation.UNKNOWN, ExplodingErrorReporter.get()) .parseExpression(); FormattingErrorReporter errorReporter = new FormattingErrorReporter(); new TranslateToJsExprVisitor( SOY_JS_SRC_FUNCTIONS_MAP, jsSrcOptions, LOCAL_VAR_TRANSLATIONS, errorReporter) .exec(exprNode); ImmutableList<String> errorMessages = errorReporter.getErrorMessages(); assertThat(errorMessages).hasSize(expectedErrorMsgSubstrings.length); for (int i = 0; i < expectedErrorMsgSubstrings.length; ++i) { assertThat(errorMessages.get(i)).contains(expectedErrorMsgSubstrings[i]); } }