// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(function testRestrictedPropertiesStrict() {
  function* generator() { "use strict"; }
  assertFalse(generator.hasOwnProperty("arguments"));
  assertThrows(function() { return generator.arguments; }, TypeError);
  assertThrows(function() { return generator.arguments = {}; }, TypeError);

  assertFalse(generator.hasOwnProperty("caller"));
  assertThrows(function() { return generator.caller; }, TypeError);
  assertThrows(function() { return generator.caller = {}; }, TypeError);
})();


(function testRestrictedPropertiesSloppy() {
  function* generator() {}
  assertFalse(generator.hasOwnProperty("arguments"));
  assertThrows(function() { return generator.arguments; }, TypeError);
  assertThrows(function() { return generator.arguments = {}; }, TypeError);

  assertFalse(generator.hasOwnProperty("caller"));
  assertThrows(function() { return generator.caller; }, TypeError);
  assertThrows(function() { return generator.caller = {}; }, TypeError);
})();

function assertIteratorResult(value, done, result) {
  assertEquals({value: value, done: done}, result);
}


(function testIteratorResultStrict() {
  function* generator() { "use strict"; }
  assertIteratorResult(undefined, true, generator().next());
})();


(function testIteratorResultSloppy() {
  function* generator() {}
  assertIteratorResult(undefined, true, generator().next());
})();