The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use t::TestBase;
run_template_process(selector_test => 1);

__DATA__
=== xpath
--- vars
'/div' => 'xxx'
--- template
<div>foo</div>
--- expected
<div>xxx</div>

=== xpath
--- vars
'//span' => 'xxx'
--- template
<div>
<p><span>hello</span></p>
</div>
--- expected
<div>
<p><span>xxx</span></p>
</div>

=== xpath
--- vars
'/div/div/span' => 'xxx'
--- template
<div>
    <div class="foo">
        <span>boo</span>
    </div>
    <form>
        <span>boo</span>
    </form>
</div>
--- expected
<div>
    <div class="foo">
        <span>xxx</span>
    </div>
    <form>
        <span>boo</span>
    </form>
</div>

=== xpath
--- vars
'//h1' => 'xxx'
--- template
<div>
<h1>h1 -1</h1>
<h1>h1 -2</h1>
</div>
--- expected
<div>
<h1>xxx</h1>
<h1>xxx</h1>
</div>

=== xpath
--- vars
'//h1[2]' => 'xxx'
--- template
<div>
<h1>h1 -1</h1>
<h1>h1 -2</h1>
</div>
--- expected
<div>
<h1>h1 -1</h1>
<h1>xxx</h1>
</div>

=== xpath (attr)
--- vars
'//img[1]/@src' => 'xxx'
--- template
<div>
<img src="foo" />
<img src="bar" />
</div>
--- expected
<div>
<img src="xxx" />
<img src="bar" />
</div>

=== xpath
--- vars
'//*[@class="bar"]' => 'xxx'
--- template
<div>
    <span class="foo">foo</span>
    <span class="bar">bar</span>
</div>
--- expected
<div>
    <span class="foo">foo</span>
    <span class="bar">xxx</span>
</div>

=== xpath
--- vars
'//*[@id="foo"]' => 'xxx'
--- template
<div>
    <span id="foo">foo</span>
    <span id="bar">bar</span>
</div>
--- expected
<div>
    <span id="foo">xxx</span>
    <span id="bar">bar</span>
</div>

=== id()
--- vars
'id("foo")' => 'xxx'
--- template
<div>
    <span id="foo">foo</span>
    <span id="bar">bar</span>
</div>
--- expected
<div>
    <span id="foo">xxx</span>
    <span id="bar">bar</span>
</div>

=== id() (attr)
--- vars
'id("foo")/@title' => 'xxx'
--- template
<div>
    <span id="foo" title="foo">foo</span>
    <span id="bar" title="bar">bar</span>
</div>
--- expected
<div>
    <span id="foo" title="xxx">foo</span>
    <span id="bar" title="bar">bar</span>
</div>

=== css selector
--- vars
'span' => 'xxx'
--- template
<div>
<p><span>hello</span></p>
</div>
--- expected
<div>
<p><span>xxx</span></p>
</div>

=== css selector
--- vars
'div div span' => 'xxx'
--- template
<div>
    <div class="foo">
        <span>boo</span>
    </div>
    <form>
        <span>boo</span>
    </form>
</div>
--- expected
<div>
    <div class="foo">
        <span>xxx</span>
    </div>
    <form>
        <span>boo</span>
    </form>
</div>

=== css selector
--- vars
'h1' => 'xxx'
--- template
<div>
<h1>h1 -1</h1>
<h1>h1 -2</h1>
</div>
--- expected
<div>
<h1>xxx</h1>
<h1>xxx</h1>
</div>

=== css selector (attr)
--- vars
'img@src' => 'xxx'
--- template
<div>
<img src="foo" />
</div>
--- expected
<div>
<img src="xxx" />
</div>

=== css selector
--- vars
'.bar' => 'xxx'
--- template
<div>
    <span class="foo">foo</span>
    <span class="bar">bar</span>
</div>
--- expected
<div>
    <span class="foo">foo</span>
    <span class="bar">xxx</span>
</div>

=== css selector
--- vars
'span.bar' => 'xxx'
--- template
<div>
    <span class="bar">bar</span>
    <div class="bar">bar</div>
</div>
--- expected
<div>
    <span class="bar">xxx</span>
    <div class="bar">bar</div>
</div>

=== css selector (attr)
--- vars
'span.bar@title' => 'xxx'
--- template
<div>
    <span class="foo" title="foo">foo</span>
    <span class="bar" title="bar">bar</span>
</div>
--- expected
<div>
    <span class="foo" title="foo">foo</span>
    <span class="bar" title="xxx">bar</span>
</div>

=== css selector
--- vars
'#foo' => 'xxx'
--- template
<div>
    <span id="foo">foo</span>
    <span id="bar">bar</span>
</div>
--- expected
<div>
    <span id="foo">xxx</span>
    <span id="bar">bar</span>
</div>

=== css selector
--- vars
'div#foo' => 'xxx'
--- template
<div>
    <span id="foo">foo</span>
    <div id="foo">foo</div>
</div>
--- expected
<div>
    <span id="foo">foo</span>
    <div id="foo">xxx</div>
</div>

=== css selector (attr)
--- vars
'div#foo@title' => 'xxx'
--- template
<div>
    <span id="foo">foo</span>
    <div id="foo" title="foo">foo</div>
</div>
--- expected
<div>
    <span id="foo">foo</span>
    <div id="foo" title="xxx">foo</div>
</div>

=== css selector (attr)
--- vars
'div#foo/@title' => 'xxx'
--- template
<div>
    <span id="foo">foo</span>
    <div id="foo" title="foo">foo</div>
</div>
--- expected
<div>
    <span id="foo">foo</span>
    <div id="foo" title="xxx">foo</div>
</div>

=== css selector (attr)
--- vars
'@title' => 'xxx'
--- template
<div title="foo">
    <div id="foo" title="foo">foo</div>
</div>
--- expected
<div title="xxx">
    <div id="foo" title="xxx">foo</div>
</div>

=== xpath (OR)
--- vars
'//span | //h1' => 'xxx'
--- template
<div>
    <span></span>
    <h1></h1>
</div>
--- expected
<div>
    <span>xxx</span>
    <h1>xxx</h1>
</div>

=== css selector (OR)
--- vars
'span, h1' => 'xxx'
--- template
<div>
    <span></span>
    <h1></h1>
</div>
--- expected
<div>
    <span>xxx</span>
    <h1>xxx</h1>
</div>