Renamed folder to "models"

This commit is contained in:
2026-04-08 22:27:50 +02:00
parent 14d46d7e52
commit ad6d08374e
46 changed files with 795 additions and 569 deletions

View File

@@ -1,6 +1,6 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
/// Translates a [Ruleset] enum value to its corresponding localized string. /// Translates a [Ruleset] enum value to its corresponding localized string.

View File

@@ -1,8 +1,8 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/game_table.dart'; import 'package:tallee/data/db/tables/game_table.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/core/enums.dart';
part 'game_dao.g.dart'; part 'game_dao.g.dart';
@@ -111,14 +111,20 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
} }
/// Updates the name of the game with the given [gameId] to [newName]. /// Updates the name of the game with the given [gameId] to [newName].
Future<void> updateGameName({required String gameId, required String newName}) async { Future<void> updateGameName({
await (update( required String gameId,
gameTable, required String newName,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(name: Value(newName))); }) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(name: Value(newName)),
);
} }
/// Updates the ruleset of the game with the given [gameId]. /// Updates the ruleset of the game with the given [gameId].
Future<void> updateGameRuleset({required String gameId, required Ruleset newRuleset}) async { Future<void> updateGameRuleset({
required String gameId,
required Ruleset newRuleset,
}) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write( await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(ruleset: Value(newRuleset.name)), GameTableCompanion(ruleset: Value(newRuleset.name)),
); );
@@ -135,24 +141,31 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
} }
/// Updates the color of the game with the given [gameId]. /// Updates the color of the game with the given [gameId].
Future<void> updateGameColor({required String gameId, required GameColor newColor}) async { Future<void> updateGameColor({
await (update( required String gameId,
gameTable, required GameColor newColor,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(color: Value(newColor.name))); }) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(color: Value(newColor.name)),
);
} }
/// Updates the icon of the game with the given [gameId]. /// Updates the icon of the game with the given [gameId].
Future<void> updateGameIcon({required String gameId, required String newIcon}) async { Future<void> updateGameIcon({
await (update( required String gameId,
gameTable, required String newIcon,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(icon: Value(newIcon))); }) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(icon: Value(newIcon)),
);
} }
/// Retrieves the total count of games in the database. /// Retrieves the total count of games in the database.
Future<int> getGameCount() async { Future<int> getGameCount() async {
final count = await (selectOnly( final count =
gameTable, await (selectOnly(gameTable)..addColumns([gameTable.id.count()]))
)..addColumns([gameTable.id.count()])).map((row) => row.read(gameTable.id.count())).getSingle(); .map((row) => row.read(gameTable.id.count()))
.getSingle();
return count ?? 0; return count ?? 0;
} }

View File

@@ -5,4 +5,12 @@ part of 'game_dao.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
mixin _$GameDaoMixin on DatabaseAccessor<AppDatabase> { mixin _$GameDaoMixin on DatabaseAccessor<AppDatabase> {
$GameTableTable get gameTable => attachedDatabase.gameTable; $GameTableTable get gameTable => attachedDatabase.gameTable;
GameDaoManager get managers => GameDaoManager(this);
}
class GameDaoManager {
final _$GameDaoMixin _db;
GameDaoManager(this._db);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
} }

View File

@@ -3,8 +3,8 @@ import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/group_table.dart'; import 'package:tallee/data/db/tables/group_table.dart';
import 'package:tallee/data/db/tables/match_table.dart'; import 'package:tallee/data/db/tables/match_table.dart';
import 'package:tallee/data/db/tables/player_group_table.dart'; import 'package:tallee/data/db/tables/player_group_table.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'group_dao.g.dart'; part 'group_dao.g.dart';

View File

@@ -10,4 +10,23 @@ mixin _$GroupDaoMixin on DatabaseAccessor<AppDatabase> {
attachedDatabase.playerGroupTable; attachedDatabase.playerGroupTable;
$GameTableTable get gameTable => attachedDatabase.gameTable; $GameTableTable get gameTable => attachedDatabase.gameTable;
$MatchTableTable get matchTable => attachedDatabase.matchTable; $MatchTableTable get matchTable => attachedDatabase.matchTable;
GroupDaoManager get managers => GroupDaoManager(this);
}
class GroupDaoManager {
final _$GroupDaoMixin _db;
GroupDaoManager(this._db);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$PlayerGroupTableTableTableManager get playerGroupTable =>
$$PlayerGroupTableTableTableManager(
_db.attachedDatabase,
_db.playerGroupTable,
);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
} }

View File

@@ -4,10 +4,10 @@ import 'package:tallee/data/db/tables/game_table.dart';
import 'package:tallee/data/db/tables/group_table.dart'; import 'package:tallee/data/db/tables/group_table.dart';
import 'package:tallee/data/db/tables/match_table.dart'; import 'package:tallee/data/db/tables/match_table.dart';
import 'package:tallee/data/db/tables/player_match_table.dart'; import 'package:tallee/data/db/tables/player_match_table.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'match_dao.g.dart'; part 'match_dao.g.dart';

View File

@@ -11,4 +11,25 @@ mixin _$MatchDaoMixin on DatabaseAccessor<AppDatabase> {
$TeamTableTable get teamTable => attachedDatabase.teamTable; $TeamTableTable get teamTable => attachedDatabase.teamTable;
$PlayerMatchTableTable get playerMatchTable => $PlayerMatchTableTable get playerMatchTable =>
attachedDatabase.playerMatchTable; attachedDatabase.playerMatchTable;
MatchDaoManager get managers => MatchDaoManager(this);
}
class MatchDaoManager {
final _$MatchDaoMixin _db;
MatchDaoManager(this._db);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$TeamTableTableTableManager get teamTable =>
$$TeamTableTableTableManager(_db.attachedDatabase, _db.teamTable);
$$PlayerMatchTableTableTableManager get playerMatchTable =>
$$PlayerMatchTableTableTableManager(
_db.attachedDatabase,
_db.playerMatchTable,
);
} }

View File

@@ -1,7 +1,7 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/player_table.dart'; import 'package:tallee/data/db/tables/player_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'player_dao.g.dart'; part 'player_dao.g.dart';

View File

@@ -5,4 +5,12 @@ part of 'player_dao.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
mixin _$PlayerDaoMixin on DatabaseAccessor<AppDatabase> { mixin _$PlayerDaoMixin on DatabaseAccessor<AppDatabase> {
$PlayerTableTable get playerTable => attachedDatabase.playerTable; $PlayerTableTable get playerTable => attachedDatabase.playerTable;
PlayerDaoManager get managers => PlayerDaoManager(this);
}
class PlayerDaoManager {
final _$PlayerDaoMixin _db;
PlayerDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
} }

View File

@@ -2,7 +2,7 @@ import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/player_group_table.dart'; import 'package:tallee/data/db/tables/player_group_table.dart';
import 'package:tallee/data/db/tables/player_table.dart'; import 'package:tallee/data/db/tables/player_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'player_group_dao.g.dart'; part 'player_group_dao.g.dart';

View File

@@ -8,4 +8,19 @@ mixin _$PlayerGroupDaoMixin on DatabaseAccessor<AppDatabase> {
$GroupTableTable get groupTable => attachedDatabase.groupTable; $GroupTableTable get groupTable => attachedDatabase.groupTable;
$PlayerGroupTableTable get playerGroupTable => $PlayerGroupTableTable get playerGroupTable =>
attachedDatabase.playerGroupTable; attachedDatabase.playerGroupTable;
PlayerGroupDaoManager get managers => PlayerGroupDaoManager(this);
}
class PlayerGroupDaoManager {
final _$PlayerGroupDaoMixin _db;
PlayerGroupDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$PlayerGroupTableTableTableManager get playerGroupTable =>
$$PlayerGroupTableTableTableManager(
_db.attachedDatabase,
_db.playerGroupTable,
);
} }

View File

@@ -2,7 +2,7 @@ import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/player_match_table.dart'; import 'package:tallee/data/db/tables/player_match_table.dart';
import 'package:tallee/data/db/tables/team_table.dart'; import 'package:tallee/data/db/tables/team_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'player_match_dao.g.dart'; part 'player_match_dao.g.dart';
@@ -52,8 +52,8 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String matchId, required String matchId,
required String playerId, required String playerId,
}) async { }) async {
final result = await (select(playerMatchTable) final result =
..where( await (select(playerMatchTable)..where(
(p) => p.matchId.equals(matchId) & p.playerId.equals(playerId), (p) => p.matchId.equals(matchId) & p.playerId.equals(playerId),
)) ))
.getSingleOrNull(); .getSingleOrNull();
@@ -67,8 +67,8 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String playerId, required String playerId,
required int newScore, required int newScore,
}) async { }) async {
final rowsAffected = await (update(playerMatchTable) final rowsAffected =
..where( await (update(playerMatchTable)..where(
(p) => p.matchId.equals(matchId) & p.playerId.equals(playerId), (p) => p.matchId.equals(matchId) & p.playerId.equals(playerId),
)) ))
.write(PlayerMatchTableCompanion(score: Value(newScore))); .write(PlayerMatchTableCompanion(score: Value(newScore)));
@@ -82,8 +82,8 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String playerId, required String playerId,
required String? teamId, required String? teamId,
}) async { }) async {
final rowsAffected = await (update(playerMatchTable) final rowsAffected =
..where( await (update(playerMatchTable)..where(
(p) => p.matchId.equals(matchId) & p.playerId.equals(playerId), (p) => p.matchId.equals(matchId) & p.playerId.equals(playerId),
)) ))
.write(PlayerMatchTableCompanion(teamId: Value(teamId))); .write(PlayerMatchTableCompanion(teamId: Value(teamId)));
@@ -186,11 +186,9 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String matchId, required String matchId,
required String teamId, required String teamId,
}) async { }) async {
final result = await (select(playerMatchTable) final result = await (select(
..where( playerMatchTable,
(p) => p.matchId.equals(matchId) & p.teamId.equals(teamId), )..where((p) => p.matchId.equals(matchId) & p.teamId.equals(teamId))).get();
))
.get();
if (result.isEmpty) return []; if (result.isEmpty) return [];

View File

@@ -11,4 +11,25 @@ mixin _$PlayerMatchDaoMixin on DatabaseAccessor<AppDatabase> {
$TeamTableTable get teamTable => attachedDatabase.teamTable; $TeamTableTable get teamTable => attachedDatabase.teamTable;
$PlayerMatchTableTable get playerMatchTable => $PlayerMatchTableTable get playerMatchTable =>
attachedDatabase.playerMatchTable; attachedDatabase.playerMatchTable;
PlayerMatchDaoManager get managers => PlayerMatchDaoManager(this);
}
class PlayerMatchDaoManager {
final _$PlayerMatchDaoMixin _db;
PlayerMatchDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
$$TeamTableTableTableManager get teamTable =>
$$TeamTableTableTableManager(_db.attachedDatabase, _db.teamTable);
$$PlayerMatchTableTableTableManager get playerMatchTable =>
$$PlayerMatchTableTableTableManager(
_db.attachedDatabase,
_db.playerMatchTable,
);
} }

View File

@@ -1,7 +1,7 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/score_table.dart'; import 'package:tallee/data/db/tables/score_table.dart';
import 'package:tallee/data/dto/score_entry.dart'; import 'package:tallee/data/models/score_entry.dart';
part 'score_dao.g.dart'; part 'score_dao.g.dart';

View File

@@ -9,4 +9,20 @@ mixin _$ScoreDaoMixin on DatabaseAccessor<AppDatabase> {
$GroupTableTable get groupTable => attachedDatabase.groupTable; $GroupTableTable get groupTable => attachedDatabase.groupTable;
$MatchTableTable get matchTable => attachedDatabase.matchTable; $MatchTableTable get matchTable => attachedDatabase.matchTable;
$ScoreTableTable get scoreTable => attachedDatabase.scoreTable; $ScoreTableTable get scoreTable => attachedDatabase.scoreTable;
ScoreDaoManager get managers => ScoreDaoManager(this);
}
class ScoreDaoManager {
final _$ScoreDaoMixin _db;
ScoreDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
$$ScoreTableTableTableManager get scoreTable =>
$$ScoreTableTableTableManager(_db.attachedDatabase, _db.scoreTable);
} }

View File

@@ -1,8 +1,8 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/team_table.dart'; import 'package:tallee/data/db/tables/team_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/team.dart'; import 'package:tallee/data/models/team.dart';
part 'team_dao.g.dart'; part 'team_dao.g.dart';
@@ -144,4 +144,3 @@ class TeamDao extends DatabaseAccessor<AppDatabase> with _$TeamDaoMixin {
return rowsAffected > 0; return rowsAffected > 0;
} }
} }

View File

@@ -5,4 +5,12 @@ part of 'team_dao.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
mixin _$TeamDaoMixin on DatabaseAccessor<AppDatabase> { mixin _$TeamDaoMixin on DatabaseAccessor<AppDatabase> {
$TeamTableTable get teamTable => attachedDatabase.teamTable; $TeamTableTable get teamTable => attachedDatabase.teamTable;
TeamDaoManager get managers => TeamDaoManager(this);
}
class TeamDaoManager {
final _$TeamDaoMixin _db;
TeamDaoManager(this._db);
$$TeamTableTableTableManager get teamTable =>
$$TeamTableTableTableManager(_db.attachedDatabase, _db.teamTable);
} }

View File

@@ -1131,9 +1131,9 @@ class $MatchTableTable extends MatchTable
late final GeneratedColumn<String> name = GeneratedColumn<String>( late final GeneratedColumn<String> name = GeneratedColumn<String>(
'name', 'name',
aliasedName, aliasedName,
true, false,
type: DriftSqlType.string, type: DriftSqlType.string,
requiredDuringInsert: false, requiredDuringInsert: true,
); );
static const VerificationMeta _notesMeta = const VerificationMeta('notes'); static const VerificationMeta _notesMeta = const VerificationMeta('notes');
@override @override
@@ -1212,6 +1212,8 @@ class $MatchTableTable extends MatchTable
_nameMeta, _nameMeta,
name.isAcceptableOrUnknown(data['name']!, _nameMeta), name.isAcceptableOrUnknown(data['name']!, _nameMeta),
); );
} else if (isInserting) {
context.missing(_nameMeta);
} }
if (data.containsKey('notes')) { if (data.containsKey('notes')) {
context.handle( context.handle(
@@ -1257,7 +1259,7 @@ class $MatchTableTable extends MatchTable
name: attachedDatabase.typeMapping.read( name: attachedDatabase.typeMapping.read(
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}name'], data['${effectivePrefix}name'],
), )!,
notes: attachedDatabase.typeMapping.read( notes: attachedDatabase.typeMapping.read(
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}notes'], data['${effectivePrefix}notes'],
@@ -1283,7 +1285,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
final String id; final String id;
final String gameId; final String gameId;
final String? groupId; final String? groupId;
final String? name; final String name;
final String? notes; final String? notes;
final DateTime createdAt; final DateTime createdAt;
final DateTime? endedAt; final DateTime? endedAt;
@@ -1291,7 +1293,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
required this.id, required this.id,
required this.gameId, required this.gameId,
this.groupId, this.groupId,
this.name, required this.name,
this.notes, this.notes,
required this.createdAt, required this.createdAt,
this.endedAt, this.endedAt,
@@ -1304,9 +1306,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
if (!nullToAbsent || groupId != null) { if (!nullToAbsent || groupId != null) {
map['group_id'] = Variable<String>(groupId); map['group_id'] = Variable<String>(groupId);
} }
if (!nullToAbsent || name != null) {
map['name'] = Variable<String>(name); map['name'] = Variable<String>(name);
}
if (!nullToAbsent || notes != null) { if (!nullToAbsent || notes != null) {
map['notes'] = Variable<String>(notes); map['notes'] = Variable<String>(notes);
} }
@@ -1324,7 +1324,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
groupId: groupId == null && nullToAbsent groupId: groupId == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(groupId), : Value(groupId),
name: name == null && nullToAbsent ? const Value.absent() : Value(name), name: Value(name),
notes: notes == null && nullToAbsent notes: notes == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(notes), : Value(notes),
@@ -1344,7 +1344,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
id: serializer.fromJson<String>(json['id']), id: serializer.fromJson<String>(json['id']),
gameId: serializer.fromJson<String>(json['gameId']), gameId: serializer.fromJson<String>(json['gameId']),
groupId: serializer.fromJson<String?>(json['groupId']), groupId: serializer.fromJson<String?>(json['groupId']),
name: serializer.fromJson<String?>(json['name']), name: serializer.fromJson<String>(json['name']),
notes: serializer.fromJson<String?>(json['notes']), notes: serializer.fromJson<String?>(json['notes']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']), createdAt: serializer.fromJson<DateTime>(json['createdAt']),
endedAt: serializer.fromJson<DateTime?>(json['endedAt']), endedAt: serializer.fromJson<DateTime?>(json['endedAt']),
@@ -1357,7 +1357,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
'id': serializer.toJson<String>(id), 'id': serializer.toJson<String>(id),
'gameId': serializer.toJson<String>(gameId), 'gameId': serializer.toJson<String>(gameId),
'groupId': serializer.toJson<String?>(groupId), 'groupId': serializer.toJson<String?>(groupId),
'name': serializer.toJson<String?>(name), 'name': serializer.toJson<String>(name),
'notes': serializer.toJson<String?>(notes), 'notes': serializer.toJson<String?>(notes),
'createdAt': serializer.toJson<DateTime>(createdAt), 'createdAt': serializer.toJson<DateTime>(createdAt),
'endedAt': serializer.toJson<DateTime?>(endedAt), 'endedAt': serializer.toJson<DateTime?>(endedAt),
@@ -1368,7 +1368,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
String? id, String? id,
String? gameId, String? gameId,
Value<String?> groupId = const Value.absent(), Value<String?> groupId = const Value.absent(),
Value<String?> name = const Value.absent(), String? name,
Value<String?> notes = const Value.absent(), Value<String?> notes = const Value.absent(),
DateTime? createdAt, DateTime? createdAt,
Value<DateTime?> endedAt = const Value.absent(), Value<DateTime?> endedAt = const Value.absent(),
@@ -1376,7 +1376,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
id: id ?? this.id, id: id ?? this.id,
gameId: gameId ?? this.gameId, gameId: gameId ?? this.gameId,
groupId: groupId.present ? groupId.value : this.groupId, groupId: groupId.present ? groupId.value : this.groupId,
name: name.present ? name.value : this.name, name: name ?? this.name,
notes: notes.present ? notes.value : this.notes, notes: notes.present ? notes.value : this.notes,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
endedAt: endedAt.present ? endedAt.value : this.endedAt, endedAt: endedAt.present ? endedAt.value : this.endedAt,
@@ -1427,7 +1427,7 @@ class MatchTableCompanion extends UpdateCompanion<MatchTableData> {
final Value<String> id; final Value<String> id;
final Value<String> gameId; final Value<String> gameId;
final Value<String?> groupId; final Value<String?> groupId;
final Value<String?> name; final Value<String> name;
final Value<String?> notes; final Value<String?> notes;
final Value<DateTime> createdAt; final Value<DateTime> createdAt;
final Value<DateTime?> endedAt; final Value<DateTime?> endedAt;
@@ -1446,13 +1446,14 @@ class MatchTableCompanion extends UpdateCompanion<MatchTableData> {
required String id, required String id,
required String gameId, required String gameId,
this.groupId = const Value.absent(), this.groupId = const Value.absent(),
this.name = const Value.absent(), required String name,
this.notes = const Value.absent(), this.notes = const Value.absent(),
required DateTime createdAt, required DateTime createdAt,
this.endedAt = const Value.absent(), this.endedAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : id = Value(id), }) : id = Value(id),
gameId = Value(gameId), gameId = Value(gameId),
name = Value(name),
createdAt = Value(createdAt); createdAt = Value(createdAt);
static Insertable<MatchTableData> custom({ static Insertable<MatchTableData> custom({
Expression<String>? id, Expression<String>? id,
@@ -1480,7 +1481,7 @@ class MatchTableCompanion extends UpdateCompanion<MatchTableData> {
Value<String>? id, Value<String>? id,
Value<String>? gameId, Value<String>? gameId,
Value<String?>? groupId, Value<String?>? groupId,
Value<String?>? name, Value<String>? name,
Value<String?>? notes, Value<String?>? notes,
Value<DateTime>? createdAt, Value<DateTime>? createdAt,
Value<DateTime?>? endedAt, Value<DateTime?>? endedAt,
@@ -2074,17 +2075,8 @@ class $PlayerMatchTableTable extends PlayerMatchTable
'REFERENCES team_table (id)', 'REFERENCES team_table (id)',
), ),
); );
static const VerificationMeta _scoreMeta = const VerificationMeta('score');
@override @override
late final GeneratedColumn<int> score = GeneratedColumn<int>( List<GeneratedColumn> get $columns => [playerId, matchId, teamId];
'score',
aliasedName,
false,
type: DriftSqlType.int,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [playerId, matchId, teamId, score];
@override @override
String get aliasedName => _alias ?? actualTableName; String get aliasedName => _alias ?? actualTableName;
@override @override
@@ -2119,14 +2111,6 @@ class $PlayerMatchTableTable extends PlayerMatchTable
teamId.isAcceptableOrUnknown(data['team_id']!, _teamIdMeta), teamId.isAcceptableOrUnknown(data['team_id']!, _teamIdMeta),
); );
} }
if (data.containsKey('score')) {
context.handle(
_scoreMeta,
score.isAcceptableOrUnknown(data['score']!, _scoreMeta),
);
} else if (isInserting) {
context.missing(_scoreMeta);
}
return context; return context;
} }
@@ -2148,10 +2132,6 @@ class $PlayerMatchTableTable extends PlayerMatchTable
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}team_id'], data['${effectivePrefix}team_id'],
), ),
score: attachedDatabase.typeMapping.read(
DriftSqlType.int,
data['${effectivePrefix}score'],
)!,
); );
} }
@@ -2166,12 +2146,10 @@ class PlayerMatchTableData extends DataClass
final String playerId; final String playerId;
final String matchId; final String matchId;
final String? teamId; final String? teamId;
final int score;
const PlayerMatchTableData({ const PlayerMatchTableData({
required this.playerId, required this.playerId,
required this.matchId, required this.matchId,
this.teamId, this.teamId,
required this.score,
}); });
@override @override
Map<String, Expression> toColumns(bool nullToAbsent) { Map<String, Expression> toColumns(bool nullToAbsent) {
@@ -2181,7 +2159,6 @@ class PlayerMatchTableData extends DataClass
if (!nullToAbsent || teamId != null) { if (!nullToAbsent || teamId != null) {
map['team_id'] = Variable<String>(teamId); map['team_id'] = Variable<String>(teamId);
} }
map['score'] = Variable<int>(score);
return map; return map;
} }
@@ -2192,7 +2169,6 @@ class PlayerMatchTableData extends DataClass
teamId: teamId == null && nullToAbsent teamId: teamId == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(teamId), : Value(teamId),
score: Value(score),
); );
} }
@@ -2205,7 +2181,6 @@ class PlayerMatchTableData extends DataClass
playerId: serializer.fromJson<String>(json['playerId']), playerId: serializer.fromJson<String>(json['playerId']),
matchId: serializer.fromJson<String>(json['matchId']), matchId: serializer.fromJson<String>(json['matchId']),
teamId: serializer.fromJson<String?>(json['teamId']), teamId: serializer.fromJson<String?>(json['teamId']),
score: serializer.fromJson<int>(json['score']),
); );
} }
@override @override
@@ -2215,7 +2190,6 @@ class PlayerMatchTableData extends DataClass
'playerId': serializer.toJson<String>(playerId), 'playerId': serializer.toJson<String>(playerId),
'matchId': serializer.toJson<String>(matchId), 'matchId': serializer.toJson<String>(matchId),
'teamId': serializer.toJson<String?>(teamId), 'teamId': serializer.toJson<String?>(teamId),
'score': serializer.toJson<int>(score),
}; };
} }
@@ -2223,19 +2197,16 @@ class PlayerMatchTableData extends DataClass
String? playerId, String? playerId,
String? matchId, String? matchId,
Value<String?> teamId = const Value.absent(), Value<String?> teamId = const Value.absent(),
int? score,
}) => PlayerMatchTableData( }) => PlayerMatchTableData(
playerId: playerId ?? this.playerId, playerId: playerId ?? this.playerId,
matchId: matchId ?? this.matchId, matchId: matchId ?? this.matchId,
teamId: teamId.present ? teamId.value : this.teamId, teamId: teamId.present ? teamId.value : this.teamId,
score: score ?? this.score,
); );
PlayerMatchTableData copyWithCompanion(PlayerMatchTableCompanion data) { PlayerMatchTableData copyWithCompanion(PlayerMatchTableCompanion data) {
return PlayerMatchTableData( return PlayerMatchTableData(
playerId: data.playerId.present ? data.playerId.value : this.playerId, playerId: data.playerId.present ? data.playerId.value : this.playerId,
matchId: data.matchId.present ? data.matchId.value : this.matchId, matchId: data.matchId.present ? data.matchId.value : this.matchId,
teamId: data.teamId.present ? data.teamId.value : this.teamId, teamId: data.teamId.present ? data.teamId.value : this.teamId,
score: data.score.present ? data.score.value : this.score,
); );
} }
@@ -2244,58 +2215,50 @@ class PlayerMatchTableData extends DataClass
return (StringBuffer('PlayerMatchTableData(') return (StringBuffer('PlayerMatchTableData(')
..write('playerId: $playerId, ') ..write('playerId: $playerId, ')
..write('matchId: $matchId, ') ..write('matchId: $matchId, ')
..write('teamId: $teamId, ') ..write('teamId: $teamId')
..write('score: $score')
..write(')')) ..write(')'))
.toString(); .toString();
} }
@override @override
int get hashCode => Object.hash(playerId, matchId, teamId, score); int get hashCode => Object.hash(playerId, matchId, teamId);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
(other is PlayerMatchTableData && (other is PlayerMatchTableData &&
other.playerId == this.playerId && other.playerId == this.playerId &&
other.matchId == this.matchId && other.matchId == this.matchId &&
other.teamId == this.teamId && other.teamId == this.teamId);
other.score == this.score);
} }
class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> { class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
final Value<String> playerId; final Value<String> playerId;
final Value<String> matchId; final Value<String> matchId;
final Value<String?> teamId; final Value<String?> teamId;
final Value<int> score;
final Value<int> rowid; final Value<int> rowid;
const PlayerMatchTableCompanion({ const PlayerMatchTableCompanion({
this.playerId = const Value.absent(), this.playerId = const Value.absent(),
this.matchId = const Value.absent(), this.matchId = const Value.absent(),
this.teamId = const Value.absent(), this.teamId = const Value.absent(),
this.score = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
PlayerMatchTableCompanion.insert({ PlayerMatchTableCompanion.insert({
required String playerId, required String playerId,
required String matchId, required String matchId,
this.teamId = const Value.absent(), this.teamId = const Value.absent(),
required int score,
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : playerId = Value(playerId), }) : playerId = Value(playerId),
matchId = Value(matchId), matchId = Value(matchId);
score = Value(score);
static Insertable<PlayerMatchTableData> custom({ static Insertable<PlayerMatchTableData> custom({
Expression<String>? playerId, Expression<String>? playerId,
Expression<String>? matchId, Expression<String>? matchId,
Expression<String>? teamId, Expression<String>? teamId,
Expression<int>? score,
Expression<int>? rowid, Expression<int>? rowid,
}) { }) {
return RawValuesInsertable({ return RawValuesInsertable({
if (playerId != null) 'player_id': playerId, if (playerId != null) 'player_id': playerId,
if (matchId != null) 'match_id': matchId, if (matchId != null) 'match_id': matchId,
if (teamId != null) 'team_id': teamId, if (teamId != null) 'team_id': teamId,
if (score != null) 'score': score,
if (rowid != null) 'rowid': rowid, if (rowid != null) 'rowid': rowid,
}); });
} }
@@ -2304,14 +2267,12 @@ class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
Value<String>? playerId, Value<String>? playerId,
Value<String>? matchId, Value<String>? matchId,
Value<String?>? teamId, Value<String?>? teamId,
Value<int>? score,
Value<int>? rowid, Value<int>? rowid,
}) { }) {
return PlayerMatchTableCompanion( return PlayerMatchTableCompanion(
playerId: playerId ?? this.playerId, playerId: playerId ?? this.playerId,
matchId: matchId ?? this.matchId, matchId: matchId ?? this.matchId,
teamId: teamId ?? this.teamId, teamId: teamId ?? this.teamId,
score: score ?? this.score,
rowid: rowid ?? this.rowid, rowid: rowid ?? this.rowid,
); );
} }
@@ -2328,9 +2289,6 @@ class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
if (teamId.present) { if (teamId.present) {
map['team_id'] = Variable<String>(teamId.value); map['team_id'] = Variable<String>(teamId.value);
} }
if (score.present) {
map['score'] = Variable<int>(score.value);
}
if (rowid.present) { if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value); map['rowid'] = Variable<int>(rowid.value);
} }
@@ -2343,7 +2301,6 @@ class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
..write('playerId: $playerId, ') ..write('playerId: $playerId, ')
..write('matchId: $matchId, ') ..write('matchId: $matchId, ')
..write('teamId: $teamId, ') ..write('teamId: $teamId, ')
..write('score: $score, ')
..write('rowid: $rowid') ..write('rowid: $rowid')
..write(')')) ..write(')'))
.toString(); .toString();
@@ -4051,7 +4008,7 @@ typedef $$MatchTableTableCreateCompanionBuilder =
required String id, required String id,
required String gameId, required String gameId,
Value<String?> groupId, Value<String?> groupId,
Value<String?> name, required String name,
Value<String?> notes, Value<String?> notes,
required DateTime createdAt, required DateTime createdAt,
Value<DateTime?> endedAt, Value<DateTime?> endedAt,
@@ -4062,7 +4019,7 @@ typedef $$MatchTableTableUpdateCompanionBuilder =
Value<String> id, Value<String> id,
Value<String> gameId, Value<String> gameId,
Value<String?> groupId, Value<String?> groupId,
Value<String?> name, Value<String> name,
Value<String?> notes, Value<String?> notes,
Value<DateTime> createdAt, Value<DateTime> createdAt,
Value<DateTime?> endedAt, Value<DateTime?> endedAt,
@@ -4520,7 +4477,7 @@ class $$MatchTableTableTableManager
Value<String> id = const Value.absent(), Value<String> id = const Value.absent(),
Value<String> gameId = const Value.absent(), Value<String> gameId = const Value.absent(),
Value<String?> groupId = const Value.absent(), Value<String?> groupId = const Value.absent(),
Value<String?> name = const Value.absent(), Value<String> name = const Value.absent(),
Value<String?> notes = const Value.absent(), Value<String?> notes = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(), Value<DateTime> createdAt = const Value.absent(),
Value<DateTime?> endedAt = const Value.absent(), Value<DateTime?> endedAt = const Value.absent(),
@@ -4540,7 +4497,7 @@ class $$MatchTableTableTableManager
required String id, required String id,
required String gameId, required String gameId,
Value<String?> groupId = const Value.absent(), Value<String?> groupId = const Value.absent(),
Value<String?> name = const Value.absent(), required String name,
Value<String?> notes = const Value.absent(), Value<String?> notes = const Value.absent(),
required DateTime createdAt, required DateTime createdAt,
Value<DateTime?> endedAt = const Value.absent(), Value<DateTime?> endedAt = const Value.absent(),
@@ -5334,7 +5291,6 @@ typedef $$PlayerMatchTableTableCreateCompanionBuilder =
required String playerId, required String playerId,
required String matchId, required String matchId,
Value<String?> teamId, Value<String?> teamId,
required int score,
Value<int> rowid, Value<int> rowid,
}); });
typedef $$PlayerMatchTableTableUpdateCompanionBuilder = typedef $$PlayerMatchTableTableUpdateCompanionBuilder =
@@ -5342,7 +5298,6 @@ typedef $$PlayerMatchTableTableUpdateCompanionBuilder =
Value<String> playerId, Value<String> playerId,
Value<String> matchId, Value<String> matchId,
Value<String?> teamId, Value<String?> teamId,
Value<int> score,
Value<int> rowid, Value<int> rowid,
}); });
@@ -5426,11 +5381,6 @@ class $$PlayerMatchTableTableFilterComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
ColumnFilters<int> get score => $composableBuilder(
column: $table.score,
builder: (column) => ColumnFilters(column),
);
$$PlayerTableTableFilterComposer get playerId { $$PlayerTableTableFilterComposer get playerId {
final $$PlayerTableTableFilterComposer composer = $composerBuilder( final $$PlayerTableTableFilterComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -5510,11 +5460,6 @@ class $$PlayerMatchTableTableOrderingComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
ColumnOrderings<int> get score => $composableBuilder(
column: $table.score,
builder: (column) => ColumnOrderings(column),
);
$$PlayerTableTableOrderingComposer get playerId { $$PlayerTableTableOrderingComposer get playerId {
final $$PlayerTableTableOrderingComposer composer = $composerBuilder( final $$PlayerTableTableOrderingComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -5594,9 +5539,6 @@ class $$PlayerMatchTableTableAnnotationComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
GeneratedColumn<int> get score =>
$composableBuilder(column: $table.score, builder: (column) => column);
$$PlayerTableTableAnnotationComposer get playerId { $$PlayerTableTableAnnotationComposer get playerId {
final $$PlayerTableTableAnnotationComposer composer = $composerBuilder( final $$PlayerTableTableAnnotationComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -5700,13 +5642,11 @@ class $$PlayerMatchTableTableTableManager
Value<String> playerId = const Value.absent(), Value<String> playerId = const Value.absent(),
Value<String> matchId = const Value.absent(), Value<String> matchId = const Value.absent(),
Value<String?> teamId = const Value.absent(), Value<String?> teamId = const Value.absent(),
Value<int> score = const Value.absent(),
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => PlayerMatchTableCompanion( }) => PlayerMatchTableCompanion(
playerId: playerId, playerId: playerId,
matchId: matchId, matchId: matchId,
teamId: teamId, teamId: teamId,
score: score,
rowid: rowid, rowid: rowid,
), ),
createCompanionCallback: createCompanionCallback:
@@ -5714,13 +5654,11 @@ class $$PlayerMatchTableTableTableManager
required String playerId, required String playerId,
required String matchId, required String matchId,
Value<String?> teamId = const Value.absent(), Value<String?> teamId = const Value.absent(),
required int score,
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => PlayerMatchTableCompanion.insert( }) => PlayerMatchTableCompanion.insert(
playerId: playerId, playerId: playerId,
matchId: matchId, matchId: matchId,
teamId: teamId, teamId: teamId,
score: score,
rowid: rowid, rowid: rowid,
), ),
withReferenceMapper: (p0) => p0 withReferenceMapper: (p0) => p0

View File

@@ -1,5 +1,5 @@
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Group { class Group {

View File

@@ -1,9 +1,9 @@
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/score_entry.dart'; import 'package:tallee/data/models/score_entry.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Match { class Match {

View File

@@ -1,5 +1,5 @@
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Team { class Team {
@@ -37,4 +37,3 @@ class Team {
'memberIds': members.map((member) => member.id).toList(), 'memberIds': members.map((member) => member.id).toList(),
}; };
} }

View File

@@ -4,8 +4,8 @@ import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/buttons/custom_width_button.dart'; import 'package:tallee/presentation/widgets/buttons/custom_width_button.dart';
import 'package:tallee/presentation/widgets/player_selection.dart'; import 'package:tallee/presentation/widgets/player_selection.dart';

View File

@@ -4,9 +4,9 @@ import 'package:provider/provider.dart';
import 'package:tallee/core/adaptive_page_route.dart'; import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart'; import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';

View File

@@ -4,8 +4,8 @@ import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart'; import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart';
import 'package:tallee/presentation/views/main_menu/group_view/group_detail_view.dart'; import 'package:tallee/presentation/views/main_menu/group_view/group_detail_view.dart';

View File

@@ -4,10 +4,10 @@ import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';
@@ -42,7 +42,13 @@ class _HomeViewState extends State<HomeView> {
2, 2,
Match( Match(
name: 'Skeleton Match', name: 'Skeleton Match',
game: Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''), game: Game(
name: '',
ruleset: Ruleset.singleWinner,
description: '',
color: GameColor.blue,
icon: '',
),
group: Group( group: Group(
name: 'Skeleton Group', name: 'Skeleton Group',
description: '', description: '',
@@ -104,7 +110,9 @@ class _HomeViewState extends State<HomeView> {
if (recentMatches.isNotEmpty) if (recentMatches.isNotEmpty)
for (Match match in recentMatches) for (Match match in recentMatches)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 6.0), padding: const EdgeInsets.symmetric(
vertical: 6.0,
),
child: MatchTile( child: MatchTile(
compact: true, compact: true,
width: constraints.maxWidth * 0.9, width: constraints.maxWidth * 0.9,
@@ -113,7 +121,8 @@ class _HomeViewState extends State<HomeView> {
await Navigator.of(context).push( await Navigator.of(context).push(
adaptivePageRoute( adaptivePageRoute(
fullscreenDialog: true, fullscreenDialog: true,
builder: (context) => MatchResultView(match: match), builder: (context) =>
MatchResultView(match: match),
), ),
); );
await updatedWinnerInRecentMatches(match.id); await updatedWinnerInRecentMatches(match.id);
@@ -121,7 +130,10 @@ class _HomeViewState extends State<HomeView> {
), ),
) )
else else
Center(heightFactor: 5, child: Text(loc.no_recent_matches_available)), Center(
heightFactor: 5,
child: Text(loc.no_recent_matches_available),
),
], ],
), ),
), ),
@@ -137,22 +149,40 @@ class _HomeViewState extends State<HomeView> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
QuickCreateButton(text: 'Category 1', onPressed: () {}), QuickCreateButton(
QuickCreateButton(text: 'Category 2', onPressed: () {}), text: 'Category 1',
onPressed: () {},
),
QuickCreateButton(
text: 'Category 2',
onPressed: () {},
),
], ],
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
QuickCreateButton(text: 'Category 3', onPressed: () {}), QuickCreateButton(
QuickCreateButton(text: 'Category 4', onPressed: () {}), text: 'Category 3',
onPressed: () {},
),
QuickCreateButton(
text: 'Category 4',
onPressed: () {},
),
], ],
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
QuickCreateButton(text: 'Category 5', onPressed: () {}), QuickCreateButton(
QuickCreateButton(text: 'Category 6', onPressed: () {}), text: 'Category 5',
onPressed: () {},
),
QuickCreateButton(
text: 'Category 6',
onPressed: () {},
),
], ],
), ),
], ],
@@ -181,7 +211,9 @@ class _HomeViewState extends State<HomeView> {
matchCount = results[0] as int; matchCount = results[0] as int;
groupCount = results[1] as int; groupCount = results[1] as int;
loadedRecentMatches = results[2] as List<Match>; loadedRecentMatches = results[2] as List<Match>;
recentMatches = (loadedRecentMatches..sort((a, b) => b.createdAt.compareTo(a.createdAt))) recentMatches =
(loadedRecentMatches
..sort((a, b) => b.createdAt.compareTo(a.createdAt)))
.take(2) .take(2)
.toList(); .toList();
if (mounted) { if (mounted) {

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart'; import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart';
import 'package:tallee/presentation/widgets/tiles/group_tile.dart'; import 'package:tallee/presentation/widgets/tiles/group_tile.dart';

View File

@@ -5,10 +5,10 @@ import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_game_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_game_view.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_group_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_group_view.dart';

View File

@@ -5,7 +5,7 @@ import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/common.dart'; import 'package:tallee/core/common.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart';
import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart';

View File

@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/tiles/custom_radio_list_tile.dart'; import 'package:tallee/presentation/widgets/tiles/custom_radio_list_tile.dart';

View File

@@ -6,10 +6,10 @@ import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart';
import 'package:tallee/presentation/views/main_menu/match_view/match_detail_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/match_detail_view.dart';

View File

@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';
import 'package:tallee/presentation/widgets/tiles/statistics_tile.dart'; import 'package:tallee/presentation/widgets/tiles/statistics_tile.dart';
@@ -167,7 +167,8 @@ class _StatisticsViewState extends State<StatisticsView> {
final playerId = winCounts[i].$1; final playerId = winCounts[i].$1;
final player = players.firstWhere( final player = players.firstWhere(
(p) => p.id == playerId, (p) => p.id == playerId,
orElse: () => Player(id: playerId, name: loc.not_available, description: ''), orElse: () =>
Player(id: playerId, name: loc.not_available, description: ''),
); );
winCounts[i] = (player.name, winCounts[i].$2); winCounts[i] = (player.name, winCounts[i].$2);
} }
@@ -229,7 +230,8 @@ class _StatisticsViewState extends State<StatisticsView> {
final playerId = matchCounts[i].$1; final playerId = matchCounts[i].$1;
final player = players.firstWhere( final player = players.firstWhere(
(p) => p.id == playerId, (p) => p.id == playerId,
orElse: () => Player(id: playerId, name: loc.not_available, description: ''), orElse: () =>
Player(id: playerId, name: loc.not_available, description: ''),
); );
matchCounts[i] = (player.name, matchCounts[i].$2); matchCounts[i] = (player.name, matchCounts[i].$2);
} }

View File

@@ -3,7 +3,7 @@ import 'package:provider/provider.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';
import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart'; import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart';

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart'; import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart';
class GroupTile extends StatefulWidget { class GroupTile extends StatefulWidget {

View File

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:tallee/core/common.dart'; import 'package:tallee/core/common.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart'; import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart';

View File

@@ -8,11 +8,11 @@ import 'package:json_schema/json_schema.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/team.dart'; import 'package:tallee/data/models/team.dart';
class DataTransferService { class DataTransferService {
/// Deletes all data from the database. /// Deletes all data from the database.
@@ -40,24 +40,29 @@ class DataTransferService {
'players': players.map((p) => p.toJson()).toList(), 'players': players.map((p) => p.toJson()).toList(),
'games': games.map((g) => g.toJson()).toList(), 'games': games.map((g) => g.toJson()).toList(),
'groups': groups 'groups': groups
.map((g) => { .map(
(g) => {
'id': g.id, 'id': g.id,
'name': g.name, 'name': g.name,
'description': g.description, 'description': g.description,
'createdAt': g.createdAt.toIso8601String(), 'createdAt': g.createdAt.toIso8601String(),
'memberIds': (g.members).map((m) => m.id).toList(), 'memberIds': (g.members).map((m) => m.id).toList(),
}) },
)
.toList(), .toList(),
'teams': teams 'teams': teams
.map((t) => { .map(
(t) => {
'id': t.id, 'id': t.id,
'name': t.name, 'name': t.name,
'createdAt': t.createdAt.toIso8601String(), 'createdAt': t.createdAt.toIso8601String(),
'memberIds': (t.members).map((m) => m.id).toList(), 'memberIds': (t.members).map((m) => m.id).toList(),
}) },
)
.toList(), .toList(),
'matches': matches 'matches': matches
.map((m) => { .map(
(m) => {
'id': m.id, 'id': m.id,
'name': m.name, 'name': m.name,
'createdAt': m.createdAt.toIso8601String(), 'createdAt': m.createdAt.toIso8601String(),
@@ -66,7 +71,8 @@ class DataTransferService {
'groupId': m.group?.id, 'groupId': m.group?.id,
'playerIds': m.players.map((p) => p.id).toList(), 'playerIds': m.players.map((p) => p.id).toList(),
'notes': m.notes, 'notes': m.notes,
}) },
)
.toList(), .toList(),
}; };
@@ -80,7 +86,7 @@ class DataTransferService {
/// [fileName] The desired name for the exported file (without extension). /// [fileName] The desired name for the exported file (without extension).
static Future<ExportResult> exportData( static Future<ExportResult> exportData(
String jsonString, String jsonString,
String fileName String fileName,
) async { ) async {
try { try {
final bytes = Uint8List.fromList(utf8.encode(jsonString)); final bytes = Uint8List.fromList(utf8.encode(jsonString));
@@ -94,7 +100,6 @@ class DataTransferService {
} else { } else {
return ExportResult.success; return ExportResult.success;
} }
} catch (e, stack) { } catch (e, stack) {
print('[exportData] $e'); print('[exportData] $e');
print(stack); print(stack);
@@ -122,13 +127,19 @@ class DataTransferService {
final isValid = await _validateJsonSchema(jsonString); final isValid = await _validateJsonSchema(jsonString);
if (!isValid) return ImportResult.invalidSchema; if (!isValid) return ImportResult.invalidSchema;
final Map<String, dynamic> decoded = json.decode(jsonString) as Map<String, dynamic>; final Map<String, dynamic> decoded =
json.decode(jsonString) as Map<String, dynamic>;
final List<dynamic> playersJson = (decoded['players'] as List<dynamic>?) ?? []; final List<dynamic> playersJson =
final List<dynamic> gamesJson = (decoded['games'] as List<dynamic>?) ?? []; (decoded['players'] as List<dynamic>?) ?? [];
final List<dynamic> groupsJson = (decoded['groups'] as List<dynamic>?) ?? []; final List<dynamic> gamesJson =
final List<dynamic> teamsJson = (decoded['teams'] as List<dynamic>?) ?? []; (decoded['games'] as List<dynamic>?) ?? [];
final List<dynamic> matchesJson = (decoded['matches'] as List<dynamic>?) ?? []; final List<dynamic> groupsJson =
(decoded['groups'] as List<dynamic>?) ?? [];
final List<dynamic> teamsJson =
(decoded['teams'] as List<dynamic>?) ?? [];
final List<dynamic> matchesJson =
(decoded['matches'] as List<dynamic>?) ?? [];
// Import Players // Import Players
final List<Player> importedPlayers = playersJson final List<Player> importedPlayers = playersJson
@@ -151,7 +162,8 @@ class DataTransferService {
// Import Groups // Import Groups
final List<Group> importedGroups = groupsJson.map((g) { final List<Group> importedGroups = groupsJson.map((g) {
final map = g as Map<String, dynamic>; final map = g as Map<String, dynamic>;
final memberIds = (map['memberIds'] as List<dynamic>? ?? []).cast<String>(); final memberIds = (map['memberIds'] as List<dynamic>? ?? [])
.cast<String>();
final members = memberIds final members = memberIds
.map((id) => playerById[id]) .map((id) => playerById[id])
@@ -174,7 +186,8 @@ class DataTransferService {
// Import Teams // Import Teams
final List<Team> importedTeams = teamsJson.map((t) { final List<Team> importedTeams = teamsJson.map((t) {
final map = t as Map<String, dynamic>; final map = t as Map<String, dynamic>;
final memberIds = (map['memberIds'] as List<dynamic>? ?? []).cast<String>(); final memberIds = (map['memberIds'] as List<dynamic>? ?? [])
.cast<String>();
final members = memberIds final members = memberIds
.map((id) => playerById[id]) .map((id) => playerById[id])
@@ -195,8 +208,11 @@ class DataTransferService {
final String gameId = map['gameId'] as String; final String gameId = map['gameId'] as String;
final String? groupId = map['groupId'] as String?; final String? groupId = map['groupId'] as String?;
final List<String> playerIds = (map['playerIds'] as List<dynamic>? ?? []).cast<String>(); final List<String> playerIds =
final DateTime? endedAt = map['endedAt'] != null ? DateTime.parse(map['endedAt'] as String) : null; (map['playerIds'] as List<dynamic>? ?? []).cast<String>();
final DateTime? endedAt = map['endedAt'] != null
? DateTime.parse(map['endedAt'] as String)
: null;
final game = gameById[gameId]; final game = gameById[gameId];
final group = (groupId == null) ? null : groupById[groupId]; final group = (groupId == null) ? null : groupById[groupId];
@@ -208,7 +224,15 @@ class DataTransferService {
return Match( return Match(
id: map['id'] as String, id: map['id'] as String,
name: map['name'] as String, name: map['name'] as String,
game: game ?? Game(name: 'Unknown', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''), game:
game ??
Game(
name: 'Unknown',
ruleset: Ruleset.singleWinner,
description: '',
color: GameColor.blue,
icon: '',
),
group: group, group: group,
players: players, players: players,
createdAt: DateTime.parse(map['createdAt'] as String), createdAt: DateTime.parse(map['createdAt'] as String),

View File

@@ -3,8 +3,8 @@ import 'package:drift/drift.dart' hide isNull;
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -62,7 +62,6 @@ void main() {
await database.close(); await database.close();
}); });
group('Group Tests', () { group('Group Tests', () {
// Verifies that a single group can be added and retrieved with all fields and members intact. // Verifies that a single group can be added and retrieved with all fields and members intact.
test('Adding and fetching a single group works correctly', () async { test('Adding and fetching a single group works correctly', () async {
await database.groupDao.addGroup(group: testGroup1); await database.groupDao.addGroup(group: testGroup1);
@@ -277,20 +276,20 @@ void main() {
}); });
// Verifies that updateGroupDescription returns false for a non-existent group. // Verifies that updateGroupDescription returns false for a non-existent group.
test('updateGroupDescription returns false for non-existent group', test(
'updateGroupDescription returns false for non-existent group',
() async { () async {
final updated = await database.groupDao.updateGroupDescription( final updated = await database.groupDao.updateGroupDescription(
groupId: 'non-existent-id', groupId: 'non-existent-id',
newDescription: 'New Description', newDescription: 'New Description',
); );
expect(updated, false); expect(updated, false);
}); },
);
// Verifies that deleteAllGroups removes all groups from the database. // Verifies that deleteAllGroups removes all groups from the database.
test('deleteAllGroups removes all groups', () async { test('deleteAllGroups removes all groups', () async {
await database.groupDao.addGroupsAsList( await database.groupDao.addGroupsAsList(groups: [testGroup1, testGroup2]);
groups: [testGroup1, testGroup2],
);
final countBefore = await database.groupDao.getGroupCount(); final countBefore = await database.groupDao.getGroupCount();
expect(countBefore, 2); expect(countBefore, 2);

View File

@@ -4,10 +4,10 @@ import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;

View File

@@ -2,12 +2,12 @@ import 'package:clock/clock.dart';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart';
import 'package:tallee/data/dto/match.dart';
import 'package:tallee/data/dto/player.dart';
import 'package:tallee/data/dto/team.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/models/team.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -37,20 +37,23 @@ void main() {
testPlayer2 = Player(name: 'Bob', description: ''); testPlayer2 = Player(name: 'Bob', description: '');
testPlayer3 = Player(name: 'Charlie', description: ''); testPlayer3 = Player(name: 'Charlie', description: '');
testPlayer4 = Player(name: 'Diana', description: ''); testPlayer4 = Player(name: 'Diana', description: '');
testTeam1 = Team( testTeam1 = Team(name: 'Team Alpha', members: [testPlayer1, testPlayer2]);
name: 'Team Alpha', testTeam2 = Team(name: 'Team Beta', members: [testPlayer3, testPlayer4]);
members: [testPlayer1, testPlayer2], testTeam3 = Team(name: 'Team Gamma', members: [testPlayer1, testPlayer3]);
testGame1 = Game(
name: 'Game 1',
ruleset: Ruleset.singleWinner,
description: 'Test game 1',
color: GameColor.blue,
icon: '',
); );
testTeam2 = Team( testGame2 = Game(
name: 'Team Beta', name: 'Game 2',
members: [testPlayer3, testPlayer4], ruleset: Ruleset.highestScore,
description: 'Test game 2',
color: GameColor.red,
icon: '',
); );
testTeam3 = Team(
name: 'Team Gamma',
members: [testPlayer1, testPlayer3],
);
testGame1 = Game(name: 'Game 1', ruleset: Ruleset.singleWinner, description: 'Test game 1', color: GameColor.blue, icon: '');
testGame2 = Game(name: 'Game 2', ruleset: Ruleset.highestScore, description: 'Test game 2', color: GameColor.red, icon: '');
}); });
await database.playerDao.addPlayersAsList( await database.playerDao.addPlayersAsList(
@@ -65,7 +68,6 @@ void main() {
}); });
group('Team Tests', () { group('Team Tests', () {
// Verifies that a single team can be added and retrieved with all fields intact. // Verifies that a single team can be added and retrieved with all fields intact.
test('Adding and fetching a single team works correctly', () async { test('Adding and fetching a single team works correctly', () async {
final added = await database.teamDao.addTeam(team: testTeam1); final added = await database.teamDao.addTeam(team: testTeam1);
@@ -285,10 +287,7 @@ void main() {
test('Updating team name to empty string works', () async { test('Updating team name to empty string works', () async {
await database.teamDao.addTeam(team: testTeam1); await database.teamDao.addTeam(team: testTeam1);
await database.teamDao.updateTeamName( await database.teamDao.updateTeamName(teamId: testTeam1.id, newName: '');
teamId: testTeam1.id,
newName: '',
);
final updatedTeam = await database.teamDao.getTeamById( final updatedTeam = await database.teamDao.getTeamById(
teamId: testTeam1.id, teamId: testTeam1.id,
@@ -350,9 +349,7 @@ void main() {
await database.matchDao.addMatch(match: match2); await database.matchDao.addMatch(match: match2);
// Add teams to database // Add teams to database
await database.teamDao.addTeamsAsList( await database.teamDao.addTeamsAsList(teams: [testTeam1, testTeam3]);
teams: [testTeam1, testTeam3],
);
// Associate players with teams through match1 // Associate players with teams through match1
// testTeam1: player1, player2 // testTeam1: player1, player2
@@ -420,10 +417,11 @@ void main() {
final allTeams = await database.teamDao.getAllTeams(); final allTeams = await database.teamDao.getAllTeams();
expect(allTeams.length, 3); expect(allTeams.length, 3);
expect( expect(allTeams.map((t) => t.id).toSet(), {
allTeams.map((t) => t.id).toSet(), testTeam1.id,
{testTeam1.id, testTeam2.id, testTeam3.id}, testTeam2.id,
); testTeam3.id,
});
}); });
// Verifies that teamExists returns false for deleted teams. // Verifies that teamExists returns false for deleted teams.
@@ -462,9 +460,7 @@ void main() {
// Verifies that addTeam after deleteAllTeams works correctly. // Verifies that addTeam after deleteAllTeams works correctly.
test('Adding team after deleteAllTeams works correctly', () async { test('Adding team after deleteAllTeams works correctly', () async {
await database.teamDao.addTeamsAsList( await database.teamDao.addTeamsAsList(teams: [testTeam1, testTeam2]);
teams: [testTeam1, testTeam2],
);
expect(await database.teamDao.getTeamCount(), 2); expect(await database.teamDao.getTeamCount(), 2);
await database.teamDao.deleteAllTeams(); await database.teamDao.deleteAllTeams();

View File

@@ -4,7 +4,7 @@ import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -54,7 +54,6 @@ void main() {
}); });
group('Game Tests', () { group('Game Tests', () {
// Verifies that getAllGames returns an empty list when the database has no games. // Verifies that getAllGames returns an empty list when the database has no games.
test('getAllGames returns empty list when no games exist', () async { test('getAllGames returns empty list when no games exist', () async {
final allGames = await database.gameDao.getAllGames(); final allGames = await database.gameDao.getAllGames();
@@ -134,7 +133,13 @@ void main() {
// Verifies that a game with empty optional fields can be added and retrieved. // Verifies that a game with empty optional fields can be added and retrieved.
test('addGame handles game with null optional fields', () async { test('addGame handles game with null optional fields', () async {
final gameWithNulls = Game(name: 'Simple Game', ruleset: Ruleset.lowestScore, description: 'A simple game', color: GameColor.green, icon: ''); final gameWithNulls = Game(
name: 'Simple Game',
ruleset: Ruleset.lowestScore,
description: 'A simple game',
color: GameColor.green,
icon: '',
);
final result = await database.gameDao.addGame(game: gameWithNulls); final result = await database.gameDao.addGame(game: gameWithNulls);
expect(result, true); expect(result, true);
@@ -419,9 +424,7 @@ void main() {
// Verifies that getGameCount updates correctly after deleting a game. // Verifies that getGameCount updates correctly after deleting a game.
test('getGameCount updates correctly after deletion', () async { test('getGameCount updates correctly after deletion', () async {
await database.gameDao.addGamesAsList( await database.gameDao.addGamesAsList(games: [testGame1, testGame2]);
games: [testGame1, testGame2],
);
final countBefore = await database.gameDao.getGameCount(); final countBefore = await database.gameDao.getGameCount();
expect(countBefore, 2); expect(countBefore, 2);

View File

@@ -3,7 +3,7 @@ import 'package:drift/drift.dart' hide isNull;
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -35,7 +35,6 @@ void main() {
}); });
group('Player Tests', () { group('Player Tests', () {
// Verifies that players can be added and retrieved with all fields intact. // Verifies that players can be added and retrieved with all fields intact.
test('Adding and fetching single player works correctly', () async { test('Adding and fetching single player works correctly', () async {
await database.playerDao.addPlayer(player: testPlayer1); await database.playerDao.addPlayer(player: testPlayer1);
@@ -264,8 +263,13 @@ void main() {
}); });
// Verifies that a player with special characters in name is stored correctly. // Verifies that a player with special characters in name is stored correctly.
test('Player with special characters in name is stored correctly', () async { test(
final specialPlayer = Player(name: 'Test!@#\$%^&*()_+-=[]{}|;\':",.<>?/`~', description: ''); 'Player with special characters in name is stored correctly',
() async {
final specialPlayer = Player(
name: 'Test!@#\$%^&*()_+-=[]{}|;\':",.<>?/`~',
description: '',
);
await database.playerDao.addPlayer(player: specialPlayer); await database.playerDao.addPlayer(player: specialPlayer);
@@ -273,7 +277,8 @@ void main() {
playerId: specialPlayer.id, playerId: specialPlayer.id,
); );
expect(fetchedPlayer.name, specialPlayer.name); expect(fetchedPlayer.name, specialPlayer.name);
}); },
);
// Verifies that a player with description is stored correctly. // Verifies that a player with description is stored correctly.
test('Player with description is stored correctly', () async { test('Player with description is stored correctly', () async {
@@ -293,7 +298,10 @@ void main() {
// Verifies that a player with null description is stored correctly. // Verifies that a player with null description is stored correctly.
test('Player with null description is stored correctly', () async { test('Player with null description is stored correctly', () async {
final playerWithoutDescription = Player(name: 'No Description Player', description: ''); final playerWithoutDescription = Player(
name: 'No Description Player',
description: '',
);
await database.playerDao.addPlayer(player: playerWithoutDescription); await database.playerDao.addPlayer(player: playerWithoutDescription);

View File

@@ -3,8 +3,8 @@ import 'package:drift/drift.dart';
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -42,7 +42,6 @@ void main() {
}); });
group('Player-Group Tests', () { group('Player-Group Tests', () {
// Verifies that a player can be added to an existing group and isPlayerInGroup returns true. // Verifies that a player can be added to an existing group and isPlayerInGroup returns true.
test('Adding a player to a group works correctly', () async { test('Adding a player to a group works correctly', () async {
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
@@ -127,7 +126,9 @@ void main() {
}); });
// Verifies that addPlayerToGroup returns false when player already in group. // Verifies that addPlayerToGroup returns false when player already in group.
test('addPlayerToGroup returns false when player already in group', () async { test(
'addPlayerToGroup returns false when player already in group',
() async {
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
// testPlayer1 is already in testGroup via group creation // testPlayer1 is already in testGroup via group creation
@@ -137,10 +138,13 @@ void main() {
); );
expect(result, false); expect(result, false);
}); },
);
// Verifies that addPlayerToGroup adds player to player table if not exists. // Verifies that addPlayerToGroup adds player to player table if not exists.
test('addPlayerToGroup adds player to player table if not exists', () async { test(
'addPlayerToGroup adds player to player table if not exists',
() async {
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
// testPlayer4 is not in the database yet // testPlayer4 is not in the database yet
@@ -159,10 +163,13 @@ void main() {
playerId: testPlayer4.id, playerId: testPlayer4.id,
); );
expect(playerExists, true); expect(playerExists, true);
}); },
);
// Verifies that removePlayerFromGroup returns false for non-existent player. // Verifies that removePlayerFromGroup returns false for non-existent player.
test('removePlayerFromGroup returns false for non-existent player', () async { test(
'removePlayerFromGroup returns false for non-existent player',
() async {
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
final result = await database.playerGroupDao.removePlayerFromGroup( final result = await database.playerGroupDao.removePlayerFromGroup(
@@ -171,10 +178,13 @@ void main() {
); );
expect(result, false); expect(result, false);
}); },
);
// Verifies that removePlayerFromGroup returns false for non-existent group. // Verifies that removePlayerFromGroup returns false for non-existent group.
test('removePlayerFromGroup returns false for non-existent group', () async { test(
'removePlayerFromGroup returns false for non-existent group',
() async {
await database.playerDao.addPlayer(player: testPlayer1); await database.playerDao.addPlayer(player: testPlayer1);
final result = await database.playerGroupDao.removePlayerFromGroup( final result = await database.playerGroupDao.removePlayerFromGroup(
@@ -183,11 +193,16 @@ void main() {
); );
expect(result, false); expect(result, false);
}); },
);
// Verifies that getPlayersOfGroup returns empty list for group with no members. // Verifies that getPlayersOfGroup returns empty list for group with no members.
test('getPlayersOfGroup returns empty list for empty group', () async { test('getPlayersOfGroup returns empty list for empty group', () async {
final emptyGroup = Group(name: 'Empty Group', description: '', members: []); final emptyGroup = Group(
name: 'Empty Group',
description: '',
members: [],
);
await database.groupDao.addGroup(group: emptyGroup); await database.groupDao.addGroup(group: emptyGroup);
final players = await database.playerGroupDao.getPlayersOfGroup( final players = await database.playerGroupDao.getPlayersOfGroup(
@@ -198,13 +213,16 @@ void main() {
}); });
// Verifies that getPlayersOfGroup returns empty list for non-existent group. // Verifies that getPlayersOfGroup returns empty list for non-existent group.
test('getPlayersOfGroup returns empty list for non-existent group', () async { test(
'getPlayersOfGroup returns empty list for non-existent group',
() async {
final players = await database.playerGroupDao.getPlayersOfGroup( final players = await database.playerGroupDao.getPlayersOfGroup(
groupId: 'non-existent-group-id', groupId: 'non-existent-group-id',
); );
expect(players, isEmpty); expect(players, isEmpty);
}); },
);
// Verifies that removing all players from a group leaves the group empty. // Verifies that removing all players from a group leaves the group empty.
test('Removing all players from a group leaves group empty', () async { test('Removing all players from a group leaves group empty', () async {
@@ -231,7 +249,11 @@ void main() {
// Verifies that a player can be in multiple groups. // Verifies that a player can be in multiple groups.
test('Player can be in multiple groups', () async { test('Player can be in multiple groups', () async {
final secondGroup = Group(name: 'Second Group', description: '', members: []); final secondGroup = Group(
name: 'Second Group',
description: '',
members: [],
);
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
await database.groupDao.addGroup(group: secondGroup); await database.groupDao.addGroup(group: secondGroup);
@@ -255,8 +277,14 @@ void main() {
}); });
// Verifies that removing player from one group doesn't affect other groups. // Verifies that removing player from one group doesn't affect other groups.
test('Removing player from one group does not affect other groups', () async { test(
final secondGroup = Group(name: 'Second Group', description: '', members: [testPlayer1]); 'Removing player from one group does not affect other groups',
() async {
final secondGroup = Group(
name: 'Second Group',
description: '',
members: [testPlayer1],
);
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
await database.groupDao.addGroup(group: secondGroup); await database.groupDao.addGroup(group: secondGroup);
@@ -277,7 +305,8 @@ void main() {
expect(inFirstGroup, false); expect(inFirstGroup, false);
expect(inSecondGroup, true); expect(inSecondGroup, true);
}); },
);
// Verifies that addPlayerToGroup returns true on successful addition. // Verifies that addPlayerToGroup returns true on successful addition.
test('addPlayerToGroup returns true on successful addition', () async { test('addPlayerToGroup returns true on successful addition', () async {
@@ -293,21 +322,26 @@ void main() {
}); });
// Verifies that removing the same player twice returns false on second attempt. // Verifies that removing the same player twice returns false on second attempt.
test('Removing same player twice returns false on second attempt', () async { test(
'Removing same player twice returns false on second attempt',
() async {
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
final firstRemoval = await database.playerGroupDao.removePlayerFromGroup( final firstRemoval = await database.playerGroupDao
.removePlayerFromGroup(
playerId: testPlayer1.id, playerId: testPlayer1.id,
groupId: testGroup.id, groupId: testGroup.id,
); );
expect(firstRemoval, true); expect(firstRemoval, true);
final secondRemoval = await database.playerGroupDao.removePlayerFromGroup( final secondRemoval = await database.playerGroupDao
.removePlayerFromGroup(
playerId: testPlayer1.id, playerId: testPlayer1.id,
groupId: testGroup.id, groupId: testGroup.id,
); );
expect(secondRemoval, false); expect(secondRemoval, false);
}); },
);
// Verifies that replaceGroupPlayers removes all existing players and replaces with new list. // Verifies that replaceGroupPlayers removes all existing players and replaces with new list.
test('replaceGroupPlayers replaces all group members correctly', () async { test('replaceGroupPlayers replaces all group members correctly', () async {

View File

@@ -4,11 +4,11 @@ import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/team.dart'; import 'package:tallee/data/models/team.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -48,7 +48,13 @@ void main() {
description: '', description: '',
members: [testPlayer1, testPlayer2, testPlayer3], members: [testPlayer1, testPlayer2, testPlayer3],
); );
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: ''); testGame = Game(
name: 'Test Game',
ruleset: Ruleset.singleWinner,
description: 'A test game',
color: GameColor.blue,
icon: '',
);
testMatchOnlyGroup = Match( testMatchOnlyGroup = Match(
name: 'Test Match with Group', name: 'Test Match with Group',
game: testGame, game: testGame,
@@ -61,14 +67,8 @@ void main() {
players: [testPlayer4, testPlayer5, testPlayer6], players: [testPlayer4, testPlayer5, testPlayer6],
notes: '', notes: '',
); );
testTeam1 = Team( testTeam1 = Team(name: 'Team Alpha', members: [testPlayer1, testPlayer2]);
name: 'Team Alpha', testTeam2 = Team(name: 'Team Beta', members: [testPlayer3, testPlayer4]);
members: [testPlayer1, testPlayer2],
);
testTeam2 = Team(
name: 'Team Beta',
members: [testPlayer3, testPlayer4],
);
}); });
await database.playerDao.addPlayersAsList( await database.playerDao.addPlayersAsList(
players: [ players: [
@@ -88,7 +88,6 @@ void main() {
}); });
group('Player-Match Tests', () { group('Player-Match Tests', () {
// Verifies that matchHasPlayers returns false initially and true after adding a player. // Verifies that matchHasPlayers returns false initially and true after adding a player.
test('Match has player works correctly', () async { test('Match has player works correctly', () async {
await database.matchDao.addMatch(match: testMatchOnlyGroup); await database.matchDao.addMatch(match: testMatchOnlyGroup);
@@ -153,26 +152,23 @@ void main() {
); );
expect(result.players.length, testMatchOnlyPlayers.players.length - 1); expect(result.players.length, testMatchOnlyPlayers.players.length - 1);
final playerExists = result.players.any( final playerExists = result.players.any((p) => p.id == playerToRemove.id);
(p) => p.id == playerToRemove.id,
);
expect(playerExists, false); expect(playerExists, false);
}); });
// Verifies that getPlayersOfMatch returns all players of a match with correct data. // Verifies that getPlayersOfMatch returns all players of a match with correct data.
test('Retrieving players of a match works correctly', () async { test('Retrieving players of a match works correctly', () async {
await database.matchDao.addMatch(match: testMatchOnlyPlayers); await database.matchDao.addMatch(match: testMatchOnlyPlayers);
final players = await database.playerMatchDao.getPlayersOfMatch( final players =
await database.playerMatchDao.getPlayersOfMatch(
matchId: testMatchOnlyPlayers.id, matchId: testMatchOnlyPlayers.id,
) ?? []; ) ??
[];
for (int i = 0; i < players.length; i++) { for (int i = 0; i < players.length; i++) {
expect(players[i].id, testMatchOnlyPlayers.players[i].id); expect(players[i].id, testMatchOnlyPlayers.players[i].id);
expect(players[i].name, testMatchOnlyPlayers.players[i].name); expect(players[i].name, testMatchOnlyPlayers.players[i].name);
expect( expect(players[i].createdAt, testMatchOnlyPlayers.players[i].createdAt);
players[i].createdAt,
testMatchOnlyPlayers.players[i].createdAt,
);
} }
}); });
@@ -225,8 +221,18 @@ void main() {
'Adding the same player to separate matches works correctly', 'Adding the same player to separate matches works correctly',
() async { () async {
final playersList = [testPlayer1, testPlayer2, testPlayer3]; final playersList = [testPlayer1, testPlayer2, testPlayer3];
final match1 = Match(name: 'Match 1', game: testGame, players: playersList, notes: ''); final match1 = Match(
final match2 = Match(name: 'Match 2', game: testGame, players: playersList, notes: ''); name: 'Match 1',
game: testGame,
players: playersList,
notes: '',
);
final match2 = Match(
name: 'Match 2',
game: testGame,
players: playersList,
notes: '',
);
await Future.wait([ await Future.wait([
database.matchDao.addMatch(match: match1), database.matchDao.addMatch(match: match1),
@@ -299,7 +305,9 @@ void main() {
}); });
// Verifies that getPlayerScore returns null for non-existent player-match combination. // Verifies that getPlayerScore returns null for non-existent player-match combination.
test('getPlayerScore returns null for non-existent player in match', () async { test(
'getPlayerScore returns null for non-existent player in match',
() async {
await database.matchDao.addMatch(match: testMatchOnlyGroup); await database.matchDao.addMatch(match: testMatchOnlyGroup);
final score = await database.playerMatchDao.getPlayerScore( final score = await database.playerMatchDao.getPlayerScore(
@@ -308,7 +316,8 @@ void main() {
); );
expect(score, isNull); expect(score, isNull);
}); },
);
// Verifies that updatePlayerScore updates the score correctly. // Verifies that updatePlayerScore updates the score correctly.
test('updatePlayerScore updates score correctly', () async { test('updatePlayerScore updates score correctly', () async {
@@ -331,7 +340,9 @@ void main() {
}); });
// Verifies that updatePlayerScore returns false for non-existent player-match. // Verifies that updatePlayerScore returns false for non-existent player-match.
test('updatePlayerScore returns false for non-existent player-match', () async { test(
'updatePlayerScore returns false for non-existent player-match',
() async {
await database.matchDao.addMatch(match: testMatchOnlyGroup); await database.matchDao.addMatch(match: testMatchOnlyGroup);
final updated = await database.playerMatchDao.updatePlayerScore( final updated = await database.playerMatchDao.updatePlayerScore(
@@ -341,7 +352,8 @@ void main() {
); );
expect(updated, false); expect(updated, false);
}); },
);
// Verifies that adding a player with teamId works correctly. // Verifies that adding a player with teamId works correctly.
test('Adding player with teamId works correctly', () async { test('Adding player with teamId works correctly', () async {
@@ -431,7 +443,9 @@ void main() {
}); });
// Verifies that updatePlayerTeam returns false for non-existent player-match. // Verifies that updatePlayerTeam returns false for non-existent player-match.
test('updatePlayerTeam returns false for non-existent player-match', () async { test(
'updatePlayerTeam returns false for non-existent player-match',
() async {
await database.matchDao.addMatch(match: testMatchOnlyGroup); await database.matchDao.addMatch(match: testMatchOnlyGroup);
final updated = await database.playerMatchDao.updatePlayerTeam( final updated = await database.playerMatchDao.updatePlayerTeam(
@@ -441,7 +455,8 @@ void main() {
); );
expect(updated, false); expect(updated, false);
}); },
);
// Verifies that getPlayersInTeam returns empty list for non-existent team. // Verifies that getPlayersInTeam returns empty list for non-existent team.
test('getPlayersInTeam returns empty list for non-existent team', () async { test('getPlayersInTeam returns empty list for non-existent team', () async {
@@ -483,7 +498,9 @@ void main() {
}); });
// Verifies that removePlayerFromMatch returns false for non-existent player. // Verifies that removePlayerFromMatch returns false for non-existent player.
test('removePlayerFromMatch returns false for non-existent player', () async { test(
'removePlayerFromMatch returns false for non-existent player',
() async {
await database.matchDao.addMatch(match: testMatchOnlyPlayers); await database.matchDao.addMatch(match: testMatchOnlyPlayers);
final removed = await database.playerMatchDao.removePlayerFromMatch( final removed = await database.playerMatchDao.removePlayerFromMatch(
@@ -492,7 +509,8 @@ void main() {
); );
expect(removed, false); expect(removed, false);
}); },
);
// Verifies that adding the same player twice to the same match is ignored. // Verifies that adding the same player twice to the same match is ignored.
test('Adding same player twice to same match is ignored', () async { test('Adding same player twice to same match is ignored', () async {
@@ -528,7 +546,9 @@ void main() {
}); });
// Verifies that updatePlayersFromMatch with empty list removes all players. // Verifies that updatePlayersFromMatch with empty list removes all players.
test('updatePlayersFromMatch with empty list removes all players', () async { test(
'updatePlayersFromMatch with empty list removes all players',
() async {
await database.matchDao.addMatch(match: testMatchOnlyPlayers); await database.matchDao.addMatch(match: testMatchOnlyPlayers);
// Verify players exist initially // Verify players exist initially
@@ -548,7 +568,8 @@ void main() {
matchId: testMatchOnlyPlayers.id, matchId: testMatchOnlyPlayers.id,
); );
expect(players, isNull); expect(players, isNull);
}); },
);
// Verifies that updatePlayersFromMatch with same players makes no changes. // Verifies that updatePlayersFromMatch with same players makes no changes.
test('updatePlayersFromMatch with same players makes no changes', () async { test('updatePlayersFromMatch with same players makes no changes', () async {
@@ -702,7 +723,9 @@ void main() {
}); });
// Verifies that getPlayersInTeam returns empty list for non-existent match. // Verifies that getPlayersInTeam returns empty list for non-existent match.
test('getPlayersInTeam returns empty list for non-existent match', () async { test(
'getPlayersInTeam returns empty list for non-existent match',
() async {
await database.teamDao.addTeam(team: testTeam1); await database.teamDao.addTeam(team: testTeam1);
final players = await database.playerMatchDao.getPlayersInTeam( final players = await database.playerMatchDao.getPlayersInTeam(
@@ -711,7 +734,8 @@ void main() {
); );
expect(players.isEmpty, true); expect(players.isEmpty, true);
}); },
);
// Verifies that players in different teams within the same match are returned correctly. // Verifies that players in different teams within the same match are returned correctly.
test('Players in different teams within same match are separate', () async { test('Players in different teams within same match are separate', () async {
@@ -759,8 +783,18 @@ void main() {
// Verifies that removePlayerFromMatch does not affect other matches. // Verifies that removePlayerFromMatch does not affect other matches.
test('removePlayerFromMatch does not affect other matches', () async { test('removePlayerFromMatch does not affect other matches', () async {
final playersList = [testPlayer1, testPlayer2]; final playersList = [testPlayer1, testPlayer2];
final match1 = Match(name: 'Match 1', game: testGame, players: playersList, notes: ''); final match1 = Match(
final match2 = Match(name: 'Match 2', game: testGame, players: playersList, notes: ''); name: 'Match 1',
game: testGame,
players: playersList,
notes: '',
);
final match2 = Match(
name: 'Match 2',
game: testGame,
players: playersList,
notes: '',
);
await Future.wait([ await Future.wait([
database.matchDao.addMatch(match: match1), database.matchDao.addMatch(match: match1),
@@ -792,8 +826,18 @@ void main() {
// Verifies that updating scores for players in different matches are independent. // Verifies that updating scores for players in different matches are independent.
test('Player scores are independent across matches', () async { test('Player scores are independent across matches', () async {
final playersList = [testPlayer1]; final playersList = [testPlayer1];
final match1 = Match(name: 'Match 1', game: testGame, players: playersList, notes: ''); final match1 = Match(
final match2 = Match(name: 'Match 2', game: testGame, players: playersList, notes: ''); name: 'Match 1',
game: testGame,
players: playersList,
notes: '',
);
final match2 = Match(
name: 'Match 2',
game: testGame,
players: playersList,
notes: '',
);
await Future.wait([ await Future.wait([
database.matchDao.addMatch(match: match1), database.matchDao.addMatch(match: match1),
@@ -829,7 +873,9 @@ void main() {
}); });
// Verifies that updatePlayersFromMatch on non-existent match fails with constraint error. // Verifies that updatePlayersFromMatch on non-existent match fails with constraint error.
test('updatePlayersFromMatch on non-existent match fails with foreign key constraint', () async { test(
'updatePlayersFromMatch on non-existent match fails with foreign key constraint',
() async {
// Should throw due to foreign key constraint - match doesn't exist // Should throw due to foreign key constraint - match doesn't exist
await expectLater( await expectLater(
database.playerMatchDao.updatePlayersFromMatch( database.playerMatchDao.updatePlayersFromMatch(
@@ -838,7 +884,8 @@ void main() {
), ),
throwsA(anything), throwsA(anything),
); );
}); },
);
// Verifies that a player can be in a match without being assigned to a team. // Verifies that a player can be in a match without being assigned to a team.
test('Player can exist in match without team assignment', () async { test('Player can exist in match without team assignment', () async {

View File

@@ -2,11 +2,11 @@ import 'package:clock/clock.dart';
import 'package:drift/drift.dart' hide isNull, isNotNull; import 'package:drift/drift.dart' hide isNull, isNotNull;
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart';
import 'package:tallee/data/dto/match.dart';
import 'package:tallee/data/dto/player.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -32,7 +32,13 @@ void main() {
testPlayer1 = Player(name: 'Alice', description: ''); testPlayer1 = Player(name: 'Alice', description: '');
testPlayer2 = Player(name: 'Bob', description: ''); testPlayer2 = Player(name: 'Bob', description: '');
testPlayer3 = Player(name: 'Charlie', description: ''); testPlayer3 = Player(name: 'Charlie', description: '');
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: ''); testGame = Game(
name: 'Test Game',
ruleset: Ruleset.singleWinner,
description: 'A test game',
color: GameColor.blue,
icon: '',
);
testMatch1 = Match( testMatch1 = Match(
name: 'Test Match 1', name: 'Test Match 1',
game: testGame, game: testGame,
@@ -60,7 +66,6 @@ void main() {
}); });
group('Score Tests', () { group('Score Tests', () {
// Verifies that a score can be added and retrieved with all fields intact. // Verifies that a score can be added and retrieved with all fields intact.
test('Adding and fetching a score works correctly', () async { test('Adding and fetching a score works correctly', () async {
await database.scoreDao.addScore( await database.scoreDao.addScore(
@@ -431,13 +436,16 @@ void main() {
}); });
// Verifies that getScoresForMatch returns empty list for match with no scores. // Verifies that getScoresForMatch returns empty list for match with no scores.
test('Getting scores for match with no scores returns empty list', () async { test(
'Getting scores for match with no scores returns empty list',
() async {
final scores = await database.scoreDao.getScoresForMatch( final scores = await database.scoreDao.getScoresForMatch(
matchId: testMatch1.id, matchId: testMatch1.id,
); );
expect(scores.isEmpty, true); expect(scores.isEmpty, true);
}); },
);
// Verifies that getPlayerScoresInMatch returns empty list when player has no scores. // Verifies that getPlayerScoresInMatch returns empty list when player has no scores.
test('Getting player scores with no scores returns empty list', () async { test('Getting player scores with no scores returns empty list', () async {
@@ -666,7 +674,9 @@ void main() {
}); });
// Verifies that updating one player's score doesn't affect another player's score in same round. // Verifies that updating one player's score doesn't affect another player's score in same round.
test('Updating one player score does not affect other players in same round', () async { test(
'Updating one player score does not affect other players in same round',
() async {
await database.scoreDao.addScore( await database.scoreDao.addScore(
playerId: testPlayer1.id, playerId: testPlayer1.id,
matchId: testMatch1.id, matchId: testMatch1.id,
@@ -702,10 +712,20 @@ void main() {
); );
expect(scores.length, 3); expect(scores.length, 3);
expect(scores.where((s) => s.playerId == testPlayer1.id).first.score, 10); expect(
expect(scores.where((s) => s.playerId == testPlayer2.id).first.score, 99); scores.where((s) => s.playerId == testPlayer1.id).first.score,
expect(scores.where((s) => s.playerId == testPlayer3.id).first.score, 30); 10,
}); );
expect(
scores.where((s) => s.playerId == testPlayer2.id).first.score,
99,
);
expect(
scores.where((s) => s.playerId == testPlayer3.id).first.score,
30,
);
},
);
// Verifies that deleting a player's scores only affects that specific player. // Verifies that deleting a player's scores only affects that specific player.
test('Deleting player scores only affects target player', () async { test('Deleting player scores only affects target player', () async {
@@ -724,9 +744,7 @@ void main() {
change: 20, change: 20,
); );
await database.scoreDao.deleteScoresForPlayer( await database.scoreDao.deleteScoresForPlayer(playerId: testPlayer1.id);
playerId: testPlayer1.id,
);
final match1Scores = await database.scoreDao.getScoresForMatch( final match1Scores = await database.scoreDao.getScoresForMatch(
matchId: testMatch1.id, matchId: testMatch1.id,