const t = require('tap')
const unsupported = require('../../../lib/utils/unsupported.js')

const versions = [
  //          broken unsupported
  ['v0.1.103', true, true],
  ['v0.2.0', true, true],
  ['v0.3.5', true, true],
  ['v0.4.7', true, true],
  ['v0.5.3', true, true],
  ['v0.6.17', true, true],
  ['v0.7.8', true, true],
  ['v0.8.28', true, true],
  ['v0.9.6', true, true],
  ['v0.10.48', true, true],
  ['v0.11.16', true, true],
  ['v0.12.9', true, true],
  ['v1.0.1', true, true],
  ['v1.6.0', true, true],
  ['v2.3.1', true, true],
  ['v3.0.0', true, true],
  ['v4.5.0', true, true],
  ['v4.8.4', true, true],
  ['v5.7.1', true, true],
  ['v6.8.1', false, true],
  ['v7.0.0-beta23', false, true],
  ['v7.2.3', false, true],
  ['v8.4.0', false, true],
  ['v9.3.0', false, true],
  ['v10.0.0-0', false, true],
  ['v11.0.0-0', false, true],
  ['v12.0.0-0', false, true],
  ['v12.13.0-0', false, false],
  ['v13.0.0-0', false, true],
  ['v14.0.0-0', false, true],
  ['v14.15.0-0', false, false],
  ['v15.0.0-0', false, true],
  ['v16.0.0-0', false, false],
]

t.test('versions', function (t) {
  t.plan(versions.length * 2)
  versions.forEach(function (verinfo) {
    const version = verinfo[0]
    const broken = verinfo[1]
    const unsupp = verinfo[2]
    const nodejs = unsupported.checkVersion(version)
    t.equal(nodejs.broken, broken, version + ' ' + (broken ? '' : 'not ') + 'broken')
    t.equal(nodejs.unsupported, unsupp, version + ' ' + (unsupp ? 'unsupported' : 'supported'))
  })
  t.end()
})

t.test('checkForBrokenNode', t => {
  // run it once to not fail
  unsupported.checkForBrokenNode()

  const { exit } = process
  const { error } = console
  const versionPropDesc = Object.getOwnPropertyDescriptor(process, 'version')

  t.teardown(() => {
    process.exit = exit
    Object.defineProperty(process, 'version', versionPropDesc)
    console.error = error
  })

  // then make it a thing that fails
  process.exit = code => {
    t.equal(code, 1)
    t.strictSame(logs, expectLogs)
    t.end()
  }
  Object.defineProperty(process, 'version', { value: '1.2.3', configurable: true })
  const logs = []
  const expectLogs = [
    'ERROR: npm is known not to run on Node.js 1.2.3',
    "You'll need to upgrade to a newer Node.js version in order to use this",
    'version of npm. You can find the latest version at https://nodejs.org/',
  ]
  console.error = msg => logs.push(msg)
  unsupported.checkForBrokenNode()
})

t.test('checkForUnsupportedNode', t => {
  const npmlog = require('npmlog')
  const { warn } = npmlog
  const versionPropDesc = Object.getOwnPropertyDescriptor(process, 'version')

  t.teardown(() => {
    Object.defineProperty(process, 'version', versionPropDesc)
    npmlog.warn = warn
  })

  const logs = []
  const expectLogs = [
    'npm does not support Node.js 8.0.0',
    'You should probably upgrade to a newer version of node as we',
    "can't make any promises that npm will work with this version.",
    'You can find the latest version at https://nodejs.org/',
  ]
  npmlog.warn = (section, msg) => logs.push(msg)

  // run it once to not fail or warn
  unsupported.checkForUnsupportedNode()

  // then make it a thing that fails
  Object.defineProperty(process, 'version', { value: '8.0.0' })
  unsupported.checkForUnsupportedNode()
  t.strictSame(logs, expectLogs)
  t.end()
})
