Completed
Push — master ( b716f1...2f9340 )
by Kamil
18:43
created

DefaultFactory::createInlineElement()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 4
rs 10
c 1
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Behat\PageObjectExtension\PageObject\Factory;
13
14
use Behat\Mink\Mink;
15
use SensioLabs\Behat\PageObjectExtension\PageObject\Element;
16
use SensioLabs\Behat\PageObjectExtension\PageObject\Factory;
17
use SensioLabs\Behat\PageObjectExtension\PageObject\Factory\ClassNameResolver;
18
use SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement;
19
use SensioLabs\Behat\PageObjectExtension\PageObject\Page;
20
use SensioLabs\Behat\PageObjectExtension\PageObject\PageObject;
21
22
final class DefaultFactory implements Factory
23
{
24
    /**
25
     * @var Mink
26
     */
27
    private $mink;
28
29
    /**
30
     * @var ClassNameResolver
31
     */
32
    private $classNameResolver;
33
34
    /**
35
     * @var array
36
     */
37
    private $pageParameters = [];
38
39
    /**
40
     * @param Mink $mink
41
     * @param ClassNameResolver $classNameResolver
42
     * @param array $pageParameters
43
     */
44
    public function __construct(Mink $mink, ClassNameResolver $classNameResolver, array $pageParameters)
45
    {
46
        $this->mink = $mink;
47
        $this->pageParameters = $pageParameters;
48
        $this->classNameResolver = $classNameResolver;
49
    }
50
51
    /**
52
     * @param string $name
53
     *
54
     * @return Page
55
     */
56
    public function createPage($name)
57
    {
58
        $pageClass = $this->classNameResolver->resolvePage($name);
59
60
        return $this->instantiatePage($pageClass);
61
    }
62
63
    /**
64
     * @param string $name
65
     *
66
     * @return Element
67
     */
68
    public function createElement($name)
69
    {
70
        $elementClass = $this->classNameResolver->resolveElement($name);
71
72
        return $this->instantiateElement($elementClass);
73
    }
74
75
    /**
76
     * @param array|string $selector
77
     *
78
     * @return InlineElement
79
     */
80
    public function createInlineElement($selector)
81
    {
82
        return new InlineElement($selector, $this->mink->getSession(), $this);
83
    }
84
85
    /**
86
     * @param string $pageObjectClass
87
     *
88
     * @return PageObject
89
     */
90
    public function create($pageObjectClass)
91
    {
92
        if (is_subclass_of($pageObjectClass, Page::class)) {
93
            return $this->instantiatePage($pageObjectClass);
94
        } elseif (is_subclass_of($pageObjectClass, Element::class)) {
95
            return $this->instantiateElement($pageObjectClass);
96
        }
97
98
        throw new \InvalidArgumentException(sprintf('Not a page object class: %s', $pageObjectClass));
99
    }
100
101
    /**
102
     * @param string $pageClass
103
     *
104
     * @return Page
105
     */
106
    private function instantiatePage($pageClass)
107
    {
108
        return new $pageClass($this->mink->getSession(), $this, $this->pageParameters);
109
    }
110
111
    /**
112
     * @param string $elementClass
113
     *
114
     * @return Element
115
     */
116
    private function instantiateElement($elementClass)
117
    {
118
        return new $elementClass($this->mink->getSession(), $this);
119
    }
120
}
121