// should have a length of 1
assert.equal(Array.prototype.findIndex.length, 1);

// should handle basic case
assert.equal([1, 2, 3].findIndex(function(v) {
  return v * v === 4;
}), 1);

// should handle arrow functions
assert.equal([1, 2, 3].findIndex(v => v * v === 4), 1);

// should return -1 when not found
assert.equal([1, 2, 3].findIndex(v => v > 10), -1);

// should return first match
assert.equal([2, 2, 3].findIndex(v => v * v === 4), 0);

// should handle custom objects
assert.equal(Array.prototype.findIndex.call({
  'length': 2,
  '0': false,
  '1': true
}, v => v), 1);

var lengthCalls = 0;
var itemCalls = 0;
var callbackCalls = 0;
var object = {
  length: {
    valueOf() {
      lengthCalls++;
      return 3;
    }
  },
  get 2() {
    itemCalls++;
    return 'a';
  }
};

assert.equal(Array.prototype.findIndex.call(object, (v) => {
  callbackCalls++;
  return v === 'a';
}), 2);
assert.equal(lengthCalls, 1);
assert.equal(itemCalls, 1);
assert.equal(callbackCalls, 3);

// should have a length of 1
//assert.equal(Array.prototype.findIndex.length, 1);

// should handle basic case
assert.equal([1, 2, 3].findIndex(function(v) {
  return v * v === 4;
}), 1);

// should handle arrow functions
assert.equal([1, 2, 3].findIndex(v => v * v === 4), 1);

// should return -1 when not found
assert.equal([1, 2, 3].findIndex(v => v > 10), -1);

// should return first match
assert.equal([2, 2, 3].findIndex(v => v * v === 4), 0);

// should handle custom objects
assert.equal(Array.prototype.findIndex.call({
  'length': 2,
  '0': false,
  '1': true
}, v => v), 1);

var lengthCalls = 0;
var itemCalls = 0;
var callbackCalls = 0;
var object = {
  length: {
    valueOf() {
      lengthCalls++;
      return 3;
    }
  },
  get 2() {
    itemCalls++;
    return 'a';
  }
};

assert.equal(Array.prototype.findIndex.call(object, (v) => {
  callbackCalls++;
  return v === 'a';
}), 2);
assert.equal(lengthCalls, 1);
assert.equal(itemCalls, 1);
assert.equal(callbackCalls, 3);

comment out arity check