/*
 * 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.commons.vfs2.provider.local.test;

import org.apache.commons.vfs2.FileName;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.provider.local.WindowsFileName;
import org.apache.commons.vfs2.test.AbstractProviderTestCase;

/**
 * Additional naming tests for local file system.
 * <p>
 * Only executed on Windows O/S.
 */
public class WindowsFileNameTests
    extends AbstractProviderTestCase
{
    public void testWindowsRoots() throws Exception
    {
        // valid URI forms of the filesystem root
        String[] tests = new String[] { "file:///C:/", "file://C:/", "file:/C:/", "file:C:/" };

        for(String name : tests)
        {
            FileName fn = getManager().resolveFile(name).getName();

            // the following tests work for Windows file names only
            assertSame(WindowsFileName.class, fn.getClass());

            // all should result in the same FileName
            assertEquals("file:///C:/", fn.toString());
            assertEquals("/", fn.getPath());
            assertEquals("/", fn.getPathDecoded());
            assertEquals("file:///C:/", fn.getRootURI());
            assertEquals("file:///C:/", fn.getFriendlyURI());

            assertEquals("file:///C:/", fn.getRoot().toString());

            assertEquals("", fn.getExtension());
            assertEquals("", fn.getBaseName());
        }
    }

    public void testWindowsWrongRoots() throws Exception
    {
        String[] tests = new String[] { "file:///C:", "file://C:", "file:/C:", "file:C:" };

        for(String name : tests)
        {
            try
            {
                FileName fn = getManager().resolveFile(name).getName();
                fail("should not accept root " + name);
            }
            catch (FileSystemException ex)
            {
                assertEquals("vfs.provider/invalid-absolute-uri.error", ex.getCode());
                assertTrue(ex.toString().indexOf(name) >= 0);
            }
        }
    }

    public void testWindowsFilenameUNCStartError() throws Exception
    {
        try
        {
            final String FILE = "file://///";
            FileObject fo = getManager().resolveFile(FILE);
            fail("Windows File Parser should not allow " + FILE + " " + fo);
        }
        catch(FileSystemException ex)
        {
            assertEquals("Exception code", "vfs.provider/invalid-absolute-uri.error", ex.getCode());
            ex = (FileSystemException)ex.getCause();
            assertEquals("Exception code", "vfs.provider.local/missing-share-name.error", ex.getCode());
        }
    }

    public void testWindowsFilenameParserError() throws Exception
    {
        // check VFS-338 with 2+4 slashes we want a dedicated error
        try
        {
            final String FILE = "file://////";
            FileObject fo = getManager().resolveFile(FILE);
            fail("Windows File Parser should not allow " + FILE + " " + fo);
        }
        catch(FileSystemException ex)
        {
            assertEquals("Exception code", "vfs.provider/invalid-absolute-uri.error", ex.getCode());
            ex = (FileSystemException)ex.getCause();
            assertEquals("Exception code", "vfs.provider.local/not-absolute-file-name.error", ex.getCode());
        }
    }
}
