* @copyright Tela-Botanica 1999-2010 * @link http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel * @licence GPL v3 & CeCILL v2 * @version $Id$ */ // +-------------------------------------------------------------------------------------------------------------------+ // TODO : supprimer l'utilisation du paramêtres 'p' et chercher les infos depuis la bdd class Tests extends ScriptCommande { const SCRIPT_NOM = 'tests'; const MANUEL_VERSION = '4.4'; private $projet = null; private $traitement = null; private $manuel = null; private $manuel_nom = null; private $manuel_chemin = null; private $tests = null; private $colonnes = null; private $analyses = null; private $noms = null; private $erreurs = array(); private $resultatDao = null; private $traitementDao = null; private $tableStructureDao = null; private $referentielDao = null; public function executer() { $this->manuel_nom = 'mtpr_v'.str_replace('.', '_', self::MANUEL_VERSION).'.pdf'; $this->manuel_chemin = Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS; $manuel_config_nom = 'referentiel_v'.self::MANUEL_VERSION.'.ini'; $this->manuel = parse_ini_file($this->manuel_chemin.$manuel_config_nom); $this->definirConstantes(); $this->tests = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'tests.ini', true); $this->resultatDao = new ResultatDao(); $this->traitementDao = new TraitementDao(); Debug::printr('Dans le script test'); // Récupération du dernier traitement demandé $this->traitement = $this->traitementDao->getDernierTraitement('tout', self::SCRIPT_NOM); if (isset($this->traitement)) { $this->projet = $this->traitement['referentiel_code']; // Récupération du nom de projet Debug::printr($this->traitement); // Écriture de la date de début du traitement Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement'])); // Nettoyage des traitements obsolètes $traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->projet, self::SCRIPT_NOM); if (isset($traitements_obsoletes)) { Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes)); } $this->tableStructureDao = new TableStructureDao(); $this->referentielDao = new ReferentielDao(); // Lancement du test demandé $cmd = $this->getParam('a'); switch ($cmd) { case 'tout' : Debug::printr('Départ lancement test:'); $this->recupererDonnees(); $this->lancerTestsAuto(); break; case 'test14' : $this->recupererDonnees(); Debug::printr('Départ lancement test 14 :'); $this->testerClassificationRang(); break; default : $this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd)); } // Écriture de la date de fin du traitement Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement'])); } else { Debug::printr("Aucun dernier traitement trouvé pour le script '".self::SCRIPT_NOM."' !"); } } /** * Cette méthode définie des constantes qui peuvent ensuite être utilisée dans les fichier ini. * Surtout utile pour le fichier tests.ini */ private function definirConstantes() { define('RANG_GENRE', $this->manuel['rang_genre']); define('RANG_SP', $this->manuel['rang_sp']); date_default_timezone_set('Europe/Berlin'); define('ANNEE_EN_COURS', date('Y')); define('ANNEE_MINIMUM', 1753); } public function recupererDonnees() { // Récupération des données à tester $this->colonnes = $this->tableStructureDao->getColonnes($this->projet); $this->analyses = $this->tableStructureDao->getAnalyse($this->projet); $this->noms = $this->referentielDao->getTout($this->projet); Debug::printr('Nbre noms :'.count($this->noms)); } public function lancerTestsAuto() { $resultats = array(); // Lancement des tests unitaires Debug::printr('Lancement des tests unitaires'); $tests_numeros = array_keys($this->tests); Debug::printr($tests_numeros); foreach ($tests_numeros as &$numero) { $info = $this->getInfosTest($numero); if ($numero < 5) { // Tests spéciaux vérifiant la structure de la table $resultats[] = $this->lancerTestUnitaire($info); } else if ($numero >= 5 && $this->verifierResultats($resultats)) { // Si la structure est bonne nous lançons les autres tests $this->lancerTestUnitaire($info); } } $info = $this->construireTotalErreur(); $this->traiterResultatTest($info); } private function getInfosTest($numero) { $info = $this->tests[$numero]; $info['methode'] = 'tester'.implode('', explode(' ', ucwords($info['abr']))); $info['numero'] = $numero; $info['nom'] = '#'.$numero.' - '.$info['nom']; $info['resultat'] = false; return $info; } public function lancerTestUnitaire($info) { Debug::printr($info['numero'].'::'.$info['methode']); $methodeDeTest = $info['methode']; $erreurs = $this->$methodeDeTest(); // Analyse des résultats if (isset($erreurs['special'])) { $info = $erreurs; } else { $info = $this->construireResultatErreur($erreurs, $info); } $this->traiterResultatTest($info); if ($info['numero'] < 5) { return ($info['resultat'] ? '1' : '0'); } } private function ajouterNumNomErreursTest($num_nom) { if (count($this->erreurs) < 1000) { if (isset($this->erreurs[$num_nom])) { $this->erreurs[$num_nom] += 1; } else { $this->erreurs[$num_nom] = 1; } } } private function construireResultatErreur($erreurs, $info) { if (count($erreurs) > 0) { $info['message']['entete'] = explode(',', $info['entete']); if (isset($info['title'])) { $info['message']['title'] = explode(';', $info['title']); } $info['message']['lignes'] = $erreurs; unset($erreurs); } else { $info['resultat'] = true; } return $info; } private function construireTotalErreur() { if (count($this->erreurs) > 0) { arsort($this->erreurs); $info['abr'] = "erreurs par num_nom"; $info['nom'] = "erreurs -> num_nom"; $info['description'] = "nombre d'erreurs détecté par num_nom"; $info['numero'] = "0"; $info['message']['entete'] = array('num_nom', "nombre d'erreurs"); foreach ($this->erreurs as $num_nom=>$nombre) { $erreurs[] = array(0 => $num_nom, 1 => $nombre); } $info['message']['lignes'] = $erreurs; unset($this->erreurs); } else { $info['resultat'] = true; } return $info; } private function verifierResultats(&$resultats) { $ok = true; foreach ($resultats as $resultat) { if ($resultat == '0') { $ok = false; break; } } return $ok; } private function traiterResultatTest($info) { if (isset($info['message'])) { if (is_array($info['message'])) { $erreurs_nbre = count($info['message']['lignes']); $erreurs_max = 1000; if ($erreurs_nbre > $erreurs_max) { $info['message']['lignes'] = array_slice($info['message']['lignes'], 0, $erreurs_max); $info['erreur'] = "$erreurs_nbre erreurs ont été détectées seules les $erreurs_max premières sont affichées"; } $info['message'] = $this->getVue('tests/squelettes/message_table', $info); } else { $info['message'] = $this->getVue('tests/squelettes/message_p', $info); } } Debug::printr($this->resultatDao->ajouter($this->traitement['id_traitement'], $info)); $info = null; } //+--------------------------------------------------------------------------------------------------------------+// // TESTS /** * Test #01 */ private function testerNombreDeChamps() { $info = $this->getInfosTest(1); $info['special'] = true; $nbre_colonnes = count($this->colonnes); $info['message'] = $nbre_colonnes; if ($nbre_colonnes >= 37) { $info['resultat'] = true; } return $info; } /** * Test #02 */ private function testerNomDesChamps() { $info = $this->getInfosTest(2); $info['special'] = true; $champs_attendus = explode(',', $this->manuel['champs']); $champs_presents = array(); foreach ($this->colonnes as &$colonne) { $champs_presents[$colonne['Field']] = $colonne; } $ok = true; $champs_manquant = array(); foreach ($champs_attendus as &$champ_attendu) { if (!isset($champs_presents[$champ_attendu])) { $champs_manquant[] = $champ_attendu; $ok = false; } } $info['resultat'] = $ok; if (!$ok) { $info['message'] = sprintf($info['message'], implode(', ', $champs_manquant)); } return $info; } /** * Test #03 */ private function testerTypeDesChamps() { $champs_attendus = explode(',', $this->manuel['champs_type']); $champs_presents = array(); foreach ($this->colonnes as &$colonne) { $champs_presents[$colonne['Field']] = $colonne['Type']; } // Recercherche des erreurs $champs_erreur = array(); foreach ($champs_attendus as &$champ_attendu) { list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu)); list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille)); if (isset($champs_presents[$champ_attendu_nom])) { $champs_present_type = $champs_presents[$champ_attendu_nom]; if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false) || ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false) || ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false) || ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) { $champs_erreur[] = array($champ_attendu, $champ_attendu_type, $champs_present_type); } } } return $champs_erreur; } /** * Test #04 */ private function testerNumNomClePrimaire() { $info = $this->getInfosTest(4); $info['special'] = true; foreach ($this->colonnes as &$colonne) { if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') { $info['resultat'] = true; break; } } return $info; } /** * Test #05 */ private function testerTailleDesChamps() { $tailles_champs_maxi = array(); foreach ($this->colonnes as &$colonne) { if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) { $tailles_champs_maxi[$colonne['Field']] = $match[1]; } } $tailles_trouvees = array(); foreach ($this->analyses as &$analyse) { if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) { $tailles_trouvees[$match[1]] = $analyse['Max_length']; } } $champs_erreur = array(); $champs_attendus = explode(',', $this->manuel['champs']); foreach ($champs_attendus as &$champ_attendu) { if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) { if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) { $champs_erreur[] = array($champ_attendu, $tailles_champs_maxi[$champ_attendu], $tailles_trouvees[$champ_attendu]); } } } return $champs_erreur; } /** * Test #06 */ private function testerNumNomSuperieurAZero() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom'] <= 0) { $noms_erreur[] = array($nom['num_nom']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #07 */ private function testerNumNomRetenuSuperieurAZero() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #08 */ private function testerExistenceNumNomRetenu() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] != $nom['num_nom']) { if ($nom['num_nom_retenu'] != 0 && !isset($this->noms[$nom['num_nom_retenu']])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #09 */ private function testerTransmissionNumNomRetenu() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['exclure_taxref'] == 0) { if ($nom['num_nom_retenu'] != 0 && isset($this->noms[$nom['num_nom_retenu']])) { if ($this->noms[$nom['num_nom_retenu']]['exclure_taxref'] != 0) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $this->noms[$nom['num_nom_retenu']]['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } return $noms_erreur; } /** * Test #10 */ private function testerSynonymeNumNomRetenu() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] != $nom['num_nom']) { if ($nom['num_nom_retenu'] != 0 && isset($this->noms[$nom['num_nom_retenu']])) { if ($this->noms[$nom['num_nom_retenu']]['num_nom'] != $this->noms[$nom['num_nom_retenu']]['num_nom_retenu']) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $this->noms[$nom['num_nom_retenu']]['num_nom_retenu']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } return $noms_erreur; } /** * Test #11 */ private function testerDoublonsNomSci() { $noms_erreur = array(); $noms_complets = array(); foreach ($this->noms as &$nom) { $a = $nom['nom_sci']." ".$nom['auteur']." ".$nom['nom_addendum']." ".$nom['biblio_origine']; if (isset($noms_complets[$a])) { $noms_erreur[] = array($nom['num_nom'], $a, $noms_complets[$a], $nom['exclure_taxref'], $nom['homonyme']); $this->ajouterNumNomErreursTest($nom['num_nom']); } else { $noms_complets[$a] = $nom['num_nom']; } } return $noms_erreur; } /** * Test #12 */ private function testerNumTaxSupEgalZeroUnique() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if (preg_match('/^0$/', $nom['num_tax_sup'])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } // Ce test est spécial car le nombre de noms en erreurs doit être supérieur à 1 et non à 0 pour être KO. if (count($noms_erreur) == 1) { $noms_erreur = array(); } return $noms_erreur; } /** * Test #13 */ private function testerTaxSupPourTaxon() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') { $noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #14 */ private function testerExistenceTaxonSuperieur() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] == $nom['num_nom']) { if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #15 */ private function testerClassificationEspece() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['rang'] == 290) { if (isset($this->noms[$nom['num_tax_sup']])) { $nom_sup = $this->noms[$nom['num_tax_sup']]; if ($nom_sup['rang'] != 220 ) { $noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom_sup['num_nom'], $nom_sup['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } return $noms_erreur; } /** * Test #16 */ private function testerTransmissionTaxonSuperieur() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['exclure_taxref'] == 0) { if ($nom['num_tax_sup'] != 0 && isset($this->noms[$nom['num_tax_sup']])) { if ($this->noms[$nom['num_tax_sup']]['exclure_taxref'] != 0) { $noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup'], $this->noms[$nom['num_tax_sup']]['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } return $noms_erreur; } /** * Test #17 */ private function testerClassificationRang() { $noms_erreur = array(); //$rangs = explode(',', $this->manuel['rangs']); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] == $nom['num_nom']) { if (isset($this->noms[$nom['num_tax_sup']])) { $nom_sup = $this->noms[$nom['num_tax_sup']]; //$num_rang = array_search($nom['rang'], $rangs); if ($nom_sup['rang'] >= $nom['rang']) { //if ($nom_sup['rang'] != $rangs[$num_rang-1] ) { // Prise en compte de l'exception des clades if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) { $noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom_sup['num_nom'], $nom_sup['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } } return $noms_erreur; } /** * Test #18 */ private function testerClassification() { $noms_erreur = array(); $this->noms_ok = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] == $nom['num_nom']) { if (isset($this->noms_ok[$nom['num_tax_sup']])) { $this->noms_ok[$nom['num_nom']] = true; } else { $this->detection_boucle_infini = array(); $classif_ok = $this->remonterClassif($nom); unset($this->detection_boucle_infini); if ($classif_ok === true) { $this->noms_ok[$nom['num_nom']] = $classif_ok; } else { $noms_erreur[] = array($nom['num_nom'], $classif_ok, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } unset($this->noms_ok); return $noms_erreur; } private function remonterClassif(&$nom) { $this->detection_boucle_infini[$nom['num_nom']] = true; if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) { if (isset($this->noms_ok[$nom['num_tax_sup']])) { $this->noms_ok[$nom['num_nom']] = true; return true; } else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') { $this->noms_ok[$nom['num_nom']] = true; return true; } else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') { return 'Hiérarchie avec le taxon #'.$nom['num_nom'].' ayant un taxon superieur #'.$nom['num_tax_sup'].' inexistant'; } else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) { return 'Boucle infinie pour le taxon #'.$nom['num_tax_sup']; } else { $retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]); if ($retour === true) { $this->noms_ok[$nom['num_tax_sup']] = true; $this->ajouterNumNomErreursTest($nom['num_nom']); } return $retour; } } else { return 'Valeur num_tax_sup incorrecte : '.$nom['num_tax_sup']; } } /** * Test #19 */ private function testerRang() { $rangs = array_flip(explode(',', $this->manuel['rangs'])); // Réalisation du test $noms_erreur = array(); foreach ($this->noms as &$nom) { if (!isset($rangs[$nom['rang']])) { $noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #20 */ private function testerNomCompletSupraGenerique() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['rang'] < $this->manuel['rang_genre']) { $suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom); $nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']); $nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : ''); if ($nom['nom_sci'] != $nom_sci_ideal) { $nom_sci_traite = $this->repererEspace($nom['nom_sci']); $noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #21 */ private function testerNomCompletGenre() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['rang'] == $this->manuel['rang_genre']) { $suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom); $nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']); $nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : ''); if ($nom['nom_sci'] != $nom_sci_ideal) { $nom_sci_traite = $this->repererEspace($nom['nom_sci']); $noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #22 */ private function testerNomCompletInfraGenre() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) { $suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom); $nom_sci_ideal = ''; if ($nom['type_epithete'] == 'agg.') { $nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '. $this->formaterStyleNomGenre($nom['epithete_infra_generique']).' '. $nom['type_epithete']; } else { $nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '. $nom['type_epithete'].' '. $this->formaterStyleNomGenre($nom['epithete_infra_generique']); } $nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : ''); if ($nom['nom_sci'] != $nom_sci_ideal) { $nom_sci_traite = $this->repererEspace($nom['nom_sci']); $noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #23 */ private function testerNomCompletEspece() { $noms_erreur = array(); $erreur = ''; foreach ($this->noms as &$nom) { if ($nom['rang'] == $this->manuel['rang_sp']) { $suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom); $nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '; if (strstr($nom['nom_sci'] , ' x ') != false) { list($nom_sci_ideal, $erreur) = $this->formaterStyleEpitheteSpHybride($nom_sci_ideal, $nom['epithete_sp']); } else { $nom_sci_ideal .= utf8_encode(strtolower(utf8_decode($nom['epithete_sp']))); } $nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : ''); $nom_sci_ideal = trim($nom_sci_ideal); if ($nom['nom_sci'] != $nom_sci_ideal) { $nom_sci_traite = $this->repererEspace($nom['nom_sci']); $noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $erreur, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #24 */ private function testerNomCompletInfraSpecifique() { $noms_erreur = array(); $erreur = null; foreach ($this->noms as &$nom) { if ($nom['rang'] > $this->manuel['rang_sp']) { $nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']).' '. utf8_encode(strtolower(utf8_decode($nom['epithete_sp']))).' '. utf8_encode(strtolower(utf8_decode($nom['type_epithete']))).' '; $suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom); if (strstr($nom['nom_sci'] , ' x ') != false) { list($nom_sci_ideal, $erreur) = $this->formaterStyleEpitheteInfraSpHybride($nom_sci_ideal, $nom['epithete_infra_sp'], $nom['genre']); } else { $nom_sci_ideal .= utf8_encode(strtolower(utf8_decode($nom['epithete_infra_sp']))); } $nom_sci_ideal = trim($nom_sci_ideal); $nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : ''); if ($nom['nom_sci'] != $nom_sci_ideal) { $nom_sci_traite = $this->repererEspace($nom['nom_sci']); $noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal, $erreur, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #25 */ private function testerNomSupraGeneriqueEspaces() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['nom_supra_generique'] != '') { if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) { $nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']); $noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #26 */ private function testerNomSupraGeneriqueSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['nom_supra_generique'] != '') { if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) { $nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']); $noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #27 */ private function testerNomSupraGeneriqueRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['nom_supra_generique'] != '') { if ($nom['rang'] >= $this->manuel['rang_genre']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #28 */ private function testerGenreEspaces() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['genre'] != '') { if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) { $nom_traite = $this->repererEspace($nom['genre']); $noms_erreur[] = array($nom['num_nom'], $nom_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #29 */ private function testerGenreSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['genre'] != '') { $mots = explode(' ', $nom['genre']); foreach ($mots as $mot) { if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) { $nom_traite = $this->repererEspace($nom['genre']); $noms_erreur[] = array($nom['num_nom'], $nom_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); break; } } } } return $noms_erreur; } /** * Test #30 */ private function testerGenreRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['genre'] != '') { if ($nom['rang'] < $this->manuel['rang_genre']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #31 */ private function testerEpitheteInfraGeneriqueSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_infra_generique'] != '') { if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) { $epithete_traite = $this->repererEspace($nom['epithete_infra_generique']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #32 */ private function testerEpitheteInfraGeneriqueRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_infra_generique'] != '') { if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #33 */ private function testerEpitheteInfraGeneriqueEspaces() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_infra_generique'] != '') { if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) { $epithete_traite = $this->repererEspace($nom['epithete_infra_generique']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #34 */ private function testerEpitheteSpEspaces() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_sp'] != '') { if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) { $epithete_traite = $this->repererEspace($nom['epithete_sp']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #35 */ private function testerEpitheteSpSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_sp'] != '') { $formule_hybridite = (strpos($nom['epithete_sp'], ' x ') !== false); $mots = explode(' ', $nom['epithete_sp']); foreach ($mots as $mot) { // TODO: créer un test qui vérifie la formule d'hybridité en la reconstruisant à partir des parents // afin que seuls des formules valides parviennent à la fonction if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot) || ($formule_hybridite && $this->verifierEpitheteGenre($mot) && !$this->verifierEstAbbreviationInfraSp($mot)))) { $epithete_traite = $this->repererEspace($nom['epithete_sp']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); break; } } } } return $noms_erreur; } /** * Test #36 */ private function testerEpitheteSpRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_sp'] != '') { if ($nom['rang'] < $this->manuel['rang_sp']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #37 */ private function testerTypeEpitheteEspaces() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['type_epithete'] != '') { if (preg_match('/\s+/', $nom['type_epithete'])) { $valeur_traitee = $this->repererEspace($nom['epithete_sp']); $noms_erreur[] = array($nom['num_nom'], $valeur_traitee, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #38 */ private function testerTypeEpitheteSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['type_epithete'] != '') { if (!$this->verifierTypeEpithete($nom['type_epithete'])) { $noms_erreur[] = array($nom['num_nom'], $nom['type_epithete'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #39 */ private function testerTypeEpitheteHybridite() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['type_epithete'] != '') { if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) { $noms_erreur[] = array($nom['num_nom'], $nom['type_epithete'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #40 */ private function testerEpitheteInfraSpEspaces() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_infra_sp'] != '') { if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) { $epithete_traite = $this->repererEspace($nom['epithete_infra_sp']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #41 */ private function testerEpitheteInfraSpSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom["rang"] != 450) { if ($nom['epithete_infra_sp'] != '') { $mots = explode(' ', $nom['epithete_infra_sp']); $hybride_contient_abbreviation_infra_sp = false; $formule_hybridite = (strpos($nom['epithete_infra_sp'], ' x ') !== false); foreach ($mots as $mot) { if($formule_hybridite && $this->verifierEstAbbreviationInfraSp($mot)) { $hybride_contient_abbreviation_infra_sp = true; } $formule_hybridite_valide = $this->verifierEpitheteGenre($mot) || $this->verifierEpitheteSp($mot) || $hybride_contient_abbreviation_infra_sp; if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot) || $this->verifierEpitheteSp($mot) || $formule_hybridite_valide)) { $epithete_traite = $this->repererEspace($nom['epithete_infra_sp']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); break; } } if($formule_hybridite && !$hybride_contient_abbreviation_infra_sp) { $epithete_traite = $this->repererEspace($nom['epithete_infra_sp']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } return $noms_erreur; } /** * Test #42 */ private function testerEpitheteInfraSpRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['epithete_infra_sp'] != '') { if ($nom['rang'] < $this->manuel['rang_sp']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #43 */ private function testerGroupeCultivarSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['cultivar_groupe'] != '') { if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) { $epithete_traite = $this->repererEspace($nom['cultivar_groupe']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #44 */ private function testerGroupeCultivarRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['cultivar_groupe'] != '') { if ($nom['rang'] < $this->manuel['rang_genre']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #45 */ private function testerCultivarSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['cultivar'] != '') { if (!$this->verifierEpitheteCultivar($nom['cultivar'])) { $epithete_traite = $this->repererEspace($nom['cultivar']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #46 */ private function testerCultivarRang() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['cultivar'] != '') { if ($nom['rang'] < $this->manuel['rang_genre']) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #47 */ private function testerNomCommercialSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['nom_commercial'] != '') { if (!$this->verifierNomCommercial($nom['nom_commercial'])) { $epithete_traite = $this->repererEspace($nom['nom_commercial']); $noms_erreur[] = array($nom['num_nom'], $epithete_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #48 */ private function testerNomCommercialPresenceCultivar() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #49 */ private function testerAuteurSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['auteur'] != '') { if (!$this->verifierAuteur($nom['auteur'])) { $intitule_traite = $this->repererEspace($nom['auteur']); $noms_erreur[] = array($nom['num_nom'], $intitule_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #50 */ private function testerAnneeSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['annee'] != '') { if (!$this->verifierAnnee($nom['annee'])) { $noms_erreur[] = array($nom['num_nom'], $nom['annee'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #51 */ private function testerBiblioOrigineSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['biblio_origine'] != '') { if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) { $biblio_traite = $this->repererEspace($nom['biblio_origine']); $noms_erreur[] = array($nom['num_nom'], $biblio_traite, $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #52 */ private function testerHomonymieSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['homonyme'] != '') { if (!$this->verifierBooleen($nom['homonyme'])) { $noms_erreur[] = array($nom['num_nom'], $nom['homonyme'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #53 */ private function testerHomonymieExistence() { $noms_homonymie = $this->classerNomsParNomComplet(); $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') { if ($noms_homonymie[$nom['nom_sci']] <= 1) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } $noms_homonymie = null; return $noms_erreur; } /** * Test #54 */ private function testerBasionymeSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_basionyme'] != '') { if (!$this->verifierNombre($nom['num_basionyme'])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_basionyme'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #55 */ private function testerBasionymeExistence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_basionyme'] != '') { if (!isset($this->noms[$nom['num_basionyme']])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_basionyme'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #56 */ private function testerSynonymeProparteSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_proparte'] != '') { if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) { $noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #57 */ private function testerSynonymeProparteExistence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_proparte'] != '') { $num_nom_a_verifier = explode(',', $nom['synonyme_proparte']); $num_nom_en_erreur = array(); foreach ($num_nom_a_verifier as $num_nom) { if (!isset($this->noms[$num_nom])) { $num_nom_en_erreur[] = $num_nom; } } if (count($num_nom_en_erreur) > 0) { $noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur), $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #58 */ private function testerSynonymeDouteuxSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_douteux'] != '') { if (!$this->verifierBooleen($nom['synonyme_douteux'])) { $noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #59 */ private function testerSynonymeDouteuxNumNomRetenu() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_douteux'] == 1 && !$this->verifierNombre($nom['num_nom_retenu'])) { $noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #60 */ private function testerSynonymeDouteuxSynonyme() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_douteux'] == 1 && $nom['num_nom'] == $nom['num_nom_retenu']) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $nom['synonyme_douteux'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #61 */ private function testerSynonymeMalAppliqueSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_mal_applique'] != '') { if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) { $noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #62 */ private function testerSynonymeMalAppliqueChampsAnnexe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_mal_applique'] == 1) { $erreur = true; $erreur = ($nom['annee'] == "") ? false : $erreur; $erreur = ($nom['biblio_origine'] == "") ? false : $erreur; $erreur = (strpos($nom['auteur'], "sensu") === 0) ? $erreur : false; if ($erreur == false) { $noms_erreur[] = array($nom['num_nom'], $nom['auteur'], $nom['annee'], $nom['biblio_origine'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #63 */ private function testerSynonymeMalAppliqueSynonyme() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_mal_applique'] == 1 && $nom['num_nom'] == $nom['num_nom_retenu']) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu'], $nom['synonyme_mal_applique'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #64 */ private function testerSynonymeOrthographiqueSyntaxe() { $noms_erreur = array(); foreach ($this->noms as $nom) { if ($nom['synonyme_orthographique'] != '') { if (!$this->verifierNombre($nom['synonyme_orthographique'])) { $noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #65 */ private function testerSynonymeOrthographiqueExistence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['synonyme_orthographique'] != '') { if (!isset($this->noms[$nom['synonyme_orthographique']])) { $noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #66 */ private function testerHybrideParent01Syntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['hybride_parent_01'] != '') { if (!$this->verifierNombre($nom['hybride_parent_01'])) { $noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']), $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #67 */ private function testerHybrideParent01Existence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') { if (!isset($this->noms[$nom['hybride_parent_01']])) { $noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']), $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #68 */ private function testerHybrideParent02Syntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['hybride_parent_02'] != '') { if (!$this->verifierNombre($nom['hybride_parent_02'])) { $noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']), $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #69 */ private function testerHybrideParent02Existence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['hybride_parent_02'] != '') { if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') { $noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']), $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #70 */ private function testerNumTypeSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_type'] != '') { if (!$this->verifierNombre($nom['num_type'])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_type'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #71 */ private function testerNumTypeExistence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_type'] != '') { if (!isset($this->noms[$nom['num_type']])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_type'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #72 */ private function testerPresenceSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['presence'] != '') { if (!$this->verifierPresence($nom['presence'])) { $noms_erreur[] = array($nom['num_nom'], $nom['presence'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #73 */ private function testerPresenceExistence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['exclure_taxref'] == 0) { if ($nom['presence'] == "") { $noms_erreur[] = array($nom['num_nom'],$nom['num_nom_retenu'], $nom['presence'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #74 */ private function testerStatutOrigineSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['statut_origine'] != '') { if (!$this->verifierStatutOrigine($nom['statut_origine'])) { $noms_erreur[] = array($nom['num_nom'], $nom['statut_origine'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #75 */ private function testerStatutIntroductionSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['statut_introduction'] != '') { if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) { $noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #76 */ private function testerStatutCultureSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['statut_culture'] != '') { if (!$this->verifierStatutCulture($nom['statut_culture'])) { $noms_erreur[] = array($nom['num_nom'], $nom['statut_culture'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #77 */ private function testerExclureTaxRefSyntaxe() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) { if (!preg_match('/^(?:0|1|9)$/', $nom['exclure_taxref'])) { $noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #78 */ private function testerNomFrancaisUnique() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['nom_francais'] != '' && $nom['nom_francais'] != null) { if (strpbrk($nom['nom_francais'],',;')) { $noms_erreur[] = array($nom['num_nom'], $this->repererCaracteresInvalidesNomFrancais($nom['nom_francais'])); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } return $noms_erreur; } /** * Test #79 */ private function testerExistenceNomSuperieur() { $noms_erreur = array(); foreach ($this->noms as &$nom) { if ($nom['num_nom_sup'] != 0 && !isset($this->noms[$nom['num_nom_sup']])) { $noms_erreur[] = array($nom['num_nom'], $nom['num_nom_sup'], $nom['exclure_taxref']); $this->ajouterNumNomErreursTest($nom['num_nom']); } } return $noms_erreur; } /** * Test #80 */ private function testerExclureTaxRefPresence() { $noms_erreur = array(); foreach ($this->noms as &$nom) { // On vérifie tous les noms retenu nom exclus de taxref de rang inférieur ou égal à l'espèce if ($nom['num_nom_retenu'] == $nom['num_nom'] && $nom['exclure_taxref'] == 0 && $nom['rang'] >= 240) { if($nom['presence'] == '' || !$this->verifierPresence($nom['presence'])) { if(($nom['statut_origine'] == '' || !$this->verifierStatutOrigine($nom['statut_origine'])) && ($nom['statut_introduction'] == '' || !$this->verifierStatutIntroduction($nom['statut_introduction'])) && ($nom['statut_culture'] == '' || !$this->verifierStatutCulture($nom['statut_culture']))) { $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $this->mettreEnValeurAvertissement($nom['presence']), $this->mettreEnValeurAvertissement($nom['statut_origine']), $this->mettreEnValeurAvertissement($nom['statut_introduction']), $this->mettreEnValeurAvertissement($nom['statut_culture']) ); $this->ajouterNumNomErreursTest($nom['num_nom']); } else { //TODO: le comportement est identique mais il faudrait pouvoir afficher un avertissement // si le champ présence n'est pas rempli mais que l'une des colonne de statut l'est $noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['presence'], $this->mettreEnValeurAvertissement($nom['statut_origine']), $this->mettreEnValeurAvertissement($nom['statut_introduction']), $this->mettreEnValeurAvertissement($nom['statut_culture']) ); $this->ajouterNumNomErreursTest($nom['num_nom']); } } } } return $noms_erreur; } //+--------------------------------------------------------------------------------------------------------------+// // MÉTHODES COMMUNES aux TESTS private function verifierPresence(&$valeur) { $codes = $this->manuel['codes_presence']; $ok = $this->verifierStatuts($valeur, $codes); return $ok; } private function verifierStatutOrigine(&$valeur) { $codes = $this->manuel['codes_statuts_origine']; $ok = $this->verifierStatuts($valeur, $codes); return $ok; } private function verifierStatutIntroduction(&$valeur) { $codes = $this->manuel['codes_statuts_introduction']; $ok = $this->verifierStatuts($valeur, $codes); return $ok; } private function verifierStatutCulture(&$valeur) { $codes = $this->manuel['codes_statuts_culture']; $ok = $this->verifierStatuts($valeur, $codes); return $ok; } private function verifierStatuts(&$valeur, &$codes) { $ok = true; if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) { $ok = false; } return $ok; } private function verifierBooleen(&$valeur) { $ok = true; if (!preg_match('/^1$/', $valeur)) { $ok = false; } return $ok; } private function verifierNombre(&$valeur) { $ok = true; if (!preg_match('/^[0-9]+$/', $valeur)) { $ok = false; } return $ok; } private function verifierNombreSuite(&$valeur) { $ok = true; if (!preg_match('/^(?:[0-9]+, ?)*[0-9]+$/', $valeur)) { $ok = false; } return $ok; } private function verifierTypeEpithete(&$type) { $ok = false; $rejetes = $this->manuel['type_epithete_rejetes']; if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') { $ok = false; } else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) { $ok = true; } return $ok; } private function verifierBiblioOrigine(&$intitule) { $ok = true; if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) { $ok = false;// Contient des espaces en trop } else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) { $ok = false; } else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) { $ok = false;// Contient une mauvaise suite de caractères } return $ok; } private function verifierAnnee(&$annee) { $ok = true; if (!preg_match('/^[0-9]{4}$/', $annee)) { $ok = false; } else if ($annee < ANNEE_MINIMUM) { $ok = false; } else if ($annee > ANNEE_EN_COURS) { $ok = false; } return $ok; } private function verifierAuteur(&$intitule) { $ok = true; $acceptes = $this->manuel['auteur_acceptes']; if (!preg_match("/^(?:$acceptes)$/", $intitule)) { if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) { $ok = false;// Contient des espaces en trop } else { $mots_rejetes = $this->manuel['auteur_mots_rejetes']; $mots = explode(' ', $intitule); foreach ($mots as $position => $mot) { if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) { $ok = false;// Mot rejeté } else if (preg_match("/^(?:(?:\p{L}|[.'\(\),-])+|[&])$/u", $mot)) { continue;// Mot de l'intitulé auteur } else { $ok = false; } } } } return $ok; } private function verifierNomCommercial(&$epithete) { $ok = false; if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) { $ok = true; } return $ok; } private function verifierEpitheteCultivar(&$epithete) { $ok = true; $acceptes = $this->manuel['cultivar_acceptes']; if (!preg_match("/^(?:$acceptes)$/", $epithete)) { if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) { $ok = false;// Contient des espaces en trop } else { $mots_rejetes = $this->manuel['cultivar_mots_rejetes']; $mots_mineurs = $this->manuel['mots_mineurs']; $mots = explode(' ', $epithete); foreach ($mots as $position => $mot) { if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) { $ok = false;// Mot rejeté } else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) { continue;// Mot mineur en minuscule qui n'est pas en 1ère position } else { $mots_tiret = explode('-', $mot); foreach ($mots_tiret as $position_tiret => $mot_tiret) { if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) { continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position } else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) { continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule } else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) { continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation } else { $ok = false; } } } } } } return $ok; } private function verifierEpitheteGroupeCultivar(&$epithete) { $ok = true; $acceptes = $this->manuel['cultivar_gp_acceptes']; if (!preg_match("/^(?:$acceptes)$/", $epithete)) { if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) { $ok = false;// Contient des espaces en trop } else { $mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes']; $mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes']; $mots_mineurs = $this->manuel['mots_mineurs']; $mots = explode(' ', $epithete); foreach ($mots as $position => $mot) { if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) { continue;// Mot accepté } else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) { $ok = false;// Mot rejeté } else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) { continue;// Mot mineur en minuscule qui n'est pas en 1ère position } else { $mots_tiret = explode('-', $mot); foreach ($mots_tiret as $position_tiret => $mot_tiret) { if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) { continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot } else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) { continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule } else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) { continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation } else { $ok = false; } } } } } } return $ok; } private function verifierEpitheteSp(&$epithete) { $ok = false; if (preg_match('/^[a-zäëḧïöẗüẅẍÿ][-a-zäëḧïöẗüẅẍÿ]+$/', $epithete)) { $ok = true; } else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) { $ok = true; } return $ok; } private function verifierEpitheteGenre(&$epithete) { $ok = false; if (preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ](?:[-a-zäëḧïöẗüẅẍÿ]+|[a-zäëḧïöẗüẅẍÿ]+-[A-ZÄËḦÏÖÜẄẌŸ][a-zäëḧïöẗüẅẍÿ]+)$/', $epithete)) { $ok = true; } return $ok; } private function verifierEstAbbreviationInfraSp($mot) { $ok = false; if(preg_match($this->manuel['abbr_rangs_infra_specifique'], $mot)) { $ok = true; } return $ok; } private function formaterStyleNomGenre(&$genre) { $genre_fmt = ''; if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) { $genre_fmt = utf8_encode(strtolower(utf8_decode($match[1]))).' '.utf8_encode(ucfirst(strtolower(utf8_decode($match[2])))); } elseif (preg_match('/^(.+)\s+([x+])\s+(.+)$/i', $genre, $match)) { $genre_fmt = utf8_encode(ucfirst(strtolower(utf8_decode($match[1])))).' '. utf8_encode(strtolower(utf8_decode($match[2]))).' '.utf8_encode(ucfirst(strtolower(utf8_decode($match[3])))); } else { $genre_fmt = utf8_encode(ucfirst(strtolower(utf8_decode($genre)))); } return $genre_fmt; } private function formaterStyleEpitheteSpHybride(&$genre, &$epithete) { $nom_fmt = ''; $erreur = ''; if (trim($genre) == '') { if ($epithete != '') { $nom_fmt = $this->formaterFormuleHybridite($epithete); } else { $erreur = "Formule d'hybridité sans épithéte spécifique"; } } else { $nom_fmt = $this->formaterNomHybride($genre, $epithete); } return array($nom_fmt, $erreur); } private function formaterStyleEpitheteInfraSpHybride(&$nom_sci, &$infra, &$genre = null) { $nom_fmt = ''; $erreur = ''; if (trim($genre) == '') { if (trim($nom_sci) == '') { if (trim($infra) != '') { $nom_fmt = $this->formaterFormuleHybridite($infra); } else { $erreur = "Formule d'hybridité sans épithéte infraspécifique"; } } else { $erreur = "Formule d'hybridité avec épithéte spécifique"; } } else { $nom_fmt = $this->formaterNomHybride($nom_sci, $infra); } return array($nom_fmt, $erreur); } private function formaterNomHybride(&$nom_sci, &$epithete) { if (preg_match('/^(.+)\s+([x+])\s+(.+)$/i', $epithete, $match) != '') { $nom_fmt = $nom_sci.utf8_encode(ucfirst(strtolower(utf8_decode($match[1])))).' '. utf8_encode(strtolower(utf8_decode($match[2]))).' '. utf8_encode(ucfirst(strtolower(utf8_decode($match[3])))); } elseif (preg_match('/^([x+])\s+(.+)$/i', $epithete, $match) != '') { $nom_fmt = $nom_sci.utf8_encode(strtolower(utf8_decode($match[1]))).' '. utf8_encode(strtolower(utf8_decode($match[2]))); } else { $nom_fmt = $nom_sci.utf8_encode(strtolower(utf8_decode($epithete))); } return $nom_fmt; } private function formaterFormuleHybridite(&$epithete) { $liste_parents = explode(' x ', $epithete); if (count($liste_parents) == 2) { $nom_fmt = utf8_encode(ucfirst(strtolower(utf8_decode($liste_parents[0])))).' x '. utf8_encode(ucfirst(strtolower(utf8_decode($liste_parents[1])))); } else { for ($i=0; $i ', $nom_sci); return $nom_sci; } private function repererCaracteresInvalidesNomFrancais($nom_verna) { $nom_verna = str_replace(',', ',', $nom_verna); $nom_verna = str_replace(';', ';', $nom_verna); return $nom_verna; } private function mettreEnValeurAvertissement($chaine) { $chaine = ''.$chaine.''; return $chaine; } private function construireSuffixeNomPltCultivee(&$nom) { $suffixe = array(); $suffixe[] = $this->construireNomCultivarGroupe($nom); $suffixe[] = $this->construireNomCommercial($nom); $suffixe[] = $this->construireNomCultivar($nom); $suffixe = array_filter($suffixe); return implode(' ', $suffixe); } private function construireNomCultivarGroupe(&$nom) { $nom_groupe_cultivar = ''; if ($nom['cultivar_groupe'] != '') { if (preg_match('/ gx$/', $nom['cultivar_groupe'])) { $nom_groupe_cultivar = '('.$nom['cultivar_groupe'].')'; } else { $nom_groupe_cultivar = '('.$nom['cultivar_groupe'].' Gp)'; } } return $nom_groupe_cultivar; } private function construireNomCommercial(&$nom) { $nom_commercial = ''; if ($nom['nom_commercial'] != '') { $nom_commercial = strtoupper($nom['nom_commercial']); } return $nom_commercial; } private function construireNomCultivar(&$nom) { $nom_cultivar = ''; if ($nom['cultivar'] != '') { $nom_cultivar = "'".$nom['cultivar']."'"; } return $nom_cultivar; } private function classerNomsParNomComplet() { $noms_classes = array(); foreach ($this->noms as &$nom) { if (!isset($noms_classes[$nom['nom_sci']])) { $noms_classes[$nom['nom_sci']] = 1; } else { $noms_classes[$nom['nom_sci']]++; } } return $noms_classes; } } ?>