package org.apache.maven.doxia.util;

/*
 * 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.
 */

import java.text.ParseException;

import java.util.Date;
import java.util.GregorianCalendar;

import org.codehaus.plexus.PlexusTestCase;

/**
 * Test case for <code>DoxiaUtils</code>.
 *
 * @author ltheussl
 * @version $Id$
 */
public class DoxiaUtilsTest
    extends PlexusTestCase
{
    /**
     * Verify the expected results.
     */
    public void testIsInternalLink()
    {
        String link = "#anchor";
        assertTrue( "Should be an internal link: " + link,
            DoxiaUtils.isInternalLink( link ) );

        link = "http://maven.apache.org/index.html#anchor";
        assertFalse( "Should NOT be an internal link: " + link,
            DoxiaUtils.isInternalLink( link ) );

        link = "./index.html";
        assertFalse( "Should NOT be an internal link: " + link,
            DoxiaUtils.isInternalLink( link ) );
    }

    /**
     * Verify the expected results.
     */
    public void testIsExternalLink()
    {
        String link = "http://maven.apache.org/";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "https://maven.apache.org/";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "HTTPS://MAVEN.APACHE.ORG/";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "ftp:/maven.apache.org/";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "mailto:maven@apache.org";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "file:/index.html";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "resource_type://domain:port/filepathname?query_string#anchor";
        assertTrue( "Should be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "index.html";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "example.pdf";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "./index.html";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "../index.html";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        // Windows style separators "\" are not allowed

        link = "file:\\index.html";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = ".\\index.html";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );

        link = "..\\index.html";
        assertFalse( "Should NOT be an external link: " + link,
            DoxiaUtils.isExternalLink( link ) );
    }

    /**
     * Verify the expected results.
     */
    public void testIsLocalLink()
    {
        String link = "index.html";
        assertTrue( "Should be a local link: " + link,
            DoxiaUtils.isLocalLink( link ) );

        link = "./index.html";
        assertTrue( "Should be a local link: " + link,
            DoxiaUtils.isLocalLink( link ) );

        link = "../index.html";
        assertTrue( "Should be a local link: " + link,
            DoxiaUtils.isLocalLink( link ) );

        link = "#anchor";
        assertFalse( "Should NOT be a local link: " + link,
            DoxiaUtils.isLocalLink( link ) );

        link = "http://maven.apache.org/";
        assertFalse( "Should NOT be a local link: " + link,
            DoxiaUtils.isLocalLink( link ) );

    }

    /**
     * Verify the expected results.
     */
    public void testEncodeId()
    {
        assertEquals( DoxiaUtils.encodeId( null ), null );
        assertEquals( DoxiaUtils.encodeId( "" ), "a" );
        assertEquals( DoxiaUtils.encodeId( " " ), "a" );
        assertEquals( DoxiaUtils.encodeId( " _ " ), "a_" );
        assertEquals( DoxiaUtils.encodeId( "1" ), "a1" );
        assertEquals( DoxiaUtils.encodeId( "1anchor" ), "a1anchor" );
        assertEquals( DoxiaUtils.encodeId( "_anchor" ), "a_anchor" );
        assertEquals( DoxiaUtils.encodeId( "a b-c123 " ), "a_b-c123" );
        assertEquals( DoxiaUtils.encodeId( "   anchor" ), "anchor" );
        assertEquals( DoxiaUtils.encodeId( "myAnchor" ), "myAnchor" );
        assertEquals( DoxiaUtils.encodeId( "my&Anchor" ), "my.26Anchor" );
        assertEquals( DoxiaUtils.encodeId( "H\u00E5kon" ), "H.C3.A5kon" );
        assertEquals( DoxiaUtils.encodeId( "H\u00E5kon", true ), "Hkon" );
        assertEquals( DoxiaUtils.encodeId( "Theu\u00DFl" ), "Theu.C3.9Fl" );
        assertEquals( DoxiaUtils.encodeId( "Theu\u00DFl", true ), "Theul" );
    }

    /**
     * Verify the expected results.
     */
    public void testIsValidId()
    {
        assertFalse( DoxiaUtils.isValidId( null ) );
        assertFalse( DoxiaUtils.isValidId( "" ) );
        assertFalse( DoxiaUtils.isValidId( " " ) );
        assertFalse( DoxiaUtils.isValidId( " _ " ) );
        assertFalse( DoxiaUtils.isValidId( "1" ) );
        assertFalse( DoxiaUtils.isValidId( "1anchor" ) );
        assertFalse( DoxiaUtils.isValidId( "_anchor" ) );
        assertFalse( DoxiaUtils.isValidId( "a b-c123 " ) );
        assertFalse( DoxiaUtils.isValidId( "   anchor" ) );
        assertFalse( DoxiaUtils.isValidId( "my&Anchor" ) );
        assertTrue( DoxiaUtils.isValidId( "myAnchor" ) );
        assertTrue( DoxiaUtils.isValidId( "a_" ) );
        assertTrue( DoxiaUtils.isValidId( "a-" ) );
        assertTrue( DoxiaUtils.isValidId( "a:" ) );
        assertTrue( DoxiaUtils.isValidId( "a." ) );
        assertTrue( DoxiaUtils.isValidId( "index.html" ) );
        assertFalse( DoxiaUtils.isValidId( "Theu\u00DFl" ) );
        assertTrue( DoxiaUtils.isValidId( "Theu.C3.9Fl" ) );
        assertFalse( DoxiaUtils.isValidId( "Theu%C3%9Fl" ) );
    }

    /**
     * Verify the expected results.
     */
    public void testParseDate()
    {
        final int year = 1973;
        final int month = 1;
        final int day = 27;

        try
        {
            final Date feb27 = new GregorianCalendar( year, month, day ).getTime();
            assertEquals( feb27, DoxiaUtils.parseDate( "27.02.1973" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "27. 02. 1973" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "1973-02-27" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "1973/02/27" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "27 Feb 1973" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "27 Feb. 1973" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "Feb. 27, 1973" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "Feb 27, '73" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "February 27, 1973" ) );
            assertEquals( feb27, DoxiaUtils.parseDate( "19730227" ) );

            assertEquals( new GregorianCalendar( year, 0, 1 ).getTime(), DoxiaUtils.parseDate( "1973" ) );

            final Date feb1 = new GregorianCalendar( year, 1, 1 ).getTime();
            assertEquals( feb1, DoxiaUtils.parseDate( "February 1973" ) );
            assertEquals( feb1, DoxiaUtils.parseDate( "Feb. 1973" ) );
            assertEquals( feb1, DoxiaUtils.parseDate( "February '73" ) );
            assertEquals( feb1, DoxiaUtils.parseDate( "Feb. '73" ) );

            assertNotNull( DoxiaUtils.parseDate( "Today" ) );
            assertNotNull( DoxiaUtils.parseDate( "NOW" ) );
        }
        catch ( ParseException ex )
        {
            fail( ex.getMessage() );
        }

        try
        {
            DoxiaUtils.parseDate( "yesterday" ).getTime();
            fail();
        }
        catch ( ParseException ex )
        {
            assertNotNull( ex );
        }
    }
}
