blob: b6aa969e086d641aeed2a9c376f46bd9ae2e5625 [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.openapi.util.TextRange;
import junit.framework.TestCase;
import java.util.List;
import static com.jetbrains.python.inspections.PyStringFormatParser.*;
/**
* @author yole
*/
public class PyStringFormatParserTest extends TestCase {
public void testSimple() {
List<FormatStringChunk> chunks = parsePercentFormat("abc");
assertEquals(1, chunks.size());
assertConstant(chunks.get(0), 0, 3);
}
private static void assertConstant(FormatStringChunk aChunk, final int start, final int end) {
ConstantChunk chunk = (ConstantChunk) aChunk;
assertEquals(start, chunk.getStartIndex());
assertEquals(end, chunk.getEndIndex());
}
public void testDoublePercent() {
List<FormatStringChunk> chunks = parsePercentFormat("abc%%def");
assertEquals(1, chunks.size());
assertConstant(chunks.get(0), 0, 8);
}
public void testFormat() {
List<FormatStringChunk> chunks = parsePercentFormat("%s");
assertEquals(1, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals(0, chunk.getStartIndex());
assertEquals(2, chunk.getEndIndex());
assertEquals('s', chunk.getConversionType());
}
public void testSubstitutionAfterFormat() {
List<FormatStringChunk> chunks = parsePercentFormat("Hello, %s");
assertEquals(2, chunks.size());
assertConstant(chunks.get(0), 0, 7);
}
public void testMappingKey() {
List<FormatStringChunk> chunks = parsePercentFormat("%(language)s");
assertEquals(1, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals("language", chunk.getMappingKey());
assertEquals('s', chunk.getConversionType());
}
public void testConversionFlags() {
List<FormatStringChunk> chunks = parsePercentFormat("%#0d");
assertEquals(1, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals("#0", chunk.getConversionFlags());
}
public void testWidth() {
List<FormatStringChunk> chunks = parsePercentFormat("%345d");
assertEquals(1, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals("345", chunk.getWidth());
}
public void testPrecision() {
List<FormatStringChunk> chunks = parsePercentFormat("%.2d");
assertEquals(1, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals("2", chunk.getPrecision());
}
public void testLengthModifier() {
List<FormatStringChunk> chunks = parsePercentFormat("%ld");
assertEquals(1, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals('l', chunk.getLengthModifier());
}
public void testDoubleAsterisk() {
List<FormatStringChunk> chunks = parsePercentFormat("%**d");
assertEquals(2, chunks.size());
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals(2, chunk.getEndIndex());
assertEquals('\0', chunk.getConversionType());
}
public void testUnclosedMapping() {
List<FormatStringChunk> chunks = parsePercentFormat("%(name1s");
SubstitutionChunk chunk = (SubstitutionChunk) chunks.get(0);
assertEquals("name1s", chunk.getMappingKey());
assertTrue(chunk.isUnclosedMapping());
}
// PY-8372
public void testNewStyleAutomaticNumbering() {
final List<SubstitutionChunk> chunks = filterSubstitutions(parseNewStyleFormat("{}, {}"));
assertEquals(2, chunks.size());
assertEquals(TextRange.create(0, 2), chunks.get(0).getTextRange());
assertEquals(TextRange.create(4, 6), chunks.get(1).getTextRange());
}
// PY-8372
public void testNewStylePositionalArgs() {
final List<SubstitutionChunk> chunks = filterSubstitutions(parseNewStyleFormat("{1}, {0}"));
assertEquals(2, chunks.size());
assertEquals(TextRange.create(0, 3), chunks.get(0).getTextRange());
assertEquals(TextRange.create(5, 8), chunks.get(1).getTextRange());
}
// PY-8372
public void testNewStyleKeywordArgs() {
final List<SubstitutionChunk> chunks = filterSubstitutions(parseNewStyleFormat("a{foo}{bar}bc"));
assertEquals(2, chunks.size());
assertEquals(TextRange.create(1, 6), chunks.get(0).getTextRange());
assertEquals(TextRange.create(6, 11), chunks.get(1).getTextRange());
}
// PY-8372
public void testBracesEscaping() {
final List<SubstitutionChunk> chunks = filterSubstitutions(parseNewStyleFormat("\\{\\}, {{}}"));
assertEquals(1, chunks.size());
assertEquals(TextRange.create(1, 4), chunks.get(0).getTextRange());
}
public void testNewStyleConstant() {
List<FormatStringChunk> chunks = parseNewStyleFormat("a");
assertEquals(1, chunks.size());
assertConstant(chunks.get(0), 0, 1);
}
public void testNewStyleUnbalanced() {
final List<FormatStringChunk> chunks = parseNewStyleFormat("{{{foo}}");
assertEquals(2, chunks.size());
}
public void testNewStyleEscapingAndValue() {
final List<FormatStringChunk> chunks = parseNewStyleFormat("{{{foo}}}");
assertEquals(3, chunks.size());
assertEquals(TextRange.create(0, 2), chunks.get(0).getTextRange());
assertEquals(TextRange.create(2, 7), chunks.get(1).getTextRange());
assertEquals(TextRange.create(7, 9), chunks.get(2).getTextRange());
}
}