/*
 * Copyright 2013-2014 Grzegorz Ligas <[email protected]> and other contributors
 * (see the CONTRIBUTORS file).
 *
 * Licensed 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.intellij.xquery.reference.namespace;

import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.intellij.xquery.BaseFunctionalTestCase;
import org.intellij.xquery.psi.XQueryModuleDecl;
import org.intellij.xquery.psi.XQueryModuleImport;
import org.intellij.xquery.psi.XQueryNamespaceDecl;
import org.intellij.xquery.psi.XQueryPrefix;

import static org.intellij.xquery.Assertions.assertChildOf;
import static org.intellij.xquery.reference.ReferenceUtil.getTargetOfReferenceAtCaret;

/**
 * User: ligasgr
 * Date: 06/07/13
 * Time: 01:13
 */
public class XQueryFunctionPrefixReferenceTest extends BaseFunctionalTestCase {

    @Override
    protected String getTestDataPath() {
        return "src/testFunctional/testData/org/intellij/xquery/reference/namespace";
    }

    public void testFunctionPrefixReferenceForModuleDeclaration() {
        myFixture.configureByFiles("FunctionPrefixReference_Module.xq");

        PsiElement resolvedReference = getTargetOfReferenceAtCaret(myFixture, XQueryPrefix.class);

        assertChildOf(resolvedReference, XQueryModuleDecl.class);
    }

    public void testFunctionPrefixReferenceForModuleImport() {
        myFixture.configureByFiles("FunctionPrefixReference_Import.xq");

        PsiElement resolvedReference = getTargetOfReferenceAtCaret(myFixture, XQueryPrefix.class);

        assertChildOf(resolvedReference, XQueryModuleImport.class);
    }

    public void testFunctionPrefixReferenceForNamespaceDeclaration() {
        myFixture.configureByFiles("FunctionPrefixReference_Declaration.xq");

        PsiElement resolvedReference = getTargetOfReferenceAtCaret(myFixture, XQueryPrefix.class);

        assertChildOf(resolvedReference, XQueryNamespaceDecl.class);
    }

    public void testFunctionPrefixRename() {
        myFixture.configureByFiles("FunctionPrefixRename.xq");
        myFixture.renameElementAtCaret("aaa");
        myFixture.checkResultByFile("FunctionPrefixRename.xq", "FunctionPrefixRenameAfter.xq", false);
    }

    public void testFunctionPrefixReferenceToNotExistingNamespace() {
        myFixture.configureByFiles("FunctionPrefixReferenceToNotExistingNamespace.xq");

        PsiElement resolvedReference = getTargetOfReferenceAtCaret(myFixture, XQueryPrefix.class);

        assertNull(resolvedReference);
    }

    public void testFunctionPrefixReferenceToDuplicatedNamespace() {
        myFixture.configureByFiles("FunctionPrefixReferenceToDuplicatedNamespace.xq");

        PsiElement resolvedReference = getTargetOfReferenceAtCaret(myFixture, XQueryPrefix.class);

        assertNull(resolvedReference);
    }

    public void testFunctionPrefixReferenceForPredeclaredNamespace() {
        myFixture.configureByFiles("FunctionPrefixReferenceForPredeclaredNamespace.xq");

        PsiElement resolvedReference = getTargetOfReferenceAtCaret(myFixture, XQueryPrefix.class);

        PsiElement originalElement = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
        XQueryPrefix sourceOfReference = PsiTreeUtil.getParentOfType(originalElement, XQueryPrefix.class);
        assertEquals(resolvedReference, sourceOfReference);
    }
}