'use strict'
const TestRunner = require('test-runner')
const a = require('assert')
const Output = require('../lib/output')
const Definitions = require('../lib/definitions')

const runner = new TestRunner()

runner.test('output.setFlag(name): initial value', function () {
  let definitions = new Definitions()
  definitions.load([
    { name: 'one', type: Number }
  ])
  let output = new Output(definitions)
  a.strictEqual(output.get('one'), undefined)
  output.setFlag('--one')
  a.strictEqual(output.get('one'), null)

  definitions.load([
    { name: 'one', type: Boolean }
  ])
  output = new Output(definitions)
  a.strictEqual(output.get('one'), undefined)
  output.setFlag('--one')
  a.strictEqual(output.get('one'), true)
})

runner.test('output.setOptionValue(name, value)', function () {
  const definitions = new Definitions()
  definitions.load([
    { name: 'one', type: Number, defaultValue: 1 }
  ])
  const output = new Output(definitions)
  a.strictEqual(output.get('one'), 1)
  output.setOptionValue('--one', '2')
  a.strictEqual(output.get('one'), 2)
})

runner.test('output.setOptionValue(name, value): multiple, defaultValue', function () {
  const definitions = new Definitions()
  definitions.load([
    { name: 'one', type: Number, multiple: true, defaultValue: [ 1 ] }
  ])
  const output = new Output(definitions)
  a.deepStrictEqual(output.get('one'), [ 1 ])
  output.setOptionValue('--one', '2')
  a.deepStrictEqual(output.get('one'), [ 2 ])
})

runner.test('output.setOptionValue(name, value): multiple 2', function () {
  const definitions = new Definitions()
  definitions.load([
    { name: 'one', type: Number, multiple: true }
  ])
  const output = new Output(definitions)
  a.deepStrictEqual(output.get('one'), undefined)
  output.setOptionValue('--one', '2')
  a.deepStrictEqual(output.get('one'), [ 2 ])
  output.setOptionValue('--one', '3')
  a.deepStrictEqual(output.get('one'), [ 2, 3 ])
})

runner.test('output.setValue(value): no defaultOption', function () {
  const definitions = new Definitions()
  definitions.load([
    { name: 'one', type: Number }
  ])
  const output = new Output(definitions)
  a.deepStrictEqual(output.get('one'), undefined)
  output.setValue('2')
  a.deepStrictEqual(output.get('one'), undefined)
  a.deepStrictEqual(output.unknown, [ '2' ])
})

runner.test('output.setValue(value): with defaultOption', function () {
  const definitions = new Definitions()
  definitions.load([
    { name: 'one', type: Number, defaultOption: true }
  ])
  const output = new Output(definitions)
  a.deepStrictEqual(output.get('one'), undefined)
  output.setValue('2')
  a.deepStrictEqual(output.get('one'), 2)
  a.deepStrictEqual(output.unknown, [])
})

runner.test('output.setValue(value): multiple', function () {
  const definitions = new Definitions()
  definitions.load([
    { name: 'one', multiple: true, defaultOption: true }
  ])
  const output = new Output(definitions)
  a.deepStrictEqual(output.get('one'), undefined)
  output.setValue('1')
  a.deepStrictEqual(output.get('one'), [ '1' ])
  output.setValue('2')
  a.deepStrictEqual(output.get('one'), [ '1', '2' ])
})