// Copyright (C) 2013 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-generator.prototype.next
description: >
    A TypeError should be thrown from GeneratorValidate (25.3.3.2) if the
    context of `next` does not define the [[GeneratorState]] internal slot.
info: |
  1. Let g be the this value.
  2. Return GeneratorResume(g, value).

  25.3.3.3 GeneratorResume

  1. Let state be ? GeneratorValidate(generator).

  25.3.3.2 GeneratorValidate

  [...]
  2. If generator does not have a [[GeneratorState]] internal slot, throw a
     TypeError exception.
features: [generators]
---*/

function* g() {}
var GeneratorPrototype = Object.getPrototypeOf(g).prototype;

assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call({});
  },
  'ordinary object (without value)'
);
assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call({}, 1);
  },
  'ordinary object (with value)'
);

assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call(function() {});
  },
  'function object (without value)'
);
assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call(function() {}, 1);
  },
  'function object (with value)'
);

assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call(g);
  },
  'generator function object (without value)'
);
assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call(g, 1);
  },
  'generator function object (with value)'
);

assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call(g.prototype);
  },
  'generator function prototype object (without value)'
);
assert.throws(
  TypeError,
  function() {
    GeneratorPrototype.next.call(g.prototype, 1);
  },
  'generator function prototype object (with value)'
);
