diff --git a/src/Mindee/Parsing/Fr/IdCard/IdCardV1Prediction.cs b/src/Mindee/Parsing/Fr/IdCard/IdCardV1Prediction.cs new file mode 100644 index 00000000..88dc0b7c --- /dev/null +++ b/src/Mindee/Parsing/Fr/IdCard/IdCardV1Prediction.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using Mindee.Parsing.Common; + +namespace Mindee.Parsing.Fr.IdCard +{ + /// + /// The french id card model for the v1. + /// + [Endpoint("idcard_fr", "1")] + public sealed class IdCardV1Prediction + { + /// + /// The authority which has issued the card. + /// + [JsonPropertyName("authority")] + public StringField Authority { get; set; } + + /// + /// The birth date of the person. + /// + [JsonPropertyName("birth_date")] + public StringField BirthDate { get; set; } + + /// + /// The birth place of the person. + /// + [JsonPropertyName("birth_place")] + public StringField BirthPlace { get; set; } + + /// + /// The expiry date of the card. + /// + [JsonPropertyName("expiry_date")] + public StringField ExpiryDate { get; set; } + + /// + /// The gender of the person. + /// + [JsonPropertyName("gender")] + public StringField Gender { get; set; } + + /// + /// The list of the names of the person. + /// + [JsonPropertyName("given_names")] + public List GivenNames { get; set; } + + /// + /// The id number of the card. + /// + [JsonPropertyName("id_number")] + public StringField IdNumber { get; set; } + + /// + /// The first mrz value. + /// + [JsonPropertyName("mrz1")] + public StringField Mrz1 { get; set; } + + /// + /// The second mrz value. + /// + [JsonPropertyName("mrz2")] + public StringField Mrz2 { get; set; } + + /// + /// The surname of the person. + /// + [JsonPropertyName("surname")] + public StringField Surname { get; set; } + + /// + /// A prettier reprensentation of the current model values. + /// + public override string ToString() + { + StringBuilder result = new StringBuilder("----- FR ID Card V1 -----\n"); + result.Append($"Authority: {Authority.Value}\n"); + result.Append($"Given names: {string.Join(" ", GivenNames.Select(gn => gn.Value))}\n"); + result.Append($"Surname: {Surname.Value}\n"); + result.Append($"Gender: {Gender.Value}\n"); + result.Append($"ID Number: {IdNumber.Value}\n"); + result.Append($"Birth date: {BirthDate.Value}\n"); + result.Append($"Birth place: {BirthPlace.Value}\n"); + result.Append($"Expiry date: {ExpiryDate.Value}\n"); + result.Append($"MRZ 1: {Mrz1.Value}\n"); + result.Append($"MRZ 2: {Mrz2.Value}\n"); + + result.Append("----------------------\n"); + + return SummaryHelper.Clean(result.ToString()); + } + } +} diff --git a/tests/Mindee.UnitTests/Parsing/Fr/IdCard/IdCardV1Test.cs b/tests/Mindee.UnitTests/Parsing/Fr/IdCard/IdCardV1Test.cs new file mode 100644 index 00000000..9d388788 --- /dev/null +++ b/tests/Mindee.UnitTests/Parsing/Fr/IdCard/IdCardV1Test.cs @@ -0,0 +1,54 @@ +using Mindee.Parsing; +using Mindee.Parsing.Fr.IdCard; + +namespace Mindee.UnitTests.Parsing.Fr.IdCard +{ + [Trait("Category", "FR Id Card V1")] + public class IdCardV1Test + { + [Fact] + public async Task Predict_CheckSummary() + { + var mindeeAPi = GetMindeeApiForFrIdCard(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/fr/id_card/response_v1/doc_to_string.txt"); + + Assert.Equal( + CleaningResult(expected), + prediction.Inference.Prediction.ToString()); + } + + [Fact] + public async Task Predict_CheckSummary_WithMultiplePages() + { + var mindeeAPi = GetMindeeApiForFrIdCard(); + var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter()); + + var expected = File.ReadAllText("Resources/fr/id_card/response_v1/page0_to_string.txt"); + + Assert.Equal( + CleaningResult(expected), + prediction.Inference.Prediction.ToString()); + } + + private string CleaningResult(string expectedSummary) + { + var indexFilename = expectedSummary.IndexOf("Filename"); + var indexFilenameEOL = expectedSummary.IndexOf("\n", indexFilename); + string cleanedSummary = expectedSummary.Remove(indexFilename, indexFilenameEOL - indexFilename + 1); + + // must be deleted when generic wil be place on the inference node + var indexDocumentSide = cleanedSummary.IndexOf("Document side"); + var indexDocumentSideEOL = cleanedSummary.IndexOf("\n", indexDocumentSide); + cleanedSummary = cleanedSummary.Remove(indexDocumentSide, indexDocumentSideEOL - indexDocumentSide + 1); + + return cleanedSummary; + } + + private MindeeApi GetMindeeApiForFrIdCard(string fileName = "Resources/fr/id_card/response_v1/complete.json") + { + return ParsingTestBase.GetMindeeApi(fileName); + } + } +}