// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --harmony-species

// ArrayBuffer.prototype.slice makes subclass and checks length

class MyArrayBuffer extends ArrayBuffer { }
assertEquals(MyArrayBuffer, new MyArrayBuffer(0).slice().constructor);

class MyShortArrayBuffer extends ArrayBuffer {
  constructor(length) { super(length - 1); }
}
assertThrows(() => new MyShortArrayBuffer(5).slice(0, 4), TypeError);

class SingletonArrayBuffer extends ArrayBuffer {
  constructor(...args) {
    if (SingletonArrayBuffer.cached) return SingletonArrayBuffer.cached;
    super(...args);
    SingletonArrayBuffer.cached = this;
  }
}
assertThrows(() => new SingletonArrayBuffer(5).slice(0, 4), TypeError);

class NonArrayBuffer extends ArrayBuffer {
  constructor() {
    return {};
  }
}
assertThrows(() => new NonArrayBuffer(5).slice(0, 4), TypeError);

// Species fallback is ArrayBuffer
class UndefinedArrayBuffer extends ArrayBuffer { }
UndefinedArrayBuffer.prototype.constructor = undefined;
assertEquals(ArrayBuffer, new UndefinedArrayBuffer(0).slice().constructor);
