// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.jdisc.application;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* @author Simon Thoresen Hult
*/
public class GlobPatternTestCase {
@Test
public void requireThatCompileCreatesExpectedParts() {
assertToString("foo");
assertToString("*foo");
assertToString("*oo");
assertToString("f*o");
assertToString("fo*");
assertToString("foo*");
assertToString("**foo");
assertToString("**oo");
assertToString("**o");
assertToString("f**");
assertToString("fo**");
assertToString("foo**");
assertToString("");
assertToString("*");
}
@Test
public void requireThatGlobMatcherWorks() {
assertMatch("foo", "foo", Collections.emptyList());
assertNotMatch("foo", "bar");
assertMatch("*", "foo", Arrays.asList("foo"));
assertMatch("*", "bar", Arrays.asList("bar"));
assertMatch("*foo", "foo", Arrays.asList(""));
assertMatch("*oo", "foo", Arrays.asList("f"));
assertMatch("f*o", "foo", Arrays.asList("o"));
assertMatch("fo*", "foo", Arrays.asList("o"));
assertMatch("foo*", "foo", Arrays.asList(""));
assertNotMatch("*foo", "bar");
assertNotMatch("*oo", "bar");
assertNotMatch("f*o", "bar");
assertNotMatch("fo*", "bar");
assertNotMatch("foo*", "bar");
assertMatch("**foo", "foo", Arrays.asList("", ""));
assertMatch("**oo", "foo", Arrays.asList("", "f"));
assertMatch("f**o", "foo", Arrays.asList("", "o"));
assertMatch("fo**", "foo", Arrays.asList("", "o"));
assertMatch("foo**", "foo", Arrays.asList("", ""));
assertNotMatch("**foo", "bar");
assertNotMatch("**oo", "bar");
assertNotMatch("f**o", "bar");
assertNotMatch("fo**", "bar");
assertNotMatch("foo**", "bar");
assertMatch("foo bar", "foo bar", Collections.emptyList());
assertMatch("*foo *bar", "foo bar", Arrays.asList("", ""));
assertMatch("foo* bar*", "foo bar", Arrays.asList("", ""));
assertMatch("f* *r", "foo bar", Arrays.asList("oo", "ba"));
assertNotMatch("foo bar", "baz cox");
assertNotMatch("*foo *bar", "baz cox");
assertNotMatch("foo* bar*", "baz cox");
assertNotMatch("f* *r", "baz cox");
}
@Test
public void requireThatGlobPatternOrdersMoreSpecificFirst() {
assertCompareEq("foo", "foo");
assertCompareLt("foo", "foo*");
assertCompareLt("foo", "*foo");
assertCompareEq("foo/bar", "foo/bar");
assertCompareLt("foo/bar", "foo");
assertCompareLt("foo/bar", "foo*");
assertCompareLt("foo/bar", "*foo");
assertCompareLt("foo/bar", "foo*bar");
assertCompareLt("foo/bar", "foo*bar*");
assertCompareLt("foo/bar", "*foo*bar");
assertCompareLt("foo*bar", "foo");
assertCompareLt("foo*bar", "foo*");
assertCompareLt("foo*bar", "*foo");
assertCompareLt("foo", "foo*bar*");
assertCompareLt("foo*bar*", "foo*");
assertCompareLt("*foo", "foo*bar*");
assertCompareLt("foo", "*foo*bar");
assertCompareLt("*foo*bar", "foo*");
assertCompareLt("*foo*bar", "*foo");
assertCompareLt("*/3/2", "*/1/2");
assertCompareLt("*/1/2", "*/2/*");
}
@Test
public void requireThatEqualsIsImplemented() {
assertTrue(GlobPattern.compile("foo").equals(GlobPattern.compile("foo")));
assertFalse(GlobPattern.compile("foo").equals(GlobPattern.compile("bar")));
}
@Test
public void requireThatHashCodeIsImplemented() {
assertTrue(GlobPattern.compile("foo").hashCode() == GlobPattern.compile("foo").hashCode());
assertFalse(GlobPattern.compile("foo").hashCode() == GlobPattern.compile("bar").hashCode());
}
private static void assertCompareLt(String lhs, String rhs) {
assertTrue(compare(lhs, rhs) < 0);
assertTrue(compare(rhs, lhs) > 0);
}
private static void assertCompareEq(String lhs, String rhs) {
assertEquals(0, compare(lhs, rhs));
assertEquals(0, compare(rhs, lhs));
}
private static int compare(String lhs, String rhs) {
return GlobPattern.compile(lhs).compareTo(GlobPattern.compile(rhs));
}
private static void assertMatch(String glob, String str, List expected) {
GlobPattern.Match match = GlobPattern.match(glob, str);
assertNotNull(match);
List actual = new ArrayList<>(match.groupCount());
for (int i = 0, len = match.groupCount(); i < len; ++i) {
actual.add(match.group(i));
}
assertEquals(expected, actual);
}
private static void assertNotMatch(String glob, String str) {
assertNull(GlobPattern.match(glob, str));
}
private static void assertToString(String pattern) {
assertEquals(pattern, GlobPattern.compile(pattern).toString());
}
}