browser_tester 1.5.0

Deterministic lightweight browser runtime for Rust tests
Documentation
use super::*;

#[test]
fn element_insert_adjacent_element_inserts_at_all_positions_and_returns_inserted_element()
-> Result<()> {
    let html = r#"
        <div id='root'><span id='b'>B</span></div>
        <button id='run'>run</button>
        <p id='result'></p>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const root = document.getElementById('root');
            const b = document.getElementById('b');

            const a = document.createElement('span');
            a.id = 'a';
            a.textContent = 'A';
            const c = document.createElement('span');
            c.id = 'c';
            c.textContent = 'C';
            const d = document.createElement('span');
            d.id = 'd';
            d.textContent = 'D';
            const e = document.createElement('span');
            e.id = 'e';
            e.textContent = 'E';

            const r1 = b.insertAdjacentElement('BeFoReBeGiN', a) === a;
            const r2 = b.insertAdjacentElement('afterbegin', d) === d;
            const r3 = b.insertAdjacentElement('beforeend', e) === e;
            const r4 = b.insertAdjacentElement('afterend', c) === c;

            document.getElementById('result').textContent = [
              r1,
              r2,
              r3,
              r4,
              root.textContent,
              b.firstElementChild.id,
              b.lastElementChild.id
            ].join(':');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "true:true:true:true:ADBEC:d:e")?;
    Ok(())
}

#[test]
fn element_insert_adjacent_element_invalid_position_throws_syntax_error() -> Result<()> {
    let html = r#"
        <div id='root'><span id='b'>B</span></div>
        <button id='run'>run</button>
        <p id='result'></p>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const b = document.getElementById('b');
            const x = document.createElement('span');
            x.id = 'x';
            x.textContent = 'X';
            const pos = 'middle';

            let syntaxError = false;
            try {
              const returned = b.insertAdjacentElement(pos, x);
              document.getElementById('result').setAttribute('data-returned', String(returned));
            } catch (e) {
              syntaxError = String(e).includes('SyntaxError');
            }

            document.getElementById('result').textContent = [
              syntaxError,
              document.querySelectorAll('#x').length,
              document.getElementById('root').textContent
            ].join(':');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "true:0:B")?;
    Ok(())
}

#[test]
fn element_insert_adjacent_element_non_element_argument_throws_type_error() -> Result<()> {
    let html = r#"
        <div id='root'><span id='b'>B</span></div>
        <button id='run'>run</button>
        <p id='result'></p>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const b = document.getElementById('b');
            const textNode = document.createTextNode('X');

            let textNodeTypeError = false;
            try {
              const returnedTextNode = b.insertAdjacentElement('beforeend', textNode);
              document.getElementById('result').setAttribute('data-text-node', String(returnedTextNode));
            } catch (e) {
              textNodeTypeError = String(e).includes('TypeError');
            }

            let primitiveTypeError = false;
            try {
              const returnedPrimitive = b.insertAdjacentElement('beforeend', 'X');
              document.getElementById('result').setAttribute('data-primitive', String(returnedPrimitive));
            } catch (e) {
              primitiveTypeError = String(e).includes('TypeError');
            }

            document.getElementById('result').textContent = [
              textNodeTypeError,
              primitiveTypeError,
              b.textContent
            ].join(':');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "true:true:B")?;
    Ok(())
}

#[test]
fn element_insert_adjacent_element_returns_null_when_insertion_fails() -> Result<()> {
    let html = r#"
        <div id='a'><span id='b'>B</span></div>
        <button id='run'>run</button>
        <p id='result'></p>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const a = document.getElementById('a');
            const b = document.getElementById('b');

            const cycle = b.insertAdjacentElement('afterbegin', a);

            const detached = document.createElement('span');
            detached.textContent = 'T';
            const outsideLeft = detached.insertAdjacentElement('beforebegin', document.createElement('i'));
            const outsideRight = detached.insertAdjacentElement('afterend', document.createElement('em'));

            document.getElementById('result').textContent = [
              cycle === null,
              outsideLeft === null,
              outsideRight === null,
              a.textContent,
              b.textContent,
              a.contains(b)
            ].join(':');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "true:true:true:B:B:true")?;
    Ok(())
}