Subversion Repositories Applications.referentiel

Rev

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