Browse Source

Moved _plugins_/testbuilder_trunk to _plugins_/testbuilder/trunk.

svn/root/trunk
eric@smellup.net 4 years ago
commit
c7d06b33fd
  1. 26
      .gitattributes
  2. 1
      .gitignore
  3. 51
      action/tb_set_test_output.php
  4. 58
      formulaires/editer_test_unit.html
  5. 195
      formulaires/editer_test_unit.php
  6. BIN
      images/tb-128.png
  7. BIN
      images/tb-16.png
  8. BIN
      images/tb-24.png
  9. BIN
      images/tb-256.png
  10. BIN
      images/tb-32.png
  11. BIN
      images/tb-48.png
  12. BIN
      images/tb-64.png
  13. BIN
      images/tb-file-16.png
  14. BIN
      images/tb-folder-16.png
  15. 346
      inc/tb_essais_type.php
  16. 390
      inc/tb_lib.php
  17. 15
      lang/paquet-tb_fr.php
  18. 72
      lang/tb_fr.php
  19. 20
      paquet.xml
  20. 28
      plugin.xml
  21. 81
      prive/exec/testbuilder.html
  22. 66
      prive/exec/testbuilder_fonctions.php
  23. 31
      prive/style_prive_plugin_tb.html
  24. BIN
      prive/themes/spip/images/tb-16.png
  25. 41
      templates/function.php
  26. 88
      tests/tb_dirs.php
  27. 79
      tests/tb_export.php
  28. 57
      tests/tb_files.php

26
.gitattributes

@ -0,0 +1,26 @@
* text=auto !eol
action/tb_set_test_output.php -text
formulaires/editer_test_unit.html -text
formulaires/editer_test_unit.php -text
images/tb-128.png -text
images/tb-16.png -text
images/tb-24.png -text
images/tb-256.png -text
images/tb-32.png -text
images/tb-48.png -text
images/tb-64.png -text
images/tb-file-16.png -text
images/tb-folder-16.png -text
inc/tb_essais_type.php -text
inc/tb_lib.php -text
lang/paquet-tb_fr.php -text
lang/tb_fr.php -text
/plugin.xml -text
prive/exec/testbuilder.html -text
prive/exec/testbuilder_fonctions.php -text
prive/style_prive_plugin_tb.html -text
prive/themes/spip/images/tb-16.png -text
templates/function.php -text
tests/tb_dirs.php -text
tests/tb_export.php -text
tests/tb_files.php -text

1
.gitignore

@ -0,0 +1 @@
tests/.ok

51
action/tb_set_test_output.php

@ -0,0 +1,51 @@
<?php
/*
* Plugin TestBuilder
* (c) 2010 Cedric MORIN Yterium
* Distribue sous licence GPL
*
*/
/**
* Lit un fichier de test, rejoue le jeu d'essai
* et initialisie la sortie attendue pour les essais qui le necessitent
*
* Le jeu d'essai est joue entierement dans l'ordre pour permettre des tests
* reposant sur la memorisation et dont le resultat peut changer entre 2 appels
* avec arguments identiques
*
* @param string $arg
*
*/
function action_tb_set_test_output_dist($arg=null){
if (is_null($arg)){
$arg = _request('arg');
$hash = _request('hash');
include_spip('inc/securiser_action');
if (!verifier_cle_action($arg, $hash))
die("nothing to do");
}
include_spip('inc/tb_lib');
$arg = explode('|',$arg);
$filename = array_shift($arg);
$funcname = array_shift($arg);
$filetest = array_shift($arg);
// recuperer le jeu d'essai deja prepare par le formulaire
$essais = tb_test_essais($funcname,$filetest);
foreach($essais as $k=>$e){
$args = $e;
array_shift($args);
$res = tb_try_essai($filename,$funcname,$args,$output_test);
if (reset($e)==="??TBD??"){
array_unshift($args, $res);
$essais[$k] = $args;
}
}
tb_filter_essais($essais);
tb_test_essais($funcname,$filetest,$essais);
var_export($essais);
}
?>

58
formulaires/editer_test_unit.html

@ -0,0 +1,58 @@
[(#REM)
Squelette
(c) 2009 testbuilder
Distribue sous licence GPL
]
<div class='formulaire_spip formulaire_editer formulaire_#FORM'>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
<ul>
<BOUCLE_args(POUR){tableau #ENV{_args}}>
<li class="editer_arg editer_arg_#CLE [ (#ENV**{erreurs}|table_valeur{args_#CLE}|oui)erreur]">
<label for="arg_#CLE"><tt>#VALEUR</tt>
<br />
<a href="#" onclick="jQuery('#arg_#CLE').attr('id','zzz').after('<textarea name=\'args[]\' id=\'arg_#CLE\'></textarea>');jQuery('#arg_#CLE').val(jQuery('#zzz').attr('value'));jQuery('#zzz').remove();jQuery(this).hide();return false;">textarea</a>
</label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{args_#CLE})</span>]
[(#ENV**{args}|table_valeur{#CLE}|match{\n}|?{
<textarea name='args&#91;&#93;' class='text' id='arg_#CLE'>[(#ENV**{args}|table_valeur{#CLE})]</textarea>
,
<input type="text" name='args&#91;&#93;' class='text' id='arg_#CLE' value='[(#ENV**{args}|table_valeur{#CLE})]' />}
)]
</li>
</BOUCLE_args>
<li class="editer_resultat [ (#ENV**{erreurs}|table_valeur{resultat}|oui)erreur]">
<label for="resultat"><:tb:label_resultat_essai:>
<br />
<a href="#" onclick="jQuery('#resultat').attr('id','zzz').after('<textarea name=\'resultat\' id=\'resultat\'></textarea>');jQuery('#resultat').val(jQuery('#zzz').attr('value'));jQuery('#zzz').remove();jQuery(this).hide();return false;">textarea</a>
</label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{resultat})</span>]
[(#ENV**{resultat}|match{\n}|?{
<textarea name='resultat' class='text' id='resultat'>[(#ENV**{resultat})]</textarea>
,
<input type="text" name='resultat' class='text' id='resultat' value='[(#ENV**{resultat})]' />
})]
</li>
</ul>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons">
<input type='submit' class='submit' name="tester" value='<:tb:bouton_tester:>' />
<input type='submit' class='submit' name="combi" value='<:tb:bouton_combinatoire:>' />
<input type='submit' class='submit' name="enregistrer" value='[(#ENV{_modif_essai,-1}|>{-1}|?{<:bouton_modifier:>,<:bouton_ajouter:>})]' /></p>
<div class="essais" style="padding:10px;border-bottom:1px solid #eee;">
[<div style="float:right">(#ENV{_filetest,''}|tb_url_test{<tt>[(#ENV{_filetest,''}|basename)]</tt>})</div>]
[<input type='submit' class='submit' name="supprimer_tous" value='<:tb:bouton_supprimer_tous:>' />
<input type='submit' class='submit' name="recalculer_tous" value='<:tb:bouton_recalculer_tous:>' />
(#ENV{_essais}|tb_affiche_essais{#ENV{_funcname},#ENV{_modif_essai}})]
<br class="nettoyeur" />
</div>
</div></form>
</div>

195
formulaires/editer_test_unit.php

@ -0,0 +1,195 @@
<?php
/*
* Plugin TestBuilder
* (c) 2010 Cedric MORIN Yterium
* Distribue sous licence GPL
*
*/
include_spip('inc/tb_lib');
function formulaires_editer_test_unit_charger_dist($filename,$funcname){
$valeurs = array(
'essais'=>array(),
'_args'=>array(),
'args'=>array(),
'resultat'=>'',
'_filename'=>$filename,
'_funcname'=>$funcname,
'_filetest'=>'',
);
$funcs = tb_liste_fonctions($filename);
// la liste des arguments de la fonction
$valeurs['_args'] = reset($funcs[$funcname]);
// les valeurs saisies pour chaque argument
$valeurs['args'] = array();
// recuperer les tests precedents si possible
if ($filetest=tb_hastest($funcname,true)){
$valeurs['_essais'] = tb_test_essais($funcname,$filetest);
$valeurs['_hidden'] = "<input type='hidden' name='ctrl_essais' value='".md5(serialize($valeurs['essais']))."' />";
$valeurs['_filetest'] = $filetest;
}
// regarder si un demande a modifier un jeu d'essai
$modif = -1;
if (!empty($valeurs['_essais'])){
foreach($valeurs['_essais'] as $k=>$t)
if (_request("modif_$k")){
set_request('args'); // effacer la saisie
set_request('resultat'); // effacer la saisie
$valeurs['args'] = $t;
$valeurs['resultat'] = var_export(array_shift($valeurs['args']),'true');
$valeurs['args'] = array_map('tb_export',$valeurs['args']);
$modif = $k;
continue;
}
}
if ($modif>=0 OR $modif=_request('modif_essai')){
$valeurs['_hidden'] .= "<input type='hidden' name='modif_essai' value='$modif' />";
$valeurs['_modif_essai'] = $modif;
}
return $valeurs;
}
function formulaires_editer_test_unit_verifier_dist($filename,$funcname){
$erreurs = array();
$args = _request('args');
// enlever les arguments vide de fin (facultatifs)
while (count($args) AND !strlen(end($args)))
array_pop($args);
// verifier qu'un args n'est pas vide au milieu
foreach($args as $k=>$v)
if (!strlen($v))
$erreurs["args_$k"]=_T("tb:erreur_argument_vide");
set_request('args',$args);
#var_dump($args);
if (_request('combi')){
if (!count($args))
$erreurs['message_erreur'] = _T("tb:erreur_test_combinatoire_types_requis");
else {
#$tb_essais_type = charger_fonction('tb_essais_type','inc');
#foreach($args as $k=>$type)
# if (!count($tb_essais_type($type)))
# $erreurs["args_$k"]=_T("tb:erreur_pseudo_type_inconnu");
}
if (_request('resultat')){
$erreurs['resultat'] = _T("tb:erreur_test_combinatoire_resultat_ignore");
}
}
// demande de test sur un jeu d'essai
if (!count($erreurs) AND _request('tester')){
$args = eval("return array(".implode(', ',$args).");");
$test = tb_try_essai($filename,$funcname,$args,$output_test);
if ($res=_request('resultat') AND $test===eval("return $res;"))
$erreurs['message_ok'] = $output_test;
else
$erreurs['message_erreur'] = $output_test;
if (!$res)
set_request('resultat',var_export($test,true));
}
return $erreurs;
}
function formulaires_editer_test_unit_traiter_dist($filename,$funcname){
if (!$filetest=tb_hastest($funcname))
$filetest = tb_generate_new_blank_test($filename,$funcname);
$message_ok = "";
$message_echec = "";
$essais = tb_test_essais($funcname,$filetest);
if (_request('enregistrer')){
$args = _request('args');
$res = _request('resultat');
array_unshift($args,$res?$res:"'??TBD??'");
$essai = eval("return array(".implode(', ',$args).");");
if ($essai){
if (!is_null($m=_request('modif_essai'))){
$essais[$m] = $essai;
set_request('modif_essai');
} else
$essais[] = $essai;
tb_test_essais($funcname,$filetest,$essais);
if (!$res)
tb_refresh_test($filename,$funcname,$filetest);
}
set_request('args');
set_request('resultat');
$message_ok = _T('tb:ok_test_ajoute');
}
elseif(_request('combi')){
$args = _request('args');
$argss = tb_essai_combinatoire($args);
foreach($argss as $args){
array_unshift($args, "??TBD??");
$essais[] = $args;
}
tb_test_essais($funcname,$filetest,$essais);
tb_refresh_test($filename,$funcname,$filetest);
set_request('args',array());
$message_ok = _T("tb:ok_n_tests_combi_crees",array('nb'=>count($argss)));
}
elseif(_request('recalculer_tous')){
foreach($essais as $k=>$e){
array_shift($e);
array_unshift($e, '??TBD??');
$essais[$k] = $e;
}
tb_test_essais($funcname,$filetest,$essais);
if (tb_refresh_test($filename,$funcname,$filetest)){
set_request('args');
set_request('resultat');
$message_ok = _T('tb:ok_test_recalcules');
}
else
$message_echec = _T('tb:echec');
}
elseif(_request('supprimer_tous')){
tb_test_essais($funcname,$filetest,array());
set_request('args',array());
$message_ok = _T('tb:ok_tests_supprimes');
}
else {
$save = false;
foreach($essais as $k=>$t)
if (_request("del_$k")){
unset($essais[$k]);
$save = true;
set_request('modif_essai','');
}
if ($save){
tb_test_essais($funcname,$filetest,$essais);
$message_ok = _T("tb:ok_test_supprime");
}
}
return
$message_echec ?
array('message_erreur'=>$message_echec,'fichier_test'=>$filetest,'editable'=>true)
: array('message_ok'=>$message_ok,'fichier_test'=>$filetest,'editable'=>true);
}
function tb_affiche_essais($essais,$funcname,$expose=null){
$output = "";
if (is_array($essais) AND count($essais)){
foreach($essais as $k=>$essai){
$res = array_shift($essai);
$affiche = "$funcname(".implode(',',array_map('tb_export',$essai)).") = ".tb_export($res);
$affiche = str_replace(array('&','<','>'),array('&amp;','&lt;','&gt;'),$affiche);
$on = (!is_null($expose) AND $expose==$k)?' on':'';
$output .= "<li class='item$on'>"
."<input type='submit' class='submit del' name='del_$k' value='X' />"
." <code>$affiche</code>"
." <input type='submit' class='submit modif' name='modif_$k' value='Modif' />"
."</li>";
}
$output = "<h3>"
. singulier_ou_pluriel(count($essais), 'tb:un_essai', 'tb:nb_essais')
. "</h3><ol start='0' class='liste-items essais'>$output</ul>";
}
//var_dump($output);
return $output;
}
?>

BIN
images/tb-128.png

After

Width: 128  |  Height: 128  |  Size: 19 KiB

BIN
images/tb-16.png

After

Width: 16  |  Height: 16  |  Size: 1.2 KiB

BIN
images/tb-24.png

After

Width: 24  |  Height: 24  |  Size: 1.7 KiB

BIN
images/tb-256.png

After

Width: 256  |  Height: 256  |  Size: 62 KiB

BIN
images/tb-32.png

After

Width: 32  |  Height: 32  |  Size: 2.5 KiB

BIN
images/tb-48.png

After

Width: 48  |  Height: 48  |  Size: 4.5 KiB

BIN
images/tb-64.png

After

Width: 64  |  Height: 64  |  Size: 6.7 KiB

BIN
images/tb-file-16.png

After

Width: 16  |  Height: 16  |  Size: 626 B

BIN
images/tb-folder-16.png

After

Width: 16  |  Height: 16  |  Size: 407 B

346
inc/tb_essais_type.php

@ -0,0 +1,346 @@
<?php
/*
* Plugin TestBuilder
* (c) 2010 Cedric MORIN Yterium
* Distribue sous licence GPL
*
*/
/**
* Definir des jeu de valeurs test par type d'argument
* @param string $type
* @return array
*/
function inc_tb_essais_type_dist($type){
$jeu = array();
switch ($type){
case 'bool':
$jeu = array(true,false);
break;
case 'string':
$jeu = array(
'',
'0',
'Un texte avec des <a href="http://spip.net">liens</a> [Article 1->art1] [spip->https://www.spip.net] https://www.spip.net',
'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot;',
'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot;',
'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot;',
'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot;',
'Un texte sans entites &<>"\'',
'{{{Des raccourcis}}} {italique} {{gras}} <code>du code</code>',
'Un modele <modeleinexistant|lien=[->https://www.spip.net]>',
"Un texte avec des retour
a la ligne et meme des
paragraphes",
);
break;
case 'iso-string':
$jeu = array(
'',
'0',
'Un texte avec des <a href="http://spip.net">liens avec des accents ISO aàâä eéèêë iîï oô uùü</a> [Article 1 avec des accents ISO aàâä eéèêë iîï oô uùü->art1] [spip avec des accents ISO aàâä eéèêë iîï oô uùü->https://www.spip.net] https://www.spip.net',
'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot; et avec des accents ISO aàâä eéèêë iîï oô uùü',
'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot; et avec des accents ISO aàâä eéèêë iîï oô uùü',
'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot; et avec des accents ISO aàâä eéèêë iîï oô uùü',
'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot; et avec des accents ISO aàâä eéèêë iîï oô uùü',
'Un texte sans entites &<>"\' et avec des accents ISO aàâä eéèêë iîï oô uùü',
'{{{Des raccourcis avec des accents ISO aàâä eéèêë iîï oô uùü}}} {italique avec des accents ISO aàâä eéèêë iîï oô uùü} {{gras avec des accents ISO aàâä eéèêë iîï oô uùü}} <code>du code avec des accents ISO aàâä eéèêë iîï oô uùü</code>',
'Un modele avec des accents ISO aàâä eéèêë iîï oô uùü <modeleinexistant|lien=[avec des accents ISO aàâä eéèêë iîï oô uùü->https://www.spip.net]>',
"Un texte avec des retour
a la ligne et meme des
paragraphes avec des accents ISO aàâä eéèêë iîï uùü",
);
break;
case 'utf8-string':
$jeu = array(
'',
'0',
'Un texte avec des <a href="http://spip.net">liens avec des accents UTF-8 aàâä eéèêë iîï oô uùü</a> [Article 1 avec des accents UTF-8 aàâä eéèêë iîï oô uùü->art1] [spip avec des accents UTF-8 aàâä eéèêë iîï oô uùü->https://www.spip.net] https://www.spip.net',
'Un texte avec des entit&eacute;s &amp;&lt;&gt;&quot; et avec des accents UTF-8 aàâä eéèêë iîï oô uùü',
'Un texte avec des entit&amp;eacute;s echap&amp;eacute; &amp;amp;&amp;lt;&amp;gt;&amp;quot; et avec des accents UTF-8 aàâä eéèêë iîï oô uùü',
'Un texte avec des entit&#233;s num&#233;riques &#38;&#60;&#62;&quot; et avec des accents UTF-8 aàâä eéèêë iîï oô uùü',
'Un texte avec des entit&amp;#233;s num&amp;#233;riques echap&amp;#233;es &amp;#38;&amp;#60;&amp;#62;&amp;quot; et avec des accents UTF-8 aàâä eéèêë iîï oô uùü',
'Un texte sans entites &<>"\' et avec des accents UTF-8 aàâä eéèêë iîï oô uùü',
'{{{Des raccourcis avec des accents UTF-8 aàâä eéèêë iîï oô uùü}}} {italique avec des accents UTF-8 aàâä eéèêë iîï oô uùü} {{gras avec des accents UTF-8 aàâä eéèêë iîï oô uùü}} <code>du code avec des accents UTF-8 aàâä eéèêë iîï oô uùü</code>',
'Un modele avec des accents UTF-8 aàâä eéèêë iîï oô uùü <modeleinexistant|lien=[avec des accents UTF-8 aàâä eéèêë iîï oô uùü->https://www.spip.net]>',
"Un texte avec des retour
a la ligne et meme des
paragraphes avec des accents UTF-8 aàâä eéèêë iîï oô uùü",
);
break;
case 'email':
$jeu = array(
'jean',
'jean@mapetiteentreprise.org',
'jean.dujardin@mapetiteentreprise.org',
'jean-dujardin@mapetiteentreprise.org',
'jean@dujardin.name',
);
break;
case 'date':
$jeu = array(
"2001-00-00 12:33:44",
"2001-03-00 09:12:57",
"2001-02-29 14:12:33",
"0000-00-00",
"0001-01-01",
"1970-01-01"
);
$t = inc_tb_essais_type_dist('time');
foreach($t as $d)
$jeu[] = date('Y-m-d H:i:s',$d);
foreach($t as $d)
$jeu[] = date('Y-m-d',$d);
foreach($t as $d)
$jeu[] = date('Y/m/d',$d);
foreach($t as $d)
$jeu[] = date('d/m/Y',$d);
break;
case 'time':
$jeu = array_map('strtotime',array(
"2001-07-05 18:25:24",
"2001-01-01 00:00:00",
"2001-12-31 23:59:59",
"2001-02-29 14:12:33",
"2004-02-29 14:12:33",
"2012-03-20 12:00:00",
"2012-03-21 12:00:00",
"2012-03-22 12:00:00",
"2012-06-20 12:00:00",
"2012-06-21 12:00:00",
"2012-06-22 12:00:00",
"2012-09-20 12:00:00",
"2012-09-21 12:00:00",
"2012-09-22 12:00:00",
"2012-12-20 12:00:00",
"2012-12-21 12:00:00",
"2012-12-22 12:00:00")
);
break;
case 'int':
$jeu = array(
0,
-1,
1,
2,
3,
4,
5,
6,
7,
10,
20,
30,
50,
100,
1000,
10000
);
break;
case 'int8':
$jeu = array(
0,
7,
15,
63,
127,
191,
255,
);
break;
case 'float01':
$jeu = array(
0.0,
0.25,
0.5,
0.75,
1.0,
);
break;
case 'array':
$jeu = array(
array(),
inc_tb_essais_type_dist('string'),
inc_tb_essais_type_dist('int'),
inc_tb_essais_type_dist('bool'),
);
$jeu[] = $jeu; // et un array d'array
break;
case 'image':
$jeu = array(
'https://www.spip.net/squelettes/img/spip.png',
'prive/images/logo_spip.jpg',
'prive/images/logo-spip.gif',
'prive/aide_body.css',
'prive/images/searching.gif',
);
break;
case 'mimetype':
$jeu = array(
// Images reconnues par PHP
'jpg'=>'image/jpeg',
'png'=>'image/png',
'gif'=>'image/gif',
// Autres images (peuvent utiliser le tag <img>)
'bmp'=>'image/x-ms-bmp', // pas enregistre par IANA, variante: image/bmp
'tif'=>'image/tiff',
// Multimedia (peuvent utiliser le tag <embed>)
'aiff'=>'audio/x-aiff',
'asf'=>'video/x-ms-asf',
'avi'=>'video/x-msvideo',
'anx'=>'application/annodex',
'axa'=>'audio/annodex',
'axv'=>'video/annodex',
'dv'=> 'video/x-dv',
'flac' => 'audio/x-flac',
'flv' => 'video/x-flv',
'm4a' => 'audio/mp4a-latm',
'm4b' => 'audio/mp4a-latm',
'm4p' => 'audio/mp4a-latm',
'm4u' => 'video/vnd.mpegurl',
'm4v' => 'video/x-m4v',
'mid'=>'audio/midi',
'mka' => 'audio/mka',
'mkv' => 'video/mkv',
'mng'=>'video/x-mng',
'mov'=>'video/quicktime',
'mp3'=>'audio/mpeg',
'mp4' => 'application/mp4',
'mpg'=>'video/mpeg',
'oga' => 'audio/ogg',
'ogg' => 'audio/ogg ',
'ogv' => 'video/ogg ',
'ogx' => 'application/ogg ',
'qt' =>'video/quicktime',
'ra' =>'audio/x-pn-realaudio',
'ram'=>'audio/x-pn-realaudio',
'rm' =>'audio/x-pn-realaudio',
'spx' => 'audio/ogg',
'svg'=>'image/svg+xml',
'swf'=>'application/x-shockwave-flash',
'wav'=>'audio/x-wav',
'wmv'=>'video/x-ms-wmv',
'3gp'=>'video/3gpp',
// Documents varies
'ai' =>'application/illustrator',
'abw' =>'application/abiword',
'bin' => 'application/octet-stream', # le tout-venant
'blend' => 'application/x-blender',
'bz2'=>'application/x-bzip2',
'c' =>'text/x-csrc',
'css'=>'text/css',
'csv'=>'text/csv',
'deb'=>'application/x-debian-package',
'doc'=>'application/msword',
'djvu'=>'image/vnd.djvu',
'dvi'=>'application/x-dvi',
'eps'=>'application/postscript',
'gz' =>'application/x-gzip',
'h' =>'text/x-chdr',
'html'=>'text/html',
'kml'=>'application/vnd.google-earth.kml+xml',
'kmz'=>'application/vnd.google-earth.kmz',
'pas'=>'text/x-pascal',
'pdf'=>'application/pdf',
'pgn' =>'application/x-chess-pgn',
'ppt'=>'application/vnd.ms-powerpoint',
'ps' =>'application/postscript',
'psd'=>'image/x-photoshop', // pas enregistre par IANA
'rpm'=>'application/x-redhat-package-manager',
'rtf'=>'application/rtf',
'sdd'=>'application/vnd.stardivision.impress',
'sdw'=>'application/vnd.stardivision.writer',
'sit'=>'application/x-stuffit',
'sxc'=>'application/vnd.sun.xml.calc',
'sxi'=>'application/vnd.sun.xml.impress',
'sxw'=>'application/vnd.sun.xml.writer',
'tex'=>'text/x-tex',
'tgz'=>'application/x-gtar',
'torrent' => 'application/x-bittorrent',
'ttf'=>'application/x-font-ttf',
'txt'=>'text/plain',
'xcf'=>'application/x-xcf',
'xls'=>'application/vnd.ms-excel',
'xspf'=>'application/xspf+xml',
'xml'=>'application/xml',
'zip'=>'application/zip',
// Open Document format
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
'odp' => 'application/vnd.oasis.opendocument.presentation',
'odg' => 'application/vnd.oasis.opendocument.graphics',
'odc' => 'application/vnd.oasis.opendocument.chart',
'odf' => 'application/vnd.oasis.opendocument.formula',
'odb' => 'application/vnd.oasis.opendocument.database',
'odi' => 'application/vnd.oasis.opendocument.image',
'odm' => 'application/vnd.oasis.opendocument.text-master',
'ott' => 'application/vnd.oasis.opendocument.text-template',
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
'cls'=>'text/x-tex',
'sty'=>'text/x-tex',
// Open XML File Formats
'docm' => 'application/vnd.ms-word.document.macroEnabled.12',
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'
);
return $jeu;
break;
case 'version':
$jeu = array(
"2",
"2.0",
"2.0.0",
"2.0.0dev",
"2.0.0alpha",
"2.0.0beta",
"2.0.0rc",
"2.0.0#",
"2.0.0pl",
"2.0.1"
);
return $jeu;
case 'operateur':
$jeu = array(
"<",
">",
"=",
"<=",
">="
);
return $jeu;
break;
}
return $jeu;
}
?>

390
inc/tb_lib.php

@ -0,0 +1,390 @@
<?php
/*
* Plugin TestBuilder
* (c) 2010 Cedric MORIN Yterium
* Distribue sous licence GPL
*
*/
/**
* Analyse un fichier source php
* et ressort la liste des fonctions nommes et pour chacune la liste de ses arguments
*
* @param string $filename
* @return array
*/
function tb_liste_fonctions($filename, $clear = false){
static $funcs=array();
$filename = find_in_path($filename);
if (!$filename) return array();
if ($clear){
unset($funcs[$filename]);
}
if (isset($funcs[$filename]))
return $funcs[$filename];
// cache file ?
$cache_func = sous_repertoire(_DIR_CACHE,"functions")."f".md5($filename).".txt";
if ($clear) {
spip_unlink($cache_func);
return array();
}
if (file_exists($cache_func)
AND @filemtime($cache_func)>@filemtime($filename)
AND lire_fichier($cache_func, $cache)
AND $cache = unserialize($cache))
return $funcs[$filename] = $cache;
lire_fichier($filename,$content);
if (!trim($content)) return $funcs[$filename] = array();
$tokens = token_get_all($content);
$funcs = array();
$previous_token_line = 0;
$func_name = "";
while (count($tokens)){
$t = array_shift($tokens);
if (is_string($t) AND $t=='}')
$previous_token_line=0;
if (!is_string($t) AND $previous_token_line==0)
$previous_token_line = $t[2];
if (!is_string($t) AND in_array($t[0],array(T_INCLUDE,T_INCLUDE_ONCE,T_STRING,T_ECHO)))
$previous_token_line=0;
#if (!is_string($t)) echo token_name($t[0]).":".$t[1].":".$t[2]."<br />";
if ($t[0]==T_FUNCTION){
#die();
// si on avait trouve une fonction auparavant, lui affecter la ligne de fin
if ($func_name AND $funcs[$filename][$func_name])
$funcs[$filename][$func_name][3] = $previous_token_line-1;
while (count($tokens) AND $t[0]!==T_STRING) $t = array_shift($tokens);
$func_line = $t[2];
$func_name = $t[1];
$func_args = array();
$open_token = 0;
while (count($tokens) AND $t!=='(') $t = array_shift($tokens);
$open_token++;
while (count($tokens) AND $open_token){
$t = array_shift($tokens);
if ($t==')') $open_token--;
elseif ($t=='(') $open_token++;
else if ($t[0]==T_VARIABLE){
$arg = $arg_aff = $t[1];
$func_args[] = $arg;
}
}
$funcs[$filename][$func_name] = array($func_args,$func_line,min($previous_token_line+1,$func_line),$func_line+10);
}
}
if ($func_name AND $funcs[$filename][$func_name])
$funcs[$filename][$func_name][3] = $previous_token_line;
ecrire_fichier($cache_func, serialize($funcs[$filename]));
return $funcs[$filename];
}
/**
* Lister les repertoires de test dispo
*
* @return array()
*/
function tb_liste_dirs_tests(){
$bases = array(_DIR_RACINE . 'tests/unit/');
foreach (creer_chemin() as $d) {
if ($d && @is_dir("${d}tests"))
$bases[] = "${d}tests/";
}
return $bases;
}
/**
* Lister les tests dispos
*
* @return array()
*/
function tb_liste_tests(){
$liste_tests = array();
$bases = tb_liste_dirs_tests();
foreach ($bases as $base) {
// regarder tous les tests
$tests = preg_files($base, '/\w+/.*\.(php|html)$');
foreach ($tests as $test) {
//ignorer le contenu du jeu de squelettes dédié aux tests
if (stristr($test,'squelettes'))
continue;
//ignorer les fichiers lanceurs pour simpleTests aux tests
if (stristr($test,'lanceur_spip.php'))
continue;
if (stristr($test,'all_tests.php'))
continue;
if (substr(basename($test),0,7) != 'inclus_' &&
substr(basename($test),-14) != '_fonctions.php'){
$joli = basename($test);
$liste_tests[$joli] = $test;
}
}
}
return $liste_tests;
}
/**
* Trouver si une fonction a un test
* et retourne le chemin du test
*
* @staticvar array $tests
* @param string $funcname
* @return tring
*/
function tb_hastest($funcname, $force=false){
static $tests = null;
if (is_null($tests) OR $force)
$tests = tb_liste_tests();
if (isset($tests["$funcname.php"]))
return $tests["$funcname.php"];
/*if (isset($tests["$funcname.html"]))
return $tests["$funcname.html"];*/
return '';
}
/**
* Url du test
*
* @param <type> $testfun
* @param <type> $lien
* @return <type>
*/
function tb_url_test($testfun, $lien=false){
if (!$testfun) return "";
if (preg_match(',\.php$,', $testfun))
$url = $testfun .'?mode=test_general';
else{
$testfun = substr($testfun,strlen(_DIR_RACINE."tests/"));
$url = _DIR_RACINE."tests/squel.php?test=$testfun&amp;var_mode=recalcul";
}
if (!$lien)
return $url;
return "<a href='$url'>$lien</a>";
}
/**
* Extraire une fonction php d'un script
*
* @param string $filename
* @param strinf $funcname
* @return string
*/
function tb_function_extract($filename,$funcname){
$liste = tb_liste_fonctions($filename);
if (!isset($liste[$funcname]))
return "";
$func = $liste[$funcname];
$start = $func[2];
$length = $func[3]-$start+1;
lire_fichier(find_in_path($filename),$content);
$content = explode("\n",$content);
$content = array_slice($content, $start,$length);
return trim(implode("\n",$content));
}
/**
* Generer un nouveau test vierge
* pour la fonction $funcname, du fichier $filename
*
* @param <type> $filename
* @param <type> $funcname
* @param <type> $essais
*/
function tb_generate_new_blank_test($filename,$funcname){
lire_fichier(find_in_path("templates/function.php"),$template);
$template = str_replace(
array('@funcname@','@essais_funcname@','@filename@','@date@'),
array($funcname,"essais_$funcname",$filename,date('Y-m-d H:i')),
$template
);
$d="";
$plugins_dist = defined('_DIR_PLUGINS_DIST')?_DIR_PLUGINS_DIST:_DIR_EXTENSIONS;
if (strcmp($filename,_DIR_PLUGINS)==0
OR strcmp($filename,$plugins_dist)==0){
// trouver le repertoire du plugin en remontant jusqu'a retrouver plugin.xml
$d = dirname($filename);
while(!file_exists("$d/plugin.xml") AND strlen($d)>strlen(_DIR_PLUGINS))
$d = dirname($d);
if (strlen($d)>strlen(_DIR_PLUGINS))
$d = sous_repertoire("$d/","tests");
else
$d="";
}
if (!$d)
$d = sous_repertoire(_DIR_RACINE."tests/unit/",basename($filename,'.php'));
ecrire_fichier($f="$d/$funcname.php",$template);
return $f;
}
/**
* Lit un fichier de test existant et recupere le jeu d'essai qu'il contient
* si un nouveau jeu d'essai est fourni, il remplace l'ancien
* et le fichier est mis a jour
*
* @param string $filetest
* @param array $essais_new
*/
function tb_test_essais($funcname,$filetest,$essais_new=null){
$function = tb_function_extract($filetest,"essais_$funcname");
if (is_array($essais_new)
AND $l=lire_fichier($filetest, $contenu)){
// renumeroter
$re = array();
while(count($essais_new))
$re[] = array_shift($essais_new);
$new_func = "function essais_$funcname(){
\$essais = ".var_export($re,true).";
return \$essais;
}
";
if (strlen($function))
$contenu = str_replace($function, $new_func, $contenu);
else
$contenu = str_replace("?>", "$new_func\n?>", $contenu);
ecrire_fichier($filetest, $contenu);
// purger la liste de fonctions de ce fichier
tb_liste_fonctions($filetest, true);
return $essais_new;
$function = $new_func;
}
if (!$function) return array();
$tst = "essais"; $i=0;
while (function_exists("$tst$i")) $i++;
$function = str_replace("function essais_$funcname"."(","function $tst$i"."(",$function);
$function .= " return $tst$i();";
return eval($function);
}
/**
* Recalculer le resultat des tests
* pour cela on passe par un hit public car les tests
* se deroulent dans le public
*
* @param $filename
* @param $funcname
* @param $filetest
* @return void
*/
function tb_refresh_test($filename,$funcname,$filetest){
include_spip('inc/securiser_action');
$arg = "$filename|$funcname|".substr($filetest,strlen(_DIR_RACINE));
$hash = calculer_cle_action($arg);
$url = generer_url_action("tb_set_test_output", "arg=$arg&hash=$hash",true,true);
#var_dump($url);
include_spip("inc/distant");
if (recuperer_page($url)) return true;
return false;
}
function tb_error_handler($output)
{
$error = error_get_last();
$output = "";
foreach ($error as $info => $string)
$output .= "{$info}: {$string}<br />";
return $output;
}
/**
* Mapping de var_export pour utiliser dans array_map()
*
* @param string $var
* @return mixed
*/
function tb_export($var){
return var_export($var,true);
}
/**
* Filtrer un jeu d'essais en enlevant les doublons (meme arg, meme resultat)
*
* @param array $essais
*/
function tb_filter_essais(&$essais){
$t = array();
foreach($essais as $k=>$v){
$s = md5(var_export($v,true));
if (isset($t[$s]))
unset($essais[$k]);
else
$t[$s] = true;
}
}
function tb_try_essai($filename,$funcname,$essai,&$output_test){
ob_start('tb_error_handler');
try {
find_in_path($filename,'',true);
$appel = "$funcname(".implode(", ",array_map('tb_export',$essai)).")";
#var_dump($appel);
$res = call_user_func_array($funcname, $essai);
}
catch (Exception $e) {
$res = "Erreur : ".$e->getMessage();
}
$output_test = ob_get_contents();
ob_end_clean();
$call = "$appel = ".var_export($res,true);
$call = str_replace(array('&','<','>'),array('&amp;','&lt;','&gt;'),$call);
$output_test .= ($output_test?"<br />":"")."<tt>$call</tt>";
return $res;
}
/**
* Construire un jeu d'essai complet combinatoire
* Pour chaque entree, on teste chaque valeur unitaire candidate
* combinatoirement avec les autres entrees
*
* @param array $types
*/
function tb_essai_combinatoire($types){
static $tb_essais_type=null;
$essais = array();
if (!count($types))
return $essais;
if (is_null($tb_essais_type))
$tb_essais_type = charger_fonction('tb_essais_type','inc');
$type = array_shift($types);
$es = tb_essai_combinatoire($types);
$samples = $tb_essais_type($type);
if (!count($samples)){
// ce n'est pas un type, c'est un argument fixe
$samples = eval("return array($type);");
}
foreach($samples as $s){
if (count($es)){
foreach($es as $e) {
array_unshift($e,$s);
$essais[] = $e;
}
}
else
$essais[] = array($s);
}
return $essais;
}
?>

15
lang/paquet-tb_fr.php

@ -0,0 +1,15 @@
<?php
// Ceci est un fichier langue de SPIP -- This is a SPIP language file
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// T
'tb_description' => 'Un plugin pour aider les développeurs de plugin à écrire plus vite leurs tests. Et les encourager à en écrire plus souvent !
Ce plugin est un outil de développement. Il a tout son intérêt installé sur votre machine de développement, mais il est très vivement déconseillé de l\'installer sur un serveur en ligne car il manipule les scripts PHP dans l\'arborescence de votre site et permet de lancer l\'exécution de code PHP arbitraire.',
'tb_slogan' => 'Construire des tests systématiques',
);
?>

72
lang/tb_fr.php

@ -0,0 +1,72 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// Fichier source, a modifier dans svn://zone.spip.org/spip-zone/_plugins_/_stable_/acces_restreint/lang/
if (!defined("_ECRIRE_INC_VERSION")) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
'testbuilder' => 'TestBuilder',
'label_resultat_essai' => 'R&eacute;sultat attendu',
'bouton_tester' => 'Tester !',
'bouton_combinatoire' => 'Jeu de tests combinatoires',
'bouton_supprimer_tous' => 'Supprimer tous les tests',
'bouton_recalculer_tous' => 'Recalculer tous les tests',
'bouton_creer_test' => 'Cr&eacute;er un test !',
'ok_test_ajoute' => "Test ajout&eacute; : ",
'ok_tests_supprimes' => "Tests supprim&eacute;s.",
'ok_test_recalcules' => "Les tests ont été recalculés",
'ok_test_supprime' => "Test supprim&eacute;",
'ok_n_tests_combi_crees' => "@nb@ tests combinatoires cr&eacute;es.",
'erreur_argument_vide' => "Cet argument ne peut &ecirc;tre vide car il est suivi par d'autres",
'erreur_test_combinatoire_types_requis' => 'Pas de test a creer ! Indiquez le type de chaque argument',
'erreur_test_combinatoire_resultat_ignore' => 'Le r&eacute;sultat est calcul&eacute; automatiquement pour chaque essai combinatoire',
'erreur_pseudo_type_inconnu' => 'Aucun jeu de donn&eacute;es n\'est d&eacute;fini pour ce type',
'un_essai' => '1 jeu de test',
'nb_essais' => '@nb@ jeux de tests',
'modifier' => 'Modifier le test',
'texte_presentation' => 'Selectionner le script PHP pour lequel vous souhaitez construire des jeux de tests.
Les fichiers tests seront cr&eacute;&eacute;s dans le repertoire <tt>tests/</tt> si le script fait partie de SPIP.
Si le script appartient a un plugin ou une extension, le test sera cr&eacute;&eacute; dans un sous r&eacute;pertoire <tt>tests/</tt> du plugin.
Les droits doivent &ecirc;tre suffisants pour permettre l\'&eacute;criture de fichier et la cr&eacute;ation de r&eacute;pertoires.
{{Ne laissez pas ce plugin install&eacute; sur un site en ligne}}
',
'texte_choisir_fonction' => 'Les fonctions ci-contre ont &eacute;t&eacute; d&eacute;tect&eacute;es dans le script PHP.
Si un test homonyme a la fonction existe, il est indiqu&eacute; et il est propos&eacute; de le modifier.
Seuls les tests cr&eacute;&eacute;s par TestBuilder sont effectivement modifiables.
Pour les tests cr&eacute;&eacute;s manuellement, le jeu de test ne pourra pas être retrouv&eacute;.',
'texte_explication' =>'Pour creer un test saisissez une valeur pour chaque argument. Attention, la saisie sera interpret&eacute;e directement par PHP.
Une chaine doit donc &ecirc;tre entre guillemets, <tt>true</tt> est un booleen, <tt>array(...)</tt> un tableau etc ...
Si vous laissez des arguments vides, ceux-ci seront ignor&eacute;s dans l\'appel php, permettant de tester les valeurs par defaut.
Pour creer jeu de tests combinatoire, entrez simplement un pseudo-type correspondant a un jeu de test pour chaque argument et cliquez sur le bouton <tt>Jeu de tests combinatoires</tt>.
Les pseudo-types disponibles sont :
-* <tt>bool</tt>
-* <tt>int</tt>
-* <tt>int8</tt> de 0 a 255
-* <tt>float01</tt> flottant de 0 a 1
-* <tt>string</tt>
-* <tt>iso-string</tt> pour du texte avec des accents ISO-8859
-* <tt>utf8-string</tt> pour du texte avec des accents UTF-8
-* <tt>date</tt> pour une date textuelle
-* <tt>time</tt> pour une date au format unix
-* <tt>email</tt> pour des chaine au format adresse email
-* <tt>array</tt>
-* <tt>image</tt> chemin vers un fichier image
-* <tt>mimetype</tt> string de nommage des mime-type
-* <tt>version</tt> Numeros de version a 1,2 ou 3 digits, avec variantes dev, alpha, beta, RC, pl
-* <tt>operateur</tt> pour des operateurs de comparaison
'
);
?>

20
paquet.xml

@ -0,0 +1,20 @@
<paquet
prefix="tb"
categorie="outil"
version="0.3.8"
etat="test"
compatibilite="[2.0.10;3.1.*]"
logo="images/tb-32.png"
documentation="https://contrib.spip.net/TestBuilder"
>
<nom>Test Builder</nom>
<!-- Construire des tests systématiques -->
<auteur lien="http://www.yterium.com">Cedric</auteur>
<menu nom="tb" titre="tb:testbuilder" parent="menu_developpement" icone="images/tb-16.png" action="testbuilder" />
<spip compatibilite="[3.0.0;3.0.*]">
<menu nom="tb" titre="tb:testbuilder" parent="bando_administration" icone="images/tb-16.png" action="testbuilder" />
</spip>
</paquet>

28
plugin.xml

@ -0,0 +1,28 @@
<plugin>
<nom>Test Builder</nom>
<slogan>Construire des tests syst&#233;matiques</slogan>
<auteur>[Cedric->http://www.yterium.com]</auteur>
<version>0.3.8</version>
<icon>images/tb-32.png</icon>
<etat>test</etat>
<description>
Un plugin pour aider les d&#233;veloppeurs de plugin &#224; &#233;crire plus vite leurs tests. Et les encourager &#224; en &#233;crire plus souvent !
Ce plugin est un outil de d&#233;veloppement. Il a tout son int&#233;r&#234;t install&#233; sur votre machine de d&#233;veloppement, mais il est tr&#232;s vivement d&#233;conseill&#233; de l'installer sur un serveur en ligne car il manipule les scripts PHP dans l'arborescence de votre site et permet de lancer l'ex&#233;cution de code PHP arbitraire.
</description>
<lien>https://contrib.spip.net/TestBuilder</lien> <!-- URI de documentation -->
<prefix>tb</prefix>
<necessite id="SPIP" version="[2.0.10;3.1.*]" />
<categorie>outil</categorie>
<bouton id="tb" parent="configuration">
<icone>images/tb-24.png</icone>
<titre>tb:testbuilder</titre>
<url>testbuilder</url>
</bouton>
<bouton id="tb2" parent="bando_administration">
<icone>images/tb-24.png</icone>
<titre>tb:testbuilder</titre>
<url>testbuilder</url>
</bouton>
<necessite id='spip_bonux' version='[1.9.0;]' />
</plugin>

81
prive/exec/testbuilder.html

@ -0,0 +1,81 @@
[(#REM)
Squelette
(c) 2009 xxx
Distribue sous licence GPL
]
<BOUCLE_func(CONDITION){si #ENV{func,''}|et{#ENV{file,''}}}>
[(#REM) Une fonction et un fichier sont indiques]
<h2>#ENV{func}</h2>
<div style="height:200px;overflow:auto;border:1px solid;padding:5px;">
<pre>[(#ENV{file}|tb_function_extract{#ENV{func}}|proteger_amp|entites_html)]</pre>
</div>
<div class="ajax">
[(#FORMULAIRE_EDITER_TEST_UNIT{#ENV{file},#ENV{func}})]
</div>
<!--#navigation-->
<h1>Test Builder</h1>
<a href="#URL_ECRIRE{testbuilder,file=#ENV{file}}">[(#ENV{file}|basename)]</a>
<div class="cadre cadre-info"><div class="cadre_padding">
<:tb:texte_explication|propre:></div></div>
<!--/#navigation-->
</BOUCLE_func>
<B_funcs>
[(#REM) Un fichier est indique]
<!--#navigation-->
<h1><:tb:testbuilder:></h1>
<a href="#URL_ECRIRE{testbuilder,dir=#ENV{file}|dirname}">[(#ENV{file}|dirname)]</a>
<div class="cadre cadre-info"><div class="cadre_padding">
<:tb:texte_choisir_fonction|propre:>
</div></div>
<!--/#navigation-->
<h2>#ENV{file}</h2>
<table class="spip">
<thead>
<tr>
<th>Function</th><th>Test</th>
</tr>
</thead>
<tbody>
<BOUCLE_funcs(POUR){tableau #ENV{file}|tb_liste_fonctions}>
<tr>
<td><tt>#CLE([(#VALEUR|reset|implode{', '})])</tt></td><td>#SET{test,#CLE|tb_hastest}[
(#GET{test}|tb_url_test{#GET{test}|basename}|sinon{#BOUTON_ACTION{<:tb:bouton_creer_test:>,#SELF|parametre_url{func,#CLE}}})
][(#GET{test}|oui)[(#BOUTON_ACTION{<:tb:modifier:>,#SELF|parametre_url{func,#CLE}})]]
</td>
</tr>
</BOUCLE_funcs>
</tbody>
</table>
</B_funcs>
[(#REM) Accueil sans fichier ni fonctions]
[<h2>(#ENV{dir})</h2>]
<B_dirs>
<ul class="liste-items dirs">
<BOUCLE_dirs(POUR){tableau #ENV{dir,''}|tb_dirs}{par cle}>
<li class="item"><a href="#URL_ECRIRE{testbuilder,dir=#VALEUR}">#CLE</a></li>
</BOUCLE_dirs>
</ul>
</B_dirs>
<B_files>
<ul class="liste-items filesphp">
<BOUCLE_files(POUR){tableau #ENV{dir,''}|tb_files}{par cle}>
<li class="item"><a href="#URL_ECRIRE{testbuilder,file=#VALEUR}">#CLE</a></li>
</BOUCLE_files>
</ul>
</B_files>
<!--#navigation-->
<h1><:tb:testbuilder:></h1>
<div class="cadre cadre-info"><div class="cadre_padding">
[(#CHEMIN{images/tb-128.png}|balise_img)]
<:tb:texte_presentation|propre:>
</div></div>
<!--/#navigation-->
<//B_funcs>
<//B_func>

66
prive/exec/testbuilder_fonctions.php

@ -0,0 +1,66 @@
<?php
/*
* Plugin TestBuilder
* (c) 2010 Cedric MORIN Yterium
* Distribue sous licence GPL
*
*/
include_spip('inc/tb_lib');
function tb_link($url,$texte){
return "<a href='$url'>$texte</a>";
}
function tb_dirs($dir=""){
$dir = trim($dir);
$d =false;
if (!$dir
OR substr($dir,0,1)=="/"
OR substr($dir,strlen(_DIR_RACINE),2)==".."
OR !@is_dir($dir) OR !is_readable($dir) OR !$d = @opendir($dir)) {
$plugins_dist = defined('_DIR_PLUGINS_DIST')?_DIR_PLUGINS_DIST:_DIR_EXTENSIONS;
if ($d)
closedir($d);
return array(
basename(_DIR_RESTREINT_ABS)=>_DIR_RESTREINT?_DIR_RESTREINT:"./",
basename(_DIR_PLUGINS)=>_DIR_PLUGINS,
basename($plugins_dist)=>$plugins_dist,
"prive"=>_DIR_RACINE."prive/",
);
}
$dir = rtrim($dir,'/');
$dirs = array("../"=>($dir=="." OR dirname($dir)==rtrim(_DIR_RACINE,'/'))?"":rtrim(dirname($dir),'/')."/");
$maxdirs = 1000;
$nbdirs = 0;
while (($f = readdir($d)) !== false && ($nbdirs<$maxdirs)) {
if ($f[0] != '.' # ignorer . .. .svn etc
AND $f != 'CVS'
AND $f != 'remove.txt'
AND is_dir("$dir/$f")) {
$dirs[$f] = "$dir/$f/";
}
$nbdirs++;
}
closedir($d);
return $dirs;
}
function tb_files($dir=""){
if (!$dir
OR substr($dir,0,1)=="/"
OR substr($dir,strlen(_DIR_RACINE),2)=="..")
return array();
$dir = rtrim($dir,'/').'/';
$files = preg_files($dir,"\.php$",1000,false);
$liste = array();
foreach($files as $f){
$liste[strtolower(basename($f))]=$f;
}
return $liste;
}
?>

31
prive/style_prive_plugin_tb.html

@ -0,0 +1,31 @@
[(#REM)
Ce squelette definit les styles de l'espace prive
Note: l'entete "Vary:" sert a repousser l'entete par
defaut "Vary: Cookie,Accept-Encoding", qui est (un peu)
genant en cas de "rotation du cookie de session" apres
un changement d'IP (effet de clignotement).
ATTENTION: il faut absolument le charset sinon Firefox croit que
c'est du text/html !
<style>
]
#CACHE{3600*100,cache-client}
#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
#HTTP_HEADER{Vary: Accept-Encoding}
#SET{claire,##ENV{couleur_claire,edf3fe}}
#SET{foncee,##ENV{couleur_foncee,3874b0}}
#SET{left,#ENV{ltr}|choixsiegal{left,left,right}}
#SET{right,#ENV{ltr}|choixsiegal{left,right,left}}
.testbuilder .liste-items.filesphp .item {padding-#GET{left}:20px;background:url(#CHEMIN{images/tb-file-16.png}) no-repeat center #GET{left};}
.testbuilder .liste-items.dirs .item {padding-#GET{left}:20px;background:url(#CHEMIN{images/tb-folder-16.png}) no-repeat center #GET{left};}
.formulaire_editer_test_unit .editer_resultat {background: #eee;padding-top:10px;}
.testbuilder ol.liste-items.essais {list-style-type: decimal;margin-#GET{left}:30px;}
.testbuilder ol.liste-items.essais .item {overflow: visible;padding-#GET{left}:30px;}
.testbuilder ol.liste-items.essais .item input {visibility:hidden;}
.testbuilder ol.liste-items.essais .item:hover input {visibility:visible;}
.testbuilder ol.liste-items.essais .item input.del {float:#GET{left};margin-#GET{left}:-30px;}

BIN
prive/themes/spip/images/tb-16.png

After

Width: 16  |  Height: 16  |  Size: 1.0 KiB

41
templates/function.php

@ -0,0 +1,41 @@
<?php
/**
* Test unitaire de la fonction @funcname@
* du fichier @filename@
*
* genere automatiquement par TestBuilder
* le @date@
*/
$test = '@funcname@';
$remonte = "../";
while (!is_dir($remonte."ecrire"))
$remonte = "../$remonte";
require $remonte.'tests/test.inc';
find_in_path("@filename@",'',true);
// chercher la fonction si elle n'existe pas
if (!function_exists($f='@funcname@')){
find_in_path("inc/filtres.php",'',true);
$f = chercher_filtre($f);
}
//
// hop ! on y va
//
$err = tester_fun($f, @essais_funcname@());
// si le tableau $err est pas vide ca va pas
if ($err) {
die ('<dl>' . join('', $err) . '</dl>');
}
echo "OK";
function @essais_funcname@(){
$essais = array();
return $essais;
}
?>

88
tests/tb_dirs.php

@ -0,0 +1,88 @@
<?php
/**
* Test unitaire de la fonction tb_dirs
* du fichier ../plugins/testbuilder/prive/exec/testbuilder_fonctions.php
*
* genere automatiquement par TestBuilder
* le
*/
$test = 'tb_dirs';
$remonte = "../";
while (!is_dir($remonte."ecrire"))
$remonte = "../$remonte";
require $remonte.'tests/test.inc';
find_in_path("../plugins/testbuilder/prive/exec/testbuilder_fonctions.php",'',true);
//
// hop ! on y va
//
$err = tester_fun('tb_dirs', essais_tb_dirs());
// si le tableau $err est pas vide ca va pas
if ($err) {
die ('<dl>' . join('', $err) . '</dl>');
}
echo "OK";
function essais_tb_dirs(){
$essais = array (
0 =>
array (
0 =>
array (
'ecrire' => 'ecrire/',
'plugins' => 'plugins/',
'plugins-dist' => 'plugins-dist/',
'prive' => 'prive/',
),
1 => '/',
),
1 =>
array (
0 =>
array (
'ecrire' => 'ecrire/',
'plugins' => 'plugins/',
'plugins-dist' => 'plugins-dist/',
'prive' => 'prive/',
),
1 => '/etc/',
),
2 =>
array (
0 =>
array (
'ecrire' => 'ecrire/',
'plugins' => 'plugins/',
'plugins-dist' => 'plugins-dist/',
'prive' => 'prive/',
),
1 => '../../',
),
3 =>
array (
0 =>
array (
'ecrire' => 'ecrire/',
'plugins' => 'plugins/',
'plugins-dist' => 'plugins-dist/',
'prive' => 'prive/',
),
1 => '../',
),
);
return $essais;
}
?>

79
tests/tb_export.php

@ -0,0 +1,79 @@
<?php
/**
* Test unitaire de la fonction tb_export
* du fichier ../plugins/testbuilder/inc/tb_lib.php
*
* genere automatiquement par TestBuilder
* le 2010-02-27 13:55
*/
$test = 'tb_export';
$remonte = "../";
while (!is_dir($remonte."ecrire"))
$remonte = "../$remonte";
require $remonte.'tests/test.inc';
find_in_path("../plugins/testbuilder/inc/tb_lib.php",'',