let globalLet = "let";
function globalFunction() { }
class globalClass { }
const globalConst = 20;
var globalVar = 21;
this.globalProperty = 22;

let sentinel = "__s__";

function assert(b) {
    if (!b)
        throw new Error("bad assertion");
}

function assertExpectations() {
    assert(sentinel === "__s__");
}


let errorCount = 0;
function assertProperError(e) {
    if (e instanceof SyntaxError && e.message.indexOf("Can't create duplicate variable") !== -1) {
        errorCount++;
    } else {
        assert(false);
    }

}

assertExpectations();

try {
    load("./multiple-files-tests/global-lexical-redeclare-variable/first.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

try {
    load("./multiple-files-tests/global-lexical-redeclare-variable/second.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

try {
    load("./multiple-files-tests/global-lexical-redeclare-variable/third.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

try {
    load("./multiple-files-tests/global-lexical-redeclare-variable/fourth.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

try {
    load("./multiple-files-tests/global-lexical-redeclare-variable/fifth.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

// Checking if the implementation is following
// ES6 spec 8.1.1.4.14 http://www.ecma-international.org/ecma-262/6.0/index.html#sec-hasrestrictedglobalproperty

try {
    sentinel = "bad";
    assert(Object.getOwnPropertyDescriptor(this, "globalProperty").configurable);
    load("./multiple-files-tests/global-lexical-redeclare-variable/sixth.js");
} catch(e) {
    assert(false);
}
assertExpectations();

try {
    sentinel = "bad";
    assert(Object.getOwnPropertyDescriptor(this, "Array").configurable);
    load("./multiple-files-tests/global-lexical-redeclare-variable/seventh.js");
} catch(e) {
    assert(false);
}
assertExpectations();

try {
    sentinel = "bad";
    Object.defineProperty(this, 'foo', {value: 5, configurable: true, writable: true});
    load("./multiple-files-tests/global-lexical-redeclare-variable/eighth.js");
} catch(e) {
    assert(false);
}
assertExpectations();

try {
    Object.defineProperty(this, 'bar', {value: 5, configurable: false, writable: true});
    load("./multiple-files-tests/global-lexical-redeclare-variable/ninth.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

assert(errorCount === 6);

try {
    Object.defineProperty(this, 'zoo', {value: undefined, configurable: false, writable: true});
    load("./multiple-files-tests/global-lexical-redeclare-variable/tenth.js");
} catch(e) {
    assertProperError(e);
}
assertExpectations();

assert(errorCount === 7);
