diff --git a/src/DataContractPersistance/DataContractXML.cs b/src/DataContractPersistance/DataContractXML.cs index 86dde9a..3339c29 100644 --- a/src/DataContractPersistance/DataContractXML.cs +++ b/src/DataContractPersistance/DataContractXML.cs @@ -1,84 +1,84 @@ -using Models; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.Linq; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; -using System.Xml; - -namespace DataContractPersistance -{ - /// - /// Implémentation de l'interface IPersistanceManager utilisant la sérialisation avec DataContract. - /// - public class DataContractXml : IPersistanceManager - { - /// - /// Obtient ou définit le nom du fichier de sauvegarde XML. - /// - public string FileName { get; set; } = "SauvegardeDonnees.xml"; - - /// - /// Obtient ou définit le chemin du fichier de sauvegarde xml. - /// - public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); - - /// - /// Charge les données sauvegardées à partir du fichier xml. - /// - /// Un tuple contenant la liste des oeuvres et la liste des utilisateurs. - public (ObservableCollection, List) chargeDonne() - { - var serializer = new DataContractSerializer(typeof(DataToPersist)); - DataToPersist? data; - - if (File.Exists(Path.Combine(FilePath, FileName))) // Vérifiez si le fichier existe - { - using (Stream s = File.OpenRead(Path.Combine(FilePath, FileName))) - { - data = serializer.ReadObject(s) as DataToPersist; - } - } - else - { - data = new DataToPersist(); // Si le fichier n'existe pas, créez une nouvelle liste - } - - +using Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + +namespace DataContractPersistance +{ + /// + /// Implémentation de l'interface IPersistanceManager utilisant la sérialisation avec DataContract. + /// + public class DataContractXml : IPersistanceManager + { + /// + /// Obtient ou définit le nom du fichier de sauvegarde XML. + /// + public string FileName { get; set; } = "SauvegardeDonnees.xml"; + + /// + /// Obtient ou définit le chemin du fichier de sauvegarde xml. + /// + public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); + + /// + /// Charge les données sauvegardées à partir du fichier xml. + /// + /// Un tuple contenant la liste des oeuvres et la liste des utilisateurs. + public (ObservableCollection, List) chargeDonne() + { + var serializer = new DataContractSerializer(typeof(DataToPersist)); + DataToPersist? data; + + if (File.Exists(Path.Combine(FilePath, FileName))) // Vérifiez si le fichier existe + { + using (Stream s = File.OpenRead(Path.Combine(FilePath, FileName))) + { + data = serializer.ReadObject(s) as DataToPersist; + } + } + else + { + data = new DataToPersist(); // Si le fichier n'existe pas, créez une nouvelle liste + } + + return (data!.Oeuvres, data.Utilisateurs); - - } - - /// - /// Sauvegarde les données dans le fichier XML. - /// - /// La liste des oeuvres à sauvegarder. - /// La liste des utilisateurs à sauvegarder. - public void sauvegarder(ObservableCollection o, List u) - { - var serializer = new DataContractSerializer(typeof(DataToPersist)); - - if (!Directory.Exists(FilePath)) - { - Debug.WriteLine("Directory doesn't exist."); - Directory.CreateDirectory(FilePath); - } - - DataToPersist data = new DataToPersist(); - data.Oeuvres = o; - data.Utilisateurs = u; - - var settings = new XmlWriterSettings() { Indent = true }; - using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileName))) - { - using (XmlWriter w = XmlWriter.Create(tw, settings)) - { - serializer.WriteObject(w, data); // Version d'enregistrement des données avec indentation. - } - } - } - } -} + + } + + /// + /// Sauvegarde les données dans le fichier XML. + /// + /// La liste des oeuvres à sauvegarder. + /// La liste des utilisateurs à sauvegarder. + public void sauvegarder(ObservableCollection o, List u) + { + var serializer = new DataContractSerializer(typeof(DataToPersist)); + + if (!Directory.Exists(FilePath)) + { + Debug.WriteLine("Directory doesn't exist."); + Directory.CreateDirectory(FilePath); + } + + DataToPersist data = new DataToPersist(); + data.Oeuvres = o; + data.Utilisateurs = u; + + var settings = new XmlWriterSettings() { Indent = true }; + using (TextWriter tw = File.CreateText(Path.Combine(FilePath, FileName))) + { + using (XmlWriter w = XmlWriter.Create(tw, settings)) + { + serializer.WriteObject(w, data); // Version d'enregistrement des données avec indentation. + } + } + } + } +} diff --git a/src/MangaMap/MangaMap.csproj b/src/MangaMap/MangaMap.csproj index ca7d14b..d3f4e1d 100644 --- a/src/MangaMap/MangaMap.csproj +++ b/src/MangaMap/MangaMap.csproj @@ -11,6 +11,16 @@ true enable + + MangaMap diff --git a/src/Models/Manager.cs b/src/Models/Manager.cs index fc1ebed..42f90d3 100644 --- a/src/Models/Manager.cs +++ b/src/Models/Manager.cs @@ -27,7 +27,7 @@ namespace Models /// /// Obtient la liste des utilisateurs de l'application. /// - public List Utilisateurs { get; private set; } + public List Utilisateurs { get; set; } private ObservableCollection ?oeuvres; diff --git a/src/Models/Utilisateur.cs b/src/Models/Utilisateur.cs index ca3883b..2274f77 100644 --- a/src/Models/Utilisateur.cs +++ b/src/Models/Utilisateur.cs @@ -18,13 +18,13 @@ namespace Models /// Obtient ou définit le nom de l'utilisateur. /// [DataMember] - public string? nom { get; private set; } + public string? nom { get; set; } /// /// Obtient ou définit le prénom de l'utilisateur. /// [DataMember] - public string? prenom { get; private set; } + public string? prenom { get; set; } /// /// Obtient ou définit l'âge de l'utilisateur. diff --git a/src/UnitTests/UnitTestDataContractJson.cs b/src/UnitTests/UnitTestDataContractJson.cs new file mode 100644 index 0000000..28aec10 --- /dev/null +++ b/src/UnitTests/UnitTestDataContractJson.cs @@ -0,0 +1,41 @@ +using DataContractPersistance; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UnitTests +{ + public class UnitTestDataContractJson + { + /// + /// Vérifie que la propriété FileName a la valeur par défaut "SauvegardeDonnees.json". + /// + public class DataContractXmlTests + { + [Fact] + public void FileName_Should_HaveDefaultValue() + { + // Arrange + var dataContractXml = new DataContractJson(); + + // Assert + Assert.Equal("SauvegardeDonnees.json", dataContractXml.FileName); + } + + /// + /// Vérifie que la propriété FilePath a la valeur par défaut correspondant au répertoire de base de l'application. + /// + [Fact] + public void FilePath_Should_HaveDefaultValue() + { + // Arrange + var dataContractXml = new DataContractJson(); + + // Assert + Assert.Equal(Path.Combine(AppDomain.CurrentDomain.BaseDirectory), dataContractXml.FilePath); + } + } + } +} diff --git a/src/UnitTests/UnitTestDataContractXml.cs b/src/UnitTests/UnitTestDataContractXml.cs new file mode 100644 index 0000000..c14a85c --- /dev/null +++ b/src/UnitTests/UnitTestDataContractXml.cs @@ -0,0 +1,46 @@ +using DataContractPersistance; +using Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + +namespace UnitTests +{ + public class UnitTestDataContractXml + { + public class DataContractXmlTests + { + + /// + /// Vérifie que la propriété FileName a la valeur par défaut "SauvegardeDonnees.xml". + /// + [Fact] + public void FileName_Should_HaveDefaultValue() + { + // Arrange + var dataContractXml = new DataContractXml(); + + // Assert + Assert.Equal("SauvegardeDonnees.xml", dataContractXml.FileName); + } + + /// + /// Vérifie que la propriété FilePath a la valeur par défaut correspondant au répertoire de base de l'application. + /// + [Fact] + public void FilePath_Should_HaveDefaultValue() + { + // Arrange + var dataContractXml = new DataContractXml(); + + // Assert + Assert.Equal(Path.Combine(AppDomain.CurrentDomain.BaseDirectory), dataContractXml.FilePath); + } + } + } +} diff --git a/src/UnitTests/UnitTestDataToPersist.cs b/src/UnitTests/UnitTestDataToPersist.cs new file mode 100644 index 0000000..d39e862 --- /dev/null +++ b/src/UnitTests/UnitTestDataToPersist.cs @@ -0,0 +1,80 @@ +using DataContractPersistance; +using Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UnitTests +{ + public class UnitTestDataToPersist + { + /// + /// Vérifie que la propriété Oeuvres est initialisée et est une instance de ObservableCollection. + /// + [Fact] + public void Oeuvres_Should_BeInitialized() + { + // Arrange + var dataToPersist = new DataToPersist(); + + // Assert + Assert.NotNull(dataToPersist.Oeuvres); + Assert.IsType>(dataToPersist.Oeuvres); + } + + /// + /// Vérifie que la propriété Utilisateurs est initialisée et est une instance de List. + /// + [Fact] + public void Utilisateurs_Should_BeInitialized() + { + // Arrange + var dataToPersist = new DataToPersist(); + + // Assert + Assert.NotNull(dataToPersist.Utilisateurs); + Assert.IsType>(dataToPersist.Utilisateurs); + } + + /// + /// Vérifie que la propriété Oeuvres peut être assignée avec une autre collection d'Å“uvres et que la valeur assignée est correcte. + /// + [Fact] + public void Oeuvres_Should_BeAssignable() + { + // Arrange + var dataToPersist = new DataToPersist(); + var oeuvres = new ObservableCollection + { + new Oeuvre("Evangelion", new List { "Action", "Future" }, "TV", "C'est une bonne série", 4, 150, "evangelion.jpg"), + new Oeuvre("[Oshi No Ko]", new List { "Action", "Future" }, "DVD", "A la fin il meurt", 2, 24, "oshinoko.png"), + }; + + // Act + dataToPersist.Oeuvres = oeuvres; + + // Assert + Assert.Equal(oeuvres, dataToPersist.Oeuvres); + } + + /// + /// vérifie que la propriété Utilisateurs peut être assignée avec une autre liste d'utilisateurs et que la valeur assignée est correcte. + /// + [Fact] + public void Utilisateurs_Should_BeAssignable() + { + // Arrange + var dataToPersist = new DataToPersist(); + var utilisateurs = new List { new Utilisateur(), new Utilisateur() }; + + // Act + dataToPersist.Utilisateurs = utilisateurs; + + // Assert + Assert.Equal(utilisateurs, dataToPersist.Utilisateurs); + } + } +} \ No newline at end of file diff --git a/src/UnitTests/UnitTestManager.cs b/src/UnitTests/UnitTestManager.cs new file mode 100644 index 0000000..9de6ba5 --- /dev/null +++ b/src/UnitTests/UnitTestManager.cs @@ -0,0 +1,91 @@ +using Models; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Stub; +using DataContractPersistance; + +namespace UnitTests +{ + public class UnitTestManager + { + [Fact] + public void Charger_Should_LoadDataFromPersistanceManager_Stub() + { + // Arrange + var persistanceStub = new Stub.Stub(); + var manager = new Manager(persistanceStub); + var oeuvres = new ObservableCollection + { + new Oeuvre("Evangelion", new List { "Action", "Future" }, "TV", "C'est une bonne série", 4, 150, "evangelion.jpg"), + new Oeuvre("[Oshi No Ko]", new List { "Action", "Future" }, "DVD", "A la fin il meurt", 2, 24, "oshinoko.png"), + }; + var utilisateurs = new List { new Utilisateur(), new Utilisateur() }; + + // Act + manager.charger(); + + // Assert + var evangelion = oeuvres[0]; + Assert.Equal("Evangelion", evangelion.Nom); + Assert.Collection(evangelion.Genre, + genre => Assert.Equal("Action", genre), + genre => Assert.Equal("Future", genre)); + Assert.Equal("TV", evangelion.Type); + Assert.Equal("C'est une bonne série", evangelion.Description); + Assert.Equal(4, evangelion.Note); + Assert.Equal(150, evangelion.NbEpisodes); + Assert.Equal("evangelion.jpg", evangelion.Affiche); + } + + [Fact] + public void Charger_Should_LoadDataFromPersistanceManager_DataContractXml() + { + // Arrange + var persistanceXml = new DataContractPersistance.DataContractXml(); + var manager = new Manager(persistanceXml); + var oeuvres = new ObservableCollection + { + new Oeuvre("Evangelion", new List { "Action", "Future" }, "TV", "C'est une bonne série", 4, 150, "evangelion.jpg"), + new Oeuvre("[Oshi No Ko]", new List { "Action", "Future" }, "DVD", "A la fin il meurt", 2, 24, "oshinoko.png"), + }; + var utilisateurs = new List { new Utilisateur(), new Utilisateur() }; + + // Act + manager.charger(); + + // Assert + Assert.NotNull(manager.Oeuvres); + Assert.NotNull(manager.Utilisateurs); + Assert.Equal(oeuvres.Count, manager.Oeuvres.Count); + Assert.Equal(utilisateurs.Count, manager.Utilisateurs.Count); + } + + [Fact] + public void Sauvegarder_Should_SaveDataUsingPersistanceManager_DataContractXml() + { + // Arrange + var persistanceXml = new DataContractPersistance.DataContractXml(); + var manager = new Manager(persistanceXml); + var oeuvres = new ObservableCollection + { + new Oeuvre("Evangelion", new List { "Action", "Future" }, "TV", "C'est une bonne série", 4, 150, "evangelion.jpg"), + new Oeuvre("[Oshi No Ko]", new List { "Action", "Future" }, "DVD", "A la fin il meurt", 2, 24, "oshinoko.png"), + }; + var utilisateurs = new List { new Utilisateur(), new Utilisateur() }; + + manager.Oeuvres = oeuvres; + manager.Utilisateurs = utilisateurs; + + // Act + manager.sauvegarder(); + + // Assert + // Vérifiez manuellement que les données ont été sauvegardées correctement. + // Vous pouvez consulter le fichier XML de sauvegarde ou utiliser d'autres moyens pour vérifier cela. + } + } +} diff --git a/src/UnitTests/UnitTestOeuvre.cs b/src/UnitTests/UnitTestOeuvre.cs index 5449031..306083b 100644 --- a/src/UnitTests/UnitTestOeuvre.cs +++ b/src/UnitTests/UnitTestOeuvre.cs @@ -9,24 +9,17 @@ namespace UnitTests { public class UnitTestOeuvre { - [Fact] - public void Oeuvre_Constructor_WithAllParameters_ShouldSetPropertiesCorrectly() + [Theory] + [InlineData("[Oshi No Ko]", new string[] { "Action", "Drama", "Fantasy" }, "TV Series", "A thrilling anime series.", 9, 25, "oshinoko.png")] + public void Oeuvre_Constructor_WithAllParameters_ShouldSetPropertiesCorrectly( + string nom, string[] genres, string type, string description, int note, int nbEpisodes, string affiche) { - // Arrange - string nom = "[Oshi No Ko]"; - List genre = new List { "Action", "Drama", "Fantasy" }; - string type = "TV Series"; - string description = "A thrilling anime series."; - int note = 9; - int nbEpisodes = 25; - string affiche = "oshinoko.png"; - - // Act - Oeuvre oeuvre = new Oeuvre(nom, genre, type, description, note, nbEpisodes, affiche); + // Arrange & Act + Oeuvre oeuvre = new Oeuvre(nom, new List(genres), type, description, note, nbEpisodes, affiche); // Assert Assert.Equal(nom, oeuvre.Nom); - Assert.Equal(genre, oeuvre.Genre); + Assert.Equal(new List(genres), oeuvre.Genre); Assert.Equal(type, oeuvre.Type); Assert.Equal(description, oeuvre.Description); Assert.Equal(note, oeuvre.Note); @@ -34,17 +27,12 @@ namespace UnitTests Assert.Equal(affiche, oeuvre.Affiche); } - [Fact] - public void Oeuvre_Constructor_WithRequiredParameters_ShouldSetPropertiesCorrectly() + [Theory] + [InlineData("One Piece", "TV Series", "An epic adventure.", 1000, "onepiece.jpg")] + public void Oeuvre_Constructor_WithRequiredParameters_ShouldSetPropertiesCorrectly( + string nom, string type, string description, int nbEpisodes, string affiche) { - // Arrange - string nom = "One Piece"; - string type = "TV Series"; - string description = "An epic adventure."; - int nbEpisodes = 1000; - string affiche = "onepiece.jpg"; - - // Act + // Arrange & Act Oeuvre oeuvre = new Oeuvre(nom, type, description, nbEpisodes, affiche); // Assert @@ -57,12 +45,14 @@ namespace UnitTests Assert.Equal(affiche, oeuvre.Affiche); } - [Fact] - public void AjouterEpisode_ShouldIncreaseNbEpisodesByGivenAmount() + [Theory] + [InlineData("Naruto", "TV Series", "A ninja's journey.", 220, "evangelion.jpg", 50)] + [InlineData("Dragon Ball", "TV Series", "A Saiyan's story.", 291, "evangelion.jpg", 20)] + public void AjouterEpisode_ShouldIncreaseNbEpisodesByGivenAmount( + string nom, string type, string description, int nbEpisodes, string affiche, int nbEpisodesToAdd) { // Arrange - Oeuvre oeuvre = new Oeuvre("Naruto", "TV Series", "A ninja's journey.", 220, "evangelion.jpg"); - int nbEpisodesToAdd = 50; + Oeuvre oeuvre = new Oeuvre(nom, type, description, nbEpisodes, affiche); int expectedNbEpisodes = oeuvre.NbEpisodes + nbEpisodesToAdd; // Act @@ -71,6 +61,5 @@ namespace UnitTests // Assert Assert.Equal(expectedNbEpisodes, oeuvre.NbEpisodes); } - } } diff --git a/src/UnitTests/UnitTestUtilisateur.cs b/src/UnitTests/UnitTestUtilisateur.cs index 7f903a3..e83e6c3 100644 --- a/src/UnitTests/UnitTestUtilisateur.cs +++ b/src/UnitTests/UnitTestUtilisateur.cs @@ -4,54 +4,46 @@ namespace UnitTests { public class UnitTestUtilisateur { - [Fact] - public void TestUtilisateur() + [Theory] + [InlineData("test@test.com", "pseudo", "mdp", "John", "Doe", 30)] + [InlineData("test2@test.com", "pseudo2", "mdp2", "Jane", "Smith", 25)] + public void Utilisateur_Constructor_SetsPropertiesCorrectly(string email, string pseudo, string mdp, string nom, string prenom, int age) { - // Arrange - Utilisateur utilisateur = new Utilisateur("test@test.com", "pseudo", "mdp", "John", "Doe", 30); - - // Act - utilisateur.SupprimerUtilisateur(); + // Arrange & Act + Utilisateur utilisateur = new Utilisateur(email, pseudo, mdp, nom, prenom, age); // Assert - Assert.Null(utilisateur.nom); - Assert.Null(utilisateur.prenom); - Assert.Equal(0, utilisateur.age); + Assert.Equal(email, utilisateur.Email); + Assert.Equal(pseudo, utilisateur.Pseudo); + Assert.Equal(mdp, utilisateur.MotDePasse); + Assert.Equal(nom, utilisateur.nom); + Assert.Equal(prenom, utilisateur.prenom); + Assert.Equal(age, utilisateur.age); } - [Fact] - public void Utilisateur_DefaultConstructor_SetsPropertiesToDefaultValues() + // Utilisez [MemberData] pour des jeux de données dynamiques + [Theory] + [MemberData(nameof(UtilisateursTestData.GetTestData), MemberType = typeof(UtilisateursTestData))] + public void Utilisateur_SupprimerUtilisateur_SetsPropertiesToNull(Utilisateur utilisateur) { - // Arrange & Act - Utilisateur utilisateur = new Utilisateur(); + // Arrange (pas besoin de l'acte car l'objet est fourni par les données) + + // Act + utilisateur.SupprimerUtilisateur(); // Assert Assert.Null(utilisateur.nom); Assert.Null(utilisateur.prenom); Assert.Equal(0, utilisateur.age); } + } - [Fact] - public void Utilisateur_Constructor_SetsPropertiesCorrectly() + public class UtilisateursTestData + { + public static IEnumerable GetTestData() { - // Arrange - string email = "test@test.com"; - string pseudo = "pseudo"; - string mdp = "mdp"; - string nom = "John"; - string prenom = "Doe"; - int age = 30; - - // Act - Utilisateur utilisateur = new Utilisateur(email, pseudo, mdp, nom, prenom, age); - - // Assert - Assert.Equal(email, utilisateur.Email); - Assert.Equal(pseudo, utilisateur.Pseudo); - Assert.Equal(mdp, utilisateur.MotDePasse); - Assert.Equal(nom, utilisateur.nom); - Assert.Equal(prenom, utilisateur.prenom); - Assert.Equal(age, utilisateur.age); + yield return new object[] { new Utilisateur("test@test.com", "pseudo", "mdp", "John", "Doe", 30) }; + yield return new object[] { new Utilisateur("test2@test.com", "pseudo2", "mdp2", "Jane", "Smith", 25) }; } } } \ No newline at end of file diff --git a/src/UnitTests/UnitTests.csproj b/src/UnitTests/UnitTests.csproj index ed48d31..bc64b9e 100644 --- a/src/UnitTests/UnitTests.csproj +++ b/src/UnitTests/UnitTests.csproj @@ -22,6 +22,7 @@ +