/* * Copyright 2012-2017 the original author or authors. * * 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.springframework.boot.context.properties.source; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.boot.context.properties.source.ConfigurationPropertyName.Form; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; /** * Tests for {@link ConfigurationPropertyName}. * * @author Phillip Webb * @author Madhura Bhave * @author EddĂș MelĂ©ndez */ public class ConfigurationPropertyNameTests { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void ofNameShouldNotBeNull() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("Name must not be null"); ConfigurationPropertyName.of(null); } @Test public void ofNameShouldNotStartWithNumber() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("1foo"); } @Test public void ofNameShouldNotStartWithDash() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("-foo"); } @Test public void ofNameShouldNotStartWithDot() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of(".foo"); } @Test public void ofNameShouldNotEndWithDot() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("foo."); } @Test public void ofNameShouldNotContainUppercase() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("fOo"); } @Test public void ofNameShouldNotContainInvalidChars() throws Exception { String invalid = "_@$%*+=':;"; for (char c : invalid.toCharArray()) { try { ConfigurationPropertyName.of("foo" + c); fail("Did not throw for invalid char " + c); } catch (IllegalArgumentException ex) { assertThat(ex.getMessage()).contains("is not valid"); } } } @Test public void ofNameWhenSimple() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("name"); assertThat(name.toString()).isEqualTo("name"); assertThat(name.getNumberOfElements()).isEqualTo(1); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("name"); assertThat(name.isIndexed(0)).isFalse(); } @Test public void ofNameWhenRunOnAssociative() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo[bar]"); assertThat(name.toString()).isEqualTo("foo[bar]"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("bar"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isTrue(); } @Test public void ofNameWhenDotOnAssociative() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo.bar"); assertThat(name.toString()).isEqualTo("foo.bar"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("bar"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isFalse(); } @Test public void ofNameWhenDotAndAssociative() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo.[bar]"); assertThat(name.toString()).isEqualTo("foo[bar]"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("bar"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isTrue(); } @Test public void ofNameWhenDoubleRunOnAndAssociative() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo[bar]baz"); assertThat(name.toString()).isEqualTo("foo[bar].baz"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("bar"); assertThat(name.getElement(2, Form.ORIGINAL)).isEqualTo("baz"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isTrue(); assertThat(name.isIndexed(2)).isFalse(); } @Test public void ofNameWhenDoubleDotAndAssociative() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo.[bar].baz"); assertThat(name.toString()).isEqualTo("foo[bar].baz"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("bar"); assertThat(name.getElement(2, Form.ORIGINAL)).isEqualTo("baz"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isTrue(); assertThat(name.isIndexed(2)).isFalse(); } @Test public void ofNameWhenMissingCloseBracket() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("[bar"); } @Test public void ofNameWhenMissingOpenBracket() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("bar]"); } @Test public void ofNameWithWhitespaceInName() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("is not valid"); ConfigurationPropertyName.of("foo. bar"); } @Test public void ofNameWithWhitespaceInAssociativeElement() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo[b a r]"); assertThat(name.toString()).isEqualTo("foo[b a r]"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("b a r"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isTrue(); } @Test public void ofNameWithUppercaseInAssociativeElement() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo[BAR]"); assertThat(name.toString()).isEqualTo("foo[BAR]"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("BAR"); assertThat(name.isIndexed(0)).isFalse(); assertThat(name.isIndexed(1)).isTrue(); } @Test public void ofWhenNameIsEmptyShouldReturnEmptyName() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of(""); assertThat(name.toString()).isEqualTo(""); assertThat(name.append("foo").toString()).isEqualTo("foo"); } @Test public void adaptWhenNameIsNullShouldThrowException() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("Name must not be null"); ConfigurationPropertyName.adapt(null, '.'); } @Test public void adaptWhenElementValueProcessorIsNullShouldThrowException() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("ElementValueProcessor must not be null"); ConfigurationPropertyName.adapt("foo", '.', null); } @Test public void adaptShouldCreateName() throws Exception { ConfigurationPropertyName expected = ConfigurationPropertyName.of("foo.bar.baz"); ConfigurationPropertyName name = ConfigurationPropertyName.adapt("foo.bar.baz", '.'); assertThat(name).isEqualTo(expected); } @Test public void adapShouldStripInvalidChars() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("f@@.b%r", '.'); assertThat(name.getElement(0, Form.UNIFORM)).isEqualTo("f"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("f"); assertThat(name.getElement(1, Form.UNIFORM)).isEqualTo("br"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("br"); assertThat(name.toString()).isEqualTo("f.br"); } @Test public void adaptShouldSupportUnderscore() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("f-_o.b_r", '.'); assertThat(name.getElement(0, Form.UNIFORM)).isEqualTo("fo"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("f-_o"); assertThat(name.getElement(1, Form.UNIFORM)).isEqualTo("br"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("b_r"); assertThat(name.toString()).isEqualTo("f-o.br"); } @Test public void adaptShouldSupportMixedCase() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("fOo.bAr", '.'); assertThat(name.getElement(0, Form.UNIFORM)).isEqualTo("foo"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("fOo"); assertThat(name.getElement(1, Form.UNIFORM)).isEqualTo("bar"); assertThat(name.getElement(1, Form.ORIGINAL)).isEqualTo("bAr"); assertThat(name.toString()).isEqualTo("foo.bar"); } @Test public void adaptShouldUseElementValueProcessor() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("FOO_THE-BAR", '_', (c) -> c.toString().replace("-", "")); assertThat(name.toString()).isEqualTo("foo.thebar"); } @Test public void adaptShouldSupportIndexedElements() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("foo", '.'); assertThat(name.toString()).isEqualTo("foo"); assertThat(name.getNumberOfElements()).isEqualTo(1); name = ConfigurationPropertyName.adapt("[foo]", '.'); assertThat(name.toString()).isEqualTo("[foo]"); assertThat(name.getNumberOfElements()).isEqualTo(1); name = ConfigurationPropertyName.adapt("foo.bar", '.'); assertThat(name.toString()).isEqualTo("foo.bar"); assertThat(name.getNumberOfElements()).isEqualTo(2); name = ConfigurationPropertyName.adapt("foo[foo.bar]", '.'); assertThat(name.toString()).isEqualTo("foo[foo.bar]"); assertThat(name.getNumberOfElements()).isEqualTo(2); name = ConfigurationPropertyName.adapt("foo.[bar].baz", '.'); assertThat(name.toString()).isEqualTo("foo[bar].baz"); assertThat(name.getNumberOfElements()).isEqualTo(3); } @Test public void isEmptyWhenEmptyShouldReturnTrue() throws Exception { assertThat(ConfigurationPropertyName.of("").isEmpty()).isTrue(); } @Test public void isEmptyWhenNotEmptyShouldReturnFalse() throws Exception { assertThat(ConfigurationPropertyName.of("x").isEmpty()).isFalse(); } @Test public void isLastElementIndexedWhenIndexedShouldReturnTrue() throws Exception { assertThat(ConfigurationPropertyName.of("foo[0]").isLastElementIndexed()) .isTrue(); } @Test public void isLastElementIndexedWhenNotIndexedShouldReturnFalse() throws Exception { assertThat(ConfigurationPropertyName.of("foo.bar").isLastElementIndexed()) .isFalse(); assertThat(ConfigurationPropertyName.of("foo[0].bar").isLastElementIndexed()) .isFalse(); } @Test public void getLastElementShouldGetLastElement() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("foo.bAr", '.'); assertThat(name.getLastElement(Form.ORIGINAL)).isEqualTo("bAr"); assertThat(name.getLastElement(Form.UNIFORM)).isEqualTo("bar"); } @Test public void getLastElementWhenEmptyShouldReturnEmptyString() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.EMPTY; assertThat(name.getLastElement(Form.ORIGINAL)).isEqualTo(""); assertThat(name.getLastElement(Form.UNIFORM)).isEqualTo(""); } @Test public void getElementShouldNotIncludeAngleBrackets() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("[foo]"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("foo"); assertThat(name.getElement(0, Form.UNIFORM)).isEqualTo("foo"); } @Test public void getElementInUniformFormShouldNotIncludeDashes() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("f-o-o"); assertThat(name.getElement(0, Form.ORIGINAL)).isEqualTo("f-o-o"); assertThat(name.getElement(0, Form.UNIFORM)).isEqualTo("foo"); } @Test public void getElementInOriginalFormShouldReturnElement() throws Exception { assertThat(getElements("foo.bar", Form.ORIGINAL)).containsExactly("foo", "bar"); assertThat(getElements("foo[0]", Form.ORIGINAL)).containsExactly("foo", "0"); assertThat(getElements("foo.[0]", Form.ORIGINAL)).containsExactly("foo", "0"); assertThat(getElements("foo[baz]", Form.ORIGINAL)).containsExactly("foo", "baz"); assertThat(getElements("foo.baz", Form.ORIGINAL)).containsExactly("foo", "baz"); assertThat(getElements("foo[baz].bar", Form.ORIGINAL)).containsExactly("foo", "baz", "bar"); assertThat(getElements("foo.baz.bar", Form.ORIGINAL)).containsExactly("foo", "baz", "bar"); assertThat(getElements("foo.baz-bar", Form.ORIGINAL)).containsExactly("foo", "baz-bar"); } @Test public void getElementInUniformFormShouldReturnElement() throws Exception { assertThat(getElements("foo.bar", Form.UNIFORM)).containsExactly("foo", "bar"); assertThat(getElements("foo[0]", Form.UNIFORM)).containsExactly("foo", "0"); assertThat(getElements("foo.[0]", Form.UNIFORM)).containsExactly("foo", "0"); assertThat(getElements("foo[baz]", Form.UNIFORM)).containsExactly("foo", "baz"); assertThat(getElements("foo.baz", Form.UNIFORM)).containsExactly("foo", "baz"); assertThat(getElements("foo[baz].bar", Form.UNIFORM)).containsExactly("foo", "baz", "bar"); assertThat(getElements("foo.baz.bar", Form.UNIFORM)).containsExactly("foo", "baz", "bar"); assertThat(getElements("foo.baz-bar", Form.UNIFORM)).containsExactly("foo", "bazbar"); } private List<CharSequence> getElements(String name, Form form) { ConfigurationPropertyName propertyName = ConfigurationPropertyName.of(name); List<CharSequence> result = new ArrayList<>(propertyName.getNumberOfElements()); for (int i = 0; i < propertyName.getNumberOfElements(); i++) { result.add(propertyName.getElement(i, form)); } return result; } @Test public void getNumberOfElementsShouldReturnNumberOfElement() throws Exception { assertThat(ConfigurationPropertyName.of("").getNumberOfElements()).isEqualTo(0); assertThat(ConfigurationPropertyName.of("x").getNumberOfElements()).isEqualTo(1); assertThat(ConfigurationPropertyName.of("x.y").getNumberOfElements()) .isEqualTo(2); assertThat(ConfigurationPropertyName.of("x[0].y").getNumberOfElements()) .isEqualTo(3); } @Test public void appendWhenNotIndexedShouldAppendWithDot() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); assertThat(name.append("bar").toString()).isEqualTo("foo.bar"); } @Test public void appendWhenIndexedShouldAppendWithBrackets() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo") .append("[bar]"); assertThat(name.isLastElementIndexed()).isTrue(); assertThat(name.toString()).isEqualTo("foo[bar]"); } @Test public void appendWhenElementNameIsNotValidShouldThrowException() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("Element value '1bar' is not valid"); ConfigurationPropertyName.of("foo").append("1bar"); } @Test public void appendWhenElementNameMultiDotShouldThrowException() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("Element value 'bar.baz' must be a single item"); ConfigurationPropertyName.of("foo").append("bar.baz"); } @Test public void appendWhenElementNameIsNullShouldReturnName() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); assertThat((Object) name.append((String) null)).isSameAs(name); } @Test public void chopWhenLessThenSizeShouldReturnChopped() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo.bar.baz"); assertThat(name.chop(1).toString()).isEqualTo("foo"); assertThat(name.chop(2).toString()).isEqualTo("foo.bar"); } @Test public void chopWhenGreaterThanSizeShouldReturnExisting() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo.bar.baz"); assertThat(name.chop(4)).isEqualTo(name); } @Test public void chopWhenEqualToSizeShouldReturnExisting() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo.bar.baz"); assertThat(name.chop(3)).isEqualTo(name); } @Test public void isParentOfWhenSameShouldReturnFalse() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); assertThat(name.isParentOf(name)).isFalse(); } @Test public void isParentOfWhenParentShouldReturnTrue() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); ConfigurationPropertyName child = ConfigurationPropertyName.of("foo.bar"); assertThat(name.isParentOf(child)).isTrue(); assertThat(child.isParentOf(name)).isFalse(); } @Test public void isParentOfWhenGrandparentShouldReturnFalse() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); ConfigurationPropertyName grandchild = ConfigurationPropertyName .of("foo.bar.baz"); assertThat(name.isParentOf(grandchild)).isFalse(); assertThat(grandchild.isParentOf(name)).isFalse(); } @Test public void isParentOfWhenRootReturnTrue() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of(""); ConfigurationPropertyName child = ConfigurationPropertyName.of("foo"); ConfigurationPropertyName grandchild = ConfigurationPropertyName.of("foo.bar"); assertThat(name.isParentOf(child)).isTrue(); assertThat(name.isParentOf(grandchild)).isFalse(); assertThat(child.isAncestorOf(name)).isFalse(); } @Test public void isAncestorOfWhenSameShouldReturnFalse() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); assertThat(name.isAncestorOf(name)).isFalse(); } @Test public void isAncestorOfWhenParentShouldReturnTrue() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); ConfigurationPropertyName child = ConfigurationPropertyName.of("foo.bar"); assertThat(name.isAncestorOf(child)).isTrue(); assertThat(child.isAncestorOf(name)).isFalse(); } @Test public void isAncestorOfWhenGrandparentShouldReturnTrue() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of("foo"); ConfigurationPropertyName grandchild = ConfigurationPropertyName .of("foo.bar.baz"); assertThat(name.isAncestorOf(grandchild)).isTrue(); assertThat(grandchild.isAncestorOf(name)).isFalse(); } @Test public void isAncestorOfWhenRootShouldReturnTrue() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.of(""); ConfigurationPropertyName grandchild = ConfigurationPropertyName .of("foo.bar.baz"); assertThat(name.isAncestorOf(grandchild)).isTrue(); assertThat(grandchild.isAncestorOf(name)).isFalse(); } @Test public void compareShouldSortNames() throws Exception { List<ConfigurationPropertyName> names = new ArrayList<>(); names.add(ConfigurationPropertyName.of("foo[10]")); names.add(ConfigurationPropertyName.of("foo.bard")); names.add(ConfigurationPropertyName.of("foo[2]")); names.add(ConfigurationPropertyName.of("foo.bar")); names.add(ConfigurationPropertyName.of("foo.baz")); names.add(ConfigurationPropertyName.of("foo")); Collections.sort(names); assertThat(names.stream().map(ConfigurationPropertyName::toString) .collect(Collectors.toList())).containsExactly("foo", "foo[2]", "foo[10]", "foo.bar", "foo.bard", "foo.baz"); } @Test public void toStringShouldBeLowerCaseDashed() throws Exception { ConfigurationPropertyName name = ConfigurationPropertyName.adapt("fOO.b_-a-r", '.'); assertThat(name.toString()).isEqualTo("foo.b-a-r"); } @Test public void equalsAndHashCode() throws Exception { ConfigurationPropertyName n01 = ConfigurationPropertyName.of("foo[bar]"); ConfigurationPropertyName n02 = ConfigurationPropertyName.of("foo[bar]"); ConfigurationPropertyName n03 = ConfigurationPropertyName.of("foo.bar"); ConfigurationPropertyName n04 = ConfigurationPropertyName.of("f-o-o.b-a-r"); ConfigurationPropertyName n05 = ConfigurationPropertyName.of("foo[BAR]"); ConfigurationPropertyName n06 = ConfigurationPropertyName.of("oof[bar]"); ConfigurationPropertyName n07 = ConfigurationPropertyName.of("foo.bar"); ConfigurationPropertyName n08 = ConfigurationPropertyName.EMPTY; ConfigurationPropertyName n09 = ConfigurationPropertyName.of("foo"); ConfigurationPropertyName n10 = ConfigurationPropertyName.of("fo"); ConfigurationPropertyName n11 = ConfigurationPropertyName.adapt("foo.BaR", '.'); assertThat(n01.hashCode()).isEqualTo(n02.hashCode()); assertThat(n01.hashCode()).isEqualTo(n02.hashCode()); assertThat(n01.hashCode()).isEqualTo(n03.hashCode()); assertThat(n01.hashCode()).isEqualTo(n04.hashCode()); assertThat(n01.hashCode()).isEqualTo(n11.hashCode()); assertThat((Object) n01).isEqualTo(n01); assertThat((Object) n01).isEqualTo(n02); assertThat((Object) n01).isEqualTo(n03); assertThat((Object) n01).isEqualTo(n04); assertThat((Object) n11).isEqualTo(n03); assertThat((Object) n03).isEqualTo(n11); assertThat((Object) n01).isNotEqualTo(n05); assertThat((Object) n01).isNotEqualTo(n06); assertThat((Object) n07).isNotEqualTo(n08); assertThat((Object) n09).isNotEqualTo(n10); assertThat((Object) n10).isNotEqualTo(n09); } @Test public void isValidWhenValidShouldReturnTrue() throws Exception { assertThat(ConfigurationPropertyName.isValid("")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo.bar")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo[0]")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo[0].baz")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo.b1")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo.b-a-r")).isTrue(); assertThat(ConfigurationPropertyName.isValid("foo[FooBar].baz")).isTrue(); } @Test public void isValidWhenNotValidShouldReturnFalse() throws Exception { assertThat(ConfigurationPropertyName.isValid(null)).isFalse(); assertThat(ConfigurationPropertyName.isValid("1foo")).isFalse(); assertThat(ConfigurationPropertyName.isValid("FooBar")).isFalse(); assertThat(ConfigurationPropertyName.isValid("foo!bar")).isFalse(); } }