Skip to content

Commit

Permalink
Heavily refactor scoring and fix some tests
Browse files Browse the repository at this point in the history
  • Loading branch information
SiekamCebule committed Aug 31, 2024
1 parent 67b3eaa commit 2373a58
Show file tree
Hide file tree
Showing 67 changed files with 1,640 additions and 816 deletions.
13 changes: 6 additions & 7 deletions lib/bloc/competitions/competition_results_cubit.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/competition_scores.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/jump_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/competition_score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/typedefs.dart';
import 'package:sj_manager/models/simulation_db/standings/standings.dart';

class CompetitionResultsCubit<E, SJS extends JumpScore>
extends Cubit<CompetitionResultsState<E>> {
class CompetitionResultsCubit<E> extends Cubit<CompetitionResultsState<E>> {
CompetitionResultsCubit({
required this.standings,
}) : super(CompetitionResultsState(standings: standings));

final Standings<E> standings;
final Standings<E, CompetitionScoreDetails> standings;

void registerResult({
required E entity,
required CompetitionScore<E, SJS> score,
required CompetitionScore<E> score,
}) {
standings.addScore(newScore: score, overwrite: true);
}
Expand All @@ -23,7 +22,7 @@ class CompetitionResultsCubit<E, SJS extends JumpScore>
class CompetitionResultsState<E> with EquatableMixin {
const CompetitionResultsState({required this.standings});

final Standings<E> standings;
final Standings<E, CompetitionScoreDetails> standings;

@override
List<Object?> get props => [standings];
Expand Down
22 changes: 11 additions & 11 deletions lib/bloc/competitions/competition_scoring_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:osje_sim/osje_sim.dart';
import 'package:sj_manager/models/simulation_db/competition/rules/utils/competition_score_creator/competition_score_creator.dart';
import 'package:sj_manager/models/simulation_db/competition/rules/utils/jump_score_creator/jump_score_creator.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/competition_scores.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/jump_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/typedefs.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';

class CompetitionScoringCubit<E, SJS extends JumpScore>
extends Cubit<CompetitionScoringState> {
class CompetitionScoringCubit<E> extends Cubit<CompetitionScoringState> {
CompetitionScoringCubit({
required this.jumpScoreCreator,
required this.competitionScoreCreator,
}) : super(const CompetitionScoringEmpty());

final JumpScoreCreator jumpScoreCreator;
final CompetitionScoreCreator<CompetitionScore<E, SJS>> competitionScoreCreator;
final JumpScoreCreator<Jumper> jumpScoreCreator;
final CompetitionScoreCreator<CompetitionScore<E>> competitionScoreCreator;

void calculateScore(
{required JumpSimulationRecord jumpSimulationRecord,
required JumpScoreCreatingContext jumpScoreCreatingContext,
required CompetitionScoreCreatingContext competitionScoreCreatingContext}) {
void calculateScore({
required JumpSimulationRecord jumpSimulationRecord,
required JumpScoreCreatingContext<Jumper> jumpScoreCreatingContext,
required CompetitionScoreCreatingContext<E> competitionScoreCreatingContext,
}) {
final jumpScore = jumpScoreCreator.compute(jumpScoreCreatingContext);
final competitionScore =
competitionScoreCreator.compute(competitionScoreCreatingContext);
Expand All @@ -43,7 +43,7 @@ class CompetitionScoringNonEmpty<S extends CompetitionScore>
required this.lastCompetitionScore,
});

final JumpScore lastSingleJumpScore;
final CompetitionJumpScore lastSingleJumpScore;
final S lastCompetitionScore;

@override
Expand Down
1 change: 0 additions & 1 deletion lib/bloc/database_editing/database_items_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import 'package:sj_manager/models/user_db/hill/hill.dart';
import 'package:sj_manager/models/user_db/items_repos_registry.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';
import 'package:sj_manager/repositories/database_editing/db_filters_repository.dart';
import 'package:sj_manager/repositories/generic/items_repo.dart';

class DatabaseItemsCubit extends Cubit<DatabaseItemsState> {
DatabaseItemsCubit({
Expand Down
3 changes: 2 additions & 1 deletion lib/json/simulation_db_loading/classification_loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:sj_manager/json/simulation_db_loading/simulation_db_part_loader.
import 'package:sj_manager/json/json_types.dart';
import 'package:sj_manager/models/simulation_db/classification/classification.dart';
import 'package:sj_manager/models/simulation_db/classification/default_classification_rules.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/classification_score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/standings.dart';
import 'package:sj_manager/repositories/generic/items_ids_repo.dart';

Expand Down Expand Up @@ -33,7 +34,7 @@ class ClassificationParser implements SimulationDbPartParser<Classification> {
final rules = defaultClassificationRulesParser.parse(json['rules']);
return DefaultClassification(
name: json['name'],
standings: standings,
standings: standings as Standings<dynamic, ClassificationScoreDetails>,
rules: rules,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:sj_manager/models/simulation_db/competition/rules/utils/competit
import 'package:sj_manager/models/simulation_db/competition/rules/utils/judges_creator/judges_creator.dart';
import 'package:sj_manager/models/simulation_db/competition/rules/utils/jump_score_creator/jump_score_creator.dart';
import 'package:sj_manager/models/simulation_db/competition/rules/utils/wind_averager/wind_averager.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/competition_scores.dart';
import 'package:sj_manager/models/simulation_db/standings/score/typedefs.dart';
import 'package:sj_manager/models/user_db/jumper/jumper.dart';
import 'package:sj_manager/models/user_db/team/competition_team.dart';
import 'package:sj_manager/models/user_db/team/team.dart';
Expand Down Expand Up @@ -61,8 +61,7 @@ class CompetitionRoundRulesParser
}
final competitionScoreCreator =
competitionScoreCreatorParser.parse(json['competitionScoreCreator']);
if (competitionScoreCreator
is CompetitionScoreCreator<CompetitionScore<Jumper, dynamic>> ==
if (competitionScoreCreator is CompetitionScoreCreator<CompetitionScore<Jumper>> ==
false) {
throw ArgumentError(
'(Parsing) The loaded competition score creator type is not a valid one for individual competition rules (${competitionScoreCreator.runtimeType})',
Expand All @@ -85,8 +84,8 @@ class CompetitionRoundRulesParser
judgesCount: json['judgesCount'],
judgesCreator: judgesCreatorParser.parse(json['judgesCreator']),
significantJudgesCount: json['significantJudgesCount'],
competitionScoreCreator: competitionScoreCreator
as CompetitionScoreCreator<CompetitionScore<Jumper, dynamic>>,
competitionScoreCreator:
competitionScoreCreator as CompetitionScoreCreator<CompetitionScore<Jumper>>,
jumpScoreCreator: jumpScoreCreatorParser.parse(json['jumpScoreCreator']),
koRules: koRulesJson != null ? koRoundRulesParser.parse(koRulesJson) : null,
);
Expand All @@ -109,7 +108,7 @@ class CompetitionRoundRulesParser
final competitionScoreCreator =
competitionScoreCreatorParser.parse(json['competitionScoreCreator']);
if (competitionScoreCreator
is CompetitionScoreCreator<CompetitionScore<CompetitionTeam, dynamic>> ==
is CompetitionScoreCreator<CompetitionScore<CompetitionTeam>> ==
false) {
throw ArgumentError(
'(Parsing) The loaded competition score creator type is not a valid one for team competition rules (${competitionScoreCreator.runtimeType})',
Expand All @@ -133,7 +132,7 @@ class CompetitionRoundRulesParser
judgesCreator: judgesCreatorParser.parse(json['judgesCreator']),
significantJudgesCount: json['significantJudgesCount'],
competitionScoreCreator: competitionScoreCreator
as CompetitionScoreCreator<CompetitionScore<CompetitionTeam, dynamic>>,
as CompetitionScoreCreator<CompetitionScore<CompetitionTeam>>,
jumpScoreCreator: jumpScoreCreatorParser.parse(json['jumpScoreCreator']),
groups: groups,
koRules: koRulesJson != null ? koRoundRulesParser.parse(koRulesJson) : null,
Expand Down
53 changes: 32 additions & 21 deletions lib/json/simulation_db_loading/score_loader.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import 'package:sj_manager/json/simulation_db_loading/simulation_db_part_loader.dart';
import 'package:sj_manager/json/json_types.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/classification_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/simple_points_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/competition_scores.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/classification_score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/competition_score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/jump_score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/jump_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/typedefs.dart';
import 'package:sj_manager/repositories/generic/items_ids_repo.dart';

class ScoreParser implements SimulationDbPartParser<Score> {
Expand All @@ -22,7 +23,7 @@ class ScoreParser implements SimulationDbPartParser<Score> {
Score _loadAppropriate(Json json) {
final type = json['type'] as String;
return switch (type) {
'default_jump_score' => _loadDefaultJumpScore(json),
'competition_jump_score' => _loadCompetitionJumpScore(json),
'jump_score' => _loadSimpleJumpScore(json),
'jumper_competition_score' => _loadCompetitionJumperScore(json),
'team_competition_score' => _loadCompetitionTeamScore(json),
Expand All @@ -32,25 +33,28 @@ class ScoreParser implements SimulationDbPartParser<Score> {
};
}

DefaultJumpScore _loadDefaultJumpScore(Json json) {
CompetitionJumpScore _loadCompetitionJumpScore(Json json) {
final entity = idsRepo.get(json['entityId']);
final jumpRecord = idsRepo.get(json['jumpRecordId']);
return DefaultJumpScore(
return CompetitionJumpScore(
entity: entity,
distancePoints: json['distancePoints'],
judgesPoints: json['judgesPoints'],
gatePoints: json['gatePoints'],
windPoints: json['windPoints'],
jumpRecord: jumpRecord,
details: CompetitionJumpScoreDetails(
jumpRecord: jumpRecord,
distancePoints: json['distancePoints'],
judgesPoints: json['judgesPoints'],
gatePoints: json['gatePoints'],
windPoints: json['windPoints'],
),
points: json['points'],
);
}

SimpleJumpScore _loadSimpleJumpScore(Json json) {
Score<dynamic, SimpleJumpScoreDetails> _loadSimpleJumpScore(Json json) {
final entity = idsRepo.get(json['entityId']);
final jumpRecord = idsRepo.get(json['jumpRecordId']);
return SimpleJumpScore(
return Score<dynamic, SimpleJumpScoreDetails>(
entity: entity,
jumpRecord: jumpRecord,
details: SimpleJumpScoreDetails(jumpRecord: jumpRecord),
points: json['points'],
);
}
Expand All @@ -64,7 +68,9 @@ class ScoreParser implements SimulationDbPartParser<Score> {
return CompetitionJumperScore(
entity: entity,
points: json['points'],
jumpScores: jumpScores.cast(),
details: CompetitionJumperScoreDetails(
jumpScores: jumpScores.cast(),
),
);
}

Expand All @@ -77,15 +83,18 @@ class ScoreParser implements SimulationDbPartParser<Score> {
return CompetitionTeamScore(
entity: entity,
points: json['points'],
jumperScores: jumperScores,
details: CompetitionTeamScoreDetails(
jumperScores: jumperScores,
),
);
}

SimplePointsScore _loadSimplePointsScore(Json json) {
Score<dynamic, SimplePointsScoreDetails> _loadSimplePointsScore(Json json) {
final entity = idsRepo.get(json['entityId']);
return SimplePointsScore(
json['points'],
return Score<dynamic, SimplePointsScoreDetails>(
entity: entity,
points: json['points'],
details: const SimplePointsScoreDetails(),
);
}

Expand All @@ -97,7 +106,9 @@ class ScoreParser implements SimulationDbPartParser<Score> {
return ClassificationScore(
entity: idsRepo.get(json['entityId']),
points: json['points'],
competitionScores: competitionScores.cast<CompetitionScore>(),
details: ClassificationScoreDetails(
competitionScores: competitionScores.cast<CompetitionScore>(),
),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ class DefaultClassificationRulesSerializer
Json _serializeAccordingly({
required DefaultClassificationRules rules,
}) {
final classificationScoreCreatorJson =
classificationScoreCreatorSerializer.serialize(rules.classificationScoreCreator);
final classificationScoreCreatorJson = classificationScoreCreatorSerializer
.serialize(rules.classificationScoreCreator as ClassificationScoreCreator);
final scoringTypeJson = _serializeType(rules.scoringType);
final pointsMapJson = rules.pointsMap;
final competitionIdsJson =
Expand Down
39 changes: 19 additions & 20 deletions lib/json/simulation_db_saving/score_serializer.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import 'package:sj_manager/json/simulation_db_saving/simulation_db_part_serializer.dart';
import 'package:sj_manager/json/json_types.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/classification_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/competition_scores.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/simple_points_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/concrete/jump_score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/jump_score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/details/score_details.dart';
import 'package:sj_manager/models/simulation_db/standings/score/score.dart';
import 'package:sj_manager/models/simulation_db/standings/score/typedefs.dart';
import 'package:sj_manager/repositories/generic/items_ids_repo.dart';

class ScoreSerializer implements SimulationDbPartSerializer<Score> {
Expand All @@ -20,13 +19,13 @@ class ScoreSerializer implements SimulationDbPartSerializer<Score> {
}

Json _serializeAppropriateScore(Score score) {
if (score is JumpScore) {
if (score is Score<dynamic, JumpScoreDetails>) {
return _serializeSingleJumpScore(score);
} else if (score is CompetitionJumperScore) {
return _serializeCompetitionJumperScore(score);
} else if (score is CompetitionTeamScore) {
return _serializeCompetitionTeamScore(score);
} else if (score is SimplePointsScore) {
} else if (score is Score<dynamic, SimplePointsScoreDetails>) {
return _serializeSimplePointsScore(score);
} else if (score is ClassificationScore) {
return _serializeClassificationScore(score);
Expand All @@ -35,23 +34,23 @@ class ScoreSerializer implements SimulationDbPartSerializer<Score> {
}
}

Json _serializeSingleJumpScore(JumpScore score) {
if (score is DefaultJumpScore) {
Json _serializeSingleJumpScore(Score<dynamic, JumpScoreDetails> score) {
if (score is CompetitionJumpScore) {
return {
'type': 'default_jump_score',
'type': 'competition_jump_score',
'entityId': idsRepo.idOf(score.entity),
'distancePoints': score.distancePoints,
'judgesPoints': score.judgesPoints,
'gatePoints': score.gatePoints,
'windPoints': score.windPoints,
'jumpRecordId': idsRepo.idOf(score.jumpRecord),
'distancePoints': score.details.distancePoints,
'judgesPoints': score.details.judgesPoints,
'gatePoints': score.details.gatePoints,
'windPoints': score.details.windPoints,
'jumpRecordId': idsRepo.idOf(score.details.jumpRecord),
};
} else if (score is SimpleJumpScore) {
} else if (score is Score<dynamic, SimpleJumpScoreDetails>) {
return {
'type': 'simple_jump_score',
'entityId': idsRepo.idOf(score.entity),
'points': score.points,
'jumpRecordId': idsRepo.idOf(score.jumpRecord),
'jumpRecordId': idsRepo.idOf(score.details.jumpRecord),
};
} else {
throw ArgumentError(
Expand All @@ -61,7 +60,7 @@ class ScoreSerializer implements SimulationDbPartSerializer<Score> {
}

Json _serializeCompetitionJumperScore(CompetitionJumperScore score) {
final jumpScoreJson = score.jumpScores.map((score) {
final jumpScoreJson = score.details.jumpScores.map((score) {
_serializeSingleJumpScore(score);
});
return {
Expand All @@ -73,7 +72,7 @@ class ScoreSerializer implements SimulationDbPartSerializer<Score> {
}

Json _serializeCompetitionTeamScore(CompetitionTeamScore score) {
final entityScoresJson = score.jumpScores.map((score) {
final entityScoresJson = score.details.jumpScores.map((score) {
_serializeAppropriateScore(score);
});
return {
Expand All @@ -84,7 +83,7 @@ class ScoreSerializer implements SimulationDbPartSerializer<Score> {
};
}

Json _serializeSimplePointsScore(SimplePointsScore score) {
Json _serializeSimplePointsScore(Score<dynamic, SimplePointsScoreDetails> score) {
return {
'type': 'simple_points_score',
'entityId': idsRepo.idOf(score.entity),
Expand All @@ -93,7 +92,7 @@ class ScoreSerializer implements SimulationDbPartSerializer<Score> {
}

Json _serializeClassificationScore(ClassificationScore score) {
final competitionScoresJson = score.competitionScores.map((score) {
final competitionScoresJson = score.details.competitionScores.map((score) {
return _serializeAppropriateScore(score);
});
return {
Expand Down
3 changes: 0 additions & 3 deletions lib/models/running/competition_start_list_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,6 @@ class CompetitionStartlistRepo<E> with EquatableMixin {
return _completionMap.values.every((value) => value == true);
}

Error _everyEntityHasCompletedError() => StateError(
'Tried to get first entity which hasn\'t completed, but every entity has completed its jump');

void moveEntity({required E entity, required int newIndex}) {
late final int currentIndex;
try {
Expand Down
Loading

0 comments on commit 2373a58

Please sign in to comment.