[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[robocop] 07/37: Improve checks + tests
From: |
Admin |
Subject: |
[robocop] 07/37: Improve checks + tests |
Date: |
Thu, 05 Jun 2025 10:20:52 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository robocop.
commit 460c82d634d54cba8b2f421269ee61505a037dc1
Author: Vint Leenaars <vl.software@leenaa.rs>
AuthorDate: Sun May 4 23:34:20 2025 +0200
Improve checks + tests
---
src/KYC/Check.hs | 45 +++-
test/Tests/Check.hs | 630 ++++++++-------------------------------------
test/Tests/Targets/Fake.hs | 259 +++++++++++++++++++
test/Tests/Targets/Real.hs | 259 +++++++++++++++++++
4 files changed, 654 insertions(+), 539 deletions(-)
diff --git a/src/KYC/Check.hs b/src/KYC/Check.hs
index 3141b5c..500ed21 100644
--- a/src/KYC/Check.hs
+++ b/src/KYC/Check.hs
@@ -19,7 +19,8 @@ import Data.Maybe
import Data.Map (Map, toList)
import Data.Ratio
-import Data.Text (intercalate, pack, Text)
+import Data.Text (intercalate, pack, snoc, Text)
+import qualified Data.Text as T
import Data.Text.Metrics
import Data.Time.Calendar
@@ -95,25 +96,39 @@ checkPersons individuals' person = Score { match_quality = 0
checkPersons' :: NaturalPerson -> (Float, [Int]) -> [(Int, Individual)] ->
(Float, [Int])
checkPersons' _ score [] = score
checkPersons' person (score, ssids) ((ssid,ind):inds) = let
- points =
checkPerson person ind
- new_score = if
points >= 300 then 1 else points / 300
+ points =
checkPerson person ind
+ new_score = if
max_points >= threshold_points
+ then if
points >= 300 then 1 else points / 300
+ else
points / max_points
in
- if points >=
threshold_points
+ if new_score >= 2 / 3
then checkPersons'
person (max score new_score, ssid:ssids) inds
else checkPersons'
person (score, ssids) inds
+ where max_points = foldl1 (+) [ if toList (addresses ind) == [] then 0
else 150
+ , if toList (birth_dates ind) == [] then 0
else 100
+ , if toList (ids ind) == [] then 0
else 200
+ , if toList (names ind) == [] then 0
else 125
+ , if toList (nationalities ind) == [] then 0
else 50
+ ]
checkPerson :: NaturalPerson -> Individual -> Float
-checkPerson person individual = foldl1 (+) [ multFloats 150 address_score
(removeQuality . removeSSID)
- , multFloats 100 date_score
(removeQuality . removeSSID)
+checkPerson person individual = foldl1 (+) [ address_points
, multFloats 200 id_score
removeSSID
- , multFloats 125 name_score
(removeQuality . removeSSID)
+ , multFloats 100 date_score
(removeQuality . removeSSID)
, 50 * nationality_score
+ , name_points
]
where address_score = checkAddress (addresses individual)
(residential person)
- date_score = checkBirthDate (birth_dates individual)
(birthdate person)
id_score = checkID (ids individual)
(national_id person)
- name_score = checkNames (names individual)
(full_name person)
nationality_score = checkCountryCode (nationalities individual)
(nationality person)
+ name_score = checkNames (names individual)
(full_name person)
+ date_score = if name_points == 0
+ then []
+ else checkBirthDate (birth_dates individual)
(birthdate person)
+ address_points = multFloats 150 address_score (removeQuality .
removeSSID)
+ name_points = if address_points >= 100
+ then 125
+ else multFloats 125 name_score (removeQuality .
removeSSID)
multFloats :: Float -> [a] -> (a -> Float) -> Float
multFloats factor list toFloat = factor * foldl (\n x -> max n $ toFloat x) 0
list
@@ -206,9 +221,13 @@ compareAddress gls_address (ssid, quality) = if
total_score >= threshold_float
Just det -> let
perms = permutateText $ catMaybes [
Just $ street_name gls_address
,
Just $ street_number gls_address
- ,
lines gls_address
+ ,
country_subdivision gls_address
+ ,
lines gls_address
+ ,
town_district gls_address
+ ,
town_location gls_address
+ ,
Just $ zipcode gls_address
]
- ratio = compareTexts det 0 perms
+ ratio = compareTexts (cleanText det)
0 perms
in
Just $ if ratio >= threshold_ratio
then ratioToFloat ratio else 0
Nothing -> Nothing
@@ -240,6 +259,10 @@ compareAddress gls_address (ssid, quality) = if
total_score >= threshold_float
Nothing -> Nothing
+cleanText :: [Text] -> [Text]
+cleanText text = map (T.foldl (\new_text char -> if char `elem` chars_to_rm
then new_text else snoc new_text char) start_text) text
+ where chars_to_rm = ".,-" :: String
+ start_text = "" :: Text
permutateText :: [Text] -> [Text]
permutateText elems = map (intercalate " ") $ concatMap permutations $
subsequences elems
diff --git a/test/Tests/Check.hs b/test/Tests/Check.hs
index 2db7a63..9323207 100644
--- a/test/Tests/Check.hs
+++ b/test/Tests/Check.hs
@@ -6,15 +6,16 @@ module Tests.Check
import Control.Monad (when)
-import Data.CountryCodes
import Data.Map (Map, toList)
-import Data.Time.Calendar
import KYC.Check
import KYC.GLS.Type as GLS
import KYC.SSL as SSL
import KYC.Type
+import Tests.Targets.Real
+import Tests.Targets.Fake
+
import Test.Tasty
import Test.Tasty.HUnit
@@ -32,552 +33,125 @@ data Distribution = Distribution
, threshold_confidence :: Maybe Float
} deriving (Show, Eq)
-testTrusted :: Bool -> NaturalPerson -> Map Int Individual -> String ->
TestTree
-testTrusted verbose person sanction_list title = testCase ("Do not find " ++
title) $ do
- let score = checkPersons sanction_list person
- when verbose $ print score
- compareScore (Just 0) (confidence score) "Score"
- assertBool "Should not have found any match" ([] == references score)
+-- | Test fake target (found in target_SSID.xml, not found in sanction list)
+testFakeTarget :: Bool -> Int -> NaturalPerson -> Map Int Individual ->
Distribution -> TestTree
+testFakeTarget verbose number target sanction_list distribution =
+ testGroup ("Test fake target " ++ show number)
+ [ testSingleTarget verbose (show number) target distribution
+ , dontFindTarget verbose target sanction_list ("target " ++ show number)
+ ]
+
+
+-- | Test real target (found in target_SSID.xml, found in sanction list)
testTarget :: Bool -> Int -> NaturalPerson -> Map Int Individual ->
Distribution -> TestTree
-testTarget verbose number target ind_map distribution =
+testTarget verbose number target sanction_list distribution =
testGroup ("Test target " ++ show number)
- [ testPerfectTarget verbose (show number) target distribution
- , findPerfectTarget verbose number target distribution ind_map
+ [ testSingleTarget verbose (show number) target distribution
+ , findRealTarget verbose number target distribution sanction_list
]
-findPerfectTarget :: Bool -> Int -> NaturalPerson -> Distribution -> Map Int
Individual -> TestTree
-findPerfectTarget verbose number target distribution ind_map = testCase ("Find
target " ++ show number ++ " in Swiss Sanction List") $ do
- let score = checkPersons ind_map target
- when verbose $ print score
- compareScore (threshold_confidence distribution) (confidence score) "Score"
- assertBool ("Should find target " ++ show number) (number `elem` references
score)
+-- | Find target in sanction list
+findRealTarget :: Bool -> Int -> NaturalPerson -> Distribution -> Map Int
Individual -> TestTree
+findRealTarget verbose number target distribution sanction_list =
+ testCase ("Find target " ++ show number ++ " in Swiss Sanction List") $ do
+ let score = checkPersons sanction_list target
+
+ when verbose $ print score
+ compareScore (threshold_confidence distribution) (confidence score) "Score"
+ assertBool ("Should find target " ++ show number ++ ", but found " ++
(show . references) score ++ " instead") (number `elem` references score)
+
+-- | Dont find target in sanction list
+dontFindTarget :: Bool -> NaturalPerson -> Map Int Individual -> String ->
TestTree
+dontFindTarget verbose target sanction_list title =
+ testCase ("Do not find " ++ title ++ " in Swiss Sanction List") $ do
+ let score = checkPersons sanction_list target
-testPerfectTarget :: Bool -> String -> NaturalPerson -> Distribution ->
TestTree
-testPerfectTarget verbose number target distribution = testCase ("Find target
" ++ number ++ " in test file") $ do
- let filepath = "target_" ++ number ++ ".xml"
+ when verbose $ print score
+ compareScore (Just 0) (confidence score) "Score"
+ assertBool ("Should not find " ++ title ++ ", but found " ++ (show .
references) score ++ " instead") (references score == [])
- ssl <- (individuals . xmlToSSL) <$> parseSwissSanctionsList filepath
- assertBool (filepath ++ " should contain only this target") (toList ssl /=
[])
- let ((ssid,individual):_) = toList ssl
- assertBool ("SSID should be " ++ number) (ssid == read number)
+-- | Test if target matches target described in target_SSID.xml
+testSingleTarget :: Bool -> String -> NaturalPerson -> Distribution -> TestTree
+testSingleTarget verbose number target distribution =
+ testCase ("Find target " ++ number ++ " in test file") $ do
+ let filepath = "target_" ++ number ++ ".xml"
- let
- address_score = multFloats 150 (checkAddress (addresses individual)
(residential target)) (removeQuality . removeSSID)
- date_score = multFloats 100 (checkBirthDate (birth_dates individual)
(birthdate target)) (removeQuality . removeSSID)
- id_score = multFloats 200 (checkID (ids individual)
(national_id target)) removeSSID
- name_score = multFloats 125 (checkNames (names individual)
(full_name target)) (removeQuality . removeSSID)
+ ssl <- (individuals . xmlToSSL) <$> parseSwissSanctionsList filepath
+ assertBool (filepath ++ " should contain only this target") (toList ssl /=
[])
- nationality_score = 50 * checkCountryCode (nationalities individual)
(nationality target)
+ let ((ssid,individual):_) = toList ssl
+ assertBool ("SSID should be " ++ number) (ssid == read number)
- total_score = checkPersons ssl target
+ let
+ address_score = multFloats 150 (checkAddress (addresses individual)
(residential target)) (removeQuality . removeSSID)
+ date_score = multFloats 100 (checkBirthDate (birth_dates individual)
(birthdate target)) (removeQuality . removeSSID)
+ id_score = multFloats 200 (checkID (ids individual)
(national_id target)) removeSSID
+ name_score = multFloats 125 (checkNames (names individual)
(full_name target)) (removeQuality . removeSSID)
- when verbose $ print total_score
- compareScore (threshold_address distribution) address_score "Address"
- compareScore (threshold_date distribution) date_score "Date"
- compareScore (threshold_id distribution) id_score "ID"
- compareScore (threshold_name distribution) name_score "Name"
- compareScore (threshold_nationality distribution) nationality_score
"Nationality"
+ nationality_score = 50 * checkCountryCode (nationalities individual)
(nationality target)
- compareScore (threshold_confidence distribution) (confidence total_score)
"Total score"
+ total_score = checkPersons ssl target
+ when verbose $ print total_score
+ compareScore (threshold_address distribution) address_score
"Address"
+ compareScore (threshold_date distribution) date_score "Date"
+ compareScore (threshold_id distribution) id_score "ID"
+ compareScore (threshold_name distribution) name_score "Name"
+ compareScore (threshold_nationality distribution) nationality_score
"Nationality"
+
+ compareScore (threshold_confidence distribution) (confidence total_score)
"Total score"
+
+
+-- | Compare expected score to real score
compareScore :: Maybe Float -> Float -> String -> Assertion
compareScore maybe_threshold score title =
case maybe_threshold of
- Just pts -> assertBool (title ++ " should return >= " ++ show pts ++ "
points") (score >= pts)
- Nothing -> assertBool (title ++ " should return 0 points"
) (score == 0 )
+ Just pts -> assertBool (title ++ " should return >= " ++ show pts ++ "
points, but got " ++ show score ++ " instead") (score >= pts)
+ Nothing -> assertBool (title ++ " should return 0 points, but got "
++ show score ++ " instead") (score == 0 )
+
+-- | Test individuals
personTests :: Map Int Individual -> TestTree
-personTests map_ind = testGroup "Individuals"
- [ testGroup "Known Sanctioned"
--- testTarget False SSID target_SSID map_ind $
distribution ADDRESS DATE ID NAME NATIONALITY CONFIDENCE
---
MAX_SCORE 150 100 200 125 50 0.75
- [ testTarget False 5144 target_5144 map_ind $
distribution 125 100 0 125 0 0.9
- , testTarget False 5266 target_5266 map_ind $
distribution 0 0 0 125 0 0.5
- , testTarget False 49816 target_49816 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 43462 target_43462 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 43616 target_43616 map_ind $
distribution 0 0 0 125 0 0.75
- , testTarget False 43641 target_43641 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 43718 target_43718 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 43662 target_43662 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 43611 target_43611 map_ind $
distribution 0 0 0 125 0 0.75
- , testTarget False 29723 target_29723 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 6 target_6 map_ind $
distribution 0 100 0 125 0 0.75
- , testTarget False 38925 target_38925 map_ind $
distribution 100 0 0 0 0 0.75
- ]
- , testGroup "Public and imaginary figures"
- [ testTrusted False public_figure_1 map_ind "Hergé"
- , testTrusted False public_figure_2 map_ind "Bezos"
- , testTrusted False public_figure_3 map_ind
"Lincoln"
- , testTrusted False public_figure_4 map_ind
"Willem-Alexander"
- , testTrusted False public_figure_5 map_ind "Da
Vinci"
- , testTrusted True imaginary_figure_1 map_ind
"Smurf"
- , testTrusted False imaginary_figure_2 map_ind
"Donald"
- , testTrusted True imaginary_figure_3 map_ind
"Wonka"
- , testTrusted False imaginary_figure_4 map_ind
"Bilbo"
- , testTrusted True imaginary_figure_5 map_ind
"Batman"
- ]
- ]
+personTests sanction_list =
+ testGroup "Individuals"
+ [ testGroup "Known Sanctioned"
+ {- testTarget False SSID target_SSID sanction_list $ distribution
ADDRESS DATE ID NAME NATIONALITY CONFIDENCE
+ MAX_SCORE 150
100 200 125 50 0.75 -}
+ [ testTarget False 5144 target_5144 sanction_list $ distribution 125
100 0 125 0 0.9
+ , testTarget False 5266 target_5266 sanction_list $ distribution 0
0 0 125 0 0.5
+ , testTarget False 49816 target_49816 sanction_list $ distribution 0
100 0 125 0 0.75
+ , testTarget False 43462 target_43462 sanction_list $ distribution 0
100 0 125 0 0.75
+ , testTarget False 43616 target_43616 sanction_list $ distribution 0
0 0 125 0 0.75
+ , testTarget False 43641 target_43641 sanction_list $ distribution 0
100 0 125 0 0.75
+ , testTarget False 43718 target_43718 sanction_list $ distribution 0
100 0 125 0 0.75
+ , testTarget False 43662 target_43662 sanction_list $ distribution 0
100 0 125 0 0.75
+ , testTarget False 43611 target_43611 sanction_list $ distribution 0
0 0 125 0 0.75
+ , testTarget False 29723 target_29723 sanction_list $ distribution 0
100 0 125 0 0.75
+ , testTarget False 38925 target_38925 sanction_list $ distribution 100
0 0 0 0 0.75
+ ]
+
+ , testGroup "Fake target with XML file"
+ {- testFakeTarget False SSID target_SSID sanction_list $ distribution
ADDRESS DATE ID NAME NATIONALITY CONFIDENCE
+
150 100 200 125 50 0.75 -}
+ [ testFakeTarget False 6 target_6 sanction_list $ distribution 0
100 0 125 0 0.75
+ ]
+
+ , testGroup "Public and imaginary figures"
+ [ dontFindTarget False public_figure_1 sanction_list "Hergé"
+ , dontFindTarget False public_figure_2 sanction_list "Bezos"
+ , dontFindTarget False public_figure_3 sanction_list "Lincoln"
+ , dontFindTarget False public_figure_4 sanction_list
"Willem-Alexander"
+ , dontFindTarget False public_figure_5 sanction_list "Da Vinci"
+ , dontFindTarget False imaginary_figure_1 sanction_list "Smurf"
+ , dontFindTarget False imaginary_figure_2 sanction_list "Donald"
+ , dontFindTarget False imaginary_figure_3 sanction_list "Wonka"
+ , dontFindTarget False imaginary_figure_4 sanction_list "Bilbo"
+ , dontFindTarget False imaginary_figure_5 sanction_list "Batman"
+ ]
+ ]
where distribution addr date id' name nat conf = Distribution (toMaybe addr)
(toMaybe date) (toMaybe id') (toMaybe name) (toMaybe nat) (toMaybe conf)
toMaybe float = case float of 0 -> Nothing;
f -> Just f
-
--- target :: NaturalPerson
--- target = NaturalPerson
--- { full_name =
--- , last_name =
--- , birthdate =
--- , nationality =
--- , national_id =
--- , residential = GLS.Address { GLS.country =
--- , street_name =
--- , street_number =
--- , GLS.lines =
--- , building_name =
--- , building_number =
--- , zipcode =
--- , town_location =
--- , town_district =
--- , country_subdivision =
-
-target_5144 :: NaturalPerson
-target_5144 = NaturalPerson
- { full_name = "Dmitri Aliaksandravich Lukashenko"
- , last_name = "Lukashenko"
- , birthdate = YearMonthDay 1980 03 23
- , nationality = BY
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BY
- , street_name = "ул. Старовиленская"
- , street_number = "4"
- , GLS.lines = Just "President's Sports
Club"
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "220029"
- , town_location = Just "г. Минск"
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_5266 :: NaturalPerson
-target_5266 = NaturalPerson
- { full_name = "Natallia Alexeeuna Chatviartkova"
- , last_name = "Chatviartkova"
- , birthdate = YearMonthDay 1960 01 01 -- Made up birth date
- , nationality = RU
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = RU
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_49816 :: NaturalPerson
-target_49816 = NaturalPerson
- { full_name = "Vladimir Vladimirovich Putin"
- , last_name = "Putin"
- , birthdate = YearMonthDay 1952 10 07
- , nationality = RU
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = RU
- , street_name = "Инжирный переулок"
- , street_number = "1"
- , GLS.lines = Nothing
- , building_name = Just "Bocharov Ruchey"
- , building_number = Nothing
- , zipcode = "354008"
- , town_location = Just "Sochi"
- , town_district = Just "Town district of
Sochi"
- , country_subdivision = Just "Krasnodar Krai"
- }
- }
-
-target_43462 :: NaturalPerson
-target_43462 = NaturalPerson
- { full_name = "Aleksandr Petrovich Barsukov"
- , last_name = "Barsukov"
- , birthdate = YearMonthDay 1965 04 29
- , nationality = BY
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BY
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_43616 :: NaturalPerson
-target_43616 = NaturalPerson
- { full_name = "Oleg Anatolievich Chernyshev"
- , last_name = "Chernyshev"
- , birthdate = YearMonthDay 1985 07 27 -- Made up birth date
- , nationality = RU
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = RU
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_43641 :: NaturalPerson
-target_43641 = NaturalPerson
- { full_name = "Vadzim Dzmitryevich Ipatau"
- , last_name = "Ipatau"
- , birthdate = YearMonthDay 1964 10 30
- , nationality = BY
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BY
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_43718 :: NaturalPerson
-target_43718 = NaturalPerson
- { full_name = "Irina Aliaksandrauna Tselikavets"
- , last_name = "Tselikavets"
- , birthdate = YearMonthDay 1976 11 02
- , nationality = BY
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BY
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_43662 :: NaturalPerson
-target_43662 = NaturalPerson
- { full_name = "Olga Leonidovna Doroshenko"
- , last_name = "Doroshenko"
- , birthdate = YearMonthDay 1976 09 02 -- Made up birth month and day
- , nationality = BY
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BY
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_43611 :: NaturalPerson
-target_43611 = NaturalPerson
- { full_name = "Vladimir Viktorovich Kalach"
- , last_name = "Kalach"
- , birthdate = YearMonthDay 1960 12 22 -- Made up birth date
- , nationality = BY
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BY
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_29723 :: NaturalPerson
-target_29723 = NaturalPerson
- { full_name = "Равиль Закариевич Халиков"
- , last_name = "Халиков"
- , birthdate = YearMonthDay 1969 02 23
- , nationality = RU
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = RU
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-target_38925 :: NaturalPerson
-target_38925 = NaturalPerson
- { full_name = "Solomon Grundy"
- , last_name = "Grundy"
- , birthdate = YearMonthDay 1800 06 06
- , nationality = BE
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BE
- , street_name = "Kryzhizhanovskogo str."
- , street_number = "5A"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Just "64"
- , zipcode = "Non existent"
- , town_location = Just "Gresovskoe"
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
-
-public_figure_1 :: NaturalPerson
-public_figure_1 = NaturalPerson
- { full_name = "Georges Prosper Remi"
- , last_name = "Remi"
- , birthdate = YearMonthDay 1907 05 22
- , nationality = BE
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = BE
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Just "Etterbeek"
- , town_district = Just "Bruxelles"
- , country_subdivision = Just "Brussels"
- }
- }
-
-public_figure_2 :: NaturalPerson
-public_figure_2 = NaturalPerson
- { full_name = "Jeffrey Preston Bezos"
- , last_name = "Bezos"
- , birthdate = YearMonthDay 1964 01 12
- , nationality = US
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = US
- , street_name = "Negra Arroyo Lane"
- , street_number = "308"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "87112"
- , town_location = Just "Albuquerque"
- , town_district = Just "Bernalillo"
- , country_subdivision = Just "New Mexico"
- }
- }
-
-public_figure_3 :: NaturalPerson
-public_figure_3 = NaturalPerson
- { full_name = "Abraham Lincoln"
- , last_name = "Lincoln"
- , birthdate = YearMonthDay 1809 02 12
- , nationality = US
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = US
- , street_name = "Lincoln Farm Road"
- , street_number = "2995"
- , GLS.lines = Nothing
- , building_name = Just "Abraham Lincoln
Birthplace"
- , building_number = Nothing
- , zipcode = "42748"
- , town_location = Just "Hodgenville"
- , town_district = Just "LaRue"
- , country_subdivision = Just "Kentucky"
- }
- }
-
-public_figure_4 :: NaturalPerson
-public_figure_4 = NaturalPerson
- { full_name = "Willem-Alexander Claus George Ferdinand van Oranje-Nassau"
- , last_name = "van Oranje-Nassau"
- , birthdate = YearMonthDay 1980 04 30
- , nationality = NL
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = NL
- , street_name = "'s-Gravenhaagse Bos"
- , street_number = "10"
- , GLS.lines = Nothing
- , building_name = Just "Huis ten Bosch"
- , building_number = Nothing
- , zipcode = "2594BD"
- , town_location = Just "'s-Gravenhage"
- , town_district = Nothing
- , country_subdivision = Just "Zuid-Holland"
- }
- }
-
-public_figure_5 :: NaturalPerson
-public_figure_5 = NaturalPerson
- { full_name = "Leonardo di ser Piero da Vinci"
- , last_name = "da Vinci"
- , birthdate = YearMonthDay 1452 04 15
- , nationality = IT
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = IT
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "2594BD"
- , town_location = Just "Vinci"
- , town_district = Just "Florence"
- , country_subdivision = Just "Tuscany"
- }
- }
-
-imaginary_figure_1 :: NaturalPerson
-imaginary_figure_1 = NaturalPerson
- { full_name = "Papa Smurf"
- , last_name = "Smurf"
- , birthdate = YearMonthDay 1958 10 23
- , nationality = FR
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = FR
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Just "Smurf Village"
- }
- }
-
-imaginary_figure_2 :: NaturalPerson
-imaginary_figure_2 = NaturalPerson
- { full_name = "Donald Fauntleroy Duck"
- , last_name = "Duck"
- , birthdate = YearMonthDay 1934 06 09
- , nationality = US
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = US
- , street_name = "South Harbor Boulevard"
- , street_number = "1313"
- , GLS.lines = Nothing
- , building_name = Just "Disneyland"
- , building_number = Nothing
- , zipcode = "92802"
- , town_location = Just "Anaheim"
- , town_district = Just "Orange"
- , country_subdivision = Just "California"
- }
- }
-
-imaginary_figure_3 :: NaturalPerson
-imaginary_figure_3 = NaturalPerson
- { full_name = "Willy Wonka"
- , last_name = "Wonka"
- , birthdate = YearMonthDay 1964 01 17
- , nationality = GB
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = GB
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Just "Cardiff"
- , town_district = Nothing
- , country_subdivision = Just "Wales"
- }
- }
-
-imaginary_figure_4 :: NaturalPerson
-imaginary_figure_4 = NaturalPerson
- { full_name = "Bilbo Baggins"
- , last_name = "Baggins"
- , birthdate = YearMonthDay 1937 09 21
- , nationality = GB
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = GB
- , street_name = "Bagshot Row"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Just "Bag End"
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Just "Hobbiton"
- , town_district = Just "Westfarthing"
- , country_subdivision = Just "The Shire"
- }
- }
-
-imaginary_figure_5 :: NaturalPerson
-imaginary_figure_5 = NaturalPerson
- { full_name = "Bruce Wayne"
- , last_name = "Wayne"
- , birthdate = YearMonthDay 1972 02 19
- , nationality = US
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = US
- , street_name = "Park Drive"
- , street_number = "224"
- , GLS.lines = Nothing
- , building_name = Just "Wayne Manor"
- , building_number = Nothing
- , zipcode = "19007"
- , town_location = Just "Bristol Township"
- , town_district = Just "Bucks"
- , country_subdivision = Just "Pennsylvania"
- }
- }
-
-target_6 :: NaturalPerson
-target_6 = NaturalPerson
- { full_name = "Bowser"
- , last_name = "Bowser"
- , birthdate = YearMonthDay 1985 09 13
- , nationality = JP
- , national_id = "012345ABCDEF"
- , residential = GLS.Address { GLS.country = JP
- , street_name = "Non existent"
- , street_number = "Non existent"
- , GLS.lines = Nothing
- , building_name = Nothing
- , building_number = Nothing
- , zipcode = "Non existent"
- , town_location = Nothing
- , town_district = Nothing
- , country_subdivision = Nothing
- }
- }
diff --git a/test/Tests/Targets/Fake.hs b/test/Tests/Targets/Fake.hs
new file mode 100644
index 0000000..f5dd731
--- /dev/null
+++ b/test/Tests/Targets/Fake.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Tests.Targets.Fake
+ ( target_6
+ , public_figure_1
+ , public_figure_2
+ , public_figure_3
+ , public_figure_4
+ , public_figure_5
+ , imaginary_figure_1
+ , imaginary_figure_2
+ , imaginary_figure_3
+ , imaginary_figure_4
+ , imaginary_figure_5
+ ) where
+
+import Data.CountryCodes
+import Data.Time.Calendar
+
+import KYC.GLS.Type as GLS
+
+
+-- target :: NaturalPerson
+-- target = NaturalPerson
+-- { full_name =
+-- , last_name =
+-- , birthdate =
+-- , nationality =
+-- , national_id =
+-- , residential = GLS.Address { GLS.country =
+-- , street_name =
+-- , street_number =
+-- , GLS.lines =
+-- , building_name =
+-- , building_number =
+-- , zipcode =
+-- , town_location =
+-- , town_district =
+-- , country_subdivision =
+
+public_figure_1 :: NaturalPerson
+public_figure_1 = NaturalPerson
+ { full_name = "Georges Prosper Remi"
+ , last_name = "Remi"
+ , birthdate = YearMonthDay 1907 05 22
+ , nationality = BE
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BE
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Just "Etterbeek"
+ , town_district = Just "Bruxelles"
+ , country_subdivision = Just "Brussels"
+ }
+ }
+
+public_figure_2 :: NaturalPerson
+public_figure_2 = NaturalPerson
+ { full_name = "Jeffrey Preston Bezos"
+ , last_name = "Bezos"
+ , birthdate = YearMonthDay 1964 01 12
+ , nationality = US
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = US
+ , street_name = "Negra Arroyo Lane"
+ , street_number = "308"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "87112"
+ , town_location = Just "Albuquerque"
+ , town_district = Just "Bernalillo"
+ , country_subdivision = Just "New Mexico"
+ }
+ }
+
+public_figure_3 :: NaturalPerson
+public_figure_3 = NaturalPerson
+ { full_name = "Abraham Lincoln"
+ , last_name = "Lincoln"
+ , birthdate = YearMonthDay 1809 02 12
+ , nationality = US
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = US
+ , street_name = "Lincoln Farm Road"
+ , street_number = "2995"
+ , GLS.lines = Nothing
+ , building_name = Just "Abraham Lincoln
Birthplace"
+ , building_number = Nothing
+ , zipcode = "42748"
+ , town_location = Just "Hodgenville"
+ , town_district = Just "LaRue"
+ , country_subdivision = Just "Kentucky"
+ }
+ }
+
+public_figure_4 :: NaturalPerson
+public_figure_4 = NaturalPerson
+ { full_name = "Willem-Alexander Claus George Ferdinand van Oranje-Nassau"
+ , last_name = "van Oranje-Nassau"
+ , birthdate = YearMonthDay 1980 04 30
+ , nationality = NL
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = NL
+ , street_name = "'s-Gravenhaagse Bos"
+ , street_number = "10"
+ , GLS.lines = Nothing
+ , building_name = Just "Huis ten Bosch"
+ , building_number = Nothing
+ , zipcode = "2594BD"
+ , town_location = Just "'s-Gravenhage"
+ , town_district = Nothing
+ , country_subdivision = Just "Zuid-Holland"
+ }
+ }
+
+public_figure_5 :: NaturalPerson
+public_figure_5 = NaturalPerson
+ { full_name = "Leonardo di ser Piero da Vinci"
+ , last_name = "da Vinci"
+ , birthdate = YearMonthDay 1452 04 15
+ , nationality = IT
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = IT
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "2594BD"
+ , town_location = Just "Vinci"
+ , town_district = Just "Florence"
+ , country_subdivision = Just "Tuscany"
+ }
+ }
+
+imaginary_figure_1 :: NaturalPerson
+imaginary_figure_1 = NaturalPerson
+ { full_name = "Papa Smurf"
+ , last_name = "Smurf"
+ , birthdate = YearMonthDay 1958 10 23
+ , nationality = FR
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = FR
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Just "Smurf Village"
+ }
+ }
+
+imaginary_figure_2 :: NaturalPerson
+imaginary_figure_2 = NaturalPerson
+ { full_name = "Donald Fauntleroy Duck"
+ , last_name = "Duck"
+ , birthdate = YearMonthDay 1934 06 09
+ , nationality = US
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = US
+ , street_name = "South Harbor Boulevard"
+ , street_number = "1313"
+ , GLS.lines = Nothing
+ , building_name = Just "Disneyland"
+ , building_number = Nothing
+ , zipcode = "92802"
+ , town_location = Just "Anaheim"
+ , town_district = Just "Orange"
+ , country_subdivision = Just "California"
+ }
+ }
+
+imaginary_figure_3 :: NaturalPerson
+imaginary_figure_3 = NaturalPerson
+ { full_name = "Willy Wonka"
+ , last_name = "Wonka"
+ , birthdate = YearMonthDay 1964 01 17
+ , nationality = GB
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = GB
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Just "Cardiff"
+ , town_district = Nothing
+ , country_subdivision = Just "Wales"
+ }
+ }
+
+imaginary_figure_4 :: NaturalPerson
+imaginary_figure_4 = NaturalPerson
+ { full_name = "Bilbo Baggins"
+ , last_name = "Baggins"
+ , birthdate = YearMonthDay 1937 09 21
+ , nationality = GB
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = GB
+ , street_name = "Bagshot Row"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Just "Bag End"
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Just "Hobbiton"
+ , town_district = Just "Westfarthing"
+ , country_subdivision = Just "The Shire"
+ }
+ }
+
+imaginary_figure_5 :: NaturalPerson
+imaginary_figure_5 = NaturalPerson
+ { full_name = "Bruce Wayne"
+ , last_name = "Wayne"
+ , birthdate = YearMonthDay 1972 02 19
+ , nationality = US
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = US
+ , street_name = "Park Drive"
+ , street_number = "224"
+ , GLS.lines = Nothing
+ , building_name = Just "Wayne Manor"
+ , building_number = Nothing
+ , zipcode = "19007"
+ , town_location = Just "Bristol Township"
+ , town_district = Just "Bucks"
+ , country_subdivision = Just "Pennsylvania"
+ }
+ }
+
+target_6 :: NaturalPerson
+target_6 = NaturalPerson
+ { full_name = "Bowser"
+ , last_name = "Bowser"
+ , birthdate = YearMonthDay 1985 09 13
+ , nationality = JP
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = JP
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
diff --git a/test/Tests/Targets/Real.hs b/test/Tests/Targets/Real.hs
new file mode 100644
index 0000000..b0e0da1
--- /dev/null
+++ b/test/Tests/Targets/Real.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Tests.Targets.Real
+ ( target_5144
+ , target_5266
+ , target_49816
+ , target_43462
+ , target_43616
+ , target_43641
+ , target_43718
+ , target_43662
+ , target_43611
+ , target_29723
+ , target_38925
+ ) where
+
+import Data.CountryCodes
+import Data.Time.Calendar
+
+import KYC.GLS.Type as GLS
+
+
+-- target :: NaturalPerson
+-- target = NaturalPerson
+-- { full_name =
+-- , last_name =
+-- , birthdate =
+-- , nationality =
+-- , national_id =
+-- , residential = GLS.Address { GLS.country =
+-- , street_name =
+-- , street_number =
+-- , GLS.lines =
+-- , building_name =
+-- , building_number =
+-- , zipcode =
+-- , town_location =
+-- , town_district =
+-- , country_subdivision =
+
+target_5144 :: NaturalPerson
+target_5144 = NaturalPerson
+ { full_name = "Dmitri Aliaksandravich Lukashenko"
+ , last_name = "Lukashenko"
+ , birthdate = YearMonthDay 1980 03 23
+ , nationality = BY
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BY
+ , street_name = "ул. Старовиленская"
+ , street_number = "4"
+ , GLS.lines = Just "President's Sports
Club"
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "220029"
+ , town_location = Just "г. Минск"
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_5266 :: NaturalPerson
+target_5266 = NaturalPerson
+ { full_name = "Natallia Alexeeuna Chatviartkova"
+ , last_name = "Chatviartkova"
+ , birthdate = YearMonthDay 1960 01 01 -- Made up birth date
+ , nationality = RU
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = RU
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_49816 :: NaturalPerson
+target_49816 = NaturalPerson
+ { full_name = "Vladimir Vladimirovich Putin"
+ , last_name = "Putin"
+ , birthdate = YearMonthDay 1952 10 07
+ , nationality = RU
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = RU
+ , street_name = "Инжирный переулок"
+ , street_number = "1"
+ , GLS.lines = Nothing
+ , building_name = Just "Bocharov Ruchey"
+ , building_number = Nothing
+ , zipcode = "354008"
+ , town_location = Just "Sochi"
+ , town_district = Just "Town district of
Sochi"
+ , country_subdivision = Just "Krasnodar Krai"
+ }
+ }
+
+target_43462 :: NaturalPerson
+target_43462 = NaturalPerson
+ { full_name = "Aleksandr Petrovich Barsukov"
+ , last_name = "Barsukov"
+ , birthdate = YearMonthDay 1965 04 29
+ , nationality = BY
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BY
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_43616 :: NaturalPerson
+target_43616 = NaturalPerson
+ { full_name = "Oleg Anatolievich Chernyshev"
+ , last_name = "Chernyshev"
+ , birthdate = YearMonthDay 1985 07 27 -- Made up birth date
+ , nationality = RU
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = RU
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_43641 :: NaturalPerson
+target_43641 = NaturalPerson
+ { full_name = "Vadzim Dzmitryevich Ipatau"
+ , last_name = "Ipatau"
+ , birthdate = YearMonthDay 1964 10 30
+ , nationality = BY
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BY
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_43718 :: NaturalPerson
+target_43718 = NaturalPerson
+ { full_name = "Irina Aliaksandrauna Tselikavets"
+ , last_name = "Tselikavets"
+ , birthdate = YearMonthDay 1976 11 02
+ , nationality = BY
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BY
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_43662 :: NaturalPerson
+target_43662 = NaturalPerson
+ { full_name = "Olga Leonidovna Doroshenko"
+ , last_name = "Doroshenko"
+ , birthdate = YearMonthDay 1976 09 02 -- Made up birth month and day
+ , nationality = BY
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BY
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_43611 :: NaturalPerson
+target_43611 = NaturalPerson
+ { full_name = "Vladimir Viktorovich Kalach"
+ , last_name = "Kalach"
+ , birthdate = YearMonthDay 1960 12 22 -- Made up birth date
+ , nationality = BY
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BY
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_29723 :: NaturalPerson
+target_29723 = NaturalPerson
+ { full_name = "Равиль Закариевич Халиков"
+ , last_name = "Халиков"
+ , birthdate = YearMonthDay 1969 02 23
+ , nationality = RU
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = RU
+ , street_name = "Non existent"
+ , street_number = "Non existent"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Nothing
+ , zipcode = "Non existent"
+ , town_location = Nothing
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
+
+target_38925 :: NaturalPerson
+target_38925 = NaturalPerson
+ { full_name = "Solomon Grundy"
+ , last_name = "Grundy"
+ , birthdate = YearMonthDay 1800 06 06
+ , nationality = BE
+ , national_id = "012345ABCDEF"
+ , residential = GLS.Address { GLS.country = BE
+ , street_name = "Kryzhizhanovskogo str."
+ , street_number = "5A"
+ , GLS.lines = Nothing
+ , building_name = Nothing
+ , building_number = Just "64"
+ , zipcode = "Non existent"
+ , town_location = Just "Gresovskoe"
+ , town_district = Nothing
+ , country_subdivision = Nothing
+ }
+ }
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [robocop] 06/37: Add more tests, (continued)
- [robocop] 06/37: Add more tests, Admin, 2025/06/05
- [robocop] 05/37: Add tests, Admin, 2025/06/05
- [robocop] 02/37: Initialise repository, Admin, 2025/06/05
- [robocop] 04/37: More tests, update config & licenses, Admin, 2025/06/05
- [robocop] 01/37: init w/ instruction files, Admin, 2025/06/05
- [robocop] 10/37: Update testfunctions, Admin, 2025/06/05
- [robocop] 09/37: Improve address matching, Admin, 2025/06/05
- [robocop] 11/37: Re-order tests, Admin, 2025/06/05
- [robocop] 08/37: Add more tests, Admin, 2025/06/05
- [robocop] 12/37: Add new tests, Admin, 2025/06/05
- [robocop] 07/37: Improve checks + tests,
Admin <=