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

/*---
es5id: 7.6.1-4-2
description: >
    Allow reserved words as property names by accessor functions within an object.
---*/

var test;

var tokenCodes = {
    set await(value) { test = "await"; },
    get await() { return "await"; },
    set break(value) { test = "break"; },
    get break() { return "break"; },
    set case(value) { test = "case"; },
    get case() { return "case"; },
    set catch(value) { test = "catch"; },
    get catch() { return "catch"; },
    set class(value) { test = "class"; },
    get class() { return "class"; },
    set const(value) { test = "const"; },
    get const() { return "const"; },
    set continue(value) { test = "continue"; },
    get continue() { return "continue"; },
    set debugger(value) { test = "debugger"; },
    get debugger() { return "debugger"; },
    set default(value) { test = "default"; },
    get default() { return "default"; },
    set delete(value) { test = "delete"; },
    get delete() { return "delete"; },
    set do(value) { test = "do"; },
    get do() { return "do"; },
    set else(value) { test = "else"; },
    get else() { return "else"; },
    set export(value) { test = "export"; },
    get export() { return "export"; },
    set extends(value) { test = "extends"; },
    get extends() { return "extends"; },
    set finally(value) { test = "finally"; },
    get finally() { return "finally"; },
    set for(value) { test = "for"; },
    get for() { return "for"; },
    set function(value) { test = "function"; },
    get function() { return "function"; },
    set if(value) { test = "if"; },
    get if() { return "if"; },
    set import(value) { test = "import"; },
    get import() { return "import"; },
    set in(value) { test = "in"; },
    get in() { return "in"; },
    set instanceof(value) { test = "instanceof"; },
    get instanceof() { return "instanceof"; },
    set new(value) { test = "new"; },
    get new() { return "new"; },
    set return(value) { test = "return"; },
    get return() { return "return"; },
    set super(value) { test = "super"; },
    get super() { return "super"; },
    set switch(value) { test = "switch"; },
    get switch() { return "switch"; },
    set this(value) { test = "this"; },
    get this() { return "this"; },
    set throw(value) { test = "throw"; },
    get throw() { return "throw"; },
    set try(value) { test = "try"; },
    get try() { return "try"; },
    set typeof(value) { test = "typeof"; },
    get typeof() { return "typeof"; },
    set var(value) { test = "var"; },
    get var() { return "var"; },
    set void(value) { test = "void"; },
    get void() { return "void"; },
    set while(value) { test = "while"; },
    get while() { return "while"; },
    set with(value) { test = "with"; },
    get with() { return "with"; },
    set yield(value) { test = "yield"; },
    get yield() { return "yield"; },

    set enum(value) { test = "enum"; },
    get enum() { return "enum"; },

    set implements(value) { test = "implements"; },
    get implements() { return "implements"; },
    set interface(value) { test = "interface"; },
    get interface() { return "interface"; },
    set package(value) { test = "package"; },
    get package() { return "package"; },
    set private(value) { test = "private"; },
    get private() { return "private"; },
    set protected(value) { test = "protected"; },
    get protected() { return "protected"; },
    set public(value) { test = "public"; },
    get public() { return "public"; },

    set let(value) { test = "let"; },
    get let() { return "let"; },
    set static(value) { test = "static"; },
    get static() { return "static"; },
};

var arr = [
    'await',
    'break',
    'case',
    'catch',
    'class',
    'const',
    'continue',
    'debugger',
    'default',
    'delete',
    'do',
    'else',
    'export',
    'extends',
    'finally',
    'for',
    'function',
    'if',
    'import',
    'in',
    'instanceof',
    'new',
    'return',
    'super',
    'switch',
    'this',
    'throw',
    'try',
    'typeof',
    'var',
    'void',
    'while',
    'with',
    'yield',

    'enum',

    'implements',
    'interface',
    'package',
    'protected',
    'private',
    'public',

    'let',
    'static',
];

for (var i = 0; i < arr.length; ++i) {
    var propertyName = arr[i];

    assert(tokenCodes.hasOwnProperty(propertyName),
           'Property "' + propertyName + '" found');

    assert.sameValue(tokenCodes[propertyName], propertyName,
                     'Property "' + propertyName + '" has correct value');

    tokenCodes[propertyName] = 0;
    assert.sameValue(test, propertyName,
                     'Property "' + propertyName + '" sets correct value');
}