Merge pull request 'Changed Stub, Models folder into Project. Added UnitTests project with few tests' (#42) from Matheo into master
continuous-integration/drone/push Build is passing Details

Reviewed-on: #42
pull/46/head
Matheo HERSAN 2 years ago
commit 975d11d56d

@ -11,7 +11,7 @@ steps:
- name: build
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dotnet7-maui:latest
commands:
- cd MangaMap/
- cd src/MangaMap/
- dotnet restore MangaMap.sln
- dotnet build MangaMap.sln -c Release --no-restore --framework net7.0
- dotnet publish MangaMap.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release --framework net7.0
@ -19,9 +19,9 @@ steps:
- name: tests
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dotnet7-maui:latest
commands:
- cd MangaMap/
- cd src/MangaMap/
- dotnet restore MangaMap.sln
- dotnet test MangaMap.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- dotnet test MangaMap.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
depends_on: [build]
- name: code-analysis
@ -34,7 +34,7 @@ steps:
sonar_token:
from_secret: SECRET_SONAR_LOGIN
commands:
- cd MangaMap/
- cd src/MangaMap/
- dotnet restore MangaMap.sln
- dotnet sonarscanner begin /k:"MangaMap" /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
- dotnet build MangaMap.sln -c Release --no-restore

@ -125,7 +125,7 @@ WARN_LOGFILE =
# Configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = MangaMap
INPUT = src
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.cc \

@ -1,27 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MangaMap", "MangaMap.csproj", "{1946288E-37BA-420F-89BD-A1C3D4178344}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1946288E-37BA-420F-89BD-A1C3D4178344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Release|Any CPU.Build.0 = Release|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Release|Any CPU.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal

@ -1,6 +1,7 @@
using MangaMap.Model;
using MangaMap.Stub;
using Models;
using Stub;
using MangaMap.Views;
using System.Diagnostics;
namespace MangaMap;
@ -38,7 +39,8 @@ public partial class App : Application
if (File.Exists(Path.Combine(FilePath, FileName)))
{
MyManager = new Manager(new Stub.DataContract()); // Utilise le DataContract comme moyen de persistance.
MyManager = new Manager(new DataContractPersistance.DataContractXML()); // Utilise le DataContract comme moyen de persistance.
//MyManager = new Manager(new Stub.DataContractJSON()); // Utilise le DataContract comme moyen de persistance.
}
MyManager.charger();
@ -48,7 +50,8 @@ public partial class App : Application
if (!File.Exists(Path.Combine(FilePath, FileName)))
{
MyManager.Persistance = new DataContract(); // Utilise le Stub comme moyen de persistance.
MyManager.Persistance = new DataContractPersistance.DataContractXML(); // Utilise le Stub comme moyen de persistance.
//MyManager = new Manager(new Stub.DataContractJSON());
}
MyManager.sauvegarder();

@ -1,6 +1,6 @@
using MangaMap.Views;
namespace MangaMap;
using MangaMap.Model;
using Models;
using System.ComponentModel;
using INotifyPropertyChanged = System.ComponentModel.INotifyPropertyChanged;

@ -0,0 +1,78 @@
using Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace MangaMap.DataContractPersistance
{
/// <summary>
/// Implémentation de l'interface IPersistanceManager utilisant la sérialisation avec DataContract.
/// </summary>
public class DataContractJSON : IPersistanceManager
{
/// <summary>
/// Obtient ou définit le nom du fichier de sauvegarde JSON.
/// </summary>
public string FileName { get; set; } = "SauvegardeDonnees.json";
/// <summary>
/// Obtient ou définit le chemin du fichier de sauvegarde JSON.
/// </summary>
public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
/// <summary>
/// Charge les données sauvegardées à partir du fichier JSON.
/// </summary>
/// <returns>Un tuple contenant la liste des oeuvres et la liste des utilisateurs.</returns>
public (ObservableCollection<Oeuvre>, List<Utilisateur>) chargeDonne()
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist));
DataToPersist data;
using (FileStream stream2 = File.OpenRead(Path.Combine(FilePath, FileName)))
{
data = jsonSerializer.ReadObject(stream2) as DataToPersist;
}
return (data.Oeuvres, data.Utilisateurs);
}
/// <summary>
/// Sauvegarde les données dans le fichier JSON.
/// </summary>
/// <param name="o">La liste des oeuvres à sauvegarder.</param>
/// <param name="u">La liste des utilisateurs à sauvegarder.</param>
public void sauvegarder(ObservableCollection<Oeuvre> o, List<Utilisateur> u)
{
DataToPersist data = new DataToPersist();
data.Oeuvres = o;
data.Utilisateurs = u;
if (!Directory.Exists(FilePath))
{
Debug.WriteLine("Directory doesn't exist.");
Directory.CreateDirectory(FilePath);
}
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist));
using (FileStream stream = File.Create(Path.Combine(FilePath, FileName)))
{
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(
stream,
Encoding.UTF8,
false,
true))//<- this boolean says that we sant indentation
{
jsonSerializer.WriteObject(writer, data);
writer.Flush();
}
}
}
}
}

@ -1,82 +1,82 @@
using MangaMap.Model;
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 MangaMap.Stub
{
/// <summary>
/// Implémentation de l'interface IPersistanceManager utilisant la sérialisation avec DataContract.
/// </summary>
public class DataContract : IPersistanceManager
{
/// <summary>
/// Obtient ou définit le nom du fichier de sauvegarde.
/// </summary>
public string FileName { get; set; } = "SauvegardeDonnees.xml";
/// <summary>
/// Obtient ou définit le chemin du fichier de sauvegarde.
/// </summary>
public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
/// <summary>
/// Charge les données sauvegardées à partir du fichier xml.
/// </summary>
/// <returns>Un tuple contenant la liste des oeuvres et la liste des utilisateurs.</returns>
public (ObservableCollection<Oeuvre>, List<Utilisateur>) 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);
}
/// <summary>
/// Sauvegarde les données dans le fichier xml.
/// </summary>
/// <param name="o">La liste des oeuvres à sauvegarder.</param>
/// <param name="u">La liste des utilisateurs à sauvegarder.</param>
public void sauvegarder(ObservableCollection<Oeuvre> o, List<Utilisateur> 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.
}
}
}
}
}
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 MangaMap.DataContractPersistance
{
/// <summary>
/// Implémentation de l'interface IPersistanceManager utilisant la sérialisation avec DataContract.
/// </summary>
public class DataContractXML : IPersistanceManager
{
/// <summary>
/// Obtient ou définit le nom du fichier de sauvegarde XML.
/// </summary>
public string FileName { get; set; } = "SauvegardeDonnees.xml";
/// <summary>
/// Obtient ou définit le chemin du fichier de sauvegarde xml.
/// </summary>
public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
/// <summary>
/// Charge les données sauvegardées à partir du fichier xml.
/// </summary>
/// <returns>Un tuple contenant la liste des oeuvres et la liste des utilisateurs.</returns>
public (ObservableCollection<Oeuvre>, List<Utilisateur>) 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);
}
/// <summary>
/// Sauvegarde les données dans le fichier XML.
/// </summary>
/// <param name="o">La liste des oeuvres à sauvegarder.</param>
/// <param name="u">La liste des utilisateurs à sauvegarder.</param>
public void sauvegarder(ObservableCollection<Oeuvre> o, List<Utilisateur> 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.
}
}
}
}
}

@ -1,12 +1,12 @@
using System;
using MangaMap.Model;
using Models;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
namespace MangaMap.Stub
namespace MangaMap.DataContractPersistance
{
/// <summary>
/// Classe de données pour la persistance contenant les listes des oeuvres et des utilisateurs.

@ -50,11 +50,17 @@
<ItemGroup>
<AndroidResource Remove="Component\**" />
<AndroidResource Remove="DataBinding\**" />
<Compile Remove="Component\**" />
<Compile Remove="DataBinding\**" />
<EmbeddedResource Remove="Component\**" />
<EmbeddedResource Remove="DataBinding\**" />
<MauiCss Remove="Component\**" />
<MauiCss Remove="DataBinding\**" />
<MauiXaml Remove="Component\**" />
<MauiXaml Remove="DataBinding\**" />
<None Remove="Component\**" />
<None Remove="DataBinding\**" />
</ItemGroup>
<ItemGroup>
@ -129,7 +135,8 @@
</ItemGroup>
<ItemGroup>
<Folder Include="DataBinding\" />
<ProjectReference Include="..\Models\Models.csproj" />
<ProjectReference Include="..\Stub\Stub.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,45 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MangaMap", "MangaMap.csproj", "{1946288E-37BA-420F-89BD-A1C3D4178344}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Models", "..\Models\Models.csproj", "{D13B26C4-A575-4577-A735-0B04DC02BC85}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests", "..\UnitTests\UnitTests.csproj", "{6B675815-FEE2-49D0-BAF9-84ECD5116FF9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stub", "..\Stub\Stub.csproj", "{434D7C7C-2B01-44AA-8619-28D65657C47A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1946288E-37BA-420F-89BD-A1C3D4178344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Release|Any CPU.Build.0 = Release|Any CPU
{1946288E-37BA-420F-89BD-A1C3D4178344}.Release|Any CPU.Deploy.0 = Release|Any CPU
{D13B26C4-A575-4577-A735-0B04DC02BC85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D13B26C4-A575-4577-A735-0B04DC02BC85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D13B26C4-A575-4577-A735-0B04DC02BC85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D13B26C4-A575-4577-A735-0B04DC02BC85}.Release|Any CPU.Build.0 = Release|Any CPU
{6B675815-FEE2-49D0-BAF9-84ECD5116FF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B675815-FEE2-49D0-BAF9-84ECD5116FF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6B675815-FEE2-49D0-BAF9-84ECD5116FF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B675815-FEE2-49D0-BAF9-84ECD5116FF9}.Release|Any CPU.Build.0 = Release|Any CPU
{434D7C7C-2B01-44AA-8619-28D65657C47A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{434D7C7C-2B01-44AA-8619-28D65657C47A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{434D7C7C-2B01-44AA-8619-28D65657C47A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{434D7C7C-2B01-44AA-8619-28D65657C47A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 231 B

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 265 B

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Before

Width:  |  Height:  |  Size: 494 B

After

Width:  |  Height:  |  Size: 494 B

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Before

Width:  |  Height:  |  Size: 572 B

After

Width:  |  Height:  |  Size: 572 B

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Before

Width:  |  Height:  |  Size: 573 KiB

After

Width:  |  Height:  |  Size: 573 KiB

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,5 +1,5 @@
namespace MangaMap.Views.Composants;
using MangaMap.Model;
using Models;
using System.Xml;
public partial class ListOeuvre : ContentView

@ -1,4 +1,4 @@
using MangaMap.Model;
using Models;
namespace MangaMap.Views.Composants
{

@ -1,5 +1,5 @@
using System.Text.RegularExpressions;
using MangaMap.Model;
using Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Threading.Tasks;
using Microsoft.Maui.Storage;

@ -1,6 +1,6 @@
namespace MangaMap.Views
{
using Model;
using Models;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;

@ -2,7 +2,7 @@
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MangaMap"
xmlns:modeles="clr-namespace:MangaMap.Model"
xmlns:modeles="clr-namespace:Models;assembly=Models"
x:Class="MangaMap.Views.homePage"
xmlns:views="clr-namespace:MangaMap.Views.Composants">

@ -1,6 +1,6 @@
namespace MangaMap.Views
{
using MangaMap.Model;
using Models;
using System.Collections.ObjectModel;
/// <summary>

@ -1,5 +1,5 @@
namespace MangaMap.Views;
using MangaMap.Model;
using Models;
using static System.Net.Mime.MediaTypeNames;

@ -1,8 +1,8 @@
namespace MangaMap.Views;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using MangaMap.Stub;
using MangaMap.Model;
using Stub;
using Models;
/// <summary>
/// Classe représentant la page de connexion administrateur de l'application.

@ -1,8 +1,8 @@
namespace MangaMap.Views;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using MangaMap.Stub;
using MangaMap.Model;
using Stub;
using Models;
/// <summary>
/// Classe représentant la page de connexion de l'application.

@ -1,5 +1,5 @@
namespace MangaMap.Views;
using Model;
using Models;
/// <summary>
/// Classe représentant la page des paramètres de l'application.

@ -1,6 +1,6 @@
namespace MangaMap.Views;
using MangaMap.Model;
using Models;
using System.Text.RegularExpressions;
using static System.Runtime.InteropServices.JavaScript.JSType;

@ -1,11 +1,10 @@
using MangaMap.Views;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MangaMap.Model
namespace Models
{
/// <summary>
/// Représente un administrateur dans le système de gestion de listes d'anime.

@ -4,9 +4,8 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MangaMap.Model;
namespace MangaMap.Stub
namespace Models
{
/// <summary>
/// Interface pour la gestion de la persistance des données.

@ -1,17 +1,16 @@
using System;
using MangaMap.Model;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MangaMap.Model
namespace Models
{
class Liste
{
public string Nom { get; private set; }
public int NbAnime { get; private set; }
public Oeuvre[] AnimeListe { get; private set; }
public Oeuvre[]? AnimeListe { get; private set; }
public Liste(string nom, int nbAnime)
{

@ -6,9 +6,8 @@ using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using MangaMap.Stub;
namespace MangaMap.Model
namespace Models
{
/// <summary>
/// Classe responsable de la gestion globale de l'application de gestion de listes d'anime.
@ -50,7 +49,7 @@ namespace MangaMap.Model
public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null)
void OnPropertyChanged([CallerMemberName] string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary>
@ -90,21 +89,6 @@ namespace MangaMap.Model
isAdmin = false;
}
/*public Utilisateur charger()
{
var donnees = Persistance.chargeDonne();
foreach (var item in donnees.Item1)
{
Oeuvres.Add(item);
}
Utilisateurs.AddRange(donnees.Item2);
// récupérer le premier utilisateur de la liste Utilisateurs :
Utilisateur utilisateurActuel = Utilisateurs.FirstOrDefault();
return utilisateurActuel; // Renvoyez l'utilisateur actuel
}*/
/// <summary>
/// Charge les données de l'application à partir du gestionnaire de persistance.
/// </summary>

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

@ -8,7 +8,7 @@ using System.ComponentModel;
using System.Xml.Linq;
using System.Runtime.CompilerServices;
namespace MangaMap.Model
namespace Models
{
/// <summary>
/// Représente une oeuvre dans le système de gestion de listes d'anime.
@ -18,7 +18,7 @@ namespace MangaMap.Model
{
public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null)
void OnPropertyChanged([CallerMemberName] string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary>
@ -106,6 +106,7 @@ namespace MangaMap.Model
public Oeuvre(string nom, string type, string description, int nbEpisode, string affiche)
{
Nom = nom;
Genre = new List<string>();
Type = type;
Description = description;
NbEpisodes = nbEpisode;

@ -5,7 +5,7 @@ using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace MangaMap.Model
namespace Models
{
/// <summary>
/// Représente une personne dans le système de gestion de listes d'anime.
@ -17,19 +17,19 @@ namespace MangaMap.Model
/// Obtient ou définit le mot de passe de la personne.
/// </summary>
[DataMember]
public string MotDePasse { get; set; }
public string? MotDePasse { get; set; }
/// <summary>
/// Obtient ou définit l'adresse e-mail de la personne.
/// </summary>
[DataMember]
public string Email { get; set; }
public string? Email { get; set; }
/// <summary>
/// Obtient ou définit le pseudo de la personne.
/// </summary>
[DataMember]
public string Pseudo { get; set; }
public string? Pseudo { get; set; }
/// <summary>
/// Modifie le mot de passe de la personne en vérifiant une confirmation.

@ -6,7 +6,7 @@ using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace MangaMap.Model
namespace Models
{
/// <summary>
/// Représente un utilisateur de l'application de gestion de listes d'anime.
@ -18,13 +18,13 @@ namespace MangaMap.Model
/// Obtient ou définit le nom de l'utilisateur.
/// </summary>
[DataMember]
public string nom { get; private set; }
public string? nom { get; private set; }
/// <summary>
/// Obtient ou définit le prénom de l'utilisateur.
/// </summary>
[DataMember]
public string prenom { get; private set; }
public string? prenom { get; private set; }
/// <summary>
/// Obtient ou définit l'âge de l'utilisateur.

@ -1,56 +1,56 @@
using MangaMap.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MangaMap.Stub
{
/// <summary>
/// Classe de stub pour la gestion de la persistance des données.
/// </summary>
public class Stub : IPersistanceManager
{
/// <summary>
/// Charge un jeu de données en mémoire.
/// </summary>
/// <returns>Un tuple contenant la liste des oeuvres et la liste des utilisateurs.</returns>
public (ObservableCollection<Oeuvre>, List<Utilisateur>) chargeDonne()
{
ObservableCollection<Oeuvre> l1 = new ObservableCollection<Oeuvre>();
List<Utilisateur> l2 = new List<Utilisateur>();
Utilisateur u1 = new Utilisateur("t", "Pseudo1", "t", "Jean", "Baptiste", 12);
Utilisateur u2 = new Utilisateur("s", "Pseudo2", "s", "Baptiste", "Jean", 12);
Utilisateur u3 = new Utilisateur("v", "Pseudo3", "v", "David", "Marc", 12);
List<string> genres = new List<string>();
genres.Add("Action");
genres.Add("Future");
Oeuvre o1 = new Oeuvre("Evangelion", genres, "TV", "C'est une bonne série", 4, 150, "evangelion.jpg");
Oeuvre o2 = new Oeuvre("[Oshi No Ko]", genres, "DVD", "A la fin il meurt", 2, 24, "oshinoko.png");
Oeuvre o3 = new Oeuvre("One Piece", genres, "TV", "C'est la meilleur série du monde, regardez absolument", 2, 24, "onepiece.jpg");
Oeuvre o4 = new Oeuvre("Naruto", genres, "DVD", "A la fin il meurt pas", 2, 24, "oshinoko.png");
Oeuvre o5 = new Oeuvre("Vinland Saga", genres, "DVD", "A la fin il meurt peut-être", 2, 24, "oshinoko.png");
Oeuvre o6 = new Oeuvre("Hell's Paradise", genres, "DVD", "A la fin j'espère il meurt pas", 2, 24, "oshinoko.png");
l1.Add(o1); l1.Add(o2); l1.Add(o3); l1.Add(o4); l1.Add(o5); l1.Add(o6);
l2.Add(u1); l2.Add(u2); l2.Add(u3);
//u1.ListeOeuvreEnVisionnage.Add(o1);
return (l1, l2);
}
/// <summary>
/// Méthode non implémentée pour la sauvegarde des données.
/// </summary>
/// <param name="o">La liste des oeuvres à sauvegarder.</param>
/// <param name="u">La liste des utilisateurs à sauvegarder.</param>
public void sauvegarder(ObservableCollection<Oeuvre> o, List<Utilisateur> u)
{
throw new NotImplementedException();
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Models;
namespace Stub
{
/// <summary>
/// Classe de stub pour la gestion de la persistance des données.
/// </summary>
public class Stub : IPersistanceManager
{
/// <summary>
/// Charge un jeu de données en mémoire.
/// </summary>
/// <returns>Un tuple contenant la liste des oeuvres et la liste des utilisateurs.</returns>
public (ObservableCollection<Oeuvre>, List<Utilisateur>) chargeDonne()
{
ObservableCollection<Oeuvre> l1 = new ObservableCollection<Oeuvre>();
List<Utilisateur> l2 = new List<Utilisateur>();
Utilisateur u1 = new Utilisateur("t", "Pseudo1", "t", "Jean", "Baptiste", 12);
Utilisateur u2 = new Utilisateur("s", "Pseudo2", "s", "Baptiste", "Jean", 12);
Utilisateur u3 = new Utilisateur("v", "Pseudo3", "v", "David", "Marc", 12);
List<string> genres = new List<string>();
genres.Add("Action");
genres.Add("Future");
Oeuvre o1 = new Oeuvre("Evangelion", genres, "TV", "C'est une bonne série", 4, 150, "evangelion.jpg");
Oeuvre o2 = new Oeuvre("[Oshi No Ko]", genres, "DVD", "A la fin il meurt", 2, 24, "oshinoko.png");
Oeuvre o3 = new Oeuvre("One Piece", genres, "TV", "C'est la meilleur série du monde, regardez absolument", 2, 24, "onepiece.jpg");
Oeuvre o4 = new Oeuvre("Naruto", genres, "DVD", "A la fin il meurt pas", 2, 24, "oshinoko.png");
Oeuvre o5 = new Oeuvre("Vinland Saga", genres, "DVD", "A la fin il meurt peut-être", 2, 24, "oshinoko.png");
Oeuvre o6 = new Oeuvre("Hell's Paradise", genres, "DVD", "A la fin j'espère il meurt pas", 2, 24, "oshinoko.png");
l1.Add(o1); l1.Add(o2); l1.Add(o3); l1.Add(o4); l1.Add(o5); l1.Add(o6);
l2.Add(u1); l2.Add(u2); l2.Add(u3);
//u1.ListeOeuvreEnVisionnage.Add(o1);
return (l1, l2);
}
/// <summary>
/// Méthode non implémentée pour la sauvegarde des données.
/// </summary>
/// <param name="o">La liste des oeuvres à sauvegarder.</param>
/// <param name="u">La liste des utilisateurs à sauvegarder.</param>
public void sauvegarder(ObservableCollection<Oeuvre> o, List<Utilisateur> u)
{
Console.WriteLine("Méthode sauvegarder() appelée.");
}
}
}

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Models\Models.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,68 @@
using Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Stub;
namespace UnitTests
{
public class UnitTestIPersistanceManager
{
[Fact]
public void ChargeDonne_ReturnsExpectedData()
{
// Arrange
var stub = new Stub.Stub();
// Act
var (oeuvres, utilisateurs) = stub.chargeDonne();
// Assert
Assert.NotNull(oeuvres);
Assert.NotNull(utilisateurs);
Assert.Equal(6, oeuvres.Count);
Assert.Equal(3, utilisateurs.Count);
// Assert specific oeuvre properties
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);
// Assert specific utilisateur properties
var utilisateur = utilisateurs[0];
Assert.Equal("t", utilisateur.Email);
Assert.Equal("Pseudo1", utilisateur.Pseudo);
Assert.Equal("t", utilisateur.MotDePasse);
Assert.Equal("Jean", utilisateur.nom);
Assert.Equal("Baptiste", utilisateur.prenom);
Assert.Equal(12, utilisateur.age);
}
[Fact]
public void Sauvegarder_CallsConsoleWriteLine()
{
// Arrange
var stub = new Stub.Stub();
var oeuvres = new ObservableCollection<Oeuvre>();
var utilisateurs = new List<Utilisateur>();
// Act
stub.sauvegarder(oeuvres, utilisateurs);
// Assert
// Since the implementation of Sauvegarder only calls Console.WriteLine,
// we can't directly test the functionality, but we can assert that the method was called
}
}
}

@ -0,0 +1,76 @@
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTests
{
public class UnitTestOeuvre
{
[Fact]
public void Oeuvre_Constructor_WithAllParameters_ShouldSetPropertiesCorrectly()
{
// Arrange
string nom = "[Oshi No Ko]";
List<string> genre = new List<string> { "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);
// Assert
Assert.Equal(nom, oeuvre.Nom);
Assert.Equal(genre, oeuvre.Genre);
Assert.Equal(type, oeuvre.Type);
Assert.Equal(description, oeuvre.Description);
Assert.Equal(note, oeuvre.Note);
Assert.Equal(nbEpisodes, oeuvre.NbEpisodes);
Assert.Equal(affiche, oeuvre.Affiche);
}
[Fact]
public void Oeuvre_Constructor_WithRequiredParameters_ShouldSetPropertiesCorrectly()
{
// Arrange
string nom = "One Piece";
string type = "TV Series";
string description = "An epic adventure.";
int nbEpisodes = 1000;
string affiche = "onepiece.jpg";
// Act
Oeuvre oeuvre = new Oeuvre(nom, type, description, nbEpisodes, affiche);
// Assert
Assert.Equal(nom, oeuvre.Nom);
Assert.Empty(oeuvre.Genre);
Assert.Equal(type, oeuvre.Type);
Assert.Equal(description, oeuvre.Description);
Assert.Equal(0, oeuvre.Note);
Assert.Equal(nbEpisodes, oeuvre.NbEpisodes);
Assert.Equal(affiche, oeuvre.Affiche);
}
[Fact]
public void AjouterEpisode_ShouldIncreaseNbEpisodesByGivenAmount()
{
// Arrange
Oeuvre oeuvre = new Oeuvre("Naruto", "TV Series", "A ninja's journey.", 220, "evangelion.jpg");
int nbEpisodesToAdd = 50;
int expectedNbEpisodes = oeuvre.NbEpisodes + nbEpisodesToAdd;
// Act
oeuvre.AjouterEpisode(nbEpisodesToAdd);
// Assert
Assert.Equal(expectedNbEpisodes, oeuvre.NbEpisodes);
}
}
}

@ -0,0 +1,57 @@
using Models;
namespace UnitTests
{
public class UnitTestUtilisateur
{
[Fact]
public void TestUtilisateur()
{
// Arrange
Utilisateur utilisateur = new Utilisateur("test@test.com", "pseudo", "mdp", "John", "Doe", 30);
// Act
utilisateur.SupprimerUtilisateur();
// Assert
Assert.Null(utilisateur.nom);
Assert.Null(utilisateur.prenom);
Assert.Equal(0, utilisateur.age);
}
[Fact]
public void Utilisateur_DefaultConstructor_SetsPropertiesToDefaultValues()
{
// Arrange & Act
Utilisateur utilisateur = new Utilisateur();
// Assert
Assert.Null(utilisateur.nom);
Assert.Null(utilisateur.prenom);
Assert.Equal(0, utilisateur.age);
}
[Fact]
public void Utilisateur_Constructor_SetsPropertiesCorrectly()
{
// 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);
}
}
}

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Models\Models.csproj" />
<ProjectReference Include="..\Stub\Stub.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1 @@
global using Xunit;
Loading…
Cancel
Save