Compare commits

...

21 Commits

Author SHA1 Message Date
Jade VAN BRABANDT b12db366ac Unvoluntary commit
continuous-integration/drone/push Build is passing Details
1 year ago
Jade VAN BRABANDT a02ce845f8 Update '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Anthony RICHARD bceb6aa8e9 logo de l'appli sur doxygen
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD 7d4366326f doxygen
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD f6a58fd818 check ajout et edit review quand note invalide
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD 27aedcc580 encapsulation tags
2 years ago
Anthony RICHARD 5bd0f12a15 Merge branch 'master' of https://codefirst.iut.uca.fr/git/jade.van_brabandt/Projet_IHM
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD 73497b922e memberdata sur les tests unitaires
2 years ago
BelsethUwU 67cd719f56 Logo
continuous-integration/drone/push Build was killed Details
2 years ago
BelsethUwU a980e0399f fix : Username change bug
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD 0ef51c3fe3 fix onpropertychange + références
continuous-integration/drone/push Build is passing Details
2 years ago
BelsethUwU c13f44e63e fix : mon dernier commit a pas tout prit ((((:
continuous-integration/drone/push Build is passing Details
2 years ago
BelsethUwU 700bd42f68 fix : Edit d'une review qui est pas à soit impossible
continuous-integration/drone/push Build was killed Details
2 years ago
BelsethUwU c8b55a9bc4 fix : pas de delete de review qui sont pas à nous
continuous-integration/drone/push Build is passing Details
2 years ago
BelsethUwU f76c200198 Fix : pop up invalide
continuous-integration/drone/push Build was killed Details
2 years ago
BelsethUwU 449ee3200f Merge branch 'Popup_qui_marche_pas'
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD 8019a52e4a fix save follow + encapsulation followed_games
continuous-integration/drone/push Build is passing Details
2 years ago
Anthony RICHARD a01bf8e904 popups again
2 years ago
Anthony RICHARD ba2bc4fa55 suppression review
2 years ago
Anthony RICHARD de4e761b59 modification commentaire
2 years ago
Anthony RICHARD 96463022eb styles popups (sauf review)
2 years ago

@ -55,8 +55,8 @@ steps:
- name: docs
path: /docs
commands:
#- cd Documentation/doxygen
#- doxygen Doxyfile
- cd Documentation/doxygen
- doxygen Doxyfile
- /entrypoint.sh
when:
branch:

@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.
PROJECT_NAME = "Projet_IHM"
PROJECT_NAME = "Stim"
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
@ -51,7 +51,7 @@ PROJECT_BRIEF = "SAE2.02"
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.
PROJECT_LOGO = images/CodeFirst.png
PROJECT_LOGO = images/logo_stim.png
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

@ -32,12 +32,18 @@ namespace AppConsole
AfficherUsers();
Console.WriteLine("-----AJOUTER UN COMMENTAIRE SUR UN JEU-----");
Console.WriteLine("jeu = GTA V, auteur = Moi, message = Ce jeu est vraiment très bien !, note = 1.3");
Console.WriteLine("jeu = GTA V, auteur = Moi, message = Ce jeu est vraiment très bien !, note = 4.3");
Manager.GameList[3].AddReview(new("Moi", 1.3f, "Ce jeu est vraiment très bien !"));
Console.WriteLine(Manager.GameList[3]);
Console.WriteLine("-----MODIFIER UN COMMENTAIRE-----");
Console.WriteLine("jeu = GTA V, auteur = Moi, message = Ce jeu est vraiment très bien !, note = 4.3");
Console.WriteLine("message = Ce jeu est vraiment très bien !, note = 4.3 => message = Ce jeu est vraiment pas bien !, note = 1.7");
Manager.GameList[3].Reviews[3].EditReview("Ce jeu est vraiment pas bien !");
Manager.GameList[3].Reviews[3].EditRate(1.7f);
Console.WriteLine("-----SUPPRIMER UN COMMENTAIRE SUR UN JEU-----");
Console.WriteLine("jeu = GTA V, auteur = Moi, message = Ce jeu est vraiment très bien !, note = 1.3");
Console.WriteLine("jeu = GTA V, auteur = Moi, message = Ce jeu est vraiment pas bien ! (modifié), note = 1.7");
user.RemoveSelfReview(Manager.GameList[3], 1.3f, "Ce jeu est vraiment très bien !");
Console.WriteLine(Manager.GameList[3]);
@ -50,7 +56,6 @@ namespace AppConsole
Console.WriteLine("jeux = Elden ring");
user.RemoveAGame(Manager.GameList[0]);
Console.WriteLine(user);
}
private static void AfficherJeux()

@ -1,10 +1,7 @@
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.Xml;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.FileIO;
using Model;
using System.Runtime.InteropServices;
using System.Diagnostics.CodeAnalysis;
namespace StimPersistance
@ -26,7 +23,7 @@ namespace StimPersistance
public void SaveGame(List<Game> games)
{
XmlWriterSettings settings = new() { Indent = true };
DataContractSerializer serializer = new(typeof(List<Game>));
DataContractSerializer serializer = new(typeof(List<Game>), new DataContractSerializerSettings() { PreserveObjectReferences = true });
using (TextWriter tw = File.CreateText(fullGamePath))
using (XmlWriter writer = XmlWriter.Create(tw, settings)) serializer.WriteObject(writer, games);
@ -35,7 +32,7 @@ namespace StimPersistance
public void SaveUser(HashSet<User> users)
{
XmlWriterSettings settings = new() { Indent = true };
DataContractSerializer serializer = new(typeof(HashSet<User>));
DataContractSerializer serializer = new(typeof(HashSet<User>), new DataContractSerializerSettings() { PreserveObjectReferences = true});
using (TextWriter tw = File.CreateText(fullUserPath))
using (XmlWriter writer = XmlWriter.Create(tw, settings)) serializer.WriteObject(writer, users);
@ -45,7 +42,7 @@ namespace StimPersistance
{
if (File.Exists(fullGamePath))
{
DataContractSerializer serializer = new(typeof(List<Game>));
DataContractSerializer serializer = new(typeof(List<Game>), new DataContractSerializerSettings() { PreserveObjectReferences = true });
using (Stream stream = File.OpenRead(fullGamePath)) return serializer.ReadObject(stream) as List<Game> ?? new();
}
return new();
@ -55,10 +52,10 @@ namespace StimPersistance
{
if (File.Exists(fullUserPath))
{
DataContractSerializer serializer = new(typeof(HashSet<User>));
DataContractSerializer serializer = new(typeof(HashSet<User>), new DataContractSerializerSettings() { PreserveObjectReferences = true });
using (Stream stream = File.OpenRead(fullUserPath)) return serializer.ReadObject(stream) as HashSet<User> ?? new();
}
return new();
}
}
}
}

@ -6,10 +6,16 @@ using System.Text;
namespace Model
{
/// <summary>
/// Représente un jeu.
/// </summary>
[DataContract]
public sealed class Game : INotifyPropertyChanged, IEquatable<Game>
{
[DataMember]
/// <summary>
/// Obtient ou définit le nom du jeu.
/// </summary>
public string Name
{
get => name;
@ -23,6 +29,9 @@ namespace Model
private string name = default!;
[DataMember]
/// <summary>
/// Obtient ou définit la description du jeu.
/// </summary>
public string Description
{
get => description;
@ -36,6 +45,9 @@ namespace Model
private string description = default!;
[DataMember]
/// <summary>
/// Obtient ou définit l'année de sortie du jeu.
/// </summary>
public int Year
{
get => year;
@ -49,6 +61,9 @@ namespace Model
private int year = default!;
[DataMember]
/// <summary>
/// Obtient ou définit la couverture du jeu.
/// </summary>
public string Cover
{
get => cover;
@ -61,28 +76,41 @@ namespace Model
}
private string cover = default!;
[DataMember]
public ObservableCollection<string> Tags
/// <summary>
/// Obtient les étiquettes du jeu.
/// </summary>
public ReadOnlyCollection<string> Tags
{
get => tags;
get => tags.AsReadOnly();
private set
{
if (value == null || value.Count > 3) tags = new ObservableCollection<string>();
else tags = value;
if (value == null || value.Count > 3) tags = new List<string>();
else tags = value.ToList();
NotifyPropertyChanged();
}
}
private ObservableCollection<string> tags;
[DataMember]
private List<string> tags;
/// <summary>
/// Obtient les avis sur le jeu.
/// </summary>
public ReadOnlyCollection<Review> Reviews => reviews.AsReadOnly();
[DataMember]
private readonly List<Review> reviews;
/// <summary>
/// Obtient la note moyenne du jeu.
/// </summary>
public double Average => Reviews.Any() ? Math.Round(Reviews.Select(review => review.Rate).Average(), 1) : 0;
[DataMember]
public string Lien {
/// <summary>
/// Obtient ou définit le lien du jeu.
/// </summary>
public string Lien
{
get => lien;
private set
{
@ -93,6 +121,15 @@ namespace Model
}
private string lien = default!;
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Game"/> avec les valeurs spécifiées.
/// </summary>
/// <param name="name">Le nom du jeu.</param>
/// <param name="description">La description du jeu.</param>
/// <param name="year">L'année de sortie du jeu.</param>
/// <param name="c_tags">Les étiquettes du jeu.</param>
/// <param name="cover">La couverture du jeu.</param>
/// <param name="c_lien">Le lien du jeu.</param>
public Game(string name, string description, int year, List<string> c_tags, string cover, string c_lien)
{
if (string.IsNullOrWhiteSpace(name)) Name = "Default";
@ -100,8 +137,8 @@ namespace Model
if (string.IsNullOrWhiteSpace(description)) Description = "Pas de description";
else Description = description;
Year = year;
if (c_tags is not null) tags = new ObservableCollection<string>(c_tags);
else tags = new ObservableCollection<string>();
if (c_tags is not null) tags = new List<string>(c_tags);
else tags = new List<string>();
if (string.IsNullOrWhiteSpace(cover)) Cover = "no_cover.png";
else Cover = cover;
if (string.IsNullOrWhiteSpace(c_lien)) Lien = "Pas de lien";
@ -109,17 +146,29 @@ namespace Model
reviews = new List<Review>();
}
/// <summary>
/// Événement déclenché lorsque la valeur d'une propriété change.
/// </summary>
public event PropertyChangedEventHandler? PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary>
/// Retourne le code de hachage pour l'objet.
/// </summary>
/// <returns>Le code de hachage calculé.</returns>
public override int GetHashCode()
{
if (string.IsNullOrWhiteSpace(Name)) return 0;
return Name.GetHashCode();
return Name.GetHashCode();
}
/// <summary>
/// Détermine si l'objet spécifié est égal à l'objet actuel.
/// </summary>
/// <param name="obj">L'objet à comparer avec l'objet actuel.</param>
/// <returns>True si les objets sont égaux, sinon False.</returns>
public override bool Equals(object? obj)
{
if (object.ReferenceEquals(obj, null)) return false;
@ -128,12 +177,21 @@ namespace Model
return this.Equals(obj as Game);
}
/// <summary>
/// Détermine si l'objet spécifié est égal à l'objet actuel.
/// </summary>
/// <param name="other">L'objet à comparer avec l'objet actuel.</param>
/// <returns>True si les objets sont égaux, sinon False.</returns>
public bool Equals(Game? other)
{
if (string.IsNullOrWhiteSpace(Name)) return false;
return other != null && Name.Equals(other.Name);
}
/// <summary>
/// Retourne une chaîne qui représente l'objet courant.
/// </summary>
/// <returns>Une chaîne qui représente l'objet courant.</returns>
public override string ToString()
{
StringBuilder builder = new();
@ -147,34 +205,69 @@ namespace Model
return builder.ToString();
}
/// <summary>
/// Ajoute un avis sur le jeu.
/// </summary>
/// <param name="review">L'avis à ajouter.</param>
public void AddReview(Review review)
{
reviews.Add(review);
NotifyPropertyChanged(nameof(Reviews));
NotifyPropertyChanged(nameof(Average));
UpdateReviews();
}
/// <summary>
/// Supprime un avis du jeu.
/// </summary>
/// <param name="review">L'avis à supprimer.</param>
public void RemoveReview(Review review)
{
reviews.Remove(review);
UpdateReviews();
}
/// <summary>
/// Met à jour la liste des avis et la note moyenne.
/// </summary>
public void UpdateReviews()
{
NotifyPropertyChanged(nameof(Reviews));
NotifyPropertyChanged(nameof(Average));
}
/// <summary>
/// Modifie la description du jeu.
/// </summary>
/// <param name="newdesc">La nouvelle description.</param>
public void DescChange(string newdesc)
{
description = newdesc;
}
/// <summary>
/// Modifie les étiquettes du jeu.
/// </summary>
/// <param name="newtag">La nouvelle liste d'étiquettes.</param>
public void TagChange(List<string> newtag)
{
if (newtag != null && newtag.Count<=3) tags = new ObservableCollection<string>(newtag);
if (newtag != null && newtag.Count <= 3) tags = new List<string>(newtag);
}
/// <summary>
/// Modifie le nom du jeu.
/// </summary>
/// <param name="newname">Le nouveau nom.</param>
public void NameChange(string newname)
{
name = newname;
}
/// <summary>
/// Modifie l'année de sortie du jeu.
/// </summary>
/// <param name="newyear">La nouvelle année.</param>
public void YearChange(int newyear)
{
year = newyear;
}
}
}
}

@ -1,13 +1,32 @@
using System.Collections.ObjectModel;
namespace Model
namespace Model
{
/// <summary>
/// Interface pour la persistance des données.
/// </summary>
public interface IPersistance
{
/// <summary>
/// Sauvegarde la liste des jeux.
/// </summary>
/// <param name="games">La liste des jeux à sauvegarder.</param>
public void SaveGame(List<Game> games);
/// <summary>
/// Sauvegarde la liste des utilisateurs.
/// </summary>
/// <param name="users">La liste des utilisateurs à sauvegarder.</param>
public void SaveUser(HashSet<User> users);
/// <summary>
/// Charge la liste des jeux.
/// </summary>
/// <returns>La liste des jeux chargée.</returns>
public List<Game> LoadGame();
public HashSet<User> LoadUser();
/// <summary>
/// Charge la liste des utilisateurs.
/// </summary>
/// <returns>La liste des utilisateurs chargée.</returns>
public HashSet<User> LoadUser();
}
}
}

@ -1,18 +1,43 @@
using System.Collections.ObjectModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace Model
{
/// <summary>
/// Classe responsable de la gestion des jeux et des utilisateurs.
/// </summary>
public class Manager
{
/// <summary>
/// Le type de persistance utilisé par le gestionnaire.
/// </summary>
public readonly IPersistance mgrpersistance;
/// <summary>
/// La liste des jeux disponibles.
/// </summary>
public ReadOnlyCollection<Game> GameList => gameList.AsReadOnly();
private readonly List<Game> gameList;
/// <summary>
/// Le jeu sélectionné actuellement.
/// </summary>
public Game? SelectedGame { get; set; }
/// <summary>
/// L'utilisateur actuellement connecté.
/// </summary>
public User? CurrentUser { get; set; }
/// <summary>
/// La liste des utilisateurs enregistrés.
/// </summary>
public HashSet<User> Users { get; private set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Manager"/> avec un objet de persistance spécifié.
/// </summary>
/// <param name="persistance">Le type de persistance utilisé pour charger/sauvegarder les jeux et les utilisateurs.</param>
public Manager(IPersistance persistance)
{
mgrpersistance = persistance;
@ -20,6 +45,13 @@ namespace Model
Users = persistance.LoadUser();
}
/// <summary>
/// Filtre les jeux en fonction des critères de filtrage donnés.
/// </summary>
/// <param name="filterName">Nom du jeu à filtrer.</param>
/// <param name="filterTag1">Première étiquette à filtrer.</param>
/// <param name="filterTag2">Deuxième étiquette à filtrer.</param>
/// <returns>Une liste de jeux filtrée.</returns>
public IEnumerable<Game> FilterGames(string? filterName, string? filterTag1, string? filterTag2)
{
IEnumerable<Game> retList;
@ -36,28 +68,51 @@ namespace Model
return retList;
}
/// <summary>
/// Ajoute un jeu à la liste des jeux.
/// </summary>
/// <param name="game">Le jeu à ajouter.</param>
public void AddGametoGamesList(Game game)
{
if (!gameList.Contains(game)) gameList.Add(game);
mgrpersistance.SaveGame(gameList);
}
/// <summary>
/// Ajoute un utilisateur à la liste des utilisateurs.
/// </summary>
/// <param name="user">L'utilisateur à ajouter.</param>
public void AddUsertoUserList(User user)
{
if (!Users.Contains(user)) Users.Add(user);
mgrpersistance.SaveUser(Users);
}
/// <summary>
/// Supprime un jeu de la liste des jeux.
/// </summary>
/// <param name="game">Le jeu à supprimer.</param>
public void RemoveGameFromGamesList(Game game)
{
SelectedGame = null;
gameList.Remove(game);
mgrpersistance.SaveGame(gameList);
}
/// <summary>
/// Sauvegarde les jeux.
/// </summary>
[ExcludeFromCodeCoverage]
public void SaveGames()
{
mgrpersistance.SaveGame(gameList);
}
/// <summary>
/// Recherche un utilisateur par son nom d'utilisateur.
/// </summary>
/// <param name="username">Le nom d'utilisateur à rechercher.</param>
/// <returns>L'utilisateur correspondant, ou null s'il n'est pas trouvé.</returns>
public User? SearchUser(string username)
{
foreach (User user in Users)
@ -66,10 +121,31 @@ namespace Model
}
return null;
}
/// <summary>
/// Sauvegarde les utilisateurs.
/// </summary>
[ExcludeFromCodeCoverage]
public void SaveUser()
{
mgrpersistance.SaveUser(Users);
}
/// <summary>
/// Met à jour les références des jeux suivis par l'utilisateur actuel.
/// </summary>
[ExcludeFromCodeCoverage]
public void UpdateReferences()
{
if (CurrentUser != null && CurrentUser.Followed_Games.Count != 0)
{
foreach (var game in CurrentUser.Followed_Games.ToList())
{
CurrentUser.RemoveAGame(game);
if (GameList.Contains(game)) CurrentUser.FollowAGame(gameList.Where(g => g.Name == game.Name).First());
}
}
SaveUser();
}
}
}

@ -4,10 +4,16 @@ using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Représente un commentaire.
/// </summary>
[DataContract]
public class Review :INotifyPropertyChanged
public class Review : INotifyPropertyChanged
{
[DataMember]
/// <summary>
/// Obtient ou définit la note du commentaire.
/// </summary>
public double Rate
{
get => rate;
@ -21,6 +27,9 @@ namespace Model
private double rate;
[DataMember]
/// <summary>
/// Obtient ou définit le texte du commentaire.
/// </summary>
public string? Text
{
get => text;
@ -33,13 +42,26 @@ namespace Model
}
private string? text;
/// <summary>
/// Événement déclenché lorsque les propriétés de l'objet changent.
/// </summary>
public event PropertyChangedEventHandler? PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
[DataMember]
/// <summary>
/// Obtient ou définit le nom de l'auteur du commentaire.
/// </summary>
public string AuthorName { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Review"/> avec le nom de l'auteur, la note et le texte du commentaire.
/// </summary>
/// <param name="username">Le nom de l'auteur du commentaire.</param>
/// <param name="rate">La note du commentaire.</param>
/// <param name="text">Le texte du commentaire.</param>
public Review(string username, double rate, string text)
{
AuthorName = username;
@ -47,18 +69,31 @@ namespace Model
Text = text;
}
/// <summary>
/// Retourne une représentation sous forme de chaîne de l'objet courant.
/// </summary>
/// <returns>La représentation sous forme de chaîne de l'objet courant.</returns>
public override string ToString()
{
return $"{AuthorName} : {Rate} : {Text}";
}
/// <summary>
/// Modifie le texte du commentaire.
/// </summary>
/// <param name="text">Le nouveau texte du commentaire.</param>
public void EditReview(string text)
{
if (!string.IsNullOrWhiteSpace(text)) Text = text+" (Modifié)";
if (!string.IsNullOrWhiteSpace(text)) Text = text + " (Modifié)";
}
/// <summary>
/// Modifie la note du commentaire.
/// </summary>
/// <param name="newval">La nouvelle valeur de la note.</param>
public void EditRate(double newval)
{
if (newval >= 0 && newval <= 5) Rate= newval;
if (newval >= 0 && newval <= 5) Rate = newval;
}
}
}
}

@ -7,9 +7,15 @@ using System.Text.RegularExpressions;
namespace Model
{
/// <summary>
/// Représente un utilisateur.
/// </summary>
[DataContract]
public sealed class User : INotifyPropertyChanged , IEquatable<User>
public sealed class User : INotifyPropertyChanged, IEquatable<User>
{
/// <summary>
/// Obtient ou définit la photo de profil de l'utilisateur.
/// </summary>
[DataMember]
public string UserImage
{
@ -22,6 +28,10 @@ namespace Model
}
}
private string userImage = default!;
/// <summary>
/// Obtient ou définit le nom d'utilisateur.
/// </summary>
[DataMember]
public string? Username
{
@ -33,11 +43,15 @@ namespace Model
NotifyPropertyChanged();
}
}
private string username=default!;
private string username = default!;
/// <summary>
/// Obtient ou définit la biographie de l'utilisateur.
/// </summary>
[DataMember]
public string Biographie
public string Biographie
{
get => biographie;
get => biographie;
set
{
if (string.IsNullOrWhiteSpace(value)) biographie = "Pas de biographie";
@ -46,6 +60,10 @@ namespace Model
}
}
private string biographie = default!;
/// <summary>
/// Obtient ou définit l'adresse e-mail de l'utilisateur.
/// </summary>
[DataMember]
public string Email
{
@ -62,6 +80,10 @@ namespace Model
}
}
private string email = default!;
/// <summary>
/// Obtient ou définit le mot de passe de l'utilisateur.
/// </summary>
[DataMember]
public string Password
{
@ -79,21 +101,30 @@ namespace Model
}
private string password = default!;
/// <summary>
/// Événement déclenché lorsqu'une propriété de l'utilisateur change.
/// </summary>
public event PropertyChangedEventHandler? PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary>
/// Obtient la liste des jeux suivis par l'utilisateur.
/// </summary>
public ReadOnlyCollection<Game> Followed_Games => followed_Games.AsReadOnly();
[DataMember]
public ObservableCollection<Game> Followed_Games
{
get;
private init;
}
private readonly List<Game> followed_Games;
public User(string userImage,string username, string biographie, string email, string password)
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="User"/>.
/// </summary>
/// <param name="userImage">La photo de profil de l'utilisateur.</param>
/// <param name="username">Le nom d'utilisateur.</param>
/// <param name="biographie">La biographie de l'utilisateur.</param>
/// <param name="email">L'adresse e-mail de l'utilisateur.</param>
/// <param name="password">Le mot de passe de l'utilisateur.</param>
public User(string userImage, string username, string biographie, string email, string password)
{
if (userImage == null) UserImage="no_cover.png";
if (userImage == null) UserImage = "no_cover.png";
else UserImage = userImage;
if (username == null) Username = "Default";
else Username = username;
@ -103,14 +134,28 @@ namespace Model
else Email = email;
if (password == null) throw new ArgumentNullException(nameof(password));
else Password = password;
Followed_Games = new ObservableCollection<Game>();
followed_Games = new List<Game>();
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary>
/// Détermine si l'objet spécifié est égal à l'objet courant.
/// </summary>
/// <param name="other">L'objet à comparer avec l'objet courant.</param>
/// <returns>true si l'objet spécifié est égal à l'objet courant ; sinon, false.</returns>
public bool Equals(User? other)
{
if (string.IsNullOrWhiteSpace(Username)) return false;
return other != null && Username.Equals(other.Username);
}
/// <summary>
/// Détermine si l'objet spécifié est égal à l'objet courant.
/// </summary>
/// <param name="obj">L'objet à comparer avec l'objet courant.</param>
/// <returns>true si l'objet spécifié est égal à l'objet courant ; sinon, false.</returns>
public override bool Equals(object? obj)
{
if (obj == null) return false;
@ -119,16 +164,33 @@ namespace Model
return this.Equals((User)obj);
}
/// <summary>
/// Retourne le code de hachage de l'objet.
/// </summary>
/// <returns>Code de hachage.</returns>
public override int GetHashCode()
{
if (Username!=null) return Username.GetHashCode();
{
if (Username != null) return Username.GetHashCode();
return 0;
}
/// <summary>
/// Ajoute une critique d'utilisateur pour un jeu spécifié.
/// </summary>
/// <param name="game">Le jeu pour lequel ajouter la critique.</param>
/// <param name="rate">La note de la critique.</param>
/// <param name="text">Le texte de la critique.</param>
public void AddReview(Game game, double rate, string text)
{
game.AddReview(new Review(Username, rate, text));
}
/// <summary>
/// Supprime la critique de l'utilisateur pour un jeu spécifié.
/// </summary>
/// <param name="game">Le jeu pour lequel supprimer la critique.</param>
/// <param name="rate">La note de la critique.</param>
/// <param name="text">Le texte de la critique.</param>
public void RemoveSelfReview(Game game, float rate, string text)
{
for (int i = game.Reviews.Count - 1; i >= 0; i--)
@ -140,17 +202,33 @@ namespace Model
}
}
}
/// <summary>
/// Suit un jeu spécifié.
/// </summary>
/// <param name="game">Le jeu à suivre.</param>
public void FollowAGame(Game game)
{
if (Followed_Games.Contains(game)) return;
Followed_Games.Add(game);
followed_Games.Add(game);
NotifyPropertyChanged(nameof(Followed_Games));
}
/// <summary>
/// Ne suit plus un jeu spécifié.
/// </summary>
/// <param name="game">Le jeu à ne plus suivre.</param>
public void RemoveAGame(Game game)
{
if (!Followed_Games.Contains(game)) return;
Followed_Games.Remove(game);
followed_Games.Remove(game);
NotifyPropertyChanged(nameof(Followed_Games));
}
/// <summary>
/// Retourne une représentation sous forme de chaîne de l'objet.
/// </summary>
/// <returns>La représentation sous forme de chaîne de l'objet.</returns>
public override string ToString()
{
StringBuilder builder = new();
@ -158,6 +236,5 @@ namespace Model
foreach (Game game in Followed_Games) builder.Append($"{game.Name}\n");
return builder.ToString();
}
}
}
}

@ -28,17 +28,6 @@
</Grid>
</Border>
</DataTemplate>
<DataTemplate x:Key="reviewTemplate">
<Border Margin="0, 5">
<VerticalStackLayout>
<Grid ColumnDefinitions="auto, *">
<Label Text="{Binding AuthorName, FallbackValue='Default'}" FontSize="20"/>
<local:StarsContainer Rate="{Binding Rate, FallbackValue='0'}" Grid.Column="2"/>
</Grid>
<Label Text="{Binding Text, FallbackValue='Default'}"/>
</VerticalStackLayout>
</Border>
</DataTemplate>
<DataTemplate x:Key="followTemplate">
<Border HeightRequest="150" Margin="10">
<Grid ColumnDefinitions="auto, *, 3*, auto" RowDefinitions="*">

@ -4,8 +4,8 @@
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="Stim.ConfirmationPopup"
CanBeDismissedByTappingOutsideOfPopup="False">
<Grid RowDefinitions="*, *" ColumnDefinitions="*, *">
<Grid RowDefinitions="*, *" ColumnDefinitions="*, *" Style="{StaticResource popupGrid}">
<Label Grid.ColumnSpan="2" x:Name="placeholder" Style="{StaticResource popupLabel}"/>
<Button Grid.Row="2" Style="{StaticResource popupButton}" Text="Non" Clicked="No"/>
<Button Grid.Row="2" Grid.Column="2" Style="{StaticResource popupButton}" Text="Oui" Clicked="Yes"/>

@ -27,7 +27,7 @@
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Image Source="no_cover.png" HeightRequest="490" Margin="0,10,0,0"/>
<Image Source="logo_stim.png" HeightRequest="490" Margin="0,10,0,0"/>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>

@ -6,7 +6,23 @@
Title="{Binding Name, FallbackValue='Default'}"
Background="{StaticResource Secondary}">
<Grid>
<ContentPage.Resources>
<DataTemplate x:Key="reviewTemplate">
<Border Margin="0, 5">
<VerticalStackLayout>
<Grid ColumnDefinitions="auto, auto, auto, *">
<Label Text="{Binding AuthorName, FallbackValue='Default'}" FontSize="20"/>
<ImageButton Grid.Column="2" Source="pen.png" Background="{StaticResource Transparent}" HeightRequest="30" Clicked="EditReview"/>
<ImageButton Grid.Column="3" Style="{StaticResource removeButton}" HorizontalOptions="Start" HeightRequest="30" Clicked="RemoveReview"/>
<local:StarsContainer Grid.Column="4" Rate="{Binding Rate, FallbackValue='0'}"/>
</Grid>
<Label Text="{Binding Text, FallbackValue='Default'}"/>
</VerticalStackLayout>
</Border>
</DataTemplate>
</ContentPage.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
@ -34,11 +50,12 @@
<Label Grid.Column="1" Grid.Row="3" Text="{Binding Lien, FallbackValue='Default'}"/>
<local:StarsContainer Rate="{Binding Average, FallbackValue='0'}" Grid.Column="4" Grid.Row="3"/>
<VerticalStackLayout Grid.ColumnSpan="4" Grid.Row="4">
<Label Text="Avis de la communauté :" FontSize="30"/>
<CollectionView ItemsSource="{Binding Reviews}" ItemTemplate="{StaticResource reviewTemplate}"/>
</VerticalStackLayout>
<ScrollView Grid.ColumnSpan="4" Grid.Row="4">
<VerticalStackLayout>
<Label Text="Avis de la communauté :" FontSize="30"/>
<CollectionView ItemsSource="{Binding Reviews}" ItemTemplate="{StaticResource reviewTemplate}"/>
</VerticalStackLayout>
</ScrollView>
</Grid>
</Grid>
</ScrollView>

@ -19,7 +19,34 @@ public partial class DetailledPage : ContentPage
private async void AddReview(object sender, EventArgs e)
{
await this.ShowPopupAsync(new ReviewPopUp());
var res = await this.ShowPopupAsync(new ReviewPopUp());
if (res != null && res is int i && i == 1) await this.ShowPopupAsync(new MessagePopup("Commentaire ajouté !"));
}
private async void EditReview(object sender, EventArgs e)
{
if (((sender as ImageButton).BindingContext as Review).AuthorName == ((App)App.Current).Manager.CurrentUser.Username)
{
var res = await this.ShowPopupAsync(new ReviewPopUp((sender as ImageButton).BindingContext as Review));
if (res != null && res is int i && i == 2) await this.ShowPopupAsync(new MessagePopup("Commentaire modifié !"));
}
else await this.ShowPopupAsync(new MessagePopup("Ce commentaire ne vous appartiens pas"));
}
private async void RemoveReview(object sender, EventArgs e)
{
if (((sender as ImageButton).BindingContext as Review).AuthorName == ((App)App.Current).Manager.CurrentUser.Username)
{
var res = await this.ShowPopupAsync(new ConfirmationPopup("Voulez-vous vraiment supprimer votre commentaire ?"));
if (res != null && res is bool v && v)
{
(App.Current as App).Manager.SelectedGame.RemoveReview((sender as ImageButton).BindingContext as Review);
(App.Current as App).Manager.SaveGames();
await this.ShowPopupAsync(new MessagePopup("Commentaire supprimé !"));
}
}
else await this.ShowPopupAsync(new MessagePopup("Ce commentaire ne vous appartiens pas"));
}
private async void AddFollow(object sender, EventArgs e)
@ -34,6 +61,7 @@ public partial class DetailledPage : ContentPage
{
await this.ShowPopupAsync(new MessagePopup("Jeu ajouté dans les suivis !"));
((App)App.Current).Manager.CurrentUser.FollowAGame((App.Current as App).Manager.SelectedGame);
((App)App.Current).Manager.SaveUser();
}
else
{
@ -46,9 +74,17 @@ public partial class DetailledPage : ContentPage
var res = await this.ShowPopupAsync(new ConfirmationPopup("Voulez-vous vraiment supprimer " + (App.Current as App).Manager.SelectedGame.Name + " ?"));
if (res != null && res is bool && (bool)res)
{
(App.Current as App).Manager.CurrentUser.RemoveAGame((App.Current as App).Manager.SelectedGame);
(App.Current as App).Manager.RemoveGameFromGamesList((App.Current as App).Manager.SelectedGame);
(App.Current as App).Manager.SaveUser();
await Navigation.PopAsync();
await this.ShowPopupAsync(new MessagePopup("Jeu supprimé !"));
}
}
protected override void OnDisappearing()
{
Navigation.PopAsync();
base.OnDisappearing();
}
}

@ -4,12 +4,12 @@
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="Stim.EntryPopup"
CanBeDismissedByTappingOutsideOfPopup="False">
<Grid ColumnDefinitions="*" RowDefinitions="*, *, *, *">
<Label x:Name="placeholder" Style="{StaticResource popupLabel}"/>
<Entry Grid.Row="1" x:Name="Entrytxt" VerticalOptions="Center" HorizontalOptions="Center"/>
<Button Grid.Row="2" Text="Valider" Style="{StaticResource popupButton}" Clicked="Valider"/>
<Button Grid.Row="3" Text="Annuler" Style="{StaticResource popupButton}" Clicked="CloseButton"/>
<Grid ColumnDefinitions="*" RowDefinitions="auto, auto, *, *" Style="{StaticResource popupGrid}">
<Label x:Name="placeholder" Style="{StaticResource popupLabel}"/>
<Entry Grid.Row="1" x:Name="Entrytxt" Style="{StaticResource popupEntry}"/>
<Button Grid.Row="2" Text="Valider" Style="{StaticResource popupButton}" Clicked="Valider"/>
<Button Grid.Row="3" Text="Annuler" Style="{StaticResource popupButton}" Clicked="CloseButton"/>
<HorizontalStackLayout x:Name="Error"/>
</Grid>
</toolkit:Popup>

@ -10,21 +10,19 @@
<VerticalStackLayout Style="{StaticResource pageBorder}" Grid.Column="0" Grid.Row="1"/>
<VerticalStackLayout Style="{StaticResource pageBorder}" Grid.Column="2" Grid.Row="1"/>
<Grid Grid.Column="1" RowDefinitions="500, auto, auto">
<Image Source="no_cover.png" HeightRequest="490" Margin="0,10,0,0"/>
<Image Source="logo_stim.png" HeightRequest="490" Margin="0,10,0,0"/>
<Grid Grid.Row="1" RowDefinitions="auto, auto, auto">
<Entry Placeholder="Username" PlaceholderColor="{StaticResource Primary}"
IsPassword="False"
x:Name="Username"
HeightRequest="50"
ClearButtonVisibility="WhileEditing"
Text="anthony"/>
ClearButtonVisibility="WhileEditing"/>
<Entry Placeholder="Mot de passe"
PlaceholderColor="{StaticResource Primary}"
IsPassword="True" x:Name="Pswd"
HeightRequest="50"
Grid.Row="1"
ClearButtonVisibility="WhileEditing"
Text="anthony5"/>
ClearButtonVisibility="WhileEditing"/>
<Grid Grid.Row="2"
Margin="10,0,0,10" ColumnDefinitions="3*, *">

@ -21,8 +21,9 @@ public partial class LoginPage : ContentPage
if (user.Password == Pswd.Text)
{
((App)App.Current).Manager.CurrentUser = user;
((App)App.Current).Manager.UpdateReferences();
Application.Current.MainPage = new AppShell();
await Navigation.PushModalAsync(new MainPage());//Shell.Current.GoToAsync("//MainPage");
await Navigation.PushModalAsync(new MainPage());
}
else Error.Children.Add(new Label { Text = "Mot de passe incorrect",
TextColor = Colors.Red,

@ -1,16 +1,8 @@
namespace Stim;
using Model;
using StimPersistance;
using StimStub;
using Microsoft.Maui.Storage;
using MailKit.Search;
using System.Linq;
using System.Collections.Generic;
public partial class MainPage : ContentPage
{
public IEnumerable<Game> filterdGame { get; private set; }
public MainPage()
{
InitializeComponent();
@ -19,8 +11,8 @@ public partial class MainPage : ContentPage
private async void OnClickGameList(object sender, EventArgs e)
{
(App.Current as App).Manager.SelectedGame = (sender as CollectionView).SelectedItem as Game;
await Navigation.PushAsync(new DetailledPage());
(App.Current as App).Manager.SelectedGame = (sender as CollectionView).SelectedItem as Game;
await Navigation.PushAsync(new DetailledPage());
}
private async void Addgame(object sender, EventArgs e)

@ -5,7 +5,7 @@
x:Class="Stim.MessagePopup"
CanBeDismissedByTappingOutsideOfPopup ="False">
<Grid RowDefinitions="*, *" ColumnDefinitions="*">
<Grid RowDefinitions="*, *" ColumnDefinitions="*" Style="{StaticResource popupGrid}">
<Label x:Name="placeholder" Style="{StaticResource popupLabel}"/>
<Button Grid.Row="1" Text="Fermer" Style="{StaticResource popupButton}" Clicked="CloseButton"/>
</Grid>

@ -15,19 +15,36 @@ public partial class ProfilPage : ContentPage
private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
((App)App.Current).Manager.CurrentUser.RemoveAGame((sender as CollectionView).SelectedItem as Game);
((App)App.Current).Manager.SaveUser();
}
private async void ChangeUsername(object sender, EventArgs e)
{
var newName = await this.ShowPopupAsync(new EntryPopup("Username"));
if (string.IsNullOrWhiteSpace(newName as string)) await this.ShowPopupAsync(new MessagePopup("Nom d'utilisateur invalide"));
else ((App)App.Current).Manager.CurrentUser.Username = (newName as string);
}
public async void PopUpUsername(object sender, EventArgs e)
{
var newName = await this.ShowPopupAsync(new EntryPopup("Username"));
if (string.IsNullOrWhiteSpace(newName as string)) await this.ShowPopupAsync(new MessagePopup("Nom d'utilisateur invalide"));
else ((App)App.Current).Manager.CurrentUser.Username = (newName as string);
else
{
if (((App)App.Current).Manager.SearchUser(newName as string) is User)
{
await this.ShowPopupAsync(new MessagePopup("Nom d'utilisateur déjà utilisé"));
}
else
{
string oldName = ((App)App.Current).Manager.CurrentUser.Username;
((App)App.Current).Manager.CurrentUser.Username = (newName as string);
foreach (Game g in ((App)App.Current).Manager.GameList)
{
foreach(Review r in g.Reviews)
{
if (r.AuthorName==oldName as string)
{
r.AuthorName= newName as string;
}
}
}
}
}
}
public async void PopUpBio(object sender, EventArgs e)
{
@ -38,7 +55,7 @@ public partial class ProfilPage : ContentPage
{
Regex rg = new Regex("^(?=.*[A-Za-z])(?=.*[0-9@$!%*#?&])[A-Za-z-0-9@$!%*#?&]{8,}$");
var newPswd = await this.ShowPopupAsync(new EntryPopup("Password"));
if (string.IsNullOrWhiteSpace(newPswd as string) || rg.IsMatch(newPswd as string)) await this.ShowPopupAsync(new MessagePopup("Nom d'utilisateur invalide"));
if (string.IsNullOrWhiteSpace(newPswd as string) || rg.IsMatch(newPswd as string)) await this.ShowPopupAsync(new MessagePopup("Mot de passe invalide"));
else ((App)App.Current).Manager.CurrentUser.Password = (newPswd as string);
}
public async void PopUpEmail(object sender, EventArgs e)

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

@ -394,6 +394,23 @@
<Setter Property="VerticalOptions" Value="Center"/>
</Style>
<Style TargetType="Button" x:Key="popupButton">
<Setter Property="FontSize" Value="30"/>
<Setter Property="BorderColor" Value="{StaticResource Secondary}"/>
<Setter Property="BorderWidth" Value="2"/>
<Setter Property="HorizontalOptions" Value="Center"/>
<Setter Property="VerticalOptions" Value="Center" />
<Setter Property="Background" Value="{StaticResource Transparent}"/>
</Style>
<Style TargetType="Grid" x:Key="popupGrid">
<Setter Property="Background" Value="{StaticResource Tertiary}"/>
</Style>
<Style TargetType="Entry" x:Key="popupEntry">
<Setter Property="VerticalOptions" Value="Center"/>
</Style>
<Style TargetType="Button" x:Key="followButton">
<Setter Property="Text" Value="Suivre"/>
<Setter Property="Background" Value="{StaticResource Transparent}"/>
@ -405,15 +422,6 @@
<Setter Property="Margin" Value="10"/>
</Style>
<Style TargetType="Button" x:Key="popupButton">
<Setter Property="FontSize" Value="30"/>
<Setter Property="BorderColor" Value="{StaticResource Secondary}"/>
<Setter Property="BorderWidth" Value="2"/>
<Setter Property="HorizontalOptions" Value="Center"/>
<Setter Property="VerticalOptions" Value="Center" />
<Setter Property="Background" Value="{StaticResource Transparent}"/>
</Style>
<Style TargetType="ImageButton" x:Key="addButton">
<Setter Property="Source" Value="add_white.png"/>
<Setter Property="Background" Value="{StaticResource Transparent}"/>

@ -4,13 +4,14 @@
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="Stim.ReviewPopUp"
CanBeDismissedByTappingOutsideOfPopup="False">
<Grid ColumnDefinitions="*" RowDefinitions="*, *, *, *, *">
<Label x:Name="placeholder" Style="{StaticResource popupLabel}"/>
<Entry Grid.Row="1" x:Name="Entrytxt" VerticalOptions="Center" HorizontalOptions="Center"/>
<Entry Grid.Row="2" x:Name="Val" VerticalOptions="Center" HorizontalOptions="Center"/>
<Button Grid.Row="3" Text="Valider" Style="{StaticResource popupButton}" Clicked="Valider"/>
<Button Grid.Row="4" Text="Annuler" Style="{StaticResource popupButton}" Clicked="CloseButton"/>
<HorizontalStackLayout x:Name="Error"/>
<Grid RowDefinitions="auto, auto, auto, auto, auto, auto, *" ColumnDefinitions="*, *" Style="{StaticResource popupGrid}">
<Label Grid.ColumnSpan="2" Text="Commentaire" Style="{StaticResource popupLabel}"/>
<Entry Grid.ColumnSpan="2" Grid.Row="2" x:Name="Entrytxt" Style="{StaticResource popupEntry}"/>
<Label Grid.ColumnSpan="2" Grid.Row="3" Text="Note sur 5" Style="{StaticResource popupLabel}"/>
<Entry Grid.ColumnSpan="2" Grid.Row="4" x:Name="Val" Style="{StaticResource popupEntry}" WidthRequest="25" HorizontalTextAlignment="Center"/>
<Button Grid.Row="5" Style="{StaticResource popupButton}" Text="Annuler" Clicked="CloseButton"/>
<Button Grid.Row="5" Grid.Column="2" Style="{StaticResource popupButton}" Text="Valider" Clicked="Valider"/>
<Label Grid.ColumnSpan="2" Grid.Row="6" x:Name="Error" Style="{StaticResource popupLabel}" TextColor="Red" Text=""/>
</Grid>
</toolkit:Popup>

@ -6,18 +6,29 @@ namespace Stim;
public partial class ReviewPopUp : Popup
{
public ReviewPopUp()
{
InitializeComponent();
}
private readonly bool editing = false;
private readonly Review prevRev = null;
public ReviewPopUp(Review previousRev = null)
{
InitializeComponent();
if (previousRev != null)
{
prevRev = previousRev;
Entrytxt.Text = previousRev.Text;
Val.Text = previousRev.Rate.ToString();
editing = true;
}
}
public void CloseButton(object sender, EventArgs e)
{
Close();
Close(0);
}
private void Valider(object sender, EventArgs e)
{
int res;
if ((App.Current as App).Manager.SelectedGame == null)
{
throw new Exception();
@ -25,10 +36,26 @@ public partial class ReviewPopUp : Popup
bool isDouble = double.TryParse(Val.Text, NumberStyles.Float, CultureInfo.InvariantCulture, out double rate);
if (!string.IsNullOrWhiteSpace(Entrytxt.Text) && isDouble)
{
((App)App.Current).Manager.CurrentUser.AddReview((App.Current as App).Manager.SelectedGame, rate, Entrytxt.Text);
((App)App.Current).Manager.SaveGames();
Close();
if (rate < 0 || rate > 5) Error.Text = "Note invalide";
else
{
if (editing == true)
{
if (prevRev.Text != Entrytxt.Text) prevRev.EditReview(Entrytxt.Text);
prevRev.EditRate(rate);
(App.Current as App).Manager.SelectedGame.UpdateReviews();
res = 2;
}
else
{
((App)App.Current).Manager.CurrentUser.AddReview((App.Current as App).Manager.SelectedGame, rate, Entrytxt.Text);
res = 1;
}
((App)App.Current).Manager.SaveGames();
Close(res);
}
}
else Error.Children.Add(new Label { Text="Champ vide ou invalide", TextColor=Colors.Red });
else Error.Text = "Champ vide ou invalide";
}
}
}

@ -50,6 +50,10 @@
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<None Remove="Resources\Images\logo_stim.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui" Version="5.2.0" />
<PackageReference Include="MailKit" Version="4.0.0" />
@ -65,9 +69,6 @@
<Compile Update="DetailledPage - Copier.xaml.cs">
<DependentUpon>%(Filename)</DependentUpon>
</Compile>
<Compile Update="ReviewPopUp.xaml.cs">
<DependentUpon>ReviewPopUp.xaml</DependentUpon>
</Compile>
<Compile Update="LoginPage.xaml.cs">
<DependentUpon>LoginPage.xaml</DependentUpon>
</Compile>
@ -92,9 +93,6 @@
<MauiXaml Update="DetailledPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="ReviewPopUp.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="EntryPopup.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
@ -107,6 +105,9 @@
<MauiXaml Update="MessagePopup.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="ReviewPopUp.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="StarsContainer.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>

@ -4,166 +4,142 @@ namespace Test
{
public class TestGame
{
[Fact]
public void Constructor()
public static IEnumerable<object[]> GameData
=> new List<object[]>
{
new object[] {new Game("game", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game("", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game(null, "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game("game", "", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game("game", null, 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game("game", "description", 1111, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game("game", "description", 9999, new List<String> { "1", "2", "3" }, "cover", "www.link.com") },
new object[] {new Game("game", "description", 9999, null, "cover", "www.link.com") },
new object[] {new Game("game", "description", 2012, new List<String> { "1", "2" }, "cover", "www.link.com") },
new object[] {new Game("game", "description", 2012, new List<String> { "1", "2", "3" }, "", "www.link.com") },
new object[] {new Game("game", "description", 2012, new List<String> { "1", "2", "3" }, null, "www.link.com") },
new object[] {new Game("game", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "") },
new object[] {new Game("game", "description", 2012, new List<String> { "1", "2", "3" }, "cover", null) }
};
public static IEnumerable<object[]> GameDataUser =>
new List<object[]>
{
new object[]{GameData.ToList()[0], }
};
[Theory]
[MemberData(nameof(GameData))]
public void Constructor(Game game)
{
Game game = new("game", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.NotNull(game);
}
[Fact]
public void Name()
[Theory]
[MemberData(nameof(GameData))]
public void Name(Game game)
{
Game game = new("", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.False(game.Name == "");
Game game2 = new(null, "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.True(game2.Name == "Default");
Game game3 = new("good", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.Equal("good", game3.Name);
Assert.NotNull(game.Name);
Assert.NotEqual("", game.Name);
}
[Fact]
public void Cover()
[Theory]
[MemberData(nameof(GameData))]
public void Cover(Game game)
{
Game game = new("game", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com");
string coverofgame= game.Cover;
Assert.True(coverofgame == game.Cover);
Assert.NotNull(game.Cover);
Assert.NotEqual("", game.Cover);
}
[Fact]
public void Description()
{
Game game = new("name", "", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.False(game.Description == "");
Game game2 = new("name", null, 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.True(game2.Description=="Pas de description");
Game game3 = new("name", "good", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.Equal("good", game3.Description);
}
[Fact]
public void Year()
[Theory]
[MemberData(nameof(GameData))]
public void Description(Game game)
{
Assert.NotNull(game.Description);
Assert.NotEqual("", game.Description);
}
Game game = new("name", "description", 1111, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.Equal(2023, game.Year);
Game game2 = new("name", "description", 9999, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.Equal(2023, game2.Year);
Game game3 = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.Equal(2012, game3.Year);
[Theory]
[MemberData(nameof(GameData))]
public void Year(Game game)
{
Assert.True(game.Year >= 1970);
Assert.True(game.Year <= 2023);
}
[Fact]
public void Tags()
[Theory]
[MemberData(nameof(GameData))]
public void Tags(Game game)
{
Game game = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
Assert.NotNull(game.Tags);
Assert.Equal(new List<String> { "1", "2", "3" }, game.Tags);
Game game2 = new("name", "description", 2012, null, "cover", "www.link.com");
Assert.NotNull(game2.Tags);
Assert.Empty(game2.Tags);
Game game3 = new("name", "description", 2012, new List<String> {"1","2"}, "cover", "www.link.com");
Assert.NotNull(game3.Tags);
Assert.Equal(2,game3.Tags.Count);
}
[Fact]
public void Lien()
[Theory]
[MemberData(nameof(GameData))]
public void Lien(Game game)
{
Game game = new("name", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com");
Assert.NotNull(game.Lien);
Game game2 = new("name", "description", 2012, new List<String> { "1", "2", "3" }, "cover", null);
Assert.Equal("Pas de lien", game2.Lien);
Game game3 = new("name", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "");
Assert.Equal("Pas de lien", game3.Lien);
Assert.NotEqual("", game.Lien);
}
[Fact]
public void AddReview()
[Theory]
[MemberData(nameof(GameData))]
public void AddReview(Game game)
{
User user = new(null,"username", "biographie", "email@email.com", "Azerty123*");
Game game = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
var user = new User(null, "username", "biographie", "email@email.com", "Azerty123*");
user.AddReview(game, 2.5f, "bof");
user.AddReview(game, 4f, "bof++");
user.AddReview(game, 3f, "bof+");
Assert.NotEmpty(game.Reviews);
}
[Fact]
public void RemoveReview()
[Theory]
[MemberData(nameof(GameData))]
public void RemoveReview(Game game)
{
User user = new(null,"username", "biographie", "email@email.com", "Azerty123*");
User user2 = new(null,"username2", "biographie", "email2@email.com", "Azerty123*");
Game game = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
var user = new User(null, "username", "biographie", "email@email.com", "Azerty123*");
user.AddReview(game, 2.5f, "bof");
user.AddReview(game, 4f, "bof++");
user.AddReview(game, 3f, "bof+");
user2.RemoveSelfReview(game, 2.5f, "bof");
Assert.Equal(3, game.Reviews.Count);
user.RemoveSelfReview(game, 2.5f, "bof");
Assert.Equal(2, game.Reviews.Count);
Assert.Empty(game.Reviews);
}
[Fact]
public void ChangeName()
[Theory]
[MemberData(nameof(GameData))]
public void ChangeName(Game game)
{
Game game = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
game.NameChange("newName");
Assert.Equal("newName", game.Name);
}
[Fact]
public void ChangeDescription()
[Theory]
[MemberData(nameof(GameData))]
public void ChangeDescription(Game game)
{
Game game = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
game.DescChange("newDesc");
Assert.Equal("newDesc", game.Description);
}
[Fact]
public void ChangeYear()
[Theory]
[MemberData(nameof(GameData))]
public void ChangeYear(Game game)
{
Game game = new("name", "description", 2012, new List<String> {"1","2","3"}, "cover", "www.link.com");
game.YearChange(2020);
Assert.Equal(2020, game.Year);
}
[Fact]
public void ChangeTags()
[Theory]
[MemberData(nameof(GameData))]
public void ChangeTags(Game game)
{
Game game = new("name", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com");
game.NameChange("newName");
game.TagChange(new List<String> { "1", "2" });
Assert.Equal(2, game.Tags.Count);
game.TagChange(null);
Assert.Equal(2, game.Tags.Count);
game.TagChange(new List<String> { "1", "2","3","4" });
game.TagChange(new List<String> { "1", "2", "3", "4" });
Assert.Equal(2, game.Tags.Count);
}
[Fact]
public void Hash()
[Theory]
[MemberData(nameof(GameData))]
public void Hash(Game game)
{
Game game = new("name", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com");
Assert.Equal(game.Name.GetHashCode(), game.GetHashCode());
}
@ -174,12 +150,14 @@ namespace Test
Game game2 = new("name2", "description", 2020, new List<String> { "1" }, "cover2", "www.link.com");
Game? game3 = null;
string game4 = "";
Game game5 = new("name", "description2", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com");
Assert.False(game.Equals(game2 as Game));
Assert.False(game.Equals(game3 as object));
Assert.True(game.Equals(game as object));
Assert.False(game.Equals(game4 as object));
Assert.False(game.Equals(game2 as object));
Assert.True(game.Equals(game5 as Game));
}
[Fact]

@ -4,36 +4,43 @@ namespace Test
{
public class TestReview
{
[Fact]
public void Constructor()
public static IEnumerable<object[]> ReviewData
=> new List<object[]>
{
new object[] {new Review("User 1", 3, "rev")},
new object[] {new Review("User 1", -5.8f, "rev")},
new object[] {new Review("User 2", +5.8f, "rev") }
};
[Theory]
[MemberData(nameof(ReviewData))]
public void Constructor(Review rev)
{
Review rev = new("User 1", 3, "rev");
Assert.NotNull(rev);
}
[Fact]
public void Rate()
[Theory]
[MemberData(nameof(ReviewData))]
public void Rate(Review rev)
{
Review rev = new("User 1", -5.8f, "rev");
Review rev2 = new("User 2", 5.8f, "rev2");
Assert.Equal(0, rev.Rate);
Assert.Equal(0, rev2.Rate);
Assert.True(rev.Rate >= 0);
Assert.True(rev.Rate <= 5);
}
[Fact]
public void Text()
[Theory]
[MemberData(nameof(ReviewData))]
public void Text(Review rev)
{
Review rev = new("User 1", 3, "");
Review rev2 = new("User 2", 3, null);
Assert.Equal("Default", rev.Text);
Assert.Equal("Default", rev2.Text);
Assert.NotNull(rev.Text);
Assert.NotEqual("", rev.Text);
}
[Fact]
public void AuthorName()
[Theory]
[MemberData(nameof(ReviewData))]
public void AuthorName(Review rev)
{
Review rev = new("User 1", 3, "text");
Assert.NotNull(rev.AuthorName);
Assert.NotEqual("", rev.AuthorName);
}
[Fact]

@ -4,67 +4,72 @@ namespace Test
{
public class TestUser
{
[Fact]
public void Constructor()
public static IEnumerable<object[]> UserData
=> new List<object[]>
{
new object[] {new User(null, "username", "biographie", "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, "", "biographie", "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, null, "biographie", "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, "username", "biographie", "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, "username", "", "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, "username", null, "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, "username", "biographie", "adresse.mail@gmail.com", "Azerty123*") },
new object[] {new User(null, "username", "biographie", "", "Azerty123*") },
new object[] {new User(null, "username", "biographie", null, "Azerty123*") },
new object[] {new User(null, "username", "biographie", "adresse.mail@gmail.com", "Azerty123*") }
};
[Theory]
[MemberData(nameof(UserData))]
public void Constructor(User user)
{
User user = new(null,"username", "biographie", "adresse.mail@gmail.com", "Azerty123*");
Assert.NotNull(user);
}
[Fact]
public void Username()
[Theory]
[MemberData(nameof(UserData))]
public void Username(User user)
{
User user = new(null, "", "biographie", "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal("Default", user.Username);
User user2 = new(null, null, "biographie", "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal("Default",user2.Username);
Assert.NotNull(user.Username);
Assert.NotEqual("", user.Username);
}
[Fact]
public void Biographie()
[Theory]
[MemberData(nameof(UserData))]
public void Biographie(User user)
{
User user = new(null, "username", "", "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal("Pas de biographie", user.Biographie);
User user2 = new(null, "username", null, "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal("Default", user2.Biographie);
User user3 = new(null, "username", "biographie", "adresse.mail@gmail.com", "Azerty123*");
string biographieOfAnUser = user3.Biographie;
Assert.Equal("biographie", biographieOfAnUser);
Assert.NotNull(user.Biographie);
Assert.NotEqual("", user.Biographie);
}
[Fact]
public void Email()
[Theory]
[MemberData(nameof(UserData))]
public void Email(User user)
{
User user = new(null, "username", "biographie", "", "Azerty123*");
Assert.Equal("Default", user.Email);
User user2 = new(null, "username", "biographie", null, "Azerty123*");
Assert.Equal("Default", user2.Email);
Assert.NotNull(user.Email);
Assert.NotEqual("", user.Email);
}
[Fact]
public void Password()
{
Assert.Throws<ArgumentNullException>(() => new User (null, "username", "biographie", "adresse.mail@gmail.com", ""));
Assert.Throws<ArgumentNullException>(() => new User(null, "username", "biographie", "adresse.mail@gmail.com", ""));
Assert.Throws<ArgumentNullException>(() => new User(null, "username", "biography", "adresse.mail@gmail.com", null));
Assert.Throws<ArgumentNullException>(() => new User (null, "username", "biographie", "adresse.mail@gmail.com", "54az6e"));
Assert.Throws<ArgumentNullException>(() => new User(null, "username", "biographie", "adresse.mail@gmail.com", "54az6e"));
User user = new(null, "username", "bio", "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal("Azerty123*", user.Password);
}
[Fact]
public void UserImage()
[Theory]
[MemberData(nameof(UserData))]
public void UserImage(User user)
{
User user = new("userimage", "username", "bio", "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal("userimage", user.UserImage);
Assert.NotNull(user.UserImage);
Assert.NotEqual("", user.UserImage);
}
[Fact]
@ -86,7 +91,7 @@ namespace Test
public void ReviewAddingAndRemovingFromAGameViaUser()
{
User user = new(null, "username", "biographie", "adresse.mail@gmail.com", "Azerty123*");
Game game = new("name", "description", 2012, new List<String> { "1", "2", "3" },"cover", "www.link.com");
Game game = new("name", "description", 2012, new List<String> { "1", "2", "3" }, "cover", "www.link.com");
Assert.NotNull(user);
Assert.NotNull(game);
@ -108,10 +113,11 @@ namespace Test
Assert.False(user.Equals(user4 as object));
Assert.False(user.Equals(user2 as object));
}
[Fact]
public void Hashcode()
[Theory]
[MemberData(nameof(UserData))]
public void Hashcode(User user)
{
User user = new("userimage", "username", "biographie", "adresse.mail@gmail.com", "Azerty123*");
Assert.Equal(user.GetHashCode(), user.Username?.GetHashCode());
}
}

Loading…
Cancel
Save