Subversion Repositories Applications.referentiel

Rev

Rev 174 | Rev 176 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 jpm 1
<?php
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/**
5
* Tests de référentiels de nomenclature et taxonomie
6
*
7
* Description : classe permettant de tester les référentiels selon le manuel technique
8
* Utilisation : php script.php tests -p bdnff -a tout
9
*
10
//Auteur original :
11
* @author       Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
* @copyright	Tela-Botanica 1999-2010
13
* @link			http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel
14
* @licence		GPL v3 & CeCILL v2
15
* @version		$Id$
16
*/
17
// +-------------------------------------------------------------------------------------------------------------------+
38 jpm 18
// TODO : supprimer l'utilisation du paramêtres 'p' et chercher les infos depuis la bdd
20 jpm 19
class Tests extends ScriptCommande {
20
 
42 jpm 21
	const SCRIPT_NOM = 'tests';
22
 
20 jpm 23
	private $projet = null;
30 jpm 24
	private $traitement = null;
20 jpm 25
 
26
	private $manuel = null;
171 jpm 27
	private $tests = null;
167 jpm 28
	private $colonnes = null;
29
	private $analyses = null;
64 jpm 30
	private $noms = null;
20 jpm 31
 
30 jpm 32
	private $resultatDao = null;
33
	private $traitementDao = null;
34
	private $tableStructureDao = null;
35
	private $referentielDao = null;
36
 
20 jpm 37
	public function executer() {
150 jpm 38
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.'referentiel_v4.1.ini');
171 jpm 39
		$this->tests = parse_ini_file($this->getModuleChemin().DS.'configurations'.DS.'tests.ini', true);
20 jpm 40
 
30 jpm 41
		$this->resultatDao = new ResultatDao();
42
		$this->traitementDao = new TraitementDao();
97 jpm 43
		Debug::printr('Dans le script test');
30 jpm 44
		// Récupération du dernier traitement demandé
142 delphine 45
		$this->traitement = $this->traitementDao->getDernierTraitement('tout', self::SCRIPT_NOM);
42 jpm 46
		if (isset($this->traitement)) {
142 delphine 47
			$this->projet = $this->traitement['referentiel_code']; // Récupération du nom de projet
38 jpm 48
			Debug::printr($this->traitement);
49
			// Écriture de la date de début du traitement
50
			Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement']));
51
 
52
			// Nettoyage des traitements obsolètes
42 jpm 53
			$traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->projet, self::SCRIPT_NOM);
54
			if (isset($traitements_obsoletes)) {
55
				Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes));
56
			}
38 jpm 57
 
165 delphine 58
			$this->tableStructureDao = new TableStructureDao();
59
			$this->referentielDao = new ReferentielDao();
60
 
38 jpm 61
			// Lancement du test demandé
62
			$cmd = $this->getParam('a');
63
	    	switch ($cmd) {
64
				case 'tout' :
65
					Debug::printr('Départ lancement test:');
165 delphine 66
					$this->recupererDonnees();
38 jpm 67
					$this->lancerTests();
68
					break;
165 delphine 69
				case 'test11' :
70
					$this->recupererDonnees();
71
					Debug::printr('Départ lancement test 11 :');
72
					$this->testerClassificationRang();
73
					break;
38 jpm 74
				default :
75
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
76
			}
77
			// Écriture de la date de fin du traitement
78
			Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement']));
97 jpm 79
		} else {
142 delphine 80
			Debug::printr("Aucun dernier traitement trouvé pour le script '".self::SCRIPT_NOM."' !");
20 jpm 81
		}
82
    }
165 delphine 83
 
84
    public function recupererDonnees() {
20 jpm 85
		// Récupération des données à tester
167 jpm 86
		$this->colonnes = $this->tableStructureDao->getColonnes($this->projet);
87
		$this->analyses = $this->tableStructureDao->getAnalyse($this->projet);
64 jpm 88
		$this->noms = $this->referentielDao->getTout($this->projet);
89
		Debug::printr('Nbre noms :'.count($this->noms));
165 delphine 90
    }
91
 
175 jpm 92
    public function lancerTestsAuto() {
93
		$resultats = array();
94
 
95
		// Lancement des tests unitaires
96
    	foreach (array_keys($this->tests) as $numero) {
97
			$info = $this->getInfosTest($numero);
98
 
99
    		if ($numero < 5) {
100
    			// Tests spéciaux vérifiant la structure de la table
101
    			$resultats[] = $this->lancerTestUnitaire($info);
102
    		} else if ($numero >= 5 && $this->verifierResultats($resultats)) {
103
				// Si la structure est bonne nous lançons les autres tests
104
 
105
    		}
106
		}
107
    }
108
 
109
    public function lancerTestUnitaire($info) {
110
		$methodeDeTest = $info['methode'];
111
    	$erreurs = $this->$methodeDeTest;
112
 
113
    	// Analyse des résultats
114
    	if (isset($erreurs['special'])) {
115
    		$info = $erreurs;
116
    	} else {
117
			if (count($erreurs) > 0) {
118
				$info['message']['entete'] = explode(',', $info['entete']);
119
				$info['message']['lignes'] = $erreurs;
120
			} else {
121
				$info['resultat'] = true;
122
			}
123
    	}
124
 
125
		$this->traiterResultatTest($info);
126
 
127
		if ($info['numero'] < 5) {
128
			return ($info['resultat'] ? '1' : '0');
129
		}
130
    }
131
 
165 delphine 132
    public function lancerTests() {
20 jpm 133
		// Lancement des tests unitaires
64 jpm 134
		$resultats = array();
175 jpm 135
		$resultats[] = $this->testerNombreDeChamps();
136
		$resultats[] = $this->testerNomDesChamps();
137
		$resultats[] = $this->testerTypeDesChamps();
138
		$resultats[] = $this->testerNumNomClePrimaire();
20 jpm 139
 
64 jpm 140
		// Si la structure est bonne nous lançons les autres tests
141
		Debug::printr($resultats);
142
		if ($this->verifierResultats($resultats)) {
175 jpm 143
			$this->testerTailleDesChamps();
64 jpm 144
 
145
			$this->testerNumNomSuperieurAZero();
146
 
147
			$this->testerNumNomRetenuSuperieurAZero();
148
			$this->testerNumTaxSupEgalZeroUnique();
149
			$this->testerTaxSupPourTaxon();
150
			$this->testerExitenceTaxonSuperieur();
165 delphine 151
			$this->testerClassificationRang();
64 jpm 152
			$this->testerClassification();
153
 
154
			$this->testerRang();
155
 
156
			$this->testerNomCompletSupraGenerique();
157
			$this->testerNomCompletGenre();
158
			$this->testerNomCompletInfraGenre();
159
			$this->testerNomCompletEspece();
160
			$this->testerNomCompletInfraSpecifique();
161
 
162
			$this->testerNomSupraGeneriqueEspaces();
163
			$this->testerNomSupraGeneriqueSyntaxe();
164
			$this->testerNomSupraGeneriqueRang();
165
 
166
			$this->testerGenreEspaces();
167
			$this->testerGenreSyntaxe();
168
			$this->testerGenreRang();
169
 
170
			$this->testerEpitheteInfraGeneriqueEspaces();
171
			$this->testerEpitheteInfraGeneriqueSyntaxe();
172
			$this->testerEpitheteInfraGeneriqueRang();
173
 
174
			$this->testerEpitheteSpEspaces();
175
			$this->testerEpitheteSpSyntaxe();
176
			$this->testerEpitheteSpRang();
177
 
178
			$this->testerTypeEpitheteEspaces();
179
			$this->testerTypeEpitheteSyntaxe();
180
			$this->testerTypeEpitheteHybridite();
181
 
182
			$this->testerEpitheteInfraSpEspaces();
183
			$this->testerEpitheteInfraSpSyntaxe();
184
			$this->testerEpitheteInfraSpRang();
185
 
186
			$this->testerGroupeCultivarSyntaxe();
187
			$this->testerGroupeCultivarRang();
188
 
189
			$this->testerCultivarSyntaxe();
190
			$this->testerCultivarRang();
191
 
192
			$this->testerNomCommercialSyntaxe();
193
			$this->testerNomCommercialPresenceCultivar();
194
 
195
			$this->testerAuteurSyntaxe();
196
 
197
			$this->testerAnneeSyntaxe();
198
 
199
			$this->testerBiblioOrigineSyntaxe();
200
 
201
			$this->testerHomonymieSyntaxe();
202
			$this->testerHomonymieExistence();
203
 
204
			$this->testerBasionymeSyntaxe();
205
			$this->testerBasionymeExistence();
206
 
207
			$this->testerSynonymeProparteSyntaxe();
208
			$this->testerSynonymeProparteExistence();
209
 
210
			$this->testerSynonymeDouteuxSyntaxe();
158 delphine 211
			$this->testerSynonymeDouteuxNumNomRetenu();
64 jpm 212
 
213
			$this->testerSynonymeMalAppliqueSyntaxe();
214
 
215
			$this->testerSynonymeOrthographiqueSyntaxe();
216
			$this->testerSynonymeOrthographiqueExistence();
217
 
218
			$this->testerHybrideParent01Syntaxe();
219
			$this->testerHybrideParent01Existence();
220
			$this->testerHybrideParent02Syntaxe();
221
			$this->testerHybrideParent02Existence();
222
 
223
			$this->testerPresenceSyntaxe();
224
			$this->testerStatutOrigineSyntaxe();
225
			$this->testerStatutIntroductionSyntaxe();
226
			$this->testerStatutCultureSyntaxe();
146 delphine 227
			$this->testerExclureTaxRefSyntaxe();
64 jpm 228
		}
20 jpm 229
	}
175 jpm 230
 
64 jpm 231
	private function verifierResultats($resultats) {
232
		$ok = true;
233
		foreach ($resultats as $resultat) {
234
			if ($resultat == '0') {
235
				$ok = false;
236
				break;
237
			}
238
		}
239
		return $ok;
240
	}
20 jpm 241
 
242
	//+--------------------------------------------------------------------------------------------------------------+//
30 jpm 243
	// Enregistrement des résultats
244
	private function traiterResultatTest($info) {
64 jpm 245
		Debug::printr($info['nom']);
30 jpm 246
		if (isset($info['message'])) {
247
			if (is_array($info['message'])) {
31 jpm 248
				$info['message'] = $this->getVue('tests/squelettes/message_table', $info);
249
			} else {
250
				$info['message'] = $this->getVue('tests/squelettes/message_p', $info);
30 jpm 251
			}
252
		}
253
		$this->resultatDao->ajouter($this->traitement['id_traitement'], $info);
64 jpm 254
		$info = null;
30 jpm 255
	}
256
 
257
	//+--------------------------------------------------------------------------------------------------------------+//
20 jpm 258
	// TESTS
259
 
171 jpm 260
	/**
261
	 * Test #01
262
	 */
175 jpm 263
	private function testerNombreDeChamps() {
171 jpm 264
		$info = $this->getInfosTest(1);
175 jpm 265
		$info['special'] = true;
20 jpm 266
 
175 jpm 267
		$nbre_colonnes = count($this->colonnes);
171 jpm 268
		$info['message'] = $nbre_colonnes;
269
		if ($nbre_colonnes >= 35) {
270
			$info['resultat'] = true;
271
		}
175 jpm 272
 
273
		return $info;
171 jpm 274
	}
275
 
276
	/**
277
	 * Test #02
278
	 */
175 jpm 279
	private function testerNomDesChamps() {
171 jpm 280
		$info = $this->getInfosTest(2);
175 jpm 281
		$info['special'] = true;
171 jpm 282
 
283
		$champs_attendus = explode(',', $this->manuel['champs']);
284
		$champs_presents = array();
175 jpm 285
		foreach ($this->colonnes as $colonne) {
171 jpm 286
			$champs_presents[$colonne['Field']] = $colonne;
287
		}
288
 
289
		$ok = true;
290
		$champs_manquant = array();
291
		foreach ($champs_attendus as $champ_attendu) {
292
			if (!isset($champs_presents[$champ_attendu])) {
293
				$champs_manquant[] = $champ_attendu;
294
				$ok = false;
295
			}
296
		}
175 jpm 297
 
171 jpm 298
		$info['resultat'] = $ok;
299
		if (!$ok) {
300
			$info['message'] = sprintf($info['message'], implode(', ', $champs_manquant));
301
		}
302
 
175 jpm 303
		return $info;
171 jpm 304
	}
305
 
306
	/**
307
	 * Test #03
308
	 */
175 jpm 309
	private function testerTypeDesChamps() {
171 jpm 310
		$champs_attendus = explode(',', $this->manuel['champs_type']);
311
		$champs_presents = array();
175 jpm 312
		foreach ($this->colonnes as $colonne) {
171 jpm 313
			$champs_presents[$colonne['Field']] = $colonne['Type'];
314
		}
315
 
316
		// Recercherche des erreurs
317
		$champs_erreur = array();
318
		foreach ($champs_attendus as $champ_attendu) {
319
			list($champ_attendu_nom, $champ_attendu_type_taille) = explode('=', trim($champ_attendu));
320
			list($champ_attendu_type, $champ_attendu_taille) = explode('|', trim($champ_attendu_type_taille));
321
 
322
			if (isset($champs_presents[$champ_attendu_nom])) {
323
				$champs_present_type = $champs_presents[$champ_attendu_nom];
324
 
325
				if (($champ_attendu_type == 'VARCHAR' && strstr($champs_present_type, 'varchar') === false)
326
					|| ($champ_attendu_type == 'TEXT' && strstr($champs_present_type, 'text') === false)
327
					|| ($champ_attendu_type == 'INT' && strstr($champs_present_type, 'int') === false)
328
					|| ($champ_attendu_type == 'BOOL' && preg_match('/(?:bool|boolean|tinyint\(1\))/i', $champs_present_type) === false)) {
175 jpm 329
					$champs_erreur[] = array($champ_attendu, $champ_attendu_type, $champs_present_type);
171 jpm 330
				}
331
			}
332
		}
175 jpm 333
		return $champs_erreur;
171 jpm 334
	}
335
 
336
	/**
337
	 * Test #04
338
	 */
175 jpm 339
	private function testerNumNomClePrimaire() {
171 jpm 340
		$info = $this->getInfosTest(4);
175 jpm 341
		$info['special'] = true;
171 jpm 342
 
175 jpm 343
		foreach ($this->colonnes as $colonne) {
171 jpm 344
			if ($colonne['Field'] == 'num_nom' && $colonne['Key'] == 'PRI') {
345
				$info['resultat'] = true;
346
			}
347
		}
175 jpm 348
		return $info;
171 jpm 349
	}
350
 
351
 
352
	/**
353
	 * Test #05
354
	 */
175 jpm 355
	private function testerTailleDesChamps() {
171 jpm 356
		$tailles_champs_maxi = array();
175 jpm 357
		foreach ($this->colonnes as $colonne) {
171 jpm 358
			if (preg_match('/^varchar\(([0-9]+)\)$/', $colonne['Type'], $match)) {
359
				$tailles_champs_maxi[$colonne['Field']] = $match[1];
360
			}
361
		}
362
 
363
		$tailles_trouvees = array();
175 jpm 364
		foreach ($this->analyses as $analyse) {
171 jpm 365
			if (preg_match('/\.([^.]+)$/', $analyse['Field_name'], $match)) {
366
				$tailles_trouvees[$match[1]] = $analyse['Max_length'];
367
			}
368
		}
369
 
370
		$champs_erreur = array();
371
		$champs_attendus = explode(',', $this->manuel['champs']);
372
		foreach ($champs_attendus as $champ_attendu) {
373
			if (isset($tailles_champs_maxi[$champ_attendu]) && isset($tailles_trouvees[$champ_attendu])) {
374
				if ($tailles_champs_maxi[$champ_attendu] == $tailles_trouvees[$champ_attendu]) {
175 jpm 375
					$champs_erreur[] = array($champ_attendu, $tailles_champs_maxi[$champ_attendu], $tailles_trouvees[$champ_attendu]);
171 jpm 376
				}
377
			}
378
		}
175 jpm 379
		return $champs_erreur;
171 jpm 380
	}
381
 
382
	/**
383
	 * Test #06
384
	 */
385
	private function testerNumNomSuperieurAZero() {
20 jpm 386
		// Réalisation du test
387
		$noms_erreur = array();
64 jpm 388
		foreach ($this->noms as &$nom) {
171 jpm 389
			if ($nom['num_nom'] <= 0) {
175 jpm 390
				$noms_erreur[] = array($nom['num_nom']);
20 jpm 391
			}
392
		}
175 jpm 393
		return $noms_erreur;
20 jpm 394
	}
395
 
171 jpm 396
	/**
397
	 * Test #07
398
	 */
399
	private function testerNumNomRetenuSuperieurAZero() {
400
		$info = $this->getInfosTest(7);
20 jpm 401
 
402
		// Réalisation du test
403
		$noms_erreur = array();
64 jpm 404
		foreach ($this->noms as &$nom) {
171 jpm 405
			if ($nom['num_nom_retenu'] != '' && $nom['num_nom_retenu'] <= 0) {
175 jpm 406
				$noms_erreur[] = array($nom['num_nom'], $nom['num_nom_retenu']);
20 jpm 407
			}
408
		}
409
 
410
		// Analyse des résultats
411
		if (count($noms_erreur) > 0) {
175 jpm 412
			$info['message']['entete'] = array('num_nom', 'num_nom_retenu');
413
			$info['message']['lignes'] = $noms_erreur;
20 jpm 414
		} else {
415
			$info['resultat'] = true;
416
		}
417
 
30 jpm 418
		$this->traiterResultatTest($info);
20 jpm 419
	}
420
 
171 jpm 421
	/**
422
	 * Test #08
423
	 */
424
	private function testerNumTaxSupEgalZeroUnique() {
425
		$info = $this->getInfosTest(8);
20 jpm 426
 
427
		// Réalisation du test
428
		$noms_erreur = array();
64 jpm 429
		foreach ($this->noms as &$nom) {
171 jpm 430
			if (preg_match('/^0$/', $nom['num_tax_sup'])) {
175 jpm 431
				$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup']);
20 jpm 432
			}
433
		}
434
 
435
		// Analyse des résultats
171 jpm 436
		if (count($noms_erreur) > 1) {
175 jpm 437
			$info['message']['entete'] = array('num_nom', 'num_tax_sup');
438
			$info['message']['lignes'] = $noms_erreur;
20 jpm 439
		} else {
440
			$info['resultat'] = true;
441
		}
442
 
30 jpm 443
		$this->traiterResultatTest($info);
20 jpm 444
	}
445
 
171 jpm 446
	/**
447
	 * Test #09
448
	 */
449
	private function testerTaxSupPourTaxon() {
450
		$info = $this->getInfosTest(9);
20 jpm 451
 
452
		// Réalisation du test
453
		$noms_erreur = array();
64 jpm 454
		foreach ($this->noms as &$nom) {
171 jpm 455
			if ($nom['num_nom_retenu'] != $nom['num_nom'] && $nom['num_tax_sup'] != '') {
175 jpm 456
				$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup']);
20 jpm 457
			}
458
		}
459
 
460
		// Analyse des résultats
461
		if (count($noms_erreur) > 0) {
175 jpm 462
			$info['message']['entete'] = array('num_nom', 'num_tax_sup');
463
			$info['message']['lignes'] = $noms_erreur;
20 jpm 464
		} else {
465
			$info['resultat'] = true;
466
		}
467
 
30 jpm 468
		$this->traiterResultatTest($info);
20 jpm 469
	}
470
 
171 jpm 471
	/**
472
	 * Test #10
473
	 */
474
	private function testerExitenceTaxonSuperieur() {
475
		$info = $this->getInfosTest(10);
20 jpm 476
 
477
		// Réalisation du test
478
		$noms_erreur = array();
64 jpm 479
		foreach ($this->noms as &$nom) {
171 jpm 480
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
481
				if ($nom['num_tax_sup'] != 0 && !isset($this->noms[$nom['num_tax_sup']])) {
175 jpm 482
					$noms_erreur[] = array($nom['num_nom'], $nom['num_tax_sup']);
171 jpm 483
				}
20 jpm 484
			}
485
		}
486
 
487
		// Analyse des résultats
488
		if (count($noms_erreur) > 0) {
175 jpm 489
			$info['message']['entete'] = array('num_nom', 'num_tax_sup');
490
			$info['message']['lignes'] = $noms_erreur;
20 jpm 491
		} else {
492
			$info['resultat'] = true;
493
		}
494
 
30 jpm 495
		$this->traiterResultatTest($info);
20 jpm 496
	}
497
 
171 jpm 498
	/**
499
	 * Test #11
500
	 */
501
	private function testerClassificationRang() {
502
		$info = $this->getInfosTest(11);
20 jpm 503
 
504
		// Réalisation du test
505
		$noms_erreur = array();
64 jpm 506
		foreach ($this->noms as &$nom) {
171 jpm 507
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
508
				if (isset($this->noms[$nom['num_tax_sup']])) {
509
					$nom_sup = $this->noms[$nom['num_tax_sup']];
510
					if ($nom_sup['rang'] >= $nom['rang']) {
511
						// Prise en compte de l'exception des clades
512
						if (! ($nom_sup['rang'] == 70 && $nom['rang'] == 70)) {
175 jpm 513
							$noms_erreur[] = array($nom['num_nom'], $nom['rang'], $nom_sup['num_nom'], $nom_sup['rang']);
171 jpm 514
						}
515
					}
20 jpm 516
				}
517
			}
518
		}
519
 
520
		// Analyse des résultats
521
		if (count($noms_erreur) > 0) {
175 jpm 522
			$info['message']['entete'] = array('num_nom', 'rang', 'Taxon supérieur num_nom', 'Taxon supérieur rang');
523
			$info['message']['lignes'] = $noms_erreur;
20 jpm 524
		} else {
525
			$info['resultat'] = true;
526
		}
527
 
30 jpm 528
		$this->traiterResultatTest($info);
20 jpm 529
	}
530
 
171 jpm 531
	/**
532
	 * Test #12
533
	 */
534
	private function testerClassification() {
535
		$info = $this->getInfosTest(12);
20 jpm 536
 
537
		// Réalisation du test
538
		$noms_erreur = array();
171 jpm 539
		$this->noms_ok = array();
64 jpm 540
		foreach ($this->noms as &$nom) {
171 jpm 541
			if ($nom['num_nom_retenu'] == $nom['num_nom']) {
542
				if (isset($this->noms_ok[$nom['num_tax_sup']])) {
543
					$this->noms_ok[$nom['num_nom']] = true;
544
				} else {
545
					$this->detection_boucle_infini = array();
546
					$classif_ok = $this->remonterClassif($nom);
547
					unset($this->detection_boucle_infini);
548
 
175 jpm 549
					if ($classif_ok === true) {
550
						$this->noms_ok[$nom['num_nom']] = $classif_ok;
171 jpm 551
					} else {
175 jpm 552
						$noms_erreur[] = array($nom['num_nom'], $classif_ok);
171 jpm 553
					}
20 jpm 554
				}
555
			}
556
		}
171 jpm 557
		unset($this->noms_ok);
20 jpm 558
 
559
		// Analyse des résultats
560
		if (count($noms_erreur) > 0) {
175 jpm 561
			$info['message']['entete'] = array('num_nom', 'Message du problème');
562
			$info['message']['lignes'] = $noms_erreur;
20 jpm 563
		} else {
564
			$info['resultat'] = true;
565
		}
566
 
30 jpm 567
		$this->traiterResultatTest($info);
20 jpm 568
	}
569
 
171 jpm 570
	private function remonterClassif(&$nom) {
571
		$this->detection_boucle_infini[$nom['num_nom']] = true;
572
		if (preg_match('/^[0-9]*$/', $nom['num_tax_sup'])) {
573
			if (isset($this->noms_ok[$nom['num_tax_sup']])) {
574
				$this->noms_ok[$nom['num_nom']] = true;
575
				return true;
576
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] == '0') {
577
				$this->noms_ok[$nom['num_nom']] = true;
578
				return true;
579
			} else if (!isset($this->noms[$nom['num_tax_sup']]) && $nom['num_tax_sup'] != '0') {
175 jpm 580
				return 'Hiérarchie avec le taxon #'.$nom['num_nom'].' ayant un taxon superieur #'.$nom['num_tax_sup'].' inexistant';
171 jpm 581
			} else if (isset($this->detection_boucle_infini[$nom['num_tax_sup']])) {
175 jpm 582
				return 'Boucle infinie pour le taxon #'.$nom['num_tax_sup'];
171 jpm 583
			} else {
584
				$retour = $this->remonterClassif($this->noms[$nom['num_tax_sup']]);
585
				if ($retour === true) {
586
					$this->noms_ok[$nom['num_tax_sup']] = true;
587
				}
588
				return $retour;
589
			}
590
		} else {
175 jpm 591
			return 'Valeur num_tax_sup incorrecte : '.$nom['num_tax_sup'];
171 jpm 592
		}
593
	}
594
 
595
	/**
596
	 * Test #13
597
	 */
598
	private function testerRang() {
599
		$info = $this->getInfosTest(13);
20 jpm 600
 
171 jpm 601
		$rangs = array_flip(explode(',', $this->manuel['rangs']));
602
 
20 jpm 603
		// Réalisation du test
604
		$noms_erreur = array();
64 jpm 605
		foreach ($this->noms as &$nom) {
171 jpm 606
			if (!isset($rangs[$nom['rang']])) {
175 jpm 607
				$noms_erreur[] = array($nom['num_nom'], $nom['rang']);
20 jpm 608
			}
609
		}
610
 
611
		// Analyse des résultats
612
		if (count($noms_erreur) > 0) {
175 jpm 613
			$info['message']['entete'] = array('num_nom', 'Rang');
614
			$info['message']['lignes'] = $noms_erreur;
20 jpm 615
		} else {
616
			$info['resultat'] = true;
617
		}
618
 
30 jpm 619
		$this->traiterResultatTest($info);
20 jpm 620
	}
621
 
171 jpm 622
	/**
623
	 * Test #14
624
	 */
625
	private function testerNomCompletSupraGenerique() {
626
		$info = $this->getInfosTest(14);
627
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
20 jpm 628
 
629
		// Réalisation du test
630
		$noms_erreur = array();
64 jpm 631
		foreach ($this->noms as &$nom) {
171 jpm 632
			if ($nom['rang'] < $this->manuel['rang_genre']) {
633
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
634
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['nom_supra_generique']);
635
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
636
				if ($nom['nom_sci'] != $nom_sci_ideal) {
637
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
638
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 639
				}
640
			}
641
		}
642
 
643
		// Analyse des résultats
644
		if (count($noms_erreur) > 0) {
171 jpm 645
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 646
			$info['message']['lignes'] = $noms_erreur;
647
		} else {
648
			$info['resultat'] = true;
649
		}
650
 
30 jpm 651
		$this->traiterResultatTest($info);
20 jpm 652
	}
653
 
171 jpm 654
	/**
655
	 * Test #15
656
	 */
657
	private function testerNomCompletGenre() {
658
		$info = $this->getInfosTest(15);
659
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
20 jpm 660
 
661
		// Réalisation du test
662
		$noms_erreur = array();
171 jpm 663
		foreach ($this->noms as &$nom) {
664
			if ($nom['rang'] == $this->manuel['rang_genre']) {
665
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
666
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
667
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
668
				if ($nom['nom_sci'] != $nom_sci_ideal) {
669
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
670
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 671
				}
672
			}
673
		}
674
 
675
		// Analyse des résultats
676
		if (count($noms_erreur) > 0) {
171 jpm 677
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 678
			$info['message']['lignes'] = $noms_erreur;
679
		} else {
680
			$info['resultat'] = true;
681
		}
682
 
30 jpm 683
		$this->traiterResultatTest($info);
20 jpm 684
	}
685
 
171 jpm 686
	/**
687
	 * Test #16
688
	 */
689
	private function testerNomCompletInfraGenre() {
690
		$info = $this->getInfosTest(16);
691
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
20 jpm 692
 
693
		// Réalisation du test
694
		$noms_erreur = array();
64 jpm 695
		foreach ($this->noms as &$nom) {
171 jpm 696
			if ($nom['rang'] > $this->manuel['rang_genre'] && $nom['rang'] < $this->manuel['rang_sp']) {
697
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
698
				$nom_sci_ideal = '';
699
				if ($nom['type_epithete'] == 'agg.') {
700
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
701
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
702
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
703
				} else {
704
					$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
705
					$nom_sci_ideal .= ' '.$nom['type_epithete'];
706
					$nom_sci_ideal .= ' '.$this->formaterStyleNomGenre($nom['epithete_infra_generique']);
20 jpm 707
				}
171 jpm 708
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
709
				if ($nom['nom_sci'] != $nom_sci_ideal) {
710
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
711
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
712
				}
20 jpm 713
			}
714
		}
715
 
716
		// Analyse des résultats
717
		if (count($noms_erreur) > 0) {
171 jpm 718
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 719
			$info['message']['lignes'] = $noms_erreur;
720
		} else {
721
			$info['resultat'] = true;
722
		}
64 jpm 723
		$noms_erreur = null;
20 jpm 724
 
30 jpm 725
		$this->traiterResultatTest($info);
20 jpm 726
	}
727
 
171 jpm 728
	/**
729
	 * Test #17
730
	 */
731
	private function testerNomCompletEspece() {
732
		$info = $this->getInfosTest(17);
733
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
20 jpm 734
 
735
		// Réalisation du test
736
		$noms_erreur = array();
64 jpm 737
		foreach ($this->noms as &$nom) {
171 jpm 738
			if ($nom['rang'] == $this->manuel['rang_sp']) {
739
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
740
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
741
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
742
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
743
				if ($nom['nom_sci'] != $nom_sci_ideal) {
744
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
745
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
20 jpm 746
				}
747
			}
748
		}
749
 
750
		// Analyse des résultats
751
		if (count($noms_erreur) > 0) {
171 jpm 752
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
20 jpm 753
			$info['message']['lignes'] = $noms_erreur;
754
		} else {
755
			$info['resultat'] = true;
756
		}
64 jpm 757
		$noms_erreur = null;
20 jpm 758
 
30 jpm 759
		$this->traiterResultatTest($info);
20 jpm 760
	}
761
 
171 jpm 762
	/**
763
	 * Test #18
764
	 */
765
	private function testerNomCompletInfraSpecifique() {
766
		$info = $this->getInfosTest(18);
767
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
158 delphine 768
 
769
		// Réalisation du test
770
		$noms_erreur = array();
771
		foreach ($this->noms as &$nom) {
171 jpm 772
			if ($nom['rang'] > $this->manuel['rang_sp']) {
773
				$suffixe_plte_cultivee = $this->construireSuffixeNomPltCultivee($nom);
774
				$nom_sci_ideal = $this->formaterStyleNomGenre($nom['genre']);
775
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_sp']);
776
				$nom_sci_ideal .= ' '.strtolower($nom['type_epithete']);
777
				$nom_sci_ideal .= ' '.strtolower($nom['epithete_infra_sp']);
778
				$nom_sci_ideal .= ($suffixe_plte_cultivee != '' ? ' '.$suffixe_plte_cultivee : '');
779
				if ($nom['nom_sci'] != $nom_sci_ideal) {
780
					$nom_sci_traite = $this->repererEspace($nom['nom_sci']);
781
					$noms_erreur[] = array($nom['num_nom'], $nom_sci_traite, $nom_sci_ideal);
782
				}
158 delphine 783
			}
784
		}
785
 
786
		// Analyse des résultats
787
		if (count($noms_erreur) > 0) {
171 jpm 788
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'nom_sci corrigé');
158 delphine 789
			$info['message']['lignes'] = $noms_erreur;
790
		} else {
791
			$info['resultat'] = true;
792
		}
793
		$noms_erreur = null;
171 jpm 794
 
158 delphine 795
		$this->traiterResultatTest($info);
796
	}
797
 
171 jpm 798
	/**
799
	 * Test #19
800
	 */
801
	private function testerNomSupraGeneriqueEspaces() {
802
		$info = $this->getInfosTest(19);
20 jpm 803
 
804
		// Réalisation du test
805
		$noms_erreur = array();
64 jpm 806
		foreach ($this->noms as &$nom) {
171 jpm 807
			if ($nom['nom_supra_generique'] != '') {
808
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s+$)/', $nom['nom_supra_generique'])) {
809
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
810
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
20 jpm 811
				}
812
			}
813
		}
814
 
815
		// Analyse des résultats
816
		if (count($noms_erreur) > 0) {
171 jpm 817
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
20 jpm 818
			$info['message']['lignes'] = $noms_erreur;
819
		} else {
820
			$info['resultat'] = true;
821
		}
64 jpm 822
		$noms_erreur = null;
20 jpm 823
 
30 jpm 824
		$this->traiterResultatTest($info);
20 jpm 825
	}
826
 
171 jpm 827
	/**
828
	 * Test #20
829
	 */
830
	private function testerNomSupraGeneriqueSyntaxe() {
831
		$info = $this->getInfosTest(20);
20 jpm 832
 
833
		// Réalisation du test
834
		$noms_erreur = array();
64 jpm 835
		foreach ($this->noms as &$nom) {
171 jpm 836
			if ($nom['nom_supra_generique'] != '') {
837
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+$/', $nom['nom_supra_generique'])) {
838
					$nom_supra_generique_traite = $this->repererEspace($nom['nom_supra_generique']);
839
					$noms_erreur[] = array($nom['num_nom'], $nom_supra_generique_traite);
20 jpm 840
				}
841
			}
842
		}
843
 
844
		// Analyse des résultats
845
		if (count($noms_erreur) > 0) {
171 jpm 846
			$info['message']['entete'] = array('num_nom', 'nom_supra_generique erroné');
20 jpm 847
			$info['message']['lignes'] = $noms_erreur;
848
		} else {
849
			$info['resultat'] = true;
850
		}
64 jpm 851
		$noms_erreur = null;
20 jpm 852
 
30 jpm 853
		$this->traiterResultatTest($info);
20 jpm 854
	}
855
 
171 jpm 856
	/**
857
	 * Test #21
858
	 */
859
	private function testerNomSupraGeneriqueRang() {
860
		$info = $this->getInfosTest(21);
861
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
862
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
20 jpm 863
 
864
		// Réalisation du test
865
		$noms_erreur = array();
64 jpm 866
		foreach ($this->noms as &$nom) {
171 jpm 867
			if ($nom['nom_supra_generique'] != '') {
868
				if ($nom['rang'] >= $this->manuel['rang_genre']) {
869
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 870
				}
871
			}
872
		}
873
 
874
		// Analyse des résultats
875
		if (count($noms_erreur) > 0) {
171 jpm 876
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 877
			$info['message']['lignes'] = $noms_erreur;
878
		} else {
879
			$info['resultat'] = true;
880
		}
64 jpm 881
		$noms_erreur = null;
20 jpm 882
 
30 jpm 883
		$this->traiterResultatTest($info);
20 jpm 884
	}
885
 
171 jpm 886
	/**
887
	 * Test #22
888
	 */
889
	private function testerGenreEspaces() {
890
		$info = $this->getInfosTest(22);
20 jpm 891
 
892
		// Réalisation du test
893
		$noms_erreur = array();
64 jpm 894
		foreach ($this->noms as &$nom) {
171 jpm 895
			if ($nom['genre'] != '') {
896
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['genre'])) {
897
					$nom_traite = $this->repererEspace($nom['genre']);
898
					$noms_erreur[] = array($nom['num_nom'], $nom_traite);
20 jpm 899
				}
900
			}
901
		}
902
 
903
		// Analyse des résultats
904
		if (count($noms_erreur) > 0) {
171 jpm 905
			$info['message']['entete'] = array('num_nom', 'genre erroné');
20 jpm 906
			$info['message']['lignes'] = $noms_erreur;
907
		} else {
908
			$info['resultat'] = true;
909
		}
64 jpm 910
		$noms_erreur = null;
20 jpm 911
 
30 jpm 912
		$this->traiterResultatTest($info);
20 jpm 913
	}
914
 
171 jpm 915
	/**
916
	 * Test #23
917
	 */
918
	private function testerGenreSyntaxe() {
919
		$info = $this->getInfosTest(23);
20 jpm 920
 
921
		// Réalisation du test
922
		$noms_erreur = array();
64 jpm 923
		foreach ($this->noms as &$nom) {
171 jpm 924
			if ($nom['genre'] != '') {
925
				$mots = explode(' ', $nom['genre']);
926
				foreach ($mots as $mot) {
927
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteGenre($mot))) {
928
						$nom_traite = $this->repererEspace($nom['genre']);
929
						$noms_erreur[] = array($nom['num_nom'], $nom_traite);
930
					}
20 jpm 931
				}
932
			}
933
		}
934
 
935
		// Analyse des résultats
936
		if (count($noms_erreur) > 0) {
171 jpm 937
			$info['message']['entete'] = array('num_nom', 'genre erroné');
20 jpm 938
			$info['message']['lignes'] = $noms_erreur;
939
		} else {
940
			$info['resultat'] = true;
941
		}
64 jpm 942
		$noms_erreur = null;
20 jpm 943
 
30 jpm 944
		$this->traiterResultatTest($info);
20 jpm 945
	}
946
 
171 jpm 947
	/**
948
	 * Test #24
949
	 */
950
	private function testerGenreRang() {
951
		$info = $this->getInfosTest(24);
952
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
953
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
20 jpm 954
 
955
		// Réalisation du test
956
		$noms_erreur = array();
64 jpm 957
		foreach ($this->noms as &$nom) {
171 jpm 958
			if ($nom['genre'] != '') {
959
				if ($nom['rang'] < $this->manuel['rang_genre']) {
960
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 961
				}
962
			}
963
		}
964
 
965
		// Analyse des résultats
966
		if (count($noms_erreur) > 0) {
171 jpm 967
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 968
			$info['message']['lignes'] = $noms_erreur;
969
		} else {
970
			$info['resultat'] = true;
971
		}
64 jpm 972
		$noms_erreur = null;
20 jpm 973
 
30 jpm 974
		$this->traiterResultatTest($info);
20 jpm 975
	}
976
 
171 jpm 977
	/**
978
	 * Test #25
979
	 */
980
	private function testerEpitheteInfraGeneriqueSyntaxe() {
981
		$info = $this->getInfosTest(25);
982
 
20 jpm 983
		// Réalisation du test
984
		$noms_erreur = array();
64 jpm 985
		foreach ($this->noms as &$nom) {
171 jpm 986
			if ($nom['epithete_infra_generique'] != '') {
987
				if (!preg_match('/^[A-ZÄËḦÏÖÜẄẌŸ][-a-zäëḧïöẗüẅẍÿ]+/', $nom['epithete_infra_generique'])) {
988
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
989
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
20 jpm 990
				}
991
			}
992
		}
993
 
994
		// Analyse des résultats
995
		if (count($noms_erreur) > 0) {
171 jpm 996
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
20 jpm 997
			$info['message']['lignes'] = $noms_erreur;
998
		} else {
999
			$info['resultat'] = true;
1000
		}
64 jpm 1001
		$noms_erreur = null;
20 jpm 1002
 
30 jpm 1003
		$this->traiterResultatTest($info);
20 jpm 1004
	}
1005
 
171 jpm 1006
	/**
1007
	 * Test #26
1008
	 */
1009
	private function testerEpitheteInfraGeneriqueRang() {
1010
		$info = $this->getInfosTest(26);
1011
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
1012
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre'], $this->manuel['rang_sp']);
20 jpm 1013
 
1014
		// Réalisation du test
1015
		$noms_erreur = array();
64 jpm 1016
		foreach ($this->noms as &$nom) {
171 jpm 1017
			if ($nom['epithete_infra_generique'] != '') {
1018
				if ($nom['rang'] <= $this->manuel['rang_genre'] || $nom['rang'] >= $this->manuel['rang_sp']) {
1019
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1020
				}
1021
			}
1022
		}
1023
 
1024
		// Analyse des résultats
1025
		if (count($noms_erreur) > 0) {
171 jpm 1026
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1027
			$info['message']['lignes'] = $noms_erreur;
1028
		} else {
1029
			$info['resultat'] = true;
1030
		}
64 jpm 1031
		$noms_erreur = null;
20 jpm 1032
 
30 jpm 1033
		$this->traiterResultatTest($info);
20 jpm 1034
	}
1035
 
171 jpm 1036
	/**
1037
	 * Test #27
1038
	 */
1039
	private function testerEpitheteInfraGeneriqueEspaces() {
1040
		$info = $this->getInfosTest(27);
20 jpm 1041
 
1042
		// Réalisation du test
1043
		$noms_erreur = array();
64 jpm 1044
		foreach ($this->noms as &$nom) {
171 jpm 1045
			if ($nom['epithete_infra_generique'] != '') {
1046
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_generique'])) {
1047
					$epithete_traite = $this->repererEspace($nom['epithete_infra_generique']);
1048
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
20 jpm 1049
				}
1050
			}
1051
		}
1052
 
1053
		// Analyse des résultats
1054
		if (count($noms_erreur) > 0) {
171 jpm 1055
			$info['message']['entete'] = array('num_nom', 'epithete_infra_generique erroné');
20 jpm 1056
			$info['message']['lignes'] = $noms_erreur;
1057
		} else {
1058
			$info['resultat'] = true;
1059
		}
64 jpm 1060
		$noms_erreur = null;
20 jpm 1061
 
30 jpm 1062
		$this->traiterResultatTest($info);
20 jpm 1063
	}
1064
 
171 jpm 1065
	/**
1066
	 * Test #28
1067
	 */
1068
	private function testerEpitheteSpEspaces() {
1069
		$info = $this->getInfosTest(28);
20 jpm 1070
 
1071
		// Réalisation du test
1072
		$noms_erreur = array();
64 jpm 1073
		foreach ($this->noms as &$nom) {
171 jpm 1074
			if ($nom['epithete_sp'] != '') {
1075
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_sp'])) {
1076
					$epithete_traite = $this->repererEspace($nom['epithete_sp']);
20 jpm 1077
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1078
				}
1079
			}
1080
		}
1081
 
1082
		// Analyse des résultats
1083
		if (count($noms_erreur) > 0) {
171 jpm 1084
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
20 jpm 1085
			$info['message']['lignes'] = $noms_erreur;
1086
		} else {
1087
			$info['resultat'] = true;
1088
		}
64 jpm 1089
		$noms_erreur = null;
20 jpm 1090
 
30 jpm 1091
		$this->traiterResultatTest($info);
20 jpm 1092
	}
1093
 
171 jpm 1094
	/**
1095
	 * Test #29
1096
	 */
1097
	private function testerEpitheteSpSyntaxe() {
1098
		$info = $this->getInfosTest(29);
20 jpm 1099
 
1100
		// Réalisation du test
1101
		$noms_erreur = array();
64 jpm 1102
		foreach ($this->noms as &$nom) {
171 jpm 1103
			if ($nom['epithete_sp'] != '') {
1104
				$mots = explode(' ', $nom['epithete_sp']);
1105
				foreach ($mots as $mot) {
1106
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierEpitheteSp($mot))) {
1107
						$epithete_traite = $this->repererEspace($nom['epithete_sp']);
1108
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1109
					}
1110
				}
20 jpm 1111
			}
1112
		}
1113
 
1114
		// Analyse des résultats
1115
		if (count($noms_erreur) > 0) {
171 jpm 1116
			$info['message']['entete'] = array('num_nom', 'epithete_sp erroné');
20 jpm 1117
			$info['message']['lignes'] = $noms_erreur;
1118
		} else {
1119
			$info['resultat'] = true;
1120
		}
64 jpm 1121
		$noms_erreur = null;
20 jpm 1122
 
30 jpm 1123
		$this->traiterResultatTest($info);
20 jpm 1124
	}
1125
 
171 jpm 1126
	/**
1127
	 * Test #30
1128
	 */
1129
	private function testerEpitheteSpRang() {
1130
		$info = $this->getInfosTest(30);
1131
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
1132
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
20 jpm 1133
 
1134
		// Réalisation du test
1135
		$noms_erreur = array();
64 jpm 1136
		foreach ($this->noms as &$nom) {
171 jpm 1137
			if ($nom['epithete_sp'] != '') {
1138
				if ($nom['rang'] < $this->manuel['rang_sp']) {
1139
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1140
				}
1141
			}
1142
		}
1143
 
1144
		// Analyse des résultats
1145
		if (count($noms_erreur) > 0) {
171 jpm 1146
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1147
			$info['message']['lignes'] = $noms_erreur;
1148
		} else {
1149
			$info['resultat'] = true;
1150
		}
64 jpm 1151
		$noms_erreur = null;
20 jpm 1152
 
30 jpm 1153
		$this->traiterResultatTest($info);
20 jpm 1154
	}
1155
 
171 jpm 1156
	/**
1157
	 * Test #31
1158
	 */
1159
	private function testerTypeEpitheteEspaces() {
1160
		$info = $this->getInfosTest(31);
20 jpm 1161
 
1162
		// Réalisation du test
1163
		$noms_erreur = array();
64 jpm 1164
		foreach ($this->noms as &$nom) {
171 jpm 1165
			if ($nom['type_epithete'] != '') {
1166
				if (preg_match('/\s+/', $nom['type_epithete'])) {
1167
					$valeur_traitee = $this->repererEspace($nom['epithete_sp']);
1168
					$noms_erreur[] = array($nom['num_nom'], $valeur_traitee);
20 jpm 1169
				}
1170
			}
1171
		}
1172
 
1173
		// Analyse des résultats
1174
		if (count($noms_erreur) > 0) {
171 jpm 1175
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
20 jpm 1176
			$info['message']['lignes'] = $noms_erreur;
1177
		} else {
1178
			$info['resultat'] = true;
1179
		}
1180
 
30 jpm 1181
		$this->traiterResultatTest($info);
20 jpm 1182
	}
1183
 
171 jpm 1184
	/**
1185
	 * Test #32
1186
	 */
1187
	private function testerTypeEpitheteSyntaxe() {
1188
		$info = $this->getInfosTest(32);
20 jpm 1189
 
1190
		// Réalisation du test
1191
		$noms_erreur = array();
64 jpm 1192
		foreach ($this->noms as &$nom) {
171 jpm 1193
			if ($nom['type_epithete'] != '') {
1194
				if (!$this->verifierTypeEpithete($nom['type_epithete'])) {
1195
					$noms_erreur[] = array($nom['num_nom'],  $nom['type_epithete']);
20 jpm 1196
				}
1197
			}
1198
		}
1199
 
1200
		// Analyse des résultats
1201
		if (count($noms_erreur) > 0) {
171 jpm 1202
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
20 jpm 1203
			$info['message']['lignes'] = $noms_erreur;
1204
		} else {
1205
			$info['resultat'] = true;
1206
		}
1207
 
30 jpm 1208
		$this->traiterResultatTest($info);
20 jpm 1209
	}
1210
 
171 jpm 1211
	/**
1212
	 * Test #33
1213
	 */
1214
	private function testerTypeEpitheteHybridite() {
1215
		$info = $this->getInfosTest(33);
20 jpm 1216
 
1217
		// Réalisation du test
1218
		$noms_erreur = array();
64 jpm 1219
		foreach ($this->noms as &$nom) {
171 jpm 1220
			if ($nom['type_epithete'] != '') {
1221
				if (preg_match('/^(?:n-|notho-)/', $nom['type_epithete'])) {
1222
					$noms_erreur[] = array($nom['num_nom'], $nom['type_epithete']);
20 jpm 1223
				}
1224
			}
1225
		}
1226
 
1227
		// Analyse des résultats
1228
		if (count($noms_erreur) > 0) {
171 jpm 1229
			$info['message']['entete'] = array('num_nom', 'type_epithete erroné');
20 jpm 1230
			$info['message']['lignes'] = $noms_erreur;
1231
		} else {
1232
			$info['resultat'] = true;
1233
		}
1234
 
30 jpm 1235
		$this->traiterResultatTest($info);
20 jpm 1236
	}
1237
 
171 jpm 1238
	/**
1239
	 * Test #34
1240
	 */
64 jpm 1241
	private function testerEpitheteInfraSpEspaces() {
171 jpm 1242
		$info = $this->getInfosTest(34);
20 jpm 1243
 
1244
		// Réalisation du test
1245
		$noms_erreur = array();
64 jpm 1246
		foreach ($this->noms as &$nom) {
20 jpm 1247
			if ($nom['epithete_infra_sp'] != '') {
1248
				if (preg_match('/(?:^\s+(?!:\s+)|(?!:\s+)\s{2,}(?!:\s+)|(?!:\s+)\s+$)/', $nom['epithete_infra_sp'])) {
1249
					$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1250
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1251
				}
1252
			}
1253
		}
1254
 
1255
		// Analyse des résultats
1256
		if (count($noms_erreur) > 0) {
1257
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1258
			$info['message']['lignes'] = $noms_erreur;
1259
		} else {
1260
			$info['resultat'] = true;
1261
		}
64 jpm 1262
		$noms_erreur = null;
20 jpm 1263
 
30 jpm 1264
		$this->traiterResultatTest($info);
20 jpm 1265
	}
1266
 
171 jpm 1267
	/**
1268
	 * Test #35
1269
	 */
64 jpm 1270
	private function testerEpitheteInfraSpSyntaxe() {
171 jpm 1271
		$info = $this->getInfosTest(35);
20 jpm 1272
 
1273
		// Réalisation du test
1274
		$noms_erreur = array();
64 jpm 1275
		foreach ($this->noms as &$nom) {
20 jpm 1276
			if ($nom['epithete_infra_sp'] != '') {
1277
				$mots = explode(' ', $nom['epithete_infra_sp']);
1278
				foreach ($mots as $mot) {
1279
					if (!(preg_match('/^[+x]$/', $mot) || $this->verifierTypeEpithete($mot)|| $this->verifierEpitheteSp($mot))) {
1280
						$epithete_traite = $this->repererEspace($nom['epithete_infra_sp']);
1281
						$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
1282
					}
1283
				}
1284
			}
1285
		}
1286
 
1287
		// Analyse des résultats
1288
		if (count($noms_erreur) > 0) {
1289
			$info['message']['entete'] = array('num_nom', 'epithete_infra_sp erroné');
1290
			$info['message']['lignes'] = $noms_erreur;
1291
		} else {
1292
			$info['resultat'] = true;
1293
		}
64 jpm 1294
		$noms_erreur = null;
20 jpm 1295
 
30 jpm 1296
		$this->traiterResultatTest($info);
20 jpm 1297
	}
1298
 
171 jpm 1299
	/**
1300
	 * Test #36
1301
	 */
64 jpm 1302
	private function testerEpitheteInfraSpRang() {
171 jpm 1303
		$info = $this->getInfosTest(36);
1304
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_sp']);
1305
		$info['description'] = sprintf($info['description'], $this->manuel['rang_sp']);
20 jpm 1306
 
1307
		// Réalisation du test
1308
		$noms_erreur = array();
64 jpm 1309
		foreach ($this->noms as &$nom) {
20 jpm 1310
			if ($nom['epithete_infra_sp'] != '') {
1311
				if ($nom['rang'] < $this->manuel['rang_sp']) {
149 jpm 1312
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1313
				}
1314
			}
1315
		}
1316
 
1317
		// Analyse des résultats
1318
		if (count($noms_erreur) > 0) {
149 jpm 1319
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1320
			$info['message']['lignes'] = $noms_erreur;
1321
		} else {
1322
			$info['resultat'] = true;
1323
		}
64 jpm 1324
		$noms_erreur = null;
20 jpm 1325
 
30 jpm 1326
		$this->traiterResultatTest($info);
20 jpm 1327
	}
1328
 
173 jpm 1329
	/**
1330
	 * Test #37
1331
	 */
1332
	private function testerGroupeCultivarSyntaxe() {
174 jpm 1333
		$info = $this->getInfosTest(37);
20 jpm 1334
 
1335
		// Réalisation du test
1336
		$noms_erreur = array();
64 jpm 1337
		foreach ($this->noms as &$nom) {
173 jpm 1338
			if ($nom['cultivar_groupe'] != '') {
1339
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1340
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1341
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
20 jpm 1342
				}
1343
			}
1344
		}
1345
 
1346
		// Analyse des résultats
1347
		if (count($noms_erreur) > 0) {
173 jpm 1348
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
20 jpm 1349
			$info['message']['lignes'] = $noms_erreur;
1350
		} else {
1351
			$info['resultat'] = true;
1352
		}
171 jpm 1353
		$noms_erreur = null;
20 jpm 1354
 
30 jpm 1355
		$this->traiterResultatTest($info);
20 jpm 1356
	}
1357
 
173 jpm 1358
	/**
1359
	 * Test #38
1360
	 */
1361
	private function testerGroupeCultivarRang() {
174 jpm 1362
		$info = $this->getInfosTest(38);
1363
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
1364
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
20 jpm 1365
 
1366
		// Réalisation du test
1367
		$noms_erreur = array();
64 jpm 1368
		foreach ($this->noms as &$nom) {
173 jpm 1369
			if ($nom['cultivar_groupe'] != '') {
1370
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1371
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1372
				}
1373
			}
1374
		}
1375
 
1376
		// Analyse des résultats
1377
		if (count($noms_erreur) > 0) {
173 jpm 1378
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1379
			$info['message']['lignes'] = $noms_erreur;
1380
		} else {
1381
			$info['resultat'] = true;
1382
		}
171 jpm 1383
		$noms_erreur = null;
20 jpm 1384
 
30 jpm 1385
		$this->traiterResultatTest($info);
20 jpm 1386
	}
1387
 
173 jpm 1388
	/**
1389
	 * Test #39
1390
	 */
1391
	private function testerCultivarSyntaxe() {
174 jpm 1392
		$info = $this->getInfosTest(39);
1393
 
20 jpm 1394
		// Réalisation du test
1395
		$noms_erreur = array();
64 jpm 1396
		foreach ($this->noms as &$nom) {
173 jpm 1397
			if ($nom['cultivar'] != '') {
1398
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
1399
					$epithete_traite = $this->repererEspace($nom['cultivar']);
1400
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
20 jpm 1401
				}
1402
			}
1403
		}
1404
 
1405
		// Analyse des résultats
1406
		if (count($noms_erreur) > 0) {
173 jpm 1407
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
20 jpm 1408
			$info['message']['lignes'] = $noms_erreur;
1409
		} else {
1410
			$info['resultat'] = true;
1411
		}
171 jpm 1412
		$noms_erreur = null;
20 jpm 1413
 
30 jpm 1414
		$this->traiterResultatTest($info);
20 jpm 1415
	}
1416
 
173 jpm 1417
	/**
1418
	 * Test #40
1419
	 */
1420
	private function testerCultivarRang() {
174 jpm 1421
		$info = $this->getInfosTest(40);
1422
		$info['nom'] = sprintf($info['nom'], $this->manuel['rang_genre']);
1423
		$info['description'] = sprintf($info['description'], $this->manuel['rang_genre']);
20 jpm 1424
 
1425
		// Réalisation du test
1426
		$noms_erreur = array();
64 jpm 1427
		foreach ($this->noms as &$nom) {
173 jpm 1428
			if ($nom['cultivar'] != '') {
1429
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1430
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
171 jpm 1431
				}
20 jpm 1432
			}
1433
		}
1434
 
1435
		// Analyse des résultats
1436
		if (count($noms_erreur) > 0) {
173 jpm 1437
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
171 jpm 1438
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1439
		} else {
1440
			$info['resultat'] = true;
1441
		}
171 jpm 1442
		$noms_erreur = null;
20 jpm 1443
 
30 jpm 1444
		$this->traiterResultatTest($info);
20 jpm 1445
	}
1446
 
173 jpm 1447
	/**
1448
	 * Test #41
1449
	 */
1450
	private function testerNomCommercialSyntaxe() {
174 jpm 1451
		$info = $this->getInfosTest(41);
20 jpm 1452
 
1453
		// Réalisation du test
1454
		$noms_erreur = array();
64 jpm 1455
		foreach ($this->noms as &$nom) {
173 jpm 1456
			if ($nom['nom_commercial'] != '') {
1457
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
1458
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
1459
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
171 jpm 1460
				}
20 jpm 1461
			}
1462
		}
1463
 
1464
		// Analyse des résultats
1465
		if (count($noms_erreur) > 0) {
173 jpm 1466
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
171 jpm 1467
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1468
		} else {
1469
			$info['resultat'] = true;
1470
		}
171 jpm 1471
		$noms_erreur = null;
20 jpm 1472
 
30 jpm 1473
		$this->traiterResultatTest($info);
20 jpm 1474
	}
1475
 
173 jpm 1476
	/**
1477
	 * Test #42
1478
	 */
1479
	private function testerNomCommercialPresenceCultivar() {
174 jpm 1480
		$info = $this->getInfosTest(42);
20 jpm 1481
 
1482
		// Réalisation du test
1483
		$noms_erreur = array();
64 jpm 1484
		foreach ($this->noms as &$nom) {
173 jpm 1485
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
1486
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
20 jpm 1487
			}
1488
		}
1489
 
1490
		// Analyse des résultats
171 jpm 1491
		if (count($noms_erreur) > 0) {
173 jpm 1492
			$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
171 jpm 1493
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1494
		} else {
1495
			$info['resultat'] = true;
1496
		}
171 jpm 1497
		$noms_erreur = null;
20 jpm 1498
 
30 jpm 1499
		$this->traiterResultatTest($info);
20 jpm 1500
	}
1501
 
173 jpm 1502
	/**
1503
	 * Test #43
1504
	 */
1505
	private function testerAuteurSyntaxe() {
174 jpm 1506
		$info = $this->getInfosTest(43);
20 jpm 1507
 
1508
		// Réalisation du test
1509
		$noms_erreur = array();
64 jpm 1510
		foreach ($this->noms as &$nom) {
173 jpm 1511
			if ($nom['auteur'] != '') {
1512
				if (!$this->verifierAuteur($nom['auteur'])) {
1513
					$intitule_traite = $this->repererEspace($nom['auteur']);
1514
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
171 jpm 1515
				}
20 jpm 1516
			}
1517
		}
1518
 
1519
		// Analyse des résultats
1520
		if (count($noms_erreur) > 0) {
173 jpm 1521
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
171 jpm 1522
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1523
		} else {
1524
			$info['resultat'] = true;
1525
		}
171 jpm 1526
		$noms_erreur = null;
20 jpm 1527
 
30 jpm 1528
		$this->traiterResultatTest($info);
20 jpm 1529
	}
1530
 
173 jpm 1531
	/**
1532
	 * Test #44
1533
	 */
1534
	private function testerAnneeSyntaxe() {
174 jpm 1535
		$info = $this->getInfosTest(44);
20 jpm 1536
 
1537
		// Réalisation du test
1538
		$noms_erreur = array();
64 jpm 1539
		foreach ($this->noms as &$nom) {
173 jpm 1540
			if ($nom['annee'] != '') {
1541
				if (!$this->verifierAnnee($nom['annee'])) {
1542
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
171 jpm 1543
				}
20 jpm 1544
			}
1545
		}
1546
 
1547
		// Analyse des résultats
1548
		if (count($noms_erreur) > 0) {
174 jpm 1549
			$info['message']['entete'] = array('num_nom', 'annee erronée');
171 jpm 1550
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1551
		} else {
1552
			$info['resultat'] = true;
1553
		}
171 jpm 1554
		$noms_erreur = null;
20 jpm 1555
 
30 jpm 1556
		$this->traiterResultatTest($info);
20 jpm 1557
	}
1558
 
173 jpm 1559
	/**
1560
	 * Test #45
1561
	 */
1562
	private function testerBiblioOrigineSyntaxe() {
174 jpm 1563
		$info = $this->getInfosTest(45);
20 jpm 1564
 
1565
		// Réalisation du test
1566
		$noms_erreur = array();
64 jpm 1567
		foreach ($this->noms as &$nom) {
173 jpm 1568
			if ($nom['biblio_origine'] != '') {
1569
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
1570
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
1571
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
20 jpm 1572
				}
1573
			}
1574
		}
1575
 
1576
		// Analyse des résultats
1577
		if (count($noms_erreur) > 0) {
173 jpm 1578
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
171 jpm 1579
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1580
		} else {
1581
			$info['resultat'] = true;
1582
		}
171 jpm 1583
		$noms_erreur = null;
20 jpm 1584
 
30 jpm 1585
		$this->traiterResultatTest($info);
20 jpm 1586
	}
1587
 
173 jpm 1588
	/**
1589
	 * Test #46
1590
	 */
1591
	private function testerHomonymieSyntaxe() {
174 jpm 1592
		$info = $this->getInfosTest(46);
20 jpm 1593
 
1594
		// Réalisation du test
1595
		$noms_erreur = array();
173 jpm 1596
		foreach ($this->noms as &$nom) {
1597
			if ($nom['homonyme'] != '') {
1598
				if (!$this->verifierBooleen($nom['homonyme'])) {
1599
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
161 jpm 1600
				}
20 jpm 1601
			}
1602
		}
1603
 
1604
		// Analyse des résultats
1605
		if (count($noms_erreur) > 0) {
173 jpm 1606
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
171 jpm 1607
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1608
		} else {
1609
			$info['resultat'] = true;
1610
		}
171 jpm 1611
		$noms_erreur = null;
20 jpm 1612
 
30 jpm 1613
		$this->traiterResultatTest($info);
20 jpm 1614
	}
1615
 
173 jpm 1616
	/**
1617
	 * Test #47
1618
	 */
1619
	private function testerHomonymieExistence() {
174 jpm 1620
		$info = $this->getInfosTest(47);
20 jpm 1621
 
173 jpm 1622
		$noms_homonymie = $this->classerNomsParNomComplet();
1623
 
20 jpm 1624
		// Réalisation du test
1625
		$noms_erreur = array();
64 jpm 1626
		foreach ($this->noms as &$nom) {
173 jpm 1627
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
1628
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
1629
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
171 jpm 1630
				}
20 jpm 1631
			}
1632
		}
173 jpm 1633
		$noms_homonymie = null;
20 jpm 1634
 
1635
		// Analyse des résultats
1636
		if (count($noms_erreur) > 0) {
173 jpm 1637
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
171 jpm 1638
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1639
		} else {
1640
			$info['resultat'] = true;
1641
		}
171 jpm 1642
		$noms_erreur = null;
20 jpm 1643
 
30 jpm 1644
		$this->traiterResultatTest($info);
20 jpm 1645
	}
1646
 
173 jpm 1647
	/**
1648
	 * Test #48
1649
	 */
1650
	private function testerBasionymeSyntaxe() {
174 jpm 1651
		$info = $this->getInfosTest(48);
20 jpm 1652
 
1653
		// Réalisation du test
1654
		$noms_erreur = array();
64 jpm 1655
		foreach ($this->noms as &$nom) {
173 jpm 1656
			if ($nom['basionyme'] != '') {
1657
				if (!$this->verifierNombre($nom['basionyme'])) {
1658
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
20 jpm 1659
				}
1660
			}
1661
		}
1662
 
1663
		// Analyse des résultats
1664
		if (count($noms_erreur) > 0) {
173 jpm 1665
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
20 jpm 1666
			$info['message']['lignes'] = $noms_erreur;
1667
		} else {
1668
			$info['resultat'] = true;
1669
		}
171 jpm 1670
		$noms_erreur = null;
20 jpm 1671
 
30 jpm 1672
		$this->traiterResultatTest($info);
20 jpm 1673
	}
173 jpm 1674
 
1675
	/**
1676
	 * Test #49
1677
	 */
1678
	private function testerBasionymeExistence() {
174 jpm 1679
		$info = $this->getInfosTest(49);
20 jpm 1680
 
1681
		// Réalisation du test
1682
		$noms_erreur = array();
64 jpm 1683
		foreach ($this->noms as &$nom) {
173 jpm 1684
			if ($nom['basionyme'] != '') {
1685
				if (!isset($this->noms[$nom['basionyme']])) {
1686
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
1687
				}
20 jpm 1688
			}
1689
		}
1690
 
1691
		// Analyse des résultats
1692
		if (count($noms_erreur) > 0) {
173 jpm 1693
			$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
20 jpm 1694
			$info['message']['lignes'] = $noms_erreur;
1695
		} else {
1696
			$info['resultat'] = true;
1697
		}
171 jpm 1698
		$noms_erreur = null;
173 jpm 1699
 
30 jpm 1700
		$this->traiterResultatTest($info);
20 jpm 1701
	}
1702
 
173 jpm 1703
	/**
1704
	 * Test #50
1705
	 */
1706
	private function testerSynonymeProparteSyntaxe() {
174 jpm 1707
		$info = $this->getInfosTest(50);
20 jpm 1708
 
1709
		// Réalisation du test
1710
		$noms_erreur = array();
64 jpm 1711
		foreach ($this->noms as &$nom) {
171 jpm 1712
			if ($nom['synonyme_proparte'] != '') {
173 jpm 1713
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
1714
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
20 jpm 1715
				}
1716
			}
1717
		}
1718
 
1719
		// Analyse des résultats
1720
		if (count($noms_erreur) > 0) {
173 jpm 1721
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
20 jpm 1722
			$info['message']['lignes'] = $noms_erreur;
1723
		} else {
1724
			$info['resultat'] = true;
1725
		}
64 jpm 1726
		$noms_erreur = null;
20 jpm 1727
 
30 jpm 1728
		$this->traiterResultatTest($info);
20 jpm 1729
	}
1730
 
173 jpm 1731
	/**
1732
	 * Test #51
1733
	 */
1734
	private function testerSynonymeProparteExistence() {
175 jpm 1735
		$info = $this->getInfosTest(51);
20 jpm 1736
 
1737
		// Réalisation du test
1738
		$noms_erreur = array();
64 jpm 1739
		foreach ($this->noms as &$nom) {
171 jpm 1740
			if ($nom['synonyme_proparte'] != '') {
173 jpm 1741
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
1742
				$num_nom_en_erreur = array();
1743
				foreach ($num_nom_a_verifier as $num_nom) {
1744
					if (!isset($this->noms[$num_nom])) {
1745
						$num_nom_en_erreur[] = $num_nom;
1746
					}
20 jpm 1747
				}
173 jpm 1748
				if (count($nbre_en_erreur) > 0) {
1749
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
1750
				}
20 jpm 1751
			}
1752
		}
1753
 
1754
		// Analyse des résultats
1755
		if (count($noms_erreur) > 0) {
173 jpm 1756
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
20 jpm 1757
			$info['message']['lignes'] = $noms_erreur;
1758
		} else {
1759
			$info['resultat'] = true;
1760
		}
64 jpm 1761
		$noms_erreur = null;
20 jpm 1762
 
30 jpm 1763
		$this->traiterResultatTest($info);
20 jpm 1764
	}
1765
 
173 jpm 1766
	/**
1767
	 * Test #52
1768
	 */
1769
	private function testerSynonymeDouteuxSyntaxe() {
175 jpm 1770
		$info = $this->getInfosTest(52);
20 jpm 1771
 
1772
		// Réalisation du test
1773
		$noms_erreur = array();
64 jpm 1774
		foreach ($this->noms as &$nom) {
173 jpm 1775
			if ($nom['synonyme_douteux'] != '') {
1776
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
1777
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
20 jpm 1778
				}
1779
			}
1780
		}
1781
 
1782
		// Analyse des résultats
1783
		if (count($noms_erreur) > 0) {
173 jpm 1784
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
20 jpm 1785
			$info['message']['lignes'] = $noms_erreur;
1786
		} else {
1787
			$info['resultat'] = true;
1788
		}
64 jpm 1789
		$noms_erreur = null;
20 jpm 1790
 
30 jpm 1791
		$this->traiterResultatTest($info);
20 jpm 1792
	}
1793
 
173 jpm 1794
	/**
1795
	 * Test #53
1796
	 */
1797
	private function testerSynonymeDouteuxNumNomRetenu() {
175 jpm 1798
		$info = $this->getInfosTest(53);
20 jpm 1799
 
1800
		// Réalisation du test
1801
		$noms_erreur = array();
64 jpm 1802
		foreach ($this->noms as &$nom) {
173 jpm 1803
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
1804
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
20 jpm 1805
			}
1806
		}
1807
 
1808
		// Analyse des résultats
1809
		if (count($noms_erreur) > 0) {
173 jpm 1810
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
20 jpm 1811
			$info['message']['lignes'] = $noms_erreur;
1812
		} else {
1813
			$info['resultat'] = true;
1814
		}
64 jpm 1815
		$noms_erreur = null;
30 jpm 1816
		$this->traiterResultatTest($info);
20 jpm 1817
	}
1818
 
171 jpm 1819
	/**
173 jpm 1820
	 * Test #54
171 jpm 1821
	 */
173 jpm 1822
	private function testerSynonymeMalAppliqueSyntaxe() {
175 jpm 1823
		$info = $this->getInfosTest(54);
20 jpm 1824
 
1825
		// Réalisation du test
1826
		$noms_erreur = array();
64 jpm 1827
		foreach ($this->noms as &$nom) {
173 jpm 1828
			if ($nom['synonyme_mal_applique'] != '') {
1829
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
1830
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
20 jpm 1831
				}
1832
			}
1833
		}
1834
 
1835
		// Analyse des résultats
1836
		if (count($noms_erreur) > 0) {
173 jpm 1837
			$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique erroné');
20 jpm 1838
			$info['message']['lignes'] = $noms_erreur;
1839
		} else {
1840
			$info['resultat'] = true;
1841
		}
64 jpm 1842
		$noms_erreur = null;
20 jpm 1843
 
30 jpm 1844
		$this->traiterResultatTest($info);
20 jpm 1845
	}
1846
 
171 jpm 1847
	/**
173 jpm 1848
	 * Test #55
171 jpm 1849
	 */
173 jpm 1850
	private function testerSynonymeOrthographiqueSyntaxe() {
175 jpm 1851
		$info = $this->getInfosTest(55);
20 jpm 1852
 
1853
		// Réalisation du test
1854
		$noms_erreur = array();
173 jpm 1855
		foreach ($this->noms as $nom) {
1856
			if ($nom['synonyme_orthographique'] != '') {
1857
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
1858
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
20 jpm 1859
				}
1860
			}
1861
		}
1862
 
1863
		// Analyse des résultats
1864
		if (count($noms_erreur) > 0) {
173 jpm 1865
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
20 jpm 1866
			$info['message']['lignes'] = $noms_erreur;
1867
		} else {
1868
			$info['resultat'] = true;
1869
		}
64 jpm 1870
		$noms_erreur = null;
20 jpm 1871
 
30 jpm 1872
		$this->traiterResultatTest($info);
20 jpm 1873
	}
1874
 
171 jpm 1875
	/**
173 jpm 1876
	 * Test #56
171 jpm 1877
	 */
173 jpm 1878
	private function testerSynonymeOrthographiqueExistence() {
175 jpm 1879
		$info = $this->getInfosTest(56);
20 jpm 1880
 
1881
		// Réalisation du test
1882
		$noms_erreur = array();
64 jpm 1883
		foreach ($this->noms as &$nom) {
173 jpm 1884
			if ($nom['synonyme_orthographique'] != '') {
1885
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
1886
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
20 jpm 1887
				}
1888
			}
1889
		}
1890
 
1891
		// Analyse des résultats
1892
		if (count($noms_erreur) > 0) {
173 jpm 1893
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
20 jpm 1894
			$info['message']['lignes'] = $noms_erreur;
1895
		} else {
1896
			$info['resultat'] = true;
1897
		}
64 jpm 1898
		$noms_erreur = null;
20 jpm 1899
 
30 jpm 1900
		$this->traiterResultatTest($info);
20 jpm 1901
	}
1902
 
171 jpm 1903
	/**
173 jpm 1904
	 * Test #57
171 jpm 1905
	 */
173 jpm 1906
	private function testerHybrideParent01Syntaxe() {
175 jpm 1907
		$info = $this->getInfosTest(57);
20 jpm 1908
 
1909
		// Réalisation du test
1910
		$noms_erreur = array();
64 jpm 1911
		foreach ($this->noms as &$nom) {
173 jpm 1912
			if ($nom['hybride_parent_01'] != '') {
1913
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
1914
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
20 jpm 1915
				}
1916
			}
1917
		}
1918
 
1919
		// Analyse des résultats
1920
		if (count($noms_erreur) > 0) {
173 jpm 1921
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
20 jpm 1922
			$info['message']['lignes'] = $noms_erreur;
1923
		} else {
1924
			$info['resultat'] = true;
1925
		}
64 jpm 1926
		$noms_erreur = null;
20 jpm 1927
 
30 jpm 1928
		$this->traiterResultatTest($info);
20 jpm 1929
	}
1930
 
171 jpm 1931
	/**
173 jpm 1932
	 * Test #58
171 jpm 1933
	 */
173 jpm 1934
	private function testerHybrideParent01Existence() {
175 jpm 1935
		$info = $this->getInfosTest(58);
20 jpm 1936
 
1937
		// Réalisation du test
1938
		$noms_erreur = array();
64 jpm 1939
		foreach ($this->noms as &$nom) {
173 jpm 1940
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
1941
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
1942
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
20 jpm 1943
				}
1944
			}
1945
		}
1946
 
1947
		// Analyse des résultats
1948
		if (count($noms_erreur) > 0) {
173 jpm 1949
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
20 jpm 1950
			$info['message']['lignes'] = $noms_erreur;
1951
		} else {
1952
			$info['resultat'] = true;
1953
		}
64 jpm 1954
		$noms_erreur = null;
20 jpm 1955
 
30 jpm 1956
		$this->traiterResultatTest($info);
20 jpm 1957
	}
171 jpm 1958
 
1959
	/**
173 jpm 1960
	 * Test #59
171 jpm 1961
	 */
173 jpm 1962
	private function testerHybrideParent02Syntaxe() {
175 jpm 1963
		$info = $this->getInfosTest(59);
20 jpm 1964
 
1965
		// Réalisation du test
1966
		$noms_erreur = array();
64 jpm 1967
		foreach ($this->noms as &$nom) {
173 jpm 1968
			if ($nom['hybride_parent_02'] != '') {
1969
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
1970
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
1971
				}
20 jpm 1972
			}
1973
		}
1974
 
1975
		// Analyse des résultats
1976
		if (count($noms_erreur) > 0) {
173 jpm 1977
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
20 jpm 1978
			$info['message']['lignes'] = $noms_erreur;
1979
		} else {
1980
			$info['resultat'] = true;
1981
		}
64 jpm 1982
		$noms_erreur = null;
20 jpm 1983
 
30 jpm 1984
		$this->traiterResultatTest($info);
20 jpm 1985
	}
1986
 
171 jpm 1987
	/**
173 jpm 1988
	 * Test #60
171 jpm 1989
	 */
173 jpm 1990
	private function testerHybrideParent02Existence() {
175 jpm 1991
		$info = $this->getInfosTest(60);
20 jpm 1992
 
1993
		// Réalisation du test
1994
		$noms_erreur = array();
64 jpm 1995
		foreach ($this->noms as &$nom) {
173 jpm 1996
			if ($nom['hybride_parent_02'] != '') {
1997
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
1998
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
20 jpm 1999
				}
2000
			}
2001
		}
2002
 
2003
		// Analyse des résultats
2004
		if (count($noms_erreur) > 0) {
173 jpm 2005
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
20 jpm 2006
			$info['message']['lignes'] = $noms_erreur;
2007
		} else {
2008
			$info['resultat'] = true;
2009
		}
64 jpm 2010
		$noms_erreur = null;
20 jpm 2011
 
30 jpm 2012
		$this->traiterResultatTest($info);
20 jpm 2013
	}
2014
 
171 jpm 2015
	/**
173 jpm 2016
	 * Test #61
171 jpm 2017
	 */
173 jpm 2018
	private function testerPresenceSyntaxe() {
175 jpm 2019
		$info = $this->getInfosTest(61);
20 jpm 2020
 
2021
		// Réalisation du test
2022
		$noms_erreur = array();
64 jpm 2023
		foreach ($this->noms as &$nom) {
173 jpm 2024
			if ($nom['presence'] != '') {
2025
				if (!$this->verifierPresence($nom['presence'])) {
2026
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
20 jpm 2027
				}
2028
			}
2029
		}
2030
 
2031
		// Analyse des résultats
2032
		if (count($noms_erreur) > 0) {
173 jpm 2033
			$info['message']['entete'] = array('num_nom', 'presence erroné');
20 jpm 2034
			$info['message']['lignes'] = $noms_erreur;
2035
		} else {
2036
			$info['resultat'] = true;
2037
		}
64 jpm 2038
		$noms_erreur = null;
20 jpm 2039
 
30 jpm 2040
		$this->traiterResultatTest($info);
20 jpm 2041
	}
2042
 
171 jpm 2043
	/**
173 jpm 2044
	 * Test #62
171 jpm 2045
	 */
173 jpm 2046
	private function testerStatutOrigineSyntaxe() {
175 jpm 2047
		$info = $this->getInfosTest(62);
20 jpm 2048
 
2049
		// Réalisation du test
2050
		$noms_erreur = array();
64 jpm 2051
		foreach ($this->noms as &$nom) {
173 jpm 2052
			if ($nom['statut_origine'] != '') {
2053
				if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
2054
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
20 jpm 2055
				}
2056
			}
2057
		}
2058
 
2059
		// Analyse des résultats
2060
		if (count($noms_erreur) > 0) {
173 jpm 2061
			$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
20 jpm 2062
			$info['message']['lignes'] = $noms_erreur;
2063
		} else {
2064
			$info['resultat'] = true;
2065
		}
64 jpm 2066
		$noms_erreur = null;
20 jpm 2067
 
30 jpm 2068
		$this->traiterResultatTest($info);
20 jpm 2069
	}
2070
 
171 jpm 2071
	/**
173 jpm 2072
	 * Test #63
171 jpm 2073
	 */
173 jpm 2074
	private function testerStatutIntroductionSyntaxe() {
175 jpm 2075
		$info = $this->getInfosTest(63);
20 jpm 2076
 
2077
		// Réalisation du test
2078
		$noms_erreur = array();
64 jpm 2079
		foreach ($this->noms as &$nom) {
173 jpm 2080
			if ($nom['statut_introduction'] != '') {
2081
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
2082
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
20 jpm 2083
				}
2084
			}
2085
		}
2086
 
2087
		// Analyse des résultats
2088
		if (count($noms_erreur) > 0) {
173 jpm 2089
			$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
20 jpm 2090
			$info['message']['lignes'] = $noms_erreur;
2091
		} else {
2092
			$info['resultat'] = true;
2093
		}
64 jpm 2094
		$noms_erreur = null;
20 jpm 2095
 
30 jpm 2096
		$this->traiterResultatTest($info);
20 jpm 2097
	}
2098
 
171 jpm 2099
	/**
173 jpm 2100
	 * Test #64
171 jpm 2101
	 */
173 jpm 2102
	private function testerStatutCultureSyntaxe() {
175 jpm 2103
		$info = $this->getInfosTest(64);
20 jpm 2104
 
2105
		// Réalisation du test
2106
		$noms_erreur = array();
64 jpm 2107
		foreach ($this->noms as &$nom) {
173 jpm 2108
			if ($nom['statut_culture'] != '') {
2109
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
2110
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
20 jpm 2111
				}
2112
			}
2113
		}
2114
 
2115
		// Analyse des résultats
2116
		if (count($noms_erreur) > 0) {
173 jpm 2117
			$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
20 jpm 2118
			$info['message']['lignes'] = $noms_erreur;
2119
		} else {
2120
			$info['resultat'] = true;
2121
		}
64 jpm 2122
		$noms_erreur = null;
20 jpm 2123
 
30 jpm 2124
		$this->traiterResultatTest($info);
20 jpm 2125
	}
2126
 
171 jpm 2127
	/**
2128
	 * Test #65
2129
	 */
146 delphine 2130
	private function testerExclureTaxRefSyntaxe() {
171 jpm 2131
		$info = $this->getInfosTest(65);
175 jpm 2132
 
173 jpm 2133
		// Réalisation du testCe n'est pas programmé.
146 delphine 2134
		$noms_erreur = array();
2135
		foreach ($this->noms as &$nom) {
2136
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
2137
				if (!$this->verifierBooleen($nom['exclure_taxref'])) {
2138
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
2139
				}
2140
			}
2141
		}
2142
 
2143
		// Analyse des résultats
2144
		if (count($noms_erreur) > 0) {
2145
			$info['message']['entete'] = array('num_nom', 'exclure_taxref erroné');
2146
			$info['message']['lignes'] = $noms_erreur;
2147
		} else {
2148
			$info['resultat'] = true;
2149
		}
2150
		$noms_erreur = null;
2151
 
2152
		$this->traiterResultatTest($info);
2153
	}
171 jpm 2154
 
2155
 
2156
 
20 jpm 2157
	//+--------------------------------------------------------------------------------------------------------------+//
2158
	// MÉTHODES COMMUNES aux TESTS
2159
 
64 jpm 2160
	private function verifierPresence(&$valeur) {
20 jpm 2161
		$codes = $this->manuel['codes_presence'];
2162
		$ok = $this->verifierStatuts($valeur, $codes);
2163
		return $ok;
2164
	}
2165
 
64 jpm 2166
	private function verifierStatutOrigine(&$valeur) {
20 jpm 2167
		$codes = $this->manuel['codes_statuts_origine'];
2168
		$ok = $this->verifierStatuts($valeur, $codes);
2169
		return $ok;
2170
	}
2171
 
64 jpm 2172
	private function verifierStatutIntroduction(&$valeur) {
20 jpm 2173
		$codes = $this->manuel['codes_statuts_introduction'];
2174
		$ok = $this->verifierStatuts($valeur, $codes);
2175
		return $ok;
2176
	}
2177
 
64 jpm 2178
	private function verifierStatutCulture(&$valeur) {
20 jpm 2179
		$codes = $this->manuel['codes_statuts_culture'];
2180
		$ok = $this->verifierStatuts($valeur, $codes);
2181
		return $ok;
2182
	}
2183
 
64 jpm 2184
	private function verifierStatuts(&$valeur, &$codes) {
20 jpm 2185
		$ok = true;
2186
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2187
			$ok = false;
2188
		}
2189
		return $ok;
2190
	}
2191
 
64 jpm 2192
	private function verifierBooleen(&$valeur) {
20 jpm 2193
		$ok = true;
2194
		if (!preg_match('/^1$/', $valeur)) {
2195
			$ok = false;
2196
		}
2197
		return $ok;
2198
	}
2199
 
64 jpm 2200
	private function verifierNombre(&$valeur) {
20 jpm 2201
		$ok = true;
2202
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2203
			$ok = false;
2204
		}
2205
		return $ok;
2206
	}
2207
 
64 jpm 2208
	private function verifierNombreSuite(&$valeur) {
20 jpm 2209
		$ok = true;
2210
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2211
			$ok = false;
2212
		}
2213
		return $ok;
2214
	}
2215
 
64 jpm 2216
	private function verifierTypeEpithete(&$type) {
20 jpm 2217
		$ok = false;
2218
		$rejetes = $this->manuel['type_epithete_rejetes'];
2219
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2220
			$ok = false;
2221
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2222
			$ok = true;
2223
		}
2224
		return $ok;
2225
	}
2226
 
64 jpm 2227
	private function verifierBiblioOrigine(&$intitule) {
20 jpm 2228
		$ok = true;
2229
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2230
			$ok = false;// Contient des espaces en trop
2231
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2232
			$ok = false;
2233
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2234
			$ok = false;// Contient une mauvaise suite de caractères
2235
		}
2236
		return $ok;
2237
	}
2238
 
64 jpm 2239
	private function verifierAnnee(&$annee) {
20 jpm 2240
		$ok = true;
2241
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2242
			$ok = false;
2243
		} else if ($annee < 1753) {
2244
			$ok = false;
2245
		}
2246
		return $ok;
2247
	}
2248
 
64 jpm 2249
	private function verifierAuteur(&$intitule) {
20 jpm 2250
		$ok = true;
2251
		$acceptes = $this->manuel['auteur_acceptes'];
2252
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2253
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2254
				$ok = false;// Contient des espaces en trop
2255
			} else {
2256
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2257
				$mots = explode(' ', $intitule);
2258
				foreach ($mots as $position => $mot) {
2259
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2260
						$ok = false;// Mot rejeté
2261
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2262
						continue;// Mot de l'intitulé auteur
2263
					} else {
2264
						$ok = false;
2265
					}
2266
				}
2267
			}
2268
		}
2269
		return $ok;
2270
	}
2271
 
64 jpm 2272
	private function verifierNomCommercial(&$epithete) {
20 jpm 2273
		$ok = false;
2274
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2275
			$ok = true;
2276
		}
2277
		return $ok;
2278
	}
2279
 
64 jpm 2280
	private function verifierEpitheteCultivar(&$epithete) {
20 jpm 2281
		$ok = true;
2282
		$acceptes = $this->manuel['cultivar_acceptes'];
2283
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2284
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2285
				$ok = false;// Contient des espaces en trop
2286
			} else {
2287
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2288
				$mots_mineurs = $this->manuel['mots_mineurs'];
2289
				$mots = explode(' ', $epithete);
2290
				foreach ($mots as $position => $mot) {
2291
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2292
						$ok = false;// Mot rejeté
2293
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2294
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2295
					} else {
2296
						$mots_tiret = explode('-', $mot);
2297
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2298
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2299
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2300
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2301
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2302
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2303
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2304
							} else {
2305
								$ok = false;
2306
							}
2307
						}
2308
					}
2309
				}
2310
			}
2311
		}
2312
		return $ok;
2313
	}
2314
 
64 jpm 2315
	private function verifierEpitheteGroupeCultivar(&$epithete) {
20 jpm 2316
		$ok = true;
2317
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2318
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2319
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2320
				$ok = false;// Contient des espaces en trop
2321
			} else {
2322
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2323
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2324
				$mots_mineurs = $this->manuel['mots_mineurs'];
2325
				$mots = explode(' ', $epithete);
2326
				foreach ($mots as $position => $mot) {
2327
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2328
						continue;// Mot accepté
2329
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2330
						$ok = false;// Mot rejeté
2331
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2332
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2333
					} else {
2334
						$mots_tiret = explode('-', $mot);
2335
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2336
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2337
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2338
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2339
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2340
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2341
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2342
							} else {
2343
								$ok = false;
2344
							}
2345
						}
2346
					}
2347
				}
2348
			}
2349
		}
2350
		return $ok;
2351
	}
2352
 
64 jpm 2353
	private function verifierEpitheteSp(&$epithete) {
20 jpm 2354
		$ok = false;
2355
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2356
			$ok = true;
2357
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2358
			$ok = true;
2359
		}
2360
		return $ok;
2361
	}
2362
 
64 jpm 2363
	private function verifierEpitheteGenre(&$epithete) {
20 jpm 2364
		$ok = false;
2365
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2366
			$ok = true;
2367
		}
2368
		return $ok;
2369
	}
2370
 
64 jpm 2371
	private function formaterStyleNomGenre(&$genre) {
20 jpm 2372
		$genre_fmt = '';
2373
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2374
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2375
		} else {
2376
			$genre_fmt = ucfirst(strtolower($genre));
2377
		}
2378
		return $genre_fmt;
2379
	}
2380
 
149 jpm 2381
	private function repererEspace($nom_sci) {
2382
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
2383
		return $nom_sci;
20 jpm 2384
	}
2385
 
64 jpm 2386
	private function construireSuffixeNomPltCultivee(&$nom) {
20 jpm 2387
		$suffixe = array();
2388
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2389
		$suffixe[] = $this->construireNomCommercial($nom);
2390
		$suffixe[] = $this->construireNomCultivar($nom);
2391
		$suffixe = array_filter($suffixe);
2392
		return implode(' ', $suffixe);
2393
	}
2394
 
64 jpm 2395
	private function construireNomCultivarGroupe(&$nom) {
20 jpm 2396
		$nom_groupe_cultivar = '';
2397
		if ($nom['cultivar_groupe'] != '') {
2398
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2399
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2400
			} else {
2401
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2402
			}
2403
		}
2404
		return $nom_groupe_cultivar;
2405
	}
2406
 
64 jpm 2407
	private function construireNomCommercial(&$nom) {
20 jpm 2408
		$nom_commercial = '';
2409
		if ($nom['nom_commercial'] != '') {
2410
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2411
		}
2412
		return $nom_commercial;
2413
	}
2414
 
64 jpm 2415
	private function construireNomCultivar(&$nom) {
20 jpm 2416
		$nom_cultivar = '';
2417
		if ($nom['cultivar'] != '') {
2418
			$nom_cultivar =  "'".$nom['cultivar']."'";
2419
		}
2420
		return $nom_cultivar;
2421
	}
2422
 
64 jpm 2423
	private function classerNomsParNomComplet() {
20 jpm 2424
		$noms_classes = array();
64 jpm 2425
		foreach ($this->noms as &$nom) {
149 jpm 2426
			if (!isset($noms_classes[$nom['nom_sci']])) {
2427
				$noms_classes[$nom['nom_sci']] = 1;
20 jpm 2428
			} else {
149 jpm 2429
				$noms_classes[$nom['nom_sci']]++;
20 jpm 2430
			}
2431
		}
2432
		return $noms_classes;
2433
	}
2434
 
171 jpm 2435
	private function getInfosTest($numero) {
2436
		$info = $this->tests[$numero];
175 jpm 2437
		$info['methode'] = 'tester'.implode('', explode(' ', ucwords($info['abr'])));
171 jpm 2438
		$info['numero'] = $numero;
2439
		$info['resultat'] = false;
2440
		return $info;
2441
	}
20 jpm 2442
}
2443
?>