<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>

var test = async_test("Test that screen.orientation.lock() throws when the input isn't valid.");

function onOrientationChangeEvent(ev) {
    assert_unreached('Unexpected orientation change');
}

window.screen.orientation.addEventListener('change', test.step_func(onOrientationChangeEvent));

test.step(function() {
    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock('invalid-orientation');
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(null);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(undefined);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(undefined);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(123);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(window);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(['portrait-primary']);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock(['portrait-primary', 'landscape-primary']);
    });

    assert_equals(screen.orientation.type, 'portrait-primary');
    assert_throws_js(TypeError, function() {
        screen.lock();
    });
});

// Finish asynchronously to give events a chance to fire.
setTimeout(test.step_func(function() {
    assert_equals(screen.orientation.type, 'portrait-primary');
    screen.orientation.unlock();
    test.done();
}));

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

