'',
'nestingLabel' => '',
'radioWrapper' => '{{label}}',
];
$this->templates = new StringTemplate($templates);
$this->context = $this->getMock('Cake\View\Form\ContextInterface');
}
/**
* Test rendering basic radio buttons without nested inputs
*
* @return void
*/
public function testRenderSimpleNotNested()
{
$this->templates->add([
'nestingLabel' => '',
'radioWrapper' => '{{input}}{{label}}'
]);
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Crayons[color]',
'label' => null,
'options' => ['r' => 'Red', 'b' => 'Black']
];
$result = $radio->render($data, $this->context);
$expected = [
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'crayons-color-r'
]],
['label' => ['for' => 'crayons-color-r']],
'Red',
'/label',
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'b',
'id' => 'crayons-color-b'
]],
['label' => ['for' => 'crayons-color-b']],
'Black',
'/label',
];
$this->assertHtml($expected, $result);
$data = [
'name' => 'Crayons[color]',
'label' => false,
'options' => ['r' => 'Red', 'b' => 'Black']
];
$result = $radio->render($data, $this->context);
$expected = [
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'crayons-color-r'
]],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'b',
'id' => 'crayons-color-b'
]],
];
$this->assertHtml($expected, $result);
}
/**
* Test rendering basic radio buttons.
*
* @return void
*/
public function testRenderSimple()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Crayons[color]',
'label' => null,
'options' => ['r' => 'Red', 'b' => 'Black']
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'crayons-color-r']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'crayons-color-r'
]],
'Red',
'/label',
['label' => ['for' => 'crayons-color-b']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'b',
'id' => 'crayons-color-b'
]],
'Black',
'/label',
];
$this->assertHtml($expected, $result);
$data = [
'name' => 'Crayons[color]',
'options' => new Collection(['r' => 'Red', 'b' => 'Black'])
];
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
}
/**
* Test rendering inputs with the complex option form.
*
* @return void
*/
public function testRenderComplex()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Crayons[color]',
'options' => [
['value' => 'r', 'text' => 'Red', 'id' => 'my_id'],
['value' => 'b', 'text' => 'Black', 'id' => 'my_id_2', 'data-test' => 'test'],
]
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'my_id']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'my_id'
]],
'Red',
'/label',
['label' => ['for' => 'my_id_2']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'b',
'id' => 'my_id_2',
'data-test' => 'test'
]],
'Black',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Test that id suffixes are generated to not collide
*
* @return void
*/
public function testRenderIdSuffixGeneration()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Thing[value]',
'options' => ['a>b' => 'First', 'a 'Second']
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'thing-value-a-b']],
['input' => [
'type' => 'radio',
'name' => 'Thing[value]',
'value' => 'a>b',
'id' => 'thing-value-a-b'
]],
'First',
'/label',
['label' => ['for' => 'thing-value-a-b1']],
['input' => [
'type' => 'radio',
'name' => 'Thing[value]',
'value' => 'a<b',
'id' => 'thing-value-a-b1',
]],
'Second',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Test rendering checks the right option with booleanish values.
*
* @return void
*/
public function testRenderBooleanishValues()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Model[field]',
'options' => ['1' => 'Yes', '0' => 'No'],
'val' => '0'
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'model-field-1']],
['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '1', 'id' => 'model-field-1']],
'Yes',
'/label',
['label' => ['for' => 'model-field-0']],
['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '0', 'id' => 'model-field-0', 'checked' => 'checked']],
'No',
'/label',
];
$this->assertHtml($expected, $result);
$data['val'] = 0;
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$data['val'] = false;
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$expected = [
['label' => ['for' => 'model-field-1']],
['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '1', 'id' => 'model-field-1']],
'Yes',
'/label',
['label' => ['for' => 'model-field-0']],
['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '0', 'id' => 'model-field-0']],
'No',
'/label',
];
$data['val'] = null;
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$data['val'] = '';
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$expected = [
['label' => ['for' => 'model-field-1']],
['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '1', 'id' => 'model-field-1', 'checked' => 'checked']],
'Yes',
'/label',
['label' => ['for' => 'model-field-0']],
['input' => ['type' => 'radio', 'name' => 'Model[field]', 'value' => '0', 'id' => 'model-field-0']],
'No',
'/label',
];
$data['val'] = '1';
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$data['val'] = 1;
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$data['val'] = true;
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
}
/**
* Test that render() works with the required attribute.
*
* @return void
*/
public function testRenderRequiredAndFormAttribute()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'published',
'options' => ['option A', 'option B'],
'required' => true,
'form' => 'my-form',
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'published-0']],
['input' => ['type' => 'radio', 'name' => 'published', 'value' => '0',
'id' => 'published-0', 'required' => 'required', 'form' => 'my-form']],
'option A',
'/label',
['label' => ['for' => 'published-1']],
['input' => ['type' => 'radio', 'name' => 'published', 'value' => '1',
'id' => 'published-1', 'required' => 'required', 'form' => 'my-form']],
'option B',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Test rendering the empty option.
*
* @return void
*/
public function testRenderEmptyOption()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Crayons[color]',
'options' => ['r' => 'Red'],
'empty' => true,
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'crayons-color']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => '',
'id' => 'crayons-color'
]],
'empty',
'/label',
['label' => ['for' => 'crayons-color-r']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'crayons-color-r'
]],
'Red',
'/label',
];
$this->assertHtml($expected, $result);
$data['empty'] = 'Choose one';
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'crayons-color']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => '',
'id' => 'crayons-color'
]],
'Choose one',
'/label',
['label' => ['for' => 'crayons-color-r']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'crayons-color-r'
]],
'Red',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Test rendering the input inside the label.
*
* @return void
*/
public function testRenderInputInsideLabel()
{
$this->templates->add([
'label' => '',
'radioWrapper' => '{{label}}',
]);
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Crayons[color]',
'options' => ['r' => 'Red'],
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'crayons-color-r']],
['input' => [
'type' => 'radio',
'name' => 'Crayons[color]',
'value' => 'r',
'id' => 'crayons-color-r'
]],
'Red',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* test render() and selected inputs.
*
* @return void
*/
public function testRenderSelected()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Versions[ver]',
'val' => '1',
'options' => [
1 => 'one',
'1x' => 'one x',
'2' => 'two',
]
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'versions-ver-1']],
['input' => [
'id' => 'versions-ver-1',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1',
'checked' => 'checked'
]],
'one',
'/label',
['label' => ['for' => 'versions-ver-1x']],
['input' => [
'id' => 'versions-ver-1x',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1x'
]],
'one x',
'/label',
['label' => ['for' => 'versions-ver-2']],
['input' => [
'id' => 'versions-ver-2',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '2'
]],
'two',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Test rendering with disable inputs
*
* @return void
*/
public function testRenderDisabled()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Versions[ver]',
'options' => [
1 => 'one',
'1x' => 'one x',
'2' => 'two',
],
'disabled' => true,
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'versions-ver-1']],
['input' => [
'id' => 'versions-ver-1',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1',
'disabled' => 'disabled'
]],
'one',
'/label',
['label' => ['for' => 'versions-ver-1x']],
['input' => [
'id' => 'versions-ver-1x',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1x',
'disabled' => 'disabled'
]],
'one x',
'/label',
];
$this->assertHtml($expected, $result);
$data['disabled'] = 'a string';
$result = $radio->render($data, $this->context);
$this->assertHtml($expected, $result);
$data['disabled'] = ['1'];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['for' => 'versions-ver-1']],
['input' => [
'id' => 'versions-ver-1',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1',
'disabled' => 'disabled'
]],
'one',
'/label',
['label' => ['for' => 'versions-ver-1x']],
['input' => [
'id' => 'versions-ver-1x',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1x',
]],
'one x',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Test rendering with label options.
*
* @return void
*/
public function testRenderLabelOptions()
{
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Versions[ver]',
'options' => [
1 => 'one',
'1x' => 'one x',
'2' => 'two',
],
'label' => false,
];
$result = $radio->render($data, $this->context);
$expected = [
['input' => [
'id' => 'versions-ver-1',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1',
]],
['input' => [
'id' => 'versions-ver-1x',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1x',
]],
];
$this->assertHtml($expected, $result);
$data = [
'name' => 'Versions[ver]',
'options' => [
1 => 'one',
'1x' => 'one x',
'2' => 'two',
],
'label' => [
'class' => 'my-class',
]
];
$result = $radio->render($data, $this->context);
$expected = [
['label' => ['class' => 'my-class', 'for' => 'versions-ver-1']],
['input' => [
'id' => 'versions-ver-1',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1',
]],
'one',
'/label',
['label' => ['class' => 'my-class', 'for' => 'versions-ver-1x']],
['input' => [
'id' => 'versions-ver-1x',
'name' => 'Versions[ver]',
'type' => 'radio',
'value' => '1x',
]],
'one x',
'/label',
];
$this->assertHtml($expected, $result);
}
/**
* Ensure that the input + label are composed with
* a template.
*
* @return void
*/
public function testRenderContainerTemplate()
{
$this->templates->add([
'radioWrapper' => '
{{input}}{{label}}
'
]);
$label = new NestingLabelWidget($this->templates);
$radio = new RadioWidget($this->templates, $label);
$data = [
'name' => 'Versions[ver]',
'options' => [
1 => 'one',
'1x' => 'one x',
'2' => 'two',
],
];
$result = $radio->render($data, $this->context);
$this->assertContains(
'assertContains(
'
',
$result
);
}
}