package junit.extensions.eclipse.quick;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestingPair {
private List namingRules = new ArrayList();
public void addNamingRule(String rule) {
namingRules.add(rule);
}
public void clearNamingRules() {
namingRules.clear();
}
public String[] getPairClassNames(String className) {
Set result = new LinkedHashSet();
className = chopInnerClassName(className);
addTestedClassNames(className, result);
if (result.isEmpty()) {
addTestClassNames(className, result);
}
return (String[]) result.toArray(new String[result.size()]);
}
private void addTestedClassNames(String className, Set result) {
for (int i = 0; i < namingRules.size(); ++i) {
String testedClassName = getTestedClassName(className, (String) namingRules.get(i));
if (testedClassName != null)
result.add(testedClassName);
}
}
private String escapeAllChars(String str) {
// ���K�\���̓��ꕶ��
final String escapeChars = "\\${}?+.[]-()><!|^:=*&,";
StringBuffer buf = new StringBuffer();
for (int i = 0; i < str.length(); ++i) {
char c = str.charAt(i);
if (escapeChars.indexOf(c) != -1)
buf.append('\\');
buf.append(c);
}
return buf.toString();
}
private String getTestedClassName(String className, String namingRule) {
int index = className.lastIndexOf('.');
// ���K�\���Ŗ��̂��镶�������ׂăG�X�P�[�v���Ă���
namingRule = escapeAllChars(namingRule);
if (index == -1) {
// �f�t�H���g�p�b�P�[�W�̏ꍇ�D
// $, {, }�̕����̓G�X�P�[�v����Ă��邽�߁C\$, \{, \} �ƕϊ�����Ă���D
// ���������āC�����ɖ��ߍ��ޏꍇ�́C \$ => \\\\\\$, \{ => \\\\\\{
// �ȂǂƂ��Ȃ���Ȃ�Ȃ��D
namingRule = namingRule.replaceAll("\\\\\\$\\\\\\{package\\\\\\}\\\\\\.", "");
namingRule = namingRule.replaceAll("\\\\\\$\\\\\\{type\\\\\\}", "(\\\\w+)");
Pattern p = Pattern.compile(namingRule);
Matcher m = p.matcher(className);
if (m.matches()) {
return m.group(1);
}
} else {
namingRule = namingRule.replaceAll("\\\\\\$\\\\\\{package\\\\\\}\\\\\\.", "(?:([\\\\w\\\\.]+)\\\\.)?");
Pattern p = Pattern.compile(namingRule.replaceAll("\\\\\\$\\\\\\{type\\\\\\}", "(\\\\w+)"));
Matcher m = p.matcher(className);
if (m.matches()) {
if (m.group(1) == null)
return m.group(2);
else
return m.group(1) + "." + m.group(2);
}
}
return null;
}
private void addTestClassNames(String className, Set result) {
String packageName, typeName;
int index = className.lastIndexOf('.');
if (index != -1) {
typeName = className.substring(index + 1);
packageName = className.substring(0, index);
} else {
typeName = className;
packageName = null;
}
for (int i = 0; i < namingRules.size(); ++i) {
result.add(getTestClassName(packageName, typeName, (String) namingRules.get(i)));
}
}
private String getTestClassName(String packageName, String typeName, String namingRule) {
String result = new String(namingRule);
if (packageName != null) {
result = result.replaceAll("\\$\\{package\\}", packageName);
} else {
result = result.replaceAll("\\$\\{package\\}\\.", "");
}
return result.replaceAll("\\$\\{type\\}", typeName);
}
private String chopInnerClassName(String className) {
int index = className.indexOf('$');
if (index == -1)
return className;
return className.substring(0, index);
}
}