Subversion Repositories Applications.referentiel

Rev

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