<body>
<p>Test the behavior of DOMApplicationCache methods related to dynamic entries when the context
is not associated with any cache.</p>
<div id="result"></div>
<script>
if (window.testRunner)
    testRunner.dumpAsText();

function log(message)
{
    document.getElementById("result").innerHTML += message + "<br>";
}


function isResultCorrect(_actual, _expected)
{
    if (_expected === 0)
        return _actual === _expected && (1/_actual) === (1/_expected);
    if (_actual === _expected)
        return true;
    if (typeof(_expected) == "number" && isNaN(_expected))
        return typeof(_actual) == "number" && isNaN(_actual);
    if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([])) {
        log("Array comparison is not supported");
        return false;
    }
    return false;
}

function shouldBe(_a, _b)
{
  if (typeof _a != "string" || typeof _b != "string")
    log("WARN: shouldBe() expects string arguments");
  var exception;
  var _av;
  try {
     _av = eval(_a);
  } catch (e) {
     exception = e;
  }
  var _bv = eval(_b);

  if (exception)
    log("FAIL: " + _a + " should be " + _bv + ". Threw exception " + exception);
  else if (isResultCorrect(_av, _bv))
    log("PASS: " + _a + " is " + _b);
  else if (typeof(_av) == typeof(_bv))
    log("FAIL: " + _a + " should be " + _bv + ". Was " + stringify(_av) + ".");
  else
    log("FAIL: " + _a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ").");
}


shouldBe("applicationCache.items.length", "0");
shouldBe("applicationCache.items.item(0)", "null");
shouldBe("applicationCache.items.item(1)", "null");
shouldBe("applicationCache.items.item(0xffffffff)", "null");
shouldBe("applicationCache.items.item(0xfffffffe)", "null");
shouldBe("applicationCache.items.item(-1)", "null");
shouldBe("applicationCache.items.item(-2)", "null");

shouldBe("applicationCache.items[0xfffffffe]", "undefined");
shouldBe("applicationCache.items[0xffffffff]", "undefined");

// The below index access tests give different results in WebKit and Firefox 3.1b2 (undefined vs. empty string).
shouldBe("applicationCache.items['0']", "undefined");
shouldBe("applicationCache.items['']", "undefined");
shouldBe("applicationCache.items[0]", "undefined");
shouldBe("applicationCache.items[1]", "undefined");
shouldBe("applicationCache.items[-1]", "undefined");
shouldBe("applicationCache.items[-2]", "undefined");
applicationCache.items[100] = "foobar";
applicationCache.items['100'] = "foobar";
applicationCache.items['foo'] = "bar";
shouldBe("applicationCache.items[100]", "undefined");
shouldBe("applicationCache.items['100']", "undefined");

shouldBe("applicationCache.items['foo']", "undefined");
shouldBe("applicationCache.items[0.1]", "undefined");

try {
    applicationCache.hasItem('foo');
    log("FAIL: hasItem didn't raise an exception");
} catch (ex) {
    if (ex.code == 11)
        log("PASS: hasItem raised INVALID_STATE_ERR");
    else
        log("FAIL: hasItem raised unexpected exception " + ex);
}

try {
    applicationCache.add('foo');
    log("FAIL: add didn't raise an exception");
} catch (ex) {
    if (ex.code == 11)
        log("PASS: add raised INVALID_STATE_ERR");
    else
        log("FAIL: add raised unexpected exception " + ex);
}

try {
    applicationCache.remove('bar');
    log("FAIL: remove didn't raise an exception");
} catch (ex) {
    if (ex.code == 11)
        log("PASS: remove raised INVALID_STATE_ERR");
    else
        log("FAIL: remove raised unexpected exception " + ex);
}

shouldBe("applicationCache.items.length", "0");



log("DONE");

</script>
</head>
</body>
