/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
 *
 * 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 com.android.ide.eclipse.adt.internal.resources;

import com.android.resources.ResourceFolderType;
import com.android.resources.ResourceType;

import org.eclipse.core.resources.IProject;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import junit.framework.TestCase;

@SuppressWarnings("javadoc")
public class ResourceNameValidatorTest extends TestCase {
    public void testValidator() throws Exception {
        // Valid
        ResourceNameValidator validator = ResourceNameValidator.create(true,
                ResourceFolderType.VALUES);
        assertTrue(validator.isValid("foo") == null);
        assertTrue(validator.isValid("foo.xml") == null);
        assertTrue(validator.isValid("Foo123_$") == null);
        assertTrue(validator.isValid("foo.xm") == null); // For non-file types, . => _

        // Invalid
        assertTrue(validator.isValid("") != null);
        assertTrue(validator.isValid(" ") != null);
        assertTrue(validator.isValid("foo bar") != null);
        assertTrue(validator.isValid("1foo") != null);
        assertTrue(validator.isValid("foo%bar") != null);
        assertTrue(ResourceNameValidator.create(true, Collections.singleton("foo"),
                ResourceType.STRING).isValid("foo") != null);
        assertTrue(ResourceNameValidator.create(true,
                ResourceFolderType.DRAWABLE).isValid("foo.xm") != null);
        assertTrue(ResourceNameValidator.create(false,
                ResourceFolderType.DRAWABLE).isValid("foo.xm") != null);

        // Only lowercase chars allowed in file-based resource names
        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.LAYOUT)
                .isValid("Foo123_$") != null);
        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.LAYOUT)
                .isValid("foo123_") == null);

        // Can't start with _ in file-based resource names, is okay for value based resources
        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.VALUES)
                .isValid("_foo") == null);
        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.LAYOUT)
                .isValid("_foo") != null);
        assertTrue(ResourceNameValidator.create(true, ResourceFolderType.DRAWABLE)
                .isValid("_foo") != null);
    }

    public void testIds() throws Exception {
        ResourceNameValidator validator = ResourceNameValidator.create(false, (IProject) null,
                ResourceType.ID);
        assertTrue(validator.isValid("foo") == null);
        assertTrue(validator.isValid(" foo") != null);
        assertTrue(validator.isValid("foo ") != null);
        assertTrue(validator.isValid("foo@") != null);
    }

    public void testUniqueOrExists() throws Exception {
        Set<String> existing = new HashSet<String>();
        existing.add("foo1");
        existing.add("foo2");
        existing.add("foo3");

        ResourceNameValidator validator = ResourceNameValidator.create(true, existing,
                ResourceType.ID);
        validator.unique();

        assertNull(validator.isValid("foo")); // null: ok (no error message)
        assertNull(validator.isValid("foo4"));
        assertNotNull(validator.isValid("foo1"));
        assertNotNull(validator.isValid("foo2"));
        assertNotNull(validator.isValid("foo3"));

        validator.exist();
        assertNotNull(validator.isValid("foo"));
        assertNotNull(validator.isValid("foo4"));
        assertNull(validator.isValid("foo1"));
        assertNull(validator.isValid("foo2"));
        assertNull(validator.isValid("foo3"));
    }
}
