/******************************************************************************* * Copyright (c) 2010 Red Hat Inc. 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 *******************************************************************************/ package org.eclipse.linuxtools.changelog.core.tests; import static org.junit.Assert.*; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Calendar; import java.util.GregorianCalendar; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.ui.IEditorPart; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.eclipse.linuxtools.changelog.core.IFormatterChangeLogContrib; import org.eclipse.linuxtools.changelog.tests.fixtures.ChangeLogTestProject; import org.eclipse.linuxtools.changelog.tests.helpers.EditorHelper; import org.eclipse.linuxtools.internal.changelog.core.ChangeLogWriter; import org.eclipse.linuxtools.internal.changelog.core.formatters.GNUFormat; /** * @author Severin Gehwolf <sgehwolf@redhat.com> * */ public class ChangeLogWriterTest { // The instance of the class under test private ChangeLogWriter clogWriter; // A fake project private ChangeLogTestProject project; // the path elements to the ChangeLog file, absolute to the project root private final String CHANGELOG_FILE_PATH = "/project-name/src/org/"; private final String CHANGELOG_FILE_NAME = "ChangeLog"; private String changelogFilePath; // IFile handle to '/path/changelog/ChangeLog' private IFile changelogFile; // Current content of the ChangeLog file private final String changeLogContent = "2009-10-14 Some Author <some.author@example.com>\n\n" + "\t* this/file/does/not/really/exist/SpringRoll.java: new file\n\n"; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { clogWriter = new ChangeLogWriter(); // create a testproject and add a file to it project = new ChangeLogTestProject("changelogWriterProject"); // Generate full path to ChangeLog file changelogFilePath = CHANGELOG_FILE_PATH + CHANGELOG_FILE_NAME; // add a ChangeLog file to the project at the path specified by // CHANGELOG_FILE_PATH_SEGMENTS InputStream newFileInputStream = new ByteArrayInputStream( changeLogContent.getBytes()); changelogFile = project.addFileToProject(CHANGELOG_FILE_PATH + CHANGELOG_FILE_NAME, CHANGELOG_FILE_NAME, newFileInputStream); } /** * @throws java.lang.Exception */ @After public void tearDown() throws CoreException { // dispose testproject project.getTestProject().delete(true, null); } /** * Test for setting and getting the content of the ChangeLog * file. */ @Test public void testGetSetChangelog() { // Open the ChangeLog file and get the IEdiorPart final IEditorPart currentContent = EditorHelper.openEditor(changelogFile); clogWriter.setChangelog(currentContent); assertEquals(currentContent, clogWriter.getChangelog()); EditorHelper.closeEditor(currentContent); } @Test public void testGetSetChangelogLocation() { final String path = "/path/to/changelog/file/ChangeLog"; clogWriter.setChangelogLocation(path); assertEquals(path, clogWriter.getChangelogLocation()); } @Test public void testGetSetDateLine() { String authorName = "Test Author"; String email = "spongebob@commedycentral.com"; clogWriter.setDateLine(new GNUFormat().formatDateLine( authorName, email)); // Today's date in ISO format Calendar c = new GregorianCalendar(); String isoDate = String.format("%1$tY-%1$tm-%1$td", c); // expected date/author line String expectedDateLine = isoDate + " " + authorName + " <" + email + ">\n\n"; assertEquals(expectedDateLine, clogWriter.getDateLine()); } @Test public void testGetSetEntryFilePath() { final String entryFilePath = "/some/path/to/some/File.java"; clogWriter.setEntryFilePath(entryFilePath); assertEquals(entryFilePath, clogWriter.getEntryFilePath()); } @Test public void testGetSetFormatter() { IFormatterChangeLogContrib formatter = new GNUFormat(); clogWriter.setFormatter(formatter); assertEquals(formatter, clogWriter.getFormatter()); } @Test public void testGetSetGuessedFName() { final String guessedFunctionName = "getInstance"; clogWriter.setGuessedFName(guessedFunctionName); assertEquals(guessedFunctionName, clogWriter.getGuessedFName()); } /** * Note that there can be several Changelogs inside a directory tree. * The {@link ChangeLogWriter#writeChangeLog()} code assumes that the full path to * the ChangeLog file and the full path to the file for which to generate a ChangeLog * entry have the same ancestor (with some potential overlap). * * Consider the following example: * * 1. The ChangeLog file is <project-root>/src/ChangeLog * 2. The currently open editor contains code of <project-root>/src/org/eclipse/example/Test.java * * In the above case entries in <project-root>/src/ChangeLog *should* be of the form: * * <code> * * YYYY-MM-DD Author Name <email@example.com> * * * org/eclipse/example/Test.java: new File * * </code> * * Similarly, if the ChangeLog file is in <project-root>/ChangeLog and the currently open * file is <project-root>/src/org/eclipse/example/Sun.java, generated entries in * <project-root>/ChangeLog would look like (note the "src" path is added in this case): * * <code> * * YYYY-MM-DD Author Name <email@example.com> * * * src/org/eclipse/example/Sun.java: new File * * </code> * * Test for method {@link org.eclipse.linuxtools.internal.changelog.core.ChangeLogWriter#writeChangeLog()} */ @Test public void testWriteChangeLog() throws Exception { // We want paths up to the ChangeLog file to overlap final String pathRelativeToChangeLog = "eclipse/example/test/NewCoffeeMaker.java"; clogWriter.setEntryFilePath( CHANGELOG_FILE_PATH + pathRelativeToChangeLog ); // Will show up surrounded by "(" and ")" in ChangeLog String guessedFunctionName = "bazinga"; clogWriter.setGuessedFName(guessedFunctionName); // set GNU formatter clogWriter.setFormatter(new GNUFormat()); // Open a document and get the IEditorPart IEditorPart editorContent = EditorHelper.openEditor(changelogFile); clogWriter.setChangelog(editorContent); // set date/author line String authorName = "Test Author"; String email = "test@example.com"; clogWriter.setDateLine(clogWriter.getFormatter().formatDateLine( authorName, email)); // full absolute path to ChangeLog file (relative to project root) clogWriter.setChangelogLocation(changelogFilePath); // Write changelog to buffer - need to save for persistence clogWriter.writeChangeLog(); // above written content is not persistent yet; save it to make it persistent clogWriter.getChangelog().doSave(null); // Today's date in ISO format Calendar c = new GregorianCalendar(); String isoDate = String.format("%1$tY-%1$tm-%1$td", c); // Construct the changelog entry by hand and match it with what has been written String expectedChangeLogEntry = isoDate + " " + authorName + " <" + email + ">\n\n"; expectedChangeLogEntry += "\t* " + pathRelativeToChangeLog + " (" + guessedFunctionName + "): \n\n"; String expectedContent = expectedChangeLogEntry + changeLogContent; // Read in content written to file StringBuffer actualContent = new StringBuffer(); try (BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(changelogFile.getLocation().toFile())))) { String line; while ((line = br.readLine()) != null) { actualContent.append(line + "\n"); } } // Assert proper content has been added assertEquals(expectedContent, actualContent.toString()); EditorHelper.closeEditor(editorContent); } @Test public void testGetSetDefaultContent() { final String defaultContent = "DISCLAIMER: default ChangeLog content for new files?"; clogWriter.setDefaultContent(defaultContent); assertEquals(defaultContent, clogWriter.getDefaultContent()); } /** * Test the use of default text. * * @throws Exception */ @Test public void canWriteChangeLogToEmptyChangeLogButWithSomeDefaultContent() throws Exception { // set GNU formatter clogWriter.setFormatter(new GNUFormat()); // Open up a new ChangeLog file at newPathToChangeLog with empty content // and get the IEditorPart InputStream newFileInputStream = new ByteArrayInputStream( "".getBytes()); // no content String destinationPath = "/this/is/some/random/path"; IFile emptyChangeLogFile = project.addFileToProject(destinationPath, CHANGELOG_FILE_NAME, newFileInputStream); IEditorPart editorContent = EditorHelper.openEditor(emptyChangeLogFile); clogWriter.setChangelog(editorContent); String authorName = "Test Author"; String email = "test@example.com"; clogWriter.setDateLine(clogWriter.getFormatter().formatDateLine( authorName, email)); clogWriter.setChangelogLocation(destinationPath + "/" + CHANGELOG_FILE_NAME); // Set some default content String defaultContent = "Removed."; clogWriter.setDefaultContent(defaultContent); String relativePathOfChangedFile = "path/to/file/for/new/entry/test.c"; clogWriter.setEntryFilePath( destinationPath + "/" + relativePathOfChangedFile ); clogWriter.setGuessedFName(""); // Write changelog to buffer - need to save for persistence clogWriter.writeChangeLog(); // above written content is not persistent yet; save it to make it persistent clogWriter.getChangelog().doSave(null); // Construct the changelog entry by hand and match it with what has been written String expectedChangeLogEntry = new GNUFormat().formatDateLine(authorName, email); expectedChangeLogEntry += "\t* " + relativePathOfChangedFile + ": " + defaultContent + "\n"; // Read in content written to file StringBuffer actualContent = new StringBuffer(); try (BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(emptyChangeLogFile.getLocation().toFile())))) { String line; while ((line = br.readLine()) != null) { actualContent.append(line + "\n"); } } // Assert proper content has been added assertEquals(expectedChangeLogEntry, actualContent.toString()); EditorHelper.closeEditor(editorContent); } }