/*
 * 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 com.intellij.codeInsight.template.postfix.completion;

import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.template.impl.ListTemplatesHandler;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;

public class ListTemplatesActionTest extends LightCodeInsightFixtureTestCase {
  public void testListTemplates() {
    doTest();
  }

  public void testListTemplatesWithPrefix() {
    doTest();
  }

  private void doTest() {
    myFixture.configureByFile(getTestName(true) + ".java");
    new ListTemplatesHandler().invoke(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile());
    LookupElement[] elements = myFixture.getLookupElements();
    assertNotNull(elements);

    LookupElement targetElement = null;
    for (LookupElement element : elements) {
      if (element.getLookupString().equals(".not")) {
        targetElement = element;
      }
    }
    assertNotNull(targetElement);
    myFixture.getLookup().setCurrentItem(targetElement);
    myFixture.finishLookup(Lookup.NORMAL_SELECT_CHAR);
    myFixture.checkResultByFile(getTestName(true) + "_after.java");
  }

  @Override
  protected String getBasePath() {
    return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/template/postfix/listTemplates";
  }
}
