Search in sources :

Example 21 with CompiledTemplates

use of com.google.template.soy.jbcsrc.shared.CompiledTemplates in project closure-templates by google.

the class StreamingPrintDirectivesTest method testStreamingEscapeHtml.

@Test
public void testStreamingEscapeHtml() throws IOException {
    CompiledTemplates templates = compileFile("{namespace ns}", "", "{template .tag}", "  {let $tag kind=\"html\"}", "    <div {call .attrs /}></div>", "  {/let}", "  {$tag}", "{/template}", "", "{template .attrs kind=\"attributes\"}", "  class=\"foo\"", "{/template}");
    RenderContext context = getDefaultContext(templates);
    BufferingAppendable output = BufferingAppendable.buffering();
    templates.getTemplateFactory("ns.tag").create(EMPTY_DICT, EMPTY_DICT).render(output, context);
    assertThat(output.getAndClearBuffer()).isEqualTo("<div class=\"foo\"></div>");
}
Also used : RenderContext(com.google.template.soy.jbcsrc.shared.RenderContext) BufferingAppendable(com.google.template.soy.data.LoggingAdvisingAppendable.BufferingAppendable) CompiledTemplates(com.google.template.soy.jbcsrc.shared.CompiledTemplates) Test(org.junit.Test)

Example 22 with CompiledTemplates

use of com.google.template.soy.jbcsrc.shared.CompiledTemplates in project closure-templates by google.

the class StreamingPrintDirectivesTest method testStreamingDisablesRuntimeTypeChecks.

/**
 * This test demonstrates a change in behavior when streaming print directives are in use, they
 * can elide some runtime type checking. This is because the compiler explicitly puts in {@code
 * checkcast} instructions whenever calling {@link SoyValueProvider#resolve} (see every caller of
 * {@link ExpressionDetacher#resolveSoyValueProvider(Expression)}). However, when we are able to
 * stream a soy value provider we can't insert a {@code checkcast} instruction because we never
 * actually calculate the full value.
 *
 * <p>We could change SoyValueProvider.renderAndResolve to accept a TypePredicate and we could
 * sometimes enforce it, but for the time being this isn't happening.
 */
@Test
public void testStreamingDisablesRuntimeTypeChecks() throws IOException {
    CompiledTemplates templates = compileFile("{namespace ns}", "", "{template .streamable}", "  {@param i : int}", "  {$i |streaming}", "{/template}", "", "{template .nonstreamable}", "  {@param i : int}", "  {$i |nonstreaming}", "{/template}");
    RenderContext context = getDefaultContext(templates);
    SoyDict badParam = SoyValueConverterUtility.newDict("i", "notAnInt");
    BufferingAppendable output = BufferingAppendable.buffering();
    templates.getTemplateFactory("ns.streamable").create(badParam, EMPTY_DICT).render(output, context);
    assertThat(output.getAndClearBuffer()).isEqualTo("(stream: notAnInt)");
    try {
        templates.getTemplateFactory("ns.nonstreamable").create(badParam, EMPTY_DICT).render(output, context);
        fail("Expected ClassCastException");
    } catch (ClassCastException cce) {
        assertThat(cce).hasMessageThat().isEqualTo("com.google.template.soy.data.restricted.StringData cannot be cast to " + "com.google.template.soy.data.restricted.IntegerData");
    }
}
Also used : RenderContext(com.google.template.soy.jbcsrc.shared.RenderContext) BufferingAppendable(com.google.template.soy.data.LoggingAdvisingAppendable.BufferingAppendable) CompiledTemplates(com.google.template.soy.jbcsrc.shared.CompiledTemplates) SoyDict(com.google.template.soy.data.SoyDict) Test(org.junit.Test)

Example 23 with CompiledTemplates

use of com.google.template.soy.jbcsrc.shared.CompiledTemplates in project closure-templates by google.

the class StreamingPrintDirectivesTest method testStreamingCloseable.

@Test
public void testStreamingCloseable() throws IOException {
    // Test to make sure the .close() is consistently called
    // the |streamingCloseable directive buffers all data until close is called so if close isn't
    // called it should print nothing.
    CompiledTemplates templates = compileFile("{namespace ns}", "", "{template .basic}", "  {@param p : ?}", "  {$p|streamingCloseable:' closed!'}", "{/template}", "", "{template .nested kind=\"text\"}", "  {@param p : ?}", // escapeHtml is not closeable and it is streaming
    "  {$p|escapeHtml|streamingCloseable:'(close)'}", "{/template}", "", "{template .nestedDeeper kind=\"text\"}", "  {@param p : ?}", "  {$p|escapeHtml", "     |streamingCloseable:'(c1)'", "     |streamingCloseable:'(c2)'", "     |escapeHtml", "     |streamingCloseable:'(c3)'}", "{/template}", "");
    RenderContext context = getDefaultContext(templates);
    assertThat(renderToString("ns.basic", ImmutableMap.of("p", "hello"), templates, context)).isEqualTo("hello closed!");
    assertThat(renderToString("ns.nested", ImmutableMap.of("p", "hello"), templates, context)).isEqualTo("hello(close)");
    assertThat(renderToString("ns.nestedDeeper", ImmutableMap.of("p", "hello"), templates, context)).isEqualTo("hello(c1)(c2)(c3)");
}
Also used : RenderContext(com.google.template.soy.jbcsrc.shared.RenderContext) CompiledTemplates(com.google.template.soy.jbcsrc.shared.CompiledTemplates) Test(org.junit.Test)

Example 24 with CompiledTemplates

use of com.google.template.soy.jbcsrc.shared.CompiledTemplates in project closure-templates by google.

the class StreamingPrintDirectivesTest method testStreaming.

@Test
public void testStreaming() throws IOException {
    BufferingAppendable output = BufferingAppendable.buffering();
    CompiledTemplates templates = compileFile("{namespace ns}", "", "{template .foo}", "  {@param future1 : ?}", "  {@param future2 : ?}", "  foo_prefix{sp}", "  {call .streamable}", "    {param p kind=\"html\"}", "      param_prefix{sp}{$future1}{sp}param_suffix", "    {/param}", "  {/call}", "", "  {sp}interlude{sp}", "", "  {call .unstreamable}", "    {param p kind=\"html\"}", "      param_prefix{sp}{$future2}{sp}param_suffix", "    {/param}", "  {/call}", "  {sp}foo_suffix", "{/template}", "", "{template .streamable}", "  {@param p : ?}", "  streamable_prefix{sp}", "  {$p |streaming}{sp}", "  streamable_suffix", "{/template}", "", "{template .unstreamable}", "  {@param p : ?}", "  unstreamable_prefix{sp}", "  {$p |nonstreaming}{sp}", "  unstreamable_suffix", "{/template}", "");
    CompiledTemplate.Factory factory = templates.getTemplateFactory("ns.foo");
    RenderContext context = getDefaultContext(templates);
    SettableFuture<String> future1 = SettableFuture.create();
    SettableFuture<String> future2 = SettableFuture.create();
    CompiledTemplate create = factory.create(SoyValueConverterUtility.newDict("future1", future1, "future2", future2), SoyValueConverter.EMPTY_DICT);
    RenderResult result = create.render(output, context);
    // rendering paused because it found our future
    assertThat(result.type()).isEqualTo(RenderResult.Type.DETACH);
    assertThat(result.future()).isSameAs(future1);
    // but we actually rendered the first half of the param even though it went through a print
    // directive. all the content in parens went through our directive
    assertThat(output.getAndClearBuffer()).isEqualTo("foo_prefix streamable_prefix (stream: param_prefix )");
    future1.set("future1");
    result = create.render(output, context);
    assertThat(result.type()).isEqualTo(RenderResult.Type.DETACH);
    assertThat(result.future()).isSameAs(future2);
    // here we made it into .unstreamable, but printed no part of the parameter due to the non
    // streamable print directive
    assertThat(output.getAndClearBuffer()).isEqualTo("(stream: future1)(stream:  param_suffix) streamable_suffix interlude " + "unstreamable_prefix ");
    future2.set("future2");
    result = create.render(output, context);
    assertThat(result.isDone()).isTrue();
    // now we render the full future2 parameter all at once and the
    assertThat(output.getAndClearBuffer()).isEqualTo("param_prefix future2 param_suffix unstreamable_suffix foo_suffix");
}
Also used : RenderContext(com.google.template.soy.jbcsrc.shared.RenderContext) BufferingAppendable(com.google.template.soy.data.LoggingAdvisingAppendable.BufferingAppendable) RenderResult(com.google.template.soy.jbcsrc.api.RenderResult) CompiledTemplates(com.google.template.soy.jbcsrc.shared.CompiledTemplates) CompiledTemplate(com.google.template.soy.jbcsrc.shared.CompiledTemplate) Test(org.junit.Test)

Example 25 with CompiledTemplates

use of com.google.template.soy.jbcsrc.shared.CompiledTemplates in project closure-templates by google.

the class StreamingPrintDirectivesTest method testStreamingPrintOrdering.

// There was a bug that caused us to apply print directives in the wrong order when there were
// multiple streaming print directives.
@Test
public void testStreamingPrintOrdering() throws IOException {
    CompiledTemplates templates = compileFile("{namespace ns}", "", "{template .foo}", "  {@param s : ?}", "  {$s |streaming:'first' |streaming:'second'}", "{/template}", "");
    RenderContext context = getDefaultContext(templates);
    BufferingAppendable output = BufferingAppendable.buffering();
    CompiledTemplate template = templates.getTemplateFactory("ns.foo").create(SoyValueConverterUtility.newDict("s", "hello"), EMPTY_DICT);
    template.render(output, context);
    assertThat(output.getAndClearBuffer()).isEqualTo("(second: (first: hello))");
}
Also used : RenderContext(com.google.template.soy.jbcsrc.shared.RenderContext) BufferingAppendable(com.google.template.soy.data.LoggingAdvisingAppendable.BufferingAppendable) CompiledTemplates(com.google.template.soy.jbcsrc.shared.CompiledTemplates) CompiledTemplate(com.google.template.soy.jbcsrc.shared.CompiledTemplate) Test(org.junit.Test)

Aggregations

CompiledTemplates (com.google.template.soy.jbcsrc.shared.CompiledTemplates)33 Test (org.junit.Test)30 CompiledTemplate (com.google.template.soy.jbcsrc.shared.CompiledTemplate)22 RenderContext (com.google.template.soy.jbcsrc.shared.RenderContext)20 BufferingAppendable (com.google.template.soy.data.LoggingAdvisingAppendable.BufferingAppendable)14 RenderResult (com.google.template.soy.jbcsrc.api.RenderResult)6 SoyFileSetNode (com.google.template.soy.soytree.SoyFileSetNode)5 TemplateRegistry (com.google.template.soy.soytree.TemplateRegistry)5 SoyRecord (com.google.template.soy.data.SoyRecord)3 SoyDict (com.google.template.soy.data.SoyDict)2 IOException (java.io.IOException)2 Stopwatch (com.google.common.base.Stopwatch)1 SettableFuture (com.google.common.util.concurrent.SettableFuture)1 ByteString (com.google.protobuf.ByteString)1 SoyFileSetParserBuilder (com.google.template.soy.SoyFileSetParserBuilder)1 EscapeHtmlDirective (com.google.template.soy.coredirectives.EscapeHtmlDirective)1 BasicParamStore (com.google.template.soy.data.internal.BasicParamStore)1 ParamStore (com.google.template.soy.data.internal.ParamStore)1 ErrorReporter (com.google.template.soy.error.ErrorReporter)1 ClassData (com.google.template.soy.jbcsrc.internal.ClassData)1