Copy & Paste Detection in PHPUnit 3.2

Version 3.2 of PHPUnit is shaping up nicely. In this blog posting I want to highlight another aspect of PHPUnit's new Project Mess Detector feature set.

Duplicate code can be hard to find, especially in a large project. Johann-Peter Hartmann of MAYFLOWER GmbH recently implemented Copy & Paste Detection for PHPUnit's growing set of features that extends its usage scenarios beyond "just unit testing" to a one-stop solution for quality assurance in PHP-based projects.

Here is an example of how PHPUnit 3.2 will report code duplication:

<?xml version="1.0" encoding="UTF-8"?>
<pmd-cpd version="PHPUnit 3.2.0">
  <duplication lines="12" tokens="56">
    <file path="/usr/local/src/ezcomponents/trunk/Graph/src/driver/svg.php"
               line="197"/>
    <file path="/usr/local/src/ezcomponents/trunk/Graph/src/driver/svg.php"
               line="248"/>
    <codefragment><![CDATA[
if ( !in_array( $color->__toString(), $this->drawnGradients, true ) )
{
    $gradient = $this->dom->createElement( 'linearGradient' );
    $gradient->setAttribute( 'id', 'Definition_' . $color->__toString() );
    $this->defs->appendChild( $gradient );

    // Start of linear gradient
    $stop = $this->dom->createElement( 'stop' );
    $stop->setAttribute( 'offset', 0 );
    $stop->setAttribute(
      'style',
      sprintf( 'stop-color: #%02x%02x%02x; stop-opacity: %.2F;',
               $color->startColor->red,
               $color->startColor->green,
]]></codefragment>
  </duplication>