@title Arcanist User Guide: Code Coverage
@group userguide

Explains code coverage features in Arcanist and Phabricator.

This is a configuration guide that helps you set up advanced features. If you're
just getting started, you don't need to look at this yet. Instead, start with
the @{article:Arcanist User Guide}.

Before you can configure coverage features, you must set up unit test
integration. For instructions, see @{article:Arcanist User Guide: Configuring
a New Project} and @{article:Arcanist User Guide: Customizing
Lint, Unit Tests and Workflows}.

= Using Coverage Features =

If your project has unit tests with coverage integration (see below for
instructions on setting it up), you can use "arc" to show coverage reports.

For example:

  arc unit --detailed-coverage src/some/file.php

Depending on how your test engine is configured, this will run tests relevant
to ##src/some/file.php## and give you a detailed coverage report.

If the test engine enables coverage by default, it will be uploaded to
Differential and displayed in the right gutter when viewing diffs.

= Enabling Coverage for libphutil, Arcanist and Phabricator =

If you're contributing, libphutil, Arcanist and Phabricator support coverage if
you install Xdebug:

  http://xdebug.org/

It should be sufficient to correctly install Xdebug; coverage information will
be automatically enabled.

= Building Coverage Support =

To add coverage support to a unit test engine, just call ##setCoverage()## when
building @{class@arcanist:ArcanistUnitTestResult} objects. Provide a map of
file names (relative to the working copy root) to coverage report strings.
Coverage report strings look like this:

  NNNNNCCCNNNNNNNNCCCCCCNNNUUUNNNNN

Each line in the file is represented by a character. Valid characters are:

  - **N** Not executable. This is a comment or whitespace which should be
    ignored when computing test coverage.
  - **C** Covered. This line has test coverage.
  - **U** Uncovered. This line is executable but has no test coverage.
  - **X** Unreachable. If your coverage analysis can detect unreachable code,
    you can report it here.

This format is intended to be as simple as possible. A valid coverage result
might look like this:

  array(
    'src/example.php' => 'NNCNNNCNUNNNUNUNUNUNUNC',
    'src/other.php'   => 'NNUNNNUNCNNNUNUNCNCNCNU',
  );

You may also want to filter coverage information to the paths passed to the
unit test engine. See @{class@arcanist:ArcanistPhutilTestCase} and
@{class@arcanist:PhutilUnitTestEngine} for an example of coverage integration
in PHP using Xdebug.
