<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Request structure</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#request">
    <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 request = new Request("");
      var methods = ["clone",
                     //Request implements Body
                     "arrayBuffer",
                     "blob",
                     "formData",
                     "json",
                     "text"
                    ];
      var attributes = ["method",
                        "url",
                        "headers",
                        "type",
                        "destination",
                        "referrer",
                        "referrerPolicy",
                        "mode",
                        "credentials",
                        "cache",
                        "redirect",
                        "integrity",
                        //Request implements Body
                        "bodyUsed"
                       ];

      function IsreadOnly(request, attributeToCheck) {
        var defaultValue = undefined;
        var newValue = undefined;
        switch (attributeToCheck) {
          case "method":
            defaultValue = "GET";
            newValue = "POST";
            break;

          case "url":
            //default value is base url
            //i.e http://web-platform.test:8000/fetch/api/request-structure.html
            newValue = "http://url.test";
            break;

          case "headers":
            request.headers = new Headers ({"name":"value"});
            assert_false(request.headers.has("name"), "Headers attribute is read only");
            return;
            break;

          case "type":
            defaultValue = "";
            newValue = "style";
            break;

          case "destination":
            defaultValue = "";
            newValue = "worker";
            break;

          case "referrer":
            defaultValue = "about:client";
            newValue = "http://url.test";
            break;

          case "referrerPolicy":
            defaultValue = "";
            newValue = "unsafe-url";
            break;

          case "mode":
            defaultValue = "cors";
            newValue = "navigate";
            break;

          case "credentials":
            defaultValue = "same-origin";
            newValue = "cors";
            break;

          case "cache":
            defaultValue = "default";
            newValue = "reload";
            break;

          case "redirect":
            defaultValue = "follow";
            newValue = "manual";
            break;

          case "integrity":
            newValue = "CannotWriteIntegrity";
            break;

          case "bodyUsed":
            defaultValue = false;
            newValue = true;
            break;

          default:
            return;
        }

        request[attributeToCheck] = newValue;
        if (defaultValue === undefined)
          assert_not_equals(request[attributeToCheck], newValue, "Attribute " + attributeToCheck + " is read only");
        else
          assert_equals(request[attributeToCheck], defaultValue,
           "Attribute " + attributeToCheck + " is read only. Default value is " + defaultValue);
      }

      for (var idx in methods) {
        test(function() {
          assert_true(methods[idx] in request, "request has " + methods[idx] + " method");
        }, "Request has " + methods[idx] + " method");
      }

      for (var idx in attributes) {
        test(function() {
          assert_true(attributes[idx] in request, "request has " + attributes[idx] + " attribute");
          IsreadOnly(request, attributes[idx]);
        }, "Check " + attributes[idx] + " attribute");
      }
    </script>
  </body>
</html>
