Completed
Pull Request — master (#1)
by Jefersson
03:33
created

Scenario::getScenarioDescription()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6
Metric Value
dl 0
loc 17
ccs 0
cts 0
cp 0
rs 9.4285
cc 2
eloc 11
nc 2
nop 1
crap 6
1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license.
17
 */
18
19
namespace KawaiiGherkin\Formatter;
20
21
use Behat\Gherkin\Node\OutlineNode;
22
use Behat\Gherkin\Node\ScenarioInterface;
23
24
/**
25
 * @author  Jefersson Nathan  <[email protected]>
26
 * @license MIT
27
 */
28
final class Scenario extends AbstractFormatter
29
{
30
    private $align;
31
32
    /**
33
     * @param string $align
34
     */
35
    public function __construct($align = Step::ALIGN_TO_RIGHT)
36
    {
37
        $this->align = $align;
38
    }
39
40
    /**
41
     * @param \Behat\Gherkin\Node\ScenarioInterface[] $scenarios
42
     *
43
     * @return string
44
     */
45
    public function format(array $scenarios)
46
    {
47
        return rtrim(implode(
48
            array_map(
49
                function (ScenarioInterface $scenario) {
50
                    return $this->getTags($scenario)
51
                    . $this->getScenarioDescription($scenario)
52
                    . $this->getSteps($scenario)
53
                    . $this->getExamples($scenario);
54
                },
55
                $scenarios
56
            )
57
        )) . PHP_EOL;
58
    }
59
60
    private function getTags(ScenarioInterface $scenario)
61
    {
62
        if (! $scenario->hasTags()) {
63
            return $this->indent();
64
        }
65
66
        return $this->indent() . (new Tags())->format($scenario->getTags()) . PHP_EOL;
67
    }
68
69
    private function getScenarioDescription(ScenarioInterface $scenario)
70
    {
71
        $titleLines    = $this->getTitleLines($scenario);
72
        $scenarioTitle = trim($scenario->getKeyword() . ': ' . array_shift($titleLines));
73
74
        if ($scenario->hasTags()) {
75
            $scenarioTitle = $this->indent() . $scenarioTitle;
76
        }
77
78
        return implode(
79
            PHP_EOL . $this->indent(12),
80
            array_merge(
81
                [$scenarioTitle],
82
                $titleLines
83
            )
84
        ) . PHP_EOL;
85
    }
86
87
    private function getSteps(ScenarioInterface $scenario)
88
    {
89
        if (! $scenario->hasSteps()) {
90
            return;
91
        }
92
93
        $step = new Step($this->align);
94
95
        return $step->format($scenario->getSteps()) . PHP_EOL;
96
    }
97
98
    private function getExamples($scenario)
99
    {
100
        if (! $scenario instanceof OutlineNode) {
101
            return;
102
        }
103
104
        return (new Example())->format($scenario);
105
    }
106
107
    /**
108
     * @param ScenarioInterface $scenario
109
     * @return array
110
     */
111
    private function getTitleLines(ScenarioInterface $scenario)
112
    {
113
        return array_map(
114
            'trim',
115
            explode(PHP_EOL, $scenario->getTitle())
116
        );
117
    }
118
}
119