blob: c0545cd76215ec5040bdda906dd1f6bb6b3f7df5 [file] [log] [blame]
/* ====================================================================
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
*/
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
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
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
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
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");
}
}