more unittests

--HG--
branch : trunk
diff --git a/tests/test_loaders.py b/tests/test_loaders.py
index fb5ca73..9cc1dcc 100644
--- a/tests/test_loaders.py
+++ b/tests/test_loaders.py
@@ -17,33 +17,28 @@
 dict_loader = loaders.DictLoader({
     'justdict.html':        'FOO'
 })
-
 package_loader = loaders.PackageLoader('loaderres', 'templates')
-
 filesystem_loader = loaders.FileSystemLoader('loaderres/templates')
-
 function_loader = loaders.FunctionLoader({'justfunction.html': 'FOO'}.get)
-
 choice_loader = loaders.ChoiceLoader([dict_loader, package_loader])
+prefix_loader = loaders.PrefixLoader({
+    'a':        filesystem_loader,
+    'b':        dict_loader
+})
 
 
 def test_dict_loader():
     env = Environment(loader=dict_loader)
     tmpl = env.get_template('justdict.html')
     assert tmpl.render().strip() == 'FOO'
-    try:
-        env.get_template('missing.html')
-    except TemplateNotFound:
-        pass
-    else:
-        raise AssertionError('expected template exception')
+    raises(TemplateNotFound, env.get_template, 'missing.html')
 
 
 def test_package_loader():
     env = Environment(loader=package_loader)
     tmpl = env.get_template('test.html')
     assert tmpl.render().strip() == 'BAR'
-    raises(TemplateNotFound, lambda: env.get_template('missing.html'))
+    raises(TemplateNotFound, env.get_template, 'missing.html')
 
 
 def test_filesystem_loader():
@@ -52,7 +47,7 @@
     assert tmpl.render().strip() == 'BAR'
     tmpl = env.get_template('foo/test.html')
     assert tmpl.render().strip() == 'FOO'
-    raises(TemplateNotFound, lambda: env.get_template('missing.html'))
+    raises(TemplateNotFound, env.get_template, 'missing.html')
 
 
 def test_choice_loader():
@@ -61,21 +56,48 @@
     assert tmpl.render().strip() == 'FOO'
     tmpl = env.get_template('test.html')
     assert tmpl.render().strip() == 'BAR'
-    try:
-        env.get_template('missing.html')
-    except TemplateNotFound:
-        pass
-    else:
-        raise AssertionError('expected template exception')
+    raises(TemplateNotFound, env.get_template, 'missing.html')
 
 
 def test_function_loader():
     env = Environment(loader=function_loader)
     tmpl = env.get_template('justfunction.html')
     assert tmpl.render().strip() == 'FOO'
-    try:
-        env.get_template('missing.html')
-    except TemplateNotFound:
-        pass
-    else:
-        raise AssertionError('expected template exception')
+    raises(TemplateNotFound, env.get_template, 'missing.html')
+
+
+def test_prefix_loader():
+    env = Environment(loader=prefix_loader)
+    tmpl = env.get_template('a/test.html')
+    assert tmpl.render().strip() == 'BAR'
+    tmpl = env.get_template('b/justdict.html')
+    assert tmpl.render().strip() == 'FOO'
+    raises(TemplateNotFound, env.get_template, 'missing')
+
+
+def test_caching():
+    changed = False
+    class TestLoader(loaders.BaseLoader):
+        def get_source(self, environment, template):
+            return u'foo', None, lambda: not changed
+    env = Environment(loader=TestLoader(), cache_size=-1)
+    tmpl = env.get_template('template')
+    assert tmpl is env.get_template('template')
+    changed = True
+    assert tmpl is not env.get_template('template')
+    changed = False
+
+    env = Environment(loader=TestLoader(), cache_size=0)
+    assert env.get_template('template') \
+           is not env.get_template('template')
+
+    env = Environment(loader=TestLoader(), cache_size=2)
+    t1 = env.get_template('one')
+    t2 = env.get_template('two')
+    print env.cache
+    assert t2 is env.get_template('two')
+    assert t1 is env.get_template('one')
+    t3 = env.get_template('three')
+    assert 'one' in env.cache
+    assert 'two' not in env.cache
+    assert 'three' in env.cache
diff --git a/tests/test_macros.py b/tests/test_macros.py
index 5958250..ee6c353 100644
--- a/tests/test_macros.py
+++ b/tests/test_macros.py
@@ -86,3 +86,21 @@
 def test_include(env):
     tmpl = env.from_string('{% from "include" import test %}{{ test("foo") }}')
     assert tmpl.render() == '[foo]'
+
+
+def test_macro_api(env):
+    tmpl = env.from_string('{% macro foo(a, b) %}{% endmacro %}'
+                           '{% macro bar() %}{{ varargs }}{{ kwargs }}{% endmacro %}'
+                           '{% macro baz() %}{{ caller() }}{% endmacro %}')
+    assert tmpl.module.foo.arguments == ('a', 'b')
+    assert tmpl.module.foo.defaults == ()
+    assert tmpl.module.foo.name == 'foo'
+    assert not tmpl.module.foo.caller
+    assert not tmpl.module.foo.catch_kwargs
+    assert not tmpl.module.foo.catch_varargs
+    assert tmpl.module.bar.arguments == ()
+    assert tmpl.module.bar.defaults == ()
+    assert not tmpl.module.bar.caller
+    assert tmpl.module.bar.catch_kwargs
+    assert tmpl.module.bar.catch_varargs
+    assert tmpl.module.baz.caller