/** * Copyright 2011-2017 Asakusa Framework Team. * * 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 com.asakusafw.runtime.directio; import static com.asakusafw.runtime.directio.FilePattern.PatternElementKind.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.util.Arrays; import java.util.List; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.junit.Test; import com.asakusafw.runtime.directio.FilePattern.PatternElement; import com.asakusafw.runtime.directio.FilePattern.PatternElementKind; import com.asakusafw.runtime.directio.FilePattern.Segment; /** * Test for {@link FilePattern}. */ public class FilePatternTest { /** * A traverse pattern. */ @Test public void traverse() { FilePattern compiled = FilePattern.compile("**"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(true)); assertThat(segments.get(0).getElements(), is(kind())); } /** * A token. */ @Test public void token() { FilePattern compiled = FilePattern.compile("a"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN))); assertThat(segments.get(0).getElements(), is(token("a"))); } /** * A wildcard pattern. */ @Test public void wildcard() { FilePattern compiled = FilePattern.compile("*"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(WILDCARD))); assertThat(segments.get(0).getElements(), is(token("*"))); } /** * A variable pattern. */ @Test public void variable() { FilePattern compiled = FilePattern.compile("${v}"); assertThat(compiled.containsVariables(), is(true)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(VARIABLE))); assertThat(segments.get(0).getElements(), is(token("${v}"))); } /** * An empty variable pattern. */ @Test public void variable_empty() { FilePattern compiled = FilePattern.compile("${}"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(VARIABLE))); assertThat(segments.get(0).getElements(), is(token("${}"))); } /** * A selection pattern. */ @Test public void selection() { FilePattern compiled = FilePattern.compile("{alpha|beta|gamma}"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(SELECTION))); assertThat(segments.get(0).getElements(), is(token("{alpha|beta|gamma}"))); } /** * A contains wildcard pattern. */ @Test public void containsWildcard() { FilePattern compiled = FilePattern.compile("data-*.csv"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN, WILDCARD, TOKEN))); assertThat(segments.get(0).getElements(), is(token("data-", "*", ".csv"))); } /** * A selection pattern. */ @Test public void selection_containsEmpty() { FilePattern compiled = FilePattern.compile("{alpha||gamma}"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(SELECTION))); assertThat(segments.get(0).getElements(), is(token("{alpha||gamma}"))); } /** * A selection pattern. */ @Test public void selection_empty() { FilePattern compiled = FilePattern.compile("{}"); assertThat(compiled.containsVariables(), is(false)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(1)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(SELECTION))); assertThat(segments.get(0).getElements(), is(token("{}"))); } /** * multiple segments. */ @Test public void segments() { FilePattern compiled = FilePattern.compile("alpha/beta/gamma"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(3)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN))); assertThat(segments.get(0).getElements(), is(token("alpha"))); assertThat(segments.get(1).isTraverse(), is(false)); assertThat(segments.get(1).getElements(), is(kind(TOKEN))); assertThat(segments.get(1).getElements(), is(token("beta"))); assertThat(segments.get(2).isTraverse(), is(false)); assertThat(segments.get(2).getElements(), is(kind(TOKEN))); assertThat(segments.get(2).getElements(), is(token("gamma"))); } /** * A complex pattern (all csv). */ @Test public void all_csv() { FilePattern compiled = FilePattern.compile("**/*.csv"); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(2)); assertThat(segments.get(0).isTraverse(), is(true)); assertThat(segments.get(1).isTraverse(), is(false)); assertThat(segments.get(1).getElements(), is(kind(WILDCARD, TOKEN))); assertThat(segments.get(1).getElements(), is(token("*", ".csv"))); } /** * A complex pattern. */ @Test public void complex() { FilePattern compiled = FilePattern.compile("alpha/**/{beta|gamma}/${date}-*.csv"); assertThat(compiled.containsVariables(), is(true)); List<Segment> segments = compiled.getSegments(); assertThat(segments.size(), is(4)); assertThat(segments.get(0).isTraverse(), is(false)); assertThat(segments.get(0).getElements(), is(kind(TOKEN))); assertThat(segments.get(0).getElements(), is(token("alpha"))); assertThat(segments.get(1).isTraverse(), is(true)); assertThat(segments.get(2).isTraverse(), is(false)); assertThat(segments.get(2).getElements(), is(kind(SELECTION))); assertThat(segments.get(2).getElements(), is(token("{beta|gamma}"))); assertThat(segments.get(3).isTraverse(), is(false)); assertThat(segments.get(3).getElements(), is(kind(VARIABLE, TOKEN, WILDCARD, TOKEN))); assertThat(segments.get(3).getElements(), is(token("${date}", "-", "*", ".csv"))); } /** * An invalid wildcard. */ @Test(expected = IllegalArgumentException.class) public void consecutive_wildcard() { FilePattern.compile("**.csv"); } /** * A doller. */ @Test(expected = IllegalArgumentException.class) public void doller() { FilePattern.compile("$.csv"); } /** * An unclosed variable. */ @Test(expected = IllegalArgumentException.class) public void variable_unclosed() { FilePattern.compile("${csv"); } /** * An unclosed selection. */ @Test(expected = IllegalArgumentException.class) public void selection_unclosed() { FilePattern.compile("{data"); } /** * An invalid character in selection. */ @Test(expected = IllegalArgumentException.class) public void selection_invalid_character() { FilePattern.compile("{*}"); } /** * An invalid character. */ @Test(expected = IllegalArgumentException.class) public void invalid_character() { FilePattern.compile("\\data.csv"); } private Matcher<List<PatternElement>> kind(PatternElementKind... kinds) { return new BaseMatcher<List<PatternElement>>() { @Override public boolean matches(Object obj) { @SuppressWarnings("unchecked") List<PatternElement> elements = (List<PatternElement>) obj; if (elements.size() != kinds.length) { return false; } for (int i = 0; i < kinds.length; i++) { if (elements.get(i).getKind() != kinds[i]) { return false; } } return true; } @Override public void describeTo(Description desc) { desc.appendText(Arrays.toString(kinds)); } }; } private Matcher<List<PatternElement>> token(String... tokens) { return new BaseMatcher<List<PatternElement>>() { @Override public boolean matches(Object obj) { @SuppressWarnings("unchecked") List<PatternElement> elements = (List<PatternElement>) obj; if (elements.size() != tokens.length) { return false; } for (int i = 0; i < tokens.length; i++) { if (elements.get(i).getToken().equals(tokens[i]) == false) { return false; } } return true; } @Override public void describeTo(Description desc) { desc.appendText(Arrays.toString(tokens)); } }; } }