<!DOCTYPE HTML>
<meta charset="utf-8">
<title>Geolocation Test: PositionOptions tests</title>
<link rel="help" href="http://www.w3.org/TR/geolocation-API/#position_options_interface">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src='support.js'></script>

<p>Clear all Geolocation permissions before running this test. If prompted for permission, please allow.</p>
<div id="log"></div>

<script>
// Rewrite http://dev.w3.org/geo/api/test-suite/t.html?00123
test(function() {
  try {
    geo.getCurrentPosition(dummyFunction, null, {enableHighAccuracy: "boom"});
    geo.getCurrentPosition(dummyFunction, null, {enableHighAccuracy: 321});
    geo.getCurrentPosition(dummyFunction, null, {enableHighAccuracy: -Infinity});
    geo.getCurrentPosition(dummyFunction, null, {enableHighAccuracy: {foo: 5}});
  } catch(e) {
    assert_unreached('An exception was thrown unexpectedly: ' + e.message);
  }
}, 'Call getCurrentPosition with wrong type for enableHighAccuracy. No exception expected.');

// Rewrite http://dev.w3.org/geo/api/test-suite/t.html?00124
test(function() {
  try {
    geo.watchPosition(dummyFunction, null, {enableHighAccuracy: "boom"});
    geo.watchPosition(dummyFunction, null, {enableHighAccuracy: 321});
    geo.watchPosition(dummyFunction, null, {enableHighAccuracy: -Infinity});
    geo.watchPosition(dummyFunction, null, {enableHighAccuracy: {foo: 5}});
  } catch(e) {
    assert_unreached('An exception was thrown unexpectedly: ' + e.message);
  }
}, 'Call watchPosition with wrong type for enableHighAccuracy. No exception expected.');

// Rewrite http://dev.w3.org/geo/api/test-suite/t.html?00086, 00088, 00091 and 00092
test(function() {
  var t86 = async_test('Set timeout and maximumAge to 0, check that timeout error raised (getCurrentPosition)'),
      t88 = async_test('Set timeout and maximumAge to 0, check that timeout error raised (watchPosition)'),
      t91 = async_test('Check that a negative timeout value is equivalent to a 0 timeout value (getCurrentLocation)'),
      t92 = async_test('Check that a negative timeout value is equivalent to a 0 timeout value (watchPosition)');

  try {
    geo.getCurrentPosition(
        t86.unreached_func('A success callback was invoked unexpectedly'),
        t86.step_func_done(function(err) {
          assert_equals(err.code, err.TIMEOUT);
        }),
        {timeout: 0, maximumAge: 0}
    );
  } catch(e) {
    t86.step(function() {
      assert_unreached('An exception was thrown unexpectedly: ' + e.message);
    });
  }

  try {
    geo.watchPosition(
        t88.unreached_func('A success callback was invoked unexpectedly'),
        t88.step_func_done(function(err) {
          assert_equals(err.code, err.TIMEOUT);
        }),
        {timeout: 0, maximumAge: 0}
    );
  } catch(e) {
    t88.step(function() {
      assert_unreached('An exception was thrown unexpectedly: ' + e.message);
    });
  }

  try {
    geo.getCurrentPosition(
        t91.unreached_func('A success callback was invoked unexpectedly'),
        t91.step_func_done(function(err) {
          assert_equals(err.code, err.TIMEOUT);
        }),
        {timeout:-1, maximumAge: 0}
    );
  } catch(e) {
    t91.step(function() {
      assert_unreached('An exception was thrown unexpectedly: ' + e.message);
    });
  }

  try {
    geo.watchPosition(
        t92.unreached_func('A success callback was invoked unexpectedly'),
        t92.step_func_done(function(err) {
          assert_equals(err.code, err.TIMEOUT);
        }),
        {timeout: -1, maximumAge: 0}
    );
  } catch(e) {
    t92.step(function() {
      assert_unreached('An exception was thrown unexpectedly: ' + e.message);
    });
  }
}, 'PositionOptions tests');
</script>
