Skip to content

Commit f8e23f9

Browse files
committed
Check if two differently formatted NRNs are the same
Signed-off-by: Faissal Elamraoui <[email protected]>
1 parent aeb5a10 commit f8e23f9

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

nrn.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gobenrn
22

33
import (
4+
"reflect"
45
"strconv"
56

67
age "github.com/bearbin/go-age"
@@ -72,3 +73,18 @@ func IsBirthDateKnown(nrn string) (bool, error) {
7273
day, _ := parsedNrn.getBirthDay()
7374
return month != 0 && day != 0, nil
7475
}
76+
77+
// Equal checks if two differently formatted NRNs are the same.
78+
func Equal(nrn1, nrn2 string) (bool, error) {
79+
parsedNrn1, err := parseNrn(nrn1)
80+
if err != nil {
81+
return false, err
82+
}
83+
84+
parsedNrn2, err := parseNrn(nrn2)
85+
if err != nil {
86+
return false, err
87+
}
88+
89+
return reflect.DeepEqual(parsedNrn1, parsedNrn2), nil
90+
}

nrn_test.go

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gobenrn
22

33
import (
4+
"math/bits"
45
"strings"
56
"testing"
67
"time"
@@ -17,8 +18,9 @@ const (
1718
unknownBirthDateNrn = "009000 002 00"
1819
)
1920

21+
var validNrns = []string{validNrn, validNrnWithSpaces, validFormattedNrn}
22+
2023
func Test_GetBirthDateRFC3339_Success(t *testing.T) {
21-
validNrns := []string{validNrn, validNrnWithSpaces, validFormattedNrn}
2224
for _, nrn := range validNrns {
2325
t.Run("With_Valid_NRN_"+nrn, func(t *testing.T) {
2426
dateOfBirth, err := GetBirthDate(nrn, time.RFC3339)
@@ -39,7 +41,6 @@ func Test_GetBirthDateRFC3339_Failure(t *testing.T) {
3941
}
4042

4143
func Test_GetAge_Success(t *testing.T) {
42-
validNrns := []string{validNrn, validNrnWithSpaces, validFormattedNrn}
4344
for _, nrn := range validNrns {
4445
t.Run("With_Valid_NRN_"+nrn, func(t *testing.T) {
4546
age, err := GetAge(nrn)
@@ -56,7 +57,6 @@ func Test_GetAge_Failure(t *testing.T) {
5657
}
5758

5859
func Test_IsMale_Success(t *testing.T) {
59-
validNrns := []string{validNrn, validNrnWithSpaces, validFormattedNrn}
6060
for _, nrn := range validNrns {
6161
t.Run("With_Valid_NRN_"+nrn, func(t *testing.T) {
6262
male, err := IsMale(nrn)
@@ -87,7 +87,6 @@ func Test_IsFemale_Failure(t *testing.T) {
8787
}
8888

8989
func Test_IsBirthDateKnown_Success(t *testing.T) {
90-
validNrns := []string{validNrn, validNrnWithSpaces, validFormattedNrn}
9190
for _, nrn := range validNrns {
9291
t.Run("With_Valid_NRN_"+nrn, func(t *testing.T) {
9392
known, err := IsBirthDateKnown(nrn)
@@ -102,3 +101,46 @@ func Test_IsBirthDateKnown_Failure(t *testing.T) {
102101
assert.Nil(t, err)
103102
assert.False(t, known)
104103
}
104+
105+
func Test_Equal_Success(t *testing.T) {
106+
combine := func(set []string, n int) (subsets [][]string) {
107+
length := uint(len(set))
108+
if n > len(set) {
109+
n = len(set)
110+
}
111+
112+
for subsetBits := 1; subsetBits < (1 << length); subsetBits++ {
113+
if n > 0 && bits.OnesCount(uint(subsetBits)) != n {
114+
continue
115+
}
116+
117+
var subset []string
118+
for object := uint(0); object < length; object++ {
119+
if (subsetBits>>object)&1 == 1 {
120+
subset = append(subset, set[object])
121+
}
122+
}
123+
subsets = append(subsets, subset)
124+
}
125+
return subsets
126+
}
127+
128+
for _, combination := range combine(validNrns, 2) {
129+
nrn1, nrn2 := combination[0], combination[1]
130+
t.Run("With_"+nrn1+"_And_"+nrn2, func(t *testing.T) {
131+
areEqual, err := Equal(nrn1, nrn2)
132+
assert.Nil(t, err)
133+
assert.True(t, areEqual)
134+
})
135+
}
136+
}
137+
138+
func Test_Equal_Failure(t *testing.T) {
139+
areEqual, err := Equal(validNrn, invalidLengthNrn)
140+
assert.False(t, areEqual)
141+
assert.ErrorContains(t, err, ErrInvalidNrnLength.Error())
142+
143+
areEqual, err = Equal(validNrn, validFormattedFemaleNrn)
144+
assert.Nil(t, err)
145+
assert.False(t, areEqual)
146+
}

0 commit comments

Comments
 (0)