Skip to content

Commit

Permalink
Merge pull request #20 from personnummer/issue/unit-tests-and-regex
Browse files Browse the repository at this point in the history
Issue/unit tests and regex
  • Loading branch information
Johannestegner authored Jun 17, 2020
2 parents d8f0721 + 326f9bf commit d11ba78
Show file tree
Hide file tree
Showing 8 changed files with 179 additions and 55 deletions.
2 changes: 0 additions & 2 deletions .github/FUNDING.yml

This file was deleted.

20 changes: 20 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Release
on:
release:
types: [published]
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set up JDK 1.8
uses: actions/setup-java@v1

- name: Build with Gradle
run: gradle build

- name: Publish to GitHub Packages
run: gradle publish
env:
USERNAME: ${{ github.actor }}
TOKEN: ${{ secrets.GITHUB_TOKEN }}
19 changes: 19 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Test
on:
push:
pull_request:

jobs:
build:
runs-on: ubuntu-18.04
strategy:
matrix:
java: [ 8, 10, 12, 13 ]
name: Java ${{ matrix.java }} test.
steps:
- uses: actions/checkout@v2
- name: Setup java
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- run: gradle test
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ build/
.classpath
.project
.settings/
temp.json
12 changes: 0 additions & 12 deletions .travis.yml

This file was deleted.

25 changes: 24 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
plugins {
id("maven-publish")
}

apply plugin: 'java-library'
apply plugin: 'java'

sourceCompatibility = 1.8
targetCompatibility = 1.8

Expand All @@ -9,7 +14,7 @@ repositories {

dependencies {
testImplementation 'junit:junit:4.12'
testCompile "junit:junit:4.12"
testCompile ("junit:junit:4.12", "org.json:json:20200518")
}

version = '0.1.0'
Expand All @@ -27,3 +32,21 @@ test {
exceptionFormat "full"
}
}

publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/personnummer/java")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
publications {
gpr(MavenPublication) {
from(components.java)
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/Personnummer.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public final class Personnummer {
private static final Pattern regexPattern;

static {
regexPattern = Pattern.compile("^(\\d{2})?(\\d{2})(\\d{2})(\\d{2})([-|+]?)?(\\d{3})(\\d?)$");
regexPattern = Pattern.compile("^(\\d{2})?(\\d{2})(\\d{2})(\\d{2})([-|+]?)?((?!000)\\d{3})(\\d?)$");
}

private Personnummer() {
Expand Down
153 changes: 114 additions & 39 deletions src/test/java/PersonnummerTest.java
Original file line number Diff line number Diff line change
@@ -1,61 +1,136 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import org.json.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class PersonnummerTest {
private static Boolean fileLoaded = false;

private static List<Long> validSsnInt = new ArrayList<>();
private static List<String> validSsnString = new ArrayList<>();
private static List<Long> invalidSsnInt = new ArrayList<>();
private static List<String> invalidSsnString = new ArrayList<>();
private static List<Long> validConInt = new ArrayList<>();
private static List<String> validConString = new ArrayList<>();
private static List<Long> invalidConInt = new ArrayList<>();
private static List<String> invalidConString = new ArrayList<>();

@AfterClass
public static void deleteTestData() throws IOException {
Files.delete(Paths.get("temp.json"));
}

@BeforeClass
public static void loadTestData() throws IOException {
if (fileLoaded) {
return;
}

if (!Files.exists(Paths.get("temp.json"))) {
InputStream in = new URL("https://raw.githubusercontent.com/personnummer/meta/master/testdata/structured.json").openStream();
Files.copy(in, Paths.get("temp.json"), StandardCopyOption.REPLACE_EXISTING);
fileLoaded = true;
}

String jsonString = new String(Files.readAllBytes(Paths.get("temp.json")));
JSONObject json = new JSONObject(jsonString);

JSONObject ssn = json.getJSONObject("ssn");
JSONObject con = json.getJSONObject("con");

validSsnInt = getIntList(ssn, "integer", "valid");
invalidSsnInt = getIntList(ssn, "integer", "invalid");
validSsnString = getStringList(ssn, "string", "valid");
invalidSsnString = getStringList(ssn, "string", "invalid");

validConInt = getIntList(con, "integer", "valid");
invalidConInt = getIntList(con, "integer", "invalid");
validConString = getStringList(con, "string", "valid");
invalidConString = getStringList(con, "string", "invalid");
}

private static ArrayList<String> getStringList(JSONObject root, String dataType, String valid) {
JSONArray arr = root.getJSONObject(dataType).getJSONArray(valid);
ArrayList<String> result = new ArrayList<>();
for (int i=0; i<arr.length(); i++) {
result.add(arr.getString(i));
}
return result;
}

private static ArrayList<Long> getIntList(JSONObject root, String dataType, String valid) {
JSONArray arr = root.getJSONObject(dataType).getJSONArray(valid);
ArrayList<Long> result = new ArrayList<>();
for (int i=0; i<arr.length(); i++) {
result.add(arr.getLong(i));
}
return result;
}

@Test
public void testPersonnNummerWithInvalidIntegerValues() {
for (Long ssn: invalidSsnInt) {
assertFalse(Personnummer.valid(ssn));
}
}

@Test
public void testCoordinationNummerWithInvalidIntegerValues() {
for (Long ssn: invalidConInt) {
assertFalse(Personnummer.valid(ssn));
}
}

@Test
public void testPersonnNummerWithInvalidStringValues() {
for (String ssn: invalidSsnString) {
assertFalse(Personnummer.valid(ssn));
}
}

@Test
public void testWithControlDigit() {
assertTrue(Personnummer.valid("6403273813"));
assertTrue(Personnummer.valid("510818-9167"));
assertTrue(Personnummer.valid("19900101-0017"));
assertTrue(Personnummer.valid("19130401+2931"));
assertTrue(Personnummer.valid("196408233234"));
assertTrue(Personnummer.valid("0001010107"));
assertTrue(Personnummer.valid("000101-0107"));
assertTrue(Personnummer.valid("1010101010"));
assertTrue(Personnummer.valid(6403273813L));
assertTrue(Personnummer.valid(5108189167L));
assertTrue(Personnummer.valid(199001010017L));
assertTrue(Personnummer.valid(191304012931L));
assertTrue(Personnummer.valid(196408233234L));
public void testCoordinationNummerWithInvalidStringValues() {
for (String ssn: invalidConString) {
assertFalse(Personnummer.valid(ssn));
}
}

@Test
public void testWithoutControlDigit() {
assertFalse(Personnummer.valid(640327381L));
assertFalse(Personnummer.valid(510818916L));
assertFalse(Personnummer.valid(19900101001L));
assertFalse(Personnummer.valid(100101001L));
assertFalse(Personnummer.valid("640327-381"));
assertFalse(Personnummer.valid("510818-916"));
assertFalse(Personnummer.valid("19900101-001"));
assertFalse(Personnummer.valid("100101+001"));
public void testPersonnNummerWithValidIntegerValues() {
for (Long ssn: validSsnInt) {
assertTrue(Personnummer.valid(ssn));
}
}

@Test
public void testWithInvalidValues() {
assertFalse(Personnummer.valid("A string"));
assertFalse(Personnummer.valid("Two"));
assertFalse(Personnummer.valid("222"));
assertFalse(Personnummer.valid(null));
assertFalse(Personnummer.valid("9701063-2391"));
public void testCoordinationNummerVnvalidIntegerValues() {
for (Long ssn: validConInt) {
assertTrue(Personnummer.valid(ssn));
}
}

@Test
public void testCoordinationNumbers() {
assertTrue(Personnummer.valid("701063-2391"));
assertTrue(Personnummer.valid("640883-3231"));
assertTrue(Personnummer.valid(7010632391L));
assertTrue(Personnummer.valid(6408833231L));
public void testPersonnNummerWithValidStringValues() {
for (String ssn: validSsnString) {
assertTrue(Personnummer.valid(ssn));
}
}

@Test
public void testWithBadCoordinationNumbers() {
assertFalse(Personnummer.valid(9001610017L));
assertFalse(Personnummer.valid(6408933231L));
assertFalse(Personnummer.valid("900161-0017"));
assertFalse(Personnummer.valid("640893-3231"));
public void testCoordinationNummerWithValidStringValues() {
for (String ssn: validConString) {
assertTrue(Personnummer.valid(ssn));
}
}

}

0 comments on commit d11ba78

Please sign in to comment.