import { FreeDatas2HTML, Selector } from "../src/FreeDatas2HTML"; const errors=require("../src/errors.js"); const fixtures=require("./fixtures.js"); describe("Test des sélecteurs de données", () => { let converter: FreeDatas2HTML; let selector: Selector; let selectElement : HTMLSelectElement; beforeEach( async () => { document.body.insertAdjacentHTML("afterbegin", fixtures.datasViewEltHTML); converter=new FreeDatas2HTML("CSV"); converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datas1.csv" }); converter.datasViewElt={ id:"datas" }; await converter.run(); }); afterEach( () => { document.body.removeChild(document.getElementById("fixture")); }); describe("Test des données d'initialisation.", () => { it("Doit générer une erreur, si initialisé sans avoir au préalable chargé des données.", async () => { // Convertisseur non lancé : converter=new FreeDatas2HTML("CSV"); expect(() => { return new Selector(converter, 0, { id:"selector1" }); }).toThrowError(errors.filterNeedDatas); // Note : les parseurs vont générer une erreur en amont s'ils ne trouvent pas de noms de champs // Par contre, ils acceptent de ne pas trouver de données : converter.parser.datas2Parse="Z (numéro atomique),Élément,Symbole,Famille,Abondance des éléments dans la croûte terrestre (μg/k)"; await converter.run(); expect(() => { return new Selector(converter, 0, { id:"selector1" }); }).toThrowError(errors.filterNeedDatas); }); it("Doit générer une erreur, si le numéro de champ fourni n'existe pas dans les données.", () => { expect(() => { return new Selector(converter, 9, { id:"selector1" }); }).toThrowError(errors.selectorFieldNotFound); expect(() => { return new Selector(converter, -1, { id:"selector1" }); }).toThrowError(errors.selectorFieldNotFound); expect(() => { return new Selector(converter, 1.1, { id:"selector1" }); }).toThrowError(errors.selectorFieldNotFound); }); it("Doit générer une erreur, si aucune donnée n'a été trouvée dans le champ du filtre.", async () => { converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datasEmptyField.csv" }); await converter.run(); expect(() => { return new Selector(converter, 3, { id:"selector1" });}).toThrowError(errors.selectorFieldIsEmpty); }); it("Si un séparateur vide est fourni pour un filtre, il doit être ignoré.", () => { selector=new Selector(converter, 0, { id:"selector1" }, ""); expect(selector.separator).toBeUndefined(); }); it("Si toutes les paramètres sont valides, ils doivent être acceptés et les informations correctement récupérées.", () => { expect(() => { selector=new Selector(converter, 3, { id:"selector1" }, ","); return true; }).not.toThrowError(); expect(selector.datasFieldNb).toEqual(3); expect(selector.datasViewElt).toEqual({ id:"selector1", eltDOM:document.getElementById("selector1") }); expect(selector.separator).toEqual(","); expect(selector.name).toEqual("Famille"); expect(selector.values).toEqual(["Actinide","Gaz noble","gaz rare","Halogène","Indéfinie","Lanthanide","Métal alcalin","Métal alcalino-terreux","Métal de transition","Métal pauvre","Métalloïde","Non-métal"]); }); it("Si des valeurs vides sont présentes dans un champ utilisé pour un filtre, elles doivent être ignorées.", async () => { converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datas1-emtyinfield.csv" }); await converter.run(); selector=new Selector(converter, 3, { id:"selector1" }, ""); expect(selector.values).toEqual(["Actinide","Gaz noble","gaz rare","Halogène","Indéfinie","Lanthanide","Métal alcalin","Métal alcalino-terreux","Métal de transition","Métal pauvre","Métalloïde","Non-métal"]); }); it("Si des espaces entourent certaines valeurs pour ce champ, ils doivent être supprimés.", async () => { converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datasNeedTrim.csv" }); await converter.run(); selector=new Selector(converter, 3, { id:"selector1" }, ""); expect(selector.values).toEqual(["Gaz noble","Métal alcalin","Métal alcalino-terreux","Métalloïde","Non-métal"]); }); it("Si un séparateur est fourni, les valeurs distinctes extraites de ce champ doivent le prendre en compte.", async () => { converter.parser.setRemoteSource({ url:"http://localhost:9876/datas/datas1+tagsfield.csv" }); await converter.run(); selector=new Selector(converter, 5, { id:"selector1" }, "|"); selector.filter2HTML(); expect(selector.values).toEqual(["Exemple0","Exemple1","Exemple2","Exemple3","Exemple4","Exemple5","Exemple6","Exemple7","Exemple8","Exemple9","Exemple10"]); }); it("Si une fonction spécifique est fournie pour le champ utilisé pour ce filtre, elle doit être prise en compte.", () => { const mySort=(a: any, b: any, order: "asc"|"desc"="asc") => { const values=[ "> 100000", "> 1 et < 100 000", "≤ 1", "Traces", "Inexistant"]; if(order === "desc") values.reverse(); if(values.indexOf(a) > values.indexOf(b)) return -1; else if(values.indexOf(a) < values.indexOf(b)) return 1; else return 0; }; converter.datasSortingFunctions=[{ datasFieldNb: 4, sort:mySort }]; selector=new Selector(converter, 4, { id:"selector1" }); expect(selector.values).toEqual(["Inexistant","Traces","≤ 1","> 1 et < 100 000","> 100000"]); }); }); describe("Création des sélecteurs.", () => { beforeEach( async () => { selector=new Selector(converter, 3, { id:"selector1" }); }); it("Doit générer un élement