<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://www.w3.org/TR/css-break-3/#break-decoration"/>
<style>
div {
  margin: 20px;
}

span.round {
  padding: 20px;
  line-height: 100px;
  font-size: 40px;
  border-radius: 40px;
  background-color: yellow;
}
</style>

<div>
<span id="horizontal" class="round">FOO<br>BAR</span>
</div>

<div style="writing-mode:vertical-lr">
<span id="vertical-lr" class="round">FOO<br>BAR</span>
</div>

<div style="writing-mode:vertical-rl">
<span id="vertical-rl" class="round">FOO<br>BAR</span>
</div>

<script>
// Hit test horizontal span with border radius
const horizontalSpan = document.getElementById('horizontal');
const horizontalDiv = horizontalSpan.parentNode;
const horizontalRects = horizontalSpan.getClientRects();
const horizontalLine1 = horizontalRects[0];
const horizontalLine2 = horizontalRects[1];

test(() => {
  const x = horizontalLine1.left + 5;
  const y = horizontalLine1.top + 5;
  assert_equals(document.elementFromPoint(x, y), horizontalDiv);
}, 'Horizontal line 1, hit test outside top-left rounded corner');

test(() => {
  const x = horizontalLine1.left + 20;
  const y = horizontalLine1.top + 20;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 1, hit test inside top-left rounded corner');

test(() => {
  const x = horizontalLine1.left + 5;
  const y = horizontalLine1.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), horizontalDiv);
}, 'Horizontal line 1, hit test outside bottom-left rounded corner');

test(() => {
  const x = horizontalLine1.left + 20;
  const y = horizontalLine1.bottom - 20;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 1, hit test inside bottom-left rounded corner');

test(() => {
  const x = horizontalLine1.right - 5;
  const y = horizontalLine1.top + 5;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 1, hit test inside top-right right-angled corner')

test(() => {
  const x = horizontalLine1.right - 5;
  const y = horizontalLine1.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 1, hit test inside bottom-right right-angled corner')

test(() => {
  const x = horizontalLine2.right - 5;
  const y = horizontalLine2.top + 5;
  assert_equals(document.elementFromPoint(x, y), horizontalDiv);
}, 'Horizontal line 2, hit test outside top-right rounded corner');

test(() => {
  const x = horizontalLine2.right - 20;
  const y = horizontalLine2.top + 20;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 2, hit test inside top-right rounded corner');

test(() => {
  const x = horizontalLine2.right - 5;
  const y = horizontalLine2.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), horizontalDiv);
}, 'Horizontal line 2, hit test outside bottom-right rounded corner');

test(() => {
  const x = horizontalLine2.right - 20;
  const y = horizontalLine2.bottom - 20;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 2, hit test inside bottom-right rounded corner');

test(() => {
  const x = horizontalLine2.left + 5;
  const y = horizontalLine2.top + 5;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 2, hit test inside top-left right-angled corner')

test(() => {
  const x = horizontalLine2.left + 5;
  const y = horizontalLine2.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), horizontalSpan);
}, 'Horizontal line 2, hit test inside bottom-left right-angled corner')

// Hit test vertical-lr span with border radius
const verticalLRSpan = document.getElementById('vertical-lr');
const verticalLRDiv = verticalLRSpan.parentNode;
const verticalLRRects = verticalLRSpan.getClientRects();
const verticalLRLine1 = verticalLRRects[0];
const verticalLRLine2 = verticalLRRects[1];

test(() => {
  const x = verticalLRLine1.left + 5;
  const y = verticalLRLine1.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRDiv);
}, 'Vertical LR line 1, hit test outside top-left rounded corner');

test(() => {
  const x = verticalLRLine1.left + 20;
  const y = verticalLRLine1.top + 20;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 1, hit test inside top-left rounded corner');

test(() => {
  const x = verticalLRLine1.right - 5;
  const y = verticalLRLine1.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRDiv);
}, 'Vertical LR line 1, hit test outside top-right rounded corner');

test(() => {
  const x = verticalLRLine1.right - 20;
  const y = verticalLRLine1.top + 20;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 1, hit test inside top-right rounded corner');

test(() => {
  const x = verticalLRLine1.left + 5;
  const y = verticalLRLine1.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 1, hit test inside bottom-left right-angled corner')

test(() => {
  const x = verticalLRLine1.right - 5;
  const y = verticalLRLine1.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 1, hit test inside bottom-right right-angled corner')

test(() => {
  const x = verticalLRLine2.left + 5;
  const y = verticalLRLine2.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRDiv);
}, 'Vertical LR line 2, hit test outside bottom-left rounded corner');

test(() => {
  const x = verticalLRLine2.left + 20;
  const y = verticalLRLine2.bottom - 20;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 2, hit test inside bottom-left rounded corner');

test(() => {
  const x = verticalLRLine2.right - 5;
  const y = verticalLRLine2.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRDiv);
}, 'Vertical LR line 2, hit test outside bottom-right rounded corner');

test(() => {
  const x = verticalLRLine2.right - 20;
  const y = verticalLRLine2.bottom - 20;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 2, hit test inside bottom-right rounded corner');

test(() => {
  const x = verticalLRLine2.left + 5;
  const y = verticalLRLine2.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 2, hit test inside top-left right-angled corner')

test(() => {
  const x = verticalLRLine2.right - 5;
  const y = verticalLRLine2.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalLRSpan);
}, 'Vertical LR line 2, hit test inside top-right right-angled corner')

// Hit test vertical-rl span with border radius
const verticalRLSpan = document.getElementById('vertical-rl');
const verticalRLDiv = verticalRLSpan.parentNode;
const verticalRLRects = verticalRLSpan.getClientRects();
const verticalRLLine1 = verticalRLRects[0].left > verticalRLRects[1].left ? verticalRLRects[0] : verticalRLRects[1];
const verticalRLLine2 = verticalRLRects[0].left > verticalRLRects[1].left ? verticalRLRects[1] : verticalRLRects[0];

test(() => {
  const x = verticalRLLine1.left + 5;
  const y = verticalRLLine1.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLDiv);
}, 'Vertical RL line 1, hit test outside top-left rounded corner');

test(() => {
  const x = verticalRLLine1.left + 20;
  const y = verticalRLLine1.top + 20;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 1, hit test inside top-left rounded corner');

test(() => {
  const x = verticalRLLine1.right - 5;
  const y = verticalRLLine1.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLDiv);
}, 'Vertical RL line 1, hit test outside top-right rounded corner');

test(() => {
  const x = verticalRLLine1.right - 20;
  const y = verticalRLLine1.top + 20;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 1, hit test inside top-right rounded corner');

test(() => {
  const x = verticalRLLine1.left + 5;
  const y = verticalRLLine1.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 1, hit test inside bottom-left right-angled corner')

test(() => {
  const x = verticalRLLine1.right - 5;
  const y = verticalRLLine1.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 1, hit test inside bottom-right right-angled corner')

test(() => {
  const x = verticalRLLine2.left + 5;
  const y = verticalRLLine2.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLDiv);
}, 'Vertical RL line 2, hit test outside bottom-left rounded corner');

test(() => {
  const x = verticalRLLine2.left + 20;
  const y = verticalRLLine2.bottom - 20;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 2, hit test inside bottom-left rounded corner');

test(() => {
  const x = verticalRLLine2.right - 5;
  const y = verticalRLLine2.bottom - 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLDiv);
}, 'Vertical RL line 2, hit test outside bottom-right rounded corner');

test(() => {
  const x = verticalRLLine2.right - 20;
  const y = verticalRLLine2.bottom - 20;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 2, hit test inside bottom-right rounded corner');

test(() => {
  const x = verticalRLLine2.left + 5;
  const y = verticalRLLine2.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 2, hit test inside top-left right-angled corner')

test(() => {
  const x = verticalRLLine2.right - 5;
  const y = verticalRLLine2.top + 5;
  assert_equals(document.elementFromPoint(x, y), verticalRLSpan);
}, 'Vertical RL line 2, hit test inside top-right right-angled corner')
</script>
