18declare(strict_types=1);
24trait HasOptionFilterTestHelper
29 public function symbol():
I\Symbol\Factory
33 new S\Glyph\Factory(),
34 new S\Avatar\Factory()
40 protected function testHasOptionFilter(
I\Input\Field\HasOptionFilterInternal $component): void
42 $this->assertTrue($component->hasOptionFilter(),
'The component should be searchable.');
47 $html = $this->render($component);
48 $expected1 =
'role="search"';
49 $expected2 =
'c-field--has-option-filter__item';
50 $this->assertStringContainsString($expected1, $html);
51 $this->assertStringContainsString($expected2, $html);
58 $strip_ids_fn =
function (
string $html):
string {
59 return preg_replace_callback(
60 '/\b(id|for|aria-labelledby|aria-describedby|aria-controls)="id_\d+"/',
62 return $matches[1] .
'="id_stripped"';
67 $html = $strip_ids_fn($html);
70 $start_cut_anchor =
'c-input--has-option-filter__nothing-selected';
71 $end_cut_anchor =
'<span class="message-no-match';
72 $start_pos = mb_strpos($html, $start_cut_anchor);
73 $closing_div_pos = mb_strpos($html,
'</div>', $start_pos);
74 $cut_after_pos = $closing_div_pos + mb_strlen(
'</div>');
75 $span_pos = mb_strpos($html, $end_cut_anchor, $cut_after_pos);
77 $filter_before_nesting = $strip_ids_fn(parent::brutallyTrimHTML(
'<label>label</label><div class="c-input__field"><button type="button" class="c-input--has-option-filter__visibility-toggle btn btn-link" aria-controls="id_5" aria-expanded="false"><span class="text-expand"><span class="glyph" aria-label="expand_content" role="img"><span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span></span>ui_field_option_filter_show_all_options</span><span class="text-collapse" style="display: none;"><span class="glyph" aria-label="collapse/back" role="img"><span class="glyphicon glyphicon-triangle-left" aria-hidden="true"></span></span>ui_field_option_filter_show_less</span></button><div class="c-input--has-option-filter__search-input" role="search"><label for="id_2"><span class="label__text" id="id_3">ui_field_option_filter_search_in</span><span class="screen-reader-hint sr-only" id="id_4">ui_field_option_filter_screen_reader_hint</span><input id="id_2" type="text" role="searchbox" aria-labelledby="id_3" aria-describedby="id_4"></label><button type="button" class="c-input--has-option-filter__clear-search btn btn-link" aria-controls="id_2" style="display: none;"><span class="glyph" aria-label="remove" role="img"><span class="glyphicon glyphicon-minus-sign" aria-hidden="true"></span></span>ui_field_option_filter_clear_search</button></div><div class="c-input--has-option-filter__field" id="id_5" role="region" aria-label="ui_field_option_filter_filtered_results_aria_label"><div class="c-input--has-option-filter__synopsis"><div class="result-count sr-only" role="status" aria-live="polite" style="display: none;">ui_field_option_filter_options_shown</div></div><div class="c-input--has-option-filter__nothing-selected">ui_field_option_filter_no_selection</div>'));
78 $filter_after_nesting = $strip_ids_fn(parent::brutallyTrimHTML(
'<span class="message-no-match" style="display: none">ui_field_option_filter_no_match</span></div></div><div class="c-input__help-byline">byline</div></fieldset>'));
79 $expected_before_nesting = mb_substr($html, 0, $cut_after_pos);
80 $expected_after_nesting = mb_substr($html, $span_pos);
82 $this->assertStringContainsString($filter_before_nesting, $expected_before_nesting);
83 $this->assertEquals($filter_after_nesting, $expected_after_nesting);