/* * Copyright 2015, 2016 Tagir Valeev * * 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 one.util.streamex; import static one.util.streamex.TestHelpers.*; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; import one.util.streamex.IntStreamEx; import one.util.streamex.Joining; import one.util.streamex.StreamEx; import org.junit.Assert; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; /** * @author Tagir Valeev */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JoiningTest { @Test(expected = IllegalArgumentException.class) public void testMaxCharsRange() { Joining.with(",").maxChars(-1); } @Test(expected = IllegalArgumentException.class) public void testMaxCodePointsRange() { Joining.with(",").maxCodePoints(-2); } @Test(expected = IllegalArgumentException.class) public void testMaxSymbolsRange() { Joining.with(",").maxGraphemes(Integer.MIN_VALUE); } @Test public void testSimple() { Supplier<Stream<String>> s = () -> IntStream.range(0, 100).mapToObj(String::valueOf); checkCollector("joiningSimple", s.get().collect(Collectors.joining(", ")), s, Joining.with(", ")); checkCollector("joiningWrap", s.get().collect(Collectors.joining(", ", "[", "]")), s, Joining.with(", ").wrap( "[", "]")); checkCollector("joiningWrap2", s.get().collect(Collectors.joining(", ", "[(", ")]")), s, Joining.with(", ") .wrap("(", ")").wrap("[", "]")); } @Test public void testCutSimple() { List<String> input = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"); assertEquals("", StreamEx.of(input).peek(Assert::fail).collect(Joining.with(", ").maxChars(0).cutAnywhere())); assertEquals("", StreamEx.of(input).parallel().peek(Assert::fail).collect( Joining.with(", ").maxChars(0).cutAnywhere())); String expected = "one, two, three, four, five, six, seven, eight, nine, ten"; for (int i = 3; i < expected.length() + 5; i++) { String exp = expected; if (exp.length() > i) { exp = exp.substring(0, i - 3) + "..."; } String exp2 = expected; while (exp2.length() > i) { int pos = exp2.lastIndexOf(", ", exp2.endsWith(", ...") ? exp2.length() - 6 : exp2.length()); exp2 = pos >= 0 ? exp2.substring(0, pos + 2) + "..." : "..."; } for (StreamExSupplier<String> supplier : streamEx(input::stream)) { assertEquals(supplier + "/#" + i, exp, supplier.get().collect( Joining.with(", ").maxChars(i).cutAnywhere())); assertEquals(supplier + "/#" + i, expected.substring(0, Math.min(i, expected.length())), supplier.get() .collect(Joining.with(", ").ellipsis("").maxChars(i).cutAnywhere())); assertEquals(supplier + "/#" + i, exp2, supplier.get().collect( Joining.with(", ").maxChars(i).cutAfterDelimiter())); } } byte[] data = { (byte) 0xFF, 0x30, 0x40, 0x50, 0x70, 0x12, (byte) 0xF0 }; assertEquals("FF 30 40 50 ...", IntStreamEx.of(data).mapToObj( b -> String.format(Locale.ENGLISH, "%02X", b & 0xFF)).collect( Joining.with(" ").maxChars(15).cutAfterDelimiter())); } @Test public void testCuts() { List<String> input = Arrays.asList("one two", "three four", "five", "six seven"); checkShortCircuitCollector("cutBefore", "one two, three four...", 4, input::stream, Joining.with(", ") .maxChars(25).cutBeforeDelimiter()); checkShortCircuitCollector("cutBefore", "one two...", 2, input::stream, Joining.with(", ").maxChars(10) .cutBeforeDelimiter()); checkShortCircuitCollector("cutBefore", "...", 2, input::stream, Joining.with(", ").maxChars(9) .cutBeforeDelimiter()); checkShortCircuitCollector("cutAfter", "one two, three four, ...", 4, input::stream, Joining.with(", ") .maxChars(25).cutAfterDelimiter()); checkShortCircuitCollector("cutAfter", "one two, ...", 2, input::stream, Joining.with(", ").maxChars(12) .cutAfterDelimiter()); checkShortCircuitCollector("cutAfter", "...", 2, input::stream, Joining.with(", ").maxChars(11) .cutAfterDelimiter()); checkShortCircuitCollector("cutWord", "one two, three four, ...", 4, input::stream, Joining.with(", ") .maxChars(25).cutAtWord()); checkShortCircuitCollector("cutWord", "one two, ...", 2, input::stream, Joining.with(", ").maxChars(12) .cutAtWord()); checkShortCircuitCollector("cutWord", "one two,...", 2, input::stream, Joining.with(", ").maxChars(11) .cutAtWord()); checkShortCircuitCollector("cutWord", "one two...", 2, input::stream, Joining.with(", ").maxChars(10) .cutAtWord()); checkShortCircuitCollector("cutWord", "one ...", 2, input::stream, Joining.with(", ").maxChars(9).cutAtWord()); checkShortCircuitCollector("cutWord", "one...", 1, input::stream, Joining.with(", ").maxChars(6).cutAtWord()); checkShortCircuitCollector("cutCodePoint", "one two, three four, f...", 4, input::stream, Joining.with(", ") .maxChars(25)); checkShortCircuitCollector("cutCodePoint", "one two, ...", 2, input::stream, Joining.with(", ").maxChars(12)); checkShortCircuitCollector("cutCodePoint", "one two,...", 2, input::stream, Joining.with(", ").maxChars(11)); checkShortCircuitCollector("cutCodePoint", "one two...", 2, input::stream, Joining.with(", ").maxChars(10)); checkShortCircuitCollector("cutCodePoint", "one tw...", 2, input::stream, Joining.with(", ").maxChars(9)); checkShortCircuitCollector("cutCodePoint", "one...", 1, input::stream, Joining.with(", ").maxChars(6)); } @Test public void testPrefixSuffix() { List<String> input = Arrays.asList("one two", "three four", "five", "six seven"); checkShortCircuitCollector("cutWord", "[one two, three four,...]", 3, input::stream, Joining.with(", ").wrap( "[", "]").maxChars(25).cutAtWord()); checkShortCircuitCollector("cutWord", "[one two...]", 2, input::stream, Joining.with(", ").maxChars(12).wrap( "[", "]").cutAtWord()); checkShortCircuitCollector("cutWord", "[one ...]", 2, input::stream, Joining.with(", ").maxChars(11).wrap("[", "]").cutAtWord()); checkShortCircuitCollector("cutWord", "[one ...]", 2, input::stream, Joining.with(", ").maxChars(10).wrap("[", "]").cutAtWord()); checkShortCircuitCollector("cutWord", "[one...]", 1, input::stream, Joining.with(", ").maxChars(8).wrap("[", "]").cutAtWord()); checkShortCircuitCollector("cutWord", "[...]", 1, input::stream, Joining.with(", ").maxChars(6).wrap("[", "]") .cutAtWord()); checkShortCircuitCollector("cutWord", "[..]", 1, input::stream, Joining.with(", ").maxChars(4).wrap("[", "]") .cutAtWord()); checkShortCircuitCollector("cutWord", "[.]", 1, input::stream, Joining.with(", ").maxChars(3).wrap("[", "]") .cutAtWord()); checkShortCircuitCollector("cutWord", "[]", 0, input::stream, Joining.with(", ").maxChars(2).wrap("[", "]") .cutAtWord()); checkShortCircuitCollector("cutWord", "[", 0, input::stream, Joining.with(", ").maxChars(1).wrap("[", "]") .cutAtWord()); checkShortCircuitCollector("cutWord", "", 0, input::stream, Joining.with(", ").maxChars(0).wrap("[", "]") .cutAtWord()); checkShortCircuitCollector("cutWord", "a prefix a ", 0, input::stream, Joining.with(" ").maxChars(15).wrap( "a prefix ", " a suffix").cutAtWord()); checkShortCircuitCollector("cutWord", "a prefix ", 0, input::stream, Joining.with(" ").maxChars(10).wrap( "a prefix ", " a suffix").cutAtWord()); checkShortCircuitCollector("cutWord", "a ", 0, input::stream, Joining.with(" ").maxChars(5).wrap("a prefix ", " a suffix").cutAtWord()); } @Test public void testCodePoints() { String string = "\ud801\udc14\ud801\udc2f\ud801\udc45\ud801\udc28\ud801\udc49\ud801\udc2f\ud801\udc3b"; List<CharSequence> input = Arrays.asList(string, new StringBuilder(string), new StringBuffer(string)); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f\ud801", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(5).cutAnywhere()); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(5).cutAtCodePoint()); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(4).cutAtGrapheme()); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(4).cutAnywhere()); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(4).cutAtCodePoint()); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(4).cutAtGrapheme()); checkShortCircuitCollector("maxChars", "\ud801\udc14\ud801\udc2f\ud801\udc45\ud801\udc28", 1, input::stream, Joining.with(",").ellipsis("").maxChars(9)); checkShortCircuitCollector("maxCodePoints", "\ud801\udc14\ud801\udc2f\ud801\udc45\ud801\udc28\ud801\udc49", 1, input::stream, Joining.with(",").ellipsis("").maxCodePoints(5).cutAnywhere()); checkShortCircuitCollector("maxCodePoints", "\ud801\udc14\ud801\udc2f\ud801\udc45\ud801\udc28\ud801\udc49", 1, input::stream, Joining.with(",").ellipsis("").maxCodePoints(5).cutAtCodePoint()); checkShortCircuitCollector("maxCodePoints", "\ud801\udc14\ud801\udc2f\ud801\udc45\ud801\udc28\ud801\udc49", 1, input::stream, Joining.with(",").ellipsis("").maxCodePoints(5).cutAtGrapheme()); checkShortCircuitCollector("maxCodePoints", string, 2, input::stream, Joining.with(",").ellipsis("") .maxCodePoints(7)); checkShortCircuitCollector("maxCodePoints", string + ",", 2, input::stream, Joining.with(",").ellipsis("") .maxCodePoints(8)); checkShortCircuitCollector("maxCodePoints", string + ",\ud801\udc14", 2, input::stream, Joining.with(",") .ellipsis("").maxCodePoints(9).cutAtCodePoint()); checkShortCircuitCollector("maxCodePoints", string + "," + string + "," + string, 3, input::stream, Joining .with(",").ellipsis("").maxCodePoints(23)); checkShortCircuitCollector("maxCodePoints", string + "," + string + ",\ud801\udc14\ud801\udc2f\ud801\udc45\ud801\udc28\ud801\udc49\ud801\udc2f", 3, input::stream, Joining .with(",").ellipsis("").maxCodePoints(22)); checkShortCircuitCollector("maxCodePointsPrefix", string, 0, input::stream, Joining.with(",").wrap(string, string).maxCodePoints(7).cutAnywhere()); } @Test public void testSurrogates() { String string = "\ud801\ud801\ud801\ud801\ud801\udc14\udc14\udc14\udc14\udc14"; List<String> input = Collections.nCopies(3, string); checkShortCircuitCollector("highSurr", string.substring(0, 4), 1, input::stream, Joining.with(",").ellipsis("") .maxChars(4).cutAnywhere()); checkShortCircuitCollector("highSurr", string.substring(0, 4), 1, input::stream, Joining.with(",").ellipsis("") .maxChars(4).cutAtCodePoint()); checkShortCircuitCollector("highSurr", string.substring(0, 4), 1, input::stream, Joining.with(",").ellipsis("") .maxCodePoints(4).cutAnywhere()); checkShortCircuitCollector("lowSurr", string.substring(0, 7), 1, input::stream, Joining.with(",").ellipsis("") .maxChars(7).cutAnywhere()); checkShortCircuitCollector("lowSurr", string.substring(0, 7), 1, input::stream, Joining.with(",").ellipsis("") .maxChars(7).cutAtCodePoint()); checkShortCircuitCollector("lowSurr", string.substring(0, 8), 1, input::stream, Joining.with(",").ellipsis("") .maxCodePoints(7).cutAnywhere()); } @Test public void testGraphemes() { String string = "aa\u0300\u0321e\u0300a\u0321a\u0300\u0321a"; List<String> input = Collections.nCopies(3, string); checkShortCircuitCollector("maxChars", "aa\u0300\u0321e", 1, input::stream, Joining.with(",").ellipsis("") .maxChars(5).cutAnywhere()); checkShortCircuitCollector("maxChars", "aa\u0300\u0321e", 1, input::stream, Joining.with(",").ellipsis("") .maxChars(5).cutAtCodePoint()); checkShortCircuitCollector("maxChars", "aa\u0300\u0321", 1, input::stream, Joining.with(",").ellipsis("") .maxChars(5).cutAtGrapheme()); checkShortCircuitCollector("maxChars", "aa\u0300\u0321e\u0300", 1, input::stream, Joining.with(",") .ellipsis("").maxChars(6).cutAtGrapheme()); checkShortCircuitCollector("maxChars", "aa\u0300\u0321", 1, input::stream, Joining.with(",").ellipsis("") .maxChars(4).cutAtGrapheme()); checkShortCircuitCollector("maxChars", "a", 1, input::stream, Joining.with(",").ellipsis("").maxChars(3) .cutAtGrapheme()); checkShortCircuitCollector("maxSymbols", "aa\u0300\u0321e\u0300", 1, input::stream, Joining.with(",").ellipsis( "").maxGraphemes(3)); checkShortCircuitCollector("maxSymbols", "aa\u0300\u0321e\u0300a\u0321a\u0300\u0321", 1, input::stream, Joining .with(",").ellipsis("").maxGraphemes(5)); checkShortCircuitCollector("maxSymbols", string, 2, input::stream, Joining.with(",").ellipsis("").maxGraphemes( 6)); checkShortCircuitCollector("maxSymbols", string + ",", 2, input::stream, Joining.with(",").ellipsis("") .maxGraphemes(7)); checkShortCircuitCollector("maxSymbols", string + ",a", 2, input::stream, Joining.with(",").ellipsis("") .maxGraphemes(8)); checkShortCircuitCollector("maxSymbols", string + ",aa\u0300\u0321", 2, input::stream, Joining.with(",") .ellipsis("").maxGraphemes(9)); checkShortCircuitCollector("maxSymbolsBeforeDelimiter", "", 1, input::stream, Joining.with(",").ellipsis("") .maxGraphemes(5).cutBeforeDelimiter()); checkShortCircuitCollector("maxSymbolsBeforeDelimiter", string, 2, input::stream, Joining.with(",") .ellipsis("").maxGraphemes(6).cutBeforeDelimiter()); checkShortCircuitCollector("maxSymbolsBeforeDelimiter", string, 2, input::stream, Joining.with(",") .ellipsis("").maxGraphemes(7).cutBeforeDelimiter()); checkShortCircuitCollector("maxSymbolsBeforeDelimiter", string, 2, input::stream, Joining.with(",") .ellipsis("").maxGraphemes(8).cutBeforeDelimiter()); checkShortCircuitCollector("maxSymbolsAfterDelimiter", "", 1, input::stream, Joining.with(",").ellipsis("") .maxGraphemes(5).cutAfterDelimiter()); checkShortCircuitCollector("maxSymbolsAfterDelimiter", "", 2, input::stream, Joining.with(",").ellipsis("") .maxGraphemes(6).cutAfterDelimiter()); checkShortCircuitCollector("maxSymbolsAfterDelimiter", string + ",", 2, input::stream, Joining.with(",") .ellipsis("").maxGraphemes(7).cutAfterDelimiter()); checkShortCircuitCollector("maxSymbolsAfterDelimiter", string + ",", 2, input::stream, Joining.with(",") .ellipsis("").maxGraphemes(8).cutAfterDelimiter()); checkShortCircuitCollector("maxSymbolsBeforeDelimiterPrefix", string, 0, input::stream, Joining.with(",").wrap( string, string).maxGraphemes(8).cutBeforeDelimiter()); } }