# frozen_string_literal: true
require 'rubygems/test_case'
require 'rubygems/command'
require 'rubygems/version_option'

class TestGemVersionOption < Gem::TestCase

  def setup
    super

    @cmd = Gem::Command.new 'dummy', 'dummy'
    @cmd.extend Gem::VersionOption
  end

  def test_add_platform_option
    @cmd.add_platform_option

    assert @cmd.handles?(%w[--platform x86-darwin])
  end

  def test_add_version_option
    @cmd.add_version_option

    assert @cmd.handles?(%w[--version >1])
  end

  def test_enables_prerelease
    @cmd.add_version_option

    @cmd.handle_options %w[mygem -v 0.2.0.a]
    assert @cmd.options[:prerelease]

    @cmd.handle_options %w[mygem -v 0.2.0]
    refute @cmd.options[:prerelease]

    @cmd.handle_options %w[mygem]
    refute @cmd.options[:prerelease]
  end

  def test_platform_option
    @cmd.add_platform_option

    @cmd.handle_options %w[--platform x86-freebsd6 --platform x86-freebsd7]

    expected = [
      Gem::Platform::RUBY,
      Gem::Platform.new('x86-freebsd6'),
      Gem::Platform.new('x86-freebsd7'),
    ]

    assert_equal expected, Gem.platforms
  end

  def test_platform_option_ruby
    @cmd.add_platform_option

    @cmd.handle_options %w[--platform ruby]

    expected = [
      Gem::Platform::RUBY
    ]

    assert_equal expected, Gem.platforms
  end

  def test_platform_option_twice
    @cmd.add_platform_option

    @cmd.handle_options %w[--platform x86-freebsd6 --platform x86-freebsd-6]

    expected = [
      Gem::Platform::RUBY,
      Gem::Platform.new('x86-freebsd6'),
    ]

    assert_equal expected, Gem.platforms
  end

  def test_version_option
    @cmd.add_version_option

    @cmd.handle_options %w[--version >1]

    expected = {
      :args => [],
      :explicit_prerelease => false,
      :prerelease => false,
      :version => Gem::Requirement.new('> 1'),
    }

    assert_equal expected, @cmd.options
  end

  def test_version_option_compound
    @cmd.add_version_option

    @cmd.handle_options ['--version', '< 1, > 0.9']

    expected = {
      :args => [],
      :explicit_prerelease => false,
      :prerelease => false,
      :version => Gem::Requirement.new('< 1', '> 0.9'),
    }

    assert_equal expected, @cmd.options
  end

  def test_multiple_version_operator_option_compound
    @cmd.add_version_option

    @cmd.handle_options ['--version', '< 1', '--version', '> 0.9']

    expected = {
      :args => [],
      :explicit_prerelease => false,
      :prerelease => false,
      :version => Gem::Requirement.new('< 1', '> 0.9'),
    }

    assert_equal expected, @cmd.options
  end

  def test_version_option_explicit_prerelease
    @cmd.add_prerelease_option
    @cmd.add_version_option

    @cmd.handle_options %w[--pre --version >1]

    expected = {
      :args => [],
      :explicit_prerelease => true,
      :prerelease => true,
      :version => Gem::Requirement.new('> 1'),
    }

    assert_equal expected, @cmd.options
  end

  def test_version_option_twice
    @cmd.add_version_option

    @cmd.handle_options %w[--version >1.a]

    expected = {
      :args => [],
      :explicit_prerelease => false,
      :prerelease => true,
      :version => Gem::Requirement.new('> 1.a'),
    }

    assert_equal expected, @cmd.options

    @cmd.handle_options %w[--version >1]

    expected = {
      :args => [],
      :explicit_prerelease => false,
      :prerelease => false,
      :version => Gem::Requirement.new('> 1'),
    }

    assert_equal expected, @cmd.options
  end

end
