Skip to content

Commit

Permalink
Add ContentInterface to TextArea class. (#225)
Browse files Browse the repository at this point in the history
  • Loading branch information
terabytesoftw committed Jan 11, 2024
1 parent a1bf3b7 commit 18bf5da
Show file tree
Hide file tree
Showing 5 changed files with 204 additions and 35 deletions.
1 change: 1 addition & 0 deletions infection.json.dist
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"PHPForge\\Html\\Attribute\\Aria\\HasAriaDescribedBy::ariaDescribedBy",
"PHPForge\\Html\\Attribute\\Custom\\HasAttributes::attributes",
"PHPForge\\Html\\Attribute\\Custom\\HasCheckedValue::checkedValue",
"PHPForge\\Html\\Attribute\\Custom\\HasContent::content",
"PHPForge\\Html\\Attribute\\Custom\\HasEnclosedByLabel::enclosedByLabel",
"PHPForge\\Html\\Attribute\\Custom\\HasLabel::isNotLabel",
"PHPForge\\Html\\Attribute\\Custom\\HasLabel::labelAttributes",
Expand Down
22 changes: 22 additions & 0 deletions src/Input/Contract/ContentInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace PHPForge\Html\Input\Contract;

use PHPForge\Widget\ElementInterface;

/**
* Provide methods for handling HTML content attributes.
*/
interface ContentInterface
{
/**
* Set the `HTML` content value.
*
* @param ElementInterface|string ...$values The `HTML` content value.
*
* @return static A new instance of the current class with the specified content value.
*/
public function content(string|ElementInterface ...$values): static;
}
24 changes: 23 additions & 1 deletion src/TextArea.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,27 @@

namespace PHPForge\Html;

use PHPForge\Html\Input\Contract;

/**
* The `<textarea>` HTML element represents a multi-line plain-text editing control, useful when you want to allow users
* to enter a sizable amount of free-form text, for example, a comment on a review or feedback form.
*
* @link https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element
*/
final class TextArea extends Base\AbstractElement
final class TextArea extends Base\AbstractElement implements
Contract\ContentInterface,
Contract\PlaceholderInterface,
Contract\LengthInterface,
Contract\RequiredInterface
{
use Attribute\CanBeAutofocus;
use Attribute\Input\CanBeDisabled;
use Attribute\Input\CanBeReadonly;
use Attribute\Input\CanBeRequired;
use Attribute\Input\HasAutocomplete;
use Attribute\Input\HasDirname;
use Attribute\Input\HasForm;
use Attribute\Input\HasMaxLength;
use Attribute\Input\HasMinLength;
use Attribute\Input\HasPlaceholder;
Expand All @@ -22,4 +33,15 @@ final class TextArea extends Base\AbstractElement
use Attribute\Tag\HasWrap;

protected string $tagName = 'textarea';

/**
* This method is used to configure the widget with the provided default definitions.
*/
public function loadDefaultDefinitions(): array
{
$loadDefaultDefinitions = parent::loadDefaultDefinitions();
$loadDefaultDefinitions += ['id()' => [$this->generateId('textarea-')]];

return $loadDefaultDefinitions;
}
}
2 changes: 1 addition & 1 deletion tests/Button/RenderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ public function testGenerateAriaDescribedBy(): void

public function testGenerateId(): void
{
$this->assertStringContainsString('<button id="button', Button::widget()->render());
$this->assertStringContainsString('<button id="button-', Button::widget()->render());
}

public function testId(): void
Expand Down
190 changes: 157 additions & 33 deletions tests/TextArea/RenderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,139 +15,263 @@ final class RenderTest extends TestCase
{
public function testAutocomplete(): void
{
$this->assertSame('<textarea autocomplete="on"></textarea>', TextArea::widget()->autocomplete('on')->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" autocomplete="on"></textarea>
HTML,
TextArea::widget()->autocomplete('on')->id('textarea-659fc6087e75b')->render()
);
}

public function testAutofocus(): void
{
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" autofocus></textarea>
HTML,
TextArea::widget()->autofocus()->id('textarea-659fc6087e75b')->render()
);
}

public function testAttributes(): void
{
$this->assertSame(
'<textarea class="test-class"></textarea>',
TextArea::widget()->attributes(['class' => 'test-class'])->render(),
<<<HTML
<textarea class="class" id="textarea-659fc6087e75b"></textarea>
HTML,
TextArea::widget()->attributes(['class' => 'class'])->id('textarea-659fc6087e75b')->render()
);
}

public function testClass(): void
{
$this->assertSame(
'<textarea class="test-class"></textarea>',
TextArea::widget()->class('test-class')->render(),
<<<HTML
<textarea class="class" id="textarea-659fc6087e75b"></textarea>
HTML,
TextArea::widget()->class('class')->id('textarea-659fc6087e75b')->render()
);
}

public function testCols(): void
{
$this->assertSame('<textarea cols="1"></textarea>', TextArea::widget()->cols(1)->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" cols="1"></textarea>
HTML,
TextArea::widget()->cols(1)->id('textarea-659fc6087e75b')->render()
);
}

public function testContent(): void
{
$this->assertSame('<textarea>test-content</textarea>', TextArea::widget()->content('test-content')->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b">content</textarea>
HTML,
TextArea::widget()->content('content')->id('textarea-659fc6087e75b')->render()
);
}

public function testDirname(): void
{
$this->assertSame(
'<textarea dirname="test-dirname"></textarea>',
TextArea::widget()->dirname('test-dirname')->render(),
<<<HTML
<textarea id="textarea-659fc6087e75b" dirname="dirname"></textarea>
HTML,
TextArea::widget()->dirname('dirname')->id('textarea-659fc6087e75b')->render()
);
}

public function testDisabled(): void
{
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" disabled></textarea>
HTML,
TextArea::widget()->disabled()->id('textarea-659fc6087e75b')->render()
);
}

public function testElement(): void
public function testGenerateId(): void
{
$this->assertSame('<textarea></textarea>', TextArea::widget()->render());
$this->assertStringContainsString('<textarea id="textarea-', TextArea::widget()->render());
}

public function testId(): void
{
$this->assertSame('<textarea id="test-id"></textarea>', TextArea::widget()->id('test-id')->render());
$this->assertSame(
<<<HTML
<textarea id="id"></textarea>
HTML,
TextArea::widget()->id('id')->render()
);
}

public function testLang(): void
{
$this->assertSame('<textarea lang="test-lang"></textarea>', TextArea::widget()->lang('test-lang')->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" lang="lang"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->lang('lang')->render()
);
}

public function testMaxLength(): void
{
$this->assertSame('<textarea maxlength="1"></textarea>', TextArea::widget()->maxLength(1)->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" maxlength="1"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->maxLength(1)->render()
);
}

public function testMinLength(): void
{
$this->assertSame('<textarea minlength="1"></textarea>', TextArea::widget()->minlength(1)->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" minlength="1"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->minlength(1)->render()
);
}

public function testName(): void
{
$this->assertSame('<textarea name="test-name"></textarea>', TextArea::widget()->name('test-name')->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" name="name"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->name('name')->render()
);
}

public function testPlaceholder(): void
{
$this->assertSame(
'<textarea placeholder="test-placeholder"></textarea>',
TextArea::widget()->placeholder('test-placeholder')->render(),
<<<HTML
<textarea id="textarea-659fc6087e75b" placeholder="placeholder"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->placeholder('placeholder')->render()
);
}

public function testPrefix(): void
{
Assert::equalsWithoutLE(
<<<HTML
test-prefix
<textarea></textarea>
prefix
<textarea id="textarea-659fc6087e75b"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->prefix('prefix')->render()
);
}

public function testReadonly(): void
{
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" readonly></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->readonly()->render()
);
}

public function testRequired(): void
{
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" required></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->required()->render()
);
}

public function testRender(): void
{
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b"></textarea>
HTML,
TextArea::widget()->prefix('test-prefix')->render(),
TextArea::widget()->id('textarea-659fc6087e75b')->render()
);
}

public function testRows(): void
{
$this->assertSame('<textarea rows="1"></textarea>', TextArea::widget()->rows(1)->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" rows="1"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->rows(1)->render()
);
}

public function testStyle(): void
{
$this->assertSame(
'<textarea style="color:red;"></textarea>',
TextArea::widget()->style('color:red;')->render(),
<<<HTML
<textarea id="textarea-659fc6087e75b" style="style;"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->style('style;')->render()
);
}

public function testSuffix(): void
{
Assert::equalsWithoutLE(
<<<HTML
<textarea></textarea>
test-suffix
<textarea id="textarea-659fc6087e75b"></textarea>
suffix
HTML,
TextArea::widget()->suffix('test-suffix')->render(),
TextArea::widget()->id('textarea-659fc6087e75b')->suffix('suffix')->render()
);
}

public function testTabIndex(): void
{
$this->assertSame('<textarea tabindex="1"></textarea>', TextArea::widget()->tabIndex(1)->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" tabindex="1"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->tabIndex(1)->render()
);
}

public function testTemplate(): void
{
$this->assertSame(
'<textarea></textarea>',
TextArea::widget()->prefix('test-prefix')->suffix('test-suffix')->template('{tag}')->render(),
<<<HTML
<textarea id="textarea-659fc6087e75b"></textarea>
HTML,
TextArea::widget()
->id('textarea-659fc6087e75b')
->prefix('prefix')
->suffix('suffix')
->template('{tag}')
->render()
);
}

public function testTitle(): void
{
$this->assertSame(
'<textarea title="test-title"></textarea>',
TextArea::widget()->title('test-title')->render(),
<<<HTML
<textarea id="textarea-659fc6087e75b" title="test-title"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->title('test-title')->render()
);
}

public function testWrap(): void
{
$this->assertSame('<textarea wrap="hard"></textarea>', TextArea::widget()->wrap('hard')->render());
$this->assertSame(
<<<HTML
<textarea id="textarea-659fc6087e75b" wrap="hard"></textarea>
HTML,
TextArea::widget()->id('textarea-659fc6087e75b')->wrap('hard')->render()
);
}
}

0 comments on commit 18bf5da

Please sign in to comment.