// Copyright (C) 2019 Alexey Shvayka. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-catchfinallyfunctions
description: >
  thrower is anonymous built-in function with length of 1 that throws reason.
info: |
  Catch Finally Functions

  ...
  8. Let thrower be equivalent to a function that throws reason.
  9. Return ? Invoke(promise, "then", « thrower »).

  The "length" property of a Catch Finally function is 1.
features: [Promise.prototype.finally, Reflect.construct, class, arrow-function]
includes: [isConstructor.js]
flags: [async]
---*/

class MyError extends Error {}

var myError = new MyError();
Promise.reject(myError)
  .finally(function() {})
  .then(function(value) {
    $DONE('Expected promise to be rejected, got fulfilled with ' + value);
  }, function(reason) {
    if (reason === myError) {
      $DONE();
    } else {
      $DONE(reason);
    }
  });

var calls = 0;
var expected = [
  { length: 0, name: '' },
  { length: 1, name: '' }
];

var then = Promise.prototype.then;
Promise.prototype.then = function(resolve, reject) {
  assert.sameValue(isConstructor(reject), false, 'isConstructor(reject) must return false');
  assert.throws(TypeError, () => {
    new reject();
  }, '`new reject()` throws TypeError');

  assert.sameValue(
    resolve.length,
    expected[calls].length,
    'The value of resolve.length is expected to equal the value of expected[calls].length'
  );
  assert.sameValue(
    resolve.name,
    expected[calls].name,
    'The value of resolve.name is expected to equal the value of expected[calls].name'
  );
  if (calls === 0) {
    assert.throws(MyError, resolve, '`resolve()` throws `MyError`');
  }

  calls += 1;

  return then.call(this, resolve, reject);
};
