blob: b0d93afa069177ca22a3659515ec9e1257d00312 [file] [log] [blame]
package com.intellij.ide.fileTemplates
import com.intellij.ide.fileTemplates.impl.CustomFileTemplate
import com.intellij.ide.fileTemplates.impl.FileTemplateTestUtil
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ex.PathManagerEx
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.JavaDirectoryService
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiManager
import com.intellij.testFramework.IdeaTestCase
import com.intellij.testFramework.PsiTestUtil
import com.intellij.util.properties.EncodingAwareProperties
public class FileTemplatesTest extends IdeaTestCase {
private File myTestConfigDir;
@Override
protected void tearDown() throws Exception {
super.tearDown();
if (myTestConfigDir !=null && myTestConfigDir.exists()) {
FileUtil.delete(myTestConfigDir);
}
}
public void testAllTemplates() throws Exception {
final File testsDir = new File(PathManagerEx.getTestDataPath()+"/ide/fileTemplates");
final String includeTemplateName = "include1.inc";
final String includeTemplateExtension = "txt";
final String customIncludeFileName = includeTemplateName + "." + includeTemplateExtension;
final File customInclude = new File(testsDir, customIncludeFileName);
final String includeText = FileUtil.loadFile(customInclude, FileTemplate.ourEncoding);
final FileTemplateManager templateManager = FileTemplateManager.getInstance();
final ArrayList<FileTemplate> originalIncludes = new ArrayList<FileTemplate>(Arrays.asList(templateManager.getAllPatterns()));
try {
// configure custom include
final List<FileTemplate> allIncludes = new ArrayList<FileTemplate>(originalIncludes);
final CustomFileTemplate custom = new CustomFileTemplate(includeTemplateName, includeTemplateExtension);
custom.setText(includeText);
allIncludes.add(custom);
templateManager.setTemplates(FileTemplateManager.INCLUDES_TEMPLATES_CATEGORY, allIncludes);
final String txt = ".txt";
File[] children = testsDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".out"+txt);
}
});
assertTrue(children.length > 0);
for (File resultFile : children) {
String name = resultFile.getName();
String base = name.substring(0, name.length() - txt.length() - ".out".length());
File propFile = new File(resultFile.getParent(), base + ".prop" + txt);
File inFile = new File(resultFile.getParent(), base + txt);
String inputText = FileUtil.loadFile(inFile, FileTemplate.ourEncoding);
String outputText = FileUtil.loadFile(resultFile, FileTemplate.ourEncoding);
EncodingAwareProperties properties = new EncodingAwareProperties();
properties.load(propFile, FileTemplate.ourEncoding);
System.out.println(resultFile.getName());
doTestTemplate(inputText, properties, outputText, resultFile.getParent());
}
}
finally {
templateManager.setTemplates(FileTemplateManager.INCLUDES_TEMPLATES_CATEGORY, originalIncludes);
}
}
private static void doTestTemplate(String inputString, Properties properties, String expected, String dir) throws Exception {
inputString = StringUtil.convertLineSeparators(inputString);
expected = StringUtil.convertLineSeparators(expected);
final String result = FileTemplateUtil.mergeTemplate(properties, inputString, false);
assertEquals(expected, result);
List attrs = Arrays.asList(FileTemplateUtil.calculateAttributes(inputString, new Properties(), false));
assertTrue(properties.size() <= attrs.size());
Enumeration e = properties.propertyNames();
while (e.hasMoreElements()) {
String s = (String)e.nextElement();
assertTrue("Attribute '" + s + "' not found in properties", attrs.contains(s));
}
}
public void testFindFileByUrl() throws Exception {
FileTemplate catchBodyTemplate = FileTemplateManager.getInstance().getCodeTemplate(JavaTemplateUtil.TEMPLATE_CATCH_BODY);
assertNotNull(catchBodyTemplate);
}
public void "test collect undefined attribute names"() {
FileTemplate template = addTestTemplate("myclass", '${ABC} ${DEF} ${NAME}')
Properties properties = new Properties()
properties.NAME = 'zzz'
assert template.getUnsetAttributes(properties) as Set == ['ABC', 'DEF'] as Set
}
public void "test collect undefined attribute names from included templates"() {
def included = addTestTemplate("included", '${ABC} ${DEF}')
assert included == FileTemplateManager.instance.getTemplate("included.java")
FileTemplate template = addTestTemplate("myclass", '#parse("included.java") ${DEF} ${NAME}')
Properties properties = new Properties()
properties.NAME = 'zzz'
assert template.getUnsetAttributes(properties) as Set == ['ABC', 'DEF'] as Set
}
public void testDefaultPackage() throws Exception {
String name = "myclass";
FileTemplate template = addTestTemplate(name, 'package ${PACKAGE_NAME}; public class ${NAME} {}')
File temp = FileUtil.createTempDirectory(getTestName(true), "");
myFilesToDelete.add(temp);
final VirtualFile tempDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(temp);
PsiTestUtil.addSourceRoot(getModule(), tempDir);
VirtualFile sourceRoot = ModuleRootManager.getInstance(getModule()).getSourceRoots()[0];
PsiDirectory psiDirectory = PsiManager.getInstance(getProject()).findDirectory(sourceRoot);
PsiClass psiClass = JavaDirectoryService.getInstance().createClass(psiDirectory, "XXX", name);
assertNotNull(psiClass);
assertEquals("public class XXX {\n}", psiClass.getContainingFile().getText());
FileTemplateManager.getInstance().removeTemplate(template);
}
private FileTemplate addTestTemplate(String name, String text) {
FileTemplate template = FileTemplateManager.getInstance().addTemplate(name, "java");
disposeOnTearDown({ FileTemplateManager.getInstance().removeTemplate(template) } as Disposable)
template.setText(text);
template
}
public void doTestSaveLoadTemplate(String name, String ext) {
FileTemplateTestUtil.TestFTManager templateManager = new FileTemplateTestUtil.TestFTManager("test", "testTemplates",
getTestConfigRoot());
FileTemplate template = templateManager.addTemplate(name, ext);
String qName = template.getQualifiedName();
templateManager.saveTemplates();
templateManager.removeTemplate(qName);
FileTemplateTestUtil.loadCustomizedContent(templateManager);
FileTemplate loadedTemplate = templateManager.findTemplateByName(name);
assertNotNull("Template '" + qName + "' was not found", loadedTemplate);
assertEquals(name, loadedTemplate.getName());
assertEquals(ext, loadedTemplate.getExtension());
assertTrue(template != loadedTemplate);
}
private File getTestConfigRoot() throws Exception {
if (myTestConfigDir == null) {
myTestConfigDir = FileUtil.createTempDirectory(getTestName(true), "config");
}
return myTestConfigDir;
}
public void testSaveLoadCustomTemplate() throws Exception {
doTestSaveLoadTemplate("name", "ext");
}
public void testSaveLoadCustomTemplateDottedName() throws Exception {
doTestSaveLoadTemplate("name.has.dots", "ext");
}
public void testSaveLoadCustomTemplateDottedExt() throws Exception {
doTestSaveLoadTemplate("name", "ext.has.dots");
}
}