const t = require('tap')
const CMap = require('../lib/case-insensitive-map.js')

t.test('set values in ctor', t => {
  const cmap = new CMap([['a', 'a'], [null, 'null'], [{ a: 1 }, 'a:1'], ['A', 'A']])
  t.strictSame([...cmap.entries()], [[null, 'null'], [{ a: 1 }, 'a:1'], ['A', 'A']])
  t.equal(cmap.has('a'), true)
  t.equal(cmap.has('A'), true)
  t.equal(cmap.get('a'), 'A')
  cmap.delete('a')
  t.equal(cmap.has('a'), false)
  t.equal(cmap.has('A'), false)
  t.equal(cmap.get('A'), undefined)
  t.end()
})

t.test('set values after ctor', t => {
  const cmap = new CMap()
  cmap.set('a', 'a')
  t.equal(cmap.has('a'), true)
  t.equal(cmap.has('A'), true)
  cmap.set(null, 'null')
  cmap.set({ a: 1 }, 'a:1')
  cmap.set('A', 'A')
  t.strictSame([...cmap.entries()], [[null, 'null'], [{ a: 1 }, 'a:1'], ['A', 'A']])
  cmap.delete('a')
  t.equal(cmap.has('a'), false)
  t.equal(cmap.has('A'), false)
  t.equal(cmap.get('A'), undefined)
  t.end()
})

t.test('do not get confused with undefined or weird values', t => {
  const cmap = new CMap()
  cmap.set(undefined, 'this is not defined')
  cmap.set(NaN, 'this is not a number')
  cmap.set('NaN', 'this is a string')
  cmap.set('nan', 'this is a quieter string')

  cmap.delete('foo')
  cmap.delete('NAN')
  t.strictSame([...cmap.entries()], [
    [undefined, 'this is not defined'],
    [NaN, 'this is not a number'],
  ])
  t.end()
})
