/*
* Copyright 2009 Google Inc.
*
* 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.
*/
package com.google.template.soy.passes;
import static com.google.common.truth.Truth.assertThat;
import com.google.template.soy.SoyFileSetParserBuilder;
import com.google.template.soy.base.SourceLocation.Point;
import com.google.template.soy.error.ErrorReporter;
import com.google.template.soy.error.ExplodingErrorReporter;
import com.google.template.soy.shared.SharedTestUtils;
import com.google.template.soy.soytree.RawTextNode;
import com.google.template.soy.soytree.SoyFileSetNode;
import com.google.template.soy.soytree.TemplateNode;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Unit tests for CombineConsecutiveRawTextNodesVisitor.
*
*/
@RunWith(JUnit4.class)
public final class CombineConsecutiveRawTextNodesVisitorTest {
@Test
public void testCombineConsecutiveRawTextNodes() {
String testFileContent =
"{namespace boo}\n"
+ "\n"
+ "/** @param goo */\n"
+ "{template .foo}\n"
+ " Blah{$goo}blah\n"
+ "{/template}\n";
ErrorReporter boom = ExplodingErrorReporter.get();
SoyFileSetNode soyTree =
SoyFileSetParserBuilder.forFileContents(testFileContent)
.errorReporter(boom)
.parse()
.fileSet();
TemplateNode template = (TemplateNode) SharedTestUtils.getNode(soyTree);
template.addChild(new RawTextNode(0, "bleh", template.getSourceLocation()));
template.addChild(new RawTextNode(0, "bluh", template.getSourceLocation()));
assertThat(template.numChildren()).isEqualTo(5);
new CombineConsecutiveRawTextNodesVisitor(soyTree.getNodeIdGenerator()).exec(soyTree);
assertThat(template.numChildren()).isEqualTo(3);
assertThat(((RawTextNode) template.getChild(0)).getRawText()).isEqualTo("Blah");
assertThat(((RawTextNode) template.getChild(2)).getRawText()).isEqualTo("blahblehbluh");
}
@Test
public void testCombineConsecutiveRawTextNodes_preserveSourceLocations() {
String testFileContent = "{namespace boo}{template .foo}\nbl{nil}ah\n{/template}";
ErrorReporter boom = ExplodingErrorReporter.get();
SoyFileSetNode soyTree =
SoyFileSetParserBuilder.forFileContents(testFileContent)
.errorReporter(boom)
.parse()
.fileSet();
TemplateNode template = (TemplateNode) SharedTestUtils.getNode(soyTree);
assertThat(template.numChildren()).isEqualTo(1);
RawTextNode node = (RawTextNode) template.getChild(0);
assertThat(node.getRawText()).isEqualTo("blah");
assertThat(node.getSourceLocation().getBeginPoint()).isEqualTo(Point.create(1, 31));
assertThat(node.getSourceLocation().getEndPoint()).isEqualTo(Point.create(2, 9));
// we also know the locations of individual characters
assertThat(node.locationOf(2)).isEqualTo(Point.create(2, 8));
// split it up into 1 node per character
int newId = 1; // arbitrary
RawTextNode c1 = node.substring(newId, 0, 1);
RawTextNode c2 = node.substring(newId, 1, 2);
RawTextNode c3 = node.substring(newId, 2, 3);
RawTextNode c4 = node.substring(newId, 3, 4);
template.removeChild(node);
template.addChildren(Arrays.asList(c1, c2, c3, c4));
assertThat(template.numChildren()).isEqualTo(4);
new CombineConsecutiveRawTextNodesVisitor(soyTree.getNodeIdGenerator()).exec(soyTree);
assertThat(template.numChildren()).isEqualTo(1);
node = (RawTextNode) template.getChild(0);
// all the data is preserved across the join operation
assertThat(node.getRawText()).isEqualTo("blah");
assertThat(node.getSourceLocation().getBeginPoint()).isEqualTo(Point.create(2, 1));
assertThat(node.getSourceLocation().getEndPoint()).isEqualTo(Point.create(2, 9));
assertThat(node.locationOf(2)).isEqualTo(Point.create(2, 8));
}
}