/*
 * Copyright 2000-2013 JetBrains s.r.o.
 *
 * 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.jetbrains.plugins.groovy.intentions;

import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.plugins.groovy.intentions.conversions.ConvertMapToClassIntention;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.util.TestUtils;

import java.util.List;

/**
 * @author Maxim.Medvedev
 */
public class ConvertMapToClassTest extends GrIntentionTestCase {
  @Override
  protected String getBasePath() {
    return TestUtils.getTestDataPath() + "intentions/convertMapToClass/";
  }

  public void testSimple() {
    doTest();
  }

  public void testVariableTypeReplace() {
    doTest();
  }

  public void testBadCase() {
    doTest(false);
  }

  public void testChangeReturnType() {
    doTest();
  }

  public void testChangeMethodParameter() {
    doTest();
  }

  public void _testNotChangeReturnType() {
    doTest();
  }

  private void doTest() {
    doTest(true);
  }

  protected void doTest(boolean exists) {
    myFixture.configureByFile(getTestName(true) + "/Test.groovy");
    String hint = GroovyIntentionsBundle.message("convert.map.to.class.intention.name");
    final List<IntentionAction> list = myFixture.filterAvailableIntentions(hint);
    if (!exists) {
      assertEmpty(list);
      return;
    }
    assertOneElement(list);
    final PsiElement element = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset());
    final GrListOrMap map = PsiTreeUtil.getParentOfType(element, GrListOrMap.class);
    assertNotNull(map);
    final GrTypeDefinition foo = ConvertMapToClassIntention.createClass(getProject(), map.getNamedArguments(), "", "Foo");
    myFixture.addFileToProject(getTestName(true) + "/Foo.groovy", foo.getContainingFile().getText());
    final PsiClass psiClass = myFixture.findClass("Foo");
    WriteCommandAction.runWriteCommandAction(null, new Runnable() {
      public void run() {
        ConvertMapToClassIntention
          .replaceMapWithClass(getProject(), map, psiClass, ConvertMapToClassIntention.checkForReturnFromMethod(map),
                               ConvertMapToClassIntention.checkForVariableDeclaration(map),
                               ConvertMapToClassIntention.checkForMethodParameter(map));
      }
    });

    myFixture.checkResultByFile(getTestName(true) + "/Foo.groovy", getTestName(true) + "/Expected.groovy", true);
    myFixture.checkResultByFile(getTestName(true) + "/Test_after.groovy", true);
  }
}
