/******************************************************************************* * Copyright (c) 2008, 2014 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Institute for Software - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.parser.tests.rewrite.changegenerator; import java.io.IOException; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.model.CoreModelUtil; import org.eclipse.cdt.core.parser.tests.rewrite.TestHelper; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.core.tests.BaseTestFramework; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModification; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModification.ModificationKind; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore; import org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator; import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.ASTCommenter; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.Document; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.TextFileChange; public abstract class ChangeGeneratorTest extends BaseTestFramework { protected ASTModificationStore modStore; protected final ICPPNodeFactory factory = CPPNodeFactory.getDefault(); public ChangeGeneratorTest() { super(); } public ChangeGeneratorTest(String name) { super(name); } @Override protected void setUp() throws Exception { modStore = new ASTModificationStore(); CCorePlugin.getIndexManager().joinIndexer(IIndexManager.FOREVER, new NullProgressMonitor()); super.setUp(); } @Override protected void tearDown() throws Exception { System.gc(); fileManager.closeAllFiles(); super.tearDown(); } protected StringBuilder[] getTestSource(int sections) throws IOException { return TestSourceReader.getContentsForTest(CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections); } protected void compareResult(ASTVisitor visitor) throws Exception { final StringBuilder[] testSources = getTestSource(2); final String source = testSources[0].toString(); final String expected = testSources[1].toString(); final IFile testFile = importFile("source.h", source); //$NON-NLS-1$ CCorePlugin.getIndexManager().reindex(cproject); ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor()); waitForIndexer(cproject); final IASTTranslationUnit unit = CoreModelUtil.findTranslationUnit(testFile).getAST(); final ChangeGenerator changeGenerator = new ChangeGenerator(modStore, ASTCommenter.getCommentedNodeMap(unit)); unit.accept(visitor); changeGenerator.generateChange(unit); final Document doc = new Document(source); for (Change change : ((CompositeChange) changeGenerator.getChange()).getChildren()) { if (change instanceof TextFileChange) { TextFileChange textChange = (TextFileChange) change; textChange.getEdit().apply(doc); } } assertEquals(TestHelper.unifyNewLines(expected), TestHelper.unifyNewLines(doc.get())); } protected ASTModification addModification(ASTModification parentMod, ModificationKind kind, IASTNode targetNode, IASTNode newNode) { ASTModification mod = new ASTModification(kind, targetNode, newNode, null); modStore.storeModification(parentMod, mod); return mod; } }