source: spip-zone/_core_/tests/test.inc @ 70462

Last change on this file since 70462 was 70462, checked in by marcimat@…, 7 years ago

des notices en moins pour PHP 5.4

File size: 4.8 KB
Line 
1<?php
2
3/*
4 * Ce fichier s'appelle depuis un test.php
5 * qui doit definir auparavant $test, et faire
6 * ensuite ses tests.
7 *
8 * Si tout est ok, le test doit afficher 'OK' et sortir
9 * Sinon du debug ou toute indication de la nuature de l'échec...
10 *
11 */
12// let's go spip
13define('_SPIP_TEST_INC', dirname(__FILE__));
14// si rien defini on va dans le public
15@define('_SPIP_TEST_CHDIR', dirname(_SPIP_TEST_INC));
16chdir(_SPIP_TEST_CHDIR);
17require dirname(_SPIP_TEST_INC) . '/ecrire/inc_version.php';
18
19if (!defined('_VAR_MODE')) {
20        define('_VAR_MODE', 'recalcul');
21}
22
23// pour notice sur recuperer_fond()
24if (!isset($GLOBALS['spip_lang'])) {
25        include_spip('inc/lang');
26        utiliser_langue_visiteur();
27}
28
29
30// vous devez theoriquement definir $test avant d'inclure ce script
31#spip_log('test ' . $test,'testrunner');
32$GLOBALS['taille_des_logs'] = 1024;
33$GLOBALS['compteur_essai'] = 0;
34
35// pas admin ? passe ton chemin (ce script est un vilain trou de securite)
36if ($visiteur_session['statut'] != '0minirezo'   and ( $_SERVER["REMOTE_ADDR"]!='127.0.0.1') )
37        die('pas admin !');
38/***
39* fonction pas obligatoire a utiliser mais qui simplifie la vie du testeur
40* $fun: le nom de la fonction a tester
41* $essais: un tableau d'items array(résultat, arg1, arg2 ...) a tester
42*  descriptif dans l'index "je teste ca"=>array(...)
43*  si pas d'index, "test {numero}" sera utilise
44* retourne un tableau de textes d'erreur dont le but est d'etre vide :)
45*/
46function tester_fun($fun, $essais, $opts = array())
47{
48        // pas d'erreur au depart
49        $err = array();
50
51        // let's go !
52        foreach ($essais as $titre => $ess) {
53                switch (count($ess)) {
54                        case 0: $res = null; break;
55                        case 1: $res = $fun(); break;
56                        case 2: $res = $fun($ess[1]); break;
57                        case 3: $res = $fun($ess[1], $ess[2]); break;
58                        case 4: $res = $fun($ess[1], $ess[2], $ess[3]); break;
59                        case 5: $res = $fun($ess[1], $ess[2], $ess[3], $ess[4]); break;
60                        default:
61                                $copy = $ess;
62                                array_shift($copy);
63                                $res = call_user_func_array($fun, $copy);
64                }
65                $ok = false;
66                #var_dump($res);
67                if (is_array($ess) and is_array($ess[0]) and isset($ess[0][0])
68                  && function_exists($ess[0][0]) && isset($ess[0][1]) && isset($ess[0][2])) {
69                        $ok = ($ess[0][0]($ess[0][1],$res)==$ess[0][2]);
70                } else {
71                        $ok =
72                          ( (is_array($res) AND is_array($ess[0]))?
73                                  (!count(array_diff_assoc_recursive($res,$ess[0]))
74                                    AND !count(array_diff_assoc_recursive($ess[0],$res)))
75                                  :
76                                                ( is_double($res)?(($res-$ess[0])<1e-10*abs($res)):$res === $ess[0]) );
77                }
78
79                spip_log('test ' . $GLOBALS['test']." : Essai ".$GLOBALS['compteur_essai']++.($ok?" ok":" ECHEC"),'testrunner');
80                if (!$ok) {
81                        $erritem_args = array();
82                        for ($iarg = 1; $iarg < count($ess); ++$iarg) {
83                                $erritem_args[] = htmlspecialchars(var_export($ess[$iarg], true));
84                        }
85                        $err[] = display_error(
86                          $titre,
87                                "$fun(". join($erritem_args,', ') . ")",
88                                $res,
89                                $ess[0],
90                                $opts
91                        );
92                }
93        }
94        return $err;
95}
96
97function display_error($titre,$call,$result,$expected,$opts=array()){
98        static $bef,$mid,$end;
99        if (!isset($bef)){
100                // options
101                foreach (array(
102                        'out' => '<dt>@</dt><dd>@</dd>'
103                ) as $opt => $def) {
104                        $$opt = isset($opts[$opt]) ? $opts[$opt] : $def;
105                }
106                // l'enrobage de sortie
107                list($bef, $mid, $end) = explode('@', $out);
108        }
109       
110        return
111          $bef
112          . (is_numeric($titre) ? "test $titre" : htmlspecialchars($titre))
113          . $mid
114          . "<pre>$call</pre>"
115                . '<pre>// resultat:' . htmlspecialchars(var_export($result, true))."</pre>"
116                . '<pre>// attendu :' . htmlspecialchars(var_export($expected, true))."</pre>"
117          . $end;
118}
119
120// pour essayer de calculer/montrer le temps qu'on y met
121register_shutdown_function('afficher_timer', time() + microtime());
122
123function afficher_timer($depart) {
124        echo sprintf(" %.2fs", time() + microtime() - $depart);
125}
126
127
128if (!function_exists('array_diff_assoc_recursive')) {
129// http://www.php.net/manual/fr/function.array-diff-assoc.php#73972
130function array_diff_assoc_recursive($array1, $array2)
131{
132    foreach($array1 as $key => $value)
133    {
134        if(is_array($value))
135        {
136              if(!isset($array2[$key]))
137              {
138                  $difference[$key] = $value;
139              }
140              elseif(!is_array($array2[$key]))
141              {
142                  $difference[$key] = $value;
143              }
144              else
145              {
146                  $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
147                  if ($new_diff !== array())
148                  {
149                        $difference[$key] = $new_diff;
150                  }
151              }
152          }
153          elseif(!isset($array2[$key]) || $array2[$key] != $value)
154          {
155              $difference[$key] = $value;
156          }
157    }
158    return !isset($difference) ? array() : $difference;
159}
160}
Note: See TracBrowser for help on using the repository browser.