/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.brooklyn.util.text; import java.util.Arrays; import java.util.List; import org.apache.brooklyn.util.text.WildcardGlobs; import org.apache.brooklyn.util.text.WildcardGlobs.InvalidPatternException; import org.apache.brooklyn.util.text.WildcardGlobs.PhraseTreatment; import org.apache.brooklyn.util.text.WildcardGlobs.SpecialistGlobExpander; import org.testng.Assert; import org.testng.annotations.Test; @Test public class WildcardGlobsTest extends Assert { @Test public void testBasic() throws InvalidPatternException { assertTrue(WildcardGlobs.isGlobMatched("a?{ex,in}", "akin")); assertTrue(WildcardGlobs.isGlobMatched("a?{ex,in}", "alex")); assertFalse(WildcardGlobs.isGlobMatched("a?{ex,in}", "appin")); } @Test public void testEmpty() throws InvalidPatternException { assertTrue(WildcardGlobs.isGlobMatched("a{,?}{,b}", "a")); assertTrue(WildcardGlobs.isGlobMatched("a{,?}{,b}", "ab")); assertTrue(WildcardGlobs.isGlobMatched("a{,?}{,b}", "ac")); assertTrue(WildcardGlobs.isGlobMatched("a{,?}{,b}", "acb")); assertFalse(WildcardGlobs.isGlobMatched("a{,?}{,b}", "abc")); assertFalse(WildcardGlobs.isGlobMatched("a{,?}{,b}", "accb")); } @Test public void testNum() throws InvalidPatternException { assertTrue(newGlobExpander().isGlobMatchedNumeric("{1-3}", "1")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{1-3}", "a1")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{1-3,5}", "a1")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{1-3,5}", "a3")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{1-3,5}", "a5")); assertFalse(newGlobExpander().isGlobMatchedNumeric("a{1-3,5}", "a4")); assertFalse(newGlobExpander().isGlobMatchedNumeric("a{1-3,5}", "a01")); } @Test public void testNumLeadZero() throws InvalidPatternException { assertTrue(newGlobExpander().isGlobMatchedNumeric("a{01-03,05}", "a01")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{ 01 - 03 , 05 }", "a01")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{ 01 - 03 , 05 }", "a02")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{ 01 - 03 , 05 }", "a03")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{ 01 - 03 , 05 }", "a 05 ")); assertTrue(newGlobExpander().isGlobMatchedNumeric("a{01-03,05}", "a05")); assertFalse(newGlobExpander().isGlobMatchedNumeric("a{01-03,05}", "a04")); assertFalse(newGlobExpander().isGlobMatchedNumeric("a{01-03,05}", "a3")); } @Test public void testOrder() throws InvalidPatternException { List<String> result; result = newGlobExpander().expand("{a,b}"); assertEquals(result, Arrays.asList("a","b"), "Expansion was "+result); result = newGlobExpander().expand("{{a},b}"); assertEquals(result, Arrays.asList("a","b"), "Expansion was "+result); result = newGlobExpander().expand("{a,b}{1,2}"); assertEquals(result, Arrays.asList("a1","a2","b1","b2"), "Expansion was "+result); result = newGlobExpander().expand("{80{8{1,2},90},8000+}"); assertEquals(result, Arrays.asList("8081","8082","8090","8000+"), "Expansion was "+result); } @Test public void testQuotes() throws InvalidPatternException { List<String> result; SpecialistGlobExpander notSpecial = new SpecialistGlobExpander(true, PhraseTreatment.NOT_A_SPECIAL_CHAR, PhraseTreatment.NOT_A_SPECIAL_CHAR); result = notSpecial.expand("hello \"{1-3}\""); assertEquals(3, result.size()); assertEquals("hello \"1\"", result.get(0)); SpecialistGlobExpander expanding = new SpecialistGlobExpander(true, PhraseTreatment.INTERIOR_EXPANDABLE, PhraseTreatment.NOT_A_SPECIAL_CHAR); result = expanding.expand("hello \"{1-3}\""); assertEquals(3, result.size()); assertEquals("hello \"1\"", result.get(0)); result = expanding.expand("hello \"{1,2-3}\""); assertEquals(3, result.size()); assertEquals("hello \"2\"", result.get(1)); SpecialistGlobExpander notExpanding = new SpecialistGlobExpander(true, PhraseTreatment.INTERIOR_NOT_EXPANDABLE, PhraseTreatment.NOT_A_SPECIAL_CHAR); result = notExpanding.expand("hello \"{1,2-3}\""); assertEquals(1, result.size()); assertEquals("hello \"{1,2-3}\"", result.get(0)); result = notSpecial.expand("hello {\"1,2,3\"}"); assertEquals(3, result.size()); assertEquals("hello \"1", result.get(0)); result = expanding.expand("hello {\"1,2,3\"}"); assertEquals(1, result.size()); assertEquals("hello \"1,2,3\"", result.get(0)); result = notExpanding.expand("hello {\"1,2,3\"}"); assertEquals(1, result.size()); assertEquals("hello \"1,2,3\"", result.get(0)); result = notSpecial.expand("hello {\"1,{02-03,04}\"}"); assertEquals(4, result.size()); assertEquals("hello \"1", result.get(0)); assertEquals("hello 03\"", result.get(2)); result = expanding.expand("hello {\"1,{02-03,04}\"}"); assertEquals(3, result.size()); assertEquals("hello \"1,02\"", result.get(0)); result = notExpanding.expand("hello {\"1,{02-03,04}\"}"); assertEquals(1, result.size()); assertEquals("hello \"1,{02-03,04}\"", result.get(0)); //no exception notSpecial.expand("{\"}"); notSpecial.expand("\"{\"}"); //exceptions try { expanding.expand("\""); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } try { expanding.expand("{\"}"); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } try { expanding.expand("\"{\""); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } try { notExpanding.expand("\""); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } try { notExpanding.expand("{\"}"); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } //no exception notExpanding.expand("\"{\""); } @Test public void testParen() throws InvalidPatternException { List<String> result; SpecialistGlobExpander notSpecial = new SpecialistGlobExpander(true, PhraseTreatment.NOT_A_SPECIAL_CHAR, PhraseTreatment.NOT_A_SPECIAL_CHAR); result = notSpecial.expand("hello ({1-3})"); assertEquals(3, result.size()); assertEquals("hello (1)", result.get(0)); SpecialistGlobExpander expanding = new SpecialistGlobExpander(true, PhraseTreatment.INTERIOR_NOT_EXPANDABLE, PhraseTreatment.INTERIOR_EXPANDABLE); result = expanding.expand("hello ({1-3})"); assertEquals(3, result.size()); assertEquals("hello (1)", result.get(0)); result = expanding.expand("hello ({1,2-3})"); assertEquals(3, result.size()); assertEquals("hello (2)", result.get(1)); SpecialistGlobExpander notExpanding = new SpecialistGlobExpander(true, PhraseTreatment.INTERIOR_EXPANDABLE, PhraseTreatment.INTERIOR_NOT_EXPANDABLE); result = notExpanding.expand("hello ({1,2-3})"); assertEquals(1, result.size()); assertEquals("hello ({1,2-3})", result.get(0)); result = notSpecial.expand("hello {(1,2,3)}"); assertEquals(3, result.size()); assertEquals("hello (1", result.get(0)); result = expanding.expand("hello {(1,2,3)}"); assertEquals(1, result.size()); assertEquals("hello (1,2,3)", result.get(0)); result = notExpanding.expand("hello {(1,2,3)}"); assertEquals(1, result.size()); assertEquals("hello (1,2,3)", result.get(0)); result = notSpecial.expand("hello {(1,{02-03,04})}"); assertEquals(4, result.size()); assertEquals("hello (1", result.get(0)); assertEquals("hello 03)", result.get(2)); result = expanding.expand("hello {(1,{02-03,04})}"); assertEquals(3, result.size()); assertEquals("hello (1,02)", result.get(0)); result = notExpanding.expand("hello {(1,{02-03,04})}"); assertEquals(1, result.size()); assertEquals("hello (1,{02-03,04})", result.get(0)); try { notExpanding.expand("{(}"); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } try { notExpanding.expand("(()"); fail("exception expected"); } catch (InvalidPatternException e) { /* expected */ } notExpanding.expand("({())"); } @Test public void testQuotesAndParen() throws InvalidPatternException { List<String> result; SpecialistGlobExpander special = new SpecialistGlobExpander(true, PhraseTreatment.INTERIOR_EXPANDABLE, PhraseTreatment.INTERIOR_NOT_EXPANDABLE); result = special.expand("\"{hello,goodbye}{1-2,({3-4}),(\")}\""); assertEquals(8, result.size()); assertTrue(result.contains("\"goodbye2\"")); assertTrue(result.contains("\"hello({3-4})\"")); assertTrue(result.contains("\"goodbye(\")\"")); } private SpecialistGlobExpander newGlobExpander() { return new SpecialistGlobExpander(true, PhraseTreatment.NOT_A_SPECIAL_CHAR, PhraseTreatment.NOT_A_SPECIAL_CHAR); } }