J'avais en effet l'assertion suivante :

<?php

class progressBar extends atoum\test
{
...
$this->assert
->object($progressBar->update('F'))
->isIdenticalTo($progressBar)
->string((string) $progressBar)
->isEqualTo(str_repeat("\010", $length - 1) . 'F' . str_repeat('_', 59) . '][1/1]')
;
...
}

?>

Rien de bien extraordinaire, et pourtant j'ai eu un problème.

En effet, comme de juste lorsque l'on fait du TDD, la première fois que j'ai exécuté mon test, il n'est pas passé.

Sauf que le rapport d'exécution ne ressemblait pas du tout à ce qu'il aurait dut être.

J'ai en effet obtenu cela :

Failure ! (2 tests, 20 assertions, 1 failure)
There is 1 failure:
mageekguy\atoum\tests\units\reporters\cli\progressBar::testUpdate():
mageekguy\atoum\asserters\string::isEqualTo() failed because string(67) 'laStringQueJeVeuxAvecDes\010' in
file /usr/home/fch/atoum/tests/units/reporters/cli/progressBar.php at line 101

Au lieu de cela :

Failure ! (2 tests, 20 assertions, 1 failure)
There is 1 failure:
mageekguy\atoum\tests\units\reporters\cli\progressBar::testUpdate():
mageekguy\atoum\asserters\string::isEqualTo() failed because string(196) 'laStringTestee' is not equal to string(198) 'laStringQueJeVeuxAvecDes\010' in file /usr/home/fch/atoum/tests/units
/reporters/cli/progressBar.php at line 101

En résumé, une grande partie du rapport est effacée...

Connaissant parfaitement, et pour cause, mon code, je n'ai pas eu de mal à trouver l'origine de mon problème.

En effet, ma barre de progression fait appel au caractère de contrôle \010 aka Backspace pour mettre à jour son affichage.

Et si son utilisation ne pose aucun problème lors de la vérification de l'assertion, elle en pose lorsqu'il est affiché dans le rapport d’exécution puisqu'il provoque son effacement.

Il me fallait donc faire en sorte d'annuler le comportement de \010 dans mes chaînes de caractères à l'affichage pour supprimer ce comportement.

Et la solution est simple, puisque PHP dispose d'une fonction addcslashes() dont c'est justement le rôle :

<?php

class progressBar extends atoum\test
{
...
$this->assert
->object($progressBar->update('F'))
->isIdenticalTo($progressBar)
->string(addcslashes((string) $progressBar), "\010")
->isEqualTo(addcslashes(str_repeat("\010", $length - 1) . 'F' . str_repeat('_', 59) . '][1/1]'), "\010")
;
...
}

?>

J'obtiens ainsi un rapport d'exécution beaucoup plus lisible, puisque tout les caractère \010 sont transformés par addcslashes() en \b, ce qui n'a aucune influence lors de l'affichage.

Évidement, la solution, telle qu'elle est mise en œuvre ci-dessus est plus un hack qu'autre chose, mais je compte bien profiter du système d'assertion modulaire d'Atoum pour l'intégrer avec beaucoup plus d'élégance