Subversion Repositories Applications.referentiel

Rev

Rev 171 | Rev 174 | 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
 
173 jpm 1311
	/**
1312
	 * Test #37
1313
	 */
1314
	private function testerGroupeCultivarSyntaxe() {
1315
		$info = array('nom' => 'cultivar_groupe -> syntaxe',
1316
			'description' => "Le champ cultivar_groupe doit contenir un nom de groupe de cultivar conforme aux règles ".
1317
				"du code des plantes cultivées, c.-à-d. composer de caractères alphanumériques (A-Z,a-z et 0-9) incluant ".
1318
				"signes diacritiques et marques de ponctuations.\n".
1319
				"Il ne doit pas contenir le mot Groupe, l'abbréviation «gp» ou des parenthèses.\n".
1320
				"Il peut se terminer par l'abréviation «gx» pour distinguer les groupes des grex.",
20 jpm 1321
			'resultat' => false);
1322
 
1323
		// Réalisation du test
1324
		$noms_erreur = array();
64 jpm 1325
		foreach ($this->noms as &$nom) {
173 jpm 1326
			if ($nom['cultivar_groupe'] != '') {
1327
				if (!$this->verifierEpitheteGroupeCultivar($nom['cultivar_groupe'])) {
1328
					$epithete_traite = $this->repererEspace($nom['cultivar_groupe']);
1329
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
20 jpm 1330
				}
1331
			}
1332
		}
1333
 
1334
		// Analyse des résultats
1335
		if (count($noms_erreur) > 0) {
173 jpm 1336
			$info['message']['entete'] = array('num_nom', 'cultivar_groupe erroné');
20 jpm 1337
			$info['message']['lignes'] = $noms_erreur;
1338
		} else {
1339
			$info['resultat'] = true;
1340
		}
171 jpm 1341
		$noms_erreur = null;
20 jpm 1342
 
30 jpm 1343
		$this->traiterResultatTest($info);
20 jpm 1344
	}
1345
 
173 jpm 1346
	/**
1347
	 * Test #38
1348
	 */
1349
	private function testerGroupeCultivarRang() {
1350
		$info = array('nom' => "cultivar_groupe -> rang >= {$this->manuel['rang_genre']}",
1351
			'description' => "Si le champ cultivar_groupe n'est pas vide alors le rang du nom doit être supérieur ou ".
1352
								"égal à {$this->manuel['rang_genre']}.",
20 jpm 1353
			'resultat' => false);
1354
 
1355
		// Réalisation du test
1356
		$noms_erreur = array();
64 jpm 1357
		foreach ($this->noms as &$nom) {
173 jpm 1358
			if ($nom['cultivar_groupe'] != '') {
1359
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1360
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
20 jpm 1361
				}
1362
			}
1363
		}
1364
 
1365
		// Analyse des résultats
1366
		if (count($noms_erreur) > 0) {
173 jpm 1367
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
20 jpm 1368
			$info['message']['lignes'] = $noms_erreur;
1369
		} else {
1370
			$info['resultat'] = true;
1371
		}
171 jpm 1372
		$noms_erreur = null;
20 jpm 1373
 
30 jpm 1374
		$this->traiterResultatTest($info);
20 jpm 1375
	}
1376
 
173 jpm 1377
	/**
1378
	 * Test #39
1379
	 */
1380
	private function testerCultivarSyntaxe() {
1381
		$info = array('nom' => 'cultivar -> syntaxe',
1382
			'description' => "Le champ cultivar_groupe doit contenir :\n".
1383
				" - un nom de cultivar conforme aux règles du Code Internationnal de Nomenclature \n".
1384
				"   des Plantes Cultivées (CINPC), c.-à-d. composer de caractères alphanumériques \n".
1385
				"   (A-Z,a-z et 0-9) incluant signes diacritiques et marques de ponctuations.\n".
1386
				" - un nom en alphabet latin, ce qui implique une translittération des noms d'alphabet \n".
1387
				"   cyrillique, arabe, chinois...\n".
1388
				" - une lettre majuscule obligatoire pour le premier caractère du premier mot et pour \n".
1389
				"   les autres mots importants mais pas pour les mots mineurs.\n".
1390
				"Ne doit pas contenir :\n".
1391
				" - cv., convar. ou de guillemets simples (').\n",
20 jpm 1392
			'resultat' => false);
1393
 
1394
		// Réalisation du test
1395
		$noms_erreur = array();
64 jpm 1396
		foreach ($this->noms as &$nom) {
173 jpm 1397
			if ($nom['cultivar'] != '') {
1398
				if (!$this->verifierEpitheteCultivar($nom['cultivar'])) {
1399
					$epithete_traite = $this->repererEspace($nom['cultivar']);
1400
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
20 jpm 1401
				}
1402
			}
1403
		}
1404
 
1405
		// Analyse des résultats
1406
		if (count($noms_erreur) > 0) {
173 jpm 1407
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
20 jpm 1408
			$info['message']['lignes'] = $noms_erreur;
1409
		} else {
1410
			$info['resultat'] = true;
1411
		}
171 jpm 1412
		$noms_erreur = null;
20 jpm 1413
 
30 jpm 1414
		$this->traiterResultatTest($info);
20 jpm 1415
	}
1416
 
173 jpm 1417
	/**
1418
	 * Test #40
1419
	 */
1420
	private function testerCultivarRang() {
1421
		$info = array('nom' => "cultivar -> rang >= {$this->manuel['rang_genre']}",
1422
			'description' => "Si le champ cultivar n'est pas vide alors le rang du nom doit être supérieur ou égal à ".
1423
								"{$this->manuel['rang_genre']}.",
20 jpm 1424
			'resultat' => false);
1425
 
1426
		// Réalisation du test
1427
		$noms_erreur = array();
64 jpm 1428
		foreach ($this->noms as &$nom) {
173 jpm 1429
			if ($nom['cultivar'] != '') {
1430
				if ($nom['rang'] < $this->manuel['rang_genre']) {
1431
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci'], $nom['rang']);
171 jpm 1432
				}
20 jpm 1433
			}
1434
		}
1435
 
1436
		// Analyse des résultats
1437
		if (count($noms_erreur) > 0) {
173 jpm 1438
			$info['message']['entete'] = array('num_nom', 'nom_sci', 'rang erroné');
171 jpm 1439
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1440
		} else {
1441
			$info['resultat'] = true;
1442
		}
171 jpm 1443
		$noms_erreur = null;
20 jpm 1444
 
30 jpm 1445
		$this->traiterResultatTest($info);
20 jpm 1446
	}
1447
 
173 jpm 1448
	/**
1449
	 * Test #41
1450
	 */
1451
	private function testerNomCommercialSyntaxe() {
1452
		$info = array('nom' => 'nom_commercial -> syntaxe',
1453
			'description' => "Le champ nom_commercial doit contenir un nom commercial conforme aux règles du ".
1454
				"Code Internationnal de Nomenclature des Plantes Cultivées (CINPC) ".
1455
				"qui se compose de caractères majuscules (A-Z) incluant des signes diacritiques et des espaces.\n",
20 jpm 1456
			'resultat' => false);
1457
 
1458
		// Réalisation du test
1459
		$noms_erreur = array();
64 jpm 1460
		foreach ($this->noms as &$nom) {
173 jpm 1461
			if ($nom['nom_commercial'] != '') {
1462
				if (!$this->verifierNomCommercial($nom['nom_commercial'])) {
1463
					$epithete_traite = $this->repererEspace($nom['nom_commercial']);
1464
					$noms_erreur[] = array($nom['num_nom'], $epithete_traite);
171 jpm 1465
				}
20 jpm 1466
			}
1467
		}
1468
 
1469
		// Analyse des résultats
1470
		if (count($noms_erreur) > 0) {
173 jpm 1471
			$info['message']['entete'] = array('num_nom', 'cultivar erroné');
171 jpm 1472
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1473
		} else {
1474
			$info['resultat'] = true;
1475
		}
171 jpm 1476
		$noms_erreur = null;
20 jpm 1477
 
30 jpm 1478
		$this->traiterResultatTest($info);
20 jpm 1479
	}
1480
 
173 jpm 1481
	/**
1482
	 * Test #42
1483
	 */
1484
	private function testerNomCommercialPresenceCultivar() {
1485
		$info = array('nom' => 'nom_commercial -> groupe_cultivar OU cultivar non vide',
1486
			'description' => "Si le champ nom_commercial contient un nom commercial alors le champ cultivar OU ".
1487
				"cultivar_groupe ne doit pas être vide.",
20 jpm 1488
			'resultat' => false);
1489
 
1490
		// Réalisation du test
1491
		$noms_erreur = array();
64 jpm 1492
		foreach ($this->noms as &$nom) {
173 jpm 1493
			if ((isset($nom['nom_commercial']) && $nom['nom_commercial'] != '') && ($nom['cultivar'] == '' && $nom['cultivar_groupe'] == '')) {
1494
				$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
20 jpm 1495
			}
1496
		}
1497
 
1498
		// Analyse des résultats
171 jpm 1499
		if (count($noms_erreur) > 0) {
173 jpm 1500
			$info['message']['entete'] = array('num_nom', 'nom_commercial sans cultivar ou cultivar_groupe');
171 jpm 1501
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1502
		} else {
1503
			$info['resultat'] = true;
1504
		}
171 jpm 1505
		$noms_erreur = null;
20 jpm 1506
 
30 jpm 1507
		$this->traiterResultatTest($info);
20 jpm 1508
	}
1509
 
173 jpm 1510
	/**
1511
	 * Test #43
1512
	 */
1513
	private function testerAuteurSyntaxe() {
1514
		$info = array('nom' => 'auteur -> syntaxe',
1515
			'description' => "Le champ auteur doit :\n".
1516
			" - contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ayant publié à l'origine la combinaison latine courante.\n".
1517
    		" - OU débuter par le mot « sensu » et contenir l'intitulé complet des noms de l'auteur, ou des auteurs, ".
1518
			"ayant publié un nom dont la description ne correspond pas à celle de l'auteur, ou des auteurs, d'origine.\n".
1519
			" - 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".
1520
			" - contenir, si nécessaire, des abréviations de noms d'auteurs respectant les standards.\n".
1521
			" - contenir une translittération des noms d'alphabet cyrillique, arabe, chinois... en alphabet latin.\n".
1522
			" - inclure entre parenthèses l'intitulé des noms de l'auteur ou des auteurs ayant publié le basionyme.\n".
1523
			" - toujours utiliser l'esperluette (&) à la place du mot « et » pour séparer les noms d'auteurs.\n".
1524
			" - conformément à la recommandation 46C.2 du CINB, si une un citation comprend plus de deux auteurs, ".
1525
			"elle devrait être limitée au nom du premier, suivi de « & al.».\n",
20 jpm 1526
			'resultat' => false);
1527
 
1528
		// Réalisation du test
1529
		$noms_erreur = array();
64 jpm 1530
		foreach ($this->noms as &$nom) {
173 jpm 1531
			if ($nom['auteur'] != '') {
1532
				if (!$this->verifierAuteur($nom['auteur'])) {
1533
					$intitule_traite = $this->repererEspace($nom['auteur']);
1534
					$noms_erreur[] = array($nom['num_nom'], $intitule_traite);
171 jpm 1535
				}
20 jpm 1536
			}
1537
		}
1538
 
1539
		// Analyse des résultats
1540
		if (count($noms_erreur) > 0) {
173 jpm 1541
			$info['message']['entete'] = array('num_nom', 'auteur erroné');
171 jpm 1542
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1543
		} else {
1544
			$info['resultat'] = true;
1545
		}
171 jpm 1546
		$noms_erreur = null;
20 jpm 1547
 
30 jpm 1548
		$this->traiterResultatTest($info);
20 jpm 1549
	}
1550
 
173 jpm 1551
	/**
1552
	 * Test #44
1553
	 */
1554
	private function testerAnneeSyntaxe() {
1555
		$info = array('nom' => 'annee -> syntaxe',
1556
			'description' => "Le champ annee doit :\n".
1557
			" - contenir un nombre de 4 chiffres,\n".
1558
			" - être supérieur ou égal à 1753.",
20 jpm 1559
			'resultat' => false);
1560
 
1561
		// Réalisation du test
1562
		$noms_erreur = array();
64 jpm 1563
		foreach ($this->noms as &$nom) {
173 jpm 1564
			if ($nom['annee'] != '') {
1565
				if (!$this->verifierAnnee($nom['annee'])) {
1566
					$noms_erreur[] = array($nom['num_nom'], $nom['annee']);
171 jpm 1567
				}
20 jpm 1568
			}
1569
		}
1570
 
1571
		// Analyse des résultats
1572
		if (count($noms_erreur) > 0) {
173 jpm 1573
			$info['message']['entete'] = array('num_nom', 'annee erroné');
171 jpm 1574
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1575
		} else {
1576
			$info['resultat'] = true;
1577
		}
171 jpm 1578
		$noms_erreur = null;
20 jpm 1579
 
30 jpm 1580
		$this->traiterResultatTest($info);
20 jpm 1581
	}
1582
 
173 jpm 1583
	/**
1584
	 * Test #45
1585
	 */
1586
	private function testerBiblioOrigineSyntaxe() {
1587
		$info = array('nom' => 'biblio_origine -> syntaxe',
1588
			'description' => "Le champ biblio_origine se compose de plusieurs parties séparées par des caractères ".
1589
			"précis qui sont dans l'ordre de gauche à droite :\n".
1590
			" - éventuellement, le mot « in » suivi d'un intitulé auteur (utilisé pour indiquer l'intitulé auteur de ".
1591
			"l'ouvrage dans lequel la publication est parue),\n".
1592
			" - point-virgule « ; » (si l'info précédent a été renseignée),\n".
1593
			" - abréviation, ou nom, de l'ouvrage ou de la revue selon le standard en vigueur dans le code du nom. ".
1594
			"Cette information ne doit pas contenir de caractère virgule « , »,\n".
1595
			" - virgule « , »,\n".
1596
			" - informations permettant d'identifier plus précisément le document contenant le nom... ".
1597
			"(par exemple, l'éditeur, le tome, le numéro d'édition, le volume...) séparées par des virgules ou d'autres ".
1598
			"caractères sauf deux points « : ».\n".
1599
			" - deux points « : »,\n".
1600
			" - numéro(s) de la page contenant la publication du nom ou de l'ensemble de pages (première et dernière ".
1601
			"pages de l'ensemble séparées par un tiret « - »). Quelques fois des numéros ou d'autres informations indiquant ".
1602
			"la position du nom dans le document. Le tiret « - » doit toujours servir à séparer un ensemble.",
20 jpm 1603
			'resultat' => false);
1604
 
1605
		// Réalisation du test
1606
		$noms_erreur = array();
64 jpm 1607
		foreach ($this->noms as &$nom) {
173 jpm 1608
			if ($nom['biblio_origine'] != '') {
1609
				if (!$this->verifierBiblioOrigine($nom['biblio_origine'])) {
1610
					$biblio_traite = $this->repererEspace($nom['biblio_origine']);
1611
					$noms_erreur[] = array($nom['num_nom'], $biblio_traite);
20 jpm 1612
				}
1613
			}
1614
		}
1615
 
1616
		// Analyse des résultats
1617
		if (count($noms_erreur) > 0) {
173 jpm 1618
			$info['message']['entete'] = array('num_nom', 'biblio_origine erroné');
171 jpm 1619
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1620
		} else {
1621
			$info['resultat'] = true;
1622
		}
171 jpm 1623
		$noms_erreur = null;
20 jpm 1624
 
30 jpm 1625
		$this->traiterResultatTest($info);
20 jpm 1626
	}
1627
 
173 jpm 1628
	/**
1629
	 * Test #46
1630
	 */
1631
	private function testerHomonymieSyntaxe() {
1632
		$info = array('nom' => 'homonyme -> syntaxe',
1633
			'description' => "Le champ homonyme contient :\n".
1634
				" - une valeur vide,\n".
1635
				" - le chiffre 1.",
20 jpm 1636
			'resultat' => false);
1637
 
1638
		// Réalisation du test
1639
		$noms_erreur = array();
173 jpm 1640
		foreach ($this->noms as &$nom) {
1641
			if ($nom['homonyme'] != '') {
1642
				if (!$this->verifierBooleen($nom['homonyme'])) {
1643
					$noms_erreur[] = array($nom['num_nom'], $nom['homonyme']);
161 jpm 1644
				}
20 jpm 1645
			}
1646
		}
1647
 
1648
		// Analyse des résultats
1649
		if (count($noms_erreur) > 0) {
173 jpm 1650
			$info['message']['entete'] = array('num_nom', 'homonyme erroné');
171 jpm 1651
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1652
		} else {
1653
			$info['resultat'] = true;
1654
		}
171 jpm 1655
		$noms_erreur = null;
20 jpm 1656
 
30 jpm 1657
		$this->traiterResultatTest($info);
20 jpm 1658
	}
1659
 
173 jpm 1660
	/**
1661
	 * Test #47
1662
	 */
1663
	private function testerHomonymieExistence() {
1664
		$info = array('nom' => 'homonyme -> existence',
1665
			'description' => "Si le champ homonyme contient «1» alors plusieurs noms doivent posséder la même valeur ".
1666
								"dans le champ nom_sci.",
20 jpm 1667
			'resultat' => false);
1668
 
173 jpm 1669
		$noms_homonymie = $this->classerNomsParNomComplet();
1670
 
20 jpm 1671
		// Réalisation du test
1672
		$noms_erreur = array();
64 jpm 1673
		foreach ($this->noms as &$nom) {
173 jpm 1674
			if ($nom['homonyme'] != '0' && $nom['homonyme'] != '') {
1675
				if ($noms_homonymie[$nom['nom_sci']] <= 1) {
1676
					$noms_erreur[] = array($nom['num_nom'], $nom['nom_sci']);
171 jpm 1677
				}
20 jpm 1678
			}
1679
		}
173 jpm 1680
		$noms_homonymie = null;
20 jpm 1681
 
1682
		// Analyse des résultats
1683
		if (count($noms_erreur) > 0) {
173 jpm 1684
			$info['message']['entete'] = array('num_nom', 'homonyme introuvable');
171 jpm 1685
			$info['message']['lignes'] = $noms_erreur;
20 jpm 1686
		} else {
1687
			$info['resultat'] = true;
1688
		}
171 jpm 1689
		$noms_erreur = null;
20 jpm 1690
 
30 jpm 1691
		$this->traiterResultatTest($info);
20 jpm 1692
	}
1693
 
173 jpm 1694
	/**
1695
	 * Test #48
1696
	 */
1697
	private function testerBasionymeSyntaxe() {
1698
		$info = array('nom' => 'basionyme -> syntaxe',
1699
			'description' => "Le champ basionyme contient :\n".
1700
								" - une valeur vide,\n".
1701
								" - un nombre.",
20 jpm 1702
			'resultat' => false);
1703
 
1704
		// Réalisation du test
1705
		$noms_erreur = array();
64 jpm 1706
		foreach ($this->noms as &$nom) {
173 jpm 1707
			if ($nom['basionyme'] != '') {
1708
				if (!$this->verifierNombre($nom['basionyme'])) {
1709
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
20 jpm 1710
				}
1711
			}
1712
		}
1713
 
1714
		// Analyse des résultats
1715
		if (count($noms_erreur) > 0) {
173 jpm 1716
			$info['message']['entete'] = array('num_nom', 'basionyme erroné');
20 jpm 1717
			$info['message']['lignes'] = $noms_erreur;
1718
		} else {
1719
			$info['resultat'] = true;
1720
		}
171 jpm 1721
		$noms_erreur = null;
20 jpm 1722
 
30 jpm 1723
		$this->traiterResultatTest($info);
20 jpm 1724
	}
173 jpm 1725
 
1726
	/**
1727
	 * Test #49
1728
	 */
1729
	private function testerBasionymeExistence() {
1730
		$info = array('nom' => 'basionyme -> existence',
1731
			'description' => "Si le champ basionyme contient un nombre alors il doit correspondre à une valeur du champ ".
1732
								"num_nom.",
20 jpm 1733
			'resultat' => false);
1734
 
1735
		// Réalisation du test
1736
		$noms_erreur = array();
64 jpm 1737
		foreach ($this->noms as &$nom) {
173 jpm 1738
			if ($nom['basionyme'] != '') {
1739
				if (!isset($this->noms[$nom['basionyme']])) {
1740
					$noms_erreur[] = array($nom['num_nom'], $nom['basionyme']);
1741
				}
20 jpm 1742
			}
1743
		}
1744
 
1745
		// Analyse des résultats
1746
		if (count($noms_erreur) > 0) {
173 jpm 1747
			$info['message']['entete'] = array('num_nom', 'basionyme introuvable');
20 jpm 1748
			$info['message']['lignes'] = $noms_erreur;
1749
		} else {
1750
			$info['resultat'] = true;
1751
		}
171 jpm 1752
		$noms_erreur = null;
173 jpm 1753
 
30 jpm 1754
		$this->traiterResultatTest($info);
20 jpm 1755
	}
1756
 
173 jpm 1757
	/**
1758
	 * Test #50
1759
	 */
1760
	private function testerSynonymeProparteSyntaxe() {
1761
		$info = array('nom' => 'synonyme_proparte -> syntaxe',
1762
			'description' => "Le champ synonyme_proparte contient soit :\n".
1763
			" - une valeur vide,\n".
1764
			" - un nombre,\n".
1765
			" - une suite de nombres séparés par des virgules.",
20 jpm 1766
			'resultat' => false);
1767
 
1768
		// Réalisation du test
1769
		$noms_erreur = array();
64 jpm 1770
		foreach ($this->noms as &$nom) {
171 jpm 1771
			if ($nom['synonyme_proparte'] != '') {
173 jpm 1772
				if (!$this->verifierNombreSuite($nom['synonyme_proparte'])) {
1773
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_proparte']);
20 jpm 1774
				}
1775
			}
1776
		}
1777
 
1778
		// Analyse des résultats
1779
		if (count($noms_erreur) > 0) {
173 jpm 1780
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte erroné');
20 jpm 1781
			$info['message']['lignes'] = $noms_erreur;
1782
		} else {
1783
			$info['resultat'] = true;
1784
		}
64 jpm 1785
		$noms_erreur = null;
20 jpm 1786
 
30 jpm 1787
		$this->traiterResultatTest($info);
20 jpm 1788
	}
1789
 
173 jpm 1790
	/**
1791
	 * Test #51
1792
	 */
1793
	private function testerSynonymeProparteExistence() {
1794
		$info = array('nom' => 'synonyme_proparte -> existence',
1795
			'description' => "Si le champ synonyme_proparte contient un ou plusieurs nombres alors chacun d'entre eux ".
1796
								"doit correspondre à une valeur du champ num_nom.",
20 jpm 1797
			'resultat' => false);
1798
 
1799
		// Réalisation du test
1800
		$noms_erreur = array();
64 jpm 1801
		foreach ($this->noms as &$nom) {
171 jpm 1802
			if ($nom['synonyme_proparte'] != '') {
173 jpm 1803
				$num_nom_a_verifier = explode(',', $nom['synonyme_proparte']);
1804
				$num_nom_en_erreur = array();
1805
				foreach ($num_nom_a_verifier as $num_nom) {
1806
					if (!isset($this->noms[$num_nom])) {
1807
						$num_nom_en_erreur[] = $num_nom;
1808
					}
20 jpm 1809
				}
173 jpm 1810
				if (count($nbre_en_erreur) > 0) {
1811
					$noms_erreur[] = array($nom['num_nom'], implode(',', $num_nom_en_erreur));
1812
				}
20 jpm 1813
			}
1814
		}
1815
 
1816
		// Analyse des résultats
1817
		if (count($noms_erreur) > 0) {
173 jpm 1818
			$info['message']['entete'] = array('num_nom', 'synonyme_proparte introuvable');
20 jpm 1819
			$info['message']['lignes'] = $noms_erreur;
1820
		} else {
1821
			$info['resultat'] = true;
1822
		}
64 jpm 1823
		$noms_erreur = null;
20 jpm 1824
 
30 jpm 1825
		$this->traiterResultatTest($info);
20 jpm 1826
	}
1827
 
173 jpm 1828
	/**
1829
	 * Test #52
1830
	 */
1831
	private function testerSynonymeDouteuxSyntaxe() {
1832
		$info = array('nom' => 'synonyme_douteux -> syntaxe',
1833
			'description' => "Le champ synonyme_douteux contient soit :\n".
1834
			" - une valeur vide,\n".
1835
			" - le chiffre 1.",
20 jpm 1836
			'resultat' => false);
1837
 
1838
		// Réalisation du test
1839
		$noms_erreur = array();
64 jpm 1840
		foreach ($this->noms as &$nom) {
173 jpm 1841
			if ($nom['synonyme_douteux'] != '') {
1842
				if (!$this->verifierBooleen($nom['synonyme_douteux'])) {
1843
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux']);
20 jpm 1844
				}
1845
			}
1846
		}
1847
 
1848
		// Analyse des résultats
1849
		if (count($noms_erreur) > 0) {
173 jpm 1850
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux erroné');
20 jpm 1851
			$info['message']['lignes'] = $noms_erreur;
1852
		} else {
1853
			$info['resultat'] = true;
1854
		}
64 jpm 1855
		$noms_erreur = null;
20 jpm 1856
 
30 jpm 1857
		$this->traiterResultatTest($info);
20 jpm 1858
	}
1859
 
173 jpm 1860
	/**
1861
	 * Test #53
1862
	 */
1863
	private function testerSynonymeDouteuxNumNomRetenu() {
1864
		$info = array('nom' => 'synonyme_douteux -> présence num_nom_retenu',
1865
			'description' => "Si le nom est un synonyme douteux, le champs num_nom_retenu doit être vide.",
20 jpm 1866
			'resultat' => false);
1867
 
1868
		// Réalisation du test
1869
		$noms_erreur = array();
64 jpm 1870
		foreach ($this->noms as &$nom) {
173 jpm 1871
			if ($nom['synonyme_douteux'] == 1 && $nom['num_nom_retenu'] != ' ') {
1872
				$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_douteux'], $nom['num_nom_retenu']);
20 jpm 1873
			}
1874
		}
1875
 
1876
		// Analyse des résultats
1877
		if (count($noms_erreur) > 0) {
173 jpm 1878
			$info['message']['entete'] = array('num_nom', 'synonyme_douteux', 'num_nom_retenu');
20 jpm 1879
			$info['message']['lignes'] = $noms_erreur;
1880
		} else {
1881
			$info['resultat'] = true;
1882
		}
64 jpm 1883
		$noms_erreur = null;
30 jpm 1884
		$this->traiterResultatTest($info);
20 jpm 1885
	}
1886
 
171 jpm 1887
	/**
173 jpm 1888
	 * Test #54
171 jpm 1889
	 */
173 jpm 1890
	private function testerSynonymeMalAppliqueSyntaxe() {
1891
		$info = array('nom' => 'synonyme_mal_applique -> syntaxe',
1892
			'description' => "Le champ synonyme_mal_applique contient soit :\n".
1893
			" - une valeur vide,\n".
1894
			" - le chiffre 1.",
20 jpm 1895
			'resultat' => false);
1896
 
1897
		// Réalisation du test
1898
		$noms_erreur = array();
64 jpm 1899
		foreach ($this->noms as &$nom) {
173 jpm 1900
			if ($nom['synonyme_mal_applique'] != '') {
1901
				if (!$this->verifierBooleen($nom['synonyme_mal_applique'])) {
1902
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_mal_applique']);
20 jpm 1903
				}
1904
			}
1905
		}
1906
 
1907
		// Analyse des résultats
1908
		if (count($noms_erreur) > 0) {
173 jpm 1909
			$info['message']['entete'] = array('num_nom', 'synonyme_mal_applique 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
	/**
173 jpm 1920
	 * Test #55
171 jpm 1921
	 */
173 jpm 1922
	private function testerSynonymeOrthographiqueSyntaxe() {
1923
		$info = array('nom' => 'synonyme_orthographique -> syntaxe',
1924
			'description' => "Le champ synonyme_orthographique contient soit :\n".
1925
								" - une valeur vide,\n".
1926
								" - un nombre.",
20 jpm 1927
			'resultat' => false);
1928
 
1929
		// Réalisation du test
1930
		$noms_erreur = array();
173 jpm 1931
		foreach ($this->noms as $nom) {
1932
			if ($nom['synonyme_orthographique'] != '') {
1933
				if (!$this->verifierNombre($nom['synonyme_orthographique'])) {
1934
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
20 jpm 1935
				}
1936
			}
1937
		}
1938
 
1939
		// Analyse des résultats
1940
		if (count($noms_erreur) > 0) {
173 jpm 1941
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique erroné');
20 jpm 1942
			$info['message']['lignes'] = $noms_erreur;
1943
		} else {
1944
			$info['resultat'] = true;
1945
		}
64 jpm 1946
		$noms_erreur = null;
20 jpm 1947
 
30 jpm 1948
		$this->traiterResultatTest($info);
20 jpm 1949
	}
1950
 
171 jpm 1951
	/**
173 jpm 1952
	 * Test #56
171 jpm 1953
	 */
173 jpm 1954
	private function testerSynonymeOrthographiqueExistence() {
1955
		$info = array('nom' => 'synonyme_orthographique -> existence',
1956
			'description' => "Si le champ synonyme_orthographique contient un nombre alors il doit correspondre ".
1957
								"à une valeur du champ num_nom.",
20 jpm 1958
			'resultat' => false);
1959
 
1960
		// Réalisation du test
1961
		$noms_erreur = array();
64 jpm 1962
		foreach ($this->noms as &$nom) {
173 jpm 1963
			if ($nom['synonyme_orthographique'] != '') {
1964
				if (!isset($this->noms[$nom['synonyme_orthographique']])) {
1965
					$noms_erreur[] = array($nom['num_nom'], $nom['synonyme_orthographique']);
20 jpm 1966
				}
1967
			}
1968
		}
1969
 
1970
		// Analyse des résultats
1971
		if (count($noms_erreur) > 0) {
173 jpm 1972
			$info['message']['entete'] = array('num_nom', 'synonyme_orthographique introuvable');
20 jpm 1973
			$info['message']['lignes'] = $noms_erreur;
1974
		} else {
1975
			$info['resultat'] = true;
1976
		}
64 jpm 1977
		$noms_erreur = null;
20 jpm 1978
 
30 jpm 1979
		$this->traiterResultatTest($info);
20 jpm 1980
	}
1981
 
171 jpm 1982
	/**
173 jpm 1983
	 * Test #57
171 jpm 1984
	 */
173 jpm 1985
	private function testerHybrideParent01Syntaxe() {
1986
		$info = array('nom' => 'hybride_parent_01 -> syntaxe',
1987
			'description' => "Le champ hybride_parent_01 contient soit :\n".
1988
								" - une valeur vide,\n".
1989
								" - un nombre.",
20 jpm 1990
			'resultat' => false);
1991
 
1992
		// Réalisation du test
1993
		$noms_erreur = array();
64 jpm 1994
		foreach ($this->noms as &$nom) {
173 jpm 1995
			if ($nom['hybride_parent_01'] != '') {
1996
				if (!$this->verifierNombre($nom['hybride_parent_01'])) {
1997
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
20 jpm 1998
				}
1999
			}
2000
		}
2001
 
2002
		// Analyse des résultats
2003
		if (count($noms_erreur) > 0) {
173 jpm 2004
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 erroné');
20 jpm 2005
			$info['message']['lignes'] = $noms_erreur;
2006
		} else {
2007
			$info['resultat'] = true;
2008
		}
64 jpm 2009
		$noms_erreur = null;
20 jpm 2010
 
30 jpm 2011
		$this->traiterResultatTest($info);
20 jpm 2012
	}
2013
 
171 jpm 2014
	/**
173 jpm 2015
	 * Test #58
171 jpm 2016
	 */
173 jpm 2017
	private function testerHybrideParent01Existence() {
2018
		$info = array('nom' => 'hybride_parent_01 -> existence',
2019
			'description' => "Si le champ hybride_parent_01 contient un nombre alors il doit correspondre à une valeur ".
2020
								"du champ num_nom.",
20 jpm 2021
			'resultat' => false);
2022
 
2023
		// Réalisation du test
2024
		$noms_erreur = array();
64 jpm 2025
		foreach ($this->noms as &$nom) {
173 jpm 2026
			if ($nom['hybride_parent_01'] != '' && $nom['hybride_parent_01'] != '0') {
2027
				if (!isset($this->noms[$nom['hybride_parent_01']])) {
2028
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_01']));
20 jpm 2029
				}
2030
			}
2031
		}
2032
 
2033
		// Analyse des résultats
2034
		if (count($noms_erreur) > 0) {
173 jpm 2035
			$info['message']['entete'] = array('num_nom', 'hybride_parent_01 introuvable');
20 jpm 2036
			$info['message']['lignes'] = $noms_erreur;
2037
		} else {
2038
			$info['resultat'] = true;
2039
		}
64 jpm 2040
		$noms_erreur = null;
20 jpm 2041
 
30 jpm 2042
		$this->traiterResultatTest($info);
20 jpm 2043
	}
171 jpm 2044
 
2045
	/**
173 jpm 2046
	 * Test #59
171 jpm 2047
	 */
173 jpm 2048
	private function testerHybrideParent02Syntaxe() {
2049
		$info = array('nom' => 'hybride_parent_02 -> syntaxe',
2050
			'description' => "Le champ hybride_parent_02 contient soit :\n".
2051
								" - une valeur vide,\n".
2052
								" - un nombre.",
20 jpm 2053
			'resultat' => false);
2054
 
2055
		// Réalisation du test
2056
		$noms_erreur = array();
64 jpm 2057
		foreach ($this->noms as &$nom) {
173 jpm 2058
			if ($nom['hybride_parent_02'] != '') {
2059
				if (!$this->verifierNombre($nom['hybride_parent_02'])) {
2060
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
2061
				}
20 jpm 2062
			}
2063
		}
2064
 
2065
		// Analyse des résultats
2066
		if (count($noms_erreur) > 0) {
173 jpm 2067
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 erroné');
20 jpm 2068
			$info['message']['lignes'] = $noms_erreur;
2069
		} else {
2070
			$info['resultat'] = true;
2071
		}
64 jpm 2072
		$noms_erreur = null;
20 jpm 2073
 
30 jpm 2074
		$this->traiterResultatTest($info);
20 jpm 2075
	}
2076
 
171 jpm 2077
	/**
173 jpm 2078
	 * Test #60
171 jpm 2079
	 */
173 jpm 2080
	private function testerHybrideParent02Existence() {
2081
		$info = array('nom' => 'hybride_parent_02 -> existence',
2082
			'description' => "Si le champ hybride_parent_02 contient un nombre alors il doit correspondre à une valeur ".
2083
								"du champ num_nom.",
20 jpm 2084
			'resultat' => false);
2085
 
2086
		// Réalisation du test
2087
		$noms_erreur = array();
64 jpm 2088
		foreach ($this->noms as &$nom) {
173 jpm 2089
			if ($nom['hybride_parent_02'] != '') {
2090
				if (!isset($this->noms[$nom['hybride_parent_02']]) && $nom['hybride_parent_02'] != '0') {
2091
					$noms_erreur[] = array($nom['num_nom'], $this->repererEspace($nom['hybride_parent_02']));
20 jpm 2092
				}
2093
			}
2094
		}
2095
 
2096
		// Analyse des résultats
2097
		if (count($noms_erreur) > 0) {
173 jpm 2098
			$info['message']['entete'] = array('num_nom', 'hybride_parent_02 introuvable');
20 jpm 2099
			$info['message']['lignes'] = $noms_erreur;
2100
		} else {
2101
			$info['resultat'] = true;
2102
		}
64 jpm 2103
		$noms_erreur = null;
20 jpm 2104
 
30 jpm 2105
		$this->traiterResultatTest($info);
20 jpm 2106
	}
2107
 
171 jpm 2108
	/**
173 jpm 2109
	 * Test #61
171 jpm 2110
	 */
173 jpm 2111
	private function testerPresenceSyntaxe() {
2112
		$info = array('nom' => 'presence -> syntaxe',
2113
			'description' => "Le champ presence contient soit :\n".
2114
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
2115
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
2116
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
2117
								"un code de présence spécifique au référentiel.",
20 jpm 2118
			'resultat' => false);
2119
 
2120
		// Réalisation du test
2121
		$noms_erreur = array();
64 jpm 2122
		foreach ($this->noms as &$nom) {
173 jpm 2123
			if ($nom['presence'] != '') {
2124
				if (!$this->verifierPresence($nom['presence'])) {
2125
					$noms_erreur[] = array($nom['num_nom'], $nom['presence']);
20 jpm 2126
				}
2127
			}
2128
		}
2129
 
2130
		// Analyse des résultats
2131
		if (count($noms_erreur) > 0) {
173 jpm 2132
			$info['message']['entete'] = array('num_nom', 'presence erroné');
20 jpm 2133
			$info['message']['lignes'] = $noms_erreur;
2134
		} else {
2135
			$info['resultat'] = true;
2136
		}
64 jpm 2137
		$noms_erreur = null;
20 jpm 2138
 
30 jpm 2139
		$this->traiterResultatTest($info);
20 jpm 2140
	}
2141
 
171 jpm 2142
	/**
173 jpm 2143
	 * Test #62
171 jpm 2144
	 */
173 jpm 2145
	private function testerStatutOrigineSyntaxe() {
2146
		$info = array('nom' => 'statut_origine -> syntaxe',
2147
			'description' => "Le champ statut_origine peut contenir :\n".
2148
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
2149
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon.\n".
2150
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
2151
								"un code de présence spécifique au référentiel.",
20 jpm 2152
			'resultat' => false);
2153
 
2154
		// Réalisation du test
2155
		$noms_erreur = array();
64 jpm 2156
		foreach ($this->noms as &$nom) {
173 jpm 2157
			if ($nom['statut_origine'] != '') {
2158
				if (!$this->verifierStatutOrigine($nom['statut_origine'])) {
2159
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_origine']);
20 jpm 2160
				}
2161
			}
2162
		}
2163
 
2164
		// Analyse des résultats
2165
		if (count($noms_erreur) > 0) {
173 jpm 2166
			$info['message']['entete'] = array('num_nom', 'statut_origine erroné');
20 jpm 2167
			$info['message']['lignes'] = $noms_erreur;
2168
		} else {
2169
			$info['resultat'] = true;
2170
		}
64 jpm 2171
		$noms_erreur = null;
20 jpm 2172
 
30 jpm 2173
		$this->traiterResultatTest($info);
20 jpm 2174
	}
2175
 
171 jpm 2176
	/**
173 jpm 2177
	 * Test #63
171 jpm 2178
	 */
173 jpm 2179
	private function testerStatutIntroductionSyntaxe() {
2180
		$info = array('nom' => 'statut_introduction -> syntaxe',
2181
			'description' => "Le champ statut_introduction peut contenir :\n".
2182
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
2183
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
2184
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
2185
								"un code de présence spécifique au référentiel.",
20 jpm 2186
			'resultat' => false);
2187
 
2188
		// Réalisation du test
2189
		$noms_erreur = array();
64 jpm 2190
		foreach ($this->noms as &$nom) {
173 jpm 2191
			if ($nom['statut_introduction'] != '') {
2192
				if (!$this->verifierStatutIntroduction($nom['statut_introduction'])) {
2193
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_introduction']);
20 jpm 2194
				}
2195
			}
2196
		}
2197
 
2198
		// Analyse des résultats
2199
		if (count($noms_erreur) > 0) {
173 jpm 2200
			$info['message']['entete'] = array('num_nom', 'statut_introduction erroné');
20 jpm 2201
			$info['message']['lignes'] = $noms_erreur;
2202
		} else {
2203
			$info['resultat'] = true;
2204
		}
64 jpm 2205
		$noms_erreur = null;
20 jpm 2206
 
30 jpm 2207
		$this->traiterResultatTest($info);
20 jpm 2208
	}
2209
 
171 jpm 2210
	/**
173 jpm 2211
	 * Test #64
171 jpm 2212
	 */
173 jpm 2213
	private function testerStatutCultureSyntaxe() {
2214
		$info = array('nom' => 'statut_culture -> syntaxe',
2215
			'description' => "Le champ statut_culture peut contenir :\n".
2216
								" - le symbole tiret «-» précédant une autre information non référencée...\n".
2217
								" - une première lettre en majuscule indiquant le code standard attribué à ce taxon,\n".
2218
								" - éventuellement suivie d'un tiret puis d'une deuxième lettre en majuscule indiquant ".
2219
								"un code de présence spécifique au référentiel.",
20 jpm 2220
			'resultat' => false);
2221
 
2222
		// Réalisation du test
2223
		$noms_erreur = array();
64 jpm 2224
		foreach ($this->noms as &$nom) {
173 jpm 2225
			if ($nom['statut_culture'] != '') {
2226
				if (!$this->verifierStatutCulture($nom['statut_culture'])) {
2227
					$noms_erreur[] = array($nom['num_nom'], $nom['statut_culture']);
20 jpm 2228
				}
2229
			}
2230
		}
2231
 
2232
		// Analyse des résultats
2233
		if (count($noms_erreur) > 0) {
173 jpm 2234
			$info['message']['entete'] = array('num_nom', 'statut_culture erroné');
20 jpm 2235
			$info['message']['lignes'] = $noms_erreur;
2236
		} else {
2237
			$info['resultat'] = true;
2238
		}
64 jpm 2239
		$noms_erreur = null;
20 jpm 2240
 
30 jpm 2241
		$this->traiterResultatTest($info);
20 jpm 2242
	}
2243
 
171 jpm 2244
	/**
2245
	 * Test #65
2246
	 */
146 delphine 2247
	private function testerExclureTaxRefSyntaxe() {
171 jpm 2248
		$info = $this->getInfosTest(65);
146 delphine 2249
		$info = array('nom' => 'exclure_taxref -> syntaxe',
2250
			'description' => "Le champ exclure_taxref contient soit :\n".
2251
			" - une valeur vide.\n".
2252
			" - une valeur null.\n".
2253
			" - le chiffre 0.\n".
2254
			" - le chiffre 1",
2255
			'resultat' => false);
2256
 
173 jpm 2257
		// Réalisation du testCe n'est pas programmé.
146 delphine 2258
		$noms_erreur = array();
2259
		foreach ($this->noms as &$nom) {
2260
			if ($nom['exclure_taxref'] != '' && $nom['exclure_taxref'] != null) {
2261
				if (!$this->verifierBooleen($nom['exclure_taxref'])) {
2262
					$noms_erreur[] = array($nom['num_nom'], $nom['exclure_taxref']);
2263
				}
2264
			}
2265
		}
2266
 
2267
		// Analyse des résultats
2268
		if (count($noms_erreur) > 0) {
2269
			$info['message']['entete'] = array('num_nom', 'exclure_taxref erroné');
2270
			$info['message']['lignes'] = $noms_erreur;
2271
		} else {
2272
			$info['resultat'] = true;
2273
		}
2274
		$noms_erreur = null;
2275
 
2276
		$this->traiterResultatTest($info);
2277
	}
171 jpm 2278
 
2279
 
2280
 
20 jpm 2281
	//+--------------------------------------------------------------------------------------------------------------+//
2282
	// MÉTHODES COMMUNES aux TESTS
2283
 
64 jpm 2284
	private function verifierPresence(&$valeur) {
20 jpm 2285
		$codes = $this->manuel['codes_presence'];
2286
		$ok = $this->verifierStatuts($valeur, $codes);
2287
		return $ok;
2288
	}
2289
 
64 jpm 2290
	private function verifierStatutOrigine(&$valeur) {
20 jpm 2291
		$codes = $this->manuel['codes_statuts_origine'];
2292
		$ok = $this->verifierStatuts($valeur, $codes);
2293
		return $ok;
2294
	}
2295
 
64 jpm 2296
	private function verifierStatutIntroduction(&$valeur) {
20 jpm 2297
		$codes = $this->manuel['codes_statuts_introduction'];
2298
		$ok = $this->verifierStatuts($valeur, $codes);
2299
		return $ok;
2300
	}
2301
 
64 jpm 2302
	private function verifierStatutCulture(&$valeur) {
20 jpm 2303
		$codes = $this->manuel['codes_statuts_culture'];
2304
		$ok = $this->verifierStatuts($valeur, $codes);
2305
		return $ok;
2306
	}
2307
 
64 jpm 2308
	private function verifierStatuts(&$valeur, &$codes) {
20 jpm 2309
		$ok = true;
2310
		if (!preg_match("/^(?:|-|[$codes](?:-[A-Z])?)$/", $valeur)) {
2311
			$ok = false;
2312
		}
2313
		return $ok;
2314
	}
2315
 
64 jpm 2316
	private function verifierBooleen(&$valeur) {
20 jpm 2317
		$ok = true;
2318
		if (!preg_match('/^1$/', $valeur)) {
2319
			$ok = false;
2320
		}
2321
		return $ok;
2322
	}
2323
 
64 jpm 2324
	private function verifierNombre(&$valeur) {
20 jpm 2325
		$ok = true;
2326
		if (!preg_match('/^[0-9]+$/', $valeur)) {
2327
			$ok = false;
2328
		}
2329
		return $ok;
2330
	}
2331
 
64 jpm 2332
	private function verifierNombreSuite(&$valeur) {
20 jpm 2333
		$ok = true;
2334
		if (!preg_match('/^(?:[0-9]+,)*[0-9]+$/', $valeur)) {
2335
			$ok = false;
2336
		}
2337
		return $ok;
2338
	}
2339
 
64 jpm 2340
	private function verifierTypeEpithete(&$type) {
20 jpm 2341
		$ok = false;
2342
		$rejetes = $this->manuel['type_epithete_rejetes'];
2343
		if (preg_replace("/^(?:$rejetes)$/", '', $type) == '') {
2344
			$ok = false;
2345
		} else if (preg_match('/^[a-z][-a-z]*[.]?$/', $type)) {
2346
			$ok = true;
2347
		}
2348
		return $ok;
2349
	}
2350
 
64 jpm 2351
	private function verifierBiblioOrigine(&$intitule) {
20 jpm 2352
		$ok = true;
2353
		if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2354
			$ok = false;// Contient des espaces en trop
2355
		} else if (!preg_match('/^(?:in [^;]+[;]|)[^,]+?(?:[,][^:]+|)(?:[:].+|)$/', $intitule)) {
2356
			$ok = false;
2357
		} else if (preg_match('/(?:(?:^|[,:])\s*(?:[:,]|$))/', $intitule)) {
2358
			$ok = false;// Contient une mauvaise suite de caractères
2359
		}
2360
		return $ok;
2361
	}
2362
 
64 jpm 2363
	private function verifierAnnee(&$annee) {
20 jpm 2364
		$ok = true;
2365
		if (!preg_match('/^[0-9]{4}$/', $annee)) {
2366
			$ok = false;
2367
		} else if ($annee < 1753) {
2368
			$ok = false;
2369
		}
2370
		return $ok;
2371
	}
2372
 
64 jpm 2373
	private function verifierAuteur(&$intitule) {
20 jpm 2374
		$ok = true;
2375
		$acceptes = $this->manuel['auteur_acceptes'];
2376
		if (!preg_match("/^(?:$acceptes)$/", $intitule)) {
2377
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $intitule)) {
2378
				$ok = false;// Contient des espaces en trop
2379
			} else {
2380
				$mots_rejetes = $this->manuel['auteur_mots_rejetes'];
2381
				$mots = explode(' ', $intitule);
2382
				foreach ($mots as $position => $mot) {
2383
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2384
						$ok = false;// Mot rejeté
2385
					} else if (preg_match("/^(?:(?:\p{L}|[.'\(\)-])+|[&])$/u", $mot)) {
2386
						continue;// Mot de l'intitulé auteur
2387
					} else {
2388
						$ok = false;
2389
					}
2390
				}
2391
			}
2392
		}
2393
		return $ok;
2394
	}
2395
 
64 jpm 2396
	private function verifierNomCommercial(&$epithete) {
20 jpm 2397
		$ok = false;
2398
		if (preg_match("/^[[:upper:][:punct:][:digit:][:space:]]+$/", $epithete)) {
2399
			$ok = true;
2400
		}
2401
		return $ok;
2402
	}
2403
 
64 jpm 2404
	private function verifierEpitheteCultivar(&$epithete) {
20 jpm 2405
		$ok = true;
2406
		$acceptes = $this->manuel['cultivar_acceptes'];
2407
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2408
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2409
				$ok = false;// Contient des espaces en trop
2410
			} else {
2411
				$mots_rejetes = $this->manuel['cultivar_mots_rejetes'];
2412
				$mots_mineurs = $this->manuel['mots_mineurs'];
2413
				$mots = explode(' ', $epithete);
2414
				foreach ($mots as $position => $mot) {
2415
					if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2416
						$ok = false;// Mot rejeté
2417
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2418
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2419
					} else {
2420
						$mots_tiret = explode('-', $mot);
2421
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2422
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2423
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position
2424
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2425
								continue;//Mot (ou 'mot-tiret') avec lettre initiale majuscule
2426
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2427
								continue;//Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2428
							} else {
2429
								$ok = false;
2430
							}
2431
						}
2432
					}
2433
				}
2434
			}
2435
		}
2436
		return $ok;
2437
	}
2438
 
64 jpm 2439
	private function verifierEpitheteGroupeCultivar(&$epithete) {
20 jpm 2440
		$ok = true;
2441
		$acceptes = $this->manuel['cultivar_gp_acceptes'];
2442
		if (!preg_match("/^(?:$acceptes)$/", $epithete)) {
2443
			if (preg_match('/(?:^\s+|\s{2,}|\s+$)/', $epithete)) {
2444
				$ok = false;// Contient des espaces en trop
2445
			} else {
2446
				$mots_acceptes = $this->manuel['cultivar_gp_mots_acceptes'];
2447
				$mots_rejetes = $this->manuel['cultivar_gp_mots_rejetes'];
2448
				$mots_mineurs = $this->manuel['mots_mineurs'];
2449
				$mots = explode(' ', $epithete);
2450
				foreach ($mots as $position => $mot) {
2451
					if (preg_match("/^(?:$mots_acceptes)$/i", $mot)) {
2452
						continue;// Mot accepté
2453
					} else if (preg_match("/^(?:$mots_rejetes)$/i", $mot)) {
2454
						$ok = false;// Mot rejeté
2455
					} else if ($position > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot)) {
2456
						continue;// Mot mineur en minuscule qui n'est pas en 1ère position
2457
					} else {
2458
						$mots_tiret = explode('-', $mot);
2459
						foreach ($mots_tiret as $position_tiret => $mot_tiret) {
2460
							if ($position_tiret > 0 && preg_match("/^(?:$mots_mineurs)$/", $mot_tiret)) {
2461
								continue;// Mot-tiret mineur en minuscule qui n'est pas en 1ère position dans le mot
2462
							} else if (preg_match('/^[[:upper:]][[:lower:]]+$/', $mot_tiret)) {
2463
								continue;// Mot (ou 'mot-tiret') avec lettre initiale majuscule
2464
							} else if ($position_tiret == count($mots_tiret) && preg_match('/^[:upper:][:lower:]+[:punct:]?$/', $mot_tiret)) {
2465
								continue;// Dernier mot (ou 'mot-tiret') avec lettre initiale majuscule, suivi d'un éventuel signe de ponctuation
2466
							} else {
2467
								$ok = false;
2468
							}
2469
						}
2470
					}
2471
				}
2472
			}
2473
		}
2474
		return $ok;
2475
	}
2476
 
64 jpm 2477
	private function verifierEpitheteSp(&$epithete) {
20 jpm 2478
		$ok = false;
2479
		if (preg_match('/^[a-zëï][-a-zëï]+$/', $epithete)) {
2480
			$ok = true;
2481
		} else if (preg_match('/^sp\.(?:[A-Z]|[1-9][0-9]*)$/', $epithete)) {
2482
			$ok = true;
2483
		}
2484
		return $ok;
2485
	}
2486
 
64 jpm 2487
	private function verifierEpitheteGenre(&$epithete) {
20 jpm 2488
		$ok = false;
2489
		if (preg_match('/^[A-ZËÏ](?:[-a-zëï]+|[a-zëï]+-[A-ZËÏ][a-zëï]+)$/', $epithete)) {
2490
			$ok = true;
2491
		}
2492
		return $ok;
2493
	}
2494
 
64 jpm 2495
	private function formaterStyleNomGenre(&$genre) {
20 jpm 2496
		$genre_fmt = '';
2497
		if (preg_match('/^\s*([x+])\s+(.+)$/i', $genre, $match)) {
2498
			$genre_fmt = strtolower($match[1]).' '.ucfirst(strtolower($match[2]));
2499
		} else {
2500
			$genre_fmt = ucfirst(strtolower($genre));
2501
		}
2502
		return $genre_fmt;
2503
	}
2504
 
149 jpm 2505
	private function repererEspace($nom_sci) {
2506
		$nom_sci = str_replace(' ', '<span class="espace">&nbsp;</span>', $nom_sci);
2507
		return $nom_sci;
20 jpm 2508
	}
2509
 
64 jpm 2510
	private function construireSuffixeNomPltCultivee(&$nom) {
20 jpm 2511
		$suffixe = array();
2512
		$suffixe[] = $this->construireNomCultivarGroupe($nom);
2513
		$suffixe[] = $this->construireNomCommercial($nom);
2514
		$suffixe[] = $this->construireNomCultivar($nom);
2515
		$suffixe = array_filter($suffixe);
2516
		return implode(' ', $suffixe);
2517
	}
2518
 
64 jpm 2519
	private function construireNomCultivarGroupe(&$nom) {
20 jpm 2520
		$nom_groupe_cultivar = '';
2521
		if ($nom['cultivar_groupe'] != '') {
2522
			if (preg_match('/ gx$/', $nom['cultivar_groupe'])) {
2523
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].')';
2524
			} else {
2525
				$nom_groupe_cultivar =  '('.$nom['cultivar_groupe'].' Gp)';
2526
			}
2527
		}
2528
		return $nom_groupe_cultivar;
2529
	}
2530
 
64 jpm 2531
	private function construireNomCommercial(&$nom) {
20 jpm 2532
		$nom_commercial = '';
2533
		if ($nom['nom_commercial'] != '') {
2534
			$nom_commercial =  strtoupper($nom['nom_commercial']);
2535
		}
2536
		return $nom_commercial;
2537
	}
2538
 
64 jpm 2539
	private function construireNomCultivar(&$nom) {
20 jpm 2540
		$nom_cultivar = '';
2541
		if ($nom['cultivar'] != '') {
2542
			$nom_cultivar =  "'".$nom['cultivar']."'";
2543
		}
2544
		return $nom_cultivar;
2545
	}
2546
 
64 jpm 2547
	private function classerNomsParNomComplet() {
20 jpm 2548
		$noms_classes = array();
64 jpm 2549
		foreach ($this->noms as &$nom) {
149 jpm 2550
			if (!isset($noms_classes[$nom['nom_sci']])) {
2551
				$noms_classes[$nom['nom_sci']] = 1;
20 jpm 2552
			} else {
149 jpm 2553
				$noms_classes[$nom['nom_sci']]++;
20 jpm 2554
			}
2555
		}
2556
		return $noms_classes;
2557
	}
2558
 
171 jpm 2559
	private function getInfosTest($numero) {
2560
		$info = $this->tests[$numero];
2561
		$info['numero'] = $numero;
2562
		$info['resultat'] = false;
2563
		return $info;
2564
	}
20 jpm 2565
}
2566
?>