const { getWordList, getWords, getChar, lengthBits } = require('../src/generator')
const words = require('../src/words')
const assert = require('assert').strict
const lists = ['small', 'medium', 'large']

describe('getWordList', () => {
  lists.forEach(name => {
    it(name, () => {
      assert.equal(getWordList(name), words[name])
    })
  })
})

describe('getWords', () => {
  lists.forEach(name => {
    it(`sanity: ${name}`, () => {
      assert.deepEqual(
        getWords(words[name], [0, 256, 1337, 2018]),
        [words[name][0], words[name][256], words[name][1337], words[name][2018]]
      )
    })
  })

  lists.forEach(name => {
    it(`all offsets: ${name}`, () => {
      const len = words[name].length
      ;[...Array(65536 / len)].forEach((_, i) => {
        assert.deepEqual(
          getWords(words[name], [i * len, i * len + 256, i * len + 1337, i * len + 2018]),
          [words[name][0], words[name][256], words[name][1337], words[name][2018]]
        )
      })
    })
  })
})

describe('getChar', () => {
  it('simple', () => {
    const choices = ['0', '1', '2']
    assert.equal(getChar(choices, 0), '0')
    assert.equal(getChar(choices, 1), '1')
    assert.equal(getChar(choices, 2), '2')
    assert.equal(getChar(choices, 3), '0')
    assert.equal(getChar(choices, 4), '1')
    assert.equal(getChar(choices, 5), '2')
  })
})

describe('lengthBits', () => {
  it('simple', () => {
    assert.equal(lengthBits(Array(1)), 0)
    assert.equal(lengthBits(Array(2)), 1)
    assert.equal(lengthBits(Array(4)), 2)
    assert.equal(lengthBits(Array(1024)), 10)
    assert.equal(lengthBits(Array(2048)), 11)
    assert.equal(lengthBits(Array(4096)), 12)
    assert.equal(lengthBits(Array(8192)), 13)
  })
})