Passed
Push — int-types ( 949579...4b2be5 )
by Sam
05:58
created

CompositeFieldTest   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 113
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 64
dl 0
loc 113
rs 10
c 0
b 0
f 0
wmc 6

6 Methods

Rating   Name   Duplication   Size   Complexity  
A testLegend() 0 16 1
A testTag() 0 14 1
A testValidation() 0 15 1
A testChildren() 0 14 1
A testFieldPosition() 0 23 1
A testPushAndUnshift() 0 17 1
1
<?php
2
3
namespace SilverStripe\Forms\Tests;
4
5
use SilverStripe\Dev\CSSContentParser;
6
use SilverStripe\Dev\SapphireTest;
7
use SilverStripe\Forms\FieldList;
8
use SilverStripe\Forms\TextField;
9
use SilverStripe\Forms\CompositeField;
10
use SilverStripe\Forms\DropdownField;
11
use SilverStripe\Forms\RequiredFields;
12
13
class CompositeFieldTest extends SapphireTest
14
{
15
16
    public function testFieldPosition()
17
    {
18
        $compositeOuter = new CompositeField(
19
            new TextField('A'),
20
            new TextField('B'),
21
            $compositeInner = new CompositeField(
22
                new TextField('C1'),
23
                new TextField('C2')
24
            ),
25
            new TextField('D')
26
        );
27
28
        $this->assertEquals(0, $compositeOuter->fieldPosition('A'));
29
        $this->assertEquals(1, $compositeOuter->fieldPosition('B'));
30
        $this->assertEquals(3, $compositeOuter->fieldPosition('D'));
31
32
        $this->assertEquals(0, $compositeInner->fieldPosition('C1'));
33
        $this->assertEquals(1, $compositeInner->fieldPosition('C2'));
34
35
        $compositeOuter->insertBefore('B', new TextField('AB'));
36
        $this->assertEquals(0, $compositeOuter->fieldPosition('A'));
37
        $this->assertEquals(1, $compositeOuter->fieldPosition('AB'));
38
        $this->assertEquals(2, $compositeOuter->fieldPosition('B'));
39
    }
40
41
    public function testTag()
42
    {
43
        $div = new CompositeField(
44
            new TextField('A'),
45
            new TextField('B')
46
        );
47
        $this->assertStringStartsWith('<div', trim($div->FieldHolder()));
48
        $this->assertStringEndsWith('/div>', trim($div->FieldHolder()));
49
50
        $fieldset = new CompositeField();
51
        $fieldset->setTag('fieldset');
52
53
        $this->assertStringStartsWith('<fieldset', trim($fieldset->FieldHolder()));
54
        $this->assertStringEndsWith('/fieldset>', trim($fieldset->FieldHolder()));
55
    }
56
57
    public function testPushAndUnshift()
58
    {
59
        $composite = new CompositeField(
60
            new TextField('Middle')
61
        );
62
63
        $composite->push(new TextField('End'));
64
        /* There are now 2 fields in the set */
65
        $this->assertEquals(2, $composite->getChildren()->Count());
66
        /* The most recently added field is at the end of the set */
67
        $this->assertEquals('End', $composite->getChildren()->Last()->getName());
68
69
        $composite->unshift(new TextField('Beginning'));
70
        /* There are now 3 fields in the set */
71
        $this->assertEquals(3, $composite->getChildren()->Count());
72
        /* The most recently added field is at the beginning of the set */
73
        $this->assertEquals('Beginning', $composite->getChildren()->First()->getName());
74
    }
75
76
    public function testLegend()
77
    {
78
        $composite = new CompositeField(
79
            new TextField('A'),
80
            new TextField('B')
81
        );
82
83
        $composite->setTag('fieldset');
84
        $composite->setLegend('My legend');
85
86
        $parser = new CSSContentParser($composite->FieldHolder());
87
        $root = $parser->getBySelector('fieldset.composite');
0 ignored issues
show
Unused Code introduced by
The assignment to $root is dead and can be removed.
Loading history...
88
        $legend = $parser->getBySelector('fieldset.composite legend');
89
90
        $this->assertNotNull($legend);
91
        $this->assertEquals('My legend', (string)$legend[0]);
92
    }
93
94
    public function testValidation()
95
    {
96
        $field = CompositeField::create(
97
            $fieldOne = DropdownField::create('A', '', [ 'value' => 'value' ]),
98
            $fieldTwo = TextField::create('B')
99
        );
100
        $validator = new RequiredFields();
101
        $this->assertFalse(
102
            $field->validate($validator),
103
            "Validation fails when child is invalid"
104
        );
105
        $fieldOne->setEmptyString('empty');
106
        $this->assertTrue(
107
            $field->validate($validator),
108
            "Validates when children are valid"
109
        );
110
    }
111
112
    public function testChildren()
113
    {
114
        $field = CompositeField::create();
115
116
        $this->assertInstanceOf(FieldList::class, $field->getChildren());
117
        $this->assertEquals($field, $field->getChildren()->getContainerField());
118
119
        $expectedChildren = FieldList::create(
120
            $fieldOne = DropdownField::create('A', '', [ 'value' => 'value' ]),
121
            $fieldTwo = TextField::create('B')
122
        );
123
        $field->setChildren($expectedChildren);
124
        $this->assertEquals($expectedChildren, $field->getChildren());
125
        $this->assertEquals($field, $expectedChildren->getContainerField());
126
    }
127
}
128