From 5046e3fa6c7e1a9587214ca2c0b31d9e201aa30d Mon Sep 17 00:00:00 2001 From: oboehm Date: Wed, 12 Apr 2017 19:56:43 +0200 Subject: [PATCH] better validation added to PLZ ctor --- src/main/java/de/jfachwert/post/PLZ.java | 34 ++++++++++++++++---- src/test/java/de/jfachwert/post/PLZTest.java | 18 +++++++++++ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/jfachwert/post/PLZ.java b/src/main/java/de/jfachwert/post/PLZ.java index fdfa525e..29f9770d 100644 --- a/src/main/java/de/jfachwert/post/PLZ.java +++ b/src/main/java/de/jfachwert/post/PLZ.java @@ -38,7 +38,7 @@ public class PLZ extends AbstractFachwert { * @param plz z.B. "70839" oder "D-70839" */ public PLZ(String plz) { - super(normalize(plz)); + super(validate(plz)); } private static String validate(String code) { @@ -51,21 +51,25 @@ private static String validate(String code) { private static String validateNumberOf(String plz) { String kennung = getLandeskennung(plz); + String zahl = getPostleitZahl(plz); switch (kennung) { case "D": - if (plz.length() != 6) { - throw new IllegalArgumentException(toLongString(plz) + ": nur 5 Ziffern fuer PLZ sind erlaubt"); - } + validateNumberWith(5, kennung, zahl); break; + case "A": case "CH": - if (plz.length() != 6) { - throw new IllegalArgumentException(toLongString(plz) + ": nur 4 Ziffern fuer PLZ sind erlaubt"); - } + validateNumberWith(4, kennung, zahl); break; } return plz; } + private static void validateNumberWith(int length, String kennung, String zahl) { + if (zahl.length() != length) { + throw new IllegalArgumentException(zahl + ": nur " + length + " Ziffern fuer PLZ sind erlaubt in " + kennung); + } + } + private static String normalize(String plz) { return StringUtils.replaceChars(plz, " -", "").toUpperCase(); } @@ -117,6 +121,22 @@ public Locale getLand() { } } + /** + * Liefert die eigentliche Postleitzahl ohne Landeskennung. + * + * @return z,B. "01001" + */ + public String getPostleitZahl() { + return getPostleitZahl(this.getCode()); + } + + private static String getPostleitZahl(String plz) { + if (!hasLandeskennung(plz)) { + return plz; + } + return StringUtils.substringAfter(toLongString(plz), "-"); + } + /** * Liefert die PLZ in kompakter Schreibweise (ohne Trennzeichen zwischen * Landeskennung und eigentlicher PLZ) zurueck. diff --git a/src/test/java/de/jfachwert/post/PLZTest.java b/src/test/java/de/jfachwert/post/PLZTest.java index 97ccd892..c75a9fb9 100644 --- a/src/test/java/de/jfachwert/post/PLZTest.java +++ b/src/test/java/de/jfachwert/post/PLZTest.java @@ -41,6 +41,15 @@ protected Fachwert createFachwert() { return new PLZ("D-70839"); } + /** + * Postleitzahlen in Oesterreich sind 4-stellig. D.h. eine 5-stellige + * oesterreichische PLZ sollte nicht erstellt werden koennen. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidPLZ() { + new PLZ("A-12345"); + } + /** * Test-Methode fuer {@link PLZ#getLandeskennung()}. */ @@ -98,4 +107,13 @@ public void testGetLandCH() { assertEquals("CH", vaduz.getLand().getCountry()); } + /** + * Test-Methode fuer {@link PLZ#getLand()}. + */ + @Test + public void testGetLandAT() { + PLZ weyer = new PLZ("A-3335"); + assertEquals(new Locale("de", "AT"), weyer.getLand()); + } + }