/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 * Contributor: 
 */
var BUGNUMBER = 632003;
var summary = 'The var statement should add the property to the global if it exists on the prototype';

// Define properties on Object.prototype with various attributes and
// value-getter-setter combinations then check that a var statement
// can always define a variable with the same name in the global object.

if (typeof evaluate != "undefined") {
  var global_case = def_all("global_case");
  evaluate(global_case.source);
  check_values(this, global_case.var_list);
}

var eval_case = def_all("eval_case");
eval(eval_case.source);
check_values(this, eval_case.var_list);

function def_all(prefix)
{
  var builder, index, i, j;

  builder = {source: "", var_list: []};
  index = 0;
  for (i = 0; i <= 1; ++i) {
    for (j = 0; j <= 1; ++j) {
      def({value: index});
      def({value: index, writable: true});
      def({get: Function("return "+index+";")});
      def({set: function() { }});
      def({get: Function("return "+index+";"), set: function() { }});
    }
  }
  return builder;
  
  function def(descriptor_seed)
  {
    var var_name = prefix + index;
    descriptor_seed.configurable = !!i;
    descriptor_seed.enumerable = !!j;
    Object.defineProperty(Object.prototype, var_name, descriptor_seed);
    var var_value = index + 0.5;
    builder.source += "var "+var_name+" = "+var_value+";\n";
    builder.var_list.push({name: var_name, expected_value: var_value});
    ++index;
  }
}

function check_values(obj, var_list)
{
  for (i = 0; i != var_list.length; ++i) {
    var name = var_list[i].name;
    assertEq(obj.hasOwnProperty(name), true);
    assertEq(obj[name], var_list[i].expected_value);
  }
}

reportCompare(true, true);
