# frozen_string_literal: true
require_relative "helper"

class TestGemResolverAPISpecification < Gem::TestCase
  def test_initialize
    set = Gem::Resolver::APISet.new
    data = {
      :name     => "rails",
      :number   => "3.0.3",
      :platform => Gem::Platform.local.to_s,
      :dependencies => [
        ["bundler",  "~> 1.0"],
        ["railties", "= 3.0.3"],
      ],
    }

    spec = Gem::Resolver::APISpecification.new set, data

    assert_equal "rails",                   spec.name
    assert_equal Gem::Version.new("3.0.3"), spec.version
    assert_equal Gem::Platform.local,       spec.platform

    expected = [
      Gem::Dependency.new("bundler",  "~> 1.0"),
      Gem::Dependency.new("railties", "= 3.0.3"),
    ]

    assert_equal expected, spec.dependencies
  end

  def test_fetch_development_dependencies
    specs = spec_fetcher do |fetcher|
      fetcher.spec "rails", "3.0.3" do |s|
        s.add_runtime_dependency "bundler",  "~> 1.0"
        s.add_runtime_dependency "railties", "= 3.0.3"
        s.add_development_dependency "a",    "= 1"
      end
    end

    rails = specs["rails-3.0.3"]

    repo = @gem_repo + "info"

    set = Gem::Resolver::APISet.new repo

    data = {
      :name     => "rails",
      :number   => "3.0.3",
      :platform => "ruby",
      :dependencies => [
        ["bundler",  "~> 1.0"],
        ["railties", "= 3.0.3"],
      ],
    }

    util_setup_spec_fetcher rails

    spec = Gem::Resolver::APISpecification.new set, data

    spec.fetch_development_dependencies

    expected = [
      Gem::Dependency.new("bundler",  "~> 1.0"),
      Gem::Dependency.new("railties", "= 3.0.3"),
      Gem::Dependency.new("a",        "= 1", :development),
    ]

    assert_equal expected, spec.dependencies
  end

  def test_installable_platform_eh
    set = Gem::Resolver::APISet.new
    data = {
      :name     => "a",
      :number   => "1",
      :platform => "ruby",
      :dependencies => [],
    }

    a_spec = Gem::Resolver::APISpecification.new set, data

    assert a_spec.installable_platform?

    data = {
      :name     => "b",
      :number   => "1",
      :platform => "cpu-other_platform-1",
      :dependencies => [],
    }

    b_spec = Gem::Resolver::APISpecification.new set, data

    refute b_spec.installable_platform?

    data = {
      :name     => "c",
      :number   => "1",
      :platform => Gem::Platform.local.to_s,
      :dependencies => [],
    }

    c_spec = Gem::Resolver::APISpecification.new set, data

    assert c_spec.installable_platform?
  end

  def test_source
    set = Gem::Resolver::APISet.new
    data = {
      :name         => "a",
      :number       => "1",
      :platform     => "ruby",
      :dependencies => [],
    }

    api_spec = Gem::Resolver::APISpecification.new set, data

    assert_equal set.source, api_spec.source
  end

  def test_spec
    spec_fetcher do |fetcher|
      fetcher.spec "a", 1
    end

    dep_uri = URI(@gem_repo) + "info"
    set = Gem::Resolver::APISet.new dep_uri
    data = {
      :name         => "a",
      :number       => "1",
      :platform     => "ruby",
      :dependencies => [],
    }

    api_spec = Gem::Resolver::APISpecification.new set, data

    spec = api_spec.spec

    assert_kind_of Gem::Specification, spec
    assert_equal "a-1", spec.full_name
  end

  def test_spec_jruby_platform
    spec_fetcher do |fetcher|
      fetcher.gem "j", 1 do |spec|
        spec.platform = "jruby"
      end
    end

    dep_uri = URI(@gem_repo) + "info"
    set = Gem::Resolver::APISet.new dep_uri
    data = {
      :name         => "j",
      :number       => "1",
      :platform     => "jruby",
      :dependencies => [],
    }

    api_spec = Gem::Resolver::APISpecification.new set, data

    spec = api_spec.spec

    assert_kind_of Gem::Specification, spec
    assert_equal "j-1-java", spec.full_name
  end
end
