description('Tests for ES6 arrow function lexical bind of arguments');

function afFactory0() {
    return a => arguments;
}
var af0 = afFactory0('ABC', 'DEF');

var arr = af0(0);

shouldBe('arr.length', '2');
shouldBe('arr[0]','"ABC"');
shouldBe('arr[1]','"DEF"');
shouldBe('typeof arr[2]','"undefined"');

function afFactory1(x, y, z) {
    return (a, b) => arguments[0] + '-' + arguments[1] + '-' + arguments[2] + '-' + a + '-' + b;
}

shouldBe("afFactory1('AB', 'CD', 'EF')('G', 'H')", '"AB-CD-EF-G-H"');

var afFactory2 = function () {
    this.func = (a, b) => arguments[0] + '_' + arguments[1] + '_' + arguments[2] + '_' + a + '_' + b;
};

shouldBe("(new afFactory2('P1', 'Q2', 'R3')).func('A4', 'B5')", '"P1_Q2_R3_A4_B5"');

var afFactory3 = function () {
    this.func = (a, b) => (c, d) => arguments[0] + '_' + arguments[1] + '_' + arguments[2] + '_' + a + '_' + b + '_' + c + '_' + d;
};

shouldBe("(new afFactory3('PQ', 'RS', 'TU')).func('VW', 'XY')('Z', 'A')", '"PQ_RS_TU_VW_XY_Z_A"');

var afNested = function () {
    return function () {
        this.func = (a, b) => (c, d) => arguments[0] + '_' + arguments[1] + '_' + arguments[2] + '_' + a + '_' + b + '_' + c + '_' + d;
    };
};

var afInternal = new afNested('AB', 'CD', 'EF');
var af5 = new afInternal('GH', 'IJ', 'KL');
shouldBe("af5.func('VW', 'XY')('Z', '')", '"GH_IJ_KL_VW_XY_Z_"');

var objFactory = function () {
    return {
        name : 'nested',
        method : (index) => arguments[0] + '-' + index
    };
};

var objInternal = objFactory('ABC', 'DEF');
shouldBe("objInternal.method('H')", '"ABC-H"');

shouldBe("(() => arguments)()", "arguments")

var func_with_eval = function (a, b) { return () => eval('arguments') }

shouldBe('func_with_eval("abc", "def")("xyz")[0]', '"abc"');
shouldBe('func_with_eval("abc", "def")("xyz")[1]', '"def"');

var af_function_scope = function (first, x, y) {
    let arr;
    var arguments = 'af_function_scope';
    if (first) {
        arr = () => arguments;
    } else {
        arr = () => arguments;
    }
    return arr;
};

var af_mixed_scope = function (first, x, y) {
    let arr;
    var arguments = 'af_mixed_scope';
    if (first) {
        let arguments = 'local-scope';
        arr = () => arguments;
    } else {
        let arguments = 'local-scope-2';
        arr = () => arguments;
    }
    return arr;
};

var af_block_scope = function (x, y) {
    let arr;
    if (true) {
        let arguments = 'branch-1';
        arr = () => arguments;
    } else {
        let arguments = 'branch-2';
        arr = () => arguments;
    }
    return arr;
};

shouldBe("af_block_scope('A', 'B')('C')", "'branch-1'");
shouldBe("af_function_scope(true, 'D', 'E')('F')", "'af_function_scope'");
shouldBe("af_mixed_scope(true, 'G', 'H')('I')", "'local-scope'");

class A {
   constructor() {
      this.list = [];
   }
};

class B extends A {
   addObj(obj) {
      this.list.push(obj);
      this.result = 0;
   }
   runAll() {
      for (let i = 0; i < this.list.length; i++) {
          this.result += this.list[i].operand(1);
      }
   }
};

function test() {
    let b = new B();

    function runTest () {
        b.addObj({ operand : (value) =>  value + value });
        b.addObj({ operand : (value) =>  value + value });
    }

    for (var i = 0; i < 10000; i++) {
        runTest();
    }

    b.runAll();

    return b.result;
}

test();

shouldBe("test()", "40000");

function* foo(a, b, c) {
    yield () => arguments;
}

foo(10, 11, 12).next().value()[0];

shouldBe("foo(10, 11, 12).next().value()[0]", "10");
shouldBe("foo(10, 11, 12).next().value()[1]", "11");
shouldBe("foo(10, 11, 12).next().value()[2]", "12");
shouldBe("(function (a, b, c) { return (a = arguments) => {return a;}; })('1-1', '2-2', '3-3')()[1]", "'2-2'");

var successfullyParsed = true;
