File: DescribedAs.php

package info (click to toggle)
php-hamcrest 2.1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,168 kB
  • sloc: php: 6,353; makefile: 14; sh: 9
file content (68 lines) | stat: -rw-r--r-- 1,849 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
namespace Hamcrest\Core;

/*
 Copyright (c) 2009 hamcrest.org
 */
use Hamcrest\BaseMatcher;
use Hamcrest\Description;
use Hamcrest\Matcher;

/**
 * Provides a custom description to another matcher.
 */
class DescribedAs extends BaseMatcher
{

    private $_descriptionTemplate;
    private $_matcher;
    private $_values;

    const ARG_PATTERN = '/%([0-9]+)/';

    public function __construct($descriptionTemplate, Matcher $matcher, array $values)
    {
        $this->_descriptionTemplate = $descriptionTemplate;
        $this->_matcher = $matcher;
        $this->_values = $values;
    }

    public function matches($item)
    {
        return $this->_matcher->matches($item);
    }

    public function describeTo(Description $description)
    {
        $textStart = 0;
        while (preg_match(self::ARG_PATTERN, $this->_descriptionTemplate, $matches, PREG_OFFSET_CAPTURE, $textStart)) {
            $text = $matches[0][0];
            $index = $matches[1][0];
            $offset = $matches[0][1];

            $description->appendText(substr($this->_descriptionTemplate, $textStart, $offset - $textStart));
            $description->appendValue($this->_values[$index]);

            $textStart = $offset + strlen($text);
        }

        if ($textStart < strlen($this->_descriptionTemplate)) {
            $description->appendText(substr($this->_descriptionTemplate, $textStart));
        }
    }

    /**
     * Wraps an existing matcher and overrides the description when it fails.
     *
     * @factory ...
     */
    public static function describedAs(/* $description, Hamcrest\Matcher $matcher, $values... */)
    {
        $args = func_get_args();
        $description = array_shift($args);
        $matcher = array_shift($args);
        $values = $args;

        return new self($description, $matcher, $values);
    }
}