Browse Source

Création d'un fichier séparé fournissant les messages d'erreur.

master
Fabrice PENHOËT 1 year ago
parent
commit
d36dba2104
  1. 7
      src/errors.js
  2. 39
      src/vCarousel.ts
  3. 38
      tests/vCarouselSpec.ts

7
src/errors.js

@ -0,0 +1,7 @@
module.exports =
{
elementNotFound : "Aucun élément HTML trouvé dans la page pour l'id : ",
videoNotFound: "Aucune balise vidéo trouvée dans l'élément HTML ayant comme id : ",
need2Videos: "Il vous faut fournir au moins deux conteneurs de vidéo valides pour pouvoir lancer le carrousel.",
needVideosProvided: "vCarousel ne peut être lancé sans avoir fourni les vidéos concernées."
};

39
src/vCarousel.ts

@ -1,9 +1,11 @@
const errors=require("./errors.js");
// La classe vCarousel est instanciée en recevant un tableau d'ids des conteneurs HTML des vidéos à afficher successivement.
// Le tableau n'est pas dédoublonné, pour rester libre d'afficher plusieurs fois la même vidéo durant un tour du carrousel.
// Plusieurs options sont possibles :
// - firstVideoId est une chaîne permettant de fournir l'id du conteneur de la première vidéo à afficher lors de l'appel. Par défaut la première vidéo de la liste sera affichée. Si on passe une chaîne vide, aucune ne sera affichée.
// - playFirstVideo et playNextVideos demandent de lancer automatiquement la lecture respectivement de la vidéo demandée et de celles automatiquement chargée par la fonction. Ce n'est pas le cas par défaut et peut être bloqué par le navigateur.
// - noStop permet de demander à ce que les vidéos continuent à tourner même quand toutes ont été affichées. Par défaut, le carrousel s'arrête.
// - noStop permet de demander à ce que les vidéos continuent à tourner, même quand toutes ont été affichées. Par défaut, le carrousel s'arrête.
interface videoDOM
{
id: string;
@ -19,7 +21,7 @@ export class vCarousel
private _playNextVideos: boolean = false;
private _noStop: boolean = false;
private nbVContainers: number = 0;
private currentVideo: HTMLMediaElement;
private _currentVideo: HTMLMediaElement;
// Les ids reçus doivent correspondre à des éléments HTML contenant une vidéo.
set vContainers(vContainersIds: string[])
@ -28,12 +30,12 @@ export class vCarousel
{
let checkContainerExist=document.getElementById(containerId);
if(checkContainerExist === null)
throw new Error("Aucun élément HTML trouvé dans la page pour l'id "+containerId+".");
throw new Error(errors.elementNotFound+containerId);
else
{
let checkVideoExist=<HTMLMediaElement>document.querySelector("#"+containerId+" video");
if(checkVideoExist === null)
throw new Error("Aucune balise vidéo trouvée dans l'élément HTML ayant comme id "+containerId+".");
throw new Error(errors.videoNotFound+containerId);
else
this._vContainers.push({id:containerId, containerElt:checkContainerExist, videoElt:checkVideoExist});
}
@ -41,15 +43,13 @@ export class vCarousel
// Il faut au moins 2 vidéos à faire tourner.
this.nbVContainers=this._vContainers.length;
if(this.nbVContainers < 2)
throw new Error("Il vous faut fournir au moins deux conteneurs de vidéo valides pour pouvoir lancer le carrousel.");
throw new Error(errors.need2Videos);
}
// Si this._firstVideoId a été fourni, on vérifie qu'il est présent dans la liste des conteneurs de vidéos.
set firstVideoId(firstVideo: string)
{
if(firstVideo!=="" && this._vContainers.findIndex(video => video.id === firstVideo) === -1)
console.error("Vous avez fourni l'id de la vidéo à afficher en premier ("+firstVideo+"), mais il n'est pas valide.");
else
if((firstVideo!=="" && this._vContainers.findIndex(video => video.id === firstVideo) !== -1) || (firstVideo===""))
this._firstVideoId=firstVideo;
}
@ -72,18 +72,17 @@ export class vCarousel
{
this._noStop=noStop;
}
// transformer l'attribut pour accepter getters et setters ?
public getCurrentVideo() : HTMLMediaElement
get currentVideo() : HTMLMediaElement
{
return this.currentVideo;
return this._currentVideo;
}
public run(): void
{
const vCarousel=this;// évite les confusions avec le "this" des événements.
if(vCarousel.nbVContainers < 2) // dans le cas où on lancerait run() sans passer par le setter.
throw new Error("vCarousel ne peut être lancé sans au moins 2 vidéos.");
const vCarousel=this; // évite les confusions avec le "this" des événements plus bas.
if(vCarousel.nbVContainers < 2)
throw new Error(errors.needVideosProvided);
for (let i = 0; i < vCarousel.nbVContainers; i++)
{
@ -95,14 +94,14 @@ export class vCarousel
{
// Si une vidéo est déjà visible et en cours de lecture, je la stoppe et la remets à 0
// Sinon elle risque de continuer à être lue tout en étant cachée.
if(vCarousel.currentVideo!==undefined && !vCarousel.currentVideo.paused)
if(vCarousel._currentVideo!==undefined && !vCarousel._currentVideo.paused)
{
vCarousel.currentVideo.pause();
vCarousel.currentVideo.currentTime = 0;
vCarousel._currentVideo.pause();
vCarousel._currentVideo.currentTime = 0;
}
// J'affiche la première vidéo et j'essaye de la lancer, si cela est demandé
vContainer.style.display = "block";
vCarousel.currentVideo=video;
vCarousel._currentVideo=video;
if(vCarousel._playFirstVideo===true)
video.play();
}
@ -132,7 +131,7 @@ export class vCarousel
window.location.assign("#"+nextHash);
if(vCarousel._playNextVideos===true)
nextVideo.play();
vCarousel.currentVideo=nextVideo;
vCarousel._currentVideo=nextVideo;
nbTurn++;
}
});

38
tests/vCarouselSpec.ts

@ -1,4 +1,5 @@
import { vCarousel } from "../src/vCarousel";
const errors=require("../src/errors.js");
describe("vCarousel", function()
{
@ -17,32 +18,30 @@ describe("vCarousel", function()
document.body.removeChild(document.getElementById('fixture'));
});
it("should be an instance of vCarousel", function()
{
expect(vCarouselTest).toBeInstanceOf(vCarousel);
});
describe("setting vCarousel", function()
{
it("Doit générer une erreur si tous les ids passés ne correspondent pas à des éléments HTML existants.", function()
{
expect(function() { return vCarouselTest.vContainers=["dontExistId","vFunanbule","vForgeron"]; }).toThrowError("Aucun élément HTML trouvé dans la page pour l'id dontExistId.");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","dontExistId","vForgeron"]; }).toThrowError("Aucun élément HTML trouvé dans la page pour l'id dontExistId.");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","vForgeron","dontExistId"]; }).toThrowError("Aucun élément HTML trouvé dans la page pour l'id dontExistId.");
expect(function() { return vCarouselTest.vContainers=["dontExistId","vFunanbule","vForgeron"]; }).toThrowError(errors.elementNotFound+"dontExistId");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","dontExistId","vForgeron"]; }).toThrowError(errors.elementNotFound+"dontExistId");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","vForgeron","dontExistId"]; }).toThrowError(errors.elementNotFound+"dontExistId");
});
it("Doit générer une erreur si tous les ids passés ne correspondent pas à des éléments HTML contenant une vidéo.", function()
{
expect(function() { return vCarouselTest.vContainers=["noVideo","vFunanbule","vForgeron"]; }).toThrowError("Aucune balise vidéo trouvée dans l'élément HTML ayant comme id noVideo.");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","noVideo","vForgeron"]; }).toThrowError("Aucune balise vidéo trouvée dans l'élément HTML ayant comme id noVideo.");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","vForgeron","noVideo"]; }).toThrowError("Aucune balise vidéo trouvée dans l'élément HTML ayant comme id noVideo.");
expect(function() { return vCarouselTest.vContainers=["noVideo","vFunanbule","vForgeron"]; }).toThrowError(errors.videoNotFound+"noVideo");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","noVideo","vForgeron"]; }).toThrowError(errors.videoNotFound+"noVideo");
expect(function() { return vCarouselTest.vContainers=["vFunanbule","vForgeron","noVideo"]; }).toThrowError(errors.videoNotFound+"noVideo");
});
it("Doit générer une erreur s'il n'y a pas au moins deux éléments HTML valides fournis.", function()
{
expect(function() { return vCarouselTest.vContainers=["vFunanbule"]; }).toThrowError("Il vous faut fournir au moins deux conteneurs de vidéo valides pour pouvoir lancer le carrousel.");
expect(function() { return vCarouselTest.vContainers=["vFunanbule"]; }).toThrowError(errors.need2Videos);
});
it("Ne doit pas générer d'erreur s'il y a au moins 2 ids passés correspondant à des éléments HTML valides et contenant chacun une vidéo.", function()
@ -69,7 +68,7 @@ describe("vCarousel", function()
{
it("Doit générer une erreur si on lance le carrousel sans avoir fourni les éléments HTML contenant les vidéos.", function()
{
expect(function() { return vCarouselTest.run(); }).toThrowError("vCarousel ne peut être lancé sans au moins 2 vidéos.");
expect(function() { return vCarouselTest.run(); }).toThrowError(errors.needVideosProvided);
});
it("Doit cacher toutes les vidéos si cela est demandé en option, aucune vidéo n'étant enregistrée comme en cours.", function()
@ -82,7 +81,7 @@ describe("vCarousel", function()
{
expect(document.getElementById(containerId).style.display).toBe("none");
}
expect(vCarouselTest.getCurrentVideo()).toBeUndefined();
expect(vCarouselTest.currentVideo).toBeUndefined();
});
it("Doit cacher toutes les vidéos, sauf celle passée en option, qui doit être enregistrée comme celle en cours.", function()
@ -94,7 +93,7 @@ describe("vCarousel", function()
expect(document.getElementById("vForgeron").style.display).toBe("none");
expect(document.getElementById("vCircuit").style.display).toBe("block");
let currentVideo=<HTMLMediaElement>document.querySelector("#vCircuit video");
expect(vCarouselTest.getCurrentVideo()).toEqual(currentVideo);
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
});
it("Doit cacher toutes les vidéos sauf la première, si aucune indication n'est passée en option, qui doit être enregistrée comme celle en cours.", function()
@ -105,7 +104,7 @@ describe("vCarousel", function()
expect(document.getElementById("vForgeron").style.display).toBe("none");
expect(document.getElementById("vCircuit").style.display).toBe("none");
let currentVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
expect(vCarouselTest.getCurrentVideo()).toEqual(currentVideo);
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
});
it("Doit demander le lancement de la première vidéo affichée, si demandé en option.", function()
@ -129,7 +128,6 @@ describe("vCarousel", function()
expect(currentVideo.play).not.toHaveBeenCalled();
});
it("Doit passer d'une vidéo à l'autre jusqu'à ce qu'elles aient été toutes affichées.", function()
{
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
@ -141,7 +139,7 @@ describe("vCarousel", function()
expect(document.getElementById("vFunanbule").style.display).toBe("none");
expect(document.getElementById("vForgeron").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#vForgeron video");
expect(vCarouselTest.getCurrentVideo()).toEqual(currentVideo);
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#vForgeron");
// Fin de la deuxième, on passe à la dernière :
@ -149,13 +147,13 @@ describe("vCarousel", function()
expect(document.getElementById("vForgeron").style.display).toBe("none");
expect(document.getElementById("vCircuit").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#vCircuit video");
expect(vCarouselTest.getCurrentVideo()).toEqual(currentVideo);
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#vCircuit");
// Fin de la dernière, rien ne bouge :
currentVideo.dispatchEvent(new Event("ended"));
expect(document.getElementById("vCircuit").style.display).toBe("block");
expect(vCarouselTest.getCurrentVideo()).toEqual(currentVideo);
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#vCircuit");
});
@ -177,11 +175,10 @@ describe("vCarousel", function()
expect(document.getElementById("vCircuit").style.display).toBe("none");
expect(document.getElementById("vFunanbule").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
expect(vCarouselTest.getCurrentVideo()).toEqual(currentVideo);
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#vFunanbule");
});
it("Doit demander le lancement des nouvelles vidéos affichées, si cela est demandé en option.", function()
{
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
@ -206,8 +203,5 @@ describe("vCarousel", function()
firstVideo.dispatchEvent(new Event("ended"));
expect(nextVideo.play).not.toHaveBeenCalled();
});
});
});
Loading…
Cancel
Save