diff --git a/src/main/java/org/codelibs/fess/helper/DuplicateHostHelper.java b/src/main/java/org/codelibs/fess/helper/DuplicateHostHelper.java
index a351e88234aa5db06562b9ae83a02ea3fda6f90f..1bd6399ecb318e6b0e2271b1225319955a49fa1a 100644
--- a/src/main/java/org/codelibs/fess/helper/DuplicateHostHelper.java
+++ b/src/main/java/org/codelibs/fess/helper/DuplicateHostHelper.java
@@ -29,7 +29,7 @@ public class DuplicateHostHelper implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    private List<DuplicateHost> duplicateHostList;
+    protected List<DuplicateHost> duplicateHostList;
 
     @PostConstruct
     public void init() {
diff --git a/src/test/java/org/codelibs/fess/crawler/transformer/FessFileTransformerTest.java b/src/test/java/org/codelibs/fess/crawler/transformer/FessFileTransformerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c1ab33d4797cec0acace0e24efa94adcbc41a52
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/crawler/transformer/FessFileTransformerTest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.crawler.transformer;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import org.codelibs.fess.Constants;
+import org.codelibs.fess.exception.FessSystemException;
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class FessFileTransformerTest extends UnitFessTestCase {
+
+    private String encodeUrl(final String url) {
+        try {
+            return URLEncoder.encode(url, Constants.UTF_8);
+        } catch (final UnsupportedEncodingException e) {
+            throw new FessSystemException("Unsupported encoding.", e);
+        }
+    }
+
+    public void test_decodeUrl_ok() throws Exception {
+        String url, exp;
+        final FessFileTransformer transformer = new FessFileTransformer();
+
+        url = "";
+        exp = "";
+        assertEquals(exp, transformer.decodeUrlAsName(url, true));
+
+        url = "http://example.com/";
+        exp = "http://example.com/";
+        assertEquals(exp, transformer.decodeUrlAsName(url, false));
+
+        url = "http://example.com/index.html";
+        exp = "http://example.com/index.html";
+        assertEquals(exp, transformer.decodeUrlAsName(url, false));
+
+        url = "http://example.com/" + encodeUrl("テスト ") + ".html";
+        exp = "http://example.com/テスト .html";
+        assertEquals(exp, transformer.decodeUrlAsName(url, false));
+
+        url = "file://C++.doc";
+        exp = "file://C++.doc";
+        assertEquals(exp, transformer.decodeUrlAsName(url, true));
+
+        url = "file://C .doc";
+        exp = "file://C .doc";
+        assertEquals(exp, transformer.decodeUrlAsName(url, true));
+    }
+
+    public void test_decodeUrl_null() throws Exception {
+        final FessFileTransformer transformer = new FessFileTransformer();
+        assertNull(transformer.decodeUrlAsName(null, true));
+    }
+
+    public void test_getHost_ok() {
+        String url, exp;
+        final FessFileTransformer transformer = new FessFileTransformer();
+
+        url = "";
+        exp = "";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "http://server/home/user";
+        exp = "server";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:/home/user";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:/c:/home/user";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:////server/home/user";
+        exp = "server";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:/" + encodeUrl("ホーム") + "/user";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:/c:/" + encodeUrl("ホーム") + "/user";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:////" + encodeUrl("サーバー") + "/home/user";
+        exp = "サーバー";
+        assertEquals(exp, transformer.getHost(url));
+
+    }
+
+    public void test_getHost_unexpected() {
+        String url, exp;
+        final FessFileTransformer transformer = new FessFileTransformer();
+
+        url = null;
+        exp = "";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "example:";
+        exp = "unknown";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file://";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:///";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file://///";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file://///example";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+        url = "file:/c:";
+        exp = "localhost";
+        assertEquals(exp, transformer.getHost(url));
+
+    }
+
+    public void test_getSite_ok() {
+        String url, exp;
+        final FessFileTransformer transformer = new FessFileTransformer();
+
+        url = "";
+        exp = "";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "http://example.com/";
+        exp = "example.com/";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "http://example.com/index.html";
+        exp = "example.com/index.html";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:/home/user";
+        exp = "/home/user";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:/c:/home/user";
+        exp = "c:\\home\\user";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:/c:/";
+        exp = "c:\\";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:////server/user";
+        exp = "\\\\server\\user";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        transformer.maxSiteLength = 10;
+
+        url = "file:/home/user/foo";
+        exp = "/home/u...";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+    }
+
+    public void test_getSite_unexpected() {
+        String url, exp;
+        final FessFileTransformer transformer = new FessFileTransformer();
+
+        url = "file:";
+        exp = "";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file";
+        exp = "file";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:/";
+        exp = "/";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:/c:";
+        exp = "c:";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file://";
+        exp = "//";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file:///";
+        exp = "///";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+
+        url = "file://///";
+        exp = "\\\\\\";
+        assertEquals(exp, transformer.getSite(url, "UTF-8"));
+    }
+}
diff --git a/src/test/java/org/codelibs/fess/crawler/transformer/FessXpathTransformerTest.java b/src/test/java/org/codelibs/fess/crawler/transformer/FessXpathTransformerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..24b8cecd24307a1ec6bdcdd3b49c181217bdda03
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/crawler/transformer/FessXpathTransformerTest.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.crawler.transformer;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.codelibs.fess.crawler.builder.RequestDataBuilder;
+import org.codelibs.fess.crawler.entity.RequestData;
+import org.codelibs.fess.crawler.entity.ResponseData;
+import org.codelibs.fess.crawler.exception.ChildUrlsException;
+import org.codelibs.fess.unit.UnitFessTestCase;
+import org.cyberneko.html.parsers.DOMParser;
+import org.lastaflute.di.core.exception.ComponentNotFoundException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+public class FessXpathTransformerTest extends UnitFessTestCase {
+    public FessXpathTransformer fessXpathTransformer;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        fessXpathTransformer = new FessXpathTransformer();
+        fessXpathTransformer.convertUrlMap.put("feed:", "http:");
+    }
+
+    public void test_pruneNode() throws Exception {
+        final String data = "<html><body><br/><script>foo</script><noscript>bar</noscript></body></html>";
+        final Document document = getDocument(data);
+
+        final FessXpathTransformer transformer = new FessXpathTransformer();
+
+        final Node pruneNode = transformer.pruneNode(document.cloneNode(true));
+        assertEquals(getXmlString(document), getXmlString(pruneNode));
+    }
+
+    public void test_pruneNode_removeNoScript() throws Exception {
+        final String data = "<html><body><br/><script>foo</script><noscript>bar</noscript></body></html>";
+        final Document document = getDocument(data);
+
+        final FessXpathTransformer transformer = new FessXpathTransformer();
+        transformer.prunedTagList.add("noscript");
+
+        final Node pruneNode = transformer.pruneNode(document.cloneNode(true));
+        final String docString = getXmlString(document);
+        final String pnString = getXmlString(pruneNode);
+        assertTrue(docString.contains("<SCRIPT>"));
+        assertTrue(docString.contains("foo"));
+        assertTrue(docString.contains("<NOSCRIPT>"));
+        assertTrue(docString.contains("bar"));
+        assertTrue(pnString.contains("<SCRIPT>"));
+        assertTrue(pnString.contains("foo"));
+        assertFalse(pnString.contains("<NOSCRIPT>"));
+        assertFalse(pnString.contains("bar"));
+    }
+
+    public void test_pruneNode_removeScriptAndNoscript() throws Exception {
+        final String data = "<html><body><br/><script>foo</script><noscript>bar</noscript></body></html>";
+        final Document document = getDocument(data);
+
+        final FessXpathTransformer transformer = new FessXpathTransformer();
+        transformer.prunedTagList.add("script");
+        transformer.prunedTagList.add("noscript");
+
+        final Node pruneNode = transformer.pruneNode(document.cloneNode(true));
+        final String docString = getXmlString(document);
+        final String pnString = getXmlString(pruneNode);
+        assertTrue(docString.contains("<SCRIPT>"));
+        assertTrue(docString.contains("foo"));
+        assertTrue(docString.contains("<NOSCRIPT>"));
+        assertTrue(docString.contains("bar"));
+        assertFalse(pnString.contains("<SCRIPT>"));
+        assertFalse(pnString.contains("foo"));
+        assertFalse(pnString.contains("<NOSCRIPT>"));
+        assertFalse(pnString.contains("bar"));
+    }
+
+    private Document getDocument(final String data) throws Exception {
+        final DOMParser parser = new DOMParser();
+        final ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes("UTF-8"));
+        parser.parse(new InputSource(is));
+        return parser.getDocument();
+    }
+
+    private String getXmlString(final Node node) throws Exception {
+        final TransformerFactory tf = TransformerFactory.newInstance();
+        final javax.xml.transform.Transformer transformer = tf.newTransformer();
+        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+        transformer.setOutputProperty(OutputKeys.INDENT, "no");
+        //        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+
+        final StringWriter writer = new StringWriter();
+        final StreamResult result = new StreamResult(writer);
+
+        final DOMSource source = new DOMSource(node);
+        transformer.transform(source, result);
+
+        return writer.toString();
+
+    }
+
+    public void test_isValidPath_valid() {
+        String value;
+
+        value = "foo.html";
+        assertTrue(fessXpathTransformer.isValidPath(value));
+
+        value = "./foo.html";
+        assertTrue(fessXpathTransformer.isValidPath(value));
+
+        value = "/foo.html";
+        assertTrue(fessXpathTransformer.isValidPath(value));
+
+        value = "http://www.seasar.org/foo.html";
+        assertTrue(fessXpathTransformer.isValidPath(value));
+
+        value = "a javascript:...";
+        assertTrue(fessXpathTransformer.isValidPath(value));
+
+    }
+
+    public void test_isValidPath_invalid() {
+        String value;
+
+        value = "javascript:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = "mailto:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = "irc:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = " javascript:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = " mailto:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = " irc:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = "JAVASCRIPT:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = "MAILTO:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = "IRC:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+
+        value = "skype:...";
+        assertFalse(fessXpathTransformer.isValidPath(value));
+    }
+
+    public void test_convertChildUrlList() {
+        List<RequestData> urlList = new ArrayList<>();
+
+        urlList = fessXpathTransformer.convertChildUrlList(urlList);
+        assertEquals(0, urlList.size());
+
+        urlList.clear();
+        urlList.add(RequestDataBuilder.newRequestData().get().url("http://www.example.com").build());
+        urlList = fessXpathTransformer.convertChildUrlList(urlList);
+        assertEquals(1, urlList.size());
+        assertEquals("http://www.example.com", urlList.get(0).getUrl());
+
+        urlList.clear();
+        urlList.add(RequestDataBuilder.newRequestData().get().url("http://www.example.com").build());
+        urlList.add(RequestDataBuilder.newRequestData().get().url("http://www.test.com").build());
+        urlList = fessXpathTransformer.convertChildUrlList(urlList);
+        assertEquals(2, urlList.size());
+        assertEquals("http://www.example.com", urlList.get(0).getUrl());
+        assertEquals("http://www.test.com", urlList.get(1).getUrl());
+
+        urlList.clear();
+        urlList.add(RequestDataBuilder.newRequestData().get().url("feed://www.example.com").build());
+        urlList.add(RequestDataBuilder.newRequestData().get().url("http://www.test.com").build());
+        urlList = fessXpathTransformer.convertChildUrlList(urlList);
+        assertEquals(2, urlList.size());
+        assertEquals("http://www.example.com", urlList.get(0).getUrl());
+        assertEquals("http://www.test.com", urlList.get(1).getUrl());
+
+    }
+
+    public void test_normalizeContent() {
+        assertEquals("", fessXpathTransformer.normalizeContent(""));
+        assertEquals(" ", fessXpathTransformer.normalizeContent(" "));
+        assertEquals(" ", fessXpathTransformer.normalizeContent("  "));
+        assertEquals(" ", fessXpathTransformer.normalizeContent("\t"));
+        assertEquals(" ", fessXpathTransformer.normalizeContent("\t\t"));
+        assertEquals(" ", fessXpathTransformer.normalizeContent("\t \t"));
+    }
+
+    public void test_removeCommentTag() {
+        assertEquals("", fessXpathTransformer.removeCommentTag(""));
+        assertEquals(" ", fessXpathTransformer.removeCommentTag("<!-- - -->"));
+        assertEquals("abc", fessXpathTransformer.removeCommentTag("abc"));
+        assertEquals("abc ", fessXpathTransformer.removeCommentTag("abc<!-- foo -->"));
+        assertEquals("abc 123", fessXpathTransformer.removeCommentTag("abc<!-- fo\no -->123"));
+        assertEquals("abc 123", fessXpathTransformer.removeCommentTag("abc<!--\n foo -->123"));
+        assertEquals("abc 123", fessXpathTransformer.removeCommentTag("abc<!-- foo -->123"));
+        assertEquals("abc 123 ", fessXpathTransformer.removeCommentTag("abc<!-- foo1 -->123<!-- foo2 -->"));
+        assertEquals("abc 123 xyz", fessXpathTransformer.removeCommentTag("abc<!-- foo1 -->123<!-- foo2 -->xyz"));
+        assertEquals("abc ", fessXpathTransformer.removeCommentTag("abc<!---->"));
+        assertEquals("abc -->", fessXpathTransformer.removeCommentTag("abc<!-- foo-->-->"));
+        assertEquals("abc<!-- foo", fessXpathTransformer.removeCommentTag("abc<!-- foo"));
+        assertEquals("abc  -->123", fessXpathTransformer.removeCommentTag("abc<!-- <!-- foo --> -->123"));
+    }
+
+    public void test_canonicalXpath() throws Exception {
+        final FessXpathTransformer transformer = new FessXpathTransformer();
+
+        final Map<String, Object> dataMap = new HashMap<String, Object>();
+        final ResponseData responseData = new ResponseData();
+        responseData.setUrl("http://example.com/");
+
+        String data = "<html><body>aaa</body></html>";
+        Document document = getDocument(data);
+        try {
+            transformer.putAdditionalData(dataMap, responseData, document);
+            fail();
+        } catch (final ComponentNotFoundException e) {
+            // ignore
+        }
+
+        data = "<html><head><link rel=\"canonical\" href=\"http://example.com/\"></head><body>aaa</body></html>";
+        document = getDocument(data);
+        try {
+            transformer.putAdditionalData(dataMap, responseData, document);
+            fail();
+        } catch (final ComponentNotFoundException e) {
+            // ignore
+        }
+
+        data = "<html><head><link rel=\"canonical\" href=\"http://example.com/foo\"></head><body>aaa</body></html>";
+        document = getDocument(data);
+        try {
+            transformer.putAdditionalData(dataMap, responseData, document);
+            fail();
+        } catch (final ChildUrlsException e) {
+            final Set<RequestData> childUrlList = e.getChildUrlList();
+            assertEquals(1, childUrlList.size());
+            assertEquals("http://example.com/foo", childUrlList.iterator().next().getUrl());
+        }
+
+        data = "<html><link rel=\"canonical\" href=\"http://example.com/foo\"><body>aaa</body></html>";
+        document = getDocument(data);
+        try {
+            transformer.putAdditionalData(dataMap, responseData, document);
+            fail();
+        } catch (final ChildUrlsException e) {
+            final Set<RequestData> childUrlList = e.getChildUrlList();
+            assertEquals(1, childUrlList.size());
+            assertEquals("http://example.com/foo", childUrlList.iterator().next().getUrl());
+        }
+    }
+
+    public void test_contentXpath() throws Exception {
+        final FessXpathTransformer transformer = new FessXpathTransformer();
+
+        final String data = "<html><head><meta name=\"keywords\" content=\"bbb\"></head><body>aaa</body></html>";
+        final Document document = getDocument(data);
+        String value = transformer.getSingleNodeValue(document, "//BODY", false);
+        assertEquals("aaa", value);
+
+        value = transformer.getSingleNodeValue(document, "//META[@name='keywords']/@content", false);
+        assertEquals("bbb", value);
+
+        value = transformer.getSingleNodeValue(document, "//META[@name='keywords']/@content|//BODY", false);
+        assertEquals("bbb aaa", value);
+    }
+}
diff --git a/src/test/java/org/codelibs/fess/dict/kuromoji/KuromojiFileTest.java b/src/test/java/org/codelibs/fess/dict/kuromoji/KuromojiFileTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..33673c78a4053caeb7b5773eab512f12b4c8681e
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/dict/kuromoji/KuromojiFileTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.dict.kuromoji;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.codelibs.fess.dict.DictionaryFile.PagingList;
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class KuromojiFileTest extends UnitFessTestCase {
+    private KuromojiFile kuromojiFile;
+
+    /*
+    // TODO
+    private File file1;
+
+    @Override
+    protected void setUp() throws Exception {
+        file1 = File.createTempFile("kuromoji_", ".txt");
+        FileUtil.write(
+                file1.getAbsolutePath(),
+                "token1,seg1,reading1,pos1\ntoken2,seg2,reading2,pos2\ntoken3,seg3,reading3,pos3"
+                        .getBytes(Constants.UTF_8));
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        file1.delete();
+    }
+    */
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        kuromojiFile = new KuromojiFile("1", "dummy", new Date());
+        List<KuromojiItem> itemList = new ArrayList<>();
+        itemList.add(new KuromojiItem(1, "token1", "seg1", "reading1", "pos1"));
+        itemList.add(new KuromojiItem(2, "token2", "seg2", "reading2", "pos2"));
+        itemList.add(new KuromojiItem(3, "token3", "seg3", "reading3", "pos3"));
+        kuromojiFile.kuromojiItemList = itemList;
+    }
+
+    public void test_selectList() {
+        final PagingList<KuromojiItem> itemList1 = kuromojiFile.selectList(0, 20);
+        assertEquals(3, itemList1.size());
+        assertEquals(3, itemList1.getAllRecordCount());
+        assertEquals(1, itemList1.getCurrentPageNumber());
+        assertEquals(20, itemList1.getPageSize());
+
+        final PagingList<KuromojiItem> itemList2 = kuromojiFile.selectList(2, 2);
+        assertEquals(1, itemList2.size());
+        assertEquals(3, itemList2.getAllRecordCount());
+        assertEquals(2, itemList2.getCurrentPageNumber());
+        assertEquals(2, itemList2.getPageSize());
+
+        assertEquals(0, kuromojiFile.selectList(5, 5).size());
+        assertEquals(0, kuromojiFile.selectList(-1, 5).size());
+    }
+
+    public void test_selectList2() {
+        final PagingList<KuromojiItem> itemList = kuromojiFile.selectList(0, 5);
+        for (int i = 0; i < itemList.size(); i++) {
+            final KuromojiItem kuromojiItem = itemList.get(i);
+            assertEquals("token" + (i + 1), kuromojiItem.getToken());
+            assertEquals("seg" + (i + 1), kuromojiItem.getSegmentation());
+            assertEquals("reading" + (i + 1), kuromojiItem.getReading());
+            assertEquals("pos" + (i + 1), kuromojiItem.getPos());
+            assertFalse(kuromojiItem.isUpdated());
+            assertFalse(kuromojiItem.isUpdated());
+        }
+    }
+
+    /*
+    // TODO
+    public void test_insert() {
+        final KuromojiFile kuromojiFile = new KuromojiFile(file1);
+        final PagingList<KuromojiItem> itemList1 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(3, itemList1.size());
+
+        final KuromojiItem kuromojiItem1 = new KuromojiItem(0, "token4",
+                "seg4", "reading4", "pos4");
+        kuromojiFile.insert(kuromojiItem1);
+        final PagingList<KuromojiItem> itemList2 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(4, itemList2.size());
+        assertEquals("token4", itemList2.get(3).getToken());
+        assertEquals("seg4", itemList2.get(3).getSegmentation());
+        assertEquals("reading4", itemList2.get(3).getReading());
+        assertEquals("pos4", itemList2.get(3).getPos());
+
+        final KuromojiItem kuromojiItem2 = new KuromojiItem(0, "token5",
+                "seg5", "reading5", "pos5");
+        kuromojiFile.insert(kuromojiItem2);
+        final PagingList<KuromojiItem> itemList3 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(5, itemList3.size());
+        assertEquals("token5", itemList3.get(4).getToken());
+        assertEquals("seg5", itemList3.get(4).getSegmentation());
+        assertEquals("reading5", itemList3.get(4).getReading());
+        assertEquals("pos5", itemList3.get(4).getPos());
+    }
+
+    public void test_update() {
+        final KuromojiFile kuromojiFile = new KuromojiFile(file1);
+        final PagingList<KuromojiItem> itemList1 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(3, itemList1.size());
+
+        final KuromojiItem kuromojiItem1 = itemList1.get(0);
+        kuromojiItem1.setNewToken("TOKEN1");
+        kuromojiItem1.setNewSegmentation("SEG1");
+        kuromojiItem1.setNewReading("READING1");
+        kuromojiItem1.setNewPos("POS1");
+        kuromojiFile.update(kuromojiItem1);
+        final PagingList<KuromojiItem> itemList2 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(3, itemList2.size());
+        final KuromojiItem kuromojiItem2 = itemList2.get(0);
+        assertEquals("TOKEN1", kuromojiItem2.getToken());
+        assertEquals("SEG1", kuromojiItem2.getSegmentation());
+        assertEquals("READING1", kuromojiItem2.getReading());
+        assertEquals("POS1", kuromojiItem2.getPos());
+        assertFalse(kuromojiItem2.isUpdated());
+
+        final KuromojiItem kuromojiItem3 = itemList2.get(2);
+        kuromojiItem3.setNewToken("TOKEN3");
+        kuromojiItem3.setNewSegmentation("SEG3");
+        kuromojiItem3.setNewReading("READING3");
+        kuromojiItem3.setNewPos("POS3");
+        kuromojiFile.update(kuromojiItem3);
+        final PagingList<KuromojiItem> itemList3 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(3, itemList3.size());
+        final KuromojiItem kuromojiItem4 = itemList3.get(2);
+        assertEquals("TOKEN3", kuromojiItem4.getToken());
+        assertEquals("SEG3", kuromojiItem4.getSegmentation());
+        assertEquals("READING3", kuromojiItem4.getReading());
+        assertEquals("POS3", kuromojiItem4.getPos());
+        assertFalse(kuromojiItem4.isUpdated());
+    }
+
+    public void test_delete() throws Exception {
+        final KuromojiFile kuromojiFile = new KuromojiFile(file1);
+        final PagingList<KuromojiItem> itemList1 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(3, itemList1.size());
+
+        final KuromojiItem kuromojiItem1 = itemList1.get(0);
+        kuromojiFile.delete(kuromojiItem1);
+        final PagingList<KuromojiItem> itemList2 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(2, itemList2.size());
+
+        final KuromojiItem kuromojiItem2 = itemList2.get(1);
+        kuromojiFile.delete(kuromojiItem2);
+        final PagingList<KuromojiItem> itemList3 = kuromojiFile.selectList(0,
+                20);
+        assertEquals(1, itemList3.size());
+
+        assertEquals("token2,seg2,reading2,pos2" + Constants.LINE_SEPARATOR,
+                new String(FileUtil.getBytes(file1), Constants.UTF_8));
+
+    }
+    */
+
+}
diff --git a/src/test/java/org/codelibs/fess/dict/kuromoji/KuromojiItemTest.java b/src/test/java/org/codelibs/fess/dict/kuromoji/KuromojiItemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f1be41c28e8396f969c9bc4436908c667ac65c7
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/dict/kuromoji/KuromojiItemTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.dict.kuromoji;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class KuromojiItemTest extends UnitFessTestCase {
+    public void test_new1() {
+        final KuromojiItem kuromojiItem = new KuromojiItem(1, "t1", "s1", "r1", "p1");
+        assertEquals(1, kuromojiItem.getId());
+        assertEquals("t1", kuromojiItem.getToken());
+        assertEquals("s1", kuromojiItem.getSegmentation());
+        assertEquals("r1", kuromojiItem.getReading());
+        assertEquals("p1", kuromojiItem.getPos());
+        assertNull(kuromojiItem.getNewToken());
+        assertNull(kuromojiItem.getNewSegmentation());
+        assertNull(kuromojiItem.getNewReading());
+        assertNull(kuromojiItem.getNewPos());
+        assertFalse(kuromojiItem.isUpdated());
+        assertFalse(kuromojiItem.isDeleted());
+
+        kuromojiItem.setNewToken("T1");
+        kuromojiItem.setNewSegmentation("S1");
+        kuromojiItem.setNewReading("R1");
+        kuromojiItem.setNewPos("P1");
+        assertTrue(kuromojiItem.isUpdated());
+        assertFalse(kuromojiItem.isDeleted());
+
+        kuromojiItem.setNewToken("");
+        assertTrue(kuromojiItem.isUpdated());
+        assertTrue(kuromojiItem.isDeleted());
+    }
+
+    public void test_equals1() {
+        final KuromojiItem kuromojiItem1 = new KuromojiItem(1, "t1", "s1", "r1", "p1");
+
+        assertTrue(kuromojiItem1.equals(kuromojiItem1));
+        assertTrue(kuromojiItem1.equals(new KuromojiItem(1, "t1", "s1", "r1", "p1")));
+        assertTrue(kuromojiItem1.equals(new KuromojiItem(2, "t1", "s1", "r1", "p1")));
+        assertFalse(kuromojiItem1.equals(new KuromojiItem(1, "T1", "s1", "r1", "p1")));
+        assertFalse(kuromojiItem1.equals(new KuromojiItem(1, "t1", "S1", "r1", "p1")));
+        assertFalse(kuromojiItem1.equals(new KuromojiItem(1, "t1", "s1", "R1", "p1")));
+        assertFalse(kuromojiItem1.equals(new KuromojiItem(1, "t1", "s1", "r1", "P1")));
+    }
+
+    public void test_toLineString() {
+        assertEquals("t1,s1,r1,p1", new KuromojiItem(1, "t1", "s1", "r1", "p1").toLineString());
+        assertEquals("t\"\"1,s\"\"1,r\"\"1,p\"\"1", new KuromojiItem(1, "t\"1", "s\"1", "r\"1", "p\"1").toLineString());
+        assertEquals("\"t,1\",\"s,1\",\"r,1\",\"p,1\"", new KuromojiItem(1, "t,1", "s,1", "r,1", "p,1").toLineString());
+        assertEquals("\"t\"\",1\",\"s\"\",1\",\"r\"\",1\",\"p\"\",1\"",
+                new KuromojiItem(1, "t\",1", "s\",1", "r\",1", "p\",1").toLineString());
+    }
+}
diff --git a/src/test/java/org/codelibs/fess/dict/synonym/SynonymFileTest.java b/src/test/java/org/codelibs/fess/dict/synonym/SynonymFileTest.java
index 71e7b57f6a1b7f72ba47cc64a52247b2aa139c92..2d008fe20c5bfc77f36b9ac60430832052987044 100644
--- a/src/test/java/org/codelibs/fess/dict/synonym/SynonymFileTest.java
+++ b/src/test/java/org/codelibs/fess/dict/synonym/SynonymFileTest.java
@@ -15,33 +15,50 @@
  */
 package org.codelibs.fess.dict.synonym;
 
-import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
-import org.codelibs.core.io.FileUtil;
-import org.codelibs.fess.Constants;
+import org.codelibs.fess.dict.DictionaryFile.PagingList;
 import org.codelibs.fess.unit.UnitFessTestCase;
 
 public class SynonymFileTest extends UnitFessTestCase {
-    private File file1;
+    private SynonymFile synonymFile;
 
+    // TODO
+    /*
+    private File file1;
     @Override
     public void setUp() throws Exception {
         super.setUp();
         file1 = File.createTempFile("synonym", ".txt");
-        FileUtil.writeBytes(file1.getAbsolutePath(), "a1=>A1\nb1,b2 => B1\nc1 => C1, C2\nx1,X1\ny1, Y1, y2".getBytes(Constants.UTF_8));
+        FileUtil.writeBytes(file1.getAbsolutePath(),
+                "a1=>A1\nb1,b2 => B1\nc1 => C1, C2\nx1,X1\ny1, Y1, y2"
+                        .getBytes(Constants.UTF_8));
+        // TODO set up elasticsearch and dictionaryManager
+        synonymFile = new SynonymFile("1", file1.getAbsolutePath(), new Date());
     }
 
     @Override
     public void tearDown() throws Exception {
-        super.tearDown();
         file1.delete();
     }
+    */
 
-    public void test_create() {
-        // TODO
-        /*
-        final SynonymCreator synonymCreator = new SynonymCreator();
-        final SynonymFile synonymFile = (SynonymFile) synonymCreator.create(file1.getPath(), new Date());
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        synonymFile = new SynonymFile("1", "dummy", new Date());
+        List<SynonymItem> itemList = new ArrayList<>();
+        itemList.add(new SynonymItem(1, new String[] { "a1" }, new String[] { "A1" }));
+        itemList.add(new SynonymItem(2, new String[] { "b1", "b2" }, new String[] { "B1" }));
+        itemList.add(new SynonymItem(3, new String[] { "c1" }, new String[] { "C1", "C2" }));
+        itemList.add(new SynonymItem(4, new String[] { "x1", "X1" }, new String[] { "x1", "X1" }));
+        itemList.add(new SynonymItem(5, new String[] { "y1", "Y1", "y2" }, new String[] { "y1", "Y1", "y2" }));
+        synonymFile.synonymItemList = itemList;
+    }
+
+    public void test_selectList() {
         final PagingList<SynonymItem> itemList1 = synonymFile.selectList(0, 20); // error occurs
         assertEquals(5, itemList1.size());
         assertEquals(5, itemList1.getAllRecordCount());
@@ -56,7 +73,129 @@ public class SynonymFileTest extends UnitFessTestCase {
 
         assertEquals(0, synonymFile.selectList(5, 5).size());
         assertEquals(0, synonymFile.selectList(-1, 5).size());
-        */
     }
 
+    public void test_selectList2() {
+        final PagingList<SynonymItem> itemList = synonymFile.selectList(0, 5);
+        assertEquals(1, itemList.get(0).getInputs().length);
+        assertEquals(1, itemList.get(0).getOutputs().length);
+        assertEquals("a1", itemList.get(0).getInputs()[0]);
+        assertEquals("A1", itemList.get(0).getOutputs()[0]);
+        assertFalse(itemList.get(0).isUpdated());
+
+        assertEquals(2, itemList.get(1).getInputs().length);
+        assertEquals(1, itemList.get(1).getOutputs().length);
+        assertEquals("b1", itemList.get(1).getInputs()[0]);
+        assertEquals("b2", itemList.get(1).getInputs()[1]);
+        assertEquals("B1", itemList.get(1).getOutputs()[0]);
+        assertFalse(itemList.get(1).isUpdated());
+
+        assertEquals(1, itemList.get(2).getInputs().length);
+        assertEquals(2, itemList.get(2).getOutputs().length);
+        assertEquals("c1", itemList.get(2).getInputs()[0]);
+        assertEquals("C1", itemList.get(2).getOutputs()[0]);
+        assertEquals("C2", itemList.get(2).getOutputs()[1]);
+        assertFalse(itemList.get(2).isUpdated());
+
+        assertEquals(2, itemList.get(3).getInputs().length);
+        assertEquals(2, itemList.get(3).getOutputs().length);
+        assertEquals("X1", itemList.get(3).getInputs()[0]);
+        assertEquals("x1", itemList.get(3).getInputs()[1]);
+        assertEquals("X1", itemList.get(3).getOutputs()[0]);
+        assertEquals("x1", itemList.get(3).getOutputs()[1]);
+        assertFalse(itemList.get(3).isUpdated());
+
+        assertEquals(3, itemList.get(4).getInputs().length);
+        assertEquals(3, itemList.get(4).getOutputs().length);
+        assertEquals("Y1", itemList.get(4).getInputs()[0]);
+        assertEquals("y1", itemList.get(4).getInputs()[1]);
+        assertEquals("y2", itemList.get(4).getInputs()[2]);
+        assertEquals("Y1", itemList.get(4).getOutputs()[0]);
+        assertEquals("y1", itemList.get(4).getOutputs()[1]);
+        assertEquals("y2", itemList.get(4).getOutputs()[2]);
+        assertFalse(itemList.get(4).isUpdated());
+    }
+
+    /*
+    public void test_insert() {
+         final PagingList<SynonymItem> itemList1 = synonymFile.selectList(0, 20);
+         assertEquals(5, itemList1.size());
+
+         final SynonymItem synonymItem1 = new SynonymItem(0, new String[] { "z1", "z2" }, new String[] { "Z1", "Z2" });
+         synonymFile.insert(synonymItem1);
+         final PagingList<SynonymItem> itemList2 = synonymFile.selectList(0, 20);
+         assertEquals(6, itemList2.size());
+         assertEquals("z1", itemList2.get(5).getInputs()[0]);
+         assertEquals("z2", itemList2.get(5).getInputs()[1]);
+         assertEquals("Z1", itemList2.get(5).getOutputs()[0]);
+         assertEquals("Z2", itemList2.get(5).getOutputs()[1]);
+
+         final SynonymItem synonymItem2 = new SynonymItem(0, new String[] {"z1", "z2" }, new String[] { "z1", "z2" });
+         synonymFile.insert(synonymItem2);
+         final PagingList<SynonymItem> itemList3 = synonymFile.selectList(0, 20);
+         assertEquals(7, itemList3.size());
+         assertEquals("z1", itemList3.get(6).getInputs()[0]);
+         assertEquals("z2", itemList3.get(6).getInputs()[1]);
+         assertEquals("z1", itemList3.get(6).getOutputs()[0]);
+         assertEquals("z2", itemList3.get(6).getOutputs()[1]);
+     }
+    
+     public void test_update() {
+         final SynonymFile synonymFile = new SynonymFile(file1);
+         final PagingList<SynonymItem> itemList1 = synonymFile.selectList(0, 20);
+         assertEquals(5, itemList1.size());
+
+         final SynonymItem synonymItem1 = itemList1.get(0);
+         synonymItem1.setNewInputs(new String[] { "a1", "a2" });
+         synonymItem1.setNewOutputs(new String[] { "A1", "A2" });
+         synonymFile.update(synonymItem1);
+         final PagingList<SynonymItem> itemList2 = synonymFile.selectList(0, 20);
+         assertEquals(5, itemList2.size());
+         final SynonymItem synonymItem2 = itemList2.get(0);
+         assertEquals(2, synonymItem2.getInputs().length);
+         assertEquals(2, synonymItem2.getOutputs().length);
+         assertEquals("a1", synonymItem2.getInputs()[0]);
+         assertEquals("a2", synonymItem2.getInputs()[1]);
+         assertEquals("A1", synonymItem2.getOutputs()[0]);
+         assertEquals("A2", synonymItem2.getOutputs()[1]);
+         assertFalse(synonymItem2.isUpdated());
+
+         final SynonymItem synonymItem3 = itemList2.get(2);
+         synonymItem3.setNewInputs(new String[] { "c1", "c2" });
+         synonymItem3.setNewOutputs(new String[] { "c1", "c2" });
+         synonymFile.update(synonymItem3);
+         final PagingList<SynonymItem> itemList3 = synonymFile.selectList(0, 20);
+         assertEquals(5, itemList3.size());
+         final SynonymItem synonymItem4 = itemList3.get(2);
+         assertEquals(2, synonymItem4.getInputs().length);
+         assertEquals(2, synonymItem4.getOutputs().length);
+         assertEquals("c1", synonymItem4.getInputs()[0]);
+         assertEquals("c2", synonymItem4.getInputs()[1]);
+         assertEquals("c1", synonymItem4.getOutputs()[0]);
+         assertEquals("c2", synonymItem4.getOutputs()[1]);
+         assertFalse(synonymItem2.isUpdated());
+     }
+
+     public void test_delete() throws Exception {
+         final SynonymFile synonymFile = new SynonymFile(file1);
+         final PagingList<SynonymItem> itemList1 = synonymFile.selectList(0, 20);
+         assertEquals(5, itemList1.size());
+
+         final SynonymItem synonymItem1 = itemList1.get(0);
+         synonymFile.delete(synonymItem1);
+         final PagingList<SynonymItem> itemList2 = synonymFile.selectList(0, 20);
+         assertEquals(4, itemList2.size());
+
+         final SynonymItem synonymItem2 = itemList2.get(3);
+         synonymFile.delete(synonymItem2);
+         final PagingList<SynonymItem> itemList3 = synonymFile.selectList(0, 20);
+         assertEquals(3, itemList3.size());
+
+         assertEquals(
+                 "b1,b2=>B1" + Constants.LINE_SEPARATOR + "c1=>C1,C2"
+                         + Constants.LINE_SEPARATOR + "X1,x1"
+                         + Constants.LINE_SEPARATOR,
+                 new String(FileUtil.getBytes(file1), Constants.UTF_8));
+     }
+     */
 }
diff --git a/src/test/java/org/codelibs/fess/ds/impl/DatabaseDataStoreImplTest.java b/src/test/java/org/codelibs/fess/ds/impl/DatabaseDataStoreImplTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c29292f09c1140244cb753967ce82d95888ffb0b
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/ds/impl/DatabaseDataStoreImplTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.ds.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class DatabaseDataStoreImplTest extends UnitFessTestCase {
+    public DatabaseDataStoreImpl databaseDataStore;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        databaseDataStore = new DatabaseDataStoreImpl();
+    }
+
+    public void test_convertValue() {
+        String value;
+        final Map<String, String> paramMap = new HashMap<String, String>();
+        paramMap.put("param1", "PARAM1");
+        paramMap.put("param2", "PARAM2+");
+        paramMap.put("param3", "PARAM3*");
+
+        value = "\"abc\"";
+        assertEquals("abc", databaseDataStore.convertValue(value, paramMap));
+
+        value = "param1";
+        assertEquals("PARAM1", databaseDataStore.convertValue(value, paramMap));
+
+        value = "param2";
+        assertEquals("PARAM2+", databaseDataStore.convertValue(value, paramMap));
+
+        value = "\"123\"+param2+\",\"+param3+\"abc\"";
+        assertEquals("123PARAM2+,PARAM3*abc", databaseDataStore.convertValue(value, paramMap));
+
+        value = null;
+        assertEquals("", databaseDataStore.convertValue(value, paramMap));
+
+        value = "";
+        assertEquals("", databaseDataStore.convertValue(value, paramMap));
+
+        value = " ";
+        assertNull(databaseDataStore.convertValue(value, paramMap));
+    }
+}
diff --git a/src/test/java/org/codelibs/fess/entity/GeoInfoTest.java b/src/test/java/org/codelibs/fess/entity/GeoInfoTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7eb070f32f11b432a015ac8dd02c7b1fd4ab8b76
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/entity/GeoInfoTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.entity;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class GeoInfoTest extends UnitFessTestCase {
+
+    public void test_0_0_10() {
+        final String latitude = "0";
+        final String lonitude = "0";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[0.0,0.0],\"distance\":\"10.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test_90_180_10() {
+        final String latitude = "90";
+        final String lonitude = "180";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[180.0,90.0],\"distance\":\"10.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test_91_181_10() {
+        final String latitude = "91";
+        final String lonitude = "181";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[-179.0,90.0],\"distance\":\"10.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test_91_361_10() {
+        final String latitude = "91";
+        final String lonitude = "361";
+        final String distance = "100";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[1.0,90.0],\"distance\":\"100.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test__90__180_10() {
+        final String latitude = "-90";
+        final String lonitude = "-180";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[-180.0,-90.0],\"distance\":\"10.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test__91__181_10() {
+        final String latitude = "-91";
+        final String lonitude = "-181";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[179.0,-90.0],\"distance\":\"10.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test__91__361_10() {
+        final String latitude = "-91";
+        final String lonitude = "-361";
+        final String distance = "100";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertTrue(geoInfo.isAvailable());
+        String result = "{\"geo_distance\":{\"geo_info\":[-1.0,-90.0],\"distance\":\"100.0km\"}}";
+        assertEquals(result, geoInfo.toQueryBuilder().toString().replaceAll("[ \n]", ""));
+    }
+
+    public void test_0_0_0() {
+        final String latitude = "0";
+        final String lonitude = "0";
+        final String distance = "0";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertFalse(geoInfo.isAvailable());
+    }
+
+    public void test_x_0_0() {
+        final String latitude = "x";
+        final String lonitude = "0";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertFalse(geoInfo.isAvailable());
+    }
+
+    public void test_0_x_0() {
+        final String latitude = "0";
+        final String lonitude = "x";
+        final String distance = "10";
+
+        final GeoInfo geoInfo = create(latitude, lonitude, distance);
+        assertFalse(geoInfo.isAvailable());
+    }
+
+    private GeoInfo create(final String latitude, final String longitude, final String distance) {
+        final GeoInfo geoInfo = new GeoInfo();
+        geoInfo.latitude = latitude;
+        geoInfo.longitude = longitude;
+        geoInfo.distance = distance;
+        return geoInfo;
+    }
+
+}
diff --git a/src/test/java/org/codelibs/fess/filter/EncodingFilterTest.java b/src/test/java/org/codelibs/fess/filter/EncodingFilterTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..453d4882c0daf66e8cbc93c7c3930ecb1c72596e
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/filter/EncodingFilterTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.filter;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class EncodingFilterTest extends UnitFessTestCase {
+    public void test_normal() throws IOException {
+        final EncodingFilter filter = new EncodingFilter();
+        Map<String, String[]> paramMap;
+
+        paramMap = filter.parseQueryString("a=1", "UTF-8");
+        assertEquals(1, paramMap.size());
+        assertEquals("1", paramMap.get("a")[0]);
+
+        paramMap = filter.parseQueryString("a=1&b=2", "UTF-8");
+        assertEquals(2, paramMap.size());
+        assertEquals("1", paramMap.get("a")[0]);
+        assertEquals("2", paramMap.get("b")[0]);
+
+        paramMap = filter.parseQueryString("a=111&b=222&c=333", "UTF-8");
+        assertEquals(3, paramMap.size());
+        assertEquals("111", paramMap.get("a")[0]);
+        assertEquals("222", paramMap.get("b")[0]);
+        assertEquals("333", paramMap.get("c")[0]);
+
+        paramMap = filter.parseQueryString("a=1&b=2&c=3&a=2", "UTF-8");
+        assertEquals(3, paramMap.size());
+        assertEquals("1", paramMap.get("a")[0]);
+        assertEquals("2", paramMap.get("a")[1]);
+        assertEquals("2", paramMap.get("b")[0]);
+        assertEquals("3", paramMap.get("c")[0]);
+
+    }
+
+    public void test_missing() throws IOException {
+        final EncodingFilter filter = new EncodingFilter();
+        Map<String, String[]> paramMap;
+
+        paramMap = filter.parseQueryString("a=", "UTF-8");
+        assertEquals(1, paramMap.size());
+        assertEquals("", paramMap.get("a")[0]);
+
+        paramMap = filter.parseQueryString("a", "UTF-8");
+        assertEquals(1, paramMap.size());
+        assertEquals("", paramMap.get("a")[0]);
+
+        paramMap = filter.parseQueryString("=1", "UTF-8");
+        assertEquals(1, paramMap.size());
+        assertEquals("1", paramMap.get("")[0]);
+
+        paramMap = filter.parseQueryString("=", "UTF-8");
+        assertEquals(1, paramMap.size());
+        assertEquals("", paramMap.get("")[0]);
+
+    }
+
+    public void test_decode() throws IOException {
+        final EncodingFilter filter = new EncodingFilter();
+        Map<String, String[]> paramMap;
+
+        paramMap = filter.parseQueryString("a=%E3%83%86%E3%82%B9%E3%83%88", "UTF-8");
+        assertEquals(1, paramMap.size());
+        assertEquals("テスト", paramMap.get("a")[0]);
+
+        paramMap = filter.parseQueryString("a=%A5%C6%A5%B9%A5%C8", "EUC-JP");
+        assertEquals(1, paramMap.size());
+        assertEquals("テスト", paramMap.get("a")[0]);
+
+        paramMap = filter.parseQueryString("a=%83e%83X%83g", "Shift_JIS");
+        assertEquals(1, paramMap.size());
+        assertEquals("テスト", paramMap.get("a")[0]);
+
+    }
+
+}
diff --git a/src/test/java/org/codelibs/fess/helper/DuplicateHostHelperTest.java b/src/test/java/org/codelibs/fess/helper/DuplicateHostHelperTest.java
index 311469927bf8b2a595dd1a8e0c037f8cf041b0f5..9623139b648200fb2308dc194cefbf6580dbf3a0 100644
--- a/src/test/java/org/codelibs/fess/helper/DuplicateHostHelperTest.java
+++ b/src/test/java/org/codelibs/fess/helper/DuplicateHostHelperTest.java
@@ -15,6 +15,9 @@
  */
 package org.codelibs.fess.helper;
 
+import java.util.ArrayList;
+
+import org.codelibs.fess.es.config.exentity.DuplicateHost;
 import org.codelibs.fess.unit.UnitFessTestCase;
 
 public class DuplicateHostHelperTest extends UnitFessTestCase {
@@ -24,13 +27,18 @@ public class DuplicateHostHelperTest extends UnitFessTestCase {
     public void setUp() throws Exception {
         super.setUp();
         duplicateHostHelper = new DuplicateHostHelper();
-        // duplicateHostHelper.init(); // TODO cause error
-    }
-
-    public void test_dummy() {
+        duplicateHostHelper.duplicateHostList = new ArrayList<DuplicateHost>();
+
+        DuplicateHost foo = new DuplicateHost();
+        foo.setRegularName("www.foo.com");
+        foo.setDuplicateHostName("foo.com");
+        duplicateHostHelper.duplicateHostList.add(foo);
+        DuplicateHost bar = new DuplicateHost();
+        bar.setRegularName("www.bar.com");
+        bar.setDuplicateHostName("mail.bar.com");
+        duplicateHostHelper.duplicateHostList.add(bar);
     }
 
-    /*
     public void test_convert() {
         String url;
         String result;
@@ -77,5 +85,5 @@ public class DuplicateHostHelperTest extends UnitFessTestCase {
         result = "http://www.bar.com:8080/";
         assertEquals(result, duplicateHostHelper.convert(url));
     }
-    */
+
 }
diff --git a/src/test/java/org/codelibs/fess/helper/impl/RoleQueryHelperImplTest.java b/src/test/java/org/codelibs/fess/helper/impl/RoleQueryHelperImplTest.java
index da208815b697602c824f25bf73d3abea96b5f563..712cabebb677d8609c470de3cad9e883db58fa63 100644
--- a/src/test/java/org/codelibs/fess/helper/impl/RoleQueryHelperImplTest.java
+++ b/src/test/java/org/codelibs/fess/helper/impl/RoleQueryHelperImplTest.java
@@ -15,11 +15,13 @@
  */
 package org.codelibs.fess.helper.impl;
 
+import java.util.Set;
+
+import javax.servlet.http.Cookie;
+
 import org.codelibs.core.crypto.CachedCipher;
-import org.codelibs.fess.helper.SystemHelper;
-import org.codelibs.fess.mylasta.direction.FessConfig;
+import org.codelibs.core.exception.IllegalBlockSizeRuntimeException;
 import org.codelibs.fess.unit.UnitFessTestCase;
-import org.codelibs.fess.util.ComponentUtil;
 
 public class RoleQueryHelperImplTest extends UnitFessTestCase {
     public RoleQueryHelperImpl roleQueryHelperImpl;
@@ -30,35 +32,26 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         super.setUp();
         roleQueryHelperImpl = new RoleQueryHelperImpl();
         cipher = new CachedCipher();
-        final FessConfig fessConfig = ComponentUtil.getFessConfig();
-        registerMockInstance(fessConfig);
-        registerMockInstance(new SystemHelper());
-        inject(roleQueryHelperImpl);
-    }
-
-    public void test_dummy() {
-        // TODO
+        cipher.setKey("1234567890123456");
     }
 
-    /*
-     * 
     public void test_buildByParameter() {
         final RoleQueryHelperImpl roleQueryHelperImpl = new RoleQueryHelperImpl();
 
         Set<String> roleSet;
 
-        roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+        roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.parameterKey = "fess1";
 
-        getRequest().setParameter("aaa", "bbb");
-        roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+        getMockRequest().setParameter("aaa", "bbb");
+        roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.encryptedParameterValue = false;
-        getRequest().setParameter("fess1", "xxx\nrole1,role2,role3");
-        roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+        getMockRequest().setParameter("fess1", "xxx\nrole1,role2,role3");
+        roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
         assertEquals(3, roleSet.size());
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
@@ -68,17 +61,16 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
 
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedParameterValue = true;
-        getRequest().setParameter("fess2",
-                cipher.encryptoText("xxx\nrole1,role2,role3"));
-        roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+        getMockRequest().setParameter("fess2", cipher.encryptoText("xxx\nrole1,role2,role3"));
+        roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
         assertEquals(3, roleSet.size());
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
         assertTrue(roleSet.contains("role3"));
 
-        getRequest().setParameter("fess2", "fail");
+        getMockRequest().setParameter("fess2", "fail");
         try {
-            roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+            roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
             fail();
         } catch (final IllegalBlockSizeRuntimeException e) {
             // ok
@@ -87,14 +79,14 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         roleQueryHelperImpl.parameterKey = "fess3";
 
         roleQueryHelperImpl.encryptedParameterValue = false;
-        roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+        roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.parameterKey = "fess4";
 
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedParameterValue = true;
-        roleSet = roleQueryHelperImpl.buildByParameter(getRequest());
+        roleSet = roleQueryHelperImpl.buildByParameter(getMockRequest());
         assertEquals(0, roleSet.size());
 
     }
@@ -105,7 +97,7 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         Set<String> roleSet;
 
         try {
-            roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+            roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
             fail();
         } catch (final NullPointerException e) {
             //ok
@@ -113,13 +105,13 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
 
         roleQueryHelperImpl.headerKey = "fess1";
 
-        getRequest().addHeader("aaa", "bbb");
-        roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+        getMockRequest().addHeader("aaa", "bbb");
+        roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.encryptedHeaderValue = false;
-        getRequest().addHeader("fess1", "xxx\nrole1,role2,role3");
-        roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+        getMockRequest().addHeader("fess1", "xxx\nrole1,role2,role3");
+        roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
         assertEquals(3, roleSet.size());
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
@@ -129,18 +121,17 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
 
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedHeaderValue = true;
-        getRequest().addHeader("fess2",
-                cipher.encryptoText("xxx\nrole1,role2,role3"));
-        roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+        getMockRequest().addHeader("fess2", cipher.encryptoText("xxx\nrole1,role2,role3"));
+        roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
         assertEquals(3, roleSet.size());
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
         assertTrue(roleSet.contains("role3"));
 
         roleQueryHelperImpl.headerKey = "fess2x";
-        getRequest().addHeader("fess2x", "fail");
+        getMockRequest().addHeader("fess2x", "fail");
         try {
-            roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+            roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
             fail();
         } catch (final IllegalBlockSizeRuntimeException e) {
             // ok
@@ -149,14 +140,14 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         roleQueryHelperImpl.headerKey = "fess3";
 
         roleQueryHelperImpl.encryptedHeaderValue = false;
-        roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+        roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.headerKey = "fess4";
 
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedHeaderValue = true;
-        roleSet = roleQueryHelperImpl.buildByHeader(getRequest());
+        roleSet = roleQueryHelperImpl.buildByHeader(getMockRequest());
         assertEquals(0, roleSet.size());
     }
 
@@ -166,13 +157,13 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         Set<String> roleSet;
         Cookie cookie;
 
-        roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+        roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
         assertEquals(0, roleSet.size());
 
         cookie = new Cookie("aaa", "bbb");
-        getRequest().addCookie(cookie);
+        getMockRequest().addCookie(cookie);
         try {
-            roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+            roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
             fail();
         } catch (final NullPointerException e) {
             // ok
@@ -180,13 +171,13 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
 
         roleQueryHelperImpl.cookieKey = "fess1";
 
-        roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+        roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.encryptedCookieValue = false;
         cookie = new Cookie("fess1", "xxx\nrole1,role2,role3");
-        getRequest().addCookie(cookie);
-        roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+        getMockRequest().addCookie(cookie);
+        roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
         assertEquals(3, roleSet.size());
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
@@ -196,10 +187,9 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
 
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedCookieValue = true;
-        cookie = new Cookie("fess2",
-                cipher.encryptoText("xxx\nrole1,role2,role3"));
-        getRequest().addCookie(cookie);
-        roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+        cookie = new Cookie("fess2", cipher.encryptoText("xxx\nrole1,role2,role3"));
+        getMockRequest().addCookie(cookie);
+        roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
         assertEquals(3, roleSet.size());
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
@@ -210,9 +200,9 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedCookieValue = true;
         cookie = new Cookie("fess2x", "fail");
-        getRequest().addCookie(cookie);
+        getMockRequest().addCookie(cookie);
         try {
-            roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+            roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
             fail();
         } catch (final Exception e) {
             // ok
@@ -221,14 +211,14 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         roleQueryHelperImpl.cookieKey = "fess3";
 
         roleQueryHelperImpl.encryptedCookieValue = false;
-        roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+        roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
         assertEquals(0, roleSet.size());
 
         roleQueryHelperImpl.cookieKey = "fess4";
 
         roleQueryHelperImpl.cipher = cipher;
         roleQueryHelperImpl.encryptedCookieValue = true;
-        roleSet = roleQueryHelperImpl.buildByCookie(getRequest());
+        roleSet = roleQueryHelperImpl.buildByCookie(getMockRequest());
         assertEquals(0, roleSet.size());
     }
 
@@ -361,6 +351,6 @@ public class RoleQueryHelperImplTest extends UnitFessTestCase {
         assertTrue(roleSet.contains("role1"));
         assertTrue(roleSet.contains("role2"));
         assertTrue(roleSet.contains("role3"));
-        }
-     */
+    }
+
 }
diff --git a/src/test/java/org/codelibs/fess/indexer/DocBoostMatcherTest.java b/src/test/java/org/codelibs/fess/indexer/DocBoostMatcherTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..440ac3cb7cdf2c62ef71acb7cd5c40d8fdd8a5ec
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/indexer/DocBoostMatcherTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.indexer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class DocBoostMatcherTest extends UnitFessTestCase {
+    public void test_integer() {
+        final DocBoostMatcher docBoostMatcher = new DocBoostMatcher();
+        docBoostMatcher.setBoostExpression("10");
+        docBoostMatcher.setMatchExpression("data1 > 10");
+
+        final Map<String, Object> map = new HashMap<String, Object>();
+
+        assertTrue(0.0f == docBoostMatcher.getValue(map));
+
+        map.put("data1", 20);
+        assertTrue(docBoostMatcher.match(map));
+
+        map.put("data1", 5);
+        assertFalse(docBoostMatcher.match(map));
+
+        map.remove("data1");
+        assertFalse(docBoostMatcher.match(map));
+
+        map.put("data2", 5);
+        assertFalse(docBoostMatcher.match(map));
+    }
+
+    public void test_string() {
+        final DocBoostMatcher docBoostMatcher = new DocBoostMatcher();
+        docBoostMatcher.setBoostExpression("10");
+        docBoostMatcher.setMatchExpression("data1 != null && data1.matches(\"test\")");
+
+        final Map<String, Object> map = new HashMap<String, Object>();
+
+        map.put("data1", "test");
+        assertTrue(docBoostMatcher.match(map));
+
+        map.put("data1", "aaa test bbb");
+        assertFalse(docBoostMatcher.match(map));
+
+        map.put("data1", "hoge");
+        assertFalse(docBoostMatcher.match(map));
+
+        map.remove("data1");
+        assertFalse(docBoostMatcher.match(map));
+
+        map.put("data2", "hoge");
+        assertFalse(docBoostMatcher.match(map));
+
+        docBoostMatcher.setMatchExpression("data1.matches(\".*test.*\")");
+        map.put("data1", "aaa test bbb");
+        assertTrue(docBoostMatcher.match(map));
+    }
+
+    public void test_boost_params() {
+        final DocBoostMatcher docBoostMatcher = new DocBoostMatcher();
+        docBoostMatcher.setBoostExpression("10 * boost1 + boost2");
+        docBoostMatcher.setMatchExpression("data1 > 10");
+
+        final Map<String, Object> map = new HashMap<String, Object>();
+
+        map.put("boost1", 0);
+        map.put("boost2", 0);
+        assertTrue(0.0f == docBoostMatcher.getValue(map));
+
+        map.put("boost1", 1);
+        map.put("boost2", 0);
+        assertTrue(10.0f == docBoostMatcher.getValue(map));
+
+        map.put("boost1", 1);
+        map.put("boost2", 2);
+        assertTrue(12.0f == docBoostMatcher.getValue(map));
+    }
+}
diff --git a/src/test/java/org/codelibs/fess/util/ParameterUtilTest.java b/src/test/java/org/codelibs/fess/util/ParameterUtilTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6d26e1ca8fbf7a235951202ba4021dd5367665b4
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/util/ParameterUtilTest.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.util;
+
+import java.util.Map;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class ParameterUtilTest extends UnitFessTestCase {
+    public void test_convertParameterMap() {
+        String parameters;
+        Map<String, String> parameterMap;
+
+        parameters = "";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(0, parameterMap.size());
+
+        parameters = "domain";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(1, parameterMap.size());
+        assertEquals("", parameterMap.get("domain"));
+
+        parameters = "domain=";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(1, parameterMap.size());
+        assertEquals("", parameterMap.get("domain"));
+
+        parameters = "domain=D";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(1, parameterMap.size());
+        assertEquals("D", parameterMap.get("domain"));
+
+        parameters = "domain=DOMAIN";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(1, parameterMap.size());
+        assertEquals("DOMAIN", parameterMap.get("domain"));
+
+        parameters = "\n";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(0, parameterMap.size());
+
+        parameters = "domain\nworkstation";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(2, parameterMap.size());
+        assertEquals("", parameterMap.get("domain"));
+        assertEquals("", parameterMap.get("workstation"));
+
+        parameters = "domain=\nworkstation=";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(2, parameterMap.size());
+        assertEquals("", parameterMap.get("domain"));
+        assertEquals("", parameterMap.get("workstation"));
+
+        parameters = "domain=D\nworkstation=W";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(2, parameterMap.size());
+        assertEquals("D", parameterMap.get("domain"));
+        assertEquals("W", parameterMap.get("workstation"));
+
+        parameters = "domain=DOMAIN\nworkstation=WORKSTATION";
+        parameterMap = ParameterUtil.parse(parameters);
+        assertEquals(2, parameterMap.size());
+        assertEquals("DOMAIN", parameterMap.get("domain"));
+        assertEquals("WORKSTATION", parameterMap.get("workstation"));
+    }
+
+    public void test_parseParameter() {
+        String value;
+        Map<String, String> paramMap;
+
+        value = "a=b";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(1, paramMap.size());
+        assertEquals("b", paramMap.get("a"));
+
+        value = "a=b\n1=2";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(2, paramMap.size());
+        assertEquals("b", paramMap.get("a"));
+        assertEquals("2", paramMap.get("1"));
+
+        value = "a=";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(1, paramMap.size());
+        assertEquals("", paramMap.get("a"));
+
+        value = "a";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(1, paramMap.size());
+        assertEquals("", paramMap.get("a"));
+
+        value = "a=b=c";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(1, paramMap.size());
+        assertEquals("b=c", paramMap.get("a"));
+
+        value = null;
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(0, paramMap.size());
+
+        value = "";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(0, paramMap.size());
+
+        value = " ";
+        paramMap = ParameterUtil.parse(value);
+        assertEquals(0, paramMap.size());
+    }
+
+    public void test_parseScript() {
+        String value;
+        Map<String, String> scriptMap;
+
+        value = "a=b";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(1, scriptMap.size());
+        assertEquals("b", scriptMap.get("a"));
+
+        value = "a=b\n1=2";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(2, scriptMap.size());
+        assertEquals("b", scriptMap.get("a"));
+        assertEquals("2", scriptMap.get("1"));
+
+        value = "a=";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(1, scriptMap.size());
+        assertEquals("", scriptMap.get("a"));
+
+        value = "a";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(1, scriptMap.size());
+        assertEquals("", scriptMap.get("a"));
+
+        value = "a=b=c";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(1, scriptMap.size());
+        assertEquals("b=c", scriptMap.get("a"));
+
+        value = null;
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(0, scriptMap.size());
+
+        value = "";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(0, scriptMap.size());
+
+        value = " ";
+        scriptMap = ParameterUtil.parse(value);
+        assertEquals(0, scriptMap.size());
+    }
+
+}
diff --git a/src/test/java/org/codelibs/fess/util/QueryResponseListTest.java b/src/test/java/org/codelibs/fess/util/QueryResponseListTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c40c51dcdbef7d6eadc09cc5a32885f4af8fccee
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/util/QueryResponseListTest.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class QueryResponseListTest extends UnitFessTestCase {
+    public void test_calculatePageInfo_page0() {
+        QueryResponseList qrList;
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.calculatePageInfo(0, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(1, qrList.getCurrentPageNumber());
+        assertEquals(0, qrList.getAllRecordCount());
+        assertEquals(1, qrList.getAllPageCount());
+        assertEquals(false, qrList.isExistPrevPage());
+        assertEquals(false, qrList.isExistNextPage());
+        assertEquals(0, qrList.getCurrentStartRecordNumber());
+        assertEquals(0, qrList.getCurrentEndRecordNumber());
+    }
+
+    public void test_calculatePageInfo_page1() {
+        QueryResponseList qrList;
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 10;
+        qrList.calculatePageInfo(0, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(1, qrList.getCurrentPageNumber());
+        assertEquals(10, qrList.getAllRecordCount());
+        assertEquals(1, qrList.getAllPageCount());
+        assertEquals(false, qrList.isExistPrevPage());
+        assertEquals(false, qrList.isExistNextPage());
+        assertEquals(1, qrList.getCurrentStartRecordNumber());
+        assertEquals(10, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 20;
+        qrList.calculatePageInfo(0, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(1, qrList.getCurrentPageNumber());
+        assertEquals(20, qrList.getAllRecordCount());
+        assertEquals(1, qrList.getAllPageCount());
+        assertEquals(false, qrList.isExistPrevPage());
+        assertEquals(false, qrList.isExistNextPage());
+        assertEquals(1, qrList.getCurrentStartRecordNumber());
+        assertEquals(20, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 21;
+        qrList.calculatePageInfo(0, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(1, qrList.getCurrentPageNumber());
+        assertEquals(21, qrList.getAllRecordCount());
+        assertEquals(2, qrList.getAllPageCount());
+        assertEquals(false, qrList.isExistPrevPage());
+        assertEquals(true, qrList.isExistNextPage());
+        assertEquals(1, qrList.getCurrentStartRecordNumber());
+        assertEquals(20, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 40;
+        qrList.calculatePageInfo(0, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(1, qrList.getCurrentPageNumber());
+        assertEquals(40, qrList.getAllRecordCount());
+        assertEquals(2, qrList.getAllPageCount());
+        assertEquals(false, qrList.isExistPrevPage());
+        assertEquals(true, qrList.isExistNextPage());
+        assertEquals(1, qrList.getCurrentStartRecordNumber());
+        assertEquals(20, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 41;
+        qrList.calculatePageInfo(0, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(1, qrList.getCurrentPageNumber());
+        assertEquals(41, qrList.getAllRecordCount());
+        assertEquals(3, qrList.getAllPageCount());
+        assertEquals(false, qrList.isExistPrevPage());
+        assertEquals(true, qrList.isExistNextPage());
+        assertEquals(1, qrList.getCurrentStartRecordNumber());
+        assertEquals(20, qrList.getCurrentEndRecordNumber());
+    }
+
+    public void test_calculatePageInfo_page2() {
+        QueryResponseList qrList;
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 21;
+        qrList.calculatePageInfo(20, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(2, qrList.getCurrentPageNumber());
+        assertEquals(21, qrList.getAllRecordCount());
+        assertEquals(2, qrList.getAllPageCount());
+        assertEquals(true, qrList.isExistPrevPage());
+        assertEquals(false, qrList.isExistNextPage());
+        assertEquals(21, qrList.getCurrentStartRecordNumber());
+        assertEquals(21, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 40;
+        qrList.calculatePageInfo(20, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(2, qrList.getCurrentPageNumber());
+        assertEquals(40, qrList.getAllRecordCount());
+        assertEquals(2, qrList.getAllPageCount());
+        assertEquals(true, qrList.isExistPrevPage());
+        assertEquals(false, qrList.isExistNextPage());
+        assertEquals(21, qrList.getCurrentStartRecordNumber());
+        assertEquals(40, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 41;
+        qrList.calculatePageInfo(20, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(2, qrList.getCurrentPageNumber());
+        assertEquals(41, qrList.getAllRecordCount());
+        assertEquals(3, qrList.getAllPageCount());
+        assertEquals(true, qrList.isExistPrevPage());
+        assertEquals(true, qrList.isExistNextPage());
+        assertEquals(21, qrList.getCurrentStartRecordNumber());
+        assertEquals(40, qrList.getCurrentEndRecordNumber());
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 61;
+        qrList.calculatePageInfo(20, 20);
+        assertEquals(20, qrList.getPageSize());
+        assertEquals(2, qrList.getCurrentPageNumber());
+        assertEquals(61, qrList.getAllRecordCount());
+        assertEquals(4, qrList.getAllPageCount());
+        assertEquals(true, qrList.isExistPrevPage());
+        assertEquals(true, qrList.isExistNextPage());
+        assertEquals(21, qrList.getCurrentStartRecordNumber());
+        assertEquals(40, qrList.getCurrentEndRecordNumber());
+    }
+
+    public void test_calculatePageInfo_pageList() {
+        QueryResponseList qrList;
+        List<String> pnList;
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 20;
+        qrList.calculatePageInfo(0, 20);
+        pnList = qrList.getPageNumberList();
+        assertEquals(1, pnList.size());
+        assertEquals("1", pnList.get(0));
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 61;
+        qrList.calculatePageInfo(0, 20);
+        pnList = qrList.getPageNumberList();
+        assertEquals(4, pnList.size());
+        assertEquals("1", pnList.get(0));
+        assertEquals("2", pnList.get(1));
+        assertEquals("3", pnList.get(2));
+        assertEquals("4", pnList.get(3));
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 200;
+        qrList.calculatePageInfo(0, 20);
+        pnList = qrList.getPageNumberList();
+        assertEquals(6, pnList.size());
+        assertEquals("1", pnList.get(0));
+        assertEquals("2", pnList.get(1));
+        assertEquals("3", pnList.get(2));
+        assertEquals("4", pnList.get(3));
+        assertEquals("5", pnList.get(4));
+        assertEquals("6", pnList.get(5));
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 21;
+        qrList.calculatePageInfo(20, 20);
+        pnList = qrList.getPageNumberList();
+        assertEquals(2, pnList.size());
+        assertEquals("1", pnList.get(0));
+        assertEquals("2", pnList.get(1));
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 61;
+        qrList.calculatePageInfo(20, 20);
+        pnList = qrList.getPageNumberList();
+        assertEquals(4, pnList.size());
+        assertEquals("1", pnList.get(0));
+        assertEquals("2", pnList.get(1));
+        assertEquals("3", pnList.get(2));
+        assertEquals("4", pnList.get(3));
+
+        qrList = new QueryResponseList(new ArrayList<Map<String, Object>>());
+        qrList.allRecordCount = 200;
+        qrList.calculatePageInfo(20, 20);
+        pnList = qrList.getPageNumberList();
+        assertEquals(7, pnList.size());
+        assertEquals("1", pnList.get(0));
+        assertEquals("2", pnList.get(1));
+        assertEquals("3", pnList.get(2));
+        assertEquals("4", pnList.get(3));
+        assertEquals("5", pnList.get(4));
+        assertEquals("6", pnList.get(5));
+        assertEquals("7", pnList.get(6));
+
+    }
+
+}
diff --git a/src/test/java/org/codelibs/fess/util/ResourceUtilTest.java b/src/test/java/org/codelibs/fess/util/ResourceUtilTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..87cceb71c31c7d71f37cef3a5e31919be867f107
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/util/ResourceUtilTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.util;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class ResourceUtilTest extends UnitFessTestCase {
+    public void test_resolve() {
+        String value;
+
+        value = null;
+        assertNull(ResourceUtil.resolve(value));
+
+        value = "";
+        assertEquals("", ResourceUtil.resolve(value));
+
+        value = "a";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        value = "${a}";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        value = "$a";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        value = "${a";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        value = "$a}";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        value = "${abc}";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        value = "${abc.xyz}";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        System.setProperty("abc", "123");
+
+        value = "${abc}";
+        assertEquals("123", ResourceUtil.resolve(value));
+
+        value = "xxx${abc}zzz";
+        assertEquals("xxx123zzz", ResourceUtil.resolve(value));
+
+        value = "${abc.xyz}";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        System.setProperty("abc.xyz", "789");
+
+        value = "${abc.xyz}";
+        assertEquals("789", ResourceUtil.resolve(value));
+
+        value = "${abc}${abc.xyz}";
+        assertEquals("123789", ResourceUtil.resolve(value));
+
+        value = "xxx${abc.xyz}zzz";
+        assertEquals("xxx789zzz", ResourceUtil.resolve(value));
+
+        value = "${\\$}";
+        assertEquals(value, ResourceUtil.resolve(value));
+
+        System.setProperty("test.dir", "c:\\test1\\test2");
+
+        value = "${test.dir}";
+        assertEquals("c:\\test1\\test2", ResourceUtil.resolve(value));
+
+    }
+
+}
diff --git a/src/test/java/org/codelibs/fess/validator/UriTypeChecksTest.java b/src/test/java/org/codelibs/fess/validator/UriTypeChecksTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d2207e27808299b60d0046ad4818a5b42c72b25b
--- /dev/null
+++ b/src/test/java/org/codelibs/fess/validator/UriTypeChecksTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2012-2015 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.validator;
+
+import org.codelibs.fess.unit.UnitFessTestCase;
+
+public class UriTypeChecksTest extends UnitFessTestCase {
+    public void test_check_ok() {
+        String protocols;
+        String values;
+
+        protocols = "http:";
+        values = "http://www.foo.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:";
+        values = "http://www.foo.com/\nhttp://www.bar.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:";
+        values = "http://www.foo.com/ \r\nhttp://www.bar.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:";
+        values = "http://www.foo.com/\nhttp://www.bar.com/\n http://www.baz.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:,https:";
+        values = "https://www.foo.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:,https:";
+        values = "http://www.foo.com/\r\nhttp://www.bar.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:,https:";
+        values = "http://www.foo.com/\nhttps://www.bar.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:,https:";
+        values = "http://www.foo.com/\n \nhttps://www.bar.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:, https:";
+        values = "http://www.foo.com/\nhttps://www.bar.com/\n http://www.baz.com/";
+        assertTrue(UriTypeChecks.check(protocols, values));
+    }
+
+    public void test_check_ng() {
+        String protocols;
+        String values;
+
+        protocols = "http:";
+        values = "https://www.foo.com/";
+        assertFalse(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:";
+        values = "https://www.foo.com/\nhttps://www.bar.com/";
+        assertFalse(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:";
+        values = "https://www.foo.com/\n \nhttps://www.bar.com/";
+        assertFalse(UriTypeChecks.check(protocols, values));
+
+        protocols = "http:";
+        values = "https://www.foo.com/\nhttps://www.bar.com/\n https://www.baz.com/";
+        assertFalse(UriTypeChecks.check(protocols, values));
+
+    }
+}