<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Response init: simple cases</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#response">
    <meta name="help" href="https://fetch.spec.whatwg.org/#concept-response">
    <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
      var defaultValues = { "type" : "default",
                            "url" : "",
                            "ok" : true,
                            "status" : 200,
                            "statusText" : "",
                            "body" : null
      };

      var statusCodes = { "givenValues" : [200, 300, 400, 500, 599],
                          "expectedValues" : [200, 300, 400, 500, 599]
      };
      var statusTexts = { "givenValues" : ["", "OK", "with space", String.fromCharCode(0x80)],
                          "expectedValues" : ["", "OK", "with space", String.fromCharCode(0x80)]
      };
      var initValuesDict = { "status" : statusCodes,
                             "statusText" : statusTexts
      };

      function isOkStatus(status) {
        return 200 <= status &&  299 >= status;
      }

      var response = new Response();
      for (var attributeName in defaultValues) {
        test(function() {
          var expectedValue = defaultValues[attributeName];
          assert_equals(response[attributeName], expectedValue,
            "Expect default response." + attributeName + " is " + expectedValue);
        }, "Check default value for " + attributeName + " attribute");
      }

      for (var attributeName in initValuesDict) {
        test(function() {
          var valuesToTest = initValuesDict[attributeName];
          for (var valueIdx in valuesToTest["givenValues"]) {
            var givenValue = valuesToTest["givenValues"][valueIdx];
            var expectedValue = valuesToTest["expectedValues"][valueIdx];
            var responseInit = {};
            responseInit[attributeName] = givenValue;
            var response = new Response("", responseInit);
            assert_equals(response[attributeName], expectedValue,
              "Expect response." + attributeName + " is " + expectedValue +
              " when initialized with " + givenValue);
            assert_equals(response.ok, isOkStatus(response.status),
              "Expect response.ok is " + isOkStatus(response.status));
          }
        }, "Check " + attributeName + " init values and associated getter");
      }

      test(function() {
        const response1 = new Response("");
        assert_equals(response1.headers, response1.headers);

        const response2 = new Response("", {"headers": {"X-Foo": "bar"}});
        assert_equals(response2.headers, response2.headers);
        const headers = response2.headers;
        response2.headers.set("X-Foo", "quux");
        assert_equals(headers, response2.headers);
        headers.set("X-Other-Header", "baz");
        assert_equals(headers, response2.headers);
      }, "Test that Response.headers has the [SameObject] extended attribute");
    </script>
  </body>
</html>
