diff --git a/.project b/.project
index 58fdfb2edfa4..88756880f282 100644
--- a/.project
+++ b/.project
@@ -10,15 +10,9 @@
-
- com.architexa.diagrams.jdt.builder.AtxaJDTBuilder
-
-
-
org.eclipse.jdt.core.javanature
org.eclipse.team.cvs.core.cvsnature
- com.architexa.diagrams.jdt.builder.AtxaJDTBuilderProjectNature
diff --git a/doc/ReleaseNotes4.7.txt b/doc/ReleaseNotes4.7.txt
index 23d13efba85e..6613050ad6b8 100644
--- a/doc/ReleaseNotes4.7.txt
+++ b/doc/ReleaseNotes4.7.txt
@@ -3,8 +3,51 @@
### Interceptors ###
- Interceptors allow very flexible addition or redefinition of the behavior
- of each test method in a test class. For example, this class will
- keep a log of each passing and failing test:
+ of each test method in a test class. Testers can reuse or extend one of the
+ provided Interceptors below, or write their own.
+
+- The TemporaryFolder Interceptor allows creation of files and folders
+ that are guaranteed to be deleted when the test method finishes
+ (whether it passes or fails):
+
+ public static class HasTempFolder {
+ @Interceptor
+ public TemporaryFolder folder= new TemporaryFolder();
+
+ @Test
+ public void testUsingTempFolder() throws IOException {
+ File createdFile= folder.newFile("myfile.txt");
+ File createdFolder= folder.newFolder("subfolder");
+ // ...
+ }
+ }
+
+- ExternalResource is a base class for Interceptors (like TemporaryFolder)
+ that set up an external resource before a test (a file, socket, server,
+ database connection, etc.), and tear it down afterward:
+
+ public static class UsesExternalResource {
+ @Interceptor public ExternalResource resource = new ExternalResource() {
+ @Override
+ protected void before() throws Throwable {
+ callSequence += "before ";
+ };
+
+ @Override
+ protected void after() {
+ callSequence += "after ";
+ };
+ };
+
+ @Test public void testFoo() {
+ callSequence += "test ";
+ }
+ }
+
+- TestWatchman is a base class for Interceptors that take note
+ of the testing action, without modifying it.
+ For example, this class will keep a log of each passing and failing
+ test:
public static class WatchmanTest {
private static String watchedLog;
diff --git a/src/main/java/org/junit/experimental/interceptor/ExternalResource.java b/src/main/java/org/junit/experimental/interceptor/ExternalResource.java
new file mode 100644
index 000000000000..d2a802cc01dd
--- /dev/null
+++ b/src/main/java/org/junit/experimental/interceptor/ExternalResource.java
@@ -0,0 +1,32 @@
+package org.junit.experimental.interceptor;
+
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
+
+public class ExternalResource implements StatementInterceptor {
+ public final Statement intercept(final Statement base, FrameworkMethod method) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ // TODO (Jun 3, 2009 11:49:23 PM): should we replicate
+ // @Before/@After semantics?
+ // 1. after() run even if before() fails.
+ // 2. exception in after() _adds_ to failure in base.
+ before();
+ try {
+ base.evaluate();
+ } finally {
+ after();
+ }
+ }
+ };
+ }
+
+ protected void before() throws Throwable {
+ // do nothing
+ }
+
+ protected void after() {
+ // do nothing
+ }
+}
diff --git a/src/main/java/org/junit/experimental/interceptor/TemporaryFolder.java b/src/main/java/org/junit/experimental/interceptor/TemporaryFolder.java
new file mode 100644
index 000000000000..bd1878f65d4a
--- /dev/null
+++ b/src/main/java/org/junit/experimental/interceptor/TemporaryFolder.java
@@ -0,0 +1,56 @@
+/**
+ *
+ */
+package org.junit.experimental.interceptor;
+
+import java.io.File;
+import java.io.IOException;
+
+public class TemporaryFolder extends ExternalResource {
+ private File folder;
+
+ @Override
+ protected void before() throws Throwable {
+ create();
+ }
+
+ @Override
+ protected void after() {
+ delete();
+ }
+
+ // testing purposes only
+ public void create() throws IOException {
+ folder= File.createTempFile("junit", "");
+ folder.delete();
+ folder.mkdir();
+ }
+
+ public File newFile(String fileName) throws IOException {
+ File file= new File(folder, fileName);
+ file.createNewFile();
+ return file;
+ }
+
+ public File newFolder(String folderName) {
+ File file= new File(folder, folderName);
+ file.mkdir();
+ return file;
+ }
+
+ public File getRoot() {
+ return folder;
+ }
+
+ public void delete() {
+ recursiveDelete(folder);
+ }
+
+ private void recursiveDelete(File file) {
+ File[] files= file.listFiles();
+ if (files != null)
+ for (File each : files)
+ recursiveDelete(each);
+ file.delete();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/org/junit/tests/AllTests.java b/src/test/java/org/junit/tests/AllTests.java
index 34cac3c0661a..ec4f4d691cf4 100644
--- a/src/test/java/org/junit/tests/AllTests.java
+++ b/src/test/java/org/junit/tests/AllTests.java
@@ -16,8 +16,10 @@
import org.junit.tests.experimental.ExperimentalTests;
import org.junit.tests.experimental.MatcherTest;
import org.junit.tests.experimental.interceptor.ExpectedExceptionInterceptorTest;
+import org.junit.tests.experimental.interceptor.ExternalResourceInterceptorTest;
import org.junit.tests.experimental.interceptor.InterceptorTest;
import org.junit.tests.experimental.interceptor.NameInterceptorTest;
+import org.junit.tests.experimental.interceptor.TempFolderInterceptorTest;
import org.junit.tests.experimental.interceptor.TimeoutInterceptorTest;
import org.junit.tests.experimental.max.JUnit38SortingTest;
import org.junit.tests.experimental.max.MaxComputerTest;
@@ -127,7 +129,9 @@
ParallelMethodTest.class,
ParentRunnerTest.class,
NameInterceptorTest.class,
- ExpectedExceptionInterceptorTest.class
+ ExpectedExceptionInterceptorTest.class,
+ TempFolderInterceptorTest.class,
+ ExternalResourceInterceptorTest.class
})
public class AllTests {
public static Test suite() {
diff --git a/src/test/java/org/junit/tests/experimental/interceptor/ExternalResourceInterceptorTest.java b/src/test/java/org/junit/tests/experimental/interceptor/ExternalResourceInterceptorTest.java
new file mode 100644
index 000000000000..ee7685045ddf
--- /dev/null
+++ b/src/test/java/org/junit/tests/experimental/interceptor/ExternalResourceInterceptorTest.java
@@ -0,0 +1,37 @@
+package org.junit.tests.experimental.interceptor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.experimental.results.PrintableResult.testResult;
+import static org.junit.experimental.results.ResultMatchers.isSuccessful;
+import org.junit.Test;
+import org.junit.experimental.interceptor.ExternalResource;
+import org.junit.experimental.interceptor.Interceptor;
+
+public class ExternalResourceInterceptorTest {
+ private static String callSequence;
+
+ public static class UsesExternalResource {
+ @Interceptor public ExternalResource resource = new ExternalResource() {
+ @Override
+ protected void before() throws Throwable {
+ callSequence += "before ";
+ };
+
+ @Override
+ protected void after() {
+ callSequence += "after ";
+ };
+ };
+
+ @Test public void testFoo() {
+ callSequence += "test ";
+ }
+ }
+
+ @Test public void externalResourceGeneratesCorrectSequence() {
+ callSequence= "";
+ assertThat(testResult(UsesExternalResource.class), isSuccessful());
+ assertEquals("before test after ", callSequence);
+ }
+}
diff --git a/src/test/java/org/junit/tests/experimental/interceptor/TempFolderInterceptorTest.java b/src/test/java/org/junit/tests/experimental/interceptor/TempFolderInterceptorTest.java
new file mode 100644
index 000000000000..70ee1de8b33a
--- /dev/null
+++ b/src/test/java/org/junit/tests/experimental/interceptor/TempFolderInterceptorTest.java
@@ -0,0 +1,71 @@
+package org.junit.tests.experimental.interceptor;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.experimental.results.PrintableResult.testResult;
+import static org.junit.experimental.results.ResultMatchers.isSuccessful;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+import org.junit.experimental.interceptor.Interceptor;
+import org.junit.experimental.interceptor.TemporaryFolder;
+
+public class TempFolderInterceptorTest {
+ private static File createdFile;
+
+ public static class HasTempFolder {
+ @Interceptor
+ public TemporaryFolder folder= new TemporaryFolder();
+
+ @Test
+ public void testUsingTempFolder() throws IOException {
+ createdFile= folder.newFile("myfile.txt");
+ assertTrue(createdFile.exists());
+ }
+ }
+
+ @Test
+ public void tempFolderIsDeleted() {
+ assertThat(testResult(HasTempFolder.class), isSuccessful());
+ assertFalse(createdFile.exists());
+ }
+
+ public static class CreatesSubFolder {
+ @Interceptor
+ public TemporaryFolder folder= new TemporaryFolder();
+
+ @Test
+ public void testUsingTempFolder() throws IOException {
+ createdFile= folder.newFolder("subfolder");
+ new File(createdFile, "a.txt").createNewFile();
+ assertTrue(createdFile.exists());
+ }
+ }
+
+ @Test
+ public void subFolderIsDeleted() {
+ assertThat(testResult(CreatesSubFolder.class), isSuccessful());
+ assertFalse(createdFile.exists());
+ }
+
+ @Test
+ public void recursiveDeleteFolderWithOneElement() throws IOException {
+ TemporaryFolder folder= new TemporaryFolder();
+ folder.create();
+ File file= folder.newFile("a");
+ folder.delete();
+ assertFalse(file.exists());
+ assertFalse(folder.getRoot().exists());
+ }
+
+ @Test
+ public void recursiveDeleteFolderWithZeroElements() throws IOException {
+ TemporaryFolder folder= new TemporaryFolder();
+ folder.create();
+ folder.delete();
+ assertFalse(folder.getRoot().exists());
+ }
+}
\ No newline at end of file