import { parseNodeSpecifier } from '../lib/parseNodeSpecifier'

test.each([
  ['rc/16.0.0-rc.0', '16.0.0-rc.0', 'rc'],
  ['16.0.0-rc.0', '16.0.0-rc.0', 'rc'],
  ['release/16.0.0', '16.0.0', 'release'],
  ['16.0.0', '16.0.0', 'release'],
])('Node.js version selector is parsed', (editionSpecifier, useNodeVersion, releaseChannel) => {
  const node = parseNodeSpecifier(editionSpecifier)
  expect(node.useNodeVersion).toBe(useNodeVersion)
  expect(node.releaseChannel).toBe(releaseChannel)
})

test.each([
  ['rc/10', '10', 'rc'],
  ['rc/10.0', '10.0', 'rc'],
  ['rc/10.0.0', '10.0.0', 'rc'],
  ['rc/10.0.0.test.0', '10.0.0.test.0', 'rc'],
])('invalid Node.js specifier', (editionSpecifier, useNodeVersion, releaseChannel) => {
  expect(() => parseNodeSpecifier(editionSpecifier)).toThrow(`Node.js version (${useNodeVersion}) must contain the release channel (${releaseChannel})`)
})

test.each([
  ['nightly'],
  ['rc'],
  ['test'],
  ['v8-canary'],
])('invalid Node.js specifier', async (specifier) => {
  const promise = Promise.resolve().then(() => parseNodeSpecifier(specifier))
  await expect(promise).rejects.toThrow(`"${specifier}" is not a valid Node.js version`)
  await expect(promise).rejects.toHaveProperty('hint', `The correct syntax for ${specifier} release is strictly X.Y.Z-${specifier}.W`)
})

test.each([
  ['release'],
  ['stable'],
  ['latest'],
  ['release/16.0.0.release.0'],
  ['16'],
  ['16.0'],
])('invalid Node.js specifier', async (specifier) => {
  const promise = Promise.resolve().then(() => parseNodeSpecifier(specifier))
  await expect(promise).rejects.toThrow(`"${specifier}" is not a valid Node.js version`)
  await expect(promise).rejects.toHaveProperty('hint', 'The correct syntax for stable release is strictly X.Y.Z or release/X.Y.Z')
})
