source: spip-zone/_plugins_/simpletest/inc/tests.php @ 28933

Last change on this file since 28933 was 27433, checked in by marcimat@…, 12 years ago
  • pas de ../ si on est dans ecrire pour le fond... (aucazou)
File size: 23.2 KB
Line 
1<?php
2
3include_spip('simpletest/autorun');
4include_spip('inc/autoriser');
5
6if (!autoriser('configurer')) 
7        die('Administrateur requis !');
8if ($_SERVER["REMOTE_ADDR"]!='127.0.0.1')
9        die('Admin local requis pour executer les tests !');
10
11/*
12 * il faut remettre le chdir pour les fonctions de spip
13 * comme find_in_path() ou include_spip()
14 * a l'interieur de la classe.
15 */
16define('_CHDIR', getcwd());
17define('_DEBUG_MAX_SQUELETTE_ERREURS', 100);
18
19/**
20 * Extension SpipTest
21 * pour donner le bon repertoire de travail
22 * et definir d'autres fonctions d'assertion
23 */
24class SpipTest extends UnitTestCase { 
25        var $options_recuperer_code = array();
26        var $adresse_dernier_fichier_pour_code = '';
27       
28        function SpipTest($name = false) {
29                chdir(_CHDIR);
30            if (!$name) {
31            $name = get_class($this);
32        }
33        $this->UnitTestCase($name);
34                // creer un repertoire pour les tests
35                // sert a la compilation
36                include_spip('inc/flock');
37                sous_repertoire(_DIR_CACHE, 'simpleTests');
38                define('_DIR_CODE',_DIR_CACHE . 'simpleTests/');
39    }
40       
41        /**
42         * Retourne l'adresse du site SPIP
43         */
44        function me(){
45                return $GLOBALS['meta']['url_site_spip'];
46        }
47       
48        /**
49         * Retourne une url pour tester une noisette
50         *
51         *
52         * @param string $noisette : noisette a tester
53         * @param array $params : tableau de params a transmettre
54         */
55        function generer_url_test($noisette, $params=array(), $var_mode_auto=true){
56                $appel = parametre_url(generer_url_public('simpletests'),'test',$noisette,'&');
57                foreach ($params as $p=>$v)
58                        $appel =  parametre_url($appel,$p,$v,'&');
59                if ($var_mode_auto) {
60                        if ($mode = $GLOBALS['var_mode'] AND in_array($mode, array('calcul','recalcul')))
61                                $appel =  parametre_url($appel,'var_mode',$mode,'&');
62                }
63                return $appel;
64        }
65       
66        /**
67         * Retourne une url pour tester une code
68         *
69         * Voir la fonction recuperer_fond pour les parametres
70         * @param string $code : code du squelette
71         * @param array $contexte : contexte de calcul du squelette
72         * @param array $opt : options ?
73         * @param string $connect : nom de la connexion a la bdd
74         *
75         * @return url d'appel
76         */     
77        function urlTestCode($code, $contexte=array(), $options = array(), $connect='') {
78                $infos = $this->recuperer_infos_code($code, $contexte, $options, $connect);
79                return $this->generer_url_test($infos['fond']);
80        }
81       
82        /**
83         * Determine si une chaine est de type NA (non applicable)
84         * @param string $chaine        Chaine a tester
85         * @return bool est-ce Non Applicable ?
86         */
87        function isNa($chaine) {
88                return substr(strtolower(trim($chaine)),0,2)=='na';
89        }
90       
91        /**
92         * Cree une exception si l'on est de type NA
93         * Retourne true si exception, false sinon.
94         *
95         * @param string $chaine        Chaine a tester
96         * @return bool         Est-ce Non Applicable ?
97         */
98        function exceptionSiNa($chaine) {
99                if ($this->isNa($chaine)) {
100                        throw new SpipNaException($chaine);
101                        return true;
102                }
103                return false;
104        }       
105       
106        /**
107         * Assertion qui verifie si le retour est la chaine 'ok' (casse indifferente)
108         *
109         * @param mixed $value valeur a tester si ok
110         * @param string $message : message pour une eventuelle erreur
111         * 
112         */
113        function assertOk($value, $message = "%s") {
114        $dumper = &new SimpleDumper();
115        $message = sprintf(
116                $message,
117                '[' . $dumper->describeValue($value) . '] should be string \'ok\'');
118                if ($this->exceptionSiNa($value)) {
119                        return false;
120                }
121        return $this->assertTrue((strtolower($value)=='ok'), $message);
122        }
123       
124        /**
125         * Assertion qui verifie que le retour n'est pas la chaine 'ok' (casse indifferente)
126         *
127         * @param mixed $value valeur a tester si pas ok
128         * @param string $message : message pour une eventuelle erreur
129         *
130         */
131        function assertNotOk($value, $message = "%s") {
132        $dumper = &new SimpleDumper();
133        $message = sprintf(
134                $message,
135                '[' . $dumper->describeValue($value) . '] shouldn\'t be string \'ok\'');
136        return $this->assertFalse((strtolower($value)=='ok'), $message);
137        }
138       
139        /**
140         * Assertion qui verifie si le retour ne vaut pas 'ok' (casse indifferente)
141         * la fonction appelle recuperer_code avec les arguments.
142         *
143         * L'appel
144         *              $this->assertNotOkCode('[(#CONFIG{pasla}|oui)ok]');
145         * est equivalent de :
146         *              $this->assertNotOk($this->recuperer_code('[(#CONFIG{pasla}|oui)ok]'));
147         *
148         * Voir la fonction recuperer_fond pour les parametres
149         * @param string $code : code du squelette
150         * @param array $contexte : contexte de calcul du squelette
151         * @param array $opt : options ?
152         * @param string $connect : nom de la connexion a la bdd
153         * @param string $message : message pour une eventuelle erreur
154         * 
155         * @return true/false
156         */
157        function assertNotOkCode($code, $contexte=array(), $options = array(), $connect='', $message = "%s") {
158                return $this->assertNotOk($this->recuperer_code($code, $contexte, $options, $connect), $message);
159        }
160       
161       
162        /**
163         * Assertion qui verifie si le retour vaut 'ok' (casse indifferente)
164         * la fonction appelle recuperer_code avec les arguments.
165         *
166         * L'appel
167         *              $this->assertOkCode('[(#CONFIG{pasla}|non)ok]');
168         * est equivalent de :
169         *              $this->assertOk($this->recuperer_code('[(#CONFIG{pasla}|non)ok]'));
170         *
171         * Voir la fonction recuperer_fond pour les parametres
172         * @param string $code : code du squelette
173         * @param array $contexte : contexte de calcul du squelette
174         * @param array $opt : options ?
175         * @param string $connect : nom de la connexion a la bdd
176         * @param string $message : message pour une eventuelle erreur
177         * 
178         * @return true/false
179         */
180        function assertOkCode($code, $contexte=array(), $options = array(), $connect='', $message = "%s") {
181                return $this->assertOk($this->recuperer_code($code, $contexte, $options, $connect), $message);
182        }
183       
184        /**
185         * Assertion qui verifie si le retour vaut $value
186         * la fonction appelle recuperer_code avec les arguments.
187         *
188         * L'appel
189         *              $this->assertEqualCode('ok','[(#CONFIG{pasla}|non)ok]');
190         * est equivalent de :
191         *              $this->assertEqual('ok',$this->recuperer_code('[(#CONFIG{pasla}|non)ok]'));
192         *
193         * Voir la fonction recuperer_fond pour les parametres
194         * @param string $value : chaine a comparer au resultat du code
195         * @param string $code : code du squelette
196         * @param array $contexte : contexte de calcul du squelette
197         * @param array $opt : options ?
198         * @param string $connect : nom de la connexion a la bdd
199         * @param string $message : message pour une eventuelle erreur
200         *
201         * @return true/false
202         */
203        function assertEqualCode($value, $code, $contexte=array(), $options = array(), $connect='', $message = "%s") {
204                return $this->assertEqual($value, $this->recuperer_code($code, $contexte, $options, $connect), $message);
205        }
206       
207       
208        /**
209         * Assertion qui verifie si le retour ne vaut pas $value
210         * la fonction appelle recuperer_code avec les arguments.
211         *
212         * L'appel
213         *              $this->assertEqualCode('ok','[(#CONFIG{pasla}|non)ok]');
214         * est equivalent de :
215         *              $this->assertEqual('ok',$this->recuperer_code('[(#CONFIG{pasla}|non)ok]'));
216         *
217         * Voir la fonction recuperer_fond pour les parametres
218         * @param string $value : chaine a comparer au resultat du code
219         * @param string $code : code du squelette
220         * @param array $contexte : contexte de calcul du squelette
221         * @param array $opt : options ?
222         * @param string $connect : nom de la connexion a la bdd
223         * @param string $message : message pour une eventuelle erreur
224         *
225         * @return true/false
226         */
227        function assertNotEqualCode($value, $code, $contexte=array(), $options = array(), $connect='', $message = "%s") {
228                return $this->assertNotEqual($value, $this->recuperer_code($code, $contexte, $options, $connect), $message);
229        }
230       
231        /**
232         * Assertion qui verifie si le retour verifie le pattern $pattern
233         * la fonction appelle recuperer_code avec les arguments.
234         *
235         * L'appel
236         *              $this->assertPatternCode('/^ok$/i','[(#CONFIG{pasla}|non)ok]');
237         * est equivalent de :
238         *              $this->assertPattern('/^ok$/i',$this->recuperer_code('[(#CONFIG{pasla}|non)ok]'));
239         *
240         * Voir la fonction recuperer_fond pour les parametres
241         * @param string $pattern : pattern a comparer au resultat du code
242         * @param string $code : code du squelette
243         * @param array $contexte : contexte de calcul du squelette
244         * @param array $opt : options ?
245         * @param string $connect : nom de la connexion a la bdd
246         * @param string $message : message pour une eventuelle erreur
247         *
248         * @return true/false
249         */
250        function assertPatternCode($pattern, $code, $contexte=array(), $options = array(), $connect='', $message = "%s") {
251                return $this->assertPattern($pattern, $this->recuperer_code($code, $contexte, $options, $connect), $message);
252        }
253       
254                       
255        /**
256         * recupere le resultat du calcul d'une compilation de code de squelette
257         * $coucou = $this->recuperer_code('[(#AUTORISER{ok}|oui)coucou]');
258         *
259         * Voir la fonction recuperer_fond pour les parametres
260         * @param string $code : code du squelette
261         * @param array $contexte : contexte de calcul du squelette
262         * @param array $opt : options ?
263         * @param string $connect : nom de la connexion a la bdd
264         *
265         * @return string/array : page compilee et calculee
266         */
267        function recuperer_code($code, $contexte=array(), $options = array(), $connect=''){
268                $opt = $this->options_recuperer_code;
269                if (isset($opt['avant_code']))
270                        $code = $opt['avant_code'] . $code;
271                if (isset($opt['apres_code']))
272                        $code .= $opt['apres_code'];
273               
274                $fond = _DIR_CODE . md5($code.serialize($opt));
275                $this->ecrire_fichier($fond . '.html', $code);
276               
277                if (isset($opt['fonctions']) and $opt['fonctions']) {
278                        // un fichier unique pour ces fonctions
279                        $func = _DIR_CODE . "func_" . md5($opt['fonctions']) . ".php";
280                        $this->ecrire_fichier($func, $this->php($opt['fonctions']));
281                        // une inclusion unique de ces fichiers
282                        $this->ecrire_fichier($fond.'_fonctions.php', $this->php("include_once('$func');"));
283                }
284               
285                $fond = str_replace('../', '', $fond); // pas de ../ si dans ecrire !
286                return recuperer_fond($fond, $contexte, $options, $connect);
287        }
288       
289       
290        /**
291         * Appele recuperer_fond avec l'option raw pour obtenir un tableau d'informations
292         * que l'on complete avec le nom du fond et les erreurs de compilations generees
293         */
294        function recuperer_infos_code($code, $contexte=array(), $options = array(), $connect=''){
295                $options['raw'] = true;
296                // vider les erreurs
297                $this->init_compilation_errors();
298                $infos = $this->recuperer_code($code, $contexte, $options, $connect);
299               
300                // ca ne devrait pas arriver
301                if (!is_array($infos)) return $infos;
302               
303                // on ajoute des infos supplementaires a celles retournees
304                $path = pathinfo($infos['source']);
305                $infos['fond'] = $path['dirname'].'/'.$path['filename']; // = $fond;
306                $infos['erreurs'] = $this->get_compilation_errors();
307                return $infos;
308        }
309       
310       
311       
312        /**
313         * S'utilise avec recuperer_code() :
314         *
315         * stocke des options :
316         * - fonctions : pour ajouter un fichier de fonction au squelette cree (on passe le contenu du fichier)
317         * - avant_code : pour inserer du contenu avant le code
318         * - apres_code : pour inserer du contenu apres le code
319         *
320         * @param array $options : param->valeur des options
321         * @param bool $merge  : les options se cumulent aux autres ? (ou viennent en remplacement)
322         * @return null;
323         */
324        function options_recuperer_code($options = array(), $merge=false) {
325                if ($merge) {
326                        $this->options_recuperer_code = array_merge($this->options_recuperer_code,$options);
327                } else {
328                        $this->options_recuperer_code = $options;
329                }
330        }
331
332        /**
333         * Recupere un array des erreurs de compilation
334         * @return array        Erreurs de compilations
335         */
336        function get_compilation_errors(){
337                $erreurs = $GLOBALS['tableau_des_erreurs'];
338                $GLOBALS['tableau_des_erreurs'] = array();
339                return $erreurs;
340        }
341       
342        /**
343         * Raz les erreurs de compilation
344         * @return null
345         */
346        function init_compilation_errors(){
347                // les erreurs s'ecrivent dans une jolie globale
348                $GLOBALS['tableau_des_erreurs'] = array();
349        }
350       
351        /**
352         * Retourne "<?php $code ?>"
353         * @param string $code  Code php
354         * @return string       Code php complet
355         */
356        function php($code){
357                return "<"."?php\n" . $code . "\n?".">";
358        }
359       
360        /**
361         * Ecrire un fichier a l'endroit indique
362         * Si le fichier existe, il n'est pas recree
363         * sauf en cas de var_mode=recalcul
364         *
365         * @param string $adresse       Adresse du fichier a ecrire
366         * @param string $contenu       Contenu du fichier
367         * @return null
368         */
369        function ecrire_fichier($adresse, $contenu){
370                if (!file_exists($adresse)
371                OR  $GLOBALS['var_mode']=='recalcul') {
372                        ecrire_fichier($adresse, $contenu);
373                }
374        }
375       
376}
377
378
379/**
380 * Gestion des exceptions
381 *
382 * Exception de type NA (Par exemple en generant des squelettes
383 *
384 */
385class SpipNaException extends Exception { 
386  // chaîne personnalisé représentant l'objet
387  public function __toString() {
388    return "{$this->message}\n";
389  }             
390}
391
392/**
393 * Gestion des exceptions
394 *
395 * Exceptions prevues dans les tests
396 *
397 */
398class SpipTestException extends Exception { 
399  // chaîne personnalisé représentant l'objet
400  public function __toString() {
401    return "{$this->message}\n";
402  }             
403}
404
405
406/**
407 * Extension de TestSuite
408 * pour donner le bon repertoire de travail
409 * et ajouter des fonctions specifiques a SPIP
410 */
411class SpipTestSuite extends TestSuite {
412        function SpipTestSuite($name = false){
413                chdir(_CHDIR);
414            if (!$name) {
415            $name = get_class($this);
416        }
417                $this->TestSuite($name);
418        }
419       
420        /**
421         * Ajoute tous les fichiers de tests
422         * d'un repertoire donne (ou du repertoire d'un fichier donne)
423         *
424         * @param string $dir : fichier ou repertoire qui sera scanne
425         * @param bool $recurs : inclure recursivement les dossiers ?
426         * @return null
427         */
428        function addDir($dir, $recurs = false){
429                if (is_file($dir))
430                        $dir = dirname($dir);
431                include_spip('inc/flock');
432                $a = preg_files($dir);
433                foreach ($a as $f) {
434                        $info = pathinfo($f);
435                        if (($info['extension']=='php') 
436                        AND !strpos($info['basename'], '_fonctions.php')
437                        AND !in_array($info['basename'], array(
438                                'lanceur_spip.php',
439                                'all_tests.php',
440                        ))) {
441                                $this->addFile($f);     
442                        }
443                }
444        }
445}
446
447
448
449/**
450 * Extension de HTMLReporter
451 * pour donner le bon repertoire de travail
452 * et ajouter des fonctions specifiques a SPIP
453 */
454class SpipHtmlReporter extends HtmlReporter {
455        var $_na;
456       
457        function SpipHtmlReporter($charset='UTF-8') {
458                chdir(_CHDIR);
459        $this->HtmlReporter($charset); 
460                $this->_na = 0;
461        }
462       
463        /**
464         * retourne un code css de deco
465         *
466         */
467        function _getCss() {
468                $css = parent::_getCss();
469                return $css . "\n.na{background-color: inherit; color: #fa0;}"
470                                        . "\n.complements{background-color: inherit; color: #999;}";
471        }
472       
473    /**
474     *    Paints the top of the web page setting the
475     *    title to the name of the starting test.
476     *    @param string $test_name      Name class of test.
477     *    @access public
478     */
479    function paintHeader($test_name) {
480                chdir(_CHDIR); // va savoir Charles... des fois il le perd en route ?
481                include_spip('inc/filtres_mini');
482        $this->sendNoCacheHeaders();
483        print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";
484        print "<html>\n<head>\n<title>$test_name</title>\n";
485        print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" .
486                $this->_character_set . "\">\n";
487        print "<style type=\"text/css\">\n";
488        print $this->_getCss() . "\n";
489        print "</style>\n";
490                print "<link rel='stylesheet' href='" . url_absolue(find_in_path('css/tests.css')) . "' type='text/css' />";
491        print "</head>\n<body>\n";
492               
493                print "<h1>Tests SPIP " . $this->version_spip() . "</h1>\n";
494        print "<h2>$test_name</h2>\n";
495        flush();       
496        }
497       
498    /**
499     *    Paints the end of the test with a summary of
500     *    the passes and failures.
501     *    @param string $test_name        Name class of test.
502     *    @access public
503     */
504    function paintFooter($test_name) {
505        $colour = ($this->getFailCount() + $this->getExceptionCount() > 0 ? "red" : ($this->getNaCount()>0 ? "#ffaa00" : "green"));
506               
507        print "<div style=\"";
508        print "padding: 8px; margin-top: 1em; background-color: $colour; color: white;";
509        print "\">";
510        print $this->getTestCaseProgress() . "/" . $this->getTestCaseCount();
511        print " test complete:\n";
512        print "<strong>" . $this->getPassCount() . "</strong> passes, ";
513        print "<strong>" . $this->getFailCount() . "</strong> fails, ";
514        print "<strong>" . $this->getExceptionCount() . "</strong> exceptions and ";
515        print "<strong>" . $this->getNaCount() . "</strong> non applicable.";
516        print "</div>\n";
517        print "</body>\n</html>\n";
518    }
519       
520        /**
521         * retourne le nombre de tests non applicables
522         * @return int  Nombre de tests non applicables
523         */
524        function getNaCount(){
525                return $this->_na;
526        }
527       
528    /**
529     *    Paints a PHP exception.
530     *    @param Exception $exception        Exception to display.
531     *    @access public
532     */
533    function paintException($exception) {
534                switch(get_class($exception)) {
535                        case 'SpipNaException':
536                                $this->paintNA($exception);
537                                break;
538                        case 'SpipTestException':
539                                $this->paintTestException($exception);
540                                break;
541                        default:
542                                parent::paintException($exception);
543                                break;
544                }
545    }
546       
547        /**
548         * Paints a Non Applicable Test
549         *
550     * @param Exception $exception    The actual exception thrown.
551     * @access public
552     */
553        function paintNa($exception) {
554                $this->_na++;
555               
556                print "<span class=\"na\">Non applicable</span>: ";
557                $breadcrumb = $this->getTestList();
558                array_shift($breadcrumb);
559                print implode(" -&gt; ", $breadcrumb);
560                $message = $exception->getMessage();
561                print " -&gt; <strong>" . $this->_htmlEntities($message) . "</strong><br />\n";                         
562        }
563       
564        /**
565         * Paints a Spip Test Exception
566         *
567     * @param Exception $exception    The actual exception thrown.
568     * @access public
569     */
570        function paintTestException($exception) {
571                $this->_exceptions++;
572               
573                print "<span class=\"fail\">Exception</span>: ";
574                $breadcrumb = $this->getTestList();
575                array_shift($breadcrumb);
576                print implode(" -&gt; ", $breadcrumb);
577                $message = $exception->getMessage();
578                print " -&gt; <strong>" . $this->_htmlEntities($message) . "</strong><br />\n";                         
579        }
580       
581       
582        function paintGroupStart($test_name, $size){
583                $test_name = str_replace(realpath(SpipTest::me()).'/','',$test_name);
584                parent::paintGroupStart($test_name, $size);
585                #echo "<ul><li><h3>$test_name</h3>\n";
586        }
587/*     
588        function paintGroupEnd($test_name){
589                parent::paintGroupEnd($test_name);
590                echo "</li></ul>\n";
591        }
592       
593        function paintCaseStart($test_name) {
594                parent::paintCaseStart($test_name);
595                echo "<ul><h3>$test_name</h3>\n";
596    }
597        function paintCaseEnd($test_name) {
598                parent::paintCaseEnd($test_name);
599                echo "</ul>\n";
600    }
601       
602        function paintMethodStart($test_name) {
603                parent::paintMethodStart($test_name);
604                echo "<li>$test_name</li>\n";
605    }
606        function paintMethodEnd($test_name) {
607                parent::paintMethodEnd($test_name);
608                parent::paintFooter($test_name);
609    }   
610*/             
611        /**
612         * Donne le nom de la version SPIP en cours
613         */
614        function version_spip() {
615                include_spip('inc/minipres');
616                $version = $GLOBALS['spip_version_affichee'];
617                if ($svn_revision = version_svn_courante(_DIR_RACINE)) {
618                        $version .= ' ' . (($svn_revision < 0) ? 'SVN ':'')
619                        . "[<a href='http://trac.rezo.net/trac/spip/changeset/"
620                        . abs($svn_revision) . "' onclick=\"window.open(this.href); return false;\">"
621                        . abs($svn_revision) . "</a>]";
622                }
623                return $version;
624        }
625}
626
627
628/**
629 * Extension de HTMLReporter
630 * pour donner le bon repertoire de travail
631 * et ajouter des fonctions specifiques a SPIP
632 */
633class SpipMiniHtmlReporter extends SpipHtmlReporter {
634        function SpipMiniHtmlReporter($charset='UTF-8') {
635                chdir(_CHDIR);
636        $this->SpipHtmlReporter($charset);
637        }
638       
639
640    /**
641     *    Paints the top of the web page setting the
642     *    title to the name of the starting test.
643     *    @param string $test_name      Name class of test.
644     *    @access public
645     */
646    function paintHeader($test_name) {
647                include_spip('inc/filtres_mini');
648        $this->sendNoCacheHeaders();
649        flush();       
650        }
651       
652       
653   /**
654     *    Paints the end of the test with a summary of
655     *    the passes and failures.
656     *    @param string $test_name        Name class of test.
657     *    @access public
658     */
659    function paintFooter($test_name) {
660        if ($this->getFailCount() + $this->getExceptionCount() == 0) {
661                        if ($this->getNaCount()) {
662                    print "OK <em>(".$this->getPassCount().")</em> but some NA <em>(".$this->getNaCount().")</em>\n";
663                        } else {
664                                print "OK <em>(".$this->getPassCount().")</em>\n";
665                        }
666        } else {
667            print "BOUM !!!\n";
668                        print "<span class='complements'>- Passes: " . $this->getPassCount() .
669                                        ", Failures: " . $this->getFailCount() .
670                                        ", Exceptions: " . $this->getExceptionCount() .
671                                        ", Non Applicable: " . $this->getNaCount() . "</span>\n";
672        }
673    }
674       
675       
676        /**
677         * Donne le nom de la version SPIP en cours
678         */
679        function version_spip() {
680                return SpipHtmlReporter::version_spip();
681        }
682       
683}
684
685/**
686 * Extension de TestReporter
687 * pour donner le bon repertoire de travail
688 * et ajouter des fonctions specifiques a SPIP
689 */
690class SpipTextReporter extends TextReporter {
691        function SpipTextReporter() {
692                chdir(_CHDIR);
693        $this->TextReporter(); 
694        }
695       
696   /**
697     *    Paints the end of the test with a summary of
698     *    the passes and failures.
699     *    @param string $test_name        Name class of test.
700     *    @access public
701     */
702    function paintFooter($test_name) {
703        if ($this->getFailCount() + $this->getExceptionCount() == 0) {
704                        if ($this->getNaCount()) {
705                    print "OK ($this->getPassCount()) but some NA ($this->getNaCount())\n";
706                        } else {
707                                print "OK ($this->getPassCount())\n";
708                        }
709        } else {
710            print "FAILURES!!!\n";
711                        print "Test cases run: " . $this->getTestCaseProgress() .
712                                        "/" . $this->getTestCaseCount() .
713                                        ", Passes: " . $this->getPassCount() .
714                                        ", Failures: " . $this->getFailCount() .
715                                        ", Exceptions: " . $this->getExceptionCount() .
716                                        ", Non Applicable: " . $this->getNaCount() . "\n";
717        }
718    }
719}
720
721
722class SqueletteTest{
723        var $title = "";
724        var $head = "";
725        var $body = "";
726       
727        /**
728         * Constructeur
729         * @param string $title         Donne un titre a la page
730         */
731        function SqueletteTest($title = ""){
732                $this->setTitle($title ? $title : "Squelette de test");
733        }
734       
735        /**
736         * Change le title
737         * @param string $title         Donne un titre a la page
738         * @return null
739         */
740        function setTitle($title){
741                $this->title = $title;
742        }
743       
744        /**
745         * Ajoute insert Head
746         * @return null
747         */
748        function addInsertHead(){
749                $this->head = "\n#INSERT_HEAD\n" . $this->head;
750        }
751       
752        /**
753         * Ajoute dans head
754         * @return null
755         */
756        function addToHead($content){
757                $this->head .= "\n" . $content;
758        }       
759       
760        /**
761         * Ajoute dans body
762         * @return null
763         */
764        function addToBody($content){
765                $this->body .= "\n" . $content;
766        }
767               
768        /**
769         * Retourne le code du squelette
770         */
771        function code(){
772                $code = '
773                        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
774                        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
775                        <head>
776                        <title>'. $this->title . '</title>
777                        ' . $this->head . '
778                        </head>
779                        <body class="page_test">
780                        ' . $this->body . '
781                        </body>
782                        </html>         
783                ';
784                return $code;
785        }
786}
787
788
789
790
791// si provient de la base des tests de spip,
792// on affiche simplement un 'OK : ..."
793
794if (_request('mode') == 'test_general') {
795        SimpleTest::prefer(new SpipTextReporter());
796        SimpleTest::prefer(new SpipMiniHtmlReporter());
797} else {
798        SimpleTest::prefer(new SpipHtmlReporter());
799}
800
801?>
Note: See TracBrowser for help on using the repository browser.