package org.fandev.lang.parser; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import junit.framework.Assert; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.fail; import org.fandev.lang.BaseFanTest; import org.fandev.lang.ParsingResult; import org.fandev.lang.ResultStatusCode; import org.fandev.lang.fan.psi.api.statements.typeDefs.FanClassDefinition; import org.fandev.lang.fan.psi.impl.statements.typedefs.FanClassDefinitionImpl; import org.junit.Before; import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; /** * @author Dror Bereznitsky Date: Jan 13, 2009 Time: 10:20:12 AM */ public class TestParser extends BaseFanTest { @Before public void setUp() { setupProject(); } @Test public void testHelloWorld() throws Throwable { final File file = new File("example/src/HelloWorld.fan"); System.out.println("Trying to parse file: " + file.getAbsolutePath()); final PsiFile psiFile = parseWithNoTimeout(readFile(file)); for (final PsiElement element : psiFile.getChildren()) { if (element instanceof FanClassDefinitionImpl) { final FanClassDefinition classDef = (FanClassDefinition) element; assertEquals("HelloWorld", classDef.getName()); assertEquals(2, classDef.getSlots().length); assertEquals(1, classDef.getFields().length); assertEquals(1, classDef.getMethods().length); return; } } fail("Psi tree does not contain a class definition element"); } @Test public void testSingleFile() throws Throwable { final File file = new File("../fan-1.0/src/flux/flux/fan/Commands.fan"); System.out.println("Trying to parse file: " + file.getAbsolutePath()); // Hijacking the system.err to avoid the long psi error messages System.setErr(new PrintStream(new ByteArrayOutputStream())); final PsiFile psiFile = parseWithNoTimeout(readFile(file)); if (psiFile == null) { Assert.assertFalse("[Error] Failed parsing file (timeout): " + file.getAbsolutePath(), true); } else { Assert.assertEquals("Error elements in " + file.getAbsolutePath(), 0, visitErrorElements(psiFile)); System.out.println("Parsed file: " + file.getAbsolutePath()); } } @Test public void testAllCompilerFiles() throws Throwable { final FileFilter fileFilter = new FileFilter() { public boolean accept(final File pathname) { return true; } }; parseAllFilesInFilter(fileFilter); } @Test public void testAllPodFiles() throws Throwable { final FileFilter fileFilter = new FileFilter() { public boolean accept(final File pathname) { return pathname.isDirectory() || pathname.getName().equals("pod.fan"); } }; parseAllFilesInFilter(fileFilter); } private void parseAllFilesInFilter(final FileFilter fileFilter) throws Throwable { // Hijacking the system.err to avoid the long psi error messages System.setErr(new PrintStream(new ByteArrayOutputStream())); final File dir = new File("../fan-1.0/src"); final List<ParsingResult> results = new ArrayList<ParsingResult>(); parseAllInDir(dir, fileFilter, results); int nbErrors = 0; for (final ParsingResult result : results) { if (result.status != ResultStatusCode.OK) { nbErrors++; System.out.println("File: " + result.fileName + " Error [" + result.status + "] " + result.errorMsg); } } System.out.println("Ratio " + nbErrors + "/" + results.size() + " " + (nbErrors * 100 / results.size()) + "%"); Assert.assertEquals(0, nbErrors); } }