// Copyright (c) 2012 Ecma International.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es5id: 15.2.3.6-4-547-4
description: >
    ES5 Attributes - Updating an indexed accessor property 'P' whose
    [[Configurable]] attribute is false to a data property does not
    succeed, 'A' is an Arguments object (8.12.9 step 9.a)
includes: [propertyHelper.js]
---*/

var obj = (function () {
    return arguments;
}());

obj.verifySetFunc = "data";
var getFunc = function () {
    return obj.verifySetFunc;
};

var setFunc = function (value) {
    obj.verifySetFunc = value;
};

Object.defineProperty(obj, "0", {
    get: getFunc,
    set: setFunc,
    enumerable: true,
    configurable: false
});
var desc1 = Object.getOwnPropertyDescriptor(obj, "0");

try {
    Object.defineProperty(obj, "0", {
        value: 1001
    });
    $ERROR("Expected an exception.");
} catch (e) {
    var desc2 = Object.getOwnPropertyDescriptor(obj, "0");

    if (!desc1.hasOwnProperty("get")) {
        $ERROR('Expected desc1.hasOwnProperty("get") to be true, actually ' + desc1.hasOwnProperty("get"));
    }
    
    if (desc2.hasOwnProperty("value")) {
        $ERROR('Expected !desc2.hasOwnProperty("value") to be true, actually ' + !desc2.hasOwnProperty("value"));
    }
    
    verifyEqualTo(obj, "0", getFunc());

    verifyWritable(obj, "0", "verifySetFunc");

    verifyEnumerable(obj, "0");

    verifyNotConfigurable(obj, "0");


    if (!(e instanceof TypeError)) {
        $ERROR("Expected TypeError, got " + e);
    }

}
