<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body id="body">

<input id="range1" type="range">

<p id="description"></p>
<div id="console"></div>
<div id="notifications"></div>

<script>

    description("This tests that a basic range returns all the correct information for the mac platform.");
    
    var range = 0;
    var valueChangeCount = 0;
    function notificationCallback(notification) {
        if (notification == "AXValueChanged") {
           document.getElementById("notifications").innerHTML += "Successfully received " + notification + "<br>";
           valueChangeCount++;
        }

        if (valueChangeCount == 2) {
           range.removeNotificationListener();
           finishJSTest();
        }
    }

    if (window.accessibilityController) {
        jsTestIsAsync = true;

        document.getElementById("range1").focus();
        range = accessibilityController.focusedElement;
        range.addNotificationListener(notificationCallback);

        // Check that min/max/value return correct default values.
        shouldBe("range.minValue", "0");
        shouldBe("range.maxValue", "100");
        shouldBe("range.intValue", "50");

        // Check the value indicator returns a value.
        var valueIndicator = range.childAtIndex(0);
        shouldBe("valueIndicator.intValue", "50");
        
        // Check that incrementing/decrementing sends AXValueChange.
        eventSender.keyDown("leftArrow");
        shouldBe("range.intValue", "49");
        shouldBe("valueIndicator.intValue", "49");

        eventSender.keyDown("rightArrow");
        shouldBe("range.intValue", "50");
        shouldBe("valueIndicator.intValue", "50");

        // Check that a hit test on the value indicator succeeds.
        var hitTestIndicator = accessibilityController.elementAtPoint(range.x + range.width/2, range.y + range.height/2);
        shouldBeTrue("valueIndicator.isEqual(hitTestIndicator)");

        // Check that outside the indicator returns the slider.
        var hitTestRange = accessibilityController.elementAtPoint(range.x + 1, range.y + range.height/2);
        shouldBeTrue("range.isEqual(hitTestRange)");
    }

</script>
</body>
</html>
