package org.trimou.engine.segment; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.junit.Test; import org.trimou.MustacheExceptionAssert; import org.trimou.exception.MustacheProblem; /** * * @author Martin Kouba */ public class HelperExecutionHandlerTest { @Test public void testSplitHelperName() { assertHelperNameParts("name foo.bar", "name", "foo.bar"); assertHelperNameParts("name hash1=\"DD-MM-yyyy HH:mm\"", "name", "hash1=\"DD-MM-yyyy HH:mm\""); assertHelperNameParts("name key='value'", "name", "key='value'"); assertHelperNameParts("name key=''value''", "name", "key=''value''"); assertHelperNameParts("key='value foo=' 'bar'", "key='value foo='", "'bar'"); assertHelperNameParts("'key'='value foo=' 'bar'", "'key'='value foo='", "'bar'"); // String literal may contain anything assertHelperNameParts("foo='bar = \n baz' qux", "foo='bar = \n baz'", "qux"); // List/array literal assertHelperNameParts("[ 'foo', 'bar', qux] foo", "[ 'foo', 'bar', qux]", "foo"); assertHelperNameParts("1 20 ['', '1'] foo", "1", "20", "['', '1']", "foo"); assertHelperNameParts("'[1, 2]'", "'[1, 2]'"); assertHelperNameParts("'[1, '2', 'alpha']'", "'[1, '2', 'alpha']'"); MustacheExceptionAssert .expect(MustacheProblem.COMPILE_HELPER_VALIDATION_FAILURE) .check(() -> assertHelperNameParts("name key=''value'")) .check(() -> assertHelperNameParts("name key=value'")) .check(() -> assertHelperNameParts("name key='value foo")) .check(() -> assertHelperNameParts("name key=value' foo")) .check(() -> assertHelperNameParts("'name key=value")) .check(() -> assertHelperNameParts("key=\"value \" and\"")); } @Test public void testGetFirstDeterminingEqualsCharPosition() { assertEquals(3, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition("foo=bar")); assertEquals(3, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition("foo='bar='")); assertEquals(1, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition("1='bar='")); assertEquals(-1, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition("'m=n'")); assertEquals(-1, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition(" ' m=n'")); assertEquals(-1, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition("'1'")); assertEquals(-1, HelperExecutionHandler .getFirstDeterminingEqualsCharPosition("\"foo\"")); } private void assertHelperNameParts(String name, String... parts) { List<String> result = new ArrayList<>(); Iterator<String> iterator = HelperExecutionHandler.splitHelperName(name, null); while (iterator.hasNext()) { result.add(iterator.next()); } List<String> expected = new ArrayList<>(); Collections.addAll(expected, parts); assertTrue("Parts: " + expected + " != " + result, expected.containsAll(result) && result.containsAll(expected)); } }