/*
* Copyright (C) 2014 Civilian Framework.
*
* Licensed under the Civilian License (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.civilian-framework.org/license.txt
*
* 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.civilian.resource;
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import org.junit.Test;
import org.civilian.CivTest;
public class PathScannerTest extends CivTest
{
@Test public void testCreate()
{
PathScanner scanner;
scanner = new PathScanner(null);
assertEquals("", scanner.getPath());
assertEquals(0, scanner.getPosition());
assertFalse(scanner.hasMore());
scanner = new PathScanner("");
assertEquals("", scanner.getPath());
assertEquals(0, scanner.getPosition());
assertFalse(scanner.hasMore());
scanner = new PathScanner("/");
assertEquals("/", scanner.getPath());
assertEquals(1, scanner.getPosition());
assertFalse(scanner.hasMore());
scanner = new PathScanner("/abc");
assertEquals("/abc", scanner.getPath());
assertEquals(1, scanner.getPosition());
assertTrue(scanner.hasMore());
}
@Test public void testSegments()
{
PathScanner scanner;
scanner = new PathScanner("abc/def");
assertEquals(0, scanner.getPosition());
assertTrue (scanner.hasMore());
assertTrue (scanner.matchSegment("abc"));
assertFalse (scanner.matchSegment("ab"));
assertFalse (scanner.matchSegment("abc/"));
assertFalse (scanner.matchSegment(""));
assertEquals("abc", scanner.getSegment());
scanner.next();
assertTrue (scanner.hasMore());
assertTrue (scanner.matchSegment("def"));
assertFalse (scanner.matchSegment("d"));
assertFalse (scanner.matchSegment("defg"));
assertFalse (scanner.matchSegment(""));
assertEquals("def", scanner.getSegment());
scanner.next();
assertFalse (scanner.hasMore());
scanner = new PathScanner("/abc/");
assertTrue (scanner.hasMore());
assertTrue (scanner.matchSegment("abc"));
scanner.next();
assertFalse (scanner.hasMore());
}
@Test public void testPattern()
{
Pattern any = Pattern.compile(".+");
Pattern anySeg = Pattern.compile("[^/]+");
Pattern alpha = Pattern.compile("[a-z]+");
Pattern number = Pattern.compile("[0-9]+");
Pattern groups = Pattern.compile("a([a-z]{2})/1([0-9]{2})");
PathScanner scanner = new PathScanner("abc/123");
assertTrue(scanner.matchSegment("abc"));
assertMatch(scanner.matchPattern(any), "abc/123");
assertMatch(scanner.matchPattern(anySeg), "abc");
assertMatch(scanner.matchPattern(alpha), "abc");
assertMatch(scanner.matchPattern(number), null);
assertMatch(scanner.matchPattern(groups), "abc/123", "bc", "23");
scanner.next();
assertTrue(scanner.matchSegment("123"));
assertMatch(scanner.matchPattern(any), "123");
assertMatch(scanner.matchPattern(anySeg), "123");
assertMatch(scanner.matchPattern(alpha), null);
assertMatch(scanner.matchPattern(number), "123");
scanner = new PathScanner("abc/123");
assertEquals(0, scanner.getPosition());
MatchResult result = assertMatch(scanner.matchPattern(alpha), "abc");
scanner.next(result);
assertEquals(4, scanner.getPosition());
result = assertMatch(scanner.matchPattern(number), "123");
scanner.next(result);
assertEquals(8, scanner.getPosition());
}
/**
* Tests that extensions in the last segment and a trailing '/index' are ignored.
*/
@Test public void testRevert()
{
PathScanner scanner = new PathScanner("/a/b/c");
int pos0 = scanner.getPosition();
assertTrue(scanner.matchSegment("a"));
scanner.next();
assertTrue(scanner.matchSegment("b"));
scanner.setPosition(pos0);
assertTrue(scanner.matchSegment("a"));
}
/**
* Tests that extensions in the last segment and a trailing '/index' are ignored.
*/
@Test public void testRemoveExtAndIndex()
{
//-------------------------------------------
// the extension is automatically stripped of the last segment
PathScanner scanner = new PathScanner("test.html/test.html");
// in the first segment the extension is still included
assertFalse(scanner.matchSegment("test"));
assertTrue (scanner.matchSegment("test.html"));
scanner.next();
assertTrue (scanner.hasMore());
// in the last segement, the extension is ignored
assertTrue (scanner.matchSegment("test"));
assertFalse(scanner.matchSegment("test.html"));
scanner.next();
assertFalse(scanner.hasMore());
//-------------------------------------------
// a trailing /index is also removed
scanner = new PathScanner("test/index");
assertTrue (scanner.matchSegment("test"));
scanner.next();
assertFalse(scanner.hasMore());
//-------------------------------------------
// a trailing /index + extension is also removed
scanner = new PathScanner("test/index.html");
assertTrue (scanner.matchSegment("test"));
scanner.next();
assertFalse(scanner.hasMore());
}
private MatchResult assertMatch(MatchResult result, String match, String... groups)
{
if (match == null)
assertNull(result);
else
{
assertNotNull("result null", result);
int n = Math.min(result.groupCount(), groups.length);
for (int i=1; i<=n; i++)
assertEquals(groups[i-1], result.group(i));
assertEquals(result.groupCount(), groups.length);
}
return result;
}
}