diff --git a/.drone.yml b/.drone.yml index 13bc83b..edc2351 100644 --- a/.drone.yml +++ b/.drone.yml @@ -15,6 +15,14 @@ steps: - cd ./Sources/bowlin_project/ - flutter build apk + - name: test + image: cirrusci/flutter:stable + commands: + - cd Sources/bowlin_project/ + - flutter pub get + - flutter test --machine --coverage + depends_on: [ app-build ] + # build CONTAINER for sonar on flutter IMAGE - name: code-analysis image: cirrusci/flutter:stable @@ -28,8 +36,8 @@ steps: - unzip -o $HOME/.sonar/sonar-scanner.zip -d $HOME/.sonar/ - export PATH=$SONAR_SCANNER_HOME/bin:$PATH - export SONAR_SCANNER_OPTS="-server" - - sonar-scanner -D sonar.projectKey=Bowl_in -D sonar.sources=./Sources/bowlin_project -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.coverageReportPaths=./Sources/bowlin_project/coverage/lcov.info - depends_on: [ app-build ] + - sonar-scanner -D sonar.projectKey=Bowl_in -D sonar.sources=./Sources/bowlin_project -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.flutter.coverage.reportPath=./Sources/bowlin_project/coverage/lcov.info + depends_on: [ test ] # database container deployment - name: deploy-container-postgresql diff --git a/README.md b/README.md index 913fe47..780372a 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ [![Security Rating](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=security_rating&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in) [![Vulnerabilities](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=vulnerabilities&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in) [![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=ncloc&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in) +[![Coverage](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Bowl_in&metric=coverage&token=88dd5f9f10bb02aede7a82a2bccf8c987af1ecab)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Bowl_in) + --- diff --git a/Sources/bowlin_project/android/app/src/main/res/drawable-v21/launch_background.xml b/Sources/bowlin_project/android/app/src/main/res/drawable-v21/launch_background.xml index 1cb7aa2..0430efb 100644 --- a/Sources/bowlin_project/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/Sources/bowlin_project/android/app/src/main/res/drawable-v21/launch_background.xml @@ -3,10 +3,4 @@ - - diff --git a/Sources/bowlin_project/android/app/src/main/res/drawable/launch_background.xml b/Sources/bowlin_project/android/app/src/main/res/drawable/launch_background.xml index 8403758..8af0f98 100644 --- a/Sources/bowlin_project/android/app/src/main/res/drawable/launch_background.xml +++ b/Sources/bowlin_project/android/app/src/main/res/drawable/launch_background.xml @@ -3,10 +3,4 @@ - - diff --git a/Sources/bowlin_project/android/app/src/main/res/values/styles.xml b/Sources/bowlin_project/android/app/src/main/res/values/styles.xml index 5fac679..45578d6 100644 --- a/Sources/bowlin_project/android/app/src/main/res/values/styles.xml +++ b/Sources/bowlin_project/android/app/src/main/res/values/styles.xml @@ -1,17 +1,10 @@ - - diff --git a/Sources/bowlin_project/lib/config/app_router.dart b/Sources/bowlin_project/lib/config/app_router.dart index 1bc45be..5ac59c7 100644 --- a/Sources/bowlin_project/lib/config/app_router.dart +++ b/Sources/bowlin_project/lib/config/app_router.dart @@ -1,8 +1,6 @@ import 'package:bowl_in/model/AbstractRound.dart'; import 'package:bowl_in/model/GameDetail.dart'; -import 'package:bowl_in/model/Round.dart'; import 'package:bowl_in/views/ingame_screen2.dart'; -import 'package:bowl_in/widgets/button_new_party.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; diff --git a/Sources/bowlin_project/lib/main.dart b/Sources/bowlin_project/lib/main.dart index 1046f67..50a8162 100644 --- a/Sources/bowlin_project/lib/main.dart +++ b/Sources/bowlin_project/lib/main.dart @@ -1,11 +1,5 @@ -import 'package:bowl_in/views/game_screen.dart'; -import 'package:bowl_in/views/ingame_screen.dart'; -import 'package:bowl_in/views/main_screen.dart'; -import 'package:bowl_in/views/rank_screen.dart'; -import 'package:bowl_in/views/welcome_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:go_router/go_router.dart'; import 'package:bowl_in/config/app_router.dart'; import 'model/IManager.dart'; diff --git a/Sources/bowlin_project/lib/model/AbstractRound.dart b/Sources/bowlin_project/lib/model/AbstractRound.dart index b636611..b5293db 100644 --- a/Sources/bowlin_project/lib/model/AbstractRound.dart +++ b/Sources/bowlin_project/lib/model/AbstractRound.dart @@ -1,5 +1,7 @@ import 'Player.dart'; +final maxScoreInFrame = 30; + abstract class AbstractRound { int? _firstThrow; int? _secondThrow; @@ -28,7 +30,11 @@ abstract class AbstractRound { int? get points => _points; set points(int? value) { - _points = value; + if((value??0)>=maxScoreInFrame){ + _points=maxScoreInFrame; + }else { + _points = value; + } } @@ -76,11 +82,14 @@ abstract class AbstractRound { } void update(int val){ + print(" ROUND " + number.toString() + "UPDATE : " + val.toString()); + points = (points ?? 0) + val; previousRound?.update(val); } void unsubscribePreviousRound(){ + print("UNSUBSCRIBE"); previousRound?.unsubscribePreviousRound(); previousRound=null; } diff --git a/Sources/bowlin_project/lib/model/Game.dart b/Sources/bowlin_project/lib/model/Game.dart index 8f6c909..7c73eee 100644 --- a/Sources/bowlin_project/lib/model/Game.dart +++ b/Sources/bowlin_project/lib/model/Game.dart @@ -1,44 +1,17 @@ import 'Player.dart'; class Game { - int _id; - DateTime _date; - int _pointsCurrentUser; - bool _isFinished; - List _players = []; + final int _id; + final DateTime _date; + final int _pointsCurrentUser; + final List _players; // Constructor - Game(this._id, this._date, this._pointsCurrentUser, this._isFinished, + Game(this._id, this._date, this._pointsCurrentUser, this._players); - // Getters and setters int get id => _id; - - set id(int value) { - _id = value; - } - DateTime get date => _date; - - set date(DateTime value) { - _date = value; - } - int get pointsCurrentUser => _pointsCurrentUser; - - set pointsCurrentUser(int value) { - _pointsCurrentUser = value; - } - - bool get isFinished => _isFinished; - - set isFinished(bool value) { - _isFinished = value; - } - List get players => _players; - - set playersId(List value) { - _players = value; - } } diff --git a/Sources/bowlin_project/lib/model/GameDetail.dart b/Sources/bowlin_project/lib/model/GameDetail.dart index 4b159e9..51c0cd4 100644 --- a/Sources/bowlin_project/lib/model/GameDetail.dart +++ b/Sources/bowlin_project/lib/model/GameDetail.dart @@ -1,26 +1,21 @@ import 'package:bowl_in/model/AbstractRound.dart'; import 'package:bowl_in/model/Game.dart'; -import 'package:bowl_in/model/GamePlayer.dart'; import 'package:bowl_in/model/LastRound.dart'; - import 'Player.dart'; import 'Round.dart'; import 'User.dart'; class GameDetail { int _id; - DateTime _time; + final DateTime _time; Player? _winner; - int _nbPoints; - bool _isFinished; - int _host; - List _rounds = []; - List _players = []; + final int _host; + final List _rounds = []; + final List _players; final Map _points = {}; // Constructor - GameDetail(this._id, this._time, this._winner, this._nbPoints, - this._isFinished, this._host, this._players) { + GameDetail(this._id, this._time, this._winner, this._host, this._players) { for (int i = 1; i <= 9; i++) { players.forEach((element) { this.rounds.add(Round(null, null, 0, element, i)); @@ -29,7 +24,6 @@ class GameDetail { players.forEach((element) { this.rounds.add(LastRound(null, null, 0, element, 10, null)); }); - } // Getters and setters @@ -41,75 +35,48 @@ class GameDetail { DateTime get time => _time; - set time(DateTime value) { - _time = value; - } - Player? get winner => _winner; set winner(Player? value) { _winner = value; } - int get nbPoints => _nbPoints; - - set nbPoints(int value) { - _nbPoints = value; - } - - bool get isFinished => _isFinished; - - set isFinished(bool value) { - _isFinished = value; - } - int get host => _host; - set host(int value) { - _host = value; - } - List get rounds => _rounds; - set rounds(List value) { - _rounds = value; - } - List get players => _players; - set players(List value) { - _players = value; - } - - Map get points => _points; - void addGameToUsers(){ - for(var p in players){ - if(p is User){ - p.games.add(Game(this.id, this.time, points[p] ?? 0, true, players)); + void addGameToUsers() { + for (var p in players) { + if (p is User) { + p.games.add(Game(this.id, this.time, points[p] ?? 0, players)); p.stat.updateStats(this, p); } } } - void computeWinner(){ + void computeWinner() { print(getRank().entries.first.key.name); this.winner = getRank().entries.first.key; } - void computeScores(){ + void computeScores() { print("====COMPUTE POINTS===="); - for(var element in rounds){ - points[element.player] = (points[element.player] ?? 0) + (element.points ?? 0); + for (var element in rounds) { + points[element.player] = + (points[element.player] ?? 0) + (element.points ?? 0); + print(element.points); } computeWinner(); addGameToUsers(); } Map getRank() { - var sortedByValueMap = Map.fromEntries( - points.entries.toList()..sort((e1, e2) => e2.value.compareTo(e1.value))); + var sortedByValueMap = Map.fromEntries(points.entries.toList() + ..sort((e1, e2) => e2.value.compareTo(e1.value))); return sortedByValueMap; } } diff --git a/Sources/bowlin_project/lib/model/GamePlayer.dart b/Sources/bowlin_project/lib/model/GamePlayer.dart index 8deb5c6..61af1ad 100644 --- a/Sources/bowlin_project/lib/model/GamePlayer.dart +++ b/Sources/bowlin_project/lib/model/GamePlayer.dart @@ -1,3 +1,4 @@ +import 'package:bowl_in/model/AbstractRound.dart'; import 'package:bowl_in/model/IManager.dart'; import 'package:flutter/cupertino.dart'; @@ -20,7 +21,14 @@ class GamePlayer { _game = value; } - void onNext(bool isRoundFinished, BuildContext context) { + AbstractRound? get currentRound { + if (currentRoundIndex < game.rounds.length){ + return game.rounds[currentRoundIndex]; + } + return null; + } + + void onNext(bool isRoundFinished, BuildContext? context) { if (isRoundFinished) { print("++"); currentRoundIndex++; @@ -32,7 +40,7 @@ class GamePlayer { _parent.gameMgr.addGame(game); game.computeScores(); - context.go("/scoreboard", extra: game); + context?.go("/scoreboard", extra: game); } else { print("IN GAME : " + currentRoundIndex.toString()); if (game.rounds[currentRoundIndex] is Round) { @@ -40,7 +48,7 @@ class GamePlayer { } else { print("LAST ROUND"); } - context.pushReplacement("/in-game", + context?.pushReplacement("/in-game", extra: game.rounds[currentRoundIndex]); } } diff --git a/Sources/bowlin_project/lib/model/IGameManager.dart b/Sources/bowlin_project/lib/model/IGameManager.dart index 6040d3c..2b4eff8 100644 --- a/Sources/bowlin_project/lib/model/IGameManager.dart +++ b/Sources/bowlin_project/lib/model/IGameManager.dart @@ -1,9 +1,7 @@ import 'GameDetail.dart'; import 'Player.dart'; -import 'User.dart'; abstract class IGameManager { - // Methods GameDetail getGameById(int id); List getGamesByPlayerId(int id); List getGamesByPlayer(Player user); diff --git a/Sources/bowlin_project/lib/model/IManager.dart b/Sources/bowlin_project/lib/model/IManager.dart index 00ecb8c..27ea88c 100644 --- a/Sources/bowlin_project/lib/model/IManager.dart +++ b/Sources/bowlin_project/lib/model/IManager.dart @@ -1,11 +1,8 @@ import 'package:bowl_in/model/GameDetail.dart'; import 'package:bowl_in/model/GamePlayer.dart'; - import 'User.dart'; -import 'Game.dart'; import 'IUserManager.dart'; import 'IGameManager.dart'; -import 'Game.dart'; abstract class IManager { late User _userCurrent; diff --git a/Sources/bowlin_project/lib/model/LastRound.dart b/Sources/bowlin_project/lib/model/LastRound.dart index 71cbb86..5448035 100644 --- a/Sources/bowlin_project/lib/model/LastRound.dart +++ b/Sources/bowlin_project/lib/model/LastRound.dart @@ -1,11 +1,10 @@ import 'package:bowl_in/model/AbstractRound.dart'; -import 'Player.dart'; - -class LastRound extends AbstractRound{ +class LastRound extends AbstractRound { int? _thirdThrow; - LastRound(super.firstThrow, super.secondThrow, super.points, super.player, super.number, this._thirdThrow); + LastRound(super.firstThrow, super.secondThrow, super.points, super.player, + super.number, this._thirdThrow); int? get thirdThrow => _thirdThrow; @@ -15,21 +14,21 @@ class LastRound extends AbstractRound{ @override bool computeNext(int val) { - if(firstThrow==null){ - firstThrow=val; - if(previousRound?.isSpare() ?? false){ + if (firstThrow == null) { + firstThrow = val; + if (previousRound?.isSpare() ?? false) { previousRound?.update(val); } return false; - }else if(secondThrow==null){ - secondThrow=val; - if ((firstThrow??0)+(secondThrow??0)<10){ + } else if (secondThrow == null) { + secondThrow = val; + if ((firstThrow ?? 0) + (secondThrow ?? 0) < 10) { computePoints(); - return true ; + return true; } return false; - }else if((firstThrow??0)+(secondThrow??0)>=10){ - thirdThrow=val; + } else if ((firstThrow ?? 0) + (secondThrow ?? 0) >= 10) { + thirdThrow = val; } computePoints(); return true; @@ -37,35 +36,36 @@ class LastRound extends AbstractRound{ @override void computePoints() { - points = (firstThrow??0)+(secondThrow??0)+(thirdThrow??0); + points = (firstThrow ?? 0) + (secondThrow ?? 0) + (thirdThrow ?? 0); + print("Compute points : " + points.toString()); - if(previousRound?.isStrike()??false){ - update(points??0); + if (previousRound?.isStrike() ?? false) { + update(points ?? 0); } unsubscribePreviousRound(); } @override - bool shotIsStrike(){ - if(firstThrow==null){ + bool shotIsStrike() { + if (firstThrow == null) { return true; - }else if(secondThrow==null){ - return firstThrow==10; - }else{ - return secondThrow==10; + } else if (secondThrow == null) { + return firstThrow == 10; + } else { + return secondThrow == 10; } } @override int getNbSpares() { int nb = 0; - if(firstThrow!=10){ - if((firstThrow??0)+(secondThrow??0)==10){ - nb+=1; + if (firstThrow != 10) { + if ((firstThrow ?? 0) + (secondThrow ?? 0) == 10) { + nb += 1; } - }else{ - if((thirdThrow??0)+(secondThrow??0)==10) { - nb+=1; + } else { + if ((thirdThrow ?? 0) + (secondThrow ?? 0) == 10) { + nb += 1; } } return nb; @@ -74,17 +74,17 @@ class LastRound extends AbstractRound{ @override int getNbStrike() { int nb = 0; - if(firstThrow==10){ - nb+=1; - if(secondThrow==10){ - nb+=1; - if(thirdThrow==10) { - nb+=1; + if (firstThrow == 10) { + nb += 1; + if (secondThrow == 10) { + nb += 1; + if (thirdThrow == 10) { + nb += 1; } } - }else{ - if(thirdThrow==10) { - nb+=1; + } else { + if (thirdThrow == 10) { + nb += 1; } } return nb; @@ -92,23 +92,21 @@ class LastRound extends AbstractRound{ @override int getPinsKnockedDown() { - return (firstThrow??0)+(secondThrow??0)+(thirdThrow??0); + return (firstThrow ?? 0) + (secondThrow ?? 0) + (thirdThrow ?? 0); } - @override int getMaxPinsThisShot() { - if(firstThrow==null){ + if (firstThrow == null) { return 10; - }else if(firstThrow==10 && secondThrow==null){ + } else if (firstThrow == 10 && secondThrow == null) { return 10; - }else if(secondThrow==null){ - return 10 - (firstThrow??0); - }else if(secondThrow==10){ + } else if ( secondThrow == null ){ + return 10 - ( firstThrow ?? 0 ); + } else if ( ( firstThrow ?? 0 ) + ( secondThrow ?? 0 ) == 10 || secondThrow == 10 ){ return 10; - }else{ - return 10 - (secondThrow??0); + } else { + return 10 - ( secondThrow ?? 0 ); } } - } diff --git a/Sources/bowlin_project/lib/model/Round.dart b/Sources/bowlin_project/lib/model/Round.dart index 6e1d9c3..3b50946 100644 --- a/Sources/bowlin_project/lib/model/Round.dart +++ b/Sources/bowlin_project/lib/model/Round.dart @@ -1,25 +1,24 @@ import 'package:bowl_in/model/AbstractRound.dart'; -import 'GamePlayer.dart'; -class Round extends AbstractRound{ - - Round(super.firstThrow, super.secondThrow, super.points, super.player, super.number); +class Round extends AbstractRound { + Round(super.firstThrow, super.secondThrow, super.points, super.player, + super.number); @override bool computeNext(int val) { - if(firstThrow==null){ - firstThrow=val; - if(previousRound?.isSpare() ?? false){ + if (firstThrow == null) { + firstThrow = val; + if (previousRound?.isSpare() ?? false) { previousRound?.update(val); unsubscribePreviousRound(); } - if(val==10){ + if (val == 10) { computePoints(); return true; } return false; - }else if(firstThrow!=10 && secondThrow==null){ - secondThrow=val; + } else if (firstThrow != 10 && secondThrow == null) { + secondThrow = val; } computePoints(); return true; @@ -27,21 +26,20 @@ class Round extends AbstractRound{ @override void computePoints() { - points = (firstThrow ?? 0)+(secondThrow ?? 0); - if(previousRound?.isStrike() ?? false){ + points = (firstThrow ?? 0) + (secondThrow ?? 0); + if (previousRound?.isStrike() ?? false) { previousRound?.update(points ?? 0); } - unsubscribePreviousRound(); } @override - bool shotIsStrike(){ - return firstThrow==null; + bool shotIsStrike() { + return firstThrow == null; } @override int getNbSpares() { - if(isSpare()){ + if (isSpare()) { return 1; } return 0; @@ -49,7 +47,7 @@ class Round extends AbstractRound{ @override int getNbStrike() { - if(isStrike()){ + if (isStrike()) { return 1; } return 0; @@ -57,14 +55,14 @@ class Round extends AbstractRound{ @override int getPinsKnockedDown() { - return (firstThrow ?? 0)+(secondThrow ?? 0); + return (firstThrow ?? 0) + (secondThrow ?? 0); } @override int getMaxPinsThisShot() { - if(firstThrow==null){ + if (firstThrow == null) { return 10; - }else{ + } else { return 10 - (firstThrow ?? 0); } } diff --git a/Sources/bowlin_project/lib/model/Stat.dart b/Sources/bowlin_project/lib/model/Stat.dart index d68fa57..434b0ff 100644 --- a/Sources/bowlin_project/lib/model/Stat.dart +++ b/Sources/bowlin_project/lib/model/Stat.dart @@ -1,17 +1,15 @@ import 'package:bowl_in/model/GameDetail.dart'; import 'package:bowl_in/model/Player.dart'; -import 'User.dart'; - class Stat { - int _nbVictory; - int _nbGames; - int _highscore; - int _nbStrikes; - int _nbSpares; - int _nbScore; - double _avgScore; - double _avgPinsPerRound; + int _nbVictory = 0; + int _nbGames = 0; + int _highscore = 0; + int _nbStrikes = 0; + int _nbSpares = 0; + int _nbScore = 0; + double _avgScore = 0; + double _avgPinsPerRound = 0; // Constructor Stat( @@ -25,6 +23,9 @@ class Stat { this._avgPinsPerRound, ); + Stat.empty(); + + // Getters and setters int get nbVictory => _nbVictory; @@ -74,26 +75,25 @@ class Stat { _avgPinsPerRound = value; } - void updateStats(GameDetail gd, Player p){ - nbGames +=1; - if(gd.winner == p){ - nbVictory +=1; + void updateStats(GameDetail gd, Player p) { + nbGames += 1; + if (gd.winner == p) { + nbVictory += 1; } - if((gd.points[p] ?? 0) > highscore){ + if ((gd.points[p] ?? 0) > highscore) { highscore = gd.points[p] ?? 0; } double totalpins = 0; - for(var r in gd.rounds){ - - if(p == r.player){ + for (var r in gd.rounds) { + if (p == r.player) { nbStrikes += r.getNbStrike(); nbSpares += r.getNbSpares(); totalpins = totalpins + r.getPinsKnockedDown(); } } - avgPinsPerRound = ((avgPinsPerRound * (nbGames-1)) + (totalpins/10))/nbGames; - + avgPinsPerRound = + ((avgPinsPerRound * (nbGames - 1)) + (totalpins / 10)) / nbGames; } } diff --git a/Sources/bowlin_project/lib/model/StubManager/AuthManager.dart b/Sources/bowlin_project/lib/model/StubManager/AuthManager.dart index fc93912..2b581dd 100644 --- a/Sources/bowlin_project/lib/model/StubManager/AuthManager.dart +++ b/Sources/bowlin_project/lib/model/StubManager/AuthManager.dart @@ -1,4 +1,5 @@ library StubLib; + import '../IAuthManager.dart'; import '../User.dart'; import 'StubData.dart'; @@ -12,10 +13,10 @@ class AuthManager extends IAuthManager { bool verifiedUser(String mail, String password) { for (var user in parent.players) { if (user is User && user.mail == mail) { - parent.userCurrent = user as User; + parent.userCurrent = user; return true; } } return false; } -} \ No newline at end of file +} diff --git a/Sources/bowlin_project/lib/model/StubManager/GameManager.dart b/Sources/bowlin_project/lib/model/StubManager/GameManager.dart index 511acaf..63c878e 100644 --- a/Sources/bowlin_project/lib/model/StubManager/GameManager.dart +++ b/Sources/bowlin_project/lib/model/StubManager/GameManager.dart @@ -1,11 +1,9 @@ library StubLib; -import '../Game.dart'; import '../IGameManager.dart'; import '../GameDetail.dart'; import '../Player.dart'; import '../User.dart'; -import '../Guest.dart'; import 'StubData.dart'; class GameManager extends IGameManager { diff --git a/Sources/bowlin_project/lib/model/StubManager/StubData.dart b/Sources/bowlin_project/lib/model/StubManager/StubData.dart index 001b928..5bb66b8 100644 --- a/Sources/bowlin_project/lib/model/StubManager/StubData.dart +++ b/Sources/bowlin_project/lib/model/StubManager/StubData.dart @@ -2,7 +2,6 @@ library StubLib; import '../Guest.dart'; import '../IManager.dart'; -import '../Game.dart'; import '../IUserManager.dart'; import '../IGameManager.dart'; import '../Player.dart'; @@ -50,16 +49,7 @@ class StubData extends IManager { Achievement("2 strikes in a row"), Achievement("Win a game") ], - [], - Stat( - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0)), + []), User( 9, "Dave", @@ -81,16 +71,7 @@ class StubData extends IManager { Achievement("2 strikes in a row"), Achievement("Win a game") ], - [], - Stat( - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0)), + []), User( 22, "Louison", @@ -101,16 +82,7 @@ class StubData extends IManager { Achievement("2 strikes in a row"), Achievement("Win a game") ], - [], - Stat( - 10, - 12, - 150, - 7, - 6, - 700, - 58.33, - 30.2)), + []), User( 23, "Owen", @@ -121,16 +93,7 @@ class StubData extends IManager { Achievement("2 strikes in a row"), Achievement("Win a game") ], - [], - Stat( - 10, - 12, - 10, - 7, - 6, - 700, - 58.33, - 30.2)), + []), User( 24, "LULU", @@ -141,16 +104,7 @@ class StubData extends IManager { Achievement("2 strikes in a row"), Achievement("Win a game") ], - [], - Stat( - 10, - 12, - 40, - 7, - 6, - 700, - 58.33, - 30.2)), + []), User( 25, "Raphael", @@ -161,26 +115,8 @@ class StubData extends IManager { Achievement("2 strikes in a row"), Achievement("Win a game") ], - [], - Stat( - 10, - 12, - 76, - 7, - 6, - 700, - 58.33, - 30.2)), - ], - Stat( - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0)) + []), + ]) ]; List _gameDetails = []; @@ -229,8 +165,6 @@ class StubData extends IManager { List get rounds => _rounds; - List _games = []; - void _initGame() { // games.add(Game( // gameDetails[0].id, diff --git a/Sources/bowlin_project/lib/model/StubManager/UserManager.dart b/Sources/bowlin_project/lib/model/StubManager/UserManager.dart index c4e7f57..fd8d9e9 100644 --- a/Sources/bowlin_project/lib/model/StubManager/UserManager.dart +++ b/Sources/bowlin_project/lib/model/StubManager/UserManager.dart @@ -1,13 +1,10 @@ library StubLib; import '../IUserManager.dart'; -import '../IAuthManager.dart'; import '../Player.dart'; import '../User.dart'; import 'AuthManager.dart'; import 'StubData.dart'; -import '../Player.dart'; -import '../Stat.dart'; class UserManager extends IUserManager { final StubData parent; diff --git a/Sources/bowlin_project/lib/model/User.dart b/Sources/bowlin_project/lib/model/User.dart index b1740aa..b5b1bd7 100644 --- a/Sources/bowlin_project/lib/model/User.dart +++ b/Sources/bowlin_project/lib/model/User.dart @@ -8,12 +8,12 @@ class User extends Player { String _mail; List _achievements = []; List _friends = []; - Stat _stat; + final Stat _stat = Stat.empty(); List games = []; // Constructor User(this._id, String name, String image, this._mail, this._achievements, - this._friends, this._stat) + this._friends) : super(name, image); int get id => _id; @@ -38,8 +38,4 @@ class User extends Player { } Stat get stat => _stat; - - set stat(Stat value) { - _stat = value; - } } diff --git a/Sources/bowlin_project/lib/views/ingame_screen.dart b/Sources/bowlin_project/lib/views/ingame_screen.dart index 6a47b3c..5bccba5 100644 --- a/Sources/bowlin_project/lib/views/ingame_screen.dart +++ b/Sources/bowlin_project/lib/views/ingame_screen.dart @@ -1,17 +1,10 @@ import 'package:bowl_in/main.dart'; import 'package:bowl_in/model/GameDetail.dart'; -import 'package:bowl_in/model/GamePlayer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; - -import '../model/Game.dart'; -import '../model/Guest.dart'; import '../model/Player.dart'; -import '../widgets/button_new_party.dart'; import '../widgets/ingame_widgets.dart'; -import '../widgets/scores_list_widget.dart'; class InGameScreen extends StatefulWidget { const InGameScreen({Key? key}) : super(key: key); @@ -57,12 +50,7 @@ class _InGameScreenState extends State { Spacer(), ElevatedButton( onPressed: () { - GameDetail gd = GameDetail( - -1, - DateTime.now(), - null, - 0, - false, + GameDetail gd = GameDetail(-1, DateTime.now(), null, MyApp.controller.userCurrent.id, listPlayers); MyApp.controller.gamePlayer.game = gd; @@ -81,8 +69,8 @@ class _InGameScreenState extends State { width: 7, color: Color(0xff1ABAE0), ), - onPrimary: Colors.transparent, - primary: Colors.transparent, + foregroundColor: Colors.transparent, + backgroundColor: Colors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(55), ), diff --git a/Sources/bowlin_project/lib/views/ingame_screen2.dart b/Sources/bowlin_project/lib/views/ingame_screen2.dart index 3d11b9a..1fdbc60 100644 --- a/Sources/bowlin_project/lib/views/ingame_screen2.dart +++ b/Sources/bowlin_project/lib/views/ingame_screen2.dart @@ -3,11 +3,7 @@ import 'package:bowl_in/model/AbstractRound.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; - -import '../model/Round.dart'; -import '../widgets/button_new_party.dart'; import '../widgets/ingame_widgets.dart'; -import '../widgets/scores_list_widget.dart'; class InGameScreen2 extends StatefulWidget { final AbstractRound currentRound; @@ -93,8 +89,8 @@ class _InGameScreen2State extends State { width: 7, color: Color(0xff1ABAE0), ), - onPrimary: Colors.transparent, - primary: Colors.transparent, + foregroundColor: Colors.transparent, + backgroundColor: Colors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(55), ), diff --git a/Sources/bowlin_project/lib/views/welcome_screen.dart b/Sources/bowlin_project/lib/views/welcome_screen.dart index 4ee80bf..b09bf14 100644 --- a/Sources/bowlin_project/lib/views/welcome_screen.dart +++ b/Sources/bowlin_project/lib/views/welcome_screen.dart @@ -66,8 +66,8 @@ class ButtonConnexion extends StatelessWidget { width: 7, color: Color(0xffFF419B), ), - onPrimary: Colors.white, - primary: Color(0xffF40375), + backgroundColor: Colors.white, + foregroundColor: Color(0xffF40375), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(35), ), diff --git a/Sources/bowlin_project/lib/widgets/button_new_party.dart b/Sources/bowlin_project/lib/widgets/button_new_party.dart index e31275e..3709cdb 100644 --- a/Sources/bowlin_project/lib/widgets/button_new_party.dart +++ b/Sources/bowlin_project/lib/widgets/button_new_party.dart @@ -3,11 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; - -import '../main.dart'; import '../model/GameDetail.dart'; -import '../model/Player.dart'; -import '../model/User.dart'; import 'ingame_widgets.dart'; class ButtonNewParty extends StatelessWidget { @@ -21,8 +17,8 @@ class ButtonNewParty extends StatelessWidget { width: 4, color: Color(0xffFF419B), ), - onPrimary: Colors.white, - primary: Color(0xffF40375), + backgroundColor: Colors.white, + foregroundColor: Color(0xffF40375), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(35), ), @@ -127,8 +123,8 @@ class NewGameModal extends StatelessWidget { fontWeight: FontWeight.bold, fontSize: 18), ), style: ElevatedButton.styleFrom( - onPrimary: Colors.white, - primary: Color(0xffF40375), + backgroundColor: Colors.white, + foregroundColor: Color(0xffF40375), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), @@ -229,8 +225,8 @@ class ButtonJoinParty extends StatelessWidget { width: 4, color: Color(0xff6B6588), ), - onPrimary: Colors.white, - primary: Color(0xff45405D), + backgroundColor: Colors.white, + foregroundColor: Color(0xff45405D), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(35), ), diff --git a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart index 8b9cf57..781f548 100644 --- a/Sources/bowlin_project/lib/widgets/ingame_widgets.dart +++ b/Sources/bowlin_project/lib/widgets/ingame_widgets.dart @@ -1,13 +1,9 @@ import 'dart:ui'; - import 'package:bowl_in/main.dart'; -import 'package:bowl_in/widgets/profil_listpodium_widget.dart'; -import 'package:bowl_in/widgets/scores_list_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; - import '../model/AbstractRound.dart'; import '../model/GameDetail.dart'; import '../model/Guest.dart'; @@ -170,8 +166,8 @@ class _FinalScoreBoardState extends State { width: 7, color: Color(0xff1ABAE0), ), - onPrimary: Colors.transparent, - primary: Colors.transparent, + backgroundColor: Colors.transparent, + foregroundColor: Colors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(55), ), @@ -252,7 +248,8 @@ class PodiumGameOverWidget extends StatelessWidget { class InGameCardConfig extends StatefulWidget { final List listPlayer; - const InGameCardConfig({Key? key, required this.listPlayer}) : super(key: key); + const InGameCardConfig({Key? key, required this.listPlayer}) + : super(key: key); @override State createState() => _InGameCardConfigState(); @@ -264,16 +261,14 @@ class _InGameCardConfigState extends State { super.initState(); } - void onDelete(Player p){ + void onDelete(Player p) { setState(() { - widget.listPlayer.remove(p); }); } - void onReorder(int oldIndex, int newIndex){ + void onReorder(int oldIndex, int newIndex) { setState(() { - if (oldIndex < newIndex) { newIndex -= 1; } @@ -325,7 +320,11 @@ class _InGameCardConfigState extends State { ], ), )), - ListUserInGame(listPlayer: widget.listPlayer, onDelete: onDelete, onReorder: onReorder,), + ListUserInGame( + listPlayer: widget.listPlayer, + onDelete: onDelete, + onReorder: onReorder, + ), Spacer(), Image( image: AssetImage("assets/images/start_sentence.png"), @@ -350,7 +349,7 @@ class _InGameCardConfigState extends State { style: ElevatedButton.styleFrom( elevation: 5, shadowColor: Color(0xffB70056), - primary: Color(0xffF40375), + foregroundColor: Color(0xffF40375), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), @@ -367,14 +366,18 @@ class ListUserInGame extends StatefulWidget { final List listPlayer; final Function(Player) onDelete; final Function(int, int) onReorder; - const ListUserInGame({Key? key, required this.listPlayer, required this.onDelete, required this.onReorder}) : super(key: key); + const ListUserInGame( + {Key? key, + required this.listPlayer, + required this.onDelete, + required this.onReorder}) + : super(key: key); @override State createState() => _ListUserInGameState(); } class _ListUserInGameState extends State { - @override Widget build(BuildContext context) { return Padding( @@ -388,10 +391,14 @@ class _ListUserInGameState extends State { ), child: ReorderableListView.builder( itemCount: widget.listPlayer.length, - itemBuilder: (context, index) { - return UserInGame(key:ValueKey(widget.listPlayer[index]) ,player: widget.listPlayer[index], onDelete: widget.onDelete, index: index); - }, - onReorder: widget.onReorder, + itemBuilder: (context, index) { + return UserInGame( + key: ValueKey(widget.listPlayer[index]), + player: widget.listPlayer[index], + onDelete: widget.onDelete, + index: index); + }, + onReorder: widget.onReorder, ), ), RichText( @@ -418,7 +425,12 @@ class UserInGame extends StatefulWidget { final Player player; final Function(Player) onDelete; final int index; - const UserInGame({Key? key, required this.player, required this.onDelete, required this.index}) : super(key: key); + const UserInGame( + {Key? key, + required this.player, + required this.onDelete, + required this.index}) + : super(key: key); @override State createState() => _UserInGameState(); @@ -442,17 +454,17 @@ class _UserInGameState extends State { child: Row( children: [ ReorderableDragStartListener( - index: widget.index, - child : Container( - width: 30, - height: 30, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(70)), - image: DecorationImage( - image: AssetImage(widget.player.image), fit: BoxFit.cover), + index: widget.index, + child: Container( + width: 30, + height: 30, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(70)), + image: DecorationImage( + image: AssetImage(widget.player.image), fit: BoxFit.cover), + ), ), ), - ), SizedBox( width: 10, ), @@ -472,29 +484,26 @@ class _UserInGameState extends State { ), cursorColor: Colors.purple, textAlign: TextAlign.left, - onChanged: (str)=> widget.player.name=str - , + onChanged: (str) => widget.player.name = str, ), ), ) : SizedBox( width: 220, - child: Text( - widget.player.name, - style: GoogleFonts.roboto( - fontSize: 18, - decoration: TextDecoration.none, - color: Color(0xff241E40)) - ), + child: Text(widget.player.name, + style: GoogleFonts.roboto( + fontSize: 18, + decoration: TextDecoration.none, + color: Color(0xff241E40))), ), - (widget.player is User && (widget.player as User).id == MyApp.controller.userCurrent.id) ? - Icon(Icons.lock, color: Colors.amber) : - GestureDetector( - onTap: () { - widget.onDelete(widget.player); - }, - child: Icon(Icons.close) - ), + (widget.player is User && + (widget.player as User).id == MyApp.controller.userCurrent.id) + ? Icon(Icons.lock, color: Colors.amber) + : GestureDetector( + onTap: () { + widget.onDelete(widget.player); + }, + child: Icon(Icons.close)), Spacer() ], ), @@ -518,8 +527,6 @@ class InGameCardThrow extends StatefulWidget { } class _InGameCardThrowState extends State { - GlobalKey<_NumberPadState> _numberPadKey = GlobalKey(); - void initState() { super.initState(); } diff --git a/Sources/bowlin_project/lib/widgets/profil_listpodium_widget.dart b/Sources/bowlin_project/lib/widgets/profil_listpodium_widget.dart index a4c1a90..62f7e0a 100644 --- a/Sources/bowlin_project/lib/widgets/profil_listpodium_widget.dart +++ b/Sources/bowlin_project/lib/widgets/profil_listpodium_widget.dart @@ -2,9 +2,7 @@ import 'package:bowl_in/widgets/scores_list_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; - import '../main.dart'; -import '../model/Player.dart'; import '../model/User.dart'; class ProfilPodiumWidget extends StatelessWidget { diff --git a/Sources/bowlin_project/lib/widgets/scores_list_widget.dart b/Sources/bowlin_project/lib/widgets/scores_list_widget.dart index c66c665..a9716a9 100644 --- a/Sources/bowlin_project/lib/widgets/scores_list_widget.dart +++ b/Sources/bowlin_project/lib/widgets/scores_list_widget.dart @@ -2,7 +2,6 @@ import 'package:bowl_in/main.dart'; import 'package:bowl_in/widgets/button_new_party.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/intl.dart'; diff --git a/Sources/bowlin_project/test/manager_test.dart b/Sources/bowlin_project/test/manager_test.dart new file mode 100644 index 0000000..62b237c --- /dev/null +++ b/Sources/bowlin_project/test/manager_test.dart @@ -0,0 +1,37 @@ +import 'package:bowl_in/model/GameDetail.dart'; +import 'package:bowl_in/model/Guest.dart'; +import 'package:bowl_in/model/IManager.dart'; +import 'package:bowl_in/model/Player.dart'; +import 'package:bowl_in/model/StubManager/StubData.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void testManager(IManager mgr) { + test("Test manager " + mgr.runtimeType.toString(), () { + expect(mgr.userCurrent, mgr.userMgr.getUsersByName("Dave").first); + expect(mgr.userCurrent, mgr.userMgr.getUserById(mgr.userCurrent.id)); + + List players = [mgr.userCurrent, Guest("Emre")]; + GameDetail gd = GameDetail( + mgr.gameMgr.getNextId(), DateTime.now(), null, mgr.userCurrent.id, players); + + expect(gd.players, players); + expect(gd.host, mgr.userCurrent.id); + + + mgr.gameMgr.addGame(gd); + + expect(gd, mgr.gameMgr.getGameById(gd.id)); + + expect(gd, mgr.gameMgr.getGamesByPlayer(mgr.userCurrent).first); + + expect(gd, mgr.gameMgr.getGamesByPlayerId(mgr.userCurrent.id).first); + + expect(players, mgr.gameMgr.getPlayersByIdGame(gd.id)); + + expect(gd, mgr.gameMgr.getGamesByPlayers(players).first); + }); +} + +void main() { + testManager(StubData()); +} diff --git a/Sources/bowlin_project/test/model_test.dart b/Sources/bowlin_project/test/model.dart similarity index 100% rename from Sources/bowlin_project/test/model_test.dart rename to Sources/bowlin_project/test/model.dart diff --git a/Sources/bowlin_project/test/play_test.dart b/Sources/bowlin_project/test/play_test.dart new file mode 100644 index 0000000..4ecbc1e --- /dev/null +++ b/Sources/bowlin_project/test/play_test.dart @@ -0,0 +1,140 @@ +import 'package:bowl_in/model/AbstractRound.dart'; +import 'package:bowl_in/model/GameDetail.dart'; +import 'package:bowl_in/model/GamePlayer.dart'; +import 'package:bowl_in/model/Guest.dart'; +import 'package:bowl_in/model/IManager.dart'; +import 'package:bowl_in/model/Player.dart'; +import 'package:bowl_in/model/StubManager/StubData.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test("Just strikes", (){ + final IManager mgr = StubData(); + final List listPlayers = [mgr.userCurrent, Guest("Lucas")]; + + final GameDetail gd = GameDetail( + -1, + DateTime.now(), + null, + mgr.userCurrent.id, + listPlayers); + mgr.gamePlayer.game = gd; + mgr.gamePlayer.onNext(false, null); + + AbstractRound? currentRound = mgr.gamePlayer.currentRound; + while (currentRound != null) { + bool isFinished = currentRound.computeNext(10); + if (currentRound.isSpareOrStrike()) { + mgr.gamePlayer.onSpareOrStrike(); + } + mgr.gamePlayer.onNext(isFinished, null); + currentRound = mgr.gamePlayer.currentRound; + } + + final int score = gd + .getRank() + .values + .first; + expect(score, 300); + }); + + test("Classic game", (){ + final IManager mgr = StubData(); + final List listPlayers = [mgr.userCurrent, Guest("Lucas")]; + + final DateTime dateGame = DateTime.now(); + + final GameDetail gd = GameDetail( + -1, + dateGame, + null, + mgr.userCurrent.id, + listPlayers); + mgr.gamePlayer.game = gd; + mgr.gamePlayer.onNext(false, null); + + makeThrow(7, mgr.gamePlayer); + makeThrow(2, mgr.gamePlayer); + + makeThrow(10, mgr.gamePlayer); + + makeThrow(5, mgr.gamePlayer); + makeThrow(5, mgr.gamePlayer); + + makeThrow(5, mgr.gamePlayer); + makeThrow(5, mgr.gamePlayer); + + makeThrow(3, mgr.gamePlayer); + makeThrow(7, mgr.gamePlayer); + + makeThrow(0, mgr.gamePlayer); + makeThrow(7, mgr.gamePlayer); + + makeThrow(10, mgr.gamePlayer); + + makeThrow(0, mgr.gamePlayer); + makeThrow(0, mgr.gamePlayer); + + makeThrow(9, mgr.gamePlayer); + makeThrow(0, mgr.gamePlayer); + + makeThrow(0, mgr.gamePlayer); + makeThrow(10, mgr.gamePlayer); + + makeThrow(2, mgr.gamePlayer); + makeThrow(2, mgr.gamePlayer); + + makeThrow(5, mgr.gamePlayer); + makeThrow(5, mgr.gamePlayer); + + makeThrow(10, mgr.gamePlayer); + + makeThrow(3, mgr.gamePlayer); + makeThrow(2, mgr.gamePlayer); + + makeThrow(1, mgr.gamePlayer); + makeThrow(2, mgr.gamePlayer); + + makeThrow(7, mgr.gamePlayer); + makeThrow(1, mgr.gamePlayer); + + makeThrow(4, mgr.gamePlayer); + makeThrow(6, mgr.gamePlayer); + + makeThrow(1, mgr.gamePlayer); + makeThrow(7, mgr.gamePlayer); + + makeThrow(10, mgr.gamePlayer); + makeThrow(6, mgr.gamePlayer); + makeThrow(2, mgr.gamePlayer); + + makeThrow(8, mgr.gamePlayer); + makeThrow(1, mgr.gamePlayer); + + + + final Iterable score = gd + .getRank() + .values; + expect(score.first, 128); + expect(score.last, 95); + + expect(mgr.userCurrent.games.length, 1); + expect(mgr.userCurrent.games.first.id, mgr.gamePlayer.game.id); + expect(mgr.userCurrent.games.first.pointsCurrentUser, 128); + expect(mgr.userCurrent.games.first.date, dateGame); + expect(mgr.userCurrent.games.first.players, listPlayers); + + }); + +} + + +void makeThrow(int input, GamePlayer gamePlayer){ + AbstractRound currentRound = gamePlayer.currentRound!; + bool isFinished = currentRound.computeNext(input); + if (currentRound.isSpareOrStrike()) { + gamePlayer.onSpareOrStrike(); + } + gamePlayer.onNext(isFinished, null); +} \ No newline at end of file diff --git a/Sources/bowlin_project/test/round_test.dart b/Sources/bowlin_project/test/round_test.dart new file mode 100644 index 0000000..ca46b52 --- /dev/null +++ b/Sources/bowlin_project/test/round_test.dart @@ -0,0 +1,80 @@ +import 'package:bowl_in/model/LastRound.dart'; +import 'package:bowl_in/model/Round.dart'; +import 'package:bowl_in/model/Stat.dart'; +import 'package:bowl_in/model/User.dart'; +import 'package:flutter_test/flutter_test.dart'; + + +void main() { + test("Test Round", (){ + User u = User(1, "Louison" , "Sources/bowlin_project/assets/images/image_user_pink.png", "loparant@gmail.com", [], []); + Round r = Round(null, null, null, u, 1); + + expect(r.getMaxPinsThisShot(), 10); + expect(r.isSpareOrStrike(), false); + + r.computeNext(4); + + expect(r.getMaxPinsThisShot(), 6); + r.computeNext(6); + + + expect(r.isSpare(), true); + expect(r.isSpareOrStrike(), true); + expect(r.isStrike(), false); + expect(r.getNbSpares(), 1); + expect(r.getNbStrike(), 0); + + Round r2 = Round(null, null, null, u, 2); + r2.computeNext(10); + expect(r2.isSpare(), false); + expect(r2.isStrike(), true); + expect(r2.isSpareOrStrike(), true); + expect(r2.getNbSpares(), 0); + expect(r2.getNbStrike(), 1); + + Round r3 = Round(null, null, null, u, 2); + r3.computeNext(2); + r3.computeNext(5); + expect(r3.getPinsKnockedDown(), 7); + }); + + test("Test LastRound", (){ + User u = User(1, "Louison" , "Sources/bowlin_project/assets/images/image_user_pink.png", "loparant@gmail.com", [], []); + LastRound r = LastRound(null, null, null, u, 1, null); + + expect(r.getMaxPinsThisShot(), 10); + expect(r.isSpareOrStrike(), false); + r.computeNext(10); + + expect(r.getMaxPinsThisShot(), 10); + r.computeNext(10); + + expect(r.getMaxPinsThisShot(), 10); + r.computeNext(10); + + expect(r.getPinsKnockedDown(), 30); + expect(r.getNbSpares(), 0); + expect(r.getNbStrike(), 3); + + LastRound r2 = LastRound(null, null, null, u, 1, null); + r2.computeNext(1); + expect(r2.getMaxPinsThisShot(), 9); + r2.computeNext(9); + expect(r2.getMaxPinsThisShot(), 10); + r2.computeNext(10); + expect(r2.getPinsKnockedDown(), 20); + expect(r2.getNbSpares(), 1); + expect(r2.getNbStrike(), 1); + + LastRound r3 = LastRound(null, null, null, u, 1, null); + r3.computeNext(10); + r3.computeNext(2); + expect(r3.getMaxPinsThisShot(), 8); + r3.computeNext(8); + expect(r3.getPinsKnockedDown(), 20); + expect(r3.getNbSpares(), 1); + expect(r3.getNbStrike(), 1); + + }); +} \ No newline at end of file diff --git a/Sources/bowlin_project/test/widget_test.dart b/Sources/bowlin_project/test/widget_test.dart deleted file mode 100644 index a0aaeac..0000000 --- a/Sources/bowlin_project/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:bowl_in/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}