text: // Copyright JS Foundation and other contributors, http://js.foundation
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  //
  //     http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  
  // Test %GeneratorPrototype%
  (function () {
    function* generatorFn(){}
    var ownProto = Object.getPrototypeOf(generatorFn());
    var sharedProto = Object.getPrototypeOf(ownProto);
  
    assert(ownProto === generatorFn.prototype);
    assert(sharedProto !== Object.prototype);
    assert(sharedProto === Object.getPrototypeOf(function*(){}.prototype));
    assert(sharedProto.hasOwnProperty('next'));
  })();
  
  // Test %GeneratorPrototype% prototype chain
  (function () {
    function* generatorFn(){}
    var g = generatorFn();
    var ownProto = Object.getPrototypeOf(g);
    var sharedProto = Object.getPrototypeOf(ownProto);
    var iterProto = Object.getPrototypeOf(sharedProto);
  
    assert(ownProto === generatorFn.prototype);
    assert(iterProto.hasOwnProperty(Symbol.iterator));
    assert(!sharedProto.hasOwnProperty(Symbol.iterator));
    assert(!ownProto.hasOwnProperty(Symbol.iterator));
    assert(g[Symbol.iterator]() === g);
  })();
  
  // Test %GeneratorPrototype% prototype chain
  (function () {
    function* g(){}
    var iterator = new g.constructor("a","b","c","yield a; yield b; yield c;")(1,2,3);
  
    var item = iterator.next();
    assert(item.value === 1);
    assert(item.done === false);
  
    item = iterator.next();
    assert(item.value === 2);
    assert(item.done === false);
  
    item = iterator.next();
    assert(item.value === 3);
    assert(item.done === false);
  
    item = iterator.next();
    assert(item.value === undefined);
    assert(item.done === true);
  
    assert(g.constructor === (function*(){}).constructor);
  })();
  
  // Test GeneratorFunction parsing
  (function () {
    function *f() {};
  
    try {
      Object.getPrototypeOf(f).constructor("yield", "");
    } catch (e) {
      assert(e instanceof SyntaxError);
    }
  })();
  
  // Test correct property membership
  (function () {
    function *f() {};
  
    Object.getPrototypeOf(f).xx = 5;
    assert(Object.getPrototypeOf(f).prototype.constructor.xx === 5);
  })();
  
  // Test GetPrototypeFromConstructor
  (function () {
    function *f() {};
  
    var originalProto = f.prototype;
    f.prototype = 5;
    assert(Object.getPrototypeOf(f()) === Object.getPrototypeOf(originalProto));
    var fakeProto = { x : 6 };
    f.prototype = fakeProto;
    assert(Object.getPrototypeOf(f()) === fakeProto);
    assert(f.next === undefined);
  })();
  