/* * Copyright 2013 eXo Platform SAS * * 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 juzu.impl.common; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import javax.xml.parsers.DocumentBuilderFactory; import juzu.impl.request.EntityUnmarshaller; import juzu.test.AbstractTestCase; import org.junit.Test; import org.w3c.dom.Element; import org.xml.sax.InputSource; /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class ToolsTestCase extends AbstractTestCase { @Test public void testEmptyNoRecursePackageMatcher() { Pattern p = Tools.getPackageMatcher("", false); assertTrue(p.matcher("").matches()); assertFalse(p.matcher("foo").matches()); assertFalse(p.matcher("foo.bar").matches()); } @Test public void testEmptyRecursePackageMatcher() { Pattern p = Tools.getPackageMatcher("", true); assertTrue(p.matcher("").matches()); assertTrue(p.matcher("foo").matches()); assertTrue(p.matcher("foo.bar").matches()); } @Test public void testNoRecursePackageMatcher() { Pattern p = Tools.getPackageMatcher("foo", false); assertTrue(p.matcher("foo").matches()); assertFalse(p.matcher("bar").matches()); assertFalse(p.matcher("").matches()); assertFalse(p.matcher("foo.bar").matches()); assertFalse(p.matcher("foo.bar.juu").matches()); } @Test public void testRecursePackageMatcher() { Pattern p = Tools.getPackageMatcher("foo", true); assertTrue(p.matcher("foo").matches()); assertTrue(p.matcher("foo.bar").matches()); assertTrue(p.matcher("foo.bar.juu").matches()); assertFalse(p.matcher("").matches()); assertFalse(p.matcher("bar").matches()); assertFalse(p.matcher("foobar").matches()); } @Test public void testUnquote() { assertEquals("", Tools.unquote("")); assertEquals("'", Tools.unquote("'")); assertEquals("\"", Tools.unquote("\"")); assertEquals("'\"", Tools.unquote("'\"")); assertEquals("\"'", Tools.unquote("\"'")); assertEquals("", Tools.unquote("''")); assertEquals("", Tools.unquote("\"\"")); assertEquals("a", Tools.unquote("'a'")); assertEquals("a", Tools.unquote("\"a\"")); assertEquals("'a\"", Tools.unquote("'a\"")); assertEquals("\"a'", Tools.unquote("\"a'")); } @Test public void testCount() { assertEquals(0, Tools.count("a", "b")); assertEquals(1, Tools.count("a", "a")); assertEquals(2, Tools.count("aa", "a")); assertEquals(1, Tools.count("", "")); assertEquals(2, Tools.count("a", "")); assertEquals(3, Tools.count("aa", "")); assertEquals(1, Tools.count("aaa", "aa")); } @Test public void testSplit() { assertEquals(Collections.<String>emptyList(), Arrays.asList(Tools.split("", '.'))); assertEquals(Arrays.asList("a"), Arrays.asList(Tools.split("a", '.'))); assertEquals(Arrays.asList("a", ""), Arrays.asList(Tools.split("a.", '.'))); assertEquals(Arrays.asList("", "a"), Arrays.asList(Tools.split(".a", '.'))); assertEquals(Arrays.asList("", ""), Arrays.asList(Tools.split(".", '.'))); assertEquals(Arrays.asList("a", "b"), Arrays.asList(Tools.split("a.b", '.'))); // String[] ret = Tools.split("a.b", '.', 1); assertEquals(3, ret.length); assertEquals("a", ret[0]); assertEquals("b", ret[1]); assertEquals(null, ret[2]); // ret = Tools.split("", '.', 1); assertEquals(1, ret.length); assertEquals(null, ret[0]); } @Test public void testIteratorAppend() { Iterator i = Tools.append(Collections.emptyList().iterator(), "foo"); assertTrue(i.hasNext()); assertEquals("foo", i.next()); assertFalse(i.hasNext()); assertNoSuchElement(i); // i = Tools.append(Collections.singletonList("foo").iterator()); assertTrue(i.hasNext()); assertEquals("foo", i.next()); assertFalse(i.hasNext()); assertNoSuchElement(i); // i = Tools.append(Collections.singletonList("foo").iterator(), "bar"); assertTrue(i.hasNext()); assertEquals("foo", i.next()); assertTrue(i.hasNext()); assertEquals("bar", i.next()); assertFalse(i.hasNext()); assertNoSuchElement(i); } @Test public void testTrieEmpty() { Trie<String, String> trie = new Trie<String, String>(); assertNull(trie.getParent()); assertNull(trie.getKey()); assertEquals(Collections.emptyList(), Tools.list(trie.getPath())); assertNull(trie.value()); assertNull(trie.value("foo")); assertEquals("foo", trie.value()); assertEquals("foo", trie.value("bar")); assertEquals("bar", trie.value()); assertEquals("bar", trie.value("juu")); } @Test public void testTrieAddKey() { Trie<String, String> root = new Trie<String, String>(); Trie<String, String> foo = root.add("foo"); assertSame(foo, root.get("foo")); assertSame(foo, root.add("foo")); assertSame(root, foo.getParent()); } @Test public void testTrieAddKeys() { Trie<String, String> root = new Trie<String, String>(); Trie<String, String> bar = root.add("foo", "bar"); Trie<String, String> foo = bar.getParent(); assertSame(foo, root.get("foo")); assertSame(foo, root.add("foo")); assertSame(root, foo.getParent()); assertSame(bar, foo.get("bar")); assertSame(bar, foo.add("bar")); } @Test public void testIterableArray() { String[] a = {"a", "b"}; assertEquals(Collections.<String>emptyList(), Tools.list(Tools.iterable(a, 0, 0))); assertEquals(Arrays.asList("a"), Tools.list(Tools.iterable(a, 0, 1))); assertEquals(Arrays.asList("a", "b"), Tools.list(Tools.iterable(a, 0, 2))); assertEquals(Arrays.asList("b"), Tools.list(Tools.iterable(a, 1, 2))); } @Test public void testSafeConcat() { assertEquals(0, Tools.safeConcat(null, null).length); assertEquals(Arrays.asList("a"), Arrays.asList(Tools.safeConcat(new String[]{"a"}, null))); assertEquals(Arrays.asList("a"), Arrays.asList(Tools.safeConcat(null, new String[]{"a"}))); assertEquals(Arrays.asList("a", "b"), Arrays.asList(Tools.safeConcat(new String[]{"a"}, new String[]{"b"}))); assertEquals(Arrays.asList("a", "b", "c"), Arrays.asList(Tools.safeConcat(new String[]{"a", "b"}, new String[]{"c"}))); assertEquals(Arrays.asList("a", "b", "c"), Arrays.asList(Tools.safeConcat(new String[]{"a"}, new String[]{"b", "c"}))); assertEquals(Arrays.asList("a", "b", "c", "d"), Arrays.asList(Tools.safeConcat(new String[]{"a", "b"}, new String[]{"c","d"}))); } @Test public void testToHex() throws IOException { assertEquals("0", Tools.toHex(0, new StringBuilder()).toString()); assertEquals("1", Tools.toHex(1, new StringBuilder()).toString()); assertEquals("a", Tools.toHex(10, new StringBuilder()).toString()); assertEquals("f", Tools.toHex(15, new StringBuilder()).toString()); assertEquals("10", Tools.toHex(16, new StringBuilder()).toString()); assertEquals("f0000000", Tools.toHex(0xF0000000, new StringBuilder()).toString()); } @Test public void testScriptNoAttributes() throws Exception { assertSerialization("<script></script>", "<script/>"); } @Test public void testScriptWithAttribute() throws Exception { assertSerialization("<script type=\"text/javascript\"></script>", "<script type='text/javascript'/>"); } @Test public void testMetaNoAttributes() throws Exception { assertSerialization("<meta/>", "<meta/>"); } @Test public void testMetaWithAttribute() throws Exception { assertSerialization("<meta http-equiv=\"Content-Type\"/>", "<meta http-equiv='Content-Type'></meta>"); } @Test public void testOrdinaryTextElement() throws Exception { assertSerialization("<div>Blah Blah</div>", "<div>Blah Blah</div>"); } private void assertSerialization(String expectedMarkup, String markup) throws Exception { Element elt = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse(new InputSource(new StringReader(markup))).getDocumentElement(); StringWriter writer = new StringWriter(); Tools.encodeHtml(elt, writer); assertEquals(expectedMarkup, writer.toString()); } @Test public void testInterpolate() { Map<String,String> context = Collections.singletonMap("foo", "bar"); assertEquals("", Tools.interpolate("", context)); assertEquals("$", Tools.interpolate("$", context)); assertEquals("${foo}", Tools.interpolate("\\${foo}", context)); assertEquals("${", Tools.interpolate("${", context)); assertEquals("${a", Tools.interpolate("${a", context)); assertEquals("bar", Tools.interpolate("${foo}", context)); assertEquals("", Tools.interpolate("${bar}", context)); assertEquals("juu", Tools.interpolate("${bar:juu}", context)); } @Test public void testLoadService() { Iterable<ServiceA> iterableServiceA = Tools.loadService(ServiceA.class, getClass().getClassLoader()); assertFalse("ServiceA shouldn't have a known service impl", iterableServiceA.iterator().hasNext()); List<Class<? extends ServiceB>> serviceBImpls = new ArrayList<Class<? extends ServiceB>>(); serviceBImpls.add(ServiceBImpl1.class); serviceBImpls.add(ServiceBImpl2.class); serviceBImpls.add(ServiceBImpl3.class); Iterable<ServiceB> iterableServiceB = Tools.loadService(ServiceB.class, getClass().getClassLoader()); int count = 0; for (ServiceB serviceB : iterableServiceB) { assertNotNull("Returned Service is null", serviceB); serviceBImpls.remove(serviceB.getClass()); count++; } assertEquals("Returned services missed service of type: " + serviceBImpls, 0, serviceBImpls.size()); assertEquals("Services count is different than expected", 3, count); } }