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

Scenario   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 91
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 11
lcom 1
cbo 5
dl 0
loc 91
ccs 0
cts 8
cp 0
rs 10
c 1
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A format() 0 14 1
A getTags() 0 8 2
A getScenarioDescription() 0 17 2
A getSteps() 0 10 2
A getExamples() 0 8 2
A getTitleLines() 0 7 1
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