// Copyright (C) 2016 Jordan Harband. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: >
    Object.getOwnPropertyDescriptors should not have its behavior impacted by modifications to Object.getOwnPropertyDescriptor
esid: sec-object.getownpropertydescriptors
author: Jordan Harband
---*/

function fakeObjectGetOwnPropertyDescriptor() {
  $ERROR('The overriden version of Object.getOwnPropertyDescriptor was called!');
}
Object.getOwnPropertyDescriptor = fakeObjectGetOwnPropertyDescriptor;

assert.sameValue(
  Object.getOwnPropertyDescriptor,
  fakeObjectGetOwnPropertyDescriptor,
  'Sanity check failed: could not modify the global Object.getOwnPropertyDescriptor'
);

assert.sameValue(Object.keys(Object.getOwnPropertyDescriptors({
  a: 1
})).length, 1, 'Expected object with 1 key to have 1 descriptor');
