You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2008/08/08 01:21:58 UTC

svn commit: r683745 [21/22] - in /ibatis/trunk/java/ibatis-3: ./ ibatis-3-compat/ ibatis-3-compat/src/ ibatis-3-compat/src/main/ ibatis-3-compat/src/main/java/ ibatis-3-compat/src/main/java/com/ ibatis-3-compat/src/main/java/com/ibatis/ ibatis-3-compat...

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ExecutorTestHelper.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,597 @@
+package org.apache.ibatis.executor;
+
+import domain.blog.*;
+import org.apache.ibatis.cache.Cache;
+import org.apache.ibatis.cache.decorators.*;
+import org.apache.ibatis.cache.impl.PerpetualCache;
+import org.apache.ibatis.mapping.Configuration;
+import org.apache.ibatis.mapping.*;
+import org.apache.ibatis.type.*;
+
+import java.util.*;
+
+public class ExecutorTestHelper {
+
+  public static final Cache authorCache;
+
+  static {
+    PerpetualCache cache = new PerpetualCache();
+    cache.setId("author_cache");
+    authorCache =
+        new SynchronizedCache(
+            new SerializedCache(
+                new LoggingCache(
+                    new ScheduledCache(
+                        cache, 5000))));
+
+  }
+
+  public static MappedStatement prepareInsertAuthorMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "insertAuthor", new BasicSqlSource("INSERT INTO author (id,username,password,email,bio,favourite_section) values(?,?,?,?,?,?)"))
+        .parameterMap(
+            new ParameterMap.Builder(
+                "defaultParameterMap", Author.class,
+                new ArrayList<ParameterMapping>() {
+                  {
+                    add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+                    add(new ParameterMapping.Builder("username", registry.getTypeHandler(String.class)).build());
+                    add(new ParameterMapping.Builder("password", registry.getTypeHandler(String.class)).build());
+                    add(new ParameterMapping.Builder("email", registry.getTypeHandler(String.class)).build());
+                    add(new ParameterMapping.Builder("bio", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).build());
+                    add(new ParameterMapping.Builder("favouriteSection", registry.getTypeHandler(Section.class)).jdbcType(JdbcType.VARCHAR).build());
+                  }
+                }).build())
+        .cache(authorCache).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareInsertAuthorMappedStatementWithAutoKey(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "insertAuthor", new BasicSqlSource("INSERT INTO author (username,password,email,bio,favourite_section) values(?,?,?,?,?)"))
+        .parameterMap(
+            new ParameterMap.Builder("defaultParameterMap", Author.class, new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("username", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("password", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("email", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("bio", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).build());
+                add(new ParameterMapping.Builder("favouriteSection", registry.getTypeHandler(Section.class)).jdbcType(JdbcType.VARCHAR).build());
+              }
+            }).build())
+        .cache(authorCache)
+        .build();
+    return ms;
+  }
+
+  public static MappedStatement prepareInsertAuthorProc(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "insertAuthorProc", new BasicSqlSource("{call insertAuthor(?,?,?,?)}"))
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+                add(new ParameterMapping.Builder("username", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("password", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("email", registry.getTypeHandler(String.class)).build());
+              }
+            }).build())
+        .cache(authorCache).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareUpdateAuthorMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "updateAuthor", new BasicSqlSource("UPDATE author SET username = ?, password = ?, email = ?, bio = ? WHERE id = ?"))
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("username", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("password", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("email", registry.getTypeHandler(String.class)).build());
+                add(new ParameterMapping.Builder("bio", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).build());
+                add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+              }
+            }).build())
+        .cache(authorCache).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareDeleteAuthorMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "deleteAuthor", new BasicSqlSource("DELETE FROM author WHERE id = ?"))
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+              }
+            }).build())
+        .cache(authorCache)
+        .build();
+    return ms;
+  }
+
+  public static MappedStatement prepareSelectOneAuthorMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+
+    final ResultMap rm = new ResultMap.Builder("defaultResultMap", Author.class, new
+        ArrayList<ResultMapping>() {
+          {
+            add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class)).build());
+            add(new ResultMapping.Builder("username", "username", registry.getTypeHandler(String.class)).build());
+            add(new ResultMapping.Builder("password", "password", registry.getTypeHandler(String.class)).build());
+            add(new ResultMapping.Builder("email", "email", registry.getTypeHandler(String.class)).build());
+            add(new ResultMapping.Builder("bio", "bio", registry.getTypeHandler(String.class)).build());
+            add(new ResultMapping.Builder("favouriteSection", "favourite_section", registry.getTypeHandler(Section.class)).build());
+          }
+        }).build();
+
+    MappedStatement ms = new MappedStatement.Builder(config, "selectAuthor", new BasicSqlSource("SELECT * FROM author WHERE id = ?"))
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+              }
+            }).build())
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(rm);
+          }
+        })
+        .cache(authorCache).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareSelectAllAuthorsAutoMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    return new MappedStatement.Builder(config, "selectAuthorAutoMap", new BasicSqlSource("SELECT * FROM author ORDER BY id"))
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(new ResultMap.Builder("defaultResultMap", Author.class, new ArrayList() {
+              {
+                add(new ResultMapping.Builder("favouriteSection", "favourite_section", registry.getTypeHandler(Section.class)).build());
+                add(new ResultMapping.Builder(null, "not_exists", null).build());
+              }
+            }).build());
+          }
+        }).build();
+  }
+
+  public static MappedStatement prepareSelectOneAuthorMappedStatementWithConstructorResults(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "selectAuthor", new BasicSqlSource("SELECT * FROM author WHERE id = ?"))
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+              }
+            }).build())
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(new ResultMap.Builder("defaultResultMap", Author.class, new ArrayList<ResultMapping>() {
+              {
+                add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class)).javaType(int.class).flags(new ArrayList<ResultFlag>() {
+                  {
+                    add(ResultFlag.CONSTRUCTOR);
+                  }
+                }).build());
+                add(new ResultMapping.Builder("username", "username", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("password", "password", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("email", "email", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("bio", "bio", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("favouriteSection", "favourite_section", registry.getTypeHandler(Section.class)).build());
+              }
+            }).build());
+          }
+        })
+        .cache(authorCache)
+        .build();
+    return ms;
+  }
+
+  public static MappedStatement prepareSelectTwoSetsOfAuthorsProc(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "selectTwoSetsOfAuthors", new BasicSqlSource("{call selectTwoSetsOfAuthors(?,?)}"))
+        .statementType(StatementType.CALLABLE)
+        .parameterMap(new ParameterMap.Builder(
+            "defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("id1", registry.getTypeHandler(int.class)).build());
+                add(new ParameterMapping.Builder("id2", registry.getTypeHandler(int.class)).build());
+              }
+            }).build())
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            ResultMap map = new ResultMap.Builder("defaultResultMap", Author.class, new ArrayList<ResultMapping>() {
+              {
+                add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class)).build());
+                add(new ResultMapping.Builder("username", "username", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("password", "password", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("email", "email", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("bio", "bio", registry.getTypeHandler(String.class)).build());
+              }
+            }).build();
+            add(map);
+            add(map);
+          }
+        }).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareSelectAuthorViaOutParams(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "selectAuthorViaOutParams", new BasicSqlSource("{call selectAuthorViaOutParams(?,?,?,?,?)}"))
+        .statementType(StatementType.CALLABLE)
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>() {
+              {
+                add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+                add(new ParameterMapping.Builder("username", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).mode(ParameterMode.OUT).build());
+                add(new ParameterMapping.Builder("password", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).mode(ParameterMode.OUT).build());
+                add(new ParameterMapping.Builder("email", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).mode(ParameterMode.OUT).build());
+                add(new ParameterMapping.Builder("bio", registry.getTypeHandler(String.class)).jdbcType(JdbcType.VARCHAR).mode(ParameterMode.OUT).build());
+              }
+            }).build())
+        .resultMaps(new ArrayList<ResultMap>())
+        .cache(authorCache).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareSelectDiscriminatedProduct(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    final ResultMap discriminatorResultMap = new ResultMap.Builder("petResultMap", HashMap.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("name", "name", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("descn", "descn", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    config.addResultMap(discriminatorResultMap);
+    MappedStatement ms = new MappedStatement.Builder(config, "selectProducts", new BasicSqlSource("SELECT * FROM product"))
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(new ResultMap.Builder("defaultResultMap", HashMap.class, new ArrayList<ResultMapping>() {
+              {
+                add(new ResultMapping.Builder("productid", "productid", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("category", "category", registry.getTypeHandler(String.class)).build());
+              }
+            })
+                .discriminator(new Discriminator.Builder(
+                    new ResultMapping.Builder("category", "category", registry.getTypeHandler(String.class)).build(),
+                    new HashMap<String, String>() {
+                      {
+                        put("CATS", discriminatorResultMap.getId());
+                        put("DOGS", discriminatorResultMap.getId());
+                        put("BIRDS", discriminatorResultMap.getId());
+                        put("FISH", discriminatorResultMap.getId());
+                        //Reptiles left out on purpose.
+                      }
+                    }).build()).build());
+
+          }
+        }).build();
+    return ms;
+  }
+
+  public static MappedStatement createInsertAuthorWithIDof99MappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "insertAuthor", new BasicSqlSource("INSERT INTO author (id,username,password,email,bio) values(99,'someone','******','someone@apache.org',null)"))
+        .statementType(StatementType.STATEMENT)
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class,
+            new ArrayList<ParameterMapping>()).build())
+        .cache(authorCache)
+        .build();
+    return ms;
+  }
+
+  public static MappedStatement createSelectAuthorWithIDof99MappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    MappedStatement ms = new MappedStatement.Builder(config, "selectAuthor", new BasicSqlSource("SELECT * FROM author WHERE id = 99"))
+        .statementType(StatementType.STATEMENT)
+        .parameterMap(new ParameterMap.Builder("defaultParameterMap", Author.class, new ArrayList<ParameterMapping>()).build())
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(new ResultMap.Builder("defaultResultMap", Author.class, new ArrayList<ResultMapping>() {
+              {
+                add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class)).build());
+                add(new ResultMapping.Builder("username", "username", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("password", "password", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("email", "email", registry.getTypeHandler(String.class)).build());
+                add(new ResultMapping.Builder("bio", "bio", registry.getTypeHandler(String.class)).build());
+              }
+            }).build());
+          }
+        }).build();
+    return ms;
+  }
+
+  public static MappedStatement prepareComplexSelectBlogMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    final SqlSource sqlSource = new BasicSqlSource("SELECT b.id, b.author_id, b.title, a.username, a.password, a.email, a.bio" +
+        " FROM blog b" +
+        " INNER JOIN author a ON b.author_id = a.id" +
+        " WHERE b.id = ?");
+    final ParameterMap parameterMap = new ParameterMap.Builder("defaultParameterMap", int.class,
+        new ArrayList<ParameterMapping>() {
+          {
+            add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+          }
+        }).build();
+    final ResultMap resultMap = new ResultMap.Builder("defaultResultMap", Blog.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("title", "title", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.id", "author_id", registry.getTypeHandler(int.class)).build());
+        add(new ResultMapping.Builder("author.username", "username", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.password", "password", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.email", "email", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.bio", "bio", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("posts", "id", registry.getTypeHandler(int.class)).javaType(List.class).nestedQueryId("selectPostsForBlog").build());
+      }
+    }).build();
+
+    return new MappedStatement.Builder(config, "selectBlogById", sqlSource)
+        .parameterMap(parameterMap)
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(resultMap);
+          }
+        }).build();
+  }
+
+  public static MappedStatement prepareSelectBlogByIdAndAuthor(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    final SqlSource sqlSource = new BasicSqlSource("SELECT b.id, b.author_id, b.title, a.username, a.password, a.email, a.bio" +
+        " FROM blog b" +
+        " INNER JOIN author a ON b.author_id = a.id" +
+        " WHERE b.id = ? and a.id = ?");
+    final ParameterMap parameterMap = new ParameterMap.Builder("defaultParameterMap", Map.class,
+        new ArrayList<ParameterMapping>() {
+          {
+            add(new ParameterMapping.Builder("blogId", registry.getTypeHandler(int.class)).build());
+            add(new ParameterMapping.Builder("authorId", registry.getTypeHandler(int.class)).build());
+          }
+        }).build();
+    final ResultMap resultMap = new ResultMap.Builder("defaultResultMap", Blog.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("title", "title", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.id", "author_id", registry.getTypeHandler(int.class)).build());
+        add(new ResultMapping.Builder("author.username", "username", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.password", "password", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.email", "email", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("author.bio", "bio", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("posts", "id", registry.getTypeHandler(int.class)).javaType(List.class).nestedQueryId("selectPostsForBlog").build());
+      }
+    }).build();
+
+    return new MappedStatement.Builder(config, "selectBlogByIdAndAuthor", sqlSource)
+        .parameterMap(parameterMap)
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(resultMap);
+          }
+        }).build();
+
+  }
+
+  public static MappedStatement prepareSelectPostsForBlogMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    final SqlSource sqlSource = new BasicSqlSource("SELECT p.id, p.created_on, p.blog_id, p.section, p.subject, p.body, pt.tag_id," +
+        " t.name as tag_name, c.id as comment_id, c.name as comment_name, c.comment" +
+        " FROM post p" +
+        " INNER JOIN post_tag pt ON pt.post_id = p.id" +
+        " INNER JOIN tag t ON pt.tag_id = t.id" +
+        " LEFT OUTER JOIN comment c ON c.post_id = p.id" +
+        " WHERE p.blog_id = ?");
+    final ParameterMap parameterMap = new ParameterMap.Builder("defaultParameterMap", Author.class,
+        new ArrayList<ParameterMapping>() {
+          {
+            add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+          }
+        }).build();
+    final ResultMap tagResultMap = new ResultMap.Builder("tagResultMap", Tag.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "tag_id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("name", "tag_name", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    final ResultMap commentResultMap = new ResultMap.Builder("commentResultMap", Comment.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "comment_id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("name", "comment_name", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("comment", "comment", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    config.addResultMap(tagResultMap);
+    config.addResultMap(commentResultMap);
+    final ResultMap postResultMap = new ResultMap.Builder("defaultResultMap", Post.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("blog", "blog_id", registry.getTypeHandler(int.class)).javaType(Blog.class).nestedQueryId("selectBlogById").build());
+        add(new ResultMapping.Builder("createdOn", "created_on", registry.getTypeHandler(Date.class)).build());
+        add(new ResultMapping.Builder("section", "section", registry.getTypeHandler(Section.class)).build());
+        add(new ResultMapping.Builder("subject", "subject", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("body", "body", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("tags", null, null).nestedResultMapId(tagResultMap.getId()).build());
+        add(new ResultMapping.Builder("comments", null, null).nestedResultMapId(commentResultMap.getId()).build());
+      }
+    }).build();
+    return new MappedStatement.Builder(config, "selectPostsForBlog", sqlSource)
+        .parameterMap(parameterMap)
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(postResultMap);
+          }
+        }).build();
+  }
+
+  public static MappedStatement prepareSelectPostMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    final SqlSource sqlSource = new BasicSqlSource("SELECT p.id, p.created_on, p.blog_id, p.section, p.subject, p.body, pt.tag_id," +
+        " t.name as tag_name, c.id as comment_id, c.name as comment_name, c.comment" +
+        " FROM post p" +
+        " LEFT OUTER JOIN post_tag pt ON pt.post_id = p.id" +
+        " LEFT OUTER JOIN tag t ON pt.tag_id = t.id" +
+        " LEFT OUTER JOIN comment c ON c.post_id = p.id" +
+        " WHERE p.id = ?");
+    final ParameterMap parameterMap = new ParameterMap.Builder("defaultParameterMap", Author.class,
+        new ArrayList<ParameterMapping>() {
+          {
+            add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+          }
+        }).build();
+    final ResultMap tagResultMap = new ResultMap.Builder("tagResultMap", Tag.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "tag_id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("name", "tag_name", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    final ResultMap commentResultMap = new ResultMap.Builder("commentResultMap", Comment.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "comment_id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("name", "comment_name", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("comment", "comment", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    config.addResultMap(tagResultMap);
+    config.addResultMap(commentResultMap);
+    final ResultMap postResultMap = new ResultMap.Builder("", Post.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("blog", "blog_id", registry.getTypeHandler(int.class)).javaType(Blog.class).nestedQueryId("selectBlogById").build());
+        add(new ResultMapping.Builder("createdOn", "created_on", registry.getTypeHandler(Date.class)).build());
+        add(new ResultMapping.Builder("section", "section", registry.getTypeHandler(Section.class)).build());
+        add(new ResultMapping.Builder("subject", "subject", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("body", "body", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("tags", null, null).nestedResultMapId(tagResultMap.getId()).build());
+        add(new ResultMapping.Builder("comments", null, null).nestedResultMapId(commentResultMap.getId()).build());
+      }
+    }).build();
+
+
+    return new MappedStatement.Builder(config, "selectPostsForBlog", sqlSource)
+        .parameterMap(parameterMap)
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(postResultMap);
+          }
+        }).build();
+  }
+
+
+  public static MappedStatement prepareSelectPostWithBlogByAuthorMappedStatement(final Configuration config) {
+    final TypeHandlerRegistry registry = config.getTypeHandlerRegistry();
+    final SqlSource sqlSource = new BasicSqlSource("SELECT p.id, p.created_on, p.blog_id, p.author_id, p.section, p.subject, p.body, pt.tag_id," +
+        " t.name as tag_name, c.id as comment_id, c.name as comment_name, c.comment" +
+        " FROM post p" +
+        " LEFT OUTER JOIN post_tag pt ON pt.post_id = p.id" +
+        " LEFT OUTER JOIN tag t ON pt.tag_id = t.id" +
+        " LEFT OUTER JOIN comment c ON c.post_id = p.id" +
+        " WHERE p.id = ?");
+    final ParameterMap parameterMap = new ParameterMap.Builder("defaultParameterMap", Author.class,
+        new ArrayList<ParameterMapping>() {
+          {
+            add(new ParameterMapping.Builder("id", registry.getTypeHandler(int.class)).build());
+          }
+        }).build();
+    final ResultMap tagResultMap = new ResultMap.Builder("tagResultMap", Tag.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "tag_id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("name", "tag_name", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    final ResultMap commentResultMap = new ResultMap.Builder("commentResultMap", Comment.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "comment_id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+        add(new ResultMapping.Builder("name", "comment_name", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("comment", "comment", registry.getTypeHandler(String.class)).build());
+      }
+    }).build();
+    config.addResultMap(tagResultMap);
+    config.addResultMap(commentResultMap);
+    final ResultMap postResultMap = new ResultMap.Builder("postResultMap", Post.class, new ArrayList<ResultMapping>() {
+      {
+        add(new ResultMapping.Builder("id", "id", registry.getTypeHandler(int.class))
+            .flags(new ArrayList<ResultFlag>() {
+              {
+                add(ResultFlag.ID);
+              }
+            }).build());
+
+        add(new ResultMapping.Builder("blog", null, null).javaType(Blog.class).nestedQueryId("selectBlogByIdAndAuthor").composites(new ArrayList<ResultMapping>() {
+          {
+            add(new ResultMapping.Builder("authorId", "author_id", registry.getTypeHandler(int.class)).build());
+            add(new ResultMapping.Builder("blogId", "blog_id", registry.getTypeHandler(int.class)).build());
+          }
+        }).build());
+        add(new ResultMapping.Builder("createdOn", "created_on", registry.getTypeHandler(Date.class)).build());
+        add(new ResultMapping.Builder("section", "section", registry.getTypeHandler(Section.class)).build());
+        add(new ResultMapping.Builder("subject", "subject", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("body", "body", registry.getTypeHandler(String.class)).build());
+        add(new ResultMapping.Builder("tags", null, null).nestedResultMapId(tagResultMap.getId()).build());
+        add(new ResultMapping.Builder("comments", null, null).nestedResultMapId(commentResultMap.getId()).build());
+      }
+    }).build();
+
+
+    return new MappedStatement.Builder(config, "selectPostsForBlog", sqlSource)
+        .parameterMap(parameterMap)
+        .resultMaps(new ArrayList<ResultMap>() {
+          {
+            add(postResultMap);
+          }
+        }).build();
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ReuseExecutorTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ReuseExecutorTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ReuseExecutorTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ReuseExecutorTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,16 @@
+package org.apache.ibatis.executor;
+
+import org.junit.Test;
+
+import java.sql.Connection;
+
+public class ReuseExecutorTest extends BaseExecutorTest {
+
+  @Test
+  public void dummy() {
+  }
+
+  protected Executor createExecutor(Connection connection) {
+    return new ReuseExecutor(connection);
+  }
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SerializableProxyTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SerializableProxyTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SerializableProxyTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SerializableProxyTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,46 @@
+package org.apache.ibatis.executor;
+
+import domain.blog.*;
+import org.apache.ibatis.executor.loader.*;
+import org.junit.*;
+
+import java.io.*;
+
+public class SerializableProxyTest {
+
+  @Test
+  public void shouldDemonstrateSerializableEnhancer() throws Exception {
+    Author author = new Author(999, "someone", "!@#@!#!@#", "someone@somewhere.com", "blah", Section.NEWS);
+    Object proxy = ResultObjectProxy.createProxy(Author.class, author, new ResultLoaderRegistry());
+    byte[] bytes = serialize((Serializable) proxy);
+    Object proxy2 = deserialize(bytes);
+    Assert.assertEquals(author.toString(), proxy2.toString());
+  }
+
+  private byte[] serialize(Serializable value) {
+    try {
+      ByteArrayOutputStream bos = new ByteArrayOutputStream();
+      ObjectOutputStream oos = new ObjectOutputStream(bos);
+      oos.writeObject(value);
+      oos.flush();
+      oos.close();
+      return bos.toByteArray();
+    } catch (Exception e) {
+      throw new RuntimeException("Error serializing object.  Cause: " + e, e);
+    }
+  }
+
+  private Serializable deserialize(byte[] value) {
+    Serializable result;
+    try {
+      ByteArrayInputStream bis = new ByteArrayInputStream((byte[]) value);
+      ObjectInputStream ois = new ObjectInputStream(bis);
+      result = (Serializable) ois.readObject();
+      ois.close();
+    } catch (Exception e) {
+      throw new RuntimeException("Error deserializing object.  Cause: " + e, e);
+    }
+    return result;
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SimpleExecutorTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SimpleExecutorTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SimpleExecutorTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/SimpleExecutorTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,16 @@
+package org.apache.ibatis.executor;
+
+import org.junit.Test;
+
+import java.sql.Connection;
+
+public class SimpleExecutorTest extends BaseExecutorTest {
+
+  @Test
+  public void dummy() {
+  }
+
+  protected Executor createExecutor(Connection connection) {
+    return new SimpleExecutor(connection);
+  }
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/io/ResourcesTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/io/ResourcesTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/io/ResourcesTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/io/ResourcesTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,95 @@
+package org.apache.ibatis.io;
+
+import org.apache.ibatis.BaseDataTest;
+import org.junit.*;
+
+import java.io.*;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.Properties;
+
+public class ResourcesTest extends BaseDataTest {
+
+  private static final ClassLoader CLASS_LOADER = ResourcesTest.class.getClassLoader();
+
+  @Test
+  public void shouldGetUrlForResource() throws Exception {
+    URL url = Resources.getResourceURL(JPETSTORE_PROPERTIES);
+    Assert.assertTrue(url.toString().endsWith("jpetstore/jpetstore-hsqldb.properties"));
+  }
+
+  @Test
+  public void shouldGetUrlAsProperties() throws Exception {
+    URL url = Resources.getResourceURL(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    Properties props = Resources.getUrlAsProperties(url.toString());
+    Assert.assertNotNull(props.getProperty("driver"));
+  }
+
+  @Test
+  public void shouldGetResourceAsProperties() throws Exception {
+    Properties props = Resources.getResourceAsProperties(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    Assert.assertNotNull(props.getProperty("driver"));
+  }
+
+  @Test
+  public void shouldGetUrlAsStream() throws Exception {
+    URL url = Resources.getResourceURL(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    InputStream in = Resources.getUrlAsStream(url.toString());
+    Assert.assertNotNull(in);
+    in.close();
+  }
+
+  @Test
+  public void shouldGetUrlAsReader() throws Exception {
+    URL url = Resources.getResourceURL(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    Reader in = Resources.getUrlAsReader(url.toString());
+    Assert.assertNotNull(in);
+    in.close();
+  }
+
+  @Test
+  public void shouldGetResourceAsStream() throws Exception {
+    InputStream in = Resources.getResourceAsStream(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    Assert.assertNotNull(in);
+    in.close();
+  }
+
+  @Test
+  public void shouldGetResourceAsReader() throws Exception {
+    Reader in = Resources.getResourceAsReader(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    Assert.assertNotNull(in);
+    in.close();
+  }
+
+  @Test
+  public void shouldGetResourceAsFile() throws Exception {
+    File file = Resources.getResourceAsFile(JPETSTORE_PROPERTIES);
+    Assert.assertTrue(file.toURL().toString().endsWith("jpetstore/jpetstore-hsqldb.properties"));
+  }
+
+  @Test
+  public void shouldGetResourceAsFileWithClassloader() throws Exception {
+    File file = Resources.getResourceAsFile(CLASS_LOADER, JPETSTORE_PROPERTIES);
+    Assert.assertTrue(file.toURL().toString().endsWith("jpetstore/jpetstore-hsqldb.properties"));
+  }
+
+  @Test
+  public void shouldAllowDefaultClassLoaderToBeSet() {
+    Resources.setDefaultClassLoader(this.getClass().getClassLoader());
+    Assert.assertEquals(this.getClass().getClassLoader(), Resources.getDefaultClassLoader());
+  }
+
+  @Test
+  public void shouldAllowDefaultCharsetToBeSet() {
+    Resources.setCharset(Charset.defaultCharset());
+    Assert.assertEquals(Charset.defaultCharset(), Resources.getCharset());
+  }
+
+  @Test
+  public void shouldGetClassForName() throws Exception {
+    Class clazz = Resources.classForName(ResourcesTest.class.getName());
+    Assert.assertNotNull(clazz);
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SimpleDataSourceTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SimpleDataSourceTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SimpleDataSourceTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SimpleDataSourceTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,52 @@
+package org.apache.ibatis.jdbc;
+
+import org.apache.ibatis.BaseDataTest;
+import org.junit.*;
+
+import java.sql.Connection;
+import java.util.*;
+
+public class SimpleDataSourceTest extends BaseDataTest {
+
+  @Test
+  public void shouldProperlyMaintainPoolOf3ActiveAnd2IdleConnections() throws Exception {
+    SimpleDataSource ds = createSimpleDataSource(JPETSTORE_PROPERTIES);
+    try {
+      runScript(ds, JPETSTORE_DDL);
+      ds.setJdbcDefaultAutoCommit(false);
+      ds.setJdbcDriverProperties(new Properties() {
+        {
+          setProperty("username", "sa");
+          setProperty("password", "");
+        }
+      });
+      ds.setPoolMaximumActiveConnections(3);
+      ds.setPoolMaximumIdleConnections(2);
+      ds.setPoolMaximumCheckoutTime(10000);
+      ds.setPoolPingConnectionsNotUsedFor(1);
+      ds.setPoolPingEnabled(true);
+      ds.setPoolPingQuery("SELECT * FROM PRODUCT");
+      ds.setPoolTimeToWait(10000);
+      ds.setLogWriter(null);
+      List<Connection> connections = new ArrayList<Connection>();
+      for (int i = 0; i < 3; i++) {
+        connections.add(ds.getConnection());
+      }
+      Assert.assertEquals(3, ds.getActiveConnectionCount());
+      for (Connection c : connections) {
+        c.close();
+      }
+      Assert.assertEquals(2, ds.getIdleConnectionCount());
+      Assert.assertEquals(4, ds.getRequestCount());
+      Assert.assertEquals(0, ds.getBadConnectionCount());
+      Assert.assertEquals(0, ds.getHadToWaitCount());
+      Assert.assertEquals(0, ds.getAverageOverdueCheckoutTime());
+      Assert.assertEquals(0, ds.getClaimedOverdueConnectionCount());
+      Assert.assertEquals(0, ds.getAverageWaitTime());
+      Assert.assertNotNull(ds.getStatus());
+    } finally {
+      ds.forceCloseAll();
+    }
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/logging/LogFactoryTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/logging/LogFactoryTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/logging/LogFactoryTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/logging/LogFactoryTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,47 @@
+package org.apache.ibatis.logging;
+
+import org.junit.*;
+
+public class LogFactoryTest {
+
+  @Test
+  public void shouldUseCommonsLogging() {
+    LogFactory.useCommonsLogging();
+    logSomething(true);
+  }
+
+  @Test
+  public void shouldUseLog4J() {
+    LogFactory.useLog4JLogging();
+    logSomething(true);
+  }
+
+  @Test
+  public void shouldUseJdKLogging() {
+    LogFactory.useJdkLogging();
+    logSomething(false);
+  }
+
+  @Test
+  public void shouldUseStdOut() {
+    LogFactory.useStdOutLogging();
+    logSomething(true);
+  }
+
+  @Test
+  public void shouldUseNoLogging() {
+    LogFactory.useNoLogging();
+    logSomething(false);
+  }
+
+  private void logSomething(boolean expectedDebug) {
+    Log log = LogFactory.getLog(Object.class);
+    log.warn("Warning message.");
+    log.debug("Debug message.");
+    log.error("Error message.");
+    log.error("Error with Exception.", new Exception("Test exception."));
+    Assert.assertEquals(expectedDebug, log.isDebugEnabled());
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/migration/ScriptRunnerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/migration/ScriptRunnerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/migration/ScriptRunnerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/migration/ScriptRunnerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,70 @@
+package org.apache.ibatis.migration;
+
+import org.apache.ibatis.BaseDataTest;
+import org.apache.ibatis.adhoc.AdHocExecutor;
+import org.apache.ibatis.io.Resources;
+import org.apache.ibatis.jdbc.SimpleDataSource;
+import org.junit.*;
+
+import java.io.IOException;
+import java.sql.*;
+import java.util.*;
+
+public class ScriptRunnerTest extends BaseDataTest {
+
+  @Test
+  public void shouldRunScriptsUsingDataSource() throws Exception {
+    SimpleDataSource ds = createSimpleDataSource(JPETSTORE_PROPERTIES);
+    ScriptRunner runner = new ScriptRunner(ds, true, false);
+    runner.setDelimiter(";", false);
+    runner.setLogWriter(null);
+    runner.setErrorLogWriter(null);
+    runJPetStoreScripts(runner);
+    assertProductsTableExistsAndLoaded();
+  }
+
+  @Test
+  public void shouldRunScriptsUsingConnection() throws Exception {
+    SimpleDataSource ds = createSimpleDataSource(JPETSTORE_PROPERTIES);
+    Connection conn = ds.getConnection();
+    ScriptRunner runner = new ScriptRunner(conn, true, false);
+    runner.setErrorLogWriter(null);
+    runner.setLogWriter(null);
+    runJPetStoreScripts(runner);
+    assertProductsTableExistsAndLoaded();
+  }
+
+  @Test
+  public void shouldRunScriptsUsingProperties() throws Exception {
+    Properties props = Resources.getResourceAsProperties(JPETSTORE_PROPERTIES);
+    ScriptRunner runner = new ScriptRunner(
+        props.getProperty("driver"),
+        props.getProperty("url"),
+        props.getProperty("username"),
+        props.getProperty("password"),
+        true,
+        false);
+    runner.setErrorLogWriter(null);
+    runner.setLogWriter(null);
+    runJPetStoreScripts(runner);
+    assertProductsTableExistsAndLoaded();
+  }
+
+  private void runJPetStoreScripts(ScriptRunner runner) throws IOException, SQLException {
+    runScript(runner, JPETSTORE_DDL);
+    runScript(runner, JPETSTORE_DATA);
+  }
+
+  private void assertProductsTableExistsAndLoaded() throws IOException, SQLException {
+    SimpleDataSource ds = createSimpleDataSource(JPETSTORE_PROPERTIES);
+    try {
+      Connection conn = ds.getConnection();
+      AdHocExecutor executor = new AdHocExecutor(conn);
+      List<Map<String, Object>> products = executor.selectAll("SELECT * FROM PRODUCT");
+      Assert.assertEquals(16, products.size());
+    } finally {
+      ds.forceCloseAll();
+    }
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/plugin/PluginTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/plugin/PluginTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/plugin/PluginTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/plugin/PluginTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,36 @@
+package org.apache.ibatis.plugin;
+
+import org.junit.*;
+
+import java.util.*;
+
+
+public class PluginTest {
+
+  @Test
+  public void mapPluginShouldInterceptGet() {
+    Map map = new HashMap();
+    map = (Map) new AlwaysMapPlugin().plugin(map);
+    Assert.assertEquals("Always", map.get("Anything"));
+  }
+
+  @Test
+  public void shouldNotInterceptToString() {
+    Map map = new HashMap();
+    map = (Map) new AlwaysMapPlugin().plugin(map);
+    Assert.assertFalse("Always".equals(map.toString()));
+  }
+
+  @Intercepts({
+  @Signature(type = Map.class, method = "get", args = {Object.class})})
+  public static class AlwaysMapPlugin implements Interceptor {
+    public Object intercept(Invocation invocation) throws Throwable {
+      return "Always";
+    }
+
+    public Object plugin(Object target) {
+      return Plugin.wrap(target, this);
+    }
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/ExceptionUtilTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/ExceptionUtilTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/ExceptionUtilTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/ExceptionUtilTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,18 @@
+package org.apache.ibatis.reflection;
+
+import org.junit.*;
+
+import java.lang.reflect.*;
+
+public class ExceptionUtilTest {
+
+  @Test
+  public void shouldUnwrapThrowable() {
+    Exception exception = new Exception();
+    Assert.assertEquals(exception, ExceptionUtil.unwrapThrowable(exception));
+    Assert.assertEquals(exception, ExceptionUtil.unwrapThrowable(new InvocationTargetException(exception, "test")));
+    Assert.assertEquals(exception, ExceptionUtil.unwrapThrowable(new UndeclaredThrowableException(exception, "test")));
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaClassTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,102 @@
+package org.apache.ibatis.reflection;
+
+import domain.misc.RichType;
+import org.junit.*;
+
+import java.util.*;
+
+public class MetaClassTest {
+
+  private RichType rich = new RichType();
+  Map map = new HashMap() {
+    {
+      put("richType", rich);
+    }
+  };
+
+  private MetaClass meta = MetaClass.forClass(RichType.class);
+
+  public MetaClassTest() {
+    rich.setRichType(new RichType());
+  }
+
+  @Test
+  public void shouldCheckGetterExistance() {
+    Assert.assertTrue(meta.hasGetter("richField"));
+    Assert.assertTrue(meta.hasGetter("richProperty"));
+    Assert.assertTrue(meta.hasGetter("richList"));
+    Assert.assertTrue(meta.hasGetter("richMap"));
+    Assert.assertTrue(meta.hasGetter("richList[0]"));
+
+    Assert.assertTrue(meta.hasGetter("richType"));
+    Assert.assertTrue(meta.hasGetter("richType.richField"));
+    Assert.assertTrue(meta.hasGetter("richType.richProperty"));
+    Assert.assertTrue(meta.hasGetter("richType.richList"));
+    Assert.assertTrue(meta.hasGetter("richType.richMap"));
+    Assert.assertTrue(meta.hasGetter("richType.richList[0]"));
+
+    Assert.assertFalse(meta.hasGetter("[0]"));
+  }
+
+  @Test
+  public void shouldCheckSetterExistance() {
+    Assert.assertTrue(meta.hasSetter("richField"));
+    Assert.assertTrue(meta.hasSetter("richProperty"));
+    Assert.assertTrue(meta.hasSetter("richList"));
+    Assert.assertTrue(meta.hasSetter("richMap"));
+    Assert.assertTrue(meta.hasSetter("richList[0]"));
+
+    Assert.assertTrue(meta.hasSetter("richType"));
+    Assert.assertTrue(meta.hasSetter("richType.richField"));
+    Assert.assertTrue(meta.hasSetter("richType.richProperty"));
+    Assert.assertTrue(meta.hasSetter("richType.richList"));
+    Assert.assertTrue(meta.hasSetter("richType.richMap"));
+    Assert.assertTrue(meta.hasSetter("richType.richList[0]"));
+
+    Assert.assertFalse(meta.hasSetter("[0]"));
+  }
+
+  @Test
+  public void shouldCheckTypeForEachGetter() {
+    Assert.assertEquals(String.class, meta.getGetterType("richField"));
+    Assert.assertEquals(String.class, meta.getGetterType("richProperty"));
+    Assert.assertEquals(List.class, meta.getGetterType("richList"));
+    Assert.assertEquals(Map.class, meta.getGetterType("richMap"));
+    Assert.assertEquals(List.class, meta.getGetterType("richList[0]"));
+
+    Assert.assertEquals(RichType.class, meta.getGetterType("richType"));
+    Assert.assertEquals(String.class, meta.getGetterType("richType.richField"));
+    Assert.assertEquals(String.class, meta.getGetterType("richType.richProperty"));
+    Assert.assertEquals(List.class, meta.getGetterType("richType.richList"));
+    Assert.assertEquals(Map.class, meta.getGetterType("richType.richMap"));
+    Assert.assertEquals(List.class, meta.getGetterType("richType.richList[0]"));
+  }
+
+  @Test
+  public void shouldCheckTypeForEachSetter() {
+    Assert.assertEquals(String.class, meta.getSetterType("richField"));
+    Assert.assertEquals(String.class, meta.getSetterType("richProperty"));
+    Assert.assertEquals(List.class, meta.getSetterType("richList"));
+    Assert.assertEquals(Map.class, meta.getSetterType("richMap"));
+    Assert.assertEquals(List.class, meta.getSetterType("richList[0]"));
+
+    Assert.assertEquals(RichType.class, meta.getSetterType("richType"));
+    Assert.assertEquals(String.class, meta.getSetterType("richType.richField"));
+    Assert.assertEquals(String.class, meta.getSetterType("richType.richProperty"));
+    Assert.assertEquals(List.class, meta.getSetterType("richType.richList"));
+    Assert.assertEquals(Map.class, meta.getSetterType("richType.richMap"));
+    Assert.assertEquals(List.class, meta.getSetterType("richType.richList[0]"));
+  }
+
+  @Test
+  public void shouldCheckGetterAndSetterNames() {
+    Assert.assertEquals(5, meta.getGetterNames().length);
+    Assert.assertEquals(5, meta.getSetterNames().length);
+  }
+
+  @Test
+  public void shouldFindPropertyName() {
+    Assert.assertEquals("richField", meta.findProperty("RICHfield"));
+  }
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,166 @@
+package org.apache.ibatis.reflection;
+
+import domain.jpetstore.Product;
+import domain.misc.RichType;
+import org.junit.*;
+
+public class MetaObjectTest {
+
+  @Test
+  public void shouldGetAndSetField() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richField", "foo");
+    Assert.assertEquals("foo", meta.getValue("richField"));
+  }
+
+  @Test
+  public void shouldGetAndSetNestedField() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richType.richField", "foo");
+    Assert.assertEquals("foo", meta.getValue("richType.richField"));
+  }
+
+  @Test
+  public void shouldGetAndSetProperty() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richProperty", "foo");
+    Assert.assertEquals("foo", meta.getValue("richProperty"));
+  }
+
+  @Test
+  public void shouldGetAndSetNestedProperty() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richType.richProperty", "foo");
+    Assert.assertEquals("foo", meta.getValue("richType.richProperty"));
+  }
+
+  @Test
+  public void shouldGetAndSetMapPair() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richMap.key", "foo");
+    Assert.assertEquals("foo", meta.getValue("richMap.key"));
+  }
+
+  @Test
+  public void shouldGetAndSetNestedMapPair() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richType.richMap.key", "foo");
+    Assert.assertEquals("foo", meta.getValue("richType.richMap.key"));
+  }
+
+  @Test
+  public void shouldGetAndSetListItem() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richList[0]", "foo");
+    Assert.assertEquals("foo", meta.getValue("richList[0]"));
+  }
+
+  @Test
+  public void shouldSetAndGetSelfListItem() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richList[0]", "foo");
+    Assert.assertEquals("foo", meta.getValue("richList[0]"));
+  }
+
+  @Test
+  public void shouldGetAndSetNestedListItem() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richType.richList[0]", "foo");
+    Assert.assertEquals("foo", meta.getValue("richType.richList[0]"));
+  }
+
+  @Test
+  public void shouldGetReadablePropertyNames() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    String[] readables = meta.getGetterNames();
+    Assert.assertEquals(5, readables.length);
+    for (String readable : readables) {
+      Assert.assertTrue(meta.hasGetter(readable));
+      Assert.assertTrue(meta.hasGetter("richType." + readable));
+    }
+    Assert.assertTrue(meta.hasGetter("richType"));
+  }
+
+  @Test
+  public void shouldGetWriteablePropertyNames() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    String[] writeables = meta.getSetterNames();
+    Assert.assertEquals(5, writeables.length);
+    for (String writeable : writeables) {
+      Assert.assertTrue(meta.hasSetter(writeable));
+      Assert.assertTrue(meta.hasSetter("richType." + writeable));
+    }
+    Assert.assertTrue(meta.hasSetter("richType"));
+  }
+
+  @Test
+  public void shouldSetPropertyOfNullNestedProperty() {
+    MetaObject richWithNull = MetaObject.forObject(new RichType());
+    richWithNull.setValue("richType.richProperty", "foo");
+    Assert.assertEquals("foo", richWithNull.getValue("richType.richProperty"));
+  }
+
+  @Test
+  public void shouldSetPropertyOfNullNestedPropertyWithNull() {
+    MetaObject richWithNull = MetaObject.forObject(new RichType());
+    richWithNull.setValue("richType.richProperty", null);
+    Assert.assertEquals(null, richWithNull.getValue("richType.richProperty"));
+  }
+
+  @Test
+  public void shouldGetPropertyOfNullNestedProperty() {
+    MetaObject richWithNull = MetaObject.forObject(new RichType());
+    Assert.assertNull(richWithNull.getValue("richType.richProperty"));
+  }
+
+  @Test
+  public void shouldVerifyHasReadablePropertiesReturnedByGetReadablePropertyNames() {
+    MetaObject object = MetaObject.forObject(new Product());
+    for (String readable : object.getGetterNames()) {
+      Assert.assertTrue(object.hasGetter(readable));
+    }
+  }
+
+  @Test
+  public void shouldVerifyHasWriteablePropertiesReturnedByGetWriteablePropertyNames() {
+    MetaObject object = MetaObject.forObject(new Product());
+    for (String writeable : object.getSetterNames()) {
+      Assert.assertTrue(object.hasSetter(writeable));
+    }
+  }
+
+  @Test
+  public void shouldSetAndGetProperties() {
+    MetaObject object = MetaObject.forObject(new Product());
+    for (String writeable : object.getSetterNames()) {
+      if (!writeable.contains("$")) {
+        object.setValue(writeable, "test");
+        Assert.assertEquals("test", object.getValue(writeable));
+      }
+    }
+  }
+
+  @Test
+  public void shouldVerifyPropertyTypes() {
+    MetaObject object = MetaObject.forObject(new Product());
+    for (String writeable : object.getSetterNames()) {
+      if (!writeable.contains("$")) {
+        Assert.assertEquals(String.class, object.getGetterType(writeable));
+        Assert.assertEquals(String.class, object.getSetterType(writeable));
+      }
+    }
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BaseTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,29 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Mockery;
+import org.jmock.lib.legacy.ClassImposteriser;
+
+import java.sql.*;
+
+public abstract class BaseTypeHandlerTest {
+
+  protected Mockery mockery = new Mockery() {
+    {
+      setImposteriser(ClassImposteriser.INSTANCE);
+    }
+  };
+
+  protected final ResultSet rs = mockery.mock(ResultSet.class);
+  protected final PreparedStatement ps = mockery.mock(PreparedStatement.class);
+  protected final CallableStatement cs = mockery.mock(CallableStatement.class);
+
+  public abstract void shouldSetParameter()
+      throws Exception;
+
+  public abstract void shouldGetResultFromResultSet()
+      throws Exception;
+
+  public abstract void shouldGetResultFromCallableStatement()
+      throws Exception;
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BigDecimalTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,55 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+import java.math.BigDecimal;
+
+public class BigDecimalTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new BigDecimalTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setBigDecimal(with(any(int.class)), with(any(BigDecimal.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, new BigDecimal(1), null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getBigDecimal(with(any(String.class)));
+        will(returnValue(new BigDecimal(1)));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(new BigDecimal(1), TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getBigDecimal(with(any(int.class)));
+        will(returnValue(new BigDecimal(1)));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(new BigDecimal(1), TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BlobTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,66 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+import java.io.InputStream;
+import java.sql.Blob;
+
+public class BlobTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new BlobTypeHandler();
+
+  protected final Blob blob = mockery.mock(Blob.class);
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setBinaryStream(with(any(int.class)), with(any(InputStream.class)), with(any(int.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, new byte[]{1, 2, 3}, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getBlob(with(any(String.class)));
+        will(returnValue(blob));
+        one(rs).wasNull();
+        will(returnValue(false));
+        one(blob).length();
+        will(returnValue(3l));
+        one(blob).getBytes(with(any(long.class)), with(any(int.class)));
+        will(returnValue(new byte[]{1, 2, 3}));
+      }
+    });
+    Assert.assertArrayEquals(new byte[]{1, 2, 3}, (byte[]) TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getBlob(with(any(int.class)));
+        will(returnValue(blob));
+        one(cs).wasNull();
+        will(returnValue(false));
+        one(blob).length();
+        will(returnValue(3l));
+        one(blob).getBytes(with(any(long.class)), with(any(int.class)));
+        will(returnValue(new byte[]{1, 2, 3}));
+      }
+    });
+    Assert.assertArrayEquals(new byte[]{1, 2, 3}, (byte[]) TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/BooleanTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,53 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+public class BooleanTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new BooleanTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setBoolean(with(any(int.class)), with(any(boolean.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, true, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getBoolean(with(any(String.class)));
+        will(returnValue(true));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(true, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getBoolean(with(any(int.class)));
+        will(returnValue(true));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(true, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteArrayTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,53 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+public class ByteArrayTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new ByteArrayTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setBytes(with(any(int.class)), with(any(byte[].class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, new byte[]{1, 2, 3}, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getBytes(with(any(String.class)));
+        will(returnValue(new byte[]{1, 2, 3}));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertArrayEquals(new byte[]{1, 2, 3}, (byte[]) TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getBytes(with(any(int.class)));
+        will(returnValue(new byte[]{1, 2, 3}));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertArrayEquals(new byte[]{1, 2, 3}, (byte[]) TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ByteTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,53 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+public class ByteTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new ByteTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setByte(with(any(int.class)), with(any(byte.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, (byte) 100, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getByte(with(any(String.class)));
+        will(returnValue((byte) 100));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals((byte) 100, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getByte(with(any(int.class)));
+        will(returnValue((byte) 100));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals((byte) 100, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/ClobTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,66 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+import java.io.Reader;
+import java.sql.Clob;
+
+public class ClobTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new ClobTypeHandler();
+
+  protected final Clob clob = mockery.mock(Clob.class);
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setCharacterStream(with(any(int.class)), with(any(Reader.class)), with(any(int.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, "Hello", null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getClob(with(any(String.class)));
+        will(returnValue(clob));
+        one(rs).wasNull();
+        will(returnValue(false));
+        one(clob).length();
+        will(returnValue(3l));
+        one(clob).getSubString(with(any(long.class)), with(any(int.class)));
+        will(returnValue("Hello"));
+      }
+    });
+    Assert.assertEquals("Hello", TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getClob(with(any(int.class)));
+        will(returnValue(clob));
+        one(cs).wasNull();
+        will(returnValue(false));
+        one(clob).length();
+        will(returnValue(3l));
+        one(clob).getSubString(with(any(long.class)), with(any(int.class)));
+        will(returnValue("Hello"));
+      }
+    });
+    Assert.assertEquals("Hello", TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateOnlyTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,57 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+import java.util.Date;
+
+public class DateOnlyTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new DateOnlyTypeHandler();
+  private static final Date DATE = new Date();
+  private static final java.sql.Date SQL_DATE = new java.sql.Date(DATE.getTime());
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setDate(with(any(int.class)), with(any(java.sql.Date.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, DATE, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getDate(with(any(String.class)));
+        will(returnValue(SQL_DATE));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(DATE, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getDate(with(any(int.class)));
+        will(returnValue(SQL_DATE));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(DATE, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DateTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,58 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+import java.sql.Timestamp;
+import java.util.Date;
+
+public class DateTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new DateTypeHandler();
+  private static final Date DATE = new Date();
+  private static final Timestamp TIMESTAMP = new Timestamp(DATE.getTime());
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setTimestamp(with(any(int.class)), with(any(Timestamp.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, DATE, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getTimestamp(with(any(String.class)));
+        will(returnValue(TIMESTAMP));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(DATE, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getTimestamp(with(any(int.class)));
+        will(returnValue(TIMESTAMP));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(DATE, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/DoubleTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,53 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+public class DoubleTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new DoubleTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setDouble(with(any(int.class)), with(any(double.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, 100d, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getDouble(with(any(String.class)));
+        will(returnValue(100d));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(100d, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getDouble(with(any(int.class)));
+        will(returnValue(100d));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(100d, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/FloatTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,53 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+public class FloatTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new FloatTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setFloat(with(any(int.class)), with(any(float.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, 100f, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getFloat(with(any(String.class)));
+        will(returnValue(100f));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(100f, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getFloat(with(any(int.class)));
+        will(returnValue(100f));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(100f, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java?rev=683745&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/type/IntegerTypeHandlerTest.java Thu Aug  7 16:21:46 2008
@@ -0,0 +1,53 @@
+package org.apache.ibatis.type;
+
+import org.jmock.Expectations;
+import org.junit.*;
+
+public class IntegerTypeHandlerTest extends BaseTypeHandlerTest {
+
+  private static final TypeHandler TYPE_HANDLER = new IntegerTypeHandler();
+
+  @Test
+  public void shouldSetParameter()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(ps).setInt(with(any(int.class)), with(any(int.class)));
+      }
+    });
+    TYPE_HANDLER.setParameter(ps, 1, 100, null);
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromResultSet()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(rs).getInt(with(any(String.class)));
+        will(returnValue(100));
+        one(rs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(100, TYPE_HANDLER.getResult(rs, "column"));
+    mockery.assertIsSatisfied();
+  }
+
+  @Test
+  public void shouldGetResultFromCallableStatement()
+      throws Exception {
+    mockery.checking(new Expectations() {
+      {
+        one(cs).getInt(with(any(int.class)));
+        will(returnValue(100));
+        one(cs).wasNull();
+        will(returnValue(false));
+      }
+    });
+    Assert.assertEquals(100, TYPE_HANDLER.getResult(cs, 1));
+    mockery.assertIsSatisfied();
+  }
+
+
+}
\ No newline at end of file