/* eslint-env mocha */

const RecursiveIterator = require('../src/RecursiveIterator')
const assert = require('assert')

describe('Do not iterate over objects if it keys.length === 0', function () {
  let root = new Date()
  let queue = []

  let iterator = new RecursiveIterator(root)
  for (let item = iterator.next(); !item.done; item = iterator.next()) {
    let state = item.value
    queue.push(state.parent)
    queue.push(state.node)
    queue.push(state.key)
    queue.push(state.path)
    queue.push(state.deep)
  }

  it('queue.length must be 0', function () {
    assert.strictEqual(queue.length, 0)
  })
})

describe('Iterate through array-like objects', function () {
  // This is an array-like object
  let rootOne = {
    '0': 1,
    'length': 1
  }
  let queueOne = []

  let iteratorOne = new RecursiveIterator(rootOne)
  for (let itemOne = iteratorOne.next(); !itemOne.done; itemOne = iteratorOne.next()) {
    let stateOne = itemOne.value
    queueOne.push(stateOne)
  }

  it('queue.length must be 1', function () {
    assert.strictEqual(queueOne.length, 1)
  })

  // This is not array-like object
  let rootTwo = {
    'width': 0,
    'height': 0,
    'length': 0
  }
  let queueTwo = []

  let iteratorTwo = new RecursiveIterator(rootTwo)
  for (let itemTwo = iteratorTwo.next(); !itemTwo.done; itemTwo = iteratorTwo.next()) {
    let stateTwo = itemTwo.value
    queueTwo.push(stateTwo)
  }

  it('queue.length must be 3', function () {
    assert.strictEqual(queueTwo.length, 3)
  })
})