globalDuplicateDiagnostics static method

({Map<String, List<String>> duplicateOptions, Set<String> duplicatedQuestionKeys, Set<String> duplicatedStepKeys, List<String> emptyQuestionStepKeys, Map<String, List<String>> questionKeyToStepKeys}) globalDuplicateDiagnostics(
  1. QuizModel quiz
)

Retourne les doublons avec détails :

  • stepKeys et questionKeys dupliqués,
  • les stepKeys dans lesquels apparaissent les questions dupliquées,
  • les stepKeys qui n'ont aucune question,
  • les questions avec des options dupliquées (par key).

Implementation

static ({
  Set<String> duplicatedStepKeys,
  Set<String> duplicatedQuestionKeys,
  Map<String, List<String>> questionKeyToStepKeys,
  List<String> emptyQuestionStepKeys,
  Map<String, List<String>> duplicateOptions,
}) globalDuplicateDiagnostics(QuizModel quiz) {
  final stepKeySeen = <String>{};
  final duplicatedStepKeys = <String>{};

  final questionKeySeen = <String>{};
  final duplicatedQuestionKeys = <String>{};
  final questionKeyToStepKeys = <String, List<String>>{};

  final emptyQuestionStepKeys = <String>[];
  final duplicateOptions = <String, List<String>>{}; // questionKey -> duplicated option keys

  for (var step in quiz.steps) {
    // Check duplicated stepKey
    if (!stepKeySeen.add(step.stepKey)) {
      duplicatedStepKeys.add(step.stepKey);
    }

    // Check empty steps
    if (step.displayableQuestions.isEmpty) {
      emptyQuestionStepKeys.add(step.stepKey);
    }

    // Check duplicated questionKey
    for (var question in step.displayableQuestions) {
      final key = question.questionKey;
      questionKeyToStepKeys.putIfAbsent(key, () => []);
      questionKeyToStepKeys[key]!.add(step.stepKey);

      if (!questionKeySeen.add(key)) {
        duplicatedQuestionKeys.add(key);
      }

      // Check for duplicated option keys within the question
      if (question.options != null) {
        final seenOptionKeys = <String>{};
        final duplicates = <String>{};

        for (var opt in question.options!) {
          if (!seenOptionKeys.add(opt.key)) {
            duplicates.add(opt.key);
          }
        }

        if (duplicates.isNotEmpty) {
          duplicateOptions[key] = duplicates.toList();
        }
      }
    }
  }

  return (
    duplicatedStepKeys: duplicatedStepKeys,
    duplicatedQuestionKeys: duplicatedQuestionKeys,
    questionKeyToStepKeys: {
      for (var entry in questionKeyToStepKeys.entries)
        if (duplicatedQuestionKeys.contains(entry.key)) entry.key: entry.value
    },
    emptyQuestionStepKeys: emptyQuestionStepKeys,
    duplicateOptions: duplicateOptions,
  );
}