/* * 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.addthis.hydra.data.util; import java.util.ArrayList; import java.util.List; import org.junit.Test; import static org.junit.Assert.assertEquals; public class TestCommentTokenizer { @Test public void testNoTokens() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = ""; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(1, content.size()); assertEquals(1, delimiters.size()); assertEquals("", delimiters.get(0)); assertEquals("", content.get(0)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(1, content.size()); assertEquals(1, delimiters.size()); assertEquals("", delimiters.get(0)); assertEquals("hello world", content.get(0)); } @Test public void testSingleLineComment() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world // foo bar \nbaz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("//", delimiters.get(0)); assertEquals("\n", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar ", content.get((1))); assertEquals("baz", content.get(2)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "// foo bar\n"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(2, content.size()); assertEquals(2, delimiters.size()); assertEquals("//", delimiters.get(0)); assertEquals("\n", delimiters.get(1)); assertEquals("", content.get(0)); assertEquals(" foo bar", content.get((1))); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "// foo bar"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(2, content.size()); assertEquals(2, delimiters.size()); assertEquals("//", delimiters.get(0)); assertEquals("", delimiters.get(1)); assertEquals("", content.get(0)); assertEquals(" foo bar", content.get((1))); } @Test public void testMultiLineComment() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world /* foo bar */baz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("/*", delimiters.get(0)); assertEquals("*/", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar ", content.get((1))); assertEquals("baz", content.get(2)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world /* foo bar baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(2, content.size()); assertEquals(2, delimiters.size()); assertEquals("/*", delimiters.get(0)); assertEquals("", delimiters.get(1)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar baz", content.get((1))); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world /* foo bar */ baz /* a b \nc d */ e"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(5, content.size()); assertEquals(5, delimiters.size()); assertEquals("/*", delimiters.get(0)); assertEquals("*/", delimiters.get(1)); assertEquals("/*", delimiters.get(2)); assertEquals("*/", delimiters.get(3)); assertEquals("", delimiters.get(4)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar ", content.get((1))); assertEquals(" baz ", content.get(2)); assertEquals(" a b \nc d ", content.get(3)); assertEquals(" e", content.get(4)); } @Test public void testParameter() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world %[foo]% bar baz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("%[", delimiters.get(0)); assertEquals("]%", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals("foo", content.get((1))); assertEquals(" bar baz", content.get(2)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world %[foo:// a b]% bar baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("%[", delimiters.get(0)); assertEquals("]%", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals("foo:// a b", content.get((1))); assertEquals(" bar baz", content.get(2)); } @Test public void testDoubleQuotes() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world \" foo bar \"baz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("\"", delimiters.get(0)); assertEquals("\"", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar ", content.get((1))); assertEquals("baz", content.get(2)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world \" foo bar baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(2, content.size()); assertEquals(2, delimiters.size()); assertEquals("\"", delimiters.get(0)); assertEquals("", delimiters.get(1)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar baz", content.get((1))); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "\\\"hello world\\\""; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(1, content.size()); assertEquals(1, delimiters.size()); assertEquals("", delimiters.get(0)); assertEquals("\\\"hello world\\\"", content.get(0)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world \" foo \\\"abc bar \"baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("\"", delimiters.get(0)); assertEquals("\"", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" foo \\\"abc bar ", content.get((1))); assertEquals("baz", content.get(2)); } @Test public void testSingleQuotes() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world \' foo bar \'baz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("\'", delimiters.get(0)); assertEquals("\'", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar ", content.get((1))); assertEquals("baz", content.get(2)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world \' foo bar baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(2, content.size()); assertEquals(2, delimiters.size()); assertEquals("\'", delimiters.get(0)); assertEquals("", delimiters.get(1)); assertEquals("hello world ", content.get(0)); assertEquals(" foo bar baz", content.get((1))); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "\\\'hello world\\\'"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(1, content.size()); assertEquals(1, delimiters.size()); assertEquals("", delimiters.get(0)); assertEquals("\\\'hello world\\\'", content.get(0)); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world \' foo \\\'abc bar \'baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("\'", delimiters.get(0)); assertEquals("\'", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" foo \\\'abc bar ", content.get((1))); assertEquals("baz", content.get(2)); } @Test public void testQuotesWithSingleLineComment() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world // \" foo bar \"baz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(2, content.size()); assertEquals(2, delimiters.size()); assertEquals("//", delimiters.get(0)); assertEquals("", delimiters.get(1)); assertEquals("hello world ", content.get(0)); assertEquals(" \" foo bar \"baz", content.get((1))); content = new ArrayList<>(); delimiters = new ArrayList<>(); input = "hello world \"// foo bar\" //baz"; tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(4, content.size()); assertEquals(4, delimiters.size()); assertEquals("\"", delimiters.get(0)); assertEquals("\"", delimiters.get(1)); assertEquals("//", delimiters.get(2)); assertEquals("", delimiters.get(3)); assertEquals("hello world ", content.get(0)); assertEquals("// foo bar", content.get((1))); assertEquals(" ", content.get(2)); assertEquals("baz", content.get(3)); } @Test public void testQuotesWithMultiLineComment() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world /* \" foo */ bar baz"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(3, content.size()); assertEquals(3, delimiters.size()); assertEquals("/*", delimiters.get(0)); assertEquals("*/", delimiters.get(1)); assertEquals("", delimiters.get(2)); assertEquals("hello world ", content.get(0)); assertEquals(" \" foo ", content.get((1))); assertEquals(" bar baz", content.get((2))); } @Test public void testCommentCombinations() { List<String> content = new ArrayList<>(); List<String> delimiters = new ArrayList<>(); String input = "hello world /* // \n *//* bar baz */"; CommentTokenizer tokenizer = new CommentTokenizer(input); tokenizer.tokenize(content, delimiters); assertEquals(4, content.size()); assertEquals(4, delimiters.size()); assertEquals("/*", delimiters.get(0)); assertEquals("*/", delimiters.get(1)); assertEquals("/*", delimiters.get(2)); assertEquals("*/", delimiters.get(3)); assertEquals("hello world ", content.get(0)); assertEquals(" // \n ", content.get(1)); assertEquals("", content.get(2)); assertEquals(" bar baz ", content.get(3)); } }