Compare commits

..

No commits in common. "0613b549efb4dcafc7047e4d03677351b7ae0c9e" and "d36dba2104da43276da388b0618a2d8a292e6877" have entirely different histories.

2 changed files with 85 additions and 76 deletions

View File

@ -92,10 +92,13 @@ export class vCarousel
vContainer.style.display = "none";
else
{
// Si une vidéo est déjà visible et en cours de lecture, je la stoppe
// 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;
}
// J'affiche la première vidéo et j'essaye de la lancer, si cela est demandé
vContainer.style.display = "block";
vCarousel._currentVideo=video;
@ -123,13 +126,12 @@ export class vCarousel
nextHash=vCarousel._vContainers[0].id;
}
nextVContainer.style.display = "block";
vCarousel._currentVideo=nextVideo;
// On adapte l'ancre de l'url de manière à ce qu'elle soit cohérente avec la vidéo affichée.
// Attention car cela peut provoquer un déplacement dans la page pour atteindre l'ancre.
window.location.assign("#"+nextHash);
// On essaye de lancer la vidéo, si demandé.
if(vCarousel._playNextVideos===true)
nextVideo.play();
vCarousel._currentVideo=nextVideo;
nbTurn++;
}
});

View File

@ -5,7 +5,7 @@ describe("vCarousel", function()
{
let vCarouselTest : vCarousel;
const videosWebDir="https://forge.chapril.org/Fab_Blab/vCarousel/src/branch/master/public/videos";
const fixture="<div id='fixture'><figure id='noVideo'></figure><figure id='video1'><video controls='controls' preload='metadata'><source src='"+videosWebDir+"/Lizio-Poete-Ferrailleur-clownfunanbule.m4v' type='video/mp4'></source></video></figure><figure id='video2'><video controls='controls' preload='metadata'><source src='"+videosWebDir+"/Lizio-Poete-Ferrailleur-forgeron.m4v' type='video/mp4'></source></video></figure><figure id='video3'><video controls='controls' preload='metadata'><source src='"+videosWebDir+"/Lizio-Poete-Ferrailleur-drole-de-circuit.m4v' type='video/mp4'></source></video></div>";
const fixture="<div id='fixture'><figure id='noVideo'></figure><figure id='vFunanbule'><video controls='controls' preload='metadata'><source src='"+videosWebDir+"/Lizio-Poete-Ferrailleur-clownfunanbule.m4v' type='video/mp4'></source><p>Votre navigateur ne prend pas en charge les vidéos HTML5.</p></video><figcaption>Un clown funanbule !</figcaption></figure><figure id='vForgeron'><video controls='controls' preload='metadata'><source src='"+videosWebDir+"/Lizio-Poete-Ferrailleur-forgeron.m4v' type='video/mp4'></source><p>Votre navigateur ne prend pas en charge les vidéos HTML5.</p></video><figcaption>Il faut forger pour devenir forgeron !</figcaption></figure><figure id='vCircuit'><video controls='controls' preload='metadata'><source src='"+videosWebDir+"/Lizio-Poete-Ferrailleur-drole-de-circuit.m4v' type='video/mp4'></source><p>Votre navigateur ne prend pas en charge les vidéos HTML5.</p></video><figcaption>Drôle de circuit !</figcaption></figure></div>";
beforeEach(function()
{
@ -18,166 +18,174 @@ describe("vCarousel", function()
document.body.removeChild(document.getElementById('fixture'));
});
it("Should be an instance of vCarousel", function()
it("should be an instance of vCarousel", function()
{
expect(vCarouselTest).toBeInstanceOf(vCarousel);
});
describe("Setting vCarousel", function()
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","video1","video2"]; }).toThrowError(errors.elementNotFound+"dontExistId");
expect(function() { return vCarouselTest.vContainers=["video1","dontExistId","video2"]; }).toThrowError(errors.elementNotFound+"dontExistId");
expect(function() { return vCarouselTest.vContainers=["video1","video2","dontExistId"]; }).toThrowError(errors.elementNotFound+"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","video1","video2"]; }).toThrowError(errors.videoNotFound+"noVideo");
expect(function() { return vCarouselTest.vContainers=["video1","noVideo","video2"]; }).toThrowError(errors.videoNotFound+"noVideo");
expect(function() { return vCarouselTest.vContainers=["video1","video2","noVideo"]; }).toThrowError(errors.videoNotFound+"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 2 ids valides passés pour les éléments HTML contenant les vidéos.", function()
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=["video1"]; }).toThrowError(errors.need2Videos);
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()
{
expect(function() { return vCarouselTest.vContainers=["video1","video2"]; }).not.toThrowError();
expect(function() { return vCarouselTest.vContainers=["vFunanbule","vForgeron"]; }).not.toThrowError();
});
it("Ne doit pas prendre en compte l'id fourni pour la première vidéo à afficher, s'il ne correspond pas à une des vidéos fournis.", function()
it("Ne doit pas prendre en compte l'id fourni pour la première vidéo à afficher s'il n'est pas correcte.", function()
{
vCarouselTest.vContainers=["video1","video2"];
vCarouselTest.firstVideoId="video3";
vCarouselTest.vContainers=["vFunanbule","vForgeron"];
vCarouselTest.firstVideoId="vCircuit";
expect(vCarouselTest.firstVideoId).toBeUndefined();
});
it("Doit accepter un firstVideoId vide permettant de cacher toutes les vidéos au lancement.", function()
it("Doit accepter un firstVideoId vide pour n'afficher aucune vidéo au lancement.", function()
{
vCarouselTest.vContainers=["video1","video2"];
vCarouselTest.vContainers=["vFunanbule","vForgeron"];
vCarouselTest.firstVideoId="";
expect(vCarouselTest.firstVideoId).toBe("");
});
});
describe("running 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(errors.needVideosProvided);
});
it("Doit cacher toutes les vidéos si cela est demandé en option, aucune vidéo n'étant alors enregistrée comme en cours.", function()
it("Doit cacher toutes les vidéos si cela est demandé en option, aucune vidéo n'étant enregistrée comme en cours.", function()
{
const videosId=["video1","video2","video3"];
const videosId=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.vContainers=videosId;
vCarouselTest.firstVideoId="";
vCarouselTest.run();
for(let containerId of videosId)
{
expect(document.getElementById(containerId).style.display).toBe("none");
}
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()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.firstVideoId="video3";
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.firstVideoId="vCircuit";
vCarouselTest.run();
expect(document.getElementById("video1").style.display).toBe("none");
expect(document.getElementById("video2").style.display).toBe("none");
expect(document.getElementById("video3").style.display).toBe("block");
expect(vCarouselTest.currentVideo).toEqual(<HTMLMediaElement>document.querySelector("#video3 video"));
expect(document.getElementById("vFunanbule").style.display).toBe("none");
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.currentVideo).toEqual(currentVideo);
});
it("Si aucune indication n'est passée en option, doit cacher toutes les vidéos sauf la première qui doit être enregistrée comme celle en cours.", function()
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()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.run();
expect(document.getElementById("video1").style.display).toBe("block");
expect(document.getElementById("video2").style.display).toBe("none");
expect(document.getElementById("video3").style.display).toBe("none");
expect(vCarouselTest.currentVideo).toEqual(<HTMLMediaElement>document.querySelector("#video1 video"));
expect(document.getElementById("vFunanbule").style.display).toBe("block");
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.currentVideo).toEqual(currentVideo);
});
it("Doit demander le lancement de la première vidéo affichée, si demandé en option.", function()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.firstVideoId="video2";
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.firstVideoId="vCircuit";
vCarouselTest.playFirstVideo=true;
let currentVideo=<HTMLMediaElement>document.querySelector("#video2 video");
let currentVideo=<HTMLMediaElement>document.querySelector("#vCircuit video");
spyOn(currentVideo, "play");
vCarouselTest.run();
expect(currentVideo.play).toHaveBeenCalled();
});
it("Ne doit pas demander le lancement de la première vidéo affichée, si cela n'est pas demandé en option.", function()
it("Ne doit demander le lancement de la première vidéo affichée, si cela n'est pas demandé en option.", function()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.firstVideoId="video3";
let currentVideo=<HTMLMediaElement>document.querySelector("#video3 video");
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.firstVideoId="vCircuit";
let currentVideo=<HTMLMediaElement>document.querySelector("#vCircuit video");
spyOn(currentVideo, "play");
vCarouselTest.run();
expect(currentVideo.play).not.toHaveBeenCalled();
});
it("Doit passer d'une vidéo à l'autre et arrêter lorsqu'elles ont toutes été affichées.", function()
it("Doit passer d'une vidéo à l'autre jusqu'à ce qu'elles aient été toutes affichées.", function()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.run();
let currentVideo=<HTMLMediaElement>document.querySelector("#video1 video");
let currentVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
// Fin de lecture de la première vidéo, on passe à la suivante :
currentVideo.dispatchEvent(new Event("ended"));
expect(document.getElementById("video1").style.display).toBe("none");
expect(document.getElementById("video2").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#video2 video");
expect(document.getElementById("vFunanbule").style.display).toBe("none");
expect(document.getElementById("vForgeron").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#vForgeron video");
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#video2");
expect(window.location.hash).toEqual("#vForgeron");
// Fin de la deuxième, on passe à la dernière :
currentVideo.dispatchEvent(new Event("ended"));
expect(document.getElementById("video2").style.display).toBe("none");
expect(document.getElementById("video3").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#video3 video");
expect(document.getElementById("vForgeron").style.display).toBe("none");
expect(document.getElementById("vCircuit").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#vCircuit video");
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#video3");
expect(window.location.hash).toEqual("#vCircuit");
// Fin de la dernière, rien ne bouge :
currentVideo.dispatchEvent(new Event("ended"));
expect(document.getElementById("video3").style.display).toBe("block");
expect(document.getElementById("vCircuit").style.display).toBe("block");
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#video3");
expect(window.location.hash).toEqual("#vCircuit");
});
it("Si cela est demandé, le carrousel doit reprendre au début après avoir parcouru toutes les vidéos.", function()
it("Si demandé, le carrousel doit continuer après avoir parcouru toutes les vidéos.", function()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.noStop=true;
vCarouselTest.run();
let currentVideo=<HTMLMediaElement>document.querySelector("#video1 video");
let currentVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
// Fin de lecture de la première vidéo, on passe à la suivante :
currentVideo.dispatchEvent(new Event("ended"));
currentVideo=<HTMLMediaElement>document.querySelector("#video2 video");
currentVideo=<HTMLMediaElement>document.querySelector("#vForgeron video");
// Fin de la deuxième, on passe à la dernière :
currentVideo.dispatchEvent(new Event("ended"));
currentVideo=<HTMLMediaElement>document.querySelector("#video3 video");
// Fin de la dernière, on doit retourner à la première :
currentVideo=<HTMLMediaElement>document.querySelector("#vCircuit video");
// Fin de la dernière, on retourne à la première :
currentVideo.dispatchEvent(new Event("ended"));
expect(document.getElementById("video3").style.display).toBe("none");
expect(document.getElementById("video1").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#video1 video");
expect(document.getElementById("vCircuit").style.display).toBe("none");
expect(document.getElementById("vFunanbule").style.display).toBe("block");
currentVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
expect(vCarouselTest.currentVideo).toEqual(currentVideo);
expect(window.location.hash).toEqual("#video1");
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=["video1","video2","video3"];
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.playNextVideos=true;
vCarouselTest.run();
let firstVideo=<HTMLMediaElement>document.querySelector("#video1 video");
let nextVideo=<HTMLMediaElement>document.querySelector("#video2 video");
let firstVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
let nextVideo=<HTMLMediaElement>document.querySelector("#vForgeron video");
spyOn(nextVideo, "play");
// Fin de lecture de la première vidéo, on passe à la suivante qui doit se lancer automatiquement :
firstVideo.dispatchEvent(new Event("ended"));
@ -186,11 +194,10 @@ describe("vCarousel", function()
it("Ne doit pas demander le lancement des nouvelles vidéos affichées, si cela n'est pas demandé en option.", function()
{
vCarouselTest.vContainers=["video1","video2","video3"];
vCarouselTest.firstVideoId="video2";
vCarouselTest.vContainers=["vFunanbule","vForgeron","vCircuit"];
vCarouselTest.run();
let firstVideo=<HTMLMediaElement>document.querySelector("#video2 video");
let nextVideo=<HTMLMediaElement>document.querySelector("#video3 video");
let firstVideo=<HTMLMediaElement>document.querySelector("#vFunanbule video");
let nextVideo=<HTMLMediaElement>document.querySelector("#vForgeron video");
spyOn(nextVideo, "play");
// Fin de lecture de la première vidéo, on passe à la suivante qui ne doit pas se lancer automatiquement :
firstVideo.dispatchEvent(new Event("ended"));