You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/03/01 14:21:07 UTC

[09/50] [abbrv] incubator-freemarker git commit: Improved TemplateLoader tests a bit.

Improved TemplateLoader tests a bit.


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/2065c579
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/2065c579
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/2065c579

Branch: refs/heads/2.3
Commit: 2065c57993d083efb2fa3e9785e59cc3bc1a7a38
Parents: d661acc
Author: ddekany <dd...@apache.org>
Authored: Sun Feb 5 19:17:53 2017 +0100
Committer: ddekany <dd...@apache.org>
Committed: Sun Feb 5 19:17:53 2017 +0100

----------------------------------------------------------------------
 .../freemarker/cache/TemplateCacheTest.java     |  38 +++-
 .../cache/TemplateNameFormatTest.java           |  16 +-
 .../freemarker/template/ConfigurationTest.java  |  22 +-
 .../template/TemplateLookupStrategyTest.java    | 124 +++++-----
 .../test/MonitoredTemplateLoader.java           | 226 ++++++++++++++++++-
 5 files changed, 338 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2065c579/src/test/java/freemarker/cache/TemplateCacheTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/cache/TemplateCacheTest.java b/src/test/java/freemarker/cache/TemplateCacheTest.java
index b1988b2..417921a 100644
--- a/src/test/java/freemarker/cache/TemplateCacheTest.java
+++ b/src/test/java/freemarker/cache/TemplateCacheTest.java
@@ -19,7 +19,11 @@
 
 package freemarker.cache;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.io.Reader;
@@ -29,12 +33,19 @@ import java.util.Locale;
 import org.hamcrest.Matchers;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+
 import freemarker.core.ParseException;
 import freemarker.template.Configuration;
 import freemarker.template.MalformedTemplateNameException;
 import freemarker.template.Template;
 import freemarker.template.TemplateNotFoundException;
 import freemarker.template.Version;
+import freemarker.test.MonitoredTemplateLoader;
+import freemarker.test.MonitoredTemplateLoader.CloseTemplateSourceEvent;
+import freemarker.test.MonitoredTemplateLoader.FindTemplateSourceEvent;
+import freemarker.test.MonitoredTemplateLoader.GetLastModifiedEvent;
+import freemarker.test.MonitoredTemplateLoader.GetReaderEvent;
 
 public class TemplateCacheTest {
 
@@ -269,7 +280,7 @@ public class TemplateCacheTest {
         Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
         cfg.setLocale(Locale.US);
         
-        StringTemplateLoader tl = new StringTemplateLoader();
+        MonitoredTemplateLoader tl = new MonitoredTemplateLoader();
         tl.putTemplate("utf-8_en.ftl", "<#ftl encoding='utf-8'>Foo");
         tl.putTemplate("utf-8.ftl", "Bar");
         cfg.setTemplateLoader(tl);
@@ -280,17 +291,38 @@ public class TemplateCacheTest {
             assertEquals("utf-8_en.ftl", t.getSourceName());
             assertEquals("Utf-8", t.getEncoding());
             assertEquals("Foo", t.toString());
+            
+            assertEquals(
+                    ImmutableList.of(
+                            new FindTemplateSourceEvent("utf-8_en_US.ftl", false),
+                            new FindTemplateSourceEvent("utf-8_en.ftl", true),
+                            new GetLastModifiedEvent("utf-8_en.ftl"),
+                            new GetReaderEvent("utf-8_en.ftl"), // Attempt 1
+                            new CloseTemplateSourceEvent("utf-8_en.ftl")),                
+                    tl.getEvents());
         }
         
         {
+            tl.clearEvents();
+            
             Template t = cfg.getTemplate("utf-8.ftl", "Utf-16");
             assertEquals("utf-8.ftl", t.getName());
             assertEquals("utf-8_en.ftl", t.getSourceName());
             assertEquals("utf-8", t.getEncoding());
             assertEquals("Foo", t.toString());
+            
+            assertEquals(
+                    ImmutableList.of(
+                            new FindTemplateSourceEvent("utf-8_en_US.ftl", false),
+                            new FindTemplateSourceEvent("utf-8_en.ftl", true),
+                            new GetLastModifiedEvent("utf-8_en.ftl"),
+                            new GetReaderEvent("utf-8_en.ftl"), // Attempt 1
+                            new GetReaderEvent("utf-8_en.ftl"), // Attempt 2
+                            new CloseTemplateSourceEvent("utf-8_en.ftl")),                
+                    tl.getEvents());
         }
     }
-
+    
     @Test
     public void testEncodingSelection() throws IOException {
         Locale hungary = new Locale("hu", "HU"); 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2065c579/src/test/java/freemarker/cache/TemplateNameFormatTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/cache/TemplateNameFormatTest.java b/src/test/java/freemarker/cache/TemplateNameFormatTest.java
index 499e751..d001965 100644
--- a/src/test/java/freemarker/cache/TemplateNameFormatTest.java
+++ b/src/test/java/freemarker/cache/TemplateNameFormatTest.java
@@ -19,9 +19,11 @@
 
 package freemarker.cache;
 
-import static freemarker.test.hamcerst.Matchers.*;
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
+import static freemarker.test.hamcerst.Matchers.containsStringIgnoringCase;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.util.Locale;
@@ -241,8 +243,8 @@ public class TemplateNameFormatTest {
                             "foo\\bar_en_US.ftl",
                             "foo\\bar_en.ftl",
                             name),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
         }
 
         try {
@@ -255,8 +257,8 @@ public class TemplateNameFormatTest {
                             "foo\\missing_en_US.ftl",
                             "foo\\missing_en.ftl",
                             "foo\\missing.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2065c579/src/test/java/freemarker/template/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/template/ConfigurationTest.java b/src/test/java/freemarker/template/ConfigurationTest.java
index 585940a..2cba054 100644
--- a/src/test/java/freemarker/template/ConfigurationTest.java
+++ b/src/test/java/freemarker/template/ConfigurationTest.java
@@ -640,28 +640,28 @@ public class ConfigurationTest extends TestCase {
         t.process(null, sw);
         assertEquals(expectedContent, sw.toString());
     }
-    
+
     public void testSetTemplateLoaderAndCache() throws Exception {
         Configuration cfg = new Configuration();
         
-        CacheStorageWithGetSize cache = (CacheStorageWithGetSize) cfg.getCacheStorage();
-        assertEquals(0, cache.getSize());
+        CacheStorageWithGetSize cacheStorage = (CacheStorageWithGetSize) cfg.getCacheStorage();
+        assertEquals(0, cacheStorage.getSize());
         cfg.setCacheStorage(new StrongCacheStorage());
-        cache = (CacheStorageWithGetSize) cfg.getCacheStorage();
-        assertEquals(0, cache.getSize());
+        cacheStorage = (CacheStorageWithGetSize) cfg.getCacheStorage();
+        assertEquals(0, cacheStorage.getSize());
         
         cfg.setClassForTemplateLoading(ConfigurationTest.class, "");
-        assertEquals(0, cache.getSize());
+        assertEquals(0, cacheStorage.getSize());
         cfg.getTemplate("toCache1.ftl");
-        assertEquals(1, cache.getSize());
+        assertEquals(1, cacheStorage.getSize());
         cfg.getTemplate("toCache2.ftl");
-        assertEquals(2, cache.getSize());
+        assertEquals(2, cacheStorage.getSize());
         cfg.setClassForTemplateLoading(ConfigurationTest.class, "");
-        assertEquals(0, cache.getSize());
+        assertEquals(0, cacheStorage.getSize());
         cfg.getTemplate("toCache1.ftl");
-        assertEquals(1, cache.getSize());
+        assertEquals(1, cacheStorage.getSize());
         cfg.setTemplateLoader(cfg.getTemplateLoader());
-        assertEquals(1, cache.getSize());
+        assertEquals(1, cacheStorage.getSize());
     }
 
     public void testChangingLocalizedLookupClearsCache() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2065c579/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/template/TemplateLookupStrategyTest.java b/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
index 2a40c62..7d2f922 100644
--- a/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
+++ b/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
@@ -19,7 +19,11 @@
 
 package freemarker.template;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.io.StringWriter;
@@ -67,8 +71,8 @@ public class TemplateLookupStrategyTest {
             fail();
         } catch (TemplateNotFoundException e) {
             assertEquals("missing.ftl", e.getTemplateName());
-            assertEquals(ImmutableList.of("aa/missing.ftl", "missing.ftl"), tl.getTemplatesTried());
-            tl.clear();
+            assertEquals(ImmutableList.of("aa/missing.ftl", "missing.ftl"), tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -78,8 +82,8 @@ public class TemplateLookupStrategyTest {
             assertEquals("aa/test.ftl", t.getSourceName());
             assertEquals(locale, t.getLocale());
             assertNull(t.getCustomLookupCondition());
-            assertEquals(ImmutableList.of("aa/test.ftl"), tl.getTemplatesTried());
-            tl.clear();
+            assertEquals(ImmutableList.of("aa/test.ftl"), tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
     }
@@ -108,8 +112,8 @@ public class TemplateLookupStrategyTest {
                             "missing_aa_BB.ftl",
                             "missing_aa.ftl",
                             "missing.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -121,8 +125,8 @@ public class TemplateLookupStrategyTest {
             assertEquals("missing.ftl", e.getTemplateName());
             assertEquals(
                     ImmutableList.of("missing_xx.ftl", "missing.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -134,8 +138,8 @@ public class TemplateLookupStrategyTest {
             assertEquals("missing.ftl", e.getTemplateName());
             assertEquals(
                     ImmutableList.of("missing.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         cfg.setLocalizedLookup(true);
@@ -147,8 +151,8 @@ public class TemplateLookupStrategyTest {
             assertEquals("_a_b_.ftl", e.getTemplateName());
             assertEquals(
                     ImmutableList.of("_a_b__xx_YY.ftl", "_a_b__xx.ftl", "_a_b_.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
 
@@ -160,9 +164,9 @@ public class TemplateLookupStrategyTest {
                 assertEquals("test_aa_BB_CC_DD.ftl", t.getSourceName());
                 assertEquals(locale, t.getLocale());
                 assertNull(t.getCustomLookupCondition());
-                assertEquals(ImmutableList.of("test_aa_BB_CC_DD.ftl"), tl.getTemplatesTried());
+                assertEquals(ImmutableList.of("test_aa_BB_CC_DD.ftl"), tl.getNamesSearched());
                 assertNull(t.getCustomLookupCondition());
-                tl.clear();
+                tl.clearEvents();
                 cfg.clearTemplateCache();
             }
             
@@ -173,8 +177,8 @@ public class TemplateLookupStrategyTest {
                 assertEquals("test_aa_BB_CC.ftl", t.getSourceName());
                 assertEquals(locale, t.getLocale());
                 assertNull(t.getCustomLookupCondition());
-                assertEquals(ImmutableList.of("test_aa_BB_CC_XX.ftl", "test_aa_BB_CC.ftl"), tl.getTemplatesTried());
-                tl.clear();
+                assertEquals(ImmutableList.of("test_aa_BB_CC_XX.ftl", "test_aa_BB_CC.ftl"), tl.getNamesSearched());
+                tl.clearEvents();
                 cfg.clearTemplateCache();
             }
             
@@ -187,8 +191,8 @@ public class TemplateLookupStrategyTest {
                 assertNull(t.getCustomLookupCondition());
                 assertEquals(
                         ImmutableList.of("test_aa_BB_XX_XX.ftl", "test_aa_BB_XX.ftl", "test_aa_BB.ftl"),
-                        tl.getTemplatesTried());
-                tl.clear();
+                        tl.getNamesSearched());
+                tl.clearEvents();
                 cfg.clearTemplateCache();
             }
     
@@ -202,8 +206,8 @@ public class TemplateLookupStrategyTest {
                 assertNull(t.getCustomLookupCondition());
                 assertEquals(
                         ImmutableList.of("test.ftl"),
-                        tl.getTemplatesTried());
-                tl.clear();
+                        tl.getNamesSearched());
+                tl.clearEvents();
                 cfg.clearTemplateCache();
                 cfg.setLocalizedLookup(true);
             }
@@ -217,8 +221,8 @@ public class TemplateLookupStrategyTest {
                 assertNull(t.getCustomLookupCondition());
                 assertEquals(
                         ImmutableList.of("test_aa_XX_XX_XX.ftl", "test_aa_XX_XX.ftl", "test_aa_XX.ftl", "test_aa.ftl"),
-                        tl.getTemplatesTried());
-                tl.clear();
+                        tl.getNamesSearched());
+                tl.clearEvents();
                 cfg.clearTemplateCache();
             }
             
@@ -232,8 +236,8 @@ public class TemplateLookupStrategyTest {
                 assertEquals(
                         ImmutableList.of(
                                 "test_xx_XX_XX_XX.ftl", "test_xx_XX_XX.ftl", "test_xx_XX.ftl", "test_xx.ftl", "test.ftl"),
-                        tl.getTemplatesTried());
-                tl.clear();
+                        tl.getNamesSearched());
+                tl.clearEvents();
                 cfg.clearTemplateCache();
             }
             
@@ -247,8 +251,8 @@ public class TemplateLookupStrategyTest {
                 assertEquals(
                         ImmutableList.of(
                             "test_xx_BB_CC_DD.ftl", "test_xx_BB_CC.ftl", "test_xx_BB.ftl", "test_xx.ftl", "test.ftl"),
-                        tl.getTemplatesTried());
-                tl.clear();
+                        tl.getNamesSearched());
+                tl.clearEvents();
                 cfg.clearTemplateCache();
             }
         }
@@ -276,8 +280,8 @@ public class TemplateLookupStrategyTest {
                     ImmutableList.of(
                         "x/y/sub/i_xx.ftl", "x/sub/i_xx.ftl", "sub/i_xx.ftl",
                         "x/y/sub/i.ftl", "x/sub/i.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
 
@@ -291,8 +295,8 @@ public class TemplateLookupStrategyTest {
                     ImmutableList.of(
                         "a/b/sub/i_xx.ftl", "a/sub/i_xx.ftl", "sub/i_xx.ftl",
                         "a/b/sub/i.ftl", "a/sub/i.ftl", "sub/i.ftl"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
     }
@@ -344,15 +348,15 @@ public class TemplateLookupStrategyTest {
             assertEquals(tAtFooComContent, t.toString());
             assertEquals(
                     ImmutableList.of("@foo.com/t_xx.ftl", "@foo.com/t.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             assertOutputEquals(tAtFooComWithoutIncludeContent + iAtFooComContent, t);
             assertEquals(
                     ImmutableList.of("@foo.com/i_xx.ftl", "@foo.com/i.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
 
@@ -367,17 +371,17 @@ public class TemplateLookupStrategyTest {
             assertEquals(tAtBarComContent, t.toString());
             assertEquals(
                     ImmutableList.of("@bar.com/t_xx.ftl", "@bar.com/t.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             assertOutputEquals(tAtBarComWithoutIncludeContent + iXxAtDefaultContent, t);
             assertEquals(
                     ImmutableList.of(
                             "@bar.com/i_xx.ftl", "@bar.com/i.ftl",
                             "@default/i_xx.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -394,15 +398,15 @@ public class TemplateLookupStrategyTest {
                     ImmutableList.of(
                             "@baaz.com/t_xx_YY.ftl", "@baaz.com/t_xx.ftl", "@baaz.com/t.ftl",
                             "@default/t_xx_YY.ftl", "@default/t_xx.ftl", "@default/t.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             assertOutputEquals(tAtDefaultWithoutIncludeContent + iAtBaazComContent, t);
             assertEquals(
                     ImmutableList.of("@baaz.com/i_xx_YY.ftl", "@baaz.com/i_xx.ftl", "@baaz.com/i.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -419,9 +423,9 @@ public class TemplateLookupStrategyTest {
                     ImmutableList.of(
                             "@nosuch.com/i_xx_YY.ftl", "@nosuch.com/i_xx.ftl", "@nosuch.com/i.ftl",
                             "@default/i_xx_YY.ftl", "@default/i_xx.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
 
@@ -437,9 +441,9 @@ public class TemplateLookupStrategyTest {
             assertEquals(iAtDefaultContent, t.toString());
             assertEquals(
                     ImmutableList.of("@nosuch.com/i.ftl", "@default/i.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.setLocalizedLookup(true);
             cfg.clearTemplateCache();
         }
@@ -454,9 +458,9 @@ public class TemplateLookupStrategyTest {
                             "@foo.com/t2_xx.ftl", "@foo.com/t2.ftl",
                             "@foo.com/i2_xx.ftl", "@foo.com/i2.ftl", "@default/i2_xx.ftl", "@default/i2.ftl",
                             "@foo.com/i3_xx.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -470,9 +474,9 @@ public class TemplateLookupStrategyTest {
                             "@foo.com/t2_yy.ftl", "@foo.com/t2.ftl",
                             "@foo.com/i2_yy.ftl", "@foo.com/i2.ftl", "@default/i2_yy.ftl", "@default/i2.ftl",
                             "@foo.com/i3_yy.ftl", "@foo.com/i3.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -487,9 +491,9 @@ public class TemplateLookupStrategyTest {
                             "@foo.com/t2.ftl",
                             "@foo.com/i2.ftl", "@default/i2.ftl",
                             "@foo.com/i3.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.setLocalizedLookup(true);
             cfg.clearTemplateCache();
         }
@@ -500,9 +504,9 @@ public class TemplateLookupStrategyTest {
             cfg.getTemplate("i3.ftl", locale, domain, "utf-8", true, false); 
             assertEquals(
                     ImmutableList.of("@foo.com/i3_xx.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -519,9 +523,9 @@ public class TemplateLookupStrategyTest {
                     ImmutableList.of(
                             "@bar.com/i3_xx.ftl", "@bar.com/i3.ftl",
                             "@default/i3_xx.ftl", "@default/i3.ftl"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
             
-            tl.clear();
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -546,8 +550,8 @@ public class TemplateLookupStrategyTest {
                             "missing_aa_BB.txt",
                             "missing_aa.txt",
                             "missing.txt"),
-                    tl.getTemplatesTried());
-            tl.clear();
+                    tl.getNamesSearched());
+            tl.clearEvents();
             cfg.clearTemplateCache();
         }
         
@@ -559,7 +563,7 @@ public class TemplateLookupStrategyTest {
                     ImmutableList.of(
                             "test_aa_BB.txt",
                             "test_aa.txt"),
-                    tl.getTemplatesTried());
+                    tl.getNamesSearched());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2065c579/src/test/java/freemarker/test/MonitoredTemplateLoader.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/test/MonitoredTemplateLoader.java b/src/test/java/freemarker/test/MonitoredTemplateLoader.java
index e088ab3..f51b109 100644
--- a/src/test/java/freemarker/test/MonitoredTemplateLoader.java
+++ b/src/test/java/freemarker/test/MonitoredTemplateLoader.java
@@ -19,28 +19,240 @@
 
 package freemarker.test;
 
+import java.io.Reader;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import freemarker.cache.StringTemplateLoader;
 
 public class MonitoredTemplateLoader extends StringTemplateLoader {
     
-    private final List<String> templatesTried = new ArrayList<String>();
+    List<AbstractTemplateLoaderEvent> events = Collections.synchronizedList(new ArrayList<AbstractTemplateLoaderEvent>());
     
     @Override
     public Object findTemplateSource(String name) {
-        templatesTried.add(name);
-        return super.findTemplateSource(name);
+        FindTemplateSourceEvent event = new FindTemplateSourceEvent(name, null);
+        events.add(event);
+        Object result = super.findTemplateSource(name);
+        event.setFound(result != null);
+        return result;
     }
 
-    public List<String> getTemplatesTried() {
-        return templatesTried;
+    public void clearEvents() {
+        events.clear();
     }
     
-    public void clear() {
-        templatesTried.clear();
+    @Override
+    public void closeTemplateSource(Object templateSource) {
+        events.add(new CloseTemplateSourceEvent(templateSource.toString()));
+        super.closeTemplateSource(templateSource);
+    }
+
+    @Override
+    public Reader getReader(Object templateSource, String encoding) {
+        events.add(new GetReaderEvent(templateSource.toString()));
+        return super.getReader(templateSource, encoding);
+    }
+
+    @Override
+    public long getLastModified(Object templateSource) {
+        events.add(new GetLastModifiedEvent(templateSource.toString()));
+        return super.getLastModified(templateSource);
+    }
+    
+    public List<AbstractTemplateLoaderEvent> getEvents() {
+        return events;
+    }
+    
+    public List<String> getNamesSearched() {
+        ArrayList<String> result = new ArrayList<String>();
+        for (AbstractTemplateLoaderEvent event : events) {
+            if (event instanceof FindTemplateSourceEvent) {
+                result.add(((FindTemplateSourceEvent) event).getName());
+            }
+        }
+        return result;
+    }
+
+    public static abstract class AbstractTemplateLoaderEvent {
+        // empty
+    }
+    
+    public static class FindTemplateSourceEvent extends AbstractTemplateLoaderEvent {
+        private final String name;
+        private Boolean found;
+        
+        public FindTemplateSourceEvent(String name, Boolean found) {
+            this.name = name;
+            this.found = found;
+        }
+        
+        public void setFound(boolean found) {
+            this.found = found;
+        }
+        
+        public Boolean getFound() {
+            return found;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((found == null) ? 0 : found.hashCode());
+            result = prime * result + ((name == null) ? 0 : name.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            FindTemplateSourceEvent other = (FindTemplateSourceEvent) obj;
+            if (found == null) {
+                if (other.found != null)
+                    return false;
+            } else if (!found.equals(other.found))
+                return false;
+            if (name == null) {
+                if (other.name != null)
+                    return false;
+            } else if (!name.equals(other.name))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return "FindTemplateSourceEvent [name=" + name + ", found=" + found + "]";
+        }
+        
     }
+
+    public static class GetLastModifiedEvent extends AbstractTemplateLoaderEvent {
+        private final String sourceName;
+    
+        public GetLastModifiedEvent(String sourceName) {
+            this.sourceName = sourceName;
+        }
+    
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((sourceName == null) ? 0 : sourceName.hashCode());
+            return result;
+        }
+    
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            GetLastModifiedEvent other = (GetLastModifiedEvent) obj;
+            if (sourceName == null) {
+                if (other.sourceName != null)
+                    return false;
+            } else if (!sourceName.equals(other.sourceName))
+                return false;
+            return true;
+        }
     
+        @Override
+        public String toString() {
+            return "GetLastModifiedEvent [sourceName=" + sourceName + "]";
+        }
+        
+    }
+    
+    public static class GetReaderEvent extends AbstractTemplateLoaderEvent {
+        private final String sourceName;
+
+        public GetReaderEvent(String sourceName) {
+            this.sourceName = sourceName;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((sourceName == null) ? 0 : sourceName.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            GetReaderEvent other = (GetReaderEvent) obj;
+            if (sourceName == null) {
+                if (other.sourceName != null)
+                    return false;
+            } else if (!sourceName.equals(other.sourceName))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return "GetReaderEvent [sourceName=" + sourceName + "]";
+        }
+        
+    }
+
+    public static class CloseTemplateSourceEvent extends AbstractTemplateLoaderEvent {
+        private final String sourceName;
+
+        public CloseTemplateSourceEvent(String sourceName) {
+            this.sourceName = sourceName;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((sourceName == null) ? 0 : sourceName.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            CloseTemplateSourceEvent other = (CloseTemplateSourceEvent) obj;
+            if (sourceName == null) {
+                if (other.sourceName != null)
+                    return false;
+            } else if (!sourceName.equals(other.sourceName))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return "CloseTemplateSourceEvent [sourceName=" + sourceName + "]";
+        }
+        
+    }
     
 }
\ No newline at end of file