TEST DE NIVEAU DE FRANÇAIS

body {
font-family: ‘Arial’, sans-serif;
line-height: 1.6;
max-width: 100%;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
color: #333;
}

.container {
background-color: white;
border-radius: 10px;
padding: 20px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

h1, h2, h3 {
color: #2c3e50;
text-align: center;
}

.intro {
background-color: #f8f9fa;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
border-left: 4px solid #3498db;
}

#start-btn, #next-btn, #restart-btn, #previous-btn {
background-color: #3498db;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
margin: 10px 5px;
font-size: 16px;
transition: background-color 0.3s;
}

#start-btn:hover, #next-btn:hover, #restart-btn:hover, #previous-btn:hover {
background-color: #2980b9;
}

#restart-btn {
background-color: #2ecc71;
}

#restart-btn:hover {
background-color: #27ae60;
}

#previous-btn {
background-color: #95a5a6;
}

#previous-btn:hover {
background-color: #7f8c8d;
}

#timer {
text-align: center;
font-size: 20px;
margin: 10px 0;
font-weight: bold;
color: #e74c3c;
}

.question-container {
display: none;
padding: 15px;
background-color: #fff;
border-radius: 5px;
margin-bottom: 10px;
border-left: 4px solid #3498db;
}

.options {
margin-top: 15px;
}

.option {
display: block;
padding: 10px;
margin: 5px 0;
background-color: #f1f1f1;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s;
}

.option:hover {
background-color: #e6e6e6;
}

.option.selected {
background-color: #3498db;
color: white;
}

.option.correct {
background-color: #2ecc71;
color: white;
}

.option.incorrect {
background-color: #e74c3c;
color: white;
}

.feedback {
margin-top: 20px;
padding: 15px;
border-radius: 5px;
text-align: center;
font-weight: bold;
}

.level-description {
margin-top: 20px;
padding: 15px;
background-color: #f8f9fa;
border-radius: 5px;
border-left: 4px solid #2ecc71;
}

.progress-container {
width: 100%;
height: 20px;
background-color: #f1f1f1;
border-radius: 10px;
margin: 20px 0;
}

.progress-bar {
height: 100%;
background-color: #3498db;
border-radius: 10px;
width: 0%;
transition: width 0.3s;
}

.btn-container {
display: flex;
justify-content: space-between;
margin-top: 20px;
}

.hidden {
display: none;
}

#result-container {
display: none;
text-align: center;
padding: 20px;
background-color: #f8f9fa;
border-radius: 5px;
margin-top: 20px;
border: 2px solid #2ecc71;
}

#level-badge {
font-size: 60px;
font-weight: bold;
color: #2c3e50;
margin: 20px 0;
}

.firework {
position: absolute;
width: 5px;
height: 5px;
border-radius: 50%;
box-shadow: 0 0 10px 5px rgba(255, 255, 255, 0.8);
animation: firework 1s ease-out;
animation-fill-mode: forwards;
}

@keyframes firework {
0% {
transform: translate(0, 0);
opacity: 1;
width: 5px;
height: 5px;
}
100% {
transform: translate(var(–x-move), var(–y-move));
opacity: 0;
width: 2px;
height: 2px;
}
}

Bienvenue au Test de Niveau de Français

Ce test vous permettra de déterminer votre niveau de français selon le Cadre Européen Commun de Référence pour les Langues (CECRL), de A1 à C2.

Instructions :

  • Le test contient environ 75 questions de difficulté progressive
  • Vous avez 45 secondes pour répondre à chaque question
  • La durée totale du test est de 5 à 20 minutes selon votre niveau
  • Le test s’arrêtera automatiquement une fois votre niveau identifié
  • Vous pouvez reprendre le test à tout moment

Bonne chance !

Félicitations !

Vous avez terminé le test de niveau de français.

Votre niveau de français est :

// Définition des questions par niveau
const questions = [
// A1 Questions (1-15)
{
level: “A1”,
question: “Comment vous appelez-vous ?”,
options: [“Je m’appelle Pierre.”, “J’ai Pierre.”, “Je suis Pierre.”, “Je Pierre.”],
answer: 0
},
{
level: “A1”,
question: “Bonjour, _____ va ?”,
options: [“que”, “qui”, “comment”, “où”],
answer: 2
},
{
level: “A1”,
question: “Il y a _____ livre sur la table.”,
options: [“un”, “une”, “des”, “le”],
answer: 0
},
{
level: “A1”,
question: “J’aime _____ café.”,
options: [“le”, “la”, “un”, “une”],
answer: 0
},
{
level: “A1”,
question: “Nous _____ étudiants.”,
options: [“sommes”, “sont”, “est”, “êtes”],
answer: 0
},
{
level: “A1”,
question: “Quelle est la couleur du drapeau français ?”,
options: [“Rouge, blanc et bleu”, “Bleu, blanc et rouge”, “Blanc, rouge et bleu”, “Rouge, bleu et blanc”],
answer: 1
},
{
level: “A1”,
question: “Je _____ du pain.”,
options: [“mange”, “manges”, “mangez”, “mangent”],
answer: 0
},
{
level: “A1”,
question: “Elle _____ française.”,
options: [“es”, “est”, “êtes”, “sont”],
answer: 1
},
{
level: “A1”,
question: “Nous _____ au cinéma hier.”,
options: [“allons”, “irons”, “sommes allés”, “allions”],
answer: 2
},
{
level: “A1”,
question: “Je _____ me lever à 7h tous les jours.”,
options: [“dois”, “devoir”, “doit”, “devons”],
answer: 0
},
{
level: “A1”,
question: “_____ est-ce que tu habites ?”,
options: [“Où”, “Qui”, “Que”, “Comment”],
answer: 0
},
{
level: “A1”,
question: “Aujourd’hui, c’est _____ mars.”,
options: [“à”, “en”, “au”, “le”],
answer: 3
},
{
level: “A1”,
question: “Ma mère est la sœur de ma _____.”,
options: [“tante”, “cousine”, “nièce”, “fille”],
answer: 0
},
{
level: “A1”,
question: “Je voudrais _____ eau, s’il vous plaît.”,
options: [“de l'”, “du”, “de la”, “des”],
answer: 0
},
{
level: “A1”,
question: “_____ tu aimes faire pendant ton temps libre ?”,
options: [“Qu’est-ce que”, “Comment”, “Pourquoi”, “Quand”],
answer: 0
},

// A2 Questions (16-30)
{
level: “A2”,
question: “Si j’avais le temps, je _____ au cinéma.”,
options: [“vais”, “irais”, “irai”, “allais”],
answer: 1
},
{
level: “A2”,
question: “Elle _____ à Paris depuis deux ans.”,
options: [“habite”, “habitait”, “a habité”, “habitera”],
answer: 0
},
{
level: “A2”,
question: “Je ne peux pas sortir _____ il pleut.”,
options: [“parce que”, “pourtant”, “car”, “puisque”],
answer: 0
},
{
level: “A2”,
question: “Tu as _____ ce film ?”,
options: [“vu”, “voir”, “voyé”, “vois”],
answer: 0
},
{
level: “A2”,
question: “Nous _____ dîner au restaurant demain soir.”,
options: [“allons”, “irons”, “avons”, “sommes”],
answer: 0
},
{
level: “A2”,
question: “Je cherche _____ appartement à louer.”,
options: [“un”, “le”, “d'”, “l'”],
answer: 0
},
{
level: “A2”,
question: “Ils se sont _____ la main.”,
options: [“serré”, “serrés”, “serrer”, “serrez”],
answer: 0
},
{
level: “A2”,
question: “_____ de temps faut-il pour aller à l’aéroport ?”,
options: [“Combien”, “Comment”, “Quand”, “Quel”],
answer: 0
},
{
level: “A2”,
question: “Je voudrais _____ tôt demain matin.”,
options: [“me lever”, “me lève”, “me levais”, “me levé”],
answer: 0
},
{
level: “A2”,
question: “Hier, nous _____ au restaurant.”,
options: [“sommes allés”, “allons”, “irons”, “allions”],
answer: 0
},
{
level: “A2”,
question: “Elle n’a _____ compris la question.”,
options: [“pas”, “jamais”, “plus”, “rien”],
answer: 0
},
{
level: “A2”,
question: “C’est la voiture _____ j’ai achetée hier.”,
options: [“que”, “qui”, “dont”, “où”],
answer: 0
},
{
level: “A2”,
question: “Tu peux me dire _____ tu as fait ça ?”,
options: [“pourquoi”, “comment”, “quand”, “où”],
answer: 0
},
{
level: “A2”,
question: “Je n’aime pas cette chemise, je préfère _____.”,
options: [“celle-ci”, “celui-ci”, “ceux-ci”, “celles-ci”],
answer: 0
},
{
level: “A2”,
question: “_____ aller à la gare, s’il vous plaît ?”,
options: [“Pour”, “Comment”, “Quand”, “Où”],
answer: 1
},

// B1 Questions (31-45)
{
level: “B1”,
question: “Si j’_____ plus d’argent, j’achèterais une nouvelle voiture.”,
options: [“aurais”, “avais”, “ai”, “aurai”],
answer: 1
},
{
level: “B1”,
question: “Je doute qu’il _____ à l’heure.”,
options: [“est”, “sera”, “soit”, “serait”],
answer: 2
},
{
level: “B1”,
question: “C’est le film _____ tout le monde parle.”,
options: [“que”, “qui”, “dont”, “duquel”],
answer: 2
},
{
level: “B1”,
question: “Il faut que tu _____ ce document avant demain.”,
options: [“finiras”, “finis”, “finisses”, “finir”],
answer: 2
},
{
level: “B1”,
question: “Elle m’a demandé si je _____ venir à sa fête.”,
options: [“peux”, “pouvais”, “pourrai”, “pourrais”],
answer: 1
},
{
level: “B1”,
question: “_____ son retard, il a pu assister à la réunion.”,
options: [“Malgré”, “Bien que”, “Pourtant”, “Cependant”],
answer: 0
},
{
level: “B1”,
question: “Il est important que vous _____ ce problème rapidement.”,
options: [“résolvez”, “résoudre”, “résolviez”, “résoudrez”],
answer: 2
},
{
level: “B1”,
question: “Je regrette qu’elle ne _____ pas venue à la fête.”,
options: [“est”, “soit”, “sera”, “serait”],
answer: 1
},
{
level: “B1”,
question: “Nous _____ déjà terminé quand ils sont arrivés.”,
options: [“avions”, “avons”, “aurons”, “aurions”],
answer: 0
},
{
level: “B1”,
question: “Je te prête mon livre à condition que tu me le _____.”,
options: [“rends”, “rendras”, “rendes”, “rendais”],
answer: 2
},
{
level: “B1”,
question: “C’est la personne _____ je t’ai parlé hier.”,
options: [“que”, “qui”, “dont”, “à laquelle”],
answer: 2
},
{
level: “B1”,
question: “Quoi que vous _____, je ne changerai pas d’avis.”,
options: [“dites”, “direz”, “disiez”, “diriez”],
answer: 2
},
{
level: “B1”,
question: “_____ son âge, il reste très actif.”,
options: [“Malgré”, “En dépit”, “Grâce à”, “À cause de”],
answer: 0
},
{
level: “B1”,
question: “Je vous _____ dès que j’aurai des nouvelles.”,
options: [“contacte”, “contacterai”, “contactais”, “contacterais”],
answer: 1
},
{
level: “B1”,
question: “Il est possible qu’il _____ en retard demain.”,
options: [“sera”, “est”, “soit”, “serait”],
answer: 2
},

// B2 Questions (46-60)
{
level: “B2”,
question: “Au cas où vous _____ du retard, prévenez-moi.”,
options: [“auriez”, “aurez”, “aviez”, “ayez”],
answer: 1
},
{
level: “B2”,
question: “Je n’ai toujours pas reçu le colis, _____ j’ai commandé il y a deux semaines.”,
options: [“que”, “dont”, “lequel”, “duquel”],
answer: 0
},
{
level: “B2”,
question: “_____ vous ayez raison, je ne peux pas vous soutenir dans cette affaire.”,
options: [“Bien que”, “Malgré que”, “Parce que”, “Puisque”],
answer: 0
},
{
level: “B2”,
question: “Ce n’est pas tant son attitude _____ ses propos qui m’ont choqué.”,
options: [“que”, “comme”, “ainsi”, “aussi”],
answer: 0
},
{
level: “B2”,
question: “Si vous _____ plus tôt, vous n’auriez pas manqué votre avion.”,
options: [“partiez”, “partiriez”, “étiez partis”, “seriez partis”],
answer: 2
},
{
level: “B2”,
question: “Je voudrais que vous _____ cette tâche pour demain.”,
options: [“accomplissez”, “accomplir”, “accomplissiez”, “accompliriez”],
answer: 2
},
{
level: “B2”,
question: “_____ à son expérience, il a su gérer la crise efficacement.”,
options: [“Grâce”, “Dû”, “Quant”, “Suite”],
answer: 0
},
{
level: “B2”,
question: “Voici les documents _____ vous devez vous référer.”,
options: [“que”, “dont”, “auxquels”, “lesquels”],
answer: 2
},
{
level: “B2”,
question: “Il est impératif que nous _____ cette décision maintenant.”,
options: [“prenons”, “prendrons”, “prenions”, “prendrons”],
answer: 2
},
{
level: “B2”,
question: “Ne serait-ce _____ pour cette raison, je refuse de participer.”,
options: [“que”, “qui”, “dont”, “pour”],
answer: 0
},
{
level: “B2”,
question: “La réunion, _____ j’avais complètement oublié, a été reportée.”,
options: [“que”, “qui”, “dont”, “laquelle”],
answer: 0
},
{
level: “B2”,
question: “_____ elle soit très jeune, elle a déjà beaucoup d’expérience.”,
options: [“Bien que”, “Malgré”, “Même si”, “Quoique”],
answer: 0
},
{
level: “B2”,
question: “Il faudrait que vous _____ ces documents avant vendredi.”,
options: [“signez”, “signiez”, “signerez”, “signeriez”],
answer: 1
},
{
level: “B2”,
question: “C’est la proposition _____ nous avons finalement opté.”,
options: [“que”, “dont”, “pour laquelle”, “à laquelle”],
answer: 2
},
{
level: “B2”,
question: “J’ai répondu à son email, _____ je n’ai pas encore reçu de réponse.”,
options: [“cependant”, “pourtant”, “néanmoins”, “toutefois”],
answer: 1
},

// C1 Questions (61-75)
{
level: “C1”,
question: “N’eût été son intervention, nous _____ dans une situation bien plus compliquée.”,
options: [“serions”, “aurions été”, “eussions été”, “fussions”],
answer: 1
},
{
level: “C1”,
question: “Il est préférable que vous _____ les conséquences avant de prendre votre décision.”,
options: [“pesez”, “peserez”, “pesassiez”, “pesiez”],
answer: 3
},
{
level: “C1”,
question: “Cette œuvre, _____ la critique a fait l’éloge, reste méconnue du grand public.”,
options: [“que”, “dont”, “à laquelle”, “pour laquelle”],
answer: 1
},
{
level: “C1”,
question: “_____ il s’agisse d’une situation exceptionnelle, nous ne pouvons faire d’exception.”,
options: [“Bien que”, “Quoique”, “Encore que”, “Pour que”],
answer: 0
},
{
level: “C1”,
question: “C’est un phénomène _____ les causes restent encore mystérieuses.”,
options: [“dont”, “duquel”, “pour lequel”, “que”],
answer: 0
},
{
level: “C1”,
question: “_____ intelligent qu’il soit, il a commis une erreur de jugement.”,
options: [“Si”, “Aussi”, “Tant”, “Tellement”],
answer: 1
},
{
level: “C1”,
question: “Il convient que nous _____ les différentes options qui s’offrent à nous.”,
options: [“examinons”, “examinions”, “examinerions”, “examinassions”],
answer: 1
},
{
level: “C1”,
question: “_____ de nouvelles informations, nous devrons réajuster notre stratégie.”,
options: [“À défaut”, “Au vu”, “En dépit”, “À l’insu”],
answer: 1
},
{
level: “C1”,
question: “Je vous saurais gré de bien vouloir me _____ votre réponse dans les plus brefs délais.”,
options: [“faire connaître”, “faire part”, “faire savoir”, “faire parvenir”],
answer: 3
},
{
level: “C1”,
question: “_____ absurde que cela puisse paraître, sa théorie s’est avérée exacte.”,
options: [“Tout”, “Si”, “Quelque”, “Aussi”],
answer: 0
},
{
level: “C1”,
question: “Il est grand temps que vous _____ vos responsabilités dans cette affaire.”,
options: [“assumez”, “assumiez”, “assumeriez”, “assumerez”],
answer: 1
},
{
level: “C1”,
question: “Cette décision, _____ nous nous étions fermement opposés, a finalement été adoptée.”,
options: [“à laquelle”, “contre laquelle”, “pour laquelle”, “dans laquelle”],
answer: 1
},
{
level: “C1”,
question: “_____ elle ait préparé son discours avec soin, elle a eu du mal à convaincre l’auditoire.”,
options: [“Quoique”, “Puisque”, “Parce que”, “Tandis que”],
answer: 0
},
{
level: “C1”,
question: “Cette hypothèse, _____ séduisante qu’elle soit, ne repose sur aucune preuve tangible.”,
options: [“aussi”, “si”, “tant”, “quelque”],
answer: 0
},
{
level: “C1”,
question: “Il est indispensable que vous _____ ce contrat avant la fin du mois.”,
options: [“résiliez”, “résilieriez”, “résiliâtes”, “résilierez”],
answer: 0
},

// C2 Questions (76-90)
{
level: “C2”,
question: “_____ la complexité du problème, il convient d’aborder cette question avec prudence.”,
options: [“Eu égard à”, “Au vu de”, “En raison de”, “Nonobstant”],
answer: 0
},
{
level: “C2”,
question: “Le gouvernement a promulgué cette loi, _____ les vives oppositions des syndicats.”,
options: [“malgré”, “nonobstant”, “en dépit de”, “au mépris de”],
answer: 1
},
{
level: “C2”,
question: “_____ nous eussions fait toutes les démarches nécessaires, notre demande a été rejetée.”,
options: [“Bien que”, “Alors que”, “Tandis que”, “Quoique”],
answer: 0
},
{
level: “C2”,
question: “Ces manœuvres dilatoires, _____ vous vous êtes adonnés, n’ont servi qu’à retarder l’inévitable.”,
options: [“auxquelles”, “desquelles”, “pour lesquelles”, “par lesquelles”],
answer: 0
},
{
level: “C2”,
question: “Il eût été préférable que vous _____ cette opportunité lorsqu’elle s’est présentée.”,
options: [“saisissiez”, “saisissez”, “saisiriez”, “saisîtes”],
answer: 0
},
{
level: “C2”,
question: “_____ de démontrer l’absurdité de cette théorie, il s’est lancé dans une explication alambiquée.”,
options: [“Afin”, “À seule fin”, “Dans l’espoir”, “Dans l’optique”],
answer: 1
},
{
level: “C2”,
question: “Cette mesure, _____ l’application se heurte à de nombreux obstacles, devrait être réexaminée.”,
options: [“dont”, “pour laquelle”, “de laquelle”, “que”],
answer: 0
},
{
level: “C2”,
question: “_____ fût son engagement, il n’a pas réussi à infléchir la position de ses adversaires.”,
options: [“Tel”, “Quel”, “Comme”, “Tant”],
answer: 0
},
{
level: “C2”,
question: “Je doute fort qu’il _____ à la réunion de demain, compte tenu de son emploi du temps chargé.”,
options: [“participe”, “participera”, “participerait”, “ait participé”],
answer: 0
},
{
level: “C2”,
question: “_____ les apparences, cette proposition dissimule des intentions bien moins louables.”,
options: [“Malgré”, “Hormis”, “Sous”, “Outre”],
answer: 2
},
{
level: “C2”,
question: “Il importe que nous _____ ces malentendus avant qu’ils ne dégénèrent en conflit ouvert.”,
options: [“dissipons”, “dissipions”, “dissiperons”, “dissiperions”],
answer: 1
},
{
level: “C2”,
question: “C’est une question _____ il n’a pas jugé opportun de s’exprimer publiquement.”,
options: [“sur laquelle”, “pour laquelle”, “dont”, “à laquelle”],
answer: 0
},
{
level: “C2”,
question: “_____ il en soit, nous devons prendre une décision avant la fin de la semaine.”,
options: [“Quoi”, “Quoique”, “Bien que”, “Comment que”],

question: “Le rapport, _____ vous trouverez un résumé en annexe, fait état d’une situation préoccupante.”,
options: [“dont”, “duquel”, “où”, “que”],
answer: 0
},
{
level: “C2”,
question: “_____ des circonstances atténuantes, la peine aurait été bien plus sévère.”,
options: [“N’eût été”, “Sans”, “À défaut”, “En l’absence”],
answer: 0
},
{
level: “C2”,
question: “Il est impératif que vous _____ toute la lumière sur cette affaire.”,
options: [“faites”, “fassiez”, “feriez”, “ferez”],
answer: 1
}
];

// Variables globales
let currentQuestionIndex = 0;
let userAnswers = [];
let timer;
let timeLeft = 45;
let questionsPerLevel = {
“A1”: 0,
“A2”: 0,
“B1”: 0,
“B2”: 0,
“C1”: 0,
“C2”: 0
};
let correctPerLevel = {
“A1”: 0,
“A2”: 0,
“B1”: 0,
“B2”: 0,
“C1”: 0,
“C2”: 0
};
let currentLevelIndex = 0;
const levels = [“A1”, “A2”, “B1”, “B2”, “C1”, “C2”];
let testCompleted = false;

// Compter les questions par niveau
questions.forEach(question => {
questionsPerLevel[question.level]++;
});

// Description des niveaux
const levelDescriptions = {
“A1”: “Niveau Débutant (A1) : Vous pouvez comprendre et utiliser des expressions familières et quotidiennes ainsi que des énoncés très simples. Vous pouvez vous présenter et présenter quelqu’un, poser des questions simples sur des sujets personnels.”,
“A2”: “Niveau Élémentaire (A2) : Vous pouvez comprendre des phrases isolées et des expressions fréquemment utilisées en relation avec des domaines immédiats (informations personnelles, achats, environnement proche, travail). Vous pouvez communiquer lors de tâches simples et habituelles.”,
“B1”: “Niveau Intermédiaire (B1) : Vous pouvez comprendre les points essentiels d’une discussion dans un langage clair et standard. Vous pouvez vous débrouiller dans la plupart des situations rencontrées en voyage. Vous pouvez produire un discours simple et cohérent sur des sujets familiers.”,
“B2”: “Niveau Avancé (B2) : Vous pouvez comprendre le contenu essentiel de sujets concrets ou abstraits dans un texte complexe. Vous pouvez communiquer avec un degré de spontanéité et d’aisance qui rend possible une interaction normale avec un locuteur natif.”,
“C1”: “Niveau Autonome (C1) : Vous pouvez comprendre une grande gamme de textes longs et exigeants, ainsi que saisir des significations implicites. Vous pouvez vous exprimer spontanément et couramment sans trop devoir chercher vos mots.”,
“C2”: “Niveau Maîtrise (C2) : Vous pouvez comprendre sans effort pratiquement tout ce que vous lisez ou entendez. Vous pouvez vous exprimer spontanément, très couramment et de façon précise, et pouvez distinguer de fines nuances de sens même dans des situations complexes.”
};

// Initialisation du test
document.getElementById(‘start-btn’).addEventListener(‘click’, startTest);
document.getElementById(‘next-btn’).addEventListener(‘click’, nextQuestion);
document.getElementById(‘previous-btn’).addEventListener(‘click’, previousQuestion);
document.getElementById(‘restart-btn’).addEventListener(‘click’, restartTest);

// Fonction pour démarrer le test
function startTest() {
document.getElementById(‘intro-container’).style.display = ‘none’;
document.getElementById(‘test-container’).classList.remove(‘hidden’);
loadQuestion(0);
startTimer();
updateProgressBar();
}

// Fonction pour charger une question
function loadQuestion(index) {
currentQuestionIndex = index;
const questionContainer = document.getElementById(‘question-container’);
const currentQuestion = questions[index];

questionContainer.innerHTML = `

${currentQuestion.level} – Question ${index + 1}

${currentQuestion.question}

${currentQuestion.options.map((option, i) => `

${option}

`).join(”)}

`;

questionContainer.style.display = ‘block’;

// Mise à jour des boutons précédent/suivant
document.getElementById(‘previous-btn’).classList.toggle(‘hidden’, index === 0);
}

// Fonction pour sélectionner une option
function selectOption(optionIndex) {
userAnswers[currentQuestionIndex] = optionIndex;

const options = document.querySelectorAll(‘.option’);
options.forEach((option, index) => {
option.classList.remove(‘selected’);
if (index === optionIndex) {
option.classList.add(‘selected’);
}
});
}

// Fonction pour passer à la question suivante
function nextQuestion() {
// Si l’utilisateur n’a pas répondu, considérer comme réponse incorrecte
if (userAnswers[currentQuestionIndex] === undefined) {
userAnswers[currentQuestionIndex] = -1;
}

clearInterval(timer);

// Vérifier si nous sommes à la fin d’un niveau
const currentLevel = questions[currentQuestionIndex].level;
const isLastQuestionOfLevel = currentQuestionIndex + 1 >= questions.length ||
questions[currentQuestionIndex + 1].level !== currentLevel;

// Si c’est la dernière question du niveau, évaluer le niveau
if (isLastQuestionOfLevel) {
evaluateLevel(currentLevel);
} else {
// Sinon, passer à la question suivante
loadQuestion(currentQuestionIndex + 1);
timeLeft = 45;
startTimer();
updateProgressBar();
}
}

// Fonction pour revenir à la question précédente
function previousQuestion() {
if (currentQuestionIndex > 0) {
clearInterval(timer);
loadQuestion(currentQuestionIndex – 1);
timeLeft = 45;
startTimer();
updateProgressBar();
}
}

// Fonction pour démarrer le timer
function startTimer() {
const timerElement = document.getElementById(‘timer’);
timerElement.textContent = timeLeft;

timer = setInterval(() => {
timeLeft–;
timerElement.textContent = timeLeft;

if (timeLeft <= 0) {
clearInterval(timer);
nextQuestion();
}
}, 1000);
}

// Fonction pour mettre à jour la barre de progression
function updateProgressBar() {
const progressBar = document.querySelector('.progress-bar');
const totalQuestions = questions.length;
const progress = ((currentQuestionIndex + 1) / totalQuestions) * 100;
progressBar.style.width = `${progress}%`;
}

// Fonction pour évaluer le niveau
function evaluateLevel(level) {
// Calcul du score pour ce niveau
let correctCount = 0;
let questionCount = 0;

// Trouver l'index de début pour ce niveau
let startIndex = 0;
while (startIndex < questions.length && questions[startIndex].level !== level) {
startIndex++;
}

// Compter les réponses correctes pour ce niveau
for (let i = startIndex; i < questions.length && questions[i].level === level; i++) {
questionCount++;
if (userAnswers[i] === questions[i].answer) {
correctCount++;
}
}

correctPerLevel[level] = correctCount;

// Calculer le pourcentage de réussite
const successRate = (correctCount / questionCount) * 100;

// Décider si le test continue ou s'arrête
if (successRate < 60 || level === "C2") {
// Si échec ou niveau max atteint, terminer le test
endTest();
} else {
// Sinon, passer au niveau suivant
currentLevelIndex = levels.indexOf(level) + 1;
if (currentLevelIndex < levels.length) {
const nextLevel = levels[currentLevelIndex];
let nextQuestionIndex = 0;

// Trouver la première question du niveau suivant
while (nextQuestionIndex < questions.length && questions[nextQuestionIndex].level !== nextLevel) {
nextQuestionIndex++;
}

if (nextQuestionIndex = 0; i–) {
const level = levels[i];
if (questionsPerLevel[level] > 0 && correctPerLevel[level] / questionsPerLevel[level] >= 0.6) {
finalLevel = level;
break;
}
}

// Afficher le résultat
document.getElementById(‘level-badge’).textContent = finalLevel;
document.getElementById(‘level-result’).textContent = finalLevel;
document.getElementById(‘level-description’).textContent = levelDescriptions[finalLevel];

// Afficher le score par niveau
let feedbackHtml = “

Votre score par niveau :

“;
for (const level of levels) {
if (questionsPerLevel[level] > 0) {
const score = correctPerLevel[level];
const total = questionsPerLevel[level];
const percentage = Math.round((score / total) * 100);

feedbackHtml += `

${level}: ${score}/${total} (${percentage}%)

`;
}
}

document.getElementById(‘feedback’).innerHTML = feedbackHtml;

// Animation de feux d’artifice
createFireworks();
document.getElementById(‘success-sound’).play();
}

// Fonction pour redémarrer le test
function restartTest() {
currentQuestionIndex = 0;
userAnswers = [];
timeLeft = 45;
correctPerLevel = {
“A1”: 0,
“A2”: 0,
“B1”: 0,
“B2”: 0,
“C1”: 0,
“C2”: 0
};
currentLevelIndex = 0;
testCompleted = false;

document.getElementById(‘result-container’).style.display = ‘none’;
document.getElementById(‘intro-container’).style.display = ‘block’;
}

// Fonction pour créer des feux d’artifice
function createFireworks() {
const container = document.getElementById(‘result-container’);
const containerRect = container.getBoundingClientRect();

for (let i = 0; i {
const firework = document.createElement(‘div’);
firework.classList.add(‘firework’);

// Position initiale
const x = containerRect.width / 2;
const y = containerRect.height / 2;

// Couleur aléatoire
const colors = [‘#FF0000’, ‘#00FF00’, ‘#0000FF’, ‘#FFFF00’, ‘#FF00FF’, ‘#00FFFF’];
const color = colors[Math.floor(Math.random() * colors.length)];

// Direction aléatoire
const xMove = (Math.random() – 0.5) * 200;
const yMove = (Math.random() – 0.5) * 200;

firework.style.left = `${x}px`;
firework.style.top = `${y}px`;
firework.style.backgroundColor = color;
firework.style.setProperty(‘–x-move’, `${xMove}px`);
firework.style.setProperty(‘–y-move’, `${yMove}px`);

container.appendChild(firework);

// Supprimer le feu d’artifice après l’animation
setTimeout(() => {
firework.remove();
}, 1000);
}, i * 50);
}
}

// Fonctions globales (accessibles depuis HTML)
window.selectOption = selectOption;