// Copyright (C) 2013 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 13.6.4.13 S5.c
description: >
    If Type(result) is not Object, throw a TypeError exception as per
    `IteratorNext` (7.4.2 S4)
features: [Symbol.iterator]
---*/

var iterable = {};
var firstIterResult;

iterable[Symbol.iterator] = function() {
  var finalIterResult = { value: null, done: true };
  var nextIterResult = firstIterResult;

  return {
    next: function() {
      var iterResult = nextIterResult;

      nextIterResult = finalIterResult;

      return iterResult;
    }
  };
};

firstIterResult = true;
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = false;
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = 'string';
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = undefined;
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = null;
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = 4;
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = NaN;
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = Symbol('s');
assert.throws(TypeError, function() {
  for (var x of iterable) {}
});

firstIterResult = /regexp/;
for (var x of iterable) {}

firstIterResult = {};
for (var x of iterable) {}

firstIterResult = new Proxy({}, {
  get: function(receiver, name) {
    if (name === 'done') {
      return true;
    }
    if (name === 'value') {
      return null;
    }
    $ERROR('This code is unreachable.');
  }
});
for (var x of iterable) {
  $ERROR('This code is unreachable.');
}

firstIterResult = new Proxy({}, {
  get: function(receiver, name) {
    if (name === 'done') {
      return false;
    }
    if (name === 'value') {
      return 23;
    }
    $ERROR('This code is unreachable.');
  }
});
var i = 0;
for (var x of iterable) {
  assert.sameValue(x, 23);
  i++;
}
assert.sameValue(i, 1);
