/* ====================================================================
   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.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.nio.charset.Charset;

import org.apache.poi.util.StringUtil.StringsIterator;
import org.junit.Test;

/**
 * Unit test for StringUtil
 */
public class TestStringUtil {

    /**
     * test getFromUnicodeHigh for symbols with code below and more 127
     */
    @Test
    public 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
    public 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( "testing offset " + j, expected_output[j],
                    output[j] );
        }
        StringUtil.putCompressedUnicode( input, output,
                100 - expected_output.length );
        for ( int j = 0; j < expected_output.length; j++ )
        {
            assertEquals( "testing offset " + j, expected_output[j],
                    output[100 + j - expected_output.length] );
        }
        try
        {
            StringUtil.putCompressedUnicode( input, output,
                    101 - expected_output.length );
            fail( "Should have caught ArrayIndexOutOfBoundsException" );
        }
        catch ( ArrayIndexOutOfBoundsException ignored )
        {
            // as expected
        }
    }

    @Test
    public 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( "testing offset " + j, expected_output[j],
                    output[j] );
        }
        StringUtil.putUnicodeLE( input, output,
                100 - expected_output.length );
        for ( int j = 0; j < expected_output.length; j++ )
        {
            assertEquals( "testing offset " + j, expected_output[j],
                    output[100 + j - expected_output.length] );
        }
        try
        {
            StringUtil.putUnicodeLE( input, output,
                    101 - expected_output.length );
            fail( "Should have caught ArrayIndexOutOfBoundsException" );
        }
        catch ( ArrayIndexOutOfBoundsException ignored )
        {
            // as expected
        }
    }

    @Test
    public void testStringsIterator() {
       StringsIterator i;

       
       i = new StringsIterator(new String[0]);
       assertFalse(i.hasNext());
       try {
          i.next();
          fail();
       } catch(ArrayIndexOutOfBoundsException e) {}

       
       i = new StringsIterator(new String[] {"1"});
       assertTrue(i.hasNext());
       assertEquals("1", i.next());
       
       assertFalse(i.hasNext());
       try {
          i.next();
          fail();
       } catch(ArrayIndexOutOfBoundsException e) {}

       
       i = new StringsIterator(new String[] {"1","2","3"});
       assertTrue(i.hasNext());
       assertEquals("1", i.next());
       assertTrue(i.hasNext());
       assertEquals("2", i.next());
       assertTrue(i.hasNext());
       assertEquals("3", i.next());
       
       assertFalse(i.hasNext());
       try {
          i.next();
          fail();
       } catch(ArrayIndexOutOfBoundsException e) {}
    }
    

    @Test
    public void startsWithIgnoreCase() {
        assertTrue("same string", StringUtil.startsWithIgnoreCase("Apache POI", "Apache POI"));
        assertTrue("longer string", StringUtil.startsWithIgnoreCase("Apache POI project", "Apache POI"));
        assertTrue("different case", StringUtil.startsWithIgnoreCase("APACHE POI", "Apache POI"));
        assertFalse("leading whitespace should not be ignored", StringUtil.startsWithIgnoreCase(" Apache POI project", "Apache POI"));
        assertFalse("shorter string", StringUtil.startsWithIgnoreCase("Apache", "Apache POI"));
    }
    
    @Test
    public void endsWithIgnoreCase() {
        assertTrue("same string", StringUtil.endsWithIgnoreCase("Apache POI", "Apache POI"));
        assertTrue("longer string", StringUtil.endsWithIgnoreCase("Project Apache POI", "Apache POI"));
        assertTrue("different case", StringUtil.endsWithIgnoreCase("APACHE POI", "Apache POI"));
        assertFalse("trailing whitespace should not be ignored", StringUtil.endsWithIgnoreCase("Apache POI project ", "Apache POI"));
        assertFalse("shorter string", StringUtil.endsWithIgnoreCase("Apache", "Apache POI"));
    }
    
    @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("no separator", "ApachePOIproject", StringUtil.join(arr));
        assertEquals("separator", "Apache POI project", StringUtil.join(arr, " "));
    }
    
    @Test
    public void count() {
        String test = "Apache POI project\n\u00a9 Copyright 2016";
        // supports search in null or empty string
        assertEquals("null", 0, StringUtil.countMatches(null, 'A'));
        assertEquals("empty string", 0, StringUtil.countMatches("", 'A'));
        
        assertEquals("normal", 2, StringUtil.countMatches(test, 'e'));
        assertEquals("normal, should not find a in escaped copyright", 1, StringUtil.countMatches(test, 'a'));
        
        // search for non-printable characters
        assertEquals("null character", 0, StringUtil.countMatches(test, '\0'));
        assertEquals("CR", 0, StringUtil.countMatches(test, '\r'));
        assertEquals("LF", 1, StringUtil.countMatches(test, '\n'));
        
        // search for unicode characters
        assertEquals("Unicode", 1, StringUtil.countMatches(test, '\u00a9'));
    }
}

