// Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/licenses/publicdomain/

//-----------------------------------------------------------------------------
var BUGNUMBER = 514568;
var summary = "eval in all its myriad flavors";

print(BUGNUMBER + ": " + summary);

/**************
 * BEGIN TEST *
 **************/

var x = 17;
function globalX() { return x; }
var y = 42;
function globalY() { return y; }

var ev = eval;

function testX()
{
  var x = 2;
  var xcode =
    "'use strict';" +
    "var x = 4;" +
    "function actX(action)" +
    "{" +
    "  switch (action)" +
    "  {" +
    "    case 'get':" +
    "      return x;" +
    "    case 'set1':" +
    "      x = 9;" +
    "      return;" +
    "    case 'set2':" +
    "      x = 23;" +
    "      return;" +
    "    case 'delete':" +
    "      try { return eval('delete x'); }" +
    "      catch (e) { return e.name; }" +
    "  }" +
    "}" +
    "actX;";

  var local0 = x;
  var global0 = globalX();

  var f = eval(xcode);

  var inner1 = f("get");
  var local1 = x;
  var global1 = globalX();

  x = 7;
  var inner2 = f("get");
  var local2 = x;
  var global2 = globalX();

  f("set1");
  var inner3 = f("get");
  var local3 = x;
  var global3 = globalX();

  var del = f("delete");
  var inner4 = f("get");
  var local4 = x;
  var global4 = globalX();

  f("set2");
  var inner5 = f("get");
  var local5 = x;
  var global5 = globalX();

  return {
           local0: local0, global0: global0,
           inner1: inner1, local1: local1, global1: global1,
           inner2: inner2, local2: local2, global2: global2,
           inner3: inner3, local3: local3, global3: global3,
           del: del,
           inner4: inner4, local4: local4, global4: global4,
           inner5: inner5, local5: local5, global5: global5,
         };
}

var resultsX = testX();

assertEq(resultsX.local0, 2);
assertEq(resultsX.global0, 17);

assertEq(resultsX.inner1, 4);
assertEq(resultsX.local1, 2);
assertEq(resultsX.global1, 17);

assertEq(resultsX.inner2, 4);
assertEq(resultsX.local2, 7);
assertEq(resultsX.global2, 17);

assertEq(resultsX.inner3, 9);
assertEq(resultsX.local3, 7);
assertEq(resultsX.global3, 17);

assertEq(resultsX.del, "SyntaxError");

assertEq(resultsX.inner4, 9);
assertEq(resultsX.local4, 7);
assertEq(resultsX.global4, 17);

assertEq(resultsX.inner5, 23);
assertEq(resultsX.local5, 7);
assertEq(resultsX.global5, 17);


function testY()
{
  var ycode =
    "'use strict';" +
    "var y = 5;" +
    "function actY(action)" +
    "{" +
    "  switch (action)" +
    "  {" +
    "    case 'get':" +
    "      return y;" +
    "    case 'set1':" +
    "      y = 2;" +
    "      return;" +
    "    case 'set2':" +
    "      y = 71;" +
    "      return;" +
    "    case 'delete':" +
    "      try { return eval('delete y'); }" +
    "      catch (e) { return e.name; }" +
    "  }" +
    "}" +
    "actY;";

  var local0 = y;
  var global0 = globalY();

  var f = eval(ycode);

  var inner1 = f("get");
  var local1 = y;
  var global1 = globalY();

  y = 8;
  var inner2 = f("get");
  var local2 = y;
  var global2 = globalY();

  f("set1");
  var inner3 = f("get");
  var local3 = y;
  var global3 = globalY();

  var del = f("delete");
  var inner4 = f("get");
  var local4 = y;
  var global4 = globalY();

  f("set2");
  var inner5 = f("get");
  var local5 = y;
  var global5 = globalY();

  return {
           local0: local0, global0: global0,
           inner1: inner1, local1: local1, global1: global1,
           inner2: inner2, local2: local2, global2: global2,
           inner3: inner3, local3: local3, global3: global3,
           del: del,
           inner4: inner4, local4: local4, global4: global4,
           inner5: inner5, local5: local5, global5: global5,
         };
}

var resultsY = testY();

assertEq(resultsY.local0, 42);
assertEq(resultsY.global0, 42);

assertEq(resultsY.inner1, 5);
assertEq(resultsY.local1, 42);
assertEq(resultsY.global1, 42);

assertEq(resultsY.inner2, 5);
assertEq(resultsY.local2, 8);
assertEq(resultsY.global2, 8);

assertEq(resultsY.inner3, 2);
assertEq(resultsY.local3, 8);
assertEq(resultsY.global3, 8);

assertEq(resultsY.del, "SyntaxError");

assertEq(resultsY.inner4, 2);
assertEq(resultsY.local4, 8);
assertEq(resultsY.global4, 8);

assertEq(resultsY.inner5, 71);
assertEq(resultsY.local5, 8);
assertEq(resultsY.global5, 8);

/******************************************************************************/

if (typeof reportCompare === "function")
  reportCompare(true, true);

print("Tests complete!");

var successfullyParsed = true;
