function assert(assertion) {
    if (typeof assertion != "string")
        throw new Error("Invalid assertion.");

    let result = eval(assertion);

    if (!result)
        throw new Error("Bad assertion: " + assertion);
}

let get = [];
let set = [];
let getSet = [];

function resetTracking()
{
    get = [];
    set = [];
    getSet = [];
}

let getProxyNullExec = new Proxy({
        exec: function()
        {
            return null;
        }
    }, {
        get: function(o, k)
        {
            get.push(k); return o[k];
        }
    });

resetTracking();
RegExp.prototype[Symbol.match].call(getProxyNullExec);
assert('get == "global,exec"');

let getSetProxyNullExec = new Proxy(
    {
        exec: function()
        {
            return null;
        }
    }, {
        get: function(o, k)
        {
            get.push(k);
            getSet.push(k);
            return o[k];
        },
        set: function(o, k, v)
        {
            set.push(k);
            getSet.push(k);
            o[k] = v;
            return true;
        }
    });

getSetProxyNullExec.global = true;

resetTracking();
RegExp.prototype[Symbol.match].call(getSetProxyNullExec);
assert('get == "global,unicode,exec"');
assert('set == "lastIndex"');
assert('getSet == "global,unicode,lastIndex,exec"');

let regExpGlobal_s = new RegExp("s", "g");
let getSetProxyMatches_s = new Proxy(
    {
        exec: function(string)
        {
            return regExpGlobal_s.exec(string);
        }
    }, {
        get: function(o, k)
        {
            get.push(k);
            getSet.push(k);
            return o[k];
        },
        set: function(o, k, v)
        {
            set.push(k);
            getSet.push(k);
            o[k] = v;
            return true;
        }
    });

getSetProxyMatches_s.global = true;
resetTracking();
let matchResult = RegExp.prototype[Symbol.match].call(getSetProxyMatches_s, "This is a test");
assert('matchResult == "s,s,s"');
assert('get == "global,unicode,exec,exec,exec,exec"');
assert('set == "lastIndex"');
assert('getSet == "global,unicode,lastIndex,exec,exec,exec,exec"');

let regExpGlobal_tx_Greedy = new RegExp("[tx]*", "g");
let getSetProxyMatches_tx_Greedy = new Proxy(
    {
        exec: function(string)
        {
            return regExpGlobal_tx_Greedy.exec(string);
        }
    }, {
        get: function(o, k)
        {
            get.push(k);
            getSet.push(k);
            if (k.toString() == "lastIndex")
                return regExpGlobal_tx_Greedy.lastIndex;
            return o[k];
        },
        set: function(o, k, v)
        {
            set.push(k);
            getSet.push(k);
            if (k.toString() == "lastIndex")
                regExpGlobal_tx_Greedy.lastIndex = v;
            o[k] = v;
            return true;
        }
    });

getSetProxyMatches_tx_Greedy.global = true;

resetTracking();
matchResult = RegExp.prototype[Symbol.match].call(getSetProxyMatches_tx_Greedy, "testing");
assert('matchResult == "t,,,t,,,,"');
assert('get == "global,unicode,exec,exec,lastIndex,exec,lastIndex,exec,exec,lastIndex,exec,lastIndex,exec,lastIndex,exec,lastIndex,exec"');
assert('set == "lastIndex,lastIndex,lastIndex,lastIndex,lastIndex,lastIndex,lastIndex"');
assert('getSet == "global,unicode,lastIndex,exec,exec,lastIndex,lastIndex,exec,lastIndex,lastIndex,exec,exec,lastIndex,lastIndex,exec,lastIndex,lastIndex,exec,lastIndex,lastIndex,exec,lastIndex,lastIndex,exec"');

let regExpGlobalUnicode_digit_nonGreedy = new RegExp("\\d{0,1}", "gu");
let getSetProxyMatchesUnicode_digit_nonGreedy = new Proxy(
    {
        exec: function(string)
        {
            return regExpGlobalUnicode_digit_nonGreedy.exec(string);
        }
    }, {
        get: function(o, k)
        {
            get.push(k);
            getSet.push(k);
            if (k.toString() == "lastIndex")
                return regExpGlobalUnicode_digit_nonGreedy.lastIndex;
            return o[k];
        },
        set: function(o, k, v)
        {
            set.push(k);
            getSet.push(k);
            if (k.toString() == "lastIndex")
                regExpGlobalUnicode_digit_nonGreedy.lastIndex = v;
            o[k] = v;
            return true;
        }
    });

getSetProxyMatchesUnicode_digit_nonGreedy.global = true;
getSetProxyMatchesUnicode_digit_nonGreedy.unicode = true;

resetTracking();
matchResult = RegExp.prototype[Symbol.match].call(getSetProxyMatchesUnicode_digit_nonGreedy, "12X3\u{10400}4");
assert('matchResult == "1,2,,3,,4,"');
assert('get == "global,unicode,exec,exec,exec,lastIndex,exec,exec,lastIndex,exec,exec,lastIndex,exec"');
assert('set == "lastIndex,lastIndex,lastIndex,lastIndex"');
assert('getSet == "global,unicode,lastIndex,exec,exec,exec,lastIndex,lastIndex,exec,exec,lastIndex,lastIndex,exec,exec,lastIndex,lastIndex,exec"');
