/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.parser.prettyprinter; import java.io.File; import java.io.IOException; import org.python.pydev.parser.PyParserTestBase; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.prettyprinterv2.IPrettyPrinterPrefs; import org.python.pydev.parser.prettyprinterv2.MakeAstValidForPrettyPrintingVisitor; import org.python.pydev.parser.prettyprinterv2.PrettyPrinterPrefsV2; import org.python.pydev.parser.prettyprinterv2.PrettyPrinterV2; import org.python.pydev.parser.visitors.comparator.DifferException; import org.python.pydev.parser.visitors.comparator.SimpleNodeComparator; import com.aptana.shared_core.io.FileUtils; public class AbstractPrettyPrinterTestBase extends PyParserTestBase { public static boolean DEBUG = false; protected IPrettyPrinterPrefs prefs; @Override protected void setUp() throws Exception { super.setUp(); prefs = new PrettyPrinterPrefsV2("\n", " ", versionProvider); } public SimpleNode checkPrettyPrintEqual(String s, String expected) throws Error { return checkPrettyPrintEqual(s, prefs, expected, expected, expected); } public SimpleNode checkPrettyPrintEqual(String s, String expected, String v2) throws Error { return checkPrettyPrintEqual(s, prefs, expected, v2, v2); } public SimpleNode checkPrettyPrintEqual(String s, String expected, String v2, String v3) throws Error { return checkPrettyPrintEqual(s, prefs, expected, v2, v3); } public SimpleNode checkPrettyPrintEqual(String s) throws Error { return checkPrettyPrintEqual(s, s); } /** * @param s * @return * @throws Exception * @throws IOException */ public static SimpleNode checkPrettyPrintEqual(String s, IPrettyPrinterPrefs prefs, String withLinesAndCols, String withoutSpecials, String scrambledLines) throws Error { SimpleNode node = parseLegalDocStr(s); //Scramble the lines/columns SimpleNode copy = node.createCopy(); MessLinesAndColumnsVisitor messLinesAndColumnsVisitor = new MessLinesAndColumnsVisitor(); try { copy.accept(messLinesAndColumnsVisitor); MakeAstValidForPrettyPrintingVisitor.makeValid(copy); } catch (Exception e) { throw new RuntimeException(e); } assertEquals(scrambledLines, makePrint(prefs, copy)); //Without specials: When creating a copy, the specials won't go along. assertEquals(withoutSpecials, makePrint(prefs, node.createCopy())); //Regular assertEquals(withLinesAndCols, makePrint(prefs, node)); return node; } /** * @param prefs * @param node * @return * @throws Exception */ public static String makePrint(IPrettyPrinterPrefs prefs, SimpleNode node) throws Error { PrettyPrinterV2 printer = new PrettyPrinterV2(prefs); String result = ""; try { result = printer.print(node); } catch (Exception e) { throw new RuntimeException(e); } if (DEBUG) { System.out.println("\n\nResult:\n"); System.out.println("'" + result + "'"); // System.out.println("'"+result.replace(' ', '.').replace('\t', '^')+"'"); } return result; } /** * @param file * @throws Exception */ protected void parseAndReparsePrettyPrintedFilesInDir(File file) throws Exception { assertTrue("Dir does not exist: " + file, file.exists()); assertTrue(file.isDirectory()); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { File f = files[i]; parseAndPrettyPrintFile(f); } } protected void parseAndPrettyPrintFile(File f) throws Error, Exception { String lowerCase = f.getAbsolutePath().toLowerCase(); if (lowerCase.endsWith(".py")) { SimpleNode original = parseLegalDocStr(FileUtils.getFileContents(f), f); if (original == null) { fail("Error\nUnable to generate the AST for the file:" + f); } String result = null; SimpleNode node = null; try { result = PrettyPrinterTest.makePrint(prefs, original); node = parseLegalDocStr(result); } catch (Throwable e) { printErrorAndFail(f, original, result, e); } makeCompare(f, original, node); String result2 = null; SimpleNode nodePrintingWithoutSpecials = null; try { //Ok, first print done... go on and create a version without the specials. SimpleNode node2 = node.createCopy(); result2 = PrettyPrinterTest.makePrint(prefs, node2); nodePrintingWithoutSpecials = parseLegalDocStr(result2); } catch (Throwable e) { printErrorAndFail(f, original, result2, e); } makeCompare(f, original, nodePrintingWithoutSpecials); } } private void makeCompare(File f, SimpleNode original, SimpleNode node) throws Exception { SimpleNodeComparator comparator = new SimpleNodeComparator(); try { comparator.compare(original, node); } catch (DifferException e) { System.out.println("Compare did not suceed:" + f); } } private void printErrorAndFail(File f, SimpleNode original, String result2, Throwable e) { System.out.println("\n\n\n----------------- Initial contents:-------------------------\n"); System.out.println(original); System.out.println("\n\n--------------Pretty-printed contents:------------------\n"); System.out.println(result2); System.out.println("\n\n\n"); System.out.println("File: " + f); e.printStackTrace(); fail("Error\nUnable to pretty-print regenerated file:" + f); } }