if (self.importScripts) {
    importScripts('/resources/testharness.js');
    importScripts('../resources/testharness-helpers.js');
    importScripts('../resources/test-helpers.js');
}

// TODO(b/250611661): implement complete Cache API and adhere to web spec. Once
// complete, enable the tests commented out.

// cache_test(function(cache) {
//     return assert_promise_rejects(
//       cache.add(),
//       new TypeError(),
//       'Cache.add should throw a TypeError when no arguments are given.');
//   }, 'Cache.add called with no arguments');

cache_test(function(cache) {
    return cache.add('../resources/simple.txt')
      .then(function(result) {
          assert_equals(result, undefined,
                        'Cache.add should resolve with undefined on success.');
        });
  }, 'Cache.add called with relative URL specified as a string');

// cache_test(function(cache) {
//     return assert_promise_rejects(
//       cache.add('javascript://this-is-not-http-mmkay'),
//       new TypeError(),
//       'Cache.add should throw a TypeError for non-HTTP/HTTPS URLs.');
//   }, 'Cache.add called with non-HTTP/HTTPS URL');

cache_test(function(cache) {
    var request = new Request('../resources/simple.txt');
    return cache.add(request)
      .then(function(result) {
          assert_equals(result, undefined,
                        'Cache.add should resolve with undefined on success.');
        });
  }, 'Cache.add called with Request object');

cache_test(function(cache) {
    var request = new Request('../resources/simple.txt');
    return cache.add(request)
      .then(function(result) {
          assert_equals(result, undefined,
                        'Cache.add should resolve with undefined on success.');
        })
      .then(function() {
          return cache.add(request);
        })
      .then(function(result) {
          assert_equals(result, undefined,
                        'Cache.add should resolve with undefined on success.');
        });
  }, 'Cache.add called twice with the same Request object');

cache_test(function(cache) {
    return cache.add('this-does-not-exist-please-dont-create-it')
      .then(function(result) {
          assert_equals(result, undefined,
                        'Cache.add should resolve with undefined on success.');
        });
  }, 'Cache.add with request that results in a status of 404');

// cache_test(function(cache) {
//     return cache.add('../resources/fetch-status.py?status=500')
//       .then(function(result) {
//           assert_equals(result, undefined,
//                         'Cache.add should resolve with undefined on success.');
//         });
//   }, 'Cache.add with request that results in a status of 500');

// cache_test(function(cache) {
//     return assert_promise_rejects(
//       cache.addAll(),
//       new TypeError(),
//       'Cache.addAll with no arguments should throw TypeError.');
//   }, 'Cache.addAll with no arguments');

// cache_test(function(cache) {
//     // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
//     var urls = ['../resources/simple.txt', undefined, '../resources/blank.html'];
//     return assert_promise_rejects(
//       cache.addAll(),
//       new TypeError(),
//       'Cache.addAll should throw TypeError for an undefined argument.');
//   }, 'Cache.addAll with a mix of valid and undefined arguments');

// cache_test(function(cache) {
//     // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
//     var urls = ['../resources/simple.txt', self.location.href, '../resources/blank.html'];
//     return cache.addAll(urls)
//       .then(function(result) {
//           assert_equals(result, undefined,
//                         'Cache.addAll should resolve with undefined on ' +
//                         'success.');
//         });
//   }, 'Cache.addAll with string URL arguments');

// cache_test(function(cache) {
//     // Assumes the existence of ../resources/simple.txt and ../resources/blank.html
//     var urls = ['../resources/simple.txt', self.location.href, '../resources/blank.html'];
//     var requests = urls.map(function(url) {
//         return new Request(url);
//       });
//     return cache.addAll(requests)
//       .then(function(result) {
//           assert_equals(result, undefined,
//                         'Cache.addAll should resolve with undefined on ' +
//                         'success.');
//         });
//   }, 'Cache.addAll with Request arguments');

// cache_test(function(cache) {
//     // Assumes that ../resources/simple.txt and ../resources/blank.html exist. The second
//     // resource does not.
//     var urls = ['../resources/simple.txt', 'this-resource-should-not-exist', '../resources/blank.html'];
//     var requests = urls.map(function(url) {
//         return new Request(url);
//       });
//     return cache.addAll(requests)
//       .then(function(result) {
//           assert_equals(result, undefined,
//                         'Cache.addAll should resolve with undefined on ' +
//                         'success.');
//         });
//   }, 'Cache.addAll with a mix of succeeding and failing requests');

// cache_test(function(cache) {
//     var request = new Request('../resources/simple.txt');
//     return assert_promise_rejects(
//       cache.addAll([request, request]),
//       'InvalidStateError',
//       'Cache.addAll should throw InvalidStateError if the same request is added ' +
//       'twice.');
//   }, 'Cache.addAll called with the same Request object specified twice');

done();
