/* * Copyright 2012 NGDATA nv * * 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.lilyproject.indexer.model.indexerconf.test; import org.junit.Test; import org.lilyproject.indexer.model.indexerconf.TypePattern; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class TypePatternTest { @Test public void testNameWildcards() throws Exception { TypePattern pattern = new TypePattern("STR*"); assertTrue(pattern.matches("STRING")); assertFalse(pattern.matches("STING")); pattern = new TypePattern("STR*<STR*>"); assertTrue(pattern.matches("STRING<STRONG>")); pattern = new TypePattern("STR*<STR*<*>>"); assertTrue(pattern.matches("STRING<STRONG<LONG>>")); assertTrue(pattern.matches("STRING<STRONG>")); // wildcards in names will mostly be used for the record type argument for records pattern = new TypePattern("RECORD<{namespace}*>"); assertTrue(pattern.matches("RECORD<{namespace}foo>")); assertFalse(pattern.matches("RECORD<{othernamespace}foo>")); } @Test public void testArgumentWildcards() throws Exception { TypePattern pattern = new TypePattern("LIST<STRING>"); assertTrue(pattern.matches("LIST<STRING>")); assertFalse(pattern.matches("LIST<LONG>")); assertFalse(pattern.matches("LIST")); assertFalse(pattern.matches("LIST<LIST<STRING>>")); assertFalse(pattern.matches("FOO")); // no type arg pattern = new TypePattern("STRING"); assertTrue(pattern.matches("STRING")); assertFalse(pattern.matches("STRING<STRING>")); // optional 1 nested type argument pattern = new TypePattern("LIST<*>"); assertTrue(pattern.matches("LIST")); assertTrue(pattern.matches("LIST<STRING>")); assertFalse(pattern.matches("LIST<LIST<STRING>>")); // this shows this can also match nested lists, which may go a bit beyond the purpose as this kind // of matching should serve to guarantee 1-level nested types. However, in practice this won't occur // since a list always has a type argument. assertTrue(pattern.matches("LIST<LIST>")); // exactly 1 nested type argument pattern = new TypePattern("LIST<+>"); assertTrue(pattern.matches("LIST<STRING>")); assertFalse(pattern.matches("LIST")); assertFalse(pattern.matches("LIST<LIST<STRING>>")); // optionally any number of nested type arguments, including 0 pattern = new TypePattern("LIST<**>"); assertTrue(pattern.matches("LIST")); assertFalse(pattern.matches("STRING")); assertTrue(pattern.matches("LIST<STRING>")); assertTrue(pattern.matches("LIST<LIST<STRING>>")); assertTrue(pattern.matches("LIST<LIST<PATH<STRING>>>")); // optionally any number of nested type arguments, but at least 1 pattern = new TypePattern("LIST<++>"); assertFalse(pattern.matches("STRING")); assertTrue(pattern.matches("LIST<STRING>")); assertTrue(pattern.matches("LIST<LIST<STRING>>")); assertTrue(pattern.matches("LIST<LIST<PATH<STRING>>>")); // exactly 1 nested type argument at a deeper level pattern = new TypePattern("LIST<LIST<+>>"); assertTrue(pattern.matches("LIST<LIST<STRING>>")); assertTrue(pattern.matches("LIST<LIST<LONG>>")); assertFalse(pattern.matches("LIST<LIST<LIST<LONG>>>")); } @Test public void testMultiPatterns() throws Exception { TypePattern pattern = new TypePattern("STRING,LONG,DATE"); assertTrue(pattern.matches("STRING")); assertTrue(pattern.matches("LONG")); assertTrue(pattern.matches("DATE")); assertFalse(pattern.matches("RECORD")); pattern = new TypePattern("STRING,LIST<STRING>"); assertTrue(pattern.matches("STRING")); assertTrue(pattern.matches("LIST<STRING>")); assertFalse(pattern.matches("RECORD")); } @Test public void testMore() throws Exception { // match things and lists of things TypePattern pattern = new TypePattern("*,LIST<+>"); assertTrue(pattern.matches("STRING")); assertTrue(pattern.matches("DATE")); assertTrue(pattern.matches("LIST<STRING>")); assertFalse(pattern.matches("LIST<LIST<STRING>>")); assertFalse(pattern.matches("STRING<STRING>")); } @Test public void testRoundBracket() throws Exception { // Because angle brackets are annoying to write in XML, one can use round brackets too. TypePattern pattern = new TypePattern("LIST(LIST(RECORD(*)))"); assertTrue(pattern.matches("LIST(LIST(RECORD))")); assertTrue(pattern.matches("LIST(LIST(RECORD(foobar)))")); } }