Merge pull request 'xaml-C#/data-binding' (#50) from xaml-C#/data-binding into master
continuous-integration/drone/push Build is failing Details

Reviewed-on: #50
pull/52/head
Antoine PEREDERII 2 years ago
commit 003a5eb19c

@ -5,6 +5,10 @@ VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Banquale", "Banquale\Banquale.csproj", "{CB24D887-5DF3-4ED9-BAFF-DEA8F43253EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "Model\Model.csproj", "{5AF1A8C4-E970-43F7-B81A-83D706C3B1AE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTest", "UnitTest\UnitTest.csproj", "{F7D852DC-AC55-4164-A78C-EB4311F9D516}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -17,6 +21,14 @@ Global
{CB24D887-5DF3-4ED9-BAFF-DEA8F43253EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CB24D887-5DF3-4ED9-BAFF-DEA8F43253EE}.Release|Any CPU.Build.0 = Release|Any CPU
{CB24D887-5DF3-4ED9-BAFF-DEA8F43253EE}.Release|Any CPU.Deploy.0 = Release|Any CPU
{5AF1A8C4-E970-43F7-B81A-83D706C3B1AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5AF1A8C4-E970-43F7-B81A-83D706C3B1AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5AF1A8C4-E970-43F7-B81A-83D706C3B1AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5AF1A8C4-E970-43F7-B81A-83D706C3B1AE}.Release|Any CPU.Build.0 = Release|Any CPU
{F7D852DC-AC55-4164-A78C-EB4311F9D516}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F7D852DC-AC55-4164-A78C-EB4311F9D516}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F7D852DC-AC55-4164-A78C-EB4311F9D516}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F7D852DC-AC55-4164-A78C-EB4311F9D516}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
using Banquale.Stub;
using Banquale.DataContractPersistance;
@ -7,7 +7,7 @@ namespace Banquale;
public partial class App : Application
{
public Manager MyManager { get; private set; } = new Manager(new Stub.Stub() /*DataContractPersistance.DataContractPers()*/);
public Manager MyManager { get; private set; } = new Manager(new Stub.Stub() /*DataContractPersistance.DataContractPersXML()*/);
@ -15,7 +15,7 @@ public partial class App : Application
{
MyManager.DataLoad();
MyManager.Persistence = new DataContractPersistance.DataContractPers();
MyManager.Persistence = new DataContractPersistance.DataContractPersXML();
MyManager.DataSave();
InitializeComponent();

@ -53,7 +53,6 @@
<None Remove="Stub\" />
<None Remove="DataContractPersistance\" />
<None Remove="Views\Category\" />
<None Remove="Test\" />
<None Remove="Resources\Images\Sources\accounts.svg" />
<None Remove="Resources\Images\Sources\back_arrow_icon.svg" />
<None Remove="Resources\Images\Sources\dotnet_bot.svg" />
@ -71,12 +70,13 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Stub\" />
<Folder Include="DataContractPersistance\" />
<Folder Include="Views\Category\" />
<Folder Include="Test\" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Images\ImagesDictionary.xaml" />
<None Include="Resources\Images\images_dictionary.xaml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,57 @@
using Model;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.DataContractPersistance
{
public class DataContractPersJSON : IPersistenceManager
{
public string FilePath { get; set; } = FileSystem.Current.AppDataDirectory;
public string FileName { get; set; } = "DataSave.json";
public (List<Customer>, Consultant) DataLoad()
{
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.customer, data.consultant);
}
public void DataSave(List<Customer> cu, Consultant co)
{
DataToPersist data = new DataToPersist();
data.customer = cu;
data.consultant = co;
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist));
using (FileStream stream = File.Create(Path.Combine(FilePath, FileName)))
{
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(
stream,
System.Text.Encoding.UTF8,
false,
true))//<- this boolean says that we sant indentation
{
jsonSerializer.WriteObject(writer, data);
}
}
}
}
}

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -8,7 +8,7 @@ using System.Xml;
namespace Banquale.DataContractPersistance
{
public class DataContractPers : IPersistenceManager
public class DataContractPersXML : IPersistenceManager
{
//public string FilePath { get; set; } = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/datbase.xml";
@ -51,7 +51,8 @@ namespace Banquale.DataContractPersistance
public void DataSave(List<Customer> cu, Consultant co)
{
var serializer = new DataContractSerializer(typeof(DataToPersist));
var serializer = new DataContractSerializer(typeof(DataToPersist), new DataContractSerializerSettings() { PreserveObjectReferences = true });
// La deuxième partie sert à faire des références, cela sert à ne pas duppliquer l'écriture de certains attributs
if (!Directory.Exists(FilePath))
{

@ -1,5 +1,5 @@
using System;
using Banquale.Model;
using Model;
namespace Banquale.DataContractPersistance
{

@ -1,162 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.Model
{
[DataContract]
public class Account : INotifyPropertyChanged, IEquatable<Account>
{
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
[DataMember]
public double Balance
{
get => balance;
set
{
if (balance == value)
return;
balance = value;
OnPropertyChanged(nameof(Balance));
}
}
[DataMember]
private double balance;
[DataMember]
public string Name
{
get => name;
set
{
if (name == value)
return;
name = value;
OnPropertyChanged(nameof(Name));
}
}
[DataMember]
private string name;
[DataMember]
public string IBAN
{
get => iban;
set
{
if (iban == value)
return;
iban = value;
OnPropertyChanged(nameof(IBAN));
}
}
[DataMember]
private string iban;
[DataMember]
public string IBANHide
{
get => ibanHide;
set
{
if (ibanHide == value)
return;
ibanHide = value;
OnPropertyChanged(nameof(IBANHide));
}
}
[DataMember]
private string ibanHide;
[DataMember]
public List<Transactions> TransactionsList { get; set; } = new List<Transactions>();
//public bool DoTransactions(string name, string IBAN, float sum)
//{
// List<Transactions> transactions.add(sum);
// if()
// return true;
//}
public Account(int balance, string name, string iban)
{
Balance = balance;
Name = name;
IBAN = iban;
IBANHide = IBANToString();
}
internal static void DoTransactions(Entry name, Entry iban, Entry sum)
{
Debug.WriteLine(name.Text);
Debug.WriteLine(iban.Text);
Debug.WriteLine(sum.Text);
Debug.WriteLine("Transaction successed !");
}
//public bool DoRequest(string name, string IBAN, float sum)
//{
// List<Transactions> transactions.add(sum);
// if ()
// return true;
//}
//public void AskForHelp(string type, string type2, string message)
//{
// Console.WriteLine("Help button pressed !");
//}
internal static Message AskForHelp(Entry subject, Editor description)
{
Debug.WriteLine(subject.Text);
Debug.WriteLine(description.Text);
Debug.WriteLine("Help button pressed !");
//throw new NotImplementedException();
Message message = new Message(subject.Text, description.Text);
return message;
}
internal static void DoRequest(Entry name, Entry iBAN, Entry sum)
{
throw new NotImplementedException();
}
public string IBANToString()
{
char[] res = IBAN.ToCharArray();
for (int i = 5; i< IBAN.Length - 4; i++ )
{
if (res[i] == ' ')
continue;
res[i] = '*';
}
return new string(res);
}
public bool Equals(Account other)
{
if(other == null) return false;
else return other.IBAN.Equals(IBAN);
}
public override int GetHashCode()
{
return IBAN.GetHashCode();
}
}
}

@ -1,12 +0,0 @@
using System;
namespace Banquale.Model
{
public class Category
{
public Category()
{
}
}
}

@ -1,17 +0,0 @@
using System;
using System.Runtime.Serialization;
namespace Banquale.Model
{
[DataContract]
public class Consultant : Person
{
[DataMember]
public List<Message> MessagesList = new List<Message>();
public Consultant(string name, string firstName, uint id, string password) : base(name, firstName, id, password)
{
}
}
}

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.Model
{
[DataContract]
public class Customer : Person
{
[DataMember]
public List<Account> AccountsList { get; private set; } = new List<Account>();
//private uint NbAccounts { get; set; } = AccountsList.Count;
public Customer(string name, string firstName, string password) : base(name, firstName, password)
{}
}
}

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.Model
{
public interface IPersistenceManager
{
public (List<Customer>, Consultant) DataLoad();
void DataSave(List<Customer> cu, Consultant co);
}
}

@ -1,112 +0,0 @@
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
namespace Banquale.Model
{
[DataContract]
public class Manager : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
[DataMember]
public List<Customer> CustomersList { get; private set; } // devient un set
[DataMember]
public Consultant Consultant { get; private set; } // 1 SEUL consultant
public bool IsConsultant { get; set; } = false;
public Customer SelectedCustomer
{
get => selectedCustomer;
set
{
if (selectedCustomer == value)
return;
selectedCustomer = value;
OnPropertyChanged();
}
}
private Customer selectedCustomer;
public Account SelectedAccount
{
get => selectedAccount;
set
{
if (selectedAccount == value)
return;
selectedAccount = value;
OnPropertyChanged();
}
}
private Account selectedAccount;
public Transactions SelectedTransaction
{
get => selectedTransaction;
set
{
if (selectedTransaction == value)
return;
selectedTransaction = value;
OnPropertyChanged();
}
}
private Transactions selectedTransaction;
public IPersistenceManager Persistence { get; set; }
public Manager(IPersistenceManager persistence)
{
CustomersList = new List<Customer>();
Persistence = persistence;
}
public Manager()
{
CustomersList = new List<Customer>();
}
public bool AddCustomer(Customer MyCustomer)
{
CustomersList.Add(MyCustomer);
return true;
}
public Customer GetCustomer(int place) {
return CustomersList[place];
}
public void DataSave()
{
Persistence.DataSave(CustomersList, Consultant);
}
public void DataLoad()
{
var data = Persistence.DataLoad();
CustomersList.AddRange(data.Item1);
/*foreach (var j in data.Item1)
{
CustomersList.Add(j);
}*/
Consultant = data.Item2;
}
}
}

@ -1,23 +0,0 @@
using System;
using System.Runtime.Serialization;
namespace Banquale.Model
{
[DataContract]
public class Message
{
[DataMember]
public string Subject { get; private set; }
[DataMember]
public string Description { get; private set; }
public Message(string subject, string description)
{
Subject = subject;
Description = description;
}
}
}

@ -1,41 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Banquale.Model
{
[DataContract]
public class Person
{
[DataMember]
public string Name { get; private set; }
[DataMember]
public string FirstName { get; private set; }
[DataMember]
public uint Id { get; private set; }
[DataMember]
public string Password { get; private set; }
public Person(string name, string firstName, string password)
{
Name = name;
FirstName = firstName;
Id = 1;
Password = password;
}
public Person(string name, string firstName, uint id, string password)
{
Name = name;
FirstName = firstName;
Id = id;
Password = password;
}
}
}

@ -1,103 +0,0 @@
using System.ComponentModel;
using System.Runtime.Serialization;
namespace Banquale.Model
{
[DataContract(IsReference = true)]
public class Transactions : INotifyPropertyChanged
{
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
[DataMember]
public int Type
{
get => type;
set
{
if(type == value)
return;
type = value;
OnPropertyChanged(nameof(Type));
}
}
[DataMember]
private int type;
[DataMember]
public Double Sum
{
get => sum;
set
{
if (sum == value)
return;
sum = value;
OnPropertyChanged(nameof(Sum));
}
}
[DataMember]
private Double sum;
[DataMember]
public Account InvolvedAccounts
{
get => involvedAccounts;
set
{
if (involvedAccounts == value)
return;
involvedAccounts = value;
OnPropertyChanged(nameof(InvolvedAccounts));
}
}
[DataMember]
private Account involvedAccounts;
[DataMember]
public string Category
{
get => category;
set
{
if (category == value)
return;
category = value;
OnPropertyChanged(nameof(Category));
}
}
[DataMember]
private string category;
[DataMember]
public DateTime Date
{
get => date;
set
{
if (date == value)
return;
date = value;
OnPropertyChanged(nameof(Date));
}
}
[DataMember]
private DateTime date;
public Transactions(int type, Double sum, Account involvedAccounts, string category, DateTime date)
{
Type = type;
Sum = sum;
InvolvedAccounts = involvedAccounts;
Category = category;
Date = date;
}
public event PropertyChangedEventHandler PropertyChanged;
}
}

@ -1,6 +1,6 @@
using System;
using System.Diagnostics;
using Banquale.Model;
using Model;
namespace Banquale.Stub
{
@ -9,27 +9,27 @@ namespace Banquale.Stub
public (List<Customer>, Consultant) DataLoad()
{
Consultant Consultant = new Consultant("Consultant", "Consultant", 0, "Consultant");
Consultant Consultant = new Consultant("Consultant", "Consultant", "Consultant"); // toujours creer en premier le consultant
Consultant.MessagesList.Add(new Message("ZUvuzveu", "ZBUBUE"));
Consultant.MessagesList.Add(new Message("zcdz", "rvri"));
Consultant.MessagesList.Add(new Message("vjkebor", "rbv"));
Consultant.MessagesList.Add(new Message("alce", "ubec"));
Customer Customer1 = new Customer("Jacques", "Morice", "J'aimeLesFrites");
Customer Customer2 = new Customer("Francis", "Begore", "J'aimeLes");
Customer Customer3 = new Customer("Michel", "Boudout", "MonMdP");
Customer Customer1 = new Customer("Jacques", "Morice", "Hello");
Customer Customer2 = new Customer("Francis", "Begore", "Halo");
Customer Customer3 = new Customer("Michel", "Boudout", "Hola");
Account Account1 = new Account(999, "Tatouille", "FR76 9161 9581 6296 8415 2361 004");
Account Account2 = new Account(9510, "Despoints", "FR76 4785 8569 6914 4152 5263 003");
Account Account3 = new Account(3519, "Perotte", "FR76 6352 2541 4169 6958 5847 002");
Account Account1 = new Account(999, "Tatouille", "FR7691619581629684152361004");
Account Account2 = new Account(9510, "Despoints", "FR7647858569691441525263003");
Account Account3 = new Account(3519, "Perotte", "FR7663522541416969585847002");
Transactions Transactions1 = new Transactions(0, 55, Account1, "Test", new DateTime(2023, 6, 21, 15, 29, 20));
Transactions Transactions12 = new Transactions(0, 105, Account1, "Test", new DateTime(2023, 8, 17, 18, 54, 35));
Transactions Transactions13 = new Transactions(0, 187, Account1, "Test", new DateTime(2023, 5, 3, 8, 39, 49));
Transactions Transactions2 = new Transactions(1, 54.99, Account2, "Test", new DateTime(2022, 8, 15));
Transactions Transactions3 = new Transactions(0, 1000, Account3, "Test", new DateTime(2020, 9, 1, 20, 00, 00));
Transactions Transactions1 = new Transactions(true, 55, Account1, 1, new DateTime(2023, 6, 21, 15, 29, 20));
Transactions Transactions12 = new Transactions(true, 105, Account1, 2, new DateTime(2023, 8, 17, 18, 54, 35));
Transactions Transactions13 = new Transactions(true, 187, Account1, 3, new DateTime(2023, 5, 3, 8, 39, 49));
Transactions Transactions2 = new Transactions(false, 54.99, Account2, 4, new DateTime(2022, 8, 15));
Transactions Transactions3 = new Transactions(true, 1000, Account3, 5, new DateTime(2020, 9, 1, 20, 00, 00));
Debug.WriteLine(Customer1.Name, Customer1.Password);
List<Customer> CustomersList = new List<Customer>();

@ -1,14 +0,0 @@
using System;
using Banquale.Model;
namespace Banquale.Test
{
public class AccountTest
{
public AccountTest()
{
Account account = new Account(2000000, "Men", "How are you ?");
}
}
}

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Banquale.Views"
xmlns:model="clr-namespace:Banquale.Model"
x:Class="Banquale.Views.BalancePage"
Title="BalancePage"
Shell.NavBarIsVisible="False">
@ -71,9 +69,13 @@
Grid.Row="1"
HeightRequest="1"/>
<Label Text="{Binding TransactionsList[0].Id}"
x:Name="idLabel" />
<ListView ItemsSource="{Binding TransactionsList}"
Grid.Row="2"
SelectionMode="None">
<!--ItemSelected="Transactions_Clicked"-->
<ListView.ItemTemplate>
@ -93,10 +95,15 @@
</Grid.GestureRecognizers>
<Image
<!--<Image
Source="dotnet_bot.png"
Grid.Column="0"
MaximumHeightRequest="30"/>
MaximumHeightRequest="30"/>-->
<Label
Text="{Binding Id}"
Grid.Column="0"
x:Name="transactionId"/>
<Label
Text="{Binding Date, StringFormat='{0:ddd dd MMM yyyy}'}"

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
namespace Banquale.Views;
@ -15,15 +15,39 @@ public partial class BalancePage : ContentPage
}
public async void Transaction_Clicked(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
public async void Transactions_Clicked(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{
Mgr.SelectedTransaction = Mgr.SelectedAccount.TransactionsList[0];
//Mgr.SelectedTransaction = Mgr.PropertyChanged;
await Shell.Current.Navigation.PushAsync(new TransactionsPage());
}
public async void Balance_Clicked(object sender, EventArgs e)
{
await Shell.Current.Navigation.PushAsync(new NewPage1());
}
public async void Transaction_Clicked(Object sender, EventArgs e)
{
uint TransactionId = Convert.ToUInt32(idLabel.Text);
if (string.IsNullOrWhiteSpace(idLabel.Text))
{
await DisplayAlert("Erreur", "Aucune transaction présente", "OK");
return;
}
Transaction transaction = Mgr.SelectedAccount.TransactionsList.FirstOrDefault(u => u.Id == TransactionId);
if (transaction == null)
{
await DisplayAlert("Erreur", "La transaction n'éxiste pas !", "OK");
return;
}
Mgr.SelectedTransaction = transaction;
await Navigation.PushModalAsync(new TransactionsPage());
}
}

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
namespace Banquale.Views;
@ -13,16 +13,16 @@ public partial class ConnectionPage : ContentPage
public async void Connection_Clicked(Object sender, EventArgs e)
{
string currentId = ident.Text;
uint currentId = Convert.ToUInt32(ident.Text);
string password = pass.Text;
if (string.IsNullOrWhiteSpace(currentId) || string.IsNullOrWhiteSpace(password))
if (string.IsNullOrWhiteSpace(ident.Text) || string.IsNullOrWhiteSpace(password))
{
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK");
return;
}
if(currentId == "1")
if(currentId == 0)
{
Mgr.IsConsultant = true;
await Navigation.PushModalAsync(new ConsultantHomePage());
@ -33,21 +33,14 @@ public partial class ConnectionPage : ContentPage
Mgr.IsConsultant = false;
}
/*foreach(var Cu in Mgr.CustomersList)
{
if (Cu.Id == currentId)
Customer customer = Mgr.CustomersList.FirstOrDefault(u => u.Id == currentId && u.Password == password);
if (customer == null)
{
Mgr.SelectedCustomer = Mgr.CustomersList[currentId+1];
await DisplayAlert("Erreur", "Le mot de passe ou l'id entré est incorrect.", "OK");
return;
}
}*/
//if(int.Parse(currentId) in Mgr.CustomersList) // FONCTIONNE PAS
//{
// Mgr.SelectedCustomer = Mgr.CustomersList[int.Parse(currentId)];
//}
Mgr.SelectedCustomer = Mgr.CustomersList[0];// 0 à changer
Mgr.SelectedCustomer = customer;
await Navigation.PushModalAsync(new SwitchAccountPage());

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
namespace Banquale.Views;
public partial class HelpPage : ContentPage
@ -11,7 +11,7 @@ public partial class HelpPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e)
{
Message message = Account.AskForHelp(Subject, Message);
Message message = Account.AskForHelp(Subject.Text, Message.Text);
Mgr.Consultant.MessagesList.Add(message);
await Shell.Current.GoToAsync("//balance");
}

@ -1,6 +1,6 @@
using System.Diagnostics;
using System.Runtime.Serialization.DataContracts;
using Banquale.Model;
using Model;
namespace Banquale.Views;

@ -1,13 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:model="clr-namespace:Banquale.Model"
x:Class="Banquale.Views.NewPage1">
<ContentPage.BindingContext>
<model:Manager/>
</ContentPage.BindingContext>
<VerticalStackLayout>
<Label

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
namespace Banquale.Views;
public partial class NewPage1 : ContentPage

@ -8,7 +8,8 @@
<VerticalStackLayout
VerticalOptions="Center">
VerticalOptions="Center"
Spacing="10">
<ListView
ItemsSource="{Binding AccountsList}"
@ -21,7 +22,8 @@
<ViewCell>
<VerticalStackLayout
HeightRequest="84">
HeightRequest="84"
Margin="10">
<Button
Text="{Binding Name, StringFormat=' Compte Personnel {0}'}"

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
namespace Banquale.Views;
@ -14,7 +14,7 @@ public partial class SwitchAccountPage : ContentPage
public async void Transfer_Clicked(object sender, EventArgs e)
{
Mgr.SelectedAccount = Mgr.SelectedCustomer.AccountsList[0]; // 0 à changer
Mgr.SelectedAccount = Mgr.SelectedCustomer.AccountsList[0]; // 0 <EFBFBD> changer
await Shell.Current.GoToAsync("//balance");
}

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
using Banquale.Views.Category;
namespace Banquale.Views;

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
using Microsoft.Maui.Controls;
namespace Banquale.Views.Transfer;
@ -14,7 +14,7 @@ public partial class RequestPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e)
{
Account.DoRequest(Name, IBAN, Sum);
Account.DoRequest(Name.Text, IBAN.Text, Sum.Text);
await Shell.Current.GoToAsync("//balance");
}
}

@ -1,4 +1,4 @@
using Banquale.Model;
using Model;
namespace Banquale.Views.Transfer;

@ -26,7 +26,7 @@
Padding="3">
<Entry
Text="FR "
Text="FR"
Placeholder="IBAN"
HorizontalOptions="Center"
WidthRequest="280"

@ -1,4 +1,5 @@
using Banquale.Model;
using Model;
using System.Linq;
namespace Banquale.Views.Transfer;
public partial class TransferPage : ContentPage
@ -11,8 +12,26 @@ public partial class TransferPage : ContentPage
public async void Send_Clicked(Object sender, EventArgs e)
{
Account.DoTransactions(Name, IBAN, Sum);
await Shell.Current.GoToAsync("//balance");
int count = Mgr.SelectedAccount.TransactionsList.Count;
if (string.IsNullOrEmpty(Name.Text) || string.IsNullOrEmpty(IBAN.Text) || string.IsNullOrEmpty(Sum.Text))
{
await DisplayAlert("Erreur", "Tout les champs doivent être complétés", "OK");
return;
}
foreach (var cust in Mgr.CustomersList)
{
foreach (var acc in cust.AccountsList)
{
if(acc.Name == Name.Text && acc.IBAN == IBAN.Text)
{
acc.DoTransactions(acc, Convert.ToDouble(Sum.Text), true, count+1); // Type true car c'est un virement
await Shell.Current.Navigation.PopAsync();
return;
}
}
}
await DisplayAlert("Erreur", "Le compte n'existe pas", "OK");
}
}

@ -0,0 +1,202 @@
/// \file
/// \brief Définition de la classe Account.
/// \author Votre nom
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading.Tasks;
namespace Model
{
/// <summary>
/// Représente un compte bancaire.
/// </summary>
[DataContract]
public class Account : INotifyPropertyChanged
{
/// <summary>
/// Événement déclenché lorsqu'une propriété est modifiée.
/// </summary>
public event PropertyChangedEventHandler? PropertyChanged;
/// <summary>
/// Déclenche l'événement PropertyChanged pour une propriété donnée.
/// </summary>
/// <param name="propertyName">Nom de la propriété modifiée.</param>
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Obtient ou définit le solde du compte.
/// </summary>
[DataMember(Order = 3)]
public double Balance
{
get => balance;
set
{
if (balance == value)
return;
balance = value;
OnPropertyChanged(nameof(Balance));
}
}
[DataMember]
private double balance;
/// <summary>
/// Obtient ou définit le nom du titulaire du compte.
/// </summary>
[DataMember(Order = 1)]
public string Name
{
get => name;
set
{
if (name == value)
return;
name = value;
OnPropertyChanged(nameof(Name));
}
}
[DataMember]
private string name;
/// <summary>
/// Obtient ou définit le numéro IBAN du compte.
/// </summary>
[DataMember(Order = 2)]
public string IBAN
{
get => iban;
set
{
if (iban == value)
return;
iban = value;
OnPropertyChanged(nameof(IBAN));
}
}
[DataMember]
private string iban;
/// <summary>
/// Obtient une version masquée du numéro IBAN du compte.
/// </summary>
[DataMember(Order = 4)]
public string IBANHide
{
get => ibanHide;
set
{
if (ibanHide == value)
return;
ibanHide = value;
OnPropertyChanged(nameof(IBANHide));
}
}
[DataMember]
private string ibanHide;
/// <summary>
/// Obtient ou définit la liste des transactions effectuées sur le compte.
/// </summary>
[DataMember(Order = 5)]
public List<Transaction> TransactionsList { get; set; } = new List<Transaction>();
/// <summary>
/// Effectue une transaction entre le compte courant et un compte tiers.
/// </summary>
/// <param name="involvedAccount">Compte tiers impliqué dans la transaction.</param>
/// <param name="sum">Somme de la transaction.</param>
/// <param name="type">Type de transaction (débit ou crédit).</param>
/// <param name="nb">Numéro de la transaction.</param>
public void DoTransactions(Account involvedAccount, Double sum, bool type, int nb)
{
if (type) // si le type est True => c'est un débit, on doit donc ajouter la transaction pour l'autre compte
{
Transaction transaction = new Transaction(type, sum, involvedAccount, nb, DateTime.Now);
TransactionsList.Add(transaction);
Balance = Balance - sum;
involvedAccount.DoTransactions(this, sum, !type, nb + 1);
}
else // Sinon, c'est un crédit, on a juste à l'ajouter à notre liste de transactions
{
TransactionsList.Add(new Transaction(type, sum, involvedAccount, nb, DateTime.Now));
Balance = Balance + sum;
}
}
/// <summary>
/// Constructeur de la classe Account.
/// </summary>
/// <param name="balance">Solde initial du compte.</param>
/// <param name="name">Nom du titulaire du compte.</param>
/// <param name="iban">Numéro IBAN du compte.</param>
public Account(Double balance, string name, string iban)
{
Balance = balance;
Name = name;
IBAN = iban;
IBANHide = IBANToString();
}
/// <summary>
/// Demande d'aide pour un compte.
/// </summary>
/// <param name="subject">Sujet de la demande d'aide.</param>
/// <param name="description">Description de la demande d'aide.</param>
/// <returns>Un message d'aide.</returns>
public static Message AskForHelp(string subject, string description)
{
Debug.WriteLine(subject);
Debug.WriteLine(description);
Debug.WriteLine("Help button pressed !");
Message message = new Message(subject, description);
return message;
}
/// <summary>
/// Convertit le numéro IBAN en une version masquée.
/// </summary>
/// <returns>Le numéro IBAN masqué.</returns>
public string IBANToString()
{
char[] res = IBAN.ToCharArray();
for (int i = 5; i < IBAN.Length - 4; i++)
{
if (res[i] == ' ')
continue;
res[i] = '*';
}
return new string(res);
}
/// <summary>
/// Vérifie si deux comptes sont égaux en comparant leur numéro IBAN.
/// </summary>
/// <param name="other">Compte à comparer.</param>
/// <returns>True si les comptes sont égaux, False sinon.</returns>
public bool Equals(Account other)
{
if (other == null) return false;
else return other.IBAN.Equals(IBAN);
}
/// <summary>
/// Obtient le code de hachage du compte basé sur le numéro IBAN.
/// </summary>
/// <returns>Le code de hachage.</returns>
public override int GetHashCode()
{
return IBAN.GetHashCode();
}
}
}

@ -0,0 +1,32 @@
/// \file
/// \brief Définition de la classe Consultant.
/// \author Votre nom
using System;
using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Représente un consultant.
/// </summary>
[DataContract]
public class Consultant : Person
{
/// <summary>
/// Liste des messages du consultant.
/// </summary>
[DataMember]
public List<Message> MessagesList = new List<Message>();
/// <summary>
/// Constructeur de la classe Consultant.
/// </summary>
/// <param name="name">Nom du consultant.</param>
/// <param name="firstName">Prénom du consultant.</param>
/// <param name="password">Mot de passe du consultant.</param>
public Consultant(string name, string firstName, string password) : base(name, firstName, password)
{
}
}
}

@ -0,0 +1,45 @@
/// \file
/// \brief Définition de la classe Customer.
/// \author Votre nom
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Représente un client.
/// </summary>
[DataContract]
public class Customer : Person, IEquatable<Customer>//, IComparable<Customer>
{
/// <summary>
/// Liste des comptes du client.
/// </summary>
[DataMember]
public List<Account> AccountsList { get; private set; } = new List<Account>();
/// <summary>
/// Constructeur de la classe Customer.
/// </summary>
/// <param name="name">Nom du client.</param>
/// <param name="firstName">Prénom du client.</param>
/// <param name="password">Mot de passe du client.</param>
public Customer(string name, string firstName, string password) : base(name, firstName, password)
{}
public bool Equals(Customer? other)
{
if (other == null) return false;
else return other.Id.Equals(Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
}

@ -0,0 +1,28 @@
/// \file
/// \brief Définition de l'interface IPersistenceManager.
/// \author Votre nom
using System;
using System.Collections.Generic;
namespace Model
{
/// <summary>
/// Interface pour la gestion de la persistance des données.
/// </summary>
public interface IPersistenceManager
{
/// <summary>
/// Charge les données depuis une source de persistance.
/// </summary>
/// <returns>Un tuple contenant la liste des clients et le consultant.</returns>
(List<Customer>, Consultant) DataLoad();
/// <summary>
/// Enregistre les données dans une source de persistance.
/// </summary>
/// <param name="cu">La liste des clients à enregistrer.</param>
/// <param name="co">Le consultant à enregistrer.</param>
void DataSave(List<Customer> cu, Consultant co);
}
}

@ -0,0 +1,156 @@
/// \file
/// \brief Définition de la classe Manager.
/// \author Votre nom
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Classe représentant le gestionnaire du système.
/// </summary>
[DataContract]
public class Manager : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
void OnPropertyChanged([CallerMemberName] string? propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
/// <summary>
/// Liste des clients gérés par le gestionnaire.
/// </summary>
[DataMember]
public List<Customer> CustomersList { get; private set; } // devient un set
/// <summary>
/// Consultant assigné au gestionnaire.
/// </summary>
[DataMember]
public Consultant Consultant { get; private set; } // 1 SEUL consultant
/// <summary>
/// Indique si le gestionnaire est un consultant.
/// </summary>
public bool IsConsultant { get; set; } = false;
/// <summary>
/// Client sélectionné par le gestionnaire.
/// </summary>
public Customer SelectedCustomer
{
get => selectedCustomer;
set
{
if (selectedCustomer == value)
return;
selectedCustomer = value;
OnPropertyChanged();
}
}
private Customer selectedCustomer;
/// <summary>
/// Compte sélectionné par le gestionnaire.
/// </summary>
public Account SelectedAccount
{
get => selectedAccount;
set
{
if (selectedAccount == value)
return;
selectedAccount = value;
OnPropertyChanged();
}
}
private Account selectedAccount;
/// <summary>
/// Transaction sélectionnée par le gestionnaire.
/// </summary>
public Transaction SelectedTransaction
{
get => selectedTransaction;
set
{
if (selectedTransaction == value)
return;
selectedTransaction = value;
OnPropertyChanged();
}
}
private Transaction selectedTransaction;
/// <summary>
/// Gestionnaire de persistance utilisé par le gestionnaire.
/// </summary>
public IPersistenceManager Persistence { get; set; }
/// <summary>
/// Constructeur du gestionnaire avec un gestionnaire de persistance spécifié.
/// </summary>
/// <param name="persistence">Gestionnaire de persistance.</param>
public Manager(IPersistenceManager persistence)
{
CustomersList = new List<Customer>();
Persistence = persistence;
}
/// <summary>
/// Constructeur du gestionnaire sans gestionnaire de persistance.
/// </summary>
public Manager()
{
CustomersList = new List<Customer>();
}
/// <summary>
/// Ajoute un client à la liste des clients gérés par le gestionnaire.
/// </summary>
/// <param name="myCustomer">Client à ajouter.</param>
/// <returns>True si l'ajout est réussi, sinon False.</returns>
public bool AddCustomer(Customer myCustomer)
{
CustomersList.Add(myCustomer);
return true;
}
/// <summary>
/// Récupère le client à la position spécifiée dans la liste des clients.
/// </summary>
/// <param name="place">Position du client.</param>
/// <returns>Le client à la position spécifiée.</returns>
public Customer GetCustomer(int place)
{
return CustomersList[place];
}
/// <summary>
/// Enregistre les données dans la source de persistance.
/// </summary>
public void DataSave()
{
Persistence.DataSave(CustomersList, Consultant);
}
/// <summary>
/// Charge les données depuis la source de persistance.
/// </summary>
public void DataLoad()
{
var data = Persistence.DataLoad();
CustomersList.AddRange(data.Item1);
Consultant = data.Item2;
}
}
}

@ -0,0 +1,39 @@
/// \file
/// \brief Définition de la classe Message.
/// \author Votre nom
using System;
using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Classe représentant un message.
/// </summary>
[DataContract]
public class Message
{
/// <summary>
/// Sujet du message.
/// </summary>
[DataMember]
public string Subject { get; private set; }
/// <summary>
/// Description du message.
/// </summary>
[DataMember]
public string Description { get; private set; }
/// <summary>
/// Constructeur de la classe Message.
/// </summary>
/// <param name="subject">Sujet du message.</param>
/// <param name="description">Description du message.</param>
public Message(string subject, string description)
{
Subject = subject;
Description = description;
}
}
}

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

@ -0,0 +1,62 @@
/// \file
/// \brief Définition de la classe Person.
/// \author Votre nom
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Classe représentant une personne.
/// </summary>
[DataContract]
public class Person
{
/// <summary>
/// Nom de la personne.
/// </summary>
[DataMember]
public string Name { get; private set; }
/// <summary>
/// Prénom de la personne.
/// </summary>
[DataMember]
public string FirstName { get; private set; }
/// <summary>
/// Identifiant de la personne.
/// </summary>
[DataMember]
public uint Id { get; private set; }
/// <summary>
/// Compteur d'identifiants.
/// </summary>
public static uint id { get; set; } = 0;
/// <summary>
/// Mot de passe de la personne.
/// </summary>
[DataMember]
public string Password { get; private set; }
/// <summary>
/// Constructeur de la classe Person.
/// </summary>
/// <param name="name">Nom de la personne.</param>
/// <param name="firstName">Prénom de la personne.</param>
/// <param name="password">Mot de passe de la personne.</param>
public Person(string name, string firstName, string password)
{
Name = name;
FirstName = firstName;
Id = id;
Password = password;
id++;
}
}
}

@ -0,0 +1,141 @@
using System.ComponentModel;
using System.Runtime.Serialization;
namespace Model
{
/// <summary>
/// Represents a transaction.
/// </summary>
[DataContract(IsReference = true)]
public class Transaction : INotifyPropertyChanged
{
/// <summary>
/// Occurs when a property value changes.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Gets the unique identifier of the transaction.
/// </summary>
[DataMember(Order = 1)]
public int Id { get; private set; }
/// <summary>
/// Gets or sets the type of the transaction (debit or credit).
/// </summary>
[DataMember(Order = 2)]
public bool Type
{
get => type;
set
{
if (type == value)
return;
type = value;
OnPropertyChanged(nameof(Type));
}
}
[DataMember]
private bool type;
/// <summary>
/// Gets or sets the sum of the transaction.
/// </summary>
[DataMember(Order = 3)]
public double Sum
{
get => sum;
set
{
if (sum == value)
return;
sum = value;
OnPropertyChanged(nameof(Sum));
}
}
[DataMember]
private double sum;
/// <summary>
/// Gets or sets the account(s) involved in the transaction.
/// </summary>
[DataMember(Order = 4)]
public Account InvolvedAccounts
{
get => involvedAccounts;
set
{
if (involvedAccounts == value)
return;
involvedAccounts = value;
OnPropertyChanged(nameof(InvolvedAccounts));
}
}
[DataMember]
private Account involvedAccounts;
/// <summary>
/// Gets or sets the category of the transaction.
/// </summary>
[DataMember(Order = 5)]
public string Category
{
get => category;
set
{
if (category == value)
return;
category = value;
OnPropertyChanged(nameof(Category));
}
}
[DataMember]
private string? category;
/// <summary>
/// Gets or sets the date of the transaction.
/// </summary>
[DataMember(Order = 6)]
public DateTime Date
{
get => date;
set
{
if (date == value)
return;
date = value;
OnPropertyChanged(nameof(Date));
}
}
[DataMember]
private DateTime date;
/// <summary>
/// Initializes a new instance of the <see cref="Transaction"/> class.
/// </summary>
/// <param name="type">The type of the transaction (debit or credit).</param>
/// <param name="sum">The sum of the transaction.</param>
/// <param name="involvedAccounts">The account(s) involved in the transaction.</param>
/// <param name="id">The unique identifier of the transaction.</param>
/// <param name="date">The date of the transaction.</param>
public Transaction(bool type, double sum, Account involvedAccounts, int id, DateTime date)
{
Type = type;
Sum = sum;
Id = id;
InvolvedAccounts = involvedAccounts;
Date = date;
}
public void ChangeCategory(string newCateg)
{
Category = newCateg;
}
}
}

@ -0,0 +1,70 @@
/// \file
/// \brief Fichier de test pour la classe Account.
/// \author Votre nom
using Model;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.Serialization;
namespace UnitTest
{
/// <summary>
/// Classe de test pour la classe Account.
/// </summary>
class AccountTest
{
/// <summary>
/// Méthode principale du test.
/// </summary>
/// <param name="args">Arguments de ligne de commande.</param>
static void Main(string[] args)
{
// Création de deux comptes
Account account1 = new Account(1000, "John Doe", "FR123456789");
Account account2 = new Account(500, "Jane Smith", "FR987654321");
// Affichage des informations des comptes
Console.WriteLine("Compte 1:");
Console.WriteLine($"Nom: {account1.Name}");
Console.WriteLine($"IBAN: {account1.IBANHide}");
Console.WriteLine($"Solde: {account1.Balance}");
Console.WriteLine("\nCompte 2:");
Console.WriteLine($"Nom: {account2.Name}");
Console.WriteLine($"IBAN: {account2.IBANHide}");
Console.WriteLine($"Solde: {account2.Balance}");
// Effectuer une transaction entre les comptes
double amount = 200;
Console.WriteLine($"\nEffectuer une transaction de {amount} du compte 1 vers le compte 2...");
account1.DoTransactions(account2, amount, true, 1);
// Affichage des informations des comptes après la transaction
Console.WriteLine("\nAprès la transaction:");
Console.WriteLine("Compte 1:");
Console.WriteLine($"Nom: {account1.Name}");
Console.WriteLine($"IBAN: {account1.IBANHide}");
Console.WriteLine($"Solde: {account1.Balance}");
Console.WriteLine("\nCompte 2:");
Console.WriteLine($"Nom: {account2.Name}");
Console.WriteLine($"IBAN: {account2.IBANHide}");
Console.WriteLine($"Solde: {account2.Balance}");
// Demander de l'aide
string helpSubject = "Besoin d'aide";
string helpDescription = "Je rencontre un problème avec mon compte.";
Message helpMessage = Account.AskForHelp(helpSubject, helpDescription);
Console.WriteLine($"\nDemande d'aide envoyée : {helpMessage}");
// Comparaison de deux comptes
Console.WriteLine("\nComparaison des comptes...");
bool areEqual = account1.Equals(account2);
Console.WriteLine($"Les comptes sont-ils égaux ? {areEqual}");
Console.ReadLine();
}
}
}

@ -0,0 +1,11 @@
using System;
namespace UnitTest
{
public class ConsultantTest
{
public ConsultantTest()
{
}
}
}

@ -1,5 +1,5 @@
using System;
namespace Banquale.Test
namespace UnitTest
{
public class CustomerTest
{

@ -1,5 +1,5 @@
using System;
namespace Banquale.Test
namespace UnitTest
{
public class ManagerTest
{

@ -0,0 +1,28 @@
using Model;
using System;
namespace UnitTest
{
/// <summary>
/// Classe de test pour la classe Message.
/// </summary>
public class MessageTest
{
/// <summary>
/// Point d'entrée du programme de test.
/// </summary>
/// <param name="args">Arguments de ligne de commande.</param>
static void Main(string[] args)
{
// Création d'un message
Message message = new Message("Important", "Ceci est un message important.");
// Affichage des informations du message
Console.WriteLine("Message:");
Console.WriteLine($"Sujet: {message.Subject}");
Console.WriteLine($"Description: {message.Description}");
Console.ReadLine();
}
}
}

@ -0,0 +1,11 @@
using System;
namespace UnitTest
{
public class PersonTest
{
public PersonTest()
{
}
}
}

@ -0,0 +1,38 @@
/// \file
/// \brief Fichier de test pour la classe Transaction.
/// \author Votre nom
using Model;
using System;
namespace UnitTest
{
/// <summary>
/// Classe de test pour la classe Transaction.
/// </summary>
class TransactionTest
{
/// <summary>
/// Méthode principale du test.
/// </summary>
/// <param name="args">Arguments de ligne de commande.</param>
static void Main(string[] args)
{
// Création d'un compte
Account account = new Account(1000, "John Doe", "FR123456789");
// Création d'une transaction
Transaction transaction = new Transaction(true, 200, account, 1, DateTime.Now);
// Affichage des informations de la transaction
Console.WriteLine("Transaction:");
Console.WriteLine($"Type: {(transaction.Type ? "Débit" : "Crédit")}");
Console.WriteLine($"Somme: {transaction.Sum}");
Console.WriteLine($"Compte impliqué: {transaction.InvolvedAccounts.Name}");
Console.WriteLine($"Catégorie: {transaction.Category}");
Console.WriteLine($"Date: {transaction.Date}");
Console.ReadLine();
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<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>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,14 @@
using System.Diagnostics;
using Model;
namespace UnitTest;
public class UnitTest1
{
[Fact]
public void Test1()
{
Account Remi = new Account(900, "Remi", "FR00299209");
Debug.WriteLine(Remi.Balance);
}
}

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