Mise en place de l'architecture du projet API

pull/2/head
Victor Perez NGOUNOU 2 years ago
commit a6d03b2dcd

@ -0,0 +1,66 @@
kind: pipeline
type: docker
name: default
trigger:
event:
- push
steps:
- name: build
image: mcr.microsoft.com/dotnet/sdk:6.0
volumes:
- name: docs
path: /docs
commands:
- cd Sources/
- dotnet restore Solution.sln
- dotnet build Solution.sln -c Release --no-restore
- dotnet publish Solution.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release
- name: tests
image: mcr.microsoft.com/dotnet/sdk:6.0
commands:
- cd Sources/
- dotnet restore Solution.sln
- dotnet test Solution.sln --no-restore
depends_on: [build]
- name: code-analysis
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dronesonarplugin-dotnet6
commands:
- cd Sources/
- dotnet restore Solution.sln
- dotnet sonarscanner begin /k:BowlingScoreApp /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**,BowlingApp/**,BowlingEF/**,Business/**,BowlingMaping/**,BowlingStub/**" /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
- dotnet build Solution.sln -c Release --no-restore
- dotnet test Solution.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
- dotnet publish Solution.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release
- dotnet sonarscanner end /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
secrets: [ SECRET_SONAR_LOGIN ]
settings:
# accessible en ligne de commande par ${PLUGIN_SONAR_HOST}
sonar_host: https://codefirst.iut.uca.fr/sonar/
# accessible en ligne de commande par ${PLUGIN_SONAR_TOKEN}
sonar_token:
from_secret: SECRET_SONAR_LOGIN
depends_on: [tests]
- name: generate-and-deploy-docs
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer
failure: ignore
volumes:
- name: docs
path: /docs
commands:
#- cd Documentation/doxygen
#- doxygen Doxyfile
- /entrypoint.sh
when:
branch:
- master
depends_on: [ build ]
volumes:
- name: docs
temp: {}

430
.gitignore vendored

@ -0,0 +1,430 @@
# ---> VisualStudio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
# ---> macOS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
/Sources/BowlingApp/bowling.db-shm
/Sources/BowlingApp/bowling.db-wal

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because it is too large Load Diff

@ -0,0 +1,8 @@
<html><body>
<p>
<hr size="1"/><address style="text-align: right;"><small>Generated on $datetime with &nbsp;
<img src="CodeFirst.png" alt="Code#0" align="middle" border="0" height="40px"/>
by Doxygen version $doxygenversion</small></address>
</p>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

@ -0,0 +1,98 @@
[![Build Status](https://codefirst.iut.uca.fr/api/badges/victor_perez.ngounou/BowlingScoreApp/status.svg)](https://codefirst.iut.uca.fr/victor_perez.ngounou/BowlingScoreApp)
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=alert_status&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Bugs](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=bugs&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Code Smells](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=code_smells&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Coverage](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=coverage&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Duplicated Lines (%)](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=duplicated_lines_density&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=ncloc&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Maintainability Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=sqale_rating&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Reliability Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=reliability_rating&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Security Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=security_rating&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Technical Debt](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=sqale_index&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
[![Vulnerabilities](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=vulnerabilities&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
# BowlingScoreApp
Welcome on the BowlingScoreApp project!
<img src="Documentation/doc_images/bowling-157933.png" height=40/>
## Description
Ce projet est une application de gestion de score de bowling.
l'application vas permettre de:
* Gérer les scores de plusieurs joueurs en même temps.
* Gérer les matchs en équipe, en individuel ou en solo.
* consulter les statistiques des joueurs.
* consulter les statistiques des matchs.
* Consulter l'historique des matchs.
## Installation
### Requirements
* C# 8.0
* .NET Core 6.0
* Visual Studio 2022
* Entity Framework Core 6.0
* SQLite 3.36.0
* xUnit 2.4.1
### Clone
Clone this repo to your local machine using `https://codefirst.iut.uca.fr/git/victor_perez.ngounou/BowlingScoreApp.git`
* [Git](https://git-scm.com) - Download and Install Git.
* [Visual Studio](https://visualstudio.microsoft.com/fr/) - Download and Install Visual Studio.
* [SQLite](https://www.sqlite.org/index.html) - Download and Install SQLite.
* [xUnit](https://xunit.net/) - Download and Install xUnit.
* [Entity Framework Core](https://docs.microsoft.com/fr-fr/ef/core/) - Download and Install Entity Framework Core.
### Install Entity Framework Core Tools
```shell
$ dotnet tool install --global dotnet-ef
```
### Setup
* Ouvrir le projet dans Visual Studio.
* Lancez le projet en mode debug.
* Dans le menu déroulant, sélectionnez "BowlingApp" puis "Package Manager Console".
* Dans la console, tapez la commande suivante:
```shell
$ dotnet ef database update
```
* L'application est prête à être utilisée.
## Usage
* Open the solution in Visual Studio 2022
* Build the solution
* Run the application
## Contributeurs
* [Victor Perez NGOUNOU](https://codefirst.iut.uca.fr/git/victor_perez.ngounou)
* [Mamadou Elaphi ARAFA](https://codefirst.iut.uca.fr/git/mamadou_elaphi.arafa)
* [Augustin AFFOGNON](https://codefirst.iut.uca.fr/git/augustin.affognon)
## Support
Contactez-moi à l'un des endroits suivants !
* Website at <a href="https://codefirst.iut.uca.fr/git/victor_perez.ngounou" target="_blank">`https://codefirst.iut.uca.fr/git/victor_perez.ngounou`</a>
* Email at <a href="mailto:victor_perez.ngounou@etu.uca.fr" target="_blank">`victor_perez.ngounou@etu.uca.fr`</a>
## License
[![License](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=BowlingScoreApp&metric=license&token=d89d41f6a247037395d41fe6f40f53a402943bd9)](https://codefirst.iut.uca.fr/sonar/dashboard?id=BowlingScoreApp)
- **[MIT license](http://opensource.org/licenses/mit-license.php)**

@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/contentModel.xml
/projectSettingsUpdater.xml
/.idea.Solution.iml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="bowling" uuid="39137f9e-e73a-49e0-b4a1-18e3644baae1">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/BowlingApi/bowling.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>11</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BowlingService\BowlingService.csproj" />
<ProjectReference Include="..\Mapper\Mapper.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="bowling.db">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

@ -0,0 +1,45 @@
using BowlingEF.Entities;
using BowlingService.Interfaces;
using Microsoft.AspNetCore.Mvc;
namespace BowlingApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class JoueurController:Controller
{
private IJoueurService _joueurService;
public JoueurController(IJoueurService joueurService)
{
_joueurService = joueurService;
}
[HttpGet]
public IActionResult Get()
{
return Ok(_joueurService.GetAll());
}
[HttpGet("{name}")]
public IActionResult Get(string name)
{
return Ok(_joueurService.GetDataWithName(name));
}
[HttpPost]
public IActionResult Post([FromBody] JoueurDTO joueur)
{
_joueurService.Add(joueur);
return Ok();
}
[HttpPut]
public IActionResult Put([FromBody] JoueurDTO joueur)
{
_joueurService.Update(joueur);
return Ok();
}
}

@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Mvc;
namespace BowlingApi.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

@ -0,0 +1,37 @@
using AutoMapper;
using BowlingLib.Model;
using BowlingRepository;
using BowlingRepository.Interface;
using BowlingService;
using BowlingService.Interfaces;
using Business;
using Mapper;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddAutoMapper(typeof(JoueurProfile));
builder.Services.AddScoped<IJoueurService, JoueurService>();
builder.Services.AddScoped<IJoueurRepository, JoueurRepository>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

@ -0,0 +1,41 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:49680",
"sslPort": 44320
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5229",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7097;http://localhost:5229",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

@ -0,0 +1,12 @@
namespace BowlingApi;
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

@ -0,0 +1,27 @@
using BowlingEF.Entities;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingEF.Context
{
/// <summary>
/// Cette classe est le contexte de la base de données qui permet de faire le lien entre les objets et la base de données
/// </summary>
public class BowlingContext : DbContext
{
public DbSet<JoueurEntity> Joueurs { get; set; }
public DbSet<EquipeEntity> Equipes { get; set; }
public DbSet<PartieEntity> Parties { get; set; }
public DbSet<FrameEntity> Frames { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=bowling.db");
}
}
}

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des equipes
/// </summary>
public class EquipeEntity
{
#region Propriétés
public long Id { get; set; }
public string Nom { get; set; }
public ICollection<JoueurEntity> Joueurs { get; set; }
#endregion
#region Constructeurs
public EquipeEntity()
{
Joueurs = new List<JoueurEntity>();
}
#endregion
}
}

@ -0,0 +1,26 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des frames
/// </summary>
public class FrameEntity
{
#region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public int Numero { get; set; }
[Required]
public int Lancer1 { get; set; }
[Required]
public int Lancer2 { get; set; }
public int Lancer3 { get; set; }
public PartieEntity Partie { get; set; }
#endregion
}
}

@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des Joueurs
/// </summary>
public class JoueurEntity
{
#region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public string Pseudo { get; set; }
public ICollection<PartieEntity> PartieEntities { get; set; } = new List<PartieEntity>();
#endregion
}
}

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des parties
/// </summary>
public class PartieEntity
{
#region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("JoueurForeignKey")]
public JoueurEntity Joueur { get; set; }
[Required]
public DateTime Date { get; set; }
public ICollection<FrameEntity> Frames { get; set; }
[Required]
public int? Score { get; set; }
#endregion
#region Constructors
public PartieEntity()
{
Frames = new List<FrameEntity>();
}
#endregion
}
}

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<WarningLevel>4</WarningLevel>
</PropertyGroup>
</Project>

@ -0,0 +1,123 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingLib.Model
{
/// <summary>
/// Classe Model Equipe
/// </summary>
public class Equipe:IEquatable<Equipe>
{
#region Propiéters
public string Nom { get; private set; }
public long Id { get; private set; }
public ReadOnlyCollection<Joueur> Joueurs { get; private set; }
private readonly List<Joueur> joueurs = new List<Joueur>();
#endregion
#region Construteurs
public Equipe(string nom)
{
Nom = nom;
Joueurs = new ReadOnlyCollection<Joueur>(this.joueurs);
}
public Equipe(long id, string nom, params Joueur[] joueurs)
{
Id = id;
Nom = nom;
Joueurs = new ReadOnlyCollection<Joueur>(this.joueurs);
AjouterJoueurs(joueurs);
}
public Equipe(string nom, params Joueur[] joueurs)
: this(0, nom, joueurs) {}
#endregion
#region Méthodes
/// <summary>
/// Ajoute une liste de joueur à l'équipe
/// </summary>
/// <param name="joueurs"></param>
/// <returns></returns>
public IEnumerable<Joueur> AjouterJoueurs(params Joueur[] joueurs)
{
List<Joueur> result = new();
result.AddRange(joueurs.Where(a => AjouterJoueur(a)));
return result;
}
/// <summary>
/// Ajouter un joueur s'il n'exciste pas dans la bd
/// </summary>
/// <param name="joueur"></param>
/// <returns></returns>
public bool AjouterJoueur(Joueur joueur)
{
if (!IsExist(joueur))
{
joueurs.Add(joueur);
return true;
}
else
{
return false;
}
}
/// <summary>
/// Supprimer un joueur
/// </summary>
/// <param name="joueur"></param>
public void SupprimerJoueur(Joueur joueur)
{
joueurs.Remove(joueur);
}
/// <summary>
/// Fonction permettant de vérifier si un joueur existe déjà dans la liste (l'équipe)
/// </summary>
/// <param name="nouvJoueur"></param>
/// <returns></returns>
public bool IsExist(Joueur nouvJoueur)
{
if (joueurs.Contains(nouvJoueur))
return true;
return false;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null)) return false;
if (ReferenceEquals(obj, this)) return true;
if (GetType() != obj.GetType()) return false;
return Equals(obj as Equipe);
}
public override int GetHashCode()
{
return joueurs.GetHashCode();
}
public bool Equals(Equipe other)
{
return joueurs.Equals(other.joueurs);
}
#endregion
}
}

@ -0,0 +1,307 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingLib.Model
{
/// <summary>
/// Classe Model Frame
/// </summary>
public class Frame:IEquatable<Frame>
{
const int MAX_QUILLE = 10;
public int Numero
{
get
{ return numero; }
set
{
this.numero = value;
}
}
private int numero;
private readonly long id;
public long Id
{
get { return id; }
}
public int QuillesRestantes
{
get
{
return quillesRestantes;
}
private set
{
this.quillesRestantes = value;
}
}
private int quillesRestantes;
public int QuillesTombees
{
get
{
return quillesTombees;
}
set
{
this.quillesTombees = value;
}
}
private int quillesTombees;
public bool IsStrike
{
get
{
return isStrike;
}
set
{
this.isStrike = value;
}
}
private bool isStrike;
public bool IsSpare
{
get
{
return isPark;
}
set
{
this.isPark = value;
}
}
private bool isPark;
public bool IsFinished
{
get
{
return isFinished;
}
set
{
this.isFinished = value;
}
}
private bool isFinished;
public Lancer Lancer1
{
get
{
return lancer1;
}
set
{
this.lancer1 = value;
}
}
private Lancer lancer1;
public Lancer Lancer2
{
get { return lancer2; }
set { this.lancer2 = value; }
}
private Lancer lancer2;
public Lancer Lancer3
{
get { return lancer3; }
set { this.lancer3 = value; }
}
private Lancer lancer3;
/// <summary>
/// Constructeur destiné à Initialisé un Frame
/// </summary>
/// <param name="numero"></param>
public Frame(int numero)
{
this.Numero = numero;
this.QuillesRestantes = MAX_QUILLE;
this.IsFinished = false;
this.IsStrike = false;
this.IsSpare = false;
this.QuillesTombees = 0;
}
/// <summary>
/// Constructeur destiné à la récupération des données en base
/// </summary>
/// <param name="numero"></param>
/// <param name="id"></param>
/// <param name="lancer1"></param>
/// <param name="lancer2"></param>
/// <param name="lancer3"></param>
public Frame(long id, int numero, int lancer1, int lancer2, int lancer3) : this(numero)
{
this.id = id;
Lancer1 = new Lancer(lancer1);
Lancer2 = new Lancer(lancer2);
Lancer3 = new Lancer(lancer3);
}
/// <summary>
/// Lance une quille
/// </summary>
/// <param name="quillesTombees">le nombre de quilles tombés </param>
/// <exception cref="ArgumentException"></exception>
public void Lancer(int quillesTombees)
{
if (quillesTombees > QuillesRestantes)
{
throw new ArgumentException("Le nombre de quilles tombees doit etre inferieur au nombre de quilles restantes");
}
if (quillesTombees < 0)
{
throw new ArgumentException("Le nombre de quilles tombees doit et etre positif");
}
if (this.Numero == MAX_QUILLE)
{
if (this.Lancer1 == null)
{
this.Lancer1 = new Lancer(quillesTombees);
this.QuillesRestantes -= quillesTombees;
this.QuillesTombees += quillesTombees;
if (quillesTombees == MAX_QUILLE)
{
this.IsStrike = true;
QuillesRestantes = MAX_QUILLE;
}
}
else if (this.Lancer2 == null)
{
this.Lancer2 = new Lancer(quillesTombees);
this.QuillesRestantes -= quillesTombees;
this.QuillesTombees += quillesTombees;
//lorsque le premier lancer est un strike
if (this.IsStrike)
{
if (quillesTombees == MAX_QUILLE)
{
//lorsque le lancer actuel est un strike
this.IsStrike = true;
QuillesRestantes = MAX_QUILLE;//Remetre le nombre de quilles restantes à 10 pour le lancer 3
}
else
{
this.IsStrike = false;
}
}
else
{
if (quillesTombees + this.Lancer1.QuillesTombees == MAX_QUILLE)
{
//lorsque le lancer actuel est un spare
this.IsSpare = true;
QuillesRestantes = MAX_QUILLE;//Remetre le nombre de quilles restantes à 10 pour le lancer 3
}
}
}
else if (this.Lancer3 == null)
{
this.Lancer3 = new Lancer(quillesTombees);
this.QuillesRestantes -= quillesTombees;
this.QuillesTombees += quillesTombees;
if (this.IsStrike)//si le deuxième lancer etait un strike
{
if (quillesTombees == MAX_QUILLE)
{
this.IsStrike = true;//cas ou il effectue un 3eme strike
}
else
{
this.IsStrike = false;
}
}
else if (this.IsSpare)//si le deuxième lancer etait un spare
{
if (quillesTombees + this.Lancer2.QuillesTombees == MAX_QUILLE)
{
this.IsSpare = true;//cas ou il effectue un 3eme spare
}
else
{
this.IsSpare = false;
}
}
else
{
if (quillesTombees + this.Lancer2.QuillesTombees == MAX_QUILLE)
{
this.IsSpare = true;
}
}
}
else
{
throw new ArgumentException("Le nombre de lancers est deja atteint");
}
}
else
{
if (this.Lancer1 == null)
{
this.Lancer1 = new Lancer(quillesTombees);
}
else if (this.Lancer2 == null)
{
this.Lancer2 = new Lancer(quillesTombees);
}
else
{
throw new ArgumentException("Le nombre de lancers est deja atteint");
}
this.QuillesRestantes -= quillesTombees;
this.QuillesTombees += quillesTombees;
if (quillesTombees == MAX_QUILLE)
{
this.IsStrike = true;
}
else if (this.QuillesRestantes == 0)
{
this.IsSpare = true;
}
}
if (this.QuillesRestantes == 0 || (this.Lancer2 != null && this.Numero != MAX_QUILLE))
{
this.IsFinished = true;
}
}
public bool Equals(Frame other)
{
return Numero.Equals(other.Numero);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null)) return false;
if (ReferenceEquals(obj, this)) return true;
if (GetType() != obj.GetType()) return false;
return Equals(obj as Frame);
}
public override int GetHashCode()
{
return Numero.GetHashCode();
}
}
}

@ -0,0 +1,100 @@
using System;
using System.Runtime.CompilerServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Diagnostics;
namespace BowlingLib.Model
{
/// <summary>
/// Classe Model Joueur
/// </summary>
public class Joueur : IEquatable<Joueur>
{
#region Propriétés
private string pseudo;
private readonly long id;
private readonly List<Partie> parties=new();
public ReadOnlyCollection<Partie> Parties { get; }
#endregion
#region Constructeurs
public Joueur(string pseudo)
{
this.Pseudo = pseudo;
Parties = new ReadOnlyCollection<Partie>(parties);
}
public Joueur(long id, string pseudo) : this(pseudo)
{
this.id = id;
}
#endregion
#region Accesseurs
public long Id
{
get { return id; }
}
public string Pseudo
{
get { return pseudo; }
private set
{
pseudo = value;
if (string.IsNullOrWhiteSpace(pseudo) || pseudo.Length < 3)
{
throw new ArgumentException("Le pseudo ne peut pas être vide");
}
}
}
#endregion
#region Méthodes
public bool Equals(Joueur other)
{
return Pseudo.Equals(other.Pseudo);
}
public void setNom(string nom)
{
Pseudo = nom;
}
public override bool Equals(object obj)
{
if(ReferenceEquals(obj, null)) return false;
if(ReferenceEquals(obj, this)) return true;
if(GetType() != obj.GetType()) return false;
return Equals(obj as Joueur);
}
public override int GetHashCode()
{
return Pseudo.GetHashCode();
}
public void AddPartie(Partie p)
{
if(Parties.Contains(p))
throw new ArgumentException("la partie existe deja");
parties.Add(p);
}
private string GetDebuggerDisplay()
{
return ToString();
}
#endregion
}
}

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingLib.Model
{
public class Lancer
{
private int quillesTombees;
public int QuillesTombees
{
get { return quillesTombees; }
private set
{
if (value < 0 || value > 10)
{
throw new ArgumentException("Le nombre de quilles tombees doit etre compris entre 0 et 10");
}
quillesTombees = value;
}
}
public Lancer(int quillesTombees)
{
this.quillesTombees = quillesTombees;
}
}
}

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingLib.Model
{
/// <summary>
/// Classe Model Partie
/// </summary>
public class Partie:IEquatable<Partie>
{
#region Propriétés
public ReadOnlyCollection<Frame> Frames { get; }
public Joueur Joueur { get; private set; }
private readonly long id;
private DateTime date;
private int? score = 0;
private readonly List<Frame> frames = new();
#endregion
#region Encapsulation
public int? Score {
get
{
return GetScore();
}
private set { score = value; }
}
public DateTime Date
{
get { return date; }
private set { date = value; }
}
public long Id => id;
#endregion
#region Constructeurs
/// <summary>
/// Constructeur
/// </summary>
/// <param name="joueur"></param>
public Partie(Joueur joueur)
{
this.Joueur = joueur;
Date = DateTime.Now;
Frames = new ReadOnlyCollection<Frame>(frames);
}
public Partie(long id, Joueur joueur, List<Frame> frames,DateTime date, int? score) : this(joueur)
{
this.id = id;
this.frames = frames;
this.date = date;
this.Score = score;
}
#endregion
#region Méthodes
/// <summary>
/// Ajoute un frame à la partie
/// </summary>
/// <param name="frame"></param>
public void AddFrame(Frame frame)
{
if (Frames.Contains(frame))
throw new ArgumentException("Le frame existe déjà");
frames.Add(frame);
}
/// <summary>
/// Calcule le score de la partie
/// </summary>
/// <returns>le Score d'une partie</returns>
public int? GetScore()
{
score = 0;
for (int i = 0; i < Frames.Count; i++)
{
score += Frames[i].QuillesTombees;
if (Frames[i].IsStrike && i < Frames.Count - 1)
{
score += Frames[i + 1].QuillesTombees;
if (Frames[i + 1].IsStrike && i < Frames.Count - 2)
{
score += Frames[i + 2].QuillesTombees;
}
}
else if (Frames[i].IsSpare && i < Frames.Count - 1)
{
score += Frames[i + 1].Lancer1.QuillesTombees;
}
}
return score;
}
public bool Equals(Partie other)
{
return Joueur.Equals(Joueur) && Date.Equals(other.Date);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null)) return false;
if (ReferenceEquals(obj, this)) return true;
if (GetType() != obj.GetType()) return false;
return Equals(obj as Partie);
}
public override int GetHashCode()
{
return Joueur.GetHashCode();
}
#endregion
}
}

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

@ -0,0 +1,12 @@
using BowlingEF.Entities;
namespace BowlingRepository.Interface;
public interface IEquipeRepository
{
public void Add(EquipeEntity equipe);
public void Update(EquipeEntity equipe);
public void Delete(EquipeEntity equipe);
public Task GetEquipe(int id);
public IEnumerable<EquipeEntity> GetAllEquipes();
}

@ -0,0 +1,13 @@
using BowlingEF.Entities;
namespace BowlingRepository.Interface;
public interface IJoueurRepository
{
public Task<bool> Add(JoueurEntity joueur);
public Task<bool> Delete(long id);
public Task<bool> Update(JoueurEntity joueur);
public Task<JoueurEntity> GetJoueur(long id);
public Task<IEnumerable<JoueurEntity>> GetAllJoueur();
public Task<JoueurEntity> GetJoueurByNom(string nom);
}

@ -0,0 +1,52 @@
using BowlingEF.Context;
using BowlingEF.Entities;
using BowlingRepository.Interface;
using Microsoft.EntityFrameworkCore;
namespace BowlingRepository;
public class JoueurRepository:IJoueurRepository
{
private readonly BowlingContext _context;
public JoueurRepository()
{
_context = new BowlingContext();
}
public async Task<bool> Add(JoueurEntity joueur)
{
_context.Joueurs.Add(joueur);
return await _context.SaveChangesAsync() > 0;
}
public async Task<bool> Delete(long id)
{
using (var context = new BowlingContext())
{
JoueurEntity entity = context.Joueurs.Find(id);
context.Joueurs.Remove(entity);
return await context.SaveChangesAsync() > 0;
}
}
public async Task<bool> Update(JoueurEntity joueur)
{
return await _context.SaveChangesAsync() > 0;
}
public async Task<JoueurEntity> GetJoueur(long id)
{
return await _context.Joueurs.FindAsync(id);
}
public async Task<IEnumerable<JoueurEntity>> GetAllJoueur()
{
return await _context.Joueurs.ToListAsync();
}
public async Task<JoueurEntity> GetJoueurByNom(string nom)
{
return await _context.Joueurs.FirstOrDefaultAsync(n => n.Pseudo == nom);
}
}

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>11</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BowlingLib\BowlingLib.csproj" />
<ProjectReference Include="..\BowlingRepository\BowlingRepository.csproj" />
<ProjectReference Include="..\DTOs\DTOs.csproj" />
<ProjectReference Include="..\Mapper\Mapper.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,129 @@

using BowlingEF.Context;
using BowlingEF.Entities;
using BowlingLib.Model;
using Business;
using Microsoft.EntityFrameworkCore;
namespace BowlingService
{
public class EquipeDbDataManager : IDataManager<Equipe>
{
#region Méthodes
public async Task<bool> Add(Equipe _equipe)
{
bool result = false;
using (var context = new BowlingContext())
{
EquipeEntity entity = new EquipeEntity
{
Id = _equipe.Id,
Nom = _equipe.Nom,
};
for (int i = 0; i < _equipe.Joueurs.Count; i++)
{
//Mapping entre la classe joueur et la classe joueurEntity
JoueurEntity joueurEntity = new JoueurEntity
{
Id = _equipe.Joueurs[i].Id,
Pseudo = _equipe.Joueurs[i].Pseudo,
};
//Parcourt de la liste des parties d'un joueur
for (int j = 0; j < _equipe.Joueurs[i].Parties.Count; j++)
{
//Mapping entre les parties d'un joueur et les partieEntity d'une partieEntity
PartieEntity partieEntity = new PartieEntity
{
Joueur = joueurEntity,
Date = _equipe.Joueurs[i].Parties[j].Date,
Score = _equipe.Joueurs[i].Parties[j].Score
};
//Parcourt de la liste des frames d'une partie
for (int k = 0; k < _equipe.Joueurs[i].Parties[j].Frames.Count; k++)
{
//Mapping entre les frames d'une partie et les frameEntity d'une partieEntity
FrameEntity frameEntity = new FrameEntity
{
Id = _equipe.Joueurs[i].Parties[j].Frames[k].Id,
Lancer1 = _equipe.Joueurs[i].Parties[j].Frames[k].Lancer1.QuillesTombees,
Lancer2 = _equipe.Joueurs[i].Parties[j].Frames[k].Lancer2.QuillesTombees,
Lancer3 = _equipe.Joueurs[i].Parties[j].Frames[k].Lancer3.QuillesTombees,
Partie = partieEntity
};
partieEntity.Frames.Add(frameEntity);
}
joueurEntity.PartieEntities.Add(partieEntity);
}
entity.Joueurs.Add(joueurEntity);
}
context.Equipes.Add(entity);
await context.SaveChangesAsync();
result = true;
}
return result;
}
public async Task<bool> Delete(Equipe _equipe)
{
bool result = false;
using (var context = new BowlingContext())
{
EquipeEntity entity = context.Equipes.Find(_equipe.Id);
context.Equipes.Remove(entity);
result = await context.SaveChangesAsync() > 0;
}
return result;
}
public async Task<IEnumerable<Equipe>> GetAll()
{
using (var context = new BowlingContext())
{
return await context.Equipes.Select(e => new Equipe
(
e.Id,
e.Nom,
e.Joueurs.Select(j => new Joueur(j.Id, j.Pseudo)).ToArray()
)).ToListAsync();
}
}
public async Task<Equipe> GetDataWithName(string name)
{
using (var context = new BowlingContext())
{
return await context.Equipes.Where(e => e.Nom == name).Select(e => new Equipe
(
e.Id,
e.Nom,
e.Joueurs.Select(j => new Joueur(j.Id, j.Pseudo)).ToArray()
)).FirstOrDefaultAsync();
}
}
public async Task< bool> Update(Equipe data)
{
bool result = false;
using (var context = new BowlingContext())
{
EquipeEntity entity = context.Equipes.Find(data.Id);
entity.Nom = data.Nom;
entity.Joueurs = data.Joueurs.Select(j => new JoueurEntity
{
Id = j.Id,
Pseudo = j.Pseudo
}).ToList();
result = await context.SaveChangesAsync() > 0;
}
return result;
}
#endregion
}
}

@ -0,0 +1,22 @@
using BowlingLib.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Business
{
/// <summary>
/// Interface d'abstraction pour les donné
/// </summary>
/// <typeparam name="Data"></typeparam>
public interface IDataManager<Data>
{
Task<bool> Add(Data data);
Task<bool> Delete(Data data);
Task<bool> Update(Data data);
Task<Data> GetDataWithName(string name);
Task<IEnumerable<Data>> GetAll();
}
}

@ -0,0 +1,17 @@
using BowlingLib.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Business
{
/// <summary>
/// Classe d'abstraction pour les données de la partie
/// </summary>
public interface IPartieDbDataManager : IDataManager<Partie>
{
Task<IEnumerable<Partie>> GetAllWithDate(DateTime date);
}
}

@ -0,0 +1,12 @@
using BowlingEF.Entities;
namespace BowlingService.Interfaces;
public interface IJoueurService
{
Task<bool> Add(JoueurDTO data);
Task<bool> Delete(JoueurDTO data);
Task<bool> Update(JoueurDTO data);
Task<JoueurDTO> GetDataWithName(string name);
Task<IEnumerable<JoueurDTO>> GetAll();
}

@ -0,0 +1,131 @@
using BowlingEF.Context;
using BowlingEF.Entities;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using AutoMapper;
using BowlingRepository.Interface;
using BowlingService.Interfaces;
namespace BowlingService
{
/// <summary>
/// Classe de gestion des données des joueurs
/// </summary>
public class JoueurService : IJoueurService
{
private readonly ILogger<JoueurService> _logger;
private readonly IJoueurRepository _joueurRepository;
private readonly IMapper _mapper;
#region Méthodes
public JoueurService(IJoueurRepository joueurRepository,IMapper mapper)
{
_joueurRepository = joueurRepository;
_mapper = mapper;
}
/// <summary>
/// Ajoute un joueur à la liste des joueurs
/// </summary>
/// <param name="_joueur"></param>
/// <returns></returns>
public async Task<bool> Add(JoueurDTO _joueur)
{
bool result = false;
try
{
//Mapping entre la classe joueur et la classe joueurEntity
JoueurEntity entity = new JoueurEntity
{
Id = _joueur.Id,
Pseudo = _joueur.Pseudo,
};
//Parcourt de la liste des parties d'un joueur
for (int i = 0; i < _joueur.PartieDTO.Count; i++)
{
//Mapping entre les parties d'un joueur et les partieEntity d'une partieEntity
PartieEntity partieEntity = _mapper.Map<PartieEntity>(_joueur.PartieDTO.ElementAt(1));
//Parcourt de la liste des frames d'une partie
for (int j = 0; j < _joueur.PartieDTO.ElementAt(i).FramesDTO.Count; j++)
{
//Mapping entre les frames d'une partie et les frameEntity d'une partieEntity
FrameEntity frameEntity = _mapper.Map<FrameEntity>(_joueur.PartieDTO.ElementAt(i).FramesDTO.ElementAt(j));
partieEntity.Frames.Add(frameEntity);
}
entity.PartieEntities.Add(partieEntity);
}
result = await _joueurRepository.Add(entity);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
throw;
}
return result;
}
/// <summary>
/// Supprime un joueur de la liste des joueurs
/// </summary>
/// <param name="_joueur"></param>
/// <returns></returns>
public async Task<bool> Delete(JoueurDTO _joueur)
{
return await _joueurRepository.Delete(_joueur.Id);
}
/// <summary>
/// recupère tous les joueurs de la Base de données
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<JoueurDTO>> GetAll()
{
using (var context = new BowlingContext())
{
List<JoueurDTO> joueurs = new List<JoueurDTO>();
var data= await _joueurRepository.GetAllJoueur();
foreach (var item in data)
joueurs.Add(_mapper.Map<JoueurDTO>(item));
return joueurs;
}
}
/// <summary>
/// recupère un joueur de la Base de données par son pseudo
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<JoueurDTO> GetDataWithName(string name)
{
using (var context = new BowlingContext())
{
JoueurDTO _joueur = null;
var query = _joueurRepository.GetJoueurByNom(name);
_joueur = _mapper.Map<JoueurDTO>(query.Result);
return _joueur;
}
}
public async Task<bool> Update(JoueurDTO _joueur)
{
bool result = false;
using (var context = new BowlingContext())
{
JoueurEntity entity = _joueurRepository.GetJoueur(_joueur.Id).Result;
if (entity!=null)
{
entity.Pseudo = _joueur.Pseudo;
result = _joueurRepository.Update(entity).Result;
}
}
return result;
}
#endregion
}
}

@ -0,0 +1,166 @@
using BowlingEF.Context;
using BowlingEF.Entities;
using BowlingLib.Model;
using Business;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingService
{
/// <summary>
/// Classe de gestion des données des parties
/// </summary>
public class PartieDbDataManager : IPartieDbDataManager
{
#region Méthodes
/// <summary>
/// Ajoute une partie Dans la base de données
/// </summary>
/// <param name="_partie"></param>
/// <returns></returns>
public async Task<bool> Add(Partie _partie)
{
bool result = false;
using (var context = new BowlingContext())
{
PartieEntity entity = new PartieEntity
{
Id = _partie.Id,
Date = _partie.Date,
Score = _partie.Score
};
context.Parties.Add(entity);
try
{
var data = await context.SaveChangesAsync();
result = data == 1;
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw;
}
}
return result;
}
/// <summary>
/// Supprime une partie de la base de données
/// </summary>
/// <param name="_partie"></param>
/// <returns></returns>
public async Task<bool> Delete(Partie _partie)
{
bool result = false;
using (var context = new BowlingContext())
{
PartieEntity entity = context.Parties.Find(_partie.Id);
context.Parties.Remove(entity);
result = await context.SaveChangesAsync() == 1;
}
return result;
}
/// <summary>
/// Modifie une partie dans la base de données
/// </summary>
/// <param name="_partie"></param>
/// <returns></returns>
public async Task<bool> Update(Partie _partie)
{
bool result = false;
using (var context = new BowlingContext())
{
PartieEntity entity = context.Parties.Find(_partie.Id);
entity.Date = _partie.Date;
//entity.JoueurId = _partie.Joueur.Id;
entity.Score = _partie.Score;
result =await context.SaveChangesAsync() == 1;
}
return result;
}
/// <summary>
/// Retourne une partie de la base de données en fonction de son nom
/// </summary>
/// <param name="_partie"></param>
/// <returns></returns>
public async Task<Partie> GetDataWithName(string name)
{
Partie result = null;
using (var context = new BowlingContext())
{
PartieEntity entity = await context.Parties.FindAsync(name);
Joueur joueur = new Joueur(entity.Joueur.Id, entity.Joueur.Pseudo);
List<Frame> frames = new List<Frame>();
foreach (FrameEntity frameEntity in entity.Frames)
{
Frame frame = new Frame(frameEntity.Id, frameEntity.Numero, frameEntity.Lancer1, frameEntity.Lancer2, frameEntity.Lancer3);
frames.Add(frame);
}
result = new Partie(entity.Id, joueur, frames, entity.Date, entity.Score);
}
return result;
}
/// <summary>
/// Retourne Toutes les parties en base de donné
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<Partie>> GetAll()
{
List<Partie> result = new List<Partie>();
using (var context = new BowlingContext())
{
foreach (PartieEntity entity in await context.Parties.ToListAsync())
{
Joueur joueur = new Joueur(entity.Joueur.Id, entity.Joueur.Pseudo);
List<Frame> frames = new List<Frame>();
foreach (FrameEntity frameEntity in entity.Frames)
{
Frame frame = new Frame(frameEntity.Id, frameEntity.Numero, frameEntity.Lancer1, frameEntity.Lancer2, frameEntity.Lancer3);
frames.Add(frame);
}
result.Add(new Partie(entity.Id, joueur, frames, entity.Date, entity.Score));
}
}
return result.OrderBy(item => item.Date);
}
/// <summary>
/// Retourne les parties à une date donnée
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public async Task<IEnumerable<Partie>> GetAllWithDate(DateTime date)
{
List<Partie> result = new List<Partie>();
using (var context = new BowlingContext())
{
var query = context.Parties.Where(item => item.Date == date);
foreach (PartieEntity entity in await context.Parties.ToListAsync())
{
if (entity.Date.Date == date.Date)
{
Joueur joueur = new Joueur(entity.Joueur.Id, entity.Joueur.Pseudo);
List<Frame> frames = new List<Frame>();
foreach (FrameEntity frameEntity in entity.Frames)
{
Frame frame = new Frame(frameEntity.Id, frameEntity.Numero, frameEntity.Lancer1, frameEntity.Lancer2, frameEntity.Lancer3);
frames.Add(frame);
}
result.Add(new Partie(entity.Id, joueur, frames, entity.Date, entity.Score));
}
}
}
return result.OrderBy(item => item.Date);
}
#endregion
}
}

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BowlingLib\BowlingLib.csproj" />
<ProjectReference Include="..\BowlingService\BowlingService.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,83 @@
using BowlingLib.Model;
using System;
using Business;
namespace BowlingStub
{
public class StubEquipe : IDataManager<Equipe>
{
private List<Equipe> listEquipes = new List<Equipe>();
public int nbrJ = 10,nbrE = 2;
public StubEquipe()
{
}
public async Task<bool> Add(Equipe data)
{
if (data != null)
{
listEquipes.Add(data);
return true;
}
return false;
}
public async Task<bool> Delete(Equipe data)
{
if (data != null)
{
listEquipes.Remove(data);
return true;
}
return false;
}
public void Load()
{
for (int i = 0; i < nbrE; i++)
{
this.Add(new Equipe("Equipe " + i + 1));
for (int k = 0; k < nbrJ; k++)
{
listEquipes.ElementAt(i).AjouterJoueur(new Joueur("Joueur " + i + 1 + "-" + k + 1));
}
}
}
public async Task<IEnumerable<Equipe>> GetAll()
{
Load();
return listEquipes;
}
//mise à jour d'une équipe
public async Task<bool> Update(Equipe data)
{
if (data != null)
{
int index = listEquipes.FindIndex(x => x.Id == data.Id);
listEquipes[index] = data;
return true;
}
return false;
}
public async Task<Equipe> GetDataWithName(string name)
{
throw new NotImplementedException();
}
public async Task<IEnumerable<Equipe>> GetAllWithDate(DateTime date)
{
throw new NotImplementedException();
}
}
}

@ -0,0 +1,70 @@
using BowlingLib.Model;
using System;
using Business;
namespace BowlingStub
{
public class StubJoueur : IDataManager<Joueur>
{
private List<Joueur> listJoueurs = new List<Joueur>();
public async Task<bool> Add(Joueur data)
{
if (data != null)
{
listJoueurs.Add(data);
return true;
}
return false;
}
public async Task<bool> Delete(Joueur data)
{
if (data != null)
{
listJoueurs.Remove(data);
return true;
}
return false;
}
public async Task<IEnumerable<Joueur>> GetAll()
{
return listJoueurs;
}
//n represente le nbr de joueurs a creer dans la liste
public async Task<IEnumerable<Joueur> >GetAllJoueur(int n = 10)
{
for (int i = 0; i < n; i++)
{
Add(new Joueur("Joueur " + i + 1));
}
return listJoueurs;
}
///ged
public async Task<Joueur >GetDataWithId (int id)
{
throw new NotImplementedException();
}
public async Task<Joueur> GetDataWithName(string name)
{
throw new NotImplementedException();
}//
public async Task<bool> Update(Joueur data)
{
if (data != null)
{
int index = listJoueurs.FindIndex(x => x.Id == data.Id);
listJoueurs[index] = data;
return true;
}
return false;
}
}
}

@ -0,0 +1,67 @@
using BowlingLib.Model;
using Business;
namespace BowlingStub
{
public class StubPartie:IDataManager<Partie>
{
private List<Partie> listParties = new List<Partie>();
public async Task<bool> Add(Partie data)
{
if (data != null)
{
listParties.Add(data);
return true;
}
return false;
}
public async Task<bool> Delete(Partie data)
{
if (data != null)
{
listParties.Remove(data);
return true;
}
return false;
}
public async Task<IEnumerable<Partie>> GetAll()
{
return listParties;
}
public IEnumerable<Partie> GetAllPartie(int n=10, int j=0)
{
for (int i = 0; i < n; i++)
{
listParties.Add(new Partie(new Joueur("Joueur " + i + 1)));
}
return listParties;
}
//GDW?
public async Task<Partie> GetDataWithId(int id)
{
throw new NotImplementedException();
}
public async Task<Partie> GetDataWithName(string name)
{
throw new NotImplementedException();
}
public async Task<bool> Update(Partie data)
{
if (data != null)
{
int index = listParties. FindIndex(x => x.Id == data.Id);
listParties[index] = data;
}
return false;
}
}
}

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

@ -0,0 +1,219 @@
using BowlingLib.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Business
{
/// <summary>
/// Classe pour gerer le jeux
/// </summary>
public class Manager
{
#region propriétés
public ReadOnlyCollection<Partie> Parties { get; private set; }
private readonly List<Partie> parties = new();
public ReadOnlyCollection<Equipe> Equipes { get; private set; }
private readonly List<Equipe> equipes = new();
public ReadOnlyCollection<Joueur> Joueurs { get; private set; }
private readonly List<Joueur> joueurs = new();
public IDataManager<Joueur> JoueurDataManager => joueurDataManager;
private readonly IDataManager<Joueur> joueurDataManager;
public IDataManager<Partie> PartieDataManager => partieDataManager;
private readonly IDataManager<Partie> partieDataManager;
public IDataManager<Equipe> EquipeDataManager => equipeDataManager;
private readonly IDataManager<Equipe> equipeDataManager;
#endregion
#region Constructeurs
public Manager(IDataManager<Joueur> joueurManager)
{
this.joueurDataManager = joueurManager;
Joueurs = new ReadOnlyCollection<Joueur>(joueurs);
}
public Manager(IDataManager<Partie> partieDataManager)
{
this.partieDataManager = partieDataManager;
Parties = new ReadOnlyCollection<Partie>(parties);
}
public Manager(IDataManager<Equipe> equipeDataManager)
{
this.equipeDataManager = equipeDataManager;
Equipes = new ReadOnlyCollection<Equipe>(equipes);
}
public Manager(IDataManager<Equipe> equipeDataManager, IDataManager<Partie> partieDataManager, IDataManager<Joueur> joueurManager)
{
this.equipeDataManager = equipeDataManager;
Equipes = new ReadOnlyCollection<Equipe>(equipes);
this.partieDataManager = partieDataManager;
Parties = new ReadOnlyCollection<Partie>(parties);
this.joueurDataManager = joueurManager;
Joueurs = new ReadOnlyCollection<Joueur>(joueurs);
}
#endregion
#region Methodes
/// <summary>
/// Ajoute un joueur à la liste des joueurs
/// </summary>
/// <param name="joueur"></param>
/// <returns></returns>
public Task<bool> AddJoueur(Joueur joueur)
{
if (joueurDataManager == null)
{
return Task.FromResult(false);
}
return joueurDataManager.Add(joueur);
}
/// <summary>
/// Ajoute une partie à la liste des parties
/// </summary>
/// <param name="partie"></param>
/// <returns></returns>
public Task<bool> AddPartie(Partie partie)
{
if (partieDataManager == null)
{
return Task.FromResult( false);
}
return partieDataManager.Add(partie);
}
/// <summary>
/// Ajoute une équipe à la liste des équipes
/// </summary>
/// <param name="equipe"></param>
/// <returns></returns>
public async Task<bool> AddEquipe(Equipe equipe)
{
if (equipeDataManager == null)
{
return false;
}
return await equipeDataManager.Add(equipe);
}
/// <summary>
/// Retourne la liste des joueurs
/// </summary>
/// <param name="joueur"></param>
public async Task<bool> DeleteJoueur(Joueur joueur)
{
if (joueurDataManager == null)
{
return false;
}
return await JoueurDataManager.Delete(joueur);
}
/// <summary>
/// Supprime une partie
/// </summary>
/// <param name="partie"></param>
public async Task<bool> DeletePartie(Partie partie)
{
if (partieDataManager == null)
{
return false;
}
return await partieDataManager.Delete(partie);
}
/// <summary>
/// Supprime une équipe
/// </summary>
/// <param name="equipe"></param>
public async Task<bool> DeleteEquipe(Equipe equipe)
{
if (equipeDataManager == null)
{
return false;
}
return await equipeDataManager.Delete(equipe);
}
/// <summary>
/// Retourne la liste des joueurs
/// </summary>
/// <param name="joueur"></param>
public async Task<bool> UpdateJoueur(Joueur joueur)
{
if (joueurDataManager == null)
{
return false;
}
return await JoueurDataManager.Update(joueur);
}
/// <summary>
/// Met à jour une partie
/// </summary>
/// <param name="partie"></param>
public async Task<bool> UpdatePartie(Partie partie)
{
if (partieDataManager == null)
{
return false;
}
return await partieDataManager.Update(partie);
}
/// <summary>
/// Met à jour une équipe
/// </summary>
/// <param name="equipe"></param>
public async Task<bool> UpdateEquipe(Equipe equipe)
{
if (equipeDataManager == null)
{
return false;
}
return await equipeDataManager.Update(equipe);
}
/// <summary>
/// Retourne la liste des joueurs
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<Joueur>> GetAllJoueur()
{
return await JoueurDataManager.GetAll();
}
/// <summary>
/// Retourne les dernières parties du joueur
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<Partie>> GetAllPartie()
{
return await partieDataManager.GetAll();
}
/// <summary>
/// Retourne les Equipe en fonction d'une partie
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<Equipe>> GetAllEquipe()
{
return await equipeDataManager.GetAll();
}
#endregion
}
}

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

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des equipes
/// </summary>
public class EquipeDTO
{
#region Propriétés
public long Id { get; set; }
public string Nom { get; set; }
public ICollection<JoueurDTO> Joueurs { get; set; }
#endregion
#region Constructeurs
public EquipeDTO()
{
Joueurs = new List<JoueurDTO>();
}
#endregion
}
}

@ -0,0 +1,26 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des frames
/// </summary>
public class FrameDTO
{
#region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public int Numero { get; set; }
[Required]
public int Lancer1 { get; set; }
[Required]
public int Lancer2 { get; set; }
public int Lancer3 { get; set; }
public PartieDTO Partie { get; set; }
#endregion
}
}

@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des Joueurs
/// </summary>
public class JoueurDTO
{
#region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public string Pseudo { get; set; }
public ICollection<PartieDTO> PartieDTO { get; set; } = new List<PartieDTO>();
#endregion
}
}

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingEF.Entities
{
/// <summary>
/// Classe de gestion des parties
/// </summary>
public class PartieDTO
{
#region Properties
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[ForeignKey("JoueurForeignKey")]
public JoueurDTO Joueur { get; set; }
[Required]
public DateTime Date { get; set; }
public ICollection<FrameDTO> FramesDTO { get; set; }
[Required]
public int? Score { get; set; }
#endregion
#region Constructors
public PartieDTO()
{
FramesDTO = new List<FrameDTO>();
}
#endregion
}
}

@ -0,0 +1,12 @@
using AutoMapper;
using BowlingEF.Entities;
namespace Mapper;
public class EquipeProfile:Profile
{
public EquipeProfile()
{
CreateMap<EquipeDTO, EquipeEntity>().ReverseMap();
}
}

@ -0,0 +1,12 @@
using AutoMapper;
using BowlingEF.Entities;
namespace Mapper;
public class FrameProfile:Profile
{
public FrameProfile()
{
CreateMap<FrameDTO, FrameEntity>().ReverseMap();
}
}

@ -0,0 +1,12 @@
using AutoMapper;
using BowlingEF.Entities;
namespace Mapper;
public class JoueurProfile:Profile
{
public JoueurProfile()
{
CreateMap<JoueurDTO, JoueurEntity>().ReverseMap();
}
}

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BowlingEF\BowlingEF.csproj" />
<ProjectReference Include="..\DTOs\DTOs.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,12 @@
using AutoMapper;
using BowlingEF.Entities;
namespace Mapper;
public class PartieProfile:Profile
{
public PartieProfile()
{
CreateMap<PartieDTO, PartieEntity>();
}
}

@ -0,0 +1,93 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32616.157
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingLib", "BowlingLib\BowlingLib.csproj", "{48BBA997-E63D-48BB-BB2A-538457425F02}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C75DF644-C41F-4A08-8B69-C8554204AC72}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingAppUnitTest", "Tests\BowlingAppUnitTest\BowlingAppUnitTest.csproj", "{F9B12DFD-EF58-429F-9344-70DFC10EC6E5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingStub", "BowlingStub\BowlingStub.csproj", "{B50615A5-ABFD-4A9C-B236-DBAEDE62AB2E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingEF", "BowlingEF\BowlingEF.csproj", "{1E42224B-45E4-433C-9D20-0A61023790ED}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingService", "BowlingService\BowlingService.csproj", "{874DDEF3-1FDA-4ECE-826F-F67143823544}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Entites", "Entites", "{3A947347-92D9-47A2-A5B8-B1254B018410}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{5B1EBEE8-2C57-4082-84B8-0F4B7855FCD0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DTOs", "DTOs", "{A67CAE01-FD47-4EFC-A226-0E23403693F4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Repository", "Repository", "{8CF29C06-8F11-49EA-80FC-579B98519159}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingApi", "BowlingApi\BowlingApi.csproj", "{EB5DF6DA-2D5A-4E84-A3F3-883799C25C70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DTOs", "DTOs\DTOs.csproj", "{E9350F3C-4E54-46C3-9C2D-0724C6DDF154}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mapper", "Mapper", "{BEA68AD8-C88B-4C1C-BE08-00832C695E76}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mapper", "Mapper\Mapper.csproj", "{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingRepository", "BowlingRepository\BowlingRepository.csproj", "{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{48BBA997-E63D-48BB-BB2A-538457425F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48BBA997-E63D-48BB-BB2A-538457425F02}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48BBA997-E63D-48BB-BB2A-538457425F02}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48BBA997-E63D-48BB-BB2A-538457425F02}.Release|Any CPU.Build.0 = Release|Any CPU
{F9B12DFD-EF58-429F-9344-70DFC10EC6E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9B12DFD-EF58-429F-9344-70DFC10EC6E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F9B12DFD-EF58-429F-9344-70DFC10EC6E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F9B12DFD-EF58-429F-9344-70DFC10EC6E5}.Release|Any CPU.Build.0 = Release|Any CPU
{B50615A5-ABFD-4A9C-B236-DBAEDE62AB2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B50615A5-ABFD-4A9C-B236-DBAEDE62AB2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B50615A5-ABFD-4A9C-B236-DBAEDE62AB2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B50615A5-ABFD-4A9C-B236-DBAEDE62AB2E}.Release|Any CPU.Build.0 = Release|Any CPU
{1E42224B-45E4-433C-9D20-0A61023790ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E42224B-45E4-433C-9D20-0A61023790ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1E42224B-45E4-433C-9D20-0A61023790ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E42224B-45E4-433C-9D20-0A61023790ED}.Release|Any CPU.Build.0 = Release|Any CPU
{874DDEF3-1FDA-4ECE-826F-F67143823544}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{874DDEF3-1FDA-4ECE-826F-F67143823544}.Debug|Any CPU.Build.0 = Debug|Any CPU
{874DDEF3-1FDA-4ECE-826F-F67143823544}.Release|Any CPU.ActiveCfg = Release|Any CPU
{874DDEF3-1FDA-4ECE-826F-F67143823544}.Release|Any CPU.Build.0 = Release|Any CPU
{EB5DF6DA-2D5A-4E84-A3F3-883799C25C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB5DF6DA-2D5A-4E84-A3F3-883799C25C70}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB5DF6DA-2D5A-4E84-A3F3-883799C25C70}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB5DF6DA-2D5A-4E84-A3F3-883799C25C70}.Release|Any CPU.Build.0 = Release|Any CPU
{E9350F3C-4E54-46C3-9C2D-0724C6DDF154}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E9350F3C-4E54-46C3-9C2D-0724C6DDF154}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E9350F3C-4E54-46C3-9C2D-0724C6DDF154}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E9350F3C-4E54-46C3-9C2D-0724C6DDF154}.Release|Any CPU.Build.0 = Release|Any CPU
{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5}.Release|Any CPU.Build.0 = Release|Any CPU
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{F9B12DFD-EF58-429F-9344-70DFC10EC6E5} = {C75DF644-C41F-4A08-8B69-C8554204AC72}
{1E42224B-45E4-433C-9D20-0A61023790ED} = {3A947347-92D9-47A2-A5B8-B1254B018410}
{874DDEF3-1FDA-4ECE-826F-F67143823544} = {5B1EBEE8-2C57-4082-84B8-0F4B7855FCD0}
{E9350F3C-4E54-46C3-9C2D-0724C6DDF154} = {A67CAE01-FD47-4EFC-A226-0E23403693F4}
{4C872D24-DF74-4F5C-B6C3-A00BB0E72BE5} = {BEA68AD8-C88B-4C1C-BE08-00832C695E76}
{0C93426A-0AA1-45AE-BF57-FC06B1FC9A2C} = {8CF29C06-8F11-49EA-80FC-579B98519159}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4D47853B-D1A3-49A5-84BA-CD2DC65FD105}
EndGlobalSection
EndGlobal

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FsCheck" Version="2.16.5" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\BowlingLib\BowlingLib.csproj" />
<ProjectReference Include="..\..\BowlingStub\BowlingStub.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,86 @@
using BowlingLib.Model;
using System;
using System.Collections.Generic;
namespace Test.BowlingAppUnitTest
{
public static class TestData
{
public static IEnumerable<object[]> Data_AddJoueurToEquipe()
{
yield return new object[]
{
1,
new Joueur[]
{
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania"),
new Joueur("Augustin")
},
new Joueur[]
{
new Joueur("Augustin")
},
new Equipe("ABRMC",
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania")),
new Joueur("Augustin")
};
yield return new object[]
{
2,
new Joueur[]
{
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania"),
new Joueur("Augustin")
},
new Joueur[]
{
new Joueur("Mania"),
new Joueur("Augustin")
},
new Equipe("ABRMC",
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis")),
new Joueur("Mania"),
new Joueur("Alys"),
new Joueur("Augustin")
};
yield return new object[]
{
1,
new Joueur[]
{
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania"),
new Joueur("Augustin")
},
new Joueur[]
{
new Joueur("Augustin")
},
new Equipe("ABRMC",
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania")),
new Joueur("Augustin"),
new Joueur("Augustin")
};
}
}
}

@ -0,0 +1,104 @@
using BowlingLib.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace BowlingAppUnitTest
{
public class UTFrame
{
[Fact]
public void TestFrame()
{
Frame frame = new Frame(1);
Assert.Equal(1, frame.Numero);
Assert.Equal(10, frame.QuillesRestantes);
Assert.Equal(0, frame.QuillesTombees);
Assert.False(frame.IsStrike);
Assert.False(frame.IsSpare);
}
[Fact]
public void TestLancer()
{
Frame frame = new Frame(1);
frame.Lancer(5);
Assert.Equal(5, frame.QuillesTombees);
Assert.Equal(5, frame.QuillesRestantes);
Assert.False(frame.IsStrike);
Assert.False(frame.IsSpare);
}
[Fact]
public void TestLancer2()
{
Frame frame = new Frame(1);
frame.Lancer(10);
Assert.Equal(10, frame.QuillesTombees);
Assert.Equal(0, frame.QuillesRestantes);
Assert.True(frame.IsStrike);
Assert.False(frame.IsSpare);
}
[Fact]
public void TestLancer3()
{
Frame frame = new Frame(1);
frame.Lancer(5);
frame.Lancer(5);
Assert.Equal(10, frame.QuillesTombees);
Assert.Equal(0, frame.QuillesRestantes);
Assert.False(frame.IsStrike);
Assert.True(frame.IsSpare);
}
//test Avec un lancé négatif
[Fact]
public void TestLancer4()
{
Frame frame = new Frame(1);
Assert.Throws<ArgumentException>(() => frame.Lancer(-5));
}
//test Avec un lancé supérieur à 10
[Fact]
public void TestLancer5()
{
Frame frame = new Frame(1);
Assert.Throws<ArgumentException>(() => frame.Lancer(15));
}
//test avec le deuxième lancé du dernier frame est un strike
[Fact]
public void TestLancer6()
{
Frame frame = new Frame(10);
frame.Lancer(0);
frame.Lancer(10);
Assert.False(frame.IsStrike);
}
//test avec le deuxième lancé du dernier frame est un spare
[Fact]
public void TestLancer7()
{
Frame frame = new Frame(10);
frame.Lancer(5);
frame.Lancer(5);
Assert.True(frame.IsSpare);
}
//[Fact]
//public void TestLancer8()
//{
// Frame frame = new Frame(10);
// frame.Lancer(0);
// frame.Lancer(10);
// frame.Lancer(10);
// Assert.True(frame.IsStrike);
//}
}
}

@ -0,0 +1,289 @@
using BowlingLib.Model;
using BowlingStub;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace BowlingAppUnitTest
{
public class UTPartie
{
//le cas ou le joueur ne fait que des strikes
[Fact]
public void TestGetScore()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.AddFrame(new Frame(2));
partie.AddFrame(new Frame(3));
partie.AddFrame(new Frame(4));
partie.AddFrame(new Frame(5));
partie.AddFrame(new Frame(6));
partie.AddFrame(new Frame(7));
partie.AddFrame(new Frame(8));
partie.AddFrame(new Frame(9));
partie.AddFrame(new Frame(10));
for (int i = 0; i < partie.Frames.Count; i++)
{
partie.Frames[i].Lancer(10);
if (i==9)
{
partie.Frames[i].Lancer(10);
}
}
//Act
int? score = partie.GetScore();
//Assert
Assert.Equal(300, score);
}
//le cas ou le joueur fait que des spares
[Fact]
public void TestGetScore2()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.AddFrame(new Frame(2));
partie.AddFrame(new Frame(3));
partie.AddFrame(new Frame(4));
partie.AddFrame(new Frame(5));
partie.AddFrame(new Frame(6));
partie.AddFrame(new Frame(7));
partie.AddFrame(new Frame(8));
partie.AddFrame(new Frame(9));
partie.AddFrame(new Frame(10));
for (int i = 0; i < partie.Frames.Count; i++)
{
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(5);
if (i == 9)
{
partie.Frames[i].Lancer(5);
}
}
//Act
int? score = partie.GetScore();
//Assert
Assert.Equal(150, score);
}
//le cas ou le joueur fait que des spares et des strikes
[Fact]
public void TestGetScore3()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.AddFrame(new Frame(2));
partie.AddFrame(new Frame(3));
partie.AddFrame(new Frame(4));
partie.AddFrame(new Frame(5));
partie.AddFrame(new Frame(6));
partie.AddFrame(new Frame(7));
partie.AddFrame(new Frame(8));
partie.AddFrame(new Frame(9));
partie.AddFrame(new Frame(10));
for (int i = 0; i < partie.Frames.Count; i++)
{
if (i % 2 == 0)
{
partie.Frames[i].Lancer(10);
}
else
{
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(5);
if (i==9)
{
partie.Frames[i].Lancer(5);
}
}
}
//Act
int? score = partie.GetScore();
//Assert
Assert.Equal(200, score);
}
//le cas ou le joueur ne fait aucun strike ou spare
[Fact]
public void TestGetScore4()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.AddFrame(new Frame(2));
partie.AddFrame(new Frame(3));
partie.AddFrame(new Frame(4));
partie.AddFrame(new Frame(5));
partie.AddFrame(new Frame(6));
partie.AddFrame(new Frame(7));
partie.AddFrame(new Frame(8));
partie.AddFrame(new Frame(9));
partie.AddFrame(new Frame(10));
for (int i = 0; i < partie.Frames.Count; i++)
{
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(4);
}
//Act
int? score = partie.GetScore();
//Assert
Assert.Equal(90, score);
}
//le cas ou le joueur fait un strike au dernier lancer
[Fact]
public void TestGetScore5()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.AddFrame(new Frame(2));
partie.AddFrame(new Frame(3));
partie.AddFrame(new Frame(4));
partie.AddFrame(new Frame(5));
partie.AddFrame(new Frame(6));
partie.AddFrame(new Frame(7));
partie.AddFrame(new Frame(8));
partie.AddFrame(new Frame(9));
partie.AddFrame(new Frame(10));
for (int i = 0; i < partie.Frames.Count; i++)
{
if (i < 9)
{
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(4);
continue;
}
partie.Frames[i].Lancer(10);
if (partie.Frames[i].IsStrike)
{
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(4);
}
}
//Act
int? score = partie.GetScore();
//Assert
Assert.Equal(100, score);
}
//le cas ou le joueur fait un spare au deuxieme lancer du dernier frame
[Fact]
public void TestGetScore6()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.AddFrame(new Frame(2));
partie.AddFrame(new Frame(3));
partie.AddFrame(new Frame(4));
partie.AddFrame(new Frame(5));
partie.AddFrame(new Frame(6));
partie.AddFrame(new Frame(7));
partie.AddFrame(new Frame(8));
partie.AddFrame(new Frame(9));
partie.AddFrame(new Frame(10));
for (int i = 0; i < partie.Frames.Count; i++)
{
if (i < 9)
{
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(4);
continue;
}
partie.Frames[i].Lancer(5);
partie.Frames[i].Lancer(5);
if (partie.Frames[i].IsSpare)
{
partie.Frames[i].Lancer(5);
}
}
//Act
int? score = partie.GetScore();
//Assert
Assert.Equal(96, score);
}
//le cas ou le nombre de lancer est atteind 2 eme frames
[Fact]
public void TestGetScore7()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.Frames[0].Lancer(5);
partie.Frames[0].Lancer(5);
Assert.Throws<ArgumentException>
(() => partie.Frames[0].Lancer(5));
}
//le cas ou les lancer sont finis
[Fact]
public void TestGetScore8()
{
//Arrange
StubPartie stubPartie = new StubPartie();
IEnumerable<Partie> listParties = stubPartie.GetAllPartie(1);
Partie partie = listParties.ElementAt(0);
partie.AddFrame(new Frame(1));
partie.Frames[0].Lancer(5);
partie.Frames[0].Lancer(5);
Assert.True(partie.Frames[0].IsFinished);
}
}
}

@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BowlingLib.Model;
using Xunit;
namespace Test.BowlingAppUnitTest
{
public class UnitTestEquipe
{
public static IEnumerable<object[]> Data_AddJoueurToEquipe()
{
yield return new object[]
{
true,
new Joueur[]
{
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania"),
new Joueur("Cornelle")
},
new Equipe("ABRMC",
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania")),
new Joueur("Cornelle")
};
yield return new object[]
{
false,
new Joueur[]
{
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania")
},
new Equipe("ABRMC",
new Joueur("Alys"),
new Joueur("Bénita"),
new Joueur("Regis"),
new Joueur("Mania")),
new Joueur("Mania")
};
}
[Theory]
[MemberData(nameof(Data_AddJoueurToEquipe))]
public void Test_AddJoueurToEquipe(bool expectedResult,
IEnumerable<Joueur> expectedJoueurs,
Equipe equipe,
Joueur joueur)
{
bool result = equipe.AjouterJoueur(joueur);
Assert.Equal(expectedResult, result);
Assert.Equal(expectedJoueurs.Count(), equipe.Joueurs.Count());
Assert.All(expectedJoueurs, j => equipe.Joueurs.Contains(j));
}
[Theory]
[MemberData(nameof(TestData.Data_AddJoueurToEquipe), MemberType=typeof(TestData))]
public void Test_AddJoueursToEquipe(int expectedResult,
IEnumerable<Joueur> expectedJoueurs,
IEnumerable<Joueur> expectedAddedJoueurs,
Equipe equipe,
params Joueur[] joueursToAdd)
{
var addedJoueurs = equipe.AjouterJoueurs(joueursToAdd);
Assert.Equal(expectedResult, addedJoueurs.Count());
Assert.All(expectedAddedJoueurs, a => addedJoueurs.Contains(a));
Assert.Equal(expectedJoueurs.Count(), equipe.Joueurs.Count());
Assert.All(expectedJoueurs, a => equipe.Joueurs.Contains(a));
}
}
}

@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BowlingLib.Model;
using BowlingStub;
using Xunit;
namespace Test.BowlingAppUnitTest
{
public class UnitTestJoueur
{
Joueur j = new Joueur("Paul");
[Fact]
public void TestConstructeur()
{
Assert.NotNull(j);
Assert.Equal("Paul", j.Pseudo);
Assert.NotEqual("joel", j.Pseudo);
}
//si l text n est
[Fact]
public void TestInvalidJoueur()
{
Assert.Throws<ArgumentException>(() => new Joueur(null));
}
//
[Theory]
[InlineData(true, false, "Augustin", "Augustinn", false)]
[InlineData(true, true, "Amir", "Amir", true)]
[InlineData(false, false, "Amir", "", false)]
[InlineData(false, false, "Amir", null, false)]
[InlineData(false, false, null, null, true)]
[InlineData(false, false, null, "", false)]
[InlineData(false, false, "", null, false)]
[InlineData(false, false, "", "", true)]
[InlineData(false, false, "f2", "f2", true)]
public void TestContructeur(bool isFormated, bool isValid, string expectedPseudo, String pseudo, bool isEqual)
{// formated:
if (!isValid && !isFormated)
{
Assert.Throws<ArgumentException>
(
() => new Joueur(pseudo)
);
return;
}
Joueur j = new Joueur(pseudo);
if (!isEqual)
{
Assert.NotEqual(expectedPseudo, j.Pseudo);
}
// else
// {
// if (!isEqual)
// {
// Assert.NotEqual(expectedPseudo, j.Pseudo);
// }
if (isEqual)
{
Assert.Equal(expectedPseudo, j.Pseudo);
}
}
//Test joueur avec stub
[Fact]
public void TestJoueurStub()
{
StubJoueur stub = new StubJoueur();
Assert.Equal(10, stub.GetAllJoueur(10).Result.Count());
}
//tester la methode remove
[Fact]
public void TestRemove()
{
StubJoueur stub = new StubJoueur();
stub.Add(j);
stub.Delete(j);
//Compter le nombre de joueur dans un objet IEnumerable
Assert.Equal(0, stub.GetAll().Result.Count());
}
/*
* TEST AVEC LE STUB
*/
[Fact]
public void TestUpdate()
{
StubJoueur stub = new StubJoueur();
Joueur j = new Joueur("Paul");
stub.Add(j);
j.setNom("Augustin");
stub.Update(j);
Assert.Equal("Augustin", stub.GetAll().Result.First().Pseudo);
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>

@ -0,0 +1,11 @@
namespace BowlingEFunitTest
{
public class UnitTest1
{
[Fact]
public void Test1()
{
}
}
}

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BowlingEFunitTest
{
internal class unittestEfjoueur
{
}
}

@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

@ -0,0 +1,25 @@
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

@ -0,0 +1,41 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60263",
"sslPort": 44378
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5076",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7180;http://localhost:5076",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

@ -0,0 +1,12 @@
namespace WebApplication1;
public class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0"/>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/>
</ItemGroup>
</Project>

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

@ -0,0 +1,7 @@
{
"sdk": {
"version": "6.0.0",
"rollForward": "latestMajor",
"allowPrerelease": false
}
}
Loading…
Cancel
Save