blob: cce3941866b307e1618753e1a5b2360bbcacf3a0 [file] [log] [blame]
/*
* 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.jetbrains.python;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.jetbrains.python.codeInsight.regexp.PythonRegexpParserDefinition;
import com.jetbrains.python.codeInsight.regexp.PythonVerboseRegexpParserDefinition;
import com.jetbrains.python.fixtures.PyLexerTestCase;
import com.jetbrains.python.fixtures.PyTestCase;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author yole
*/
public class PyRegexpTest extends PyTestCase {
public void testNestedCharacterClasses() { // PY-2908
doTestHighlighting();
}
public void testNestedCharacterClassesLexer() {
doTestLexer("[][]", "CLASS_BEGIN", "CHARACTER", "CHARACTER", "CLASS_END");
}
public void testNestedCharacterClasses2() { // PY-2908
doTestHighlighting();
}
public void testOctal() { // PY-2906
doTestHighlighting();
}
public void testBraceInPythonCharacterClass() { // PY-1929
doTestHighlighting();
}
public void testNegatedBraceInCharacterClass() {
doTestLexer("[^][]", "CLASS_BEGIN", "CARET", "CHARACTER", "CHARACTER", "CLASS_END");
}
public void testDanglingMetacharacters() { // PY-2430
doTestHighlighting();
}
public void testVerbose() {
Lexer lexer = new PythonVerboseRegexpParserDefinition().createLexer(myFixture.getProject());
PyLexerTestCase.doLexerTest("# abc", lexer, "COMMENT", "COMMENT");
}
public void testRedundantEscapeSingleQuote() { // PY-5027
doTestHighlighting();
}
public void testBraceCommaN() { // PY-8304
doTestHighlighting();
}
public void testVerboseAsKwArg() { // PY-8143
doTestHighlighting();
}
public void testVerboseEscapedHash() { // PY-6545
doTestHighlighting();
}
public void _testDoubleOpenCurly() { // PY-8252
doTestHighlighting();
}
public void testReSubNotRegexp() { // PY-11069
doTestHighlighting();
}
public void testSingleStringRegexpAutoInjection() {
doTestInjectedText("import re\n" +
"\n" +
"re.search('<caret>.*bar',\n" +
" 'foobar')\n",
".*bar");
}
// PY-11057
public void testAdjacentStringRegexpAutoInjection() {
doTestInjectedText("import re\n" +
"\n" +
"re.search('<caret>.*()'\n" +
" 'abc',\n" +
" 'foo')\n",
".*()abc");
}
public void testParenthesizedStringRegexpAutoInjection() {
doTestInjectedText("import re\n" +
"\n" +
"re.search((('<caret>foo')), 'foobar')\n",
"foo");
}
public void testConcatStringRegexpAutoInjection() {
doTestInjectedText("import re\n" +
"\n" +
"re.search('<caret>(.*' + 'bar)' + 'baz', 'foobar')\n",
"(.*bar)baz");
}
public void testConcatStringWithValuesRegexpAutoInjection() {
doTestInjectedText("import re\n" +
"\n" +
"def f(x, y):\n" +
" re.search('<caret>.*(' + x + ')' + y, 'foo')\n",
".*(missing_value)missing_value");
}
public void testPercentFormattingRegexpAutoInjection() {
doTestInjectedText("import re \n" +
"\n" +
"def f(x, y):\n" +
" re.search('<caret>.*%s-%d' % (x, y), 'foo')\n",
".*missing_value-missing_value");
}
public void testNewStyleFormattingRegexpAutoInjection() {
doTestInjectedText("import re\n" +
"\n" +
"def f(x, y):\n" +
" re.search('<caret>.*{foo}-{}'.format(x, foo=y), 'foo')\n",
".*missing_value-missing_value");
}
public void testNewStyleFormattingEndsWithConstant() {
doTestInjectedText("import re\n" +
"\n" +
"def f(**kwargs):" +
" re.search('<caret>(foo{bar}baz$)'.format(**kwargs), 'foo')\n",
"(foomissing_valuebaz$)");
}
private void doTestInjectedText(@NotNull String text, @NotNull String expected) {
myFixture.configureByText(PythonFileType.INSTANCE, text);
final InjectedLanguageManager languageManager = InjectedLanguageManager.getInstance(myFixture.getProject());
final PsiLanguageInjectionHost host = languageManager.getInjectionHost(myFixture.getElementAtCaret());
assertNotNull(host);
final List<Pair<PsiElement, TextRange>> files = languageManager.getInjectedPsiFiles(host);
assertNotNull(files);
assertFalse(files.isEmpty());
final PsiElement injected = files.get(0).getFirst();
assertEquals(expected, injected.getText());
}
private void doTestHighlighting() {
myFixture.testHighlighting(true, false, true, "regexp/" + getTestName(true) + ".py");
}
private void doTestLexer(final String text, String... expectedTokens) {
Lexer lexer = new PythonRegexpParserDefinition().createLexer(myFixture.getProject());
PyLexerTestCase.doLexerTest(text, lexer, expectedTokens);
}
}