/*
* Copyright (c) 2013-2017 Cinchapi 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.cinchapi.concourse.util;
import java.util.List;
import java.util.Queue;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import com.cinchapi.concourse.test.ConcourseBaseTest;
import com.cinchapi.concourse.test.Variables;
import com.cinchapi.concourse.util.Random;
import com.cinchapi.concourse.util.StringSplitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
/**
* Unit tests for the {@link StringSplitter} class.
*
* @author Jeff Nelson
*/
public class StringSplitterTest extends ConcourseBaseTest {
@Test
public void testStringSplitter() {
String string = Random.getString();
char delimiter = string.charAt(Math.abs(Random.getInt()
% string.length()));
doTestStringSplitter(string, delimiter);
}
@Test
public void testStringSplitterReproA() {
doTestStringSplitter("wnwo69", 'w');
}
@Test
public void testStringSplitterReproB() {
doTestStringSplitter(
"0n5g6kk2e1wqmwgei4dt b x65 2tglnwrktk8 3xur3rt9i7q z qfbux4ivhpv hpn1om6wmhhvahag5 4xe5rt6oo",
'o');
}
@Test
public void testStringSplitterReproC() {
doTestStringSplitter("yj6", 'y');
}
@Test
public void testStringSplitterBackToBackDelims() {
doTestStringSplitter("w 8", ' ');
}
/**
* Execute the logic for the StringSplitter test.
*
* @param string - The string to split
* @param delimiter - The delimiter to use when splitting
*/
private void doTestStringSplitter(String string, char delimiter) {
Variables.register("string", string);
Variables.register("delimiter", delimiter);
StringSplitter splitter = new StringSplitter(string, delimiter);
List<String> actual = Lists.newArrayList();
while (splitter.hasNext()) {
actual.add(splitter.next());
}
List<String> expected = Lists.newArrayList(string.split(String
.valueOf(delimiter)));
Variables.register("expected", expected);
Variables.register("actual", actual);
Assert.assertEquals(expected, actual);
}
@Test
public void testSplitOnNewlineEnabled() {
StringSplitter splitter = new StringSplitter("foo", 'o',
SplitOption.SPLIT_ON_NEWLINE);
Assert.assertTrue(SplitOption.SPLIT_ON_NEWLINE.isEnabled(splitter));
splitter = new StringSplitter("foo", 'o');
Assert.assertFalse(SplitOption.SPLIT_ON_NEWLINE.isEnabled(splitter));
}
@Test
public void testSplitOnNewlineLF() {
Set<String> expected = Sets.newHashSet("line1", "line2", "line3");
String string = Strings.join('\n', expected.toArray());
StringSplitter it = new StringSplitter(string,
SplitOption.SPLIT_ON_NEWLINE);
while (it.hasNext()) {
Assert.assertTrue(expected.contains(it.next()));
}
}
@Test
public void testSplitOnNewlineCR() {
Set<String> expected = Sets.newHashSet("line1", "line2", "line3");
String string = Strings.join('\r', expected.toArray());
StringSplitter it = new StringSplitter(string,
SplitOption.SPLIT_ON_NEWLINE);
while (it.hasNext()) {
Assert.assertTrue(expected.contains(it.next()));
}
}
@Test
public void testSplitOnNewlineCRLF() {
Set<String> expected = Sets.newHashSet("line1", "line2", "line3");
String string = Strings.join("\r\n", expected.toArray());
StringSplitter it = new StringSplitter(string,
SplitOption.SPLIT_ON_NEWLINE);
while (it.hasNext()) {
Assert.assertTrue(expected.contains(it.next()));
}
}
@Test
public void testSplitOnCommaAndNewline() {
String string = "a,b,c\n1,2,3\n4,5,6\n";
StringSplitter it = new StringSplitter(string, ',',
SplitOption.SPLIT_ON_NEWLINE);
Assert.assertEquals("a", it.next());
Assert.assertEquals("b", it.next());
Assert.assertEquals("c", it.next());
Assert.assertEquals("1", it.next());
Assert.assertEquals("2", it.next());
Assert.assertEquals("3", it.next());
Assert.assertEquals("4", it.next());
Assert.assertEquals("5", it.next());
Assert.assertEquals("6", it.next());
}
@Test
public void testTokenizeParenthesisAndDelimeterBackToBack() {
String string = "foo(bar),baz ,,()(bang,";
StringSplitter it = new StringSplitter(string, ',',
SplitOption.TOKENIZE_PARENTHESIS);
Assert.assertEquals("foo", it.next());
Assert.assertEquals("(", it.next());
Assert.assertEquals("bar", it.next());
Assert.assertEquals(")", it.next());
Assert.assertEquals("baz ", it.next());
Assert.assertEquals("", it.next());
Assert.assertEquals("(", it.next());
Assert.assertEquals(")", it.next());
Assert.assertEquals("(", it.next());
Assert.assertEquals("bang", it.next());
}
@Test
public void testTokenizeParenthesis() {
String string = "foo(bar)";
StringSplitter it = new StringSplitter(string,
SplitOption.TOKENIZE_PARENTHESIS);
while (it.hasNext()) {
Assert.assertEquals("foo", it.next());
Assert.assertEquals("(", it.next());
Assert.assertEquals("bar", it.next());
Assert.assertEquals(")", it.next());
}
}
@Test
public void testEndOfLineLF() {
String string = "a b c\n\nd e f";
StringSplitter it = new StringSplitter(string, ' ',
SplitOption.SPLIT_ON_NEWLINE);
Queue<String> queue = Queues.newSingleThreadedQueue();
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("");
queue.offer("d");
queue.offer("e");
queue.offer("f");
while (it.hasNext()) {
String expected = queue.poll();
Assert.assertEquals(expected, it.next());
if(expected.equals("c") || expected.equals("")) {
Assert.assertTrue(it.atEndOfLine());
Assert.assertTrue(it.atEndOfLine());
}
else {
Assert.assertFalse(it.atEndOfLine());
Assert.assertFalse(it.atEndOfLine());
}
}
}
@Test
public void testEndOfLineCR() {
String string = "a b c\r\rd e f";
StringSplitter it = new StringSplitter(string, ' ',
SplitOption.SPLIT_ON_NEWLINE);
Queue<String> queue = Queues.newSingleThreadedQueue();
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("");
queue.offer("d");
queue.offer("e");
queue.offer("f");
while (it.hasNext()) {
String expected = queue.poll();
Assert.assertEquals(expected, it.next());
if(expected.equals("c") || expected.equals("")) {
Assert.assertTrue(it.atEndOfLine());
Assert.assertTrue(it.atEndOfLine());
}
else {
Assert.assertFalse(it.atEndOfLine());
Assert.assertFalse(it.atEndOfLine());
}
}
}
@Test
public void testEndOfLineCRLF() {
String string = "a b c\r\n\r\nd e f";
StringSplitter it = new StringSplitter(string, ' ',
SplitOption.SPLIT_ON_NEWLINE);
Queue<String> queue = Queues.newSingleThreadedQueue();
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("");
queue.offer("d");
queue.offer("e");
queue.offer("f");
while (it.hasNext()) {
String expected = queue.poll();
Assert.assertEquals(expected, it.next());
if(expected.equals("c") || expected.equals("")) {
Assert.assertTrue(it.atEndOfLine());
Assert.assertTrue(it.atEndOfLine());
}
else {
Assert.assertFalse(it.atEndOfLine());
Assert.assertFalse(it.atEndOfLine());
}
}
}
@Test
public void testTrimTokens(){
String string = "a, b, c, d, e";
StringSplitter it = new StringSplitter(string, ',', SplitOption.TRIM_WHITESPACE);
while(it.hasNext()){
Assert.assertFalse(it.next().contains(" "));
}
}
@Test
public void testTrimSingleTokenLeading(){
String string = " a";
StringSplitter it = new StringSplitter(string, ',', SplitOption.TRIM_WHITESPACE);
while(it.hasNext()){
Assert.assertFalse(it.next().contains(" "));
}
}
@Test
public void testTrimSingleTokenTrailing(){
String string = "a ";
StringSplitter it = new StringSplitter(string, ',', SplitOption.TRIM_WHITESPACE);
while(it.hasNext()){
Assert.assertFalse(it.next().contains(" "));
}
}
@Test
public void testTrimTokensLeadingAndTrailing(){
String string = " a ,c , d,e";
StringSplitter it = new StringSplitter(string, ',', SplitOption.TRIM_WHITESPACE);
while(it.hasNext()){
Assert.assertFalse(it.next().contains(" "));
}
}
}