TEXT-16: Make ParserOptions immutable
diff --git a/src/main/java/org/apache/commons/text/names/ParserOptions.java b/src/main/java/org/apache/commons/text/names/ParserOptions.java
index 6bca771..dcde9ae 100644
--- a/src/main/java/org/apache/commons/text/names/ParserOptions.java
+++ b/src/main/java/org/apache/commons/text/names/ParserOptions.java
@@ -17,43 +17,65 @@
package org.apache.commons.text.names;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+import org.apache.commons.lang3.Validate;
+
/**
* Options for the {@link HumanNameParser} parser.
*/
public final class ParserOptions {
- public static final ParserOptions DEFAULT_OPTIONS = new ParserOptions();
+ private static final Set<String> DEFAULT_PREFIXES = new HashSet<String>(Arrays.asList(
+ "bar", "ben", "bin", "da", "dal",
+ "de la", "de", "del", "der", "di", "ibn", "la", "le",
+ "san", "st", "ste", "van", "van der", "van den", "vel",
+ "von"));
+
+ private static final Set<String> DEFAULT_SUFFIXES = new HashSet<String>(Arrays.asList(
+ "esq", "esquire", "jr",
+ "sr", "2", "ii", "iii", "iv"));
private final Set<String> suffixes;
private final Set<String> prefixes;
+ public static final ParserOptions DEFAULT_OPTIONS = new ParserOptions();
+
+ /**
+ * Creates options for the human names parser.
+ */
public ParserOptions() {
- this.suffixes = new HashSet<String>(Arrays.asList(
- "esq", "esquire", "jr",
- "sr", "2", "ii", "iii", "iv"));
- this.prefixes = new HashSet<String>(Arrays.asList(
- "bar", "ben", "bin", "da", "dal",
- "de la", "de", "del", "der", "di", "ibn", "la", "le",
- "san", "st", "ste", "van", "van der", "van den", "vel",
- "von"));
+ this(DEFAULT_PREFIXES, DEFAULT_SUFFIXES);
+ }
+
+ /**
+ * Creates options for the human names parser.
+ *
+ * @param prefixes name prefixes, must not be null
+ * @param suffixes name suffixes, must not be null
+ */
+ public ParserOptions(Set<String> prefixes, Set<String> suffixes) {
+ Validate.notNull(prefixes, "Prefixes must not be null");
+ Validate.notNull(prefixes, "Suffixes must not be null");
+ this.prefixes = prefixes;
+ this.suffixes = suffixes;
}
/**
* @return the suffixes
*/
public Set<String> getSuffixes() {
- return suffixes;
+ return Collections.unmodifiableSet(suffixes);
}
/**
* @return the prefixes
*/
public Set<String> getPrefixes() {
- return prefixes;
+ return Collections.unmodifiableSet(prefixes);
}
}
diff --git a/src/test/java/org/apache/commons/text/names/NameStringTest.java b/src/test/java/org/apache/commons/text/names/NameStringTest.java
index e087579..4431d4a 100644
--- a/src/test/java/org/apache/commons/text/names/NameStringTest.java
+++ b/src/test/java/org/apache/commons/text/names/NameStringTest.java
@@ -37,14 +37,11 @@
@Test
public void testChopWithRegexReturnsChoppedSubstring() {
- NameString nameString = new NameString("Björn O'Malley");
-
assertThat(nameString.chopWithRegex("(^([^ ]+))(.+)", 1), equalTo("Björn"));
}
@Test
public void testChopWithRegexChopsStartOffNameStr() {
- NameString nameString = new NameString("Björn O'Malley");
nameString.chopWithRegex("(^[^ ]+)", 0);
assertThat(nameString.getWrappedString(), equalTo("O'Malley"));
@@ -52,7 +49,6 @@
@Test
public void testChopWithRegexChopsEndOffNameStr() {
- NameString nameString = new NameString("Björn O'Malley");
nameString.chopWithRegex("( (.+)$)", 1);
assertThat(nameString.getWrappedString(), equalTo("Björn"));
@@ -60,7 +56,6 @@
@Test
public void testChopWithRegexChopsMiddleFromNameStr() {
- NameString nameString = new NameString("Björn 'Bill' O'Malley");
nameString.chopWithRegex("( '[^']+' )", 0);
assertThat(nameString.getWrappedString(), equalTo("Björn O'Malley"));
@@ -68,7 +63,6 @@
@Test
public void testFlip() {
- NameString nameString = new NameString("O'Malley, Björn");
nameString.flip(",");
assertThat(nameString.getWrappedString(), equalTo("Björn O'Malley"));
diff --git a/src/test/java/org/apache/commons/text/names/ParserOptionsTest.java b/src/test/java/org/apache/commons/text/names/ParserOptionsTest.java
new file mode 100644
index 0000000..a2ba727
--- /dev/null
+++ b/src/test/java/org/apache/commons/text/names/ParserOptionsTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.commons.text.names;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for {@code ParserOptions}.
+ */
+public class ParserOptionsTest {
+
+ private ParserOptions p1;
+
+ @Before
+ public void setUp() {
+ p1 = new ParserOptions();
+ }
+
+ @Test(expected=UnsupportedOperationException.class)
+ public void testParserOptionsIsImmutableForPrefixes() {
+ p1.getPrefixes().add("Invalid entry");
+ }
+
+ @Test(expected=UnsupportedOperationException.class)
+ public void testParserOptionsIsImmutableForSuffixes() {
+ p1.getSuffixes().add("Invalid entry");
+ }
+
+ @Test
+ public void testParserOptionsUsesDefaultOptions() {
+ assertTrue(p1.getPrefixes().contains("van"));
+ assertTrue(p1.getPrefixes().contains("san"));
+ assertTrue(p1.getPrefixes().contains("bin"));
+ assertTrue(p1.getSuffixes().contains("esq"));
+ assertTrue(p1.getSuffixes().contains("esquire"));
+ assertTrue(p1.getSuffixes().contains("iv"));
+ }
+
+ @Test
+ public void testParseOptionsShouldBeConfigurable() {
+ Set<String> prefixes = new HashSet<String>(Arrays.asList("sr", "nho", "sinho"));
+ p1 = new ParserOptions(prefixes, Collections.<String>emptySet());
+ assertTrue(p1.getPrefixes().contains("nho"));
+
+ Set<String> suffixes = new HashSet<String>(Arrays.asList("primeiro", "segundo", "neto"));
+ p1 = new ParserOptions(Collections.<String>emptySet(), suffixes);
+ assertTrue(p1.getSuffixes().contains("neto"));
+ }
+
+}