/* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You 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 org.apache.poi.util; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import java.nio.charset.Charset; import org.junit.jupiter.api.Test; /** * Unit test for StringUtil */ public class TestStringUtil { /** * test getFromUnicodeHigh for symbols with code below and more 127 */ @Test void testGetFromUnicodeHighSymbolsWithCodesMoreThan127() { byte[] test_data = new byte[]{0x22, 0x04, 0x35, 0x04, 0x41, 0x04, 0x42, 0x04, 0x20, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, }; assertEquals( "\u0422\u0435\u0441\u0442 test", StringUtil.getFromUnicodeLE( test_data ) ); } @Test void testPutCompressedUnicode() { byte[] output = new byte[100]; byte[] expected_output = { (byte) 'H', (byte) 'e', (byte) 'l', (byte) 'l', (byte) 'o', (byte) ' ', (byte) 'W', (byte) 'o', (byte) 'r', (byte) 'l', (byte) 'd', (byte) 0xAE }; String input = new String( expected_output, Charset.forName(StringUtil.getPreferredEncoding()) ); StringUtil.putCompressedUnicode( input, output, 0 ); for ( int j = 0; j < expected_output.length; j++ ) { assertEquals( expected_output[j], output[j], "testing offset " + j ); } StringUtil.putCompressedUnicode( input, output, 100 - expected_output.length ); for ( int j = 0; j < expected_output.length; j++ ) { assertEquals( expected_output[j], output[100 + j - expected_output.length], "testing offset " + j ); } assertThrows(ArrayIndexOutOfBoundsException.class, () -> StringUtil.putCompressedUnicode( input, output, 101 - expected_output.length )); } @Test void testPutUncompressedUnicode() { byte[] output = new byte[100]; String input = "Hello World"; byte[] expected_output = { (byte) 'H', (byte) 0, (byte) 'e', (byte) 0, (byte) 'l', (byte) 0, (byte) 'l', (byte) 0, (byte) 'o', (byte) 0, (byte) ' ', (byte) 0, (byte) 'W', (byte) 0, (byte) 'o', (byte) 0, (byte) 'r', (byte) 0, (byte) 'l', (byte) 0, (byte) 'd', (byte) 0 }; StringUtil.putUnicodeLE( input, output, 0 ); for ( int j = 0; j < expected_output.length; j++ ) { assertEquals( expected_output[j], output[j], "testing offset " + j ); } StringUtil.putUnicodeLE( input, output, 100 - expected_output.length ); for ( int j = 0; j < expected_output.length; j++ ) { assertEquals( expected_output[j], output[100 + j - expected_output.length], "testing offset " + j ); } assertThrows(ArrayIndexOutOfBoundsException.class, () -> StringUtil.putUnicodeLE( input, output, 101 - expected_output.length )); } @Test public void startsWithIgnoreCase() { assertTrue(StringUtil.startsWithIgnoreCase("Apache POI", "Apache POI"), "same string"); assertTrue(StringUtil.startsWithIgnoreCase("Apache POI project", "Apache POI"), "longer string"); assertTrue(StringUtil.startsWithIgnoreCase("APACHE POI", "Apache POI"), "different case"); assertFalse(StringUtil.startsWithIgnoreCase(" Apache POI project", "Apache POI"), "leading whitespace should not be ignored"); assertFalse(StringUtil.startsWithIgnoreCase("Apache", "Apache POI"), "shorter string"); } @Test public void endsWithIgnoreCase() { assertTrue(StringUtil.endsWithIgnoreCase("Apache POI", "Apache POI"), "same string"); assertTrue(StringUtil.endsWithIgnoreCase("Project Apache POI", "Apache POI"), "longer string"); assertTrue(StringUtil.endsWithIgnoreCase("APACHE POI", "Apache POI"), "different case"); assertFalse(StringUtil.endsWithIgnoreCase("Apache POI project ", "Apache POI"), "trailing whitespace should not be ignored"); assertFalse(StringUtil.endsWithIgnoreCase("Apache", "Apache POI"), "shorter string"); } @Test public void join() { assertEquals("", StringUtil.join(",")); // degenerate case: nothing to join assertEquals("abc", StringUtil.join(",", "abc")); // degenerate case: one thing to join, no trailing comma assertEquals("abc|def|ghi", StringUtil.join("|", "abc", "def", "ghi")); assertEquals("5|8.5|true|string", StringUtil.join("|", 5, 8.5, true, "string")); //assumes Locale prints number decimal point as a period rather than a comma String[] arr = new String[] { "Apache", "POI", "project" }; assertEquals("ApachePOIproject", StringUtil.join(arr), "no separator"); assertEquals("Apache POI project", StringUtil.join(arr, " "), "separator"); } @Test public void count() { String test = "Apache POI project\n\u00a9 Copyright 2016"; // supports search in null or empty string assertEquals(0, StringUtil.countMatches(null, 'A'), "null"); assertEquals(0, StringUtil.countMatches("", 'A'), "empty string"); assertEquals(2, StringUtil.countMatches(test, 'e'), "normal"); assertEquals(1, StringUtil.countMatches(test, 'a'), "normal, should not find a in escaped copyright"); // search for non-printable characters assertEquals(0, StringUtil.countMatches(test, '\0'), "null character"); assertEquals(0, StringUtil.countMatches(test, '\r'), "CR"); assertEquals(1, StringUtil.countMatches(test, '\n'), "LF"); // search for unicode characters assertEquals(1, StringUtil.countMatches(test, '\u00a9'), "Unicode"); } }