@ 261107.7
current
function runDigestTests(subtle, sourceData, getVectors) {
  function algorithmName(algorithm) {
    return typeof algorithm === 'string' ? algorithm : algorithm.name;
  }

  function withNameGetter(algorithm, getter) {
    var result = typeof algorithm === 'string' ? {} : { ...algorithm };
    Object.defineProperty(result, 'name', {
      enumerable: true,
      get: getter,
    });
    return result;
  }

  Object.keys(sourceData).forEach(function (size) {
    getVectors(size).forEach(function (vector) {
      promise_test(function () {
        return subtle.digest(vector.algorithm, sourceData[size])
          .then(function (result) {
            assert_true(
              equalBuffers(result, vector.expected),
              'digest matches expected'
            );
          });
      }, vector.label);

      if (!vector.mutations || sourceData[size].length === 0) {
        return;
      }

      promise_test(function () {
        var buffer = new Uint8Array(sourceData[size]);
        buffer[0] = ~buffer[0];
        var algorithm = withNameGetter(vector.algorithm, function () {
          buffer[0] = sourceData[size][0];
          return algorithmName(vector.algorithm);
        });
        return subtle.digest(algorithm, buffer).then(function (result) {
          assert_true(
            equalBuffers(result, vector.expected),
            'digest matches expected'
          );
        });
      }, vector.label + ' and altered buffer during call');

      promise_test(function () {
        var buffer = new Uint8Array(sourceData[size]);
        var promise = subtle.digest(vector.algorithm, buffer)
          .then(function (result) {
            assert_true(
              equalBuffers(result, vector.expected),
              'digest matches expected'
            );
          });
        buffer[0] = ~buffer[0];
        return promise;
      }, vector.label + ' and altered buffer after call');

      promise_test(function () {
        var buffer = new Uint8Array(sourceData[size]);
        var algorithm = withNameGetter(vector.algorithm, function () {
          if (!buffer.buffer.detached) {
            buffer.buffer.transfer();
          }
          return algorithmName(vector.algorithm);
        });
        return subtle.digest(algorithm, buffer).then(function (result) {
          assert_true(
            equalBuffers(result, vector.emptyExpected),
            'digest on transferred buffer should match result for empty buffer'
          );
        });
      }, vector.label + ' and transferred buffer during call');

      promise_test(function () {
        var buffer = new Uint8Array(sourceData[size]);
        var promise = subtle.digest(vector.algorithm, buffer)
          .then(function (result) {
            assert_true(
              equalBuffers(result, vector.expected),
              'digest matches expected'
            );
          });
        buffer.buffer.transfer();
        return promise;
      }, vector.label + ' and transferred buffer after call');
    });
  });
}