diff options
Diffstat (limited to 'Library/Homebrew/test')
| -rw-r--r-- | Library/Homebrew/test/cmd/commands_spec.rb | 85 | ||||
| -rw-r--r-- | Library/Homebrew/test/cmd/uninstall_spec.rb | 64 | ||||
| -rw-r--r-- | Library/Homebrew/test/commands_test.rb | 77 | ||||
| -rw-r--r-- | Library/Homebrew/test/dependencies_spec.rb | 86 | ||||
| -rw-r--r-- | Library/Homebrew/test/dependencies_test.rb | 117 | ||||
| -rw-r--r-- | Library/Homebrew/test/formula_installer_spec.rb | 137 | ||||
| -rw-r--r-- | Library/Homebrew/test/formula_installer_test.rb | 131 | ||||
| -rw-r--r-- | Library/Homebrew/test/formula_spec_selection_spec.rb | 100 | ||||
| -rw-r--r-- | Library/Homebrew/test/formula_spec_selection_test.rb | 99 | ||||
| -rw-r--r-- | Library/Homebrew/test/requirements_spec.rb | 26 | ||||
| -rw-r--r-- | Library/Homebrew/test/support/helper/test_case.rb | 2 | ||||
| -rw-r--r-- | Library/Homebrew/test/support/helper/version_assertions.rb | 23 | ||||
| -rw-r--r-- | Library/Homebrew/test/uninstall_test.rb | 62 | ||||
| -rw-r--r-- | Library/Homebrew/test/version_spec.rb | 602 | ||||
| -rw-r--r-- | Library/Homebrew/test/versions_test.rb | 528 |
15 files changed, 1100 insertions, 1039 deletions
diff --git a/Library/Homebrew/test/cmd/commands_spec.rb b/Library/Homebrew/test/cmd/commands_spec.rb index f42072956..32d07a0bc 100644 --- a/Library/Homebrew/test/cmd/commands_spec.rb +++ b/Library/Homebrew/test/cmd/commands_spec.rb @@ -1,3 +1,7 @@ +require "cmd/command" +require "cmd/commands" +require "fileutils" + describe "brew commands", :integration_test do it "prints a list of all available commands" do expect { brew "commands" } @@ -5,3 +9,84 @@ describe "brew commands", :integration_test do .and be_a_success end end + +RSpec.shared_context "custom internal commands" do + let(:cmds) do + [ + # internal commands + HOMEBREW_LIBRARY_PATH/"cmd/rbcmd.rb", + HOMEBREW_LIBRARY_PATH/"cmd/shcmd.sh", + + # internal developer-commands + HOMEBREW_LIBRARY_PATH/"dev-cmd/rbdevcmd.rb", + HOMEBREW_LIBRARY_PATH/"dev-cmd/shdevcmd.sh", + ] + end + + around(:each) do |example| + begin + cmds.each do |f| + FileUtils.touch f + end + + example.run + ensure + FileUtils.rm_f cmds + end + end +end + +describe Homebrew do + include_context "custom internal commands" + + specify "::internal_commands" do + cmds = described_class.internal_commands + expect(cmds).to include("rbcmd"), "Ruby commands files should be recognized" + expect(cmds).to include("shcmd"), "Shell commands files should be recognized" + expect(cmds).not_to include("rbdevcmd"), "Dev commands shouldn't be included" + end + + specify "::internal_developer_commands" do + cmds = described_class.internal_developer_commands + expect(cmds).to include("rbdevcmd"), "Ruby commands files should be recognized" + expect(cmds).to include("shdevcmd"), "Shell commands files should be recognized" + expect(cmds).not_to include("rbcmd"), "Non-dev commands shouldn't be included" + end + + specify "::external_commands" do + Dir.mktmpdir do |dir| + %w[brew-t1 brew-t2.rb brew-t3.py].each do |file| + path = "#{dir}/#{file}" + FileUtils.touch path + FileUtils.chmod 0755, path + end + + FileUtils.touch "#{dir}/brew-t4" + + ENV["PATH"] += "#{File::PATH_SEPARATOR}#{dir}" + cmds = described_class.external_commands + + expect(cmds).to include("t1"), "Executable files should be included" + expect(cmds).to include("t2"), "Executable Ruby files should be included" + expect(cmds).not_to include("t3"), "Executable files with a non Ruby extension shoudn't be included" + expect(cmds).not_to include("t4"), "Non-executable files shouldn't be included" + end + end +end + +describe Commands do + include_context "custom internal commands" + + describe "::path" do + specify "returns the path for an internal command" do + expect(described_class.path("rbcmd")).to eq(HOMEBREW_LIBRARY_PATH/"cmd/rbcmd.rb") + expect(described_class.path("shcmd")).to eq(HOMEBREW_LIBRARY_PATH/"cmd/shcmd.sh") + expect(described_class.path("idontexist1234")).to be nil + end + + specify "returns the path for an internal developer-command" do + expect(described_class.path("rbdevcmd")).to eq(HOMEBREW_LIBRARY_PATH/"dev-cmd/rbdevcmd.rb") + expect(described_class.path("shdevcmd")).to eq(HOMEBREW_LIBRARY_PATH/"dev-cmd/shdevcmd.sh") + end + end +end diff --git a/Library/Homebrew/test/cmd/uninstall_spec.rb b/Library/Homebrew/test/cmd/uninstall_spec.rb index 65f69e802..b9a0d8d40 100644 --- a/Library/Homebrew/test/cmd/uninstall_spec.rb +++ b/Library/Homebrew/test/cmd/uninstall_spec.rb @@ -1,3 +1,5 @@ +require "cmd/uninstall" + describe "brew uninstall", :integration_test do it "uninstalls a given Formula" do shutup do @@ -10,3 +12,65 @@ describe "brew uninstall", :integration_test do .and be_a_success end end + +describe Homebrew do + let(:dependency) { formula("dependency") { url "f-1" } } + let(:dependent) do + formula("dependent") do + url "f-1" + depends_on "dependency" + end + end + + let(:opts) { { dependency.rack => [Keg.new(dependency.installed_prefix)] } } + + before(:each) do + [dependency, dependent].each do |f| + f.installed_prefix.mkpath + Keg.new(f.installed_prefix).optlink + end + + tab = Tab.empty + tab.homebrew_version = "1.1.6" + tab.tabfile = dependent.installed_prefix/Tab::FILENAME + tab.runtime_dependencies = [ + { "full_name" => "dependency", "version" => "1" }, + ] + tab.write + + stub_formula_loader dependency + stub_formula_loader dependent + end + + describe "::handle_unsatisfied_dependents" do + specify "when developer" do + expect { + described_class.handle_unsatisfied_dependents(opts) + }.to output(/Warning/).to_stderr + + expect(described_class).not_to have_failed + end + + specify "when not developer" do + run_as_not_developer do + expect { + described_class.handle_unsatisfied_dependents(opts) + }.to output(/Error/).to_stderr + + expect(described_class).to have_failed + end + end + + specify "when not developer and --ignore-dependencies is specified" do + ARGV << "--ignore-dependencies" + + run_as_not_developer do + expect { + described_class.handle_unsatisfied_dependents(opts) + }.not_to output.to_stderr + + expect(described_class).not_to have_failed + end + end + end +end diff --git a/Library/Homebrew/test/commands_test.rb b/Library/Homebrew/test/commands_test.rb deleted file mode 100644 index da88ee2d5..000000000 --- a/Library/Homebrew/test/commands_test.rb +++ /dev/null @@ -1,77 +0,0 @@ -require "testing_env" -require "cmd/command" -require "cmd/commands" -require "fileutils" -require "testing_env" - -class CommandsTests < Homebrew::TestCase - def setup - super - @cmds = [ - # internal commands - HOMEBREW_LIBRARY_PATH/"cmd/rbcmd.rb", - HOMEBREW_LIBRARY_PATH/"cmd/shcmd.sh", - - # internal development commands - HOMEBREW_LIBRARY_PATH/"dev-cmd/rbdevcmd.rb", - HOMEBREW_LIBRARY_PATH/"dev-cmd/shdevcmd.sh", - ] - - @cmds.each { |f| FileUtils.touch f } - end - - def teardown - @cmds.each(&:unlink) - super - end - - def test_internal_commands - cmds = Homebrew.internal_commands - assert cmds.include?("rbcmd"), "Ruby commands files should be recognized" - assert cmds.include?("shcmd"), "Shell commands files should be recognized" - refute cmds.include?("rbdevcmd"), "Dev commands shouldn't be included" - end - - def test_internal_developer_commands - cmds = Homebrew.internal_developer_commands - assert cmds.include?("rbdevcmd"), "Ruby commands files should be recognized" - assert cmds.include?("shdevcmd"), "Shell commands files should be recognized" - refute cmds.include?("rbcmd"), "Non-dev commands shouldn't be included" - end - - def test_external_commands - mktmpdir do |dir| - %w[brew-t1 brew-t2.rb brew-t3.py].each do |file| - path = "#{dir}/#{file}" - FileUtils.touch path - FileUtils.chmod 0755, path - end - - FileUtils.touch "#{dir}/brew-t4" - - ENV["PATH"] += "#{File::PATH_SEPARATOR}#{dir}" - cmds = Homebrew.external_commands - - assert cmds.include?("t1"), "Executable files should be included" - assert cmds.include?("t2"), "Executable Ruby files should be included" - refute cmds.include?("t3"), - "Executable files with a non Ruby extension shoudn't be included" - refute cmds.include?("t4"), "Non-executable files shouldn't be included" - end - end - - def test_internal_command_path - assert_equal HOMEBREW_LIBRARY_PATH/"cmd/rbcmd.rb", - Commands.path("rbcmd") - assert_equal HOMEBREW_LIBRARY_PATH/"cmd/shcmd.sh", - Commands.path("shcmd") - assert_nil Commands.path("idontexist1234") - end - - def test_internal_dev_command_path - assert_equal HOMEBREW_LIBRARY_PATH/"dev-cmd/rbdevcmd.rb", - Commands.path("rbdevcmd") - assert_equal HOMEBREW_LIBRARY_PATH/"dev-cmd/shdevcmd.sh", - Commands.path("shdevcmd") - end -end diff --git a/Library/Homebrew/test/dependencies_spec.rb b/Library/Homebrew/test/dependencies_spec.rb new file mode 100644 index 000000000..84ea53181 --- /dev/null +++ b/Library/Homebrew/test/dependencies_spec.rb @@ -0,0 +1,86 @@ +require "dependencies" +require "dependency" + +describe Dependencies do + describe "#<<" do + it "returns itself" do + expect(subject << Dependency.new("foo")).to eq(subject) + end + + it "preserves order" do + hash = { 0 => "foo", 1 => "bar", 2 => "baz" } + + subject << Dependency.new(hash[0]) + subject << Dependency.new(hash[1]) + subject << Dependency.new(hash[2]) + + subject.each_with_index do |dep, i| + expect(dep.name).to eq(hash[i]) + end + end + end + + specify "#*" do + subject << Dependency.new("foo") + subject << Dependency.new("bar") + expect(subject * ", ").to eq("foo, bar") + end + + specify "#to_a" do + dep = Dependency.new("foo") + subject << dep + expect(subject.to_a).to eq([dep]) + end + + specify "#to_ary" do + dep = Dependency.new("foo") + subject << dep + expect(subject.to_ary).to eq([dep]) + end + + specify "type helpers" do + foo = Dependency.new("foo") + bar = Dependency.new("bar", [:optional]) + baz = Dependency.new("baz", [:build]) + qux = Dependency.new("qux", [:recommended]) + quux = Dependency.new("quux") + subject << foo << bar << baz << qux << quux + expect(subject.required).to eq([foo, quux]) + expect(subject.optional).to eq([bar]) + expect(subject.build).to eq([baz]) + expect(subject.recommended).to eq([qux]) + expect(subject.default.sort_by(&:name)).to eq([foo, baz, quux, qux].sort_by(&:name)) + end + + specify "equality" do + a = Dependencies.new + b = Dependencies.new + + dep = Dependency.new("foo") + + a << dep + b << dep + + expect(a).to eq(b) + expect(a).to eql(b) + + b << Dependency.new("bar", [:optional]) + + expect(a).not_to eq(b) + expect(a).not_to eql(b) + end + + specify "#empty?" do + expect(subject).to be_empty + + subject << Dependency.new("foo") + expect(subject).not_to be_empty + end + + specify "#inspect" do + expect(subject.inspect).to eq("#<Dependencies: []>") + + subject << Dependency.new("foo") + expect(subject.inspect).to eq("#<Dependencies: [#<Dependency: \"foo\" []>]>") + end +end diff --git a/Library/Homebrew/test/dependencies_test.rb b/Library/Homebrew/test/dependencies_test.rb deleted file mode 100644 index c5444fcbc..000000000 --- a/Library/Homebrew/test/dependencies_test.rb +++ /dev/null @@ -1,117 +0,0 @@ -require "testing_env" -require "dependencies" -require "dependency" -require "requirements" - -class DependenciesTests < Homebrew::TestCase - def setup - super - @deps = Dependencies.new - end - - def test_shovel_returns_self - assert_same @deps, @deps << Dependency.new("foo") - end - - def test_preserves_order - hash = { 0 => "foo", 1 => "bar", 2 => "baz" } - @deps << Dependency.new(hash[0]) - @deps << Dependency.new(hash[1]) - @deps << Dependency.new(hash[2]) - @deps.each_with_index do |dep, idx| - assert_equal hash[idx], dep.name - end - end - - def test_repetition - @deps << Dependency.new("foo") - @deps << Dependency.new("bar") - assert_equal "foo, bar", @deps*", " - end - - def test_to_a - dep = Dependency.new("foo") - @deps << dep - assert_equal [dep], @deps.to_a - end - - def test_to_ary - dep = Dependency.new("foo") - @deps << dep - assert_equal [dep], @deps.to_ary - end - - def test_type_helpers - foo = Dependency.new("foo") - bar = Dependency.new("bar", [:optional]) - baz = Dependency.new("baz", [:build]) - qux = Dependency.new("qux", [:recommended]) - quux = Dependency.new("quux") - @deps << foo << bar << baz << qux << quux - assert_equal [foo, quux], @deps.required - assert_equal [bar], @deps.optional - assert_equal [baz], @deps.build - assert_equal [qux], @deps.recommended - assert_equal [foo, baz, quux, qux].sort_by(&:name), @deps.default.sort_by(&:name) - end - - def test_equality - a = Dependencies.new - b = Dependencies.new - - dep = Dependency.new("foo") - - a << dep - b << dep - - assert_equal a, b - assert_eql a, b - - b << Dependency.new("bar", [:optional]) - - refute_equal a, b - refute_eql a, b - end - - def test_empty - a = Dependencies.new - assert a.empty? - a << Dependency.new("foo") - refute a.empty? - end - - def test_inspect - a = Dependencies.new - assert_equal "#<Dependencies: []>", a.inspect - a << Dependency.new("foo") - assert_equal "#<Dependencies: [#<Dependency: \"foo\" []>]>", a.inspect - end -end - -class RequirementsTests < Homebrew::TestCase - def setup - super - @reqs = Requirements.new - end - - def test_shovel_returns_self - assert_same @reqs, @reqs << Object.new - end - - def test_merging_multiple_dependencies - @reqs << X11Requirement.new << X11Requirement.new - assert_equal 1, @reqs.count - @reqs << Requirement.new - assert_equal 2, @reqs.count - end - - def test_comparison_prefers_larger - @reqs << X11Requirement.new << X11Requirement.new("x11", %w[2.6]) - assert_equal [X11Requirement.new("x11", %w[2.6])], @reqs.to_a - end - - def test_comparison_does_not_merge_smaller - @reqs << X11Requirement.new("x11", %w[2.6]) << X11Requirement.new - assert_equal [X11Requirement.new("x11", %w[2.6])], @reqs.to_a - end -end diff --git a/Library/Homebrew/test/formula_installer_spec.rb b/Library/Homebrew/test/formula_installer_spec.rb new file mode 100644 index 000000000..600b4560f --- /dev/null +++ b/Library/Homebrew/test/formula_installer_spec.rb @@ -0,0 +1,137 @@ +require "formula" +require "formula_installer" +require "keg" +require "tab" +require "test/support/fixtures/testball" +require "test/support/fixtures/testball_bottle" + +RSpec::Matchers.define_negated_matcher :need_bottle, :be_bottle_unneeded +RSpec::Matchers.alias_matcher :have_disabled_bottle, :be_bottle_disabled + +describe FormulaInstaller do + matcher :be_poured_from_bottle do + match(&:poured_from_bottle) + end + + def temporary_install(formula) + expect(formula).not_to be_installed + + installer = described_class.new(formula) + + shutup do + installer.install + end + + keg = Keg.new(formula.prefix) + + expect(formula).to be_installed + + begin + Tab.clear_cache + expect(Tab.for_keg(keg)).not_to be_poured_from_bottle + + yield formula + ensure + Tab.clear_cache + keg.unlink + keg.uninstall + formula.clear_cache + # there will be log files when sandbox is enable. + formula.logs.rmtree if formula.logs.directory? + end + + expect(keg).not_to exist + expect(formula).not_to be_installed + end + + specify "basic installation" do + ARGV << "--with-invalid_flag" # added to ensure it doesn't fail install + + temporary_install(Testball.new) do |f| + # Test that things made it into the Keg + expect(f.prefix/"readme").to exist + + expect(f.bin).to be_a_directory + expect(f.bin.children.count).to eq(3) + + expect(f.libexec).to be_a_directory + expect(f.libexec.children.count).to eq(1) + + expect(f.prefix/"main.c").not_to exist + expect(f.prefix/"license").not_to exist + + # Test that things make it into the Cellar + keg = Keg.new f.prefix + keg.link + + bin = HOMEBREW_PREFIX/"bin" + expect(bin).to be_a_directory + expect(bin.children.count).to eq(3) + expect(f.prefix/".brew/testball.rb").to be_readable + end + end + + specify "Formula installation with unneeded bottle" do + allow(DevelopmentTools).to receive(:installed?).and_return(false) + + formula = Testball.new + allow(formula).to receive(:bottle_unneeded?).and_return(true) + allow(formula).to receive(:bottle_disabled?).and_return(true) + + expect(formula).not_to be_bottled + expect(formula).not_to need_bottle + expect(formula).to have_disabled_bottle + + temporary_install(formula) do |f| + expect(f).to be_installed + end + end + + specify "Formula is not poured from bottle when compiler specified" do + expect(ARGV.cc).to be nil + + cc_arg = "--cc=clang" + ARGV << cc_arg + + temporary_install(TestballBottle.new) do |f| + tab = Tab.for_formula(f) + expect(tab.compiler).to eq("clang") + end + end + + specify "check installation sanity pinned dependency" do + dep_name = "dependency" + dep_path = CoreTap.new.formula_dir/"#{dep_name}.rb" + dep_path.write <<-EOS.undent + class #{Formulary.class_s(dep_name)} < Formula + url "foo" + version "0.2" + end + EOS + + Formulary::FORMULAE.delete(dep_path) + dependency = Formulary.factory(dep_name) + + dependent = formula do + url "foo" + version "0.5" + depends_on dependency.name.to_s + end + + (dependency.prefix("0.1")/"bin"/"a").mkpath + HOMEBREW_PINNED_KEGS.mkpath + FileUtils.ln_s dependency.prefix("0.1"), HOMEBREW_PINNED_KEGS/dep_name + + dependency_keg = Keg.new(dependency.prefix("0.1")) + dependency_keg.link + + expect(dependency_keg).to be_linked + expect(dependency).to be_pinned + + fi = FormulaInstaller.new(dependent) + + expect { + fi.check_install_sanity + }.to raise_error(CannotInstallFormulaError) + end +end diff --git a/Library/Homebrew/test/formula_installer_test.rb b/Library/Homebrew/test/formula_installer_test.rb deleted file mode 100644 index c99b2de74..000000000 --- a/Library/Homebrew/test/formula_installer_test.rb +++ /dev/null @@ -1,131 +0,0 @@ -require "testing_env" -require "formula" -require "formula_installer" -require "keg" -require "tab" -require "test/support/fixtures/testball" -require "test/support/fixtures/testball_bottle" - -class InstallTests < Homebrew::TestCase - def temporary_install(formula) - refute_predicate formula, :installed? - - installer = FormulaInstaller.new(formula) - - shutup { installer.install } - - keg = Keg.new(formula.prefix) - - assert_predicate formula, :installed? - - begin - Tab.clear_cache - refute_predicate Tab.for_keg(keg), :poured_from_bottle - - yield formula - ensure - Tab.clear_cache - keg.unlink - keg.uninstall - formula.clear_cache - # there will be log files when sandbox is enable. - formula.logs.rmtree if formula.logs.directory? - end - - refute_predicate keg, :exist? - refute_predicate formula, :installed? - end - - def test_a_basic_install - ARGV << "--with-invalid_flag" # added to ensure it doesn't fail install - temporary_install(Testball.new) do |f| - # Test that things made it into the Keg - assert_predicate f.prefix+"readme", :exist? - - assert_predicate f.bin, :directory? - assert_equal 3, f.bin.children.length - - assert_predicate f.libexec, :directory? - assert_equal 1, f.libexec.children.length - - refute_predicate f.prefix+"main.c", :exist? - - refute_predicate f.prefix+"license", :exist? - - # Test that things make it into the Cellar - keg = Keg.new f.prefix - keg.link - - bin = HOMEBREW_PREFIX+"bin" - assert_predicate bin, :directory? - assert_equal 3, bin.children.length - assert_predicate f.prefix/".brew/testball.rb", :readable? - end - end - - def test_bottle_unneeded_formula_install - DevelopmentTools.stubs(:installed?).returns(false) - - formula = Testball.new - formula.stubs(:bottle_unneeded?).returns(true) - formula.stubs(:bottle_disabled?).returns(true) - - refute_predicate formula, :bottled? - assert_predicate formula, :bottle_unneeded? - assert_predicate formula, :bottle_disabled? - - temporary_install(formula) do |f| - assert_predicate f, :installed? - end - end - - def test_not_poured_from_bottle_when_compiler_specified - assert_nil ARGV.cc - - cc_arg = "--cc=clang" - ARGV << cc_arg - - temporary_install(TestballBottle.new) do |f| - tab = Tab.for_formula(f) - assert_equal "clang", tab.compiler - end - end -end - -class FormulaInstallerTests < Homebrew::TestCase - def test_check_install_sanity_pinned_dep - dep_name = "dependency" - dep_path = CoreTap.new.formula_dir/"#{dep_name}.rb" - dep_path.write <<-EOS.undent - class #{Formulary.class_s(dep_name)} < Formula - url "foo" - version "0.2" - end - EOS - - Formulary::FORMULAE.delete(dep_path) - dependency = Formulary.factory(dep_name) - - dependent = formula do - url "foo" - version "0.5" - depends_on dependency.name.to_s - end - - dependency.prefix("0.1").join("bin/a").mkpath - HOMEBREW_PINNED_KEGS.mkpath - FileUtils.ln_s dependency.prefix("0.1"), HOMEBREW_PINNED_KEGS/dep_name - - dependency_keg = Keg.new(dependency.prefix("0.1")) - dependency_keg.link - - assert_predicate dependency_keg, :linked? - assert_predicate dependency, :pinned? - - fi = FormulaInstaller.new(dependent) - assert_raises(CannotInstallFormulaError) { fi.check_install_sanity } - ensure - dependency_keg.unlink - Formulary::FORMULAE.delete(dep_path) - end -end diff --git a/Library/Homebrew/test/formula_spec_selection_spec.rb b/Library/Homebrew/test/formula_spec_selection_spec.rb new file mode 100644 index 000000000..20231ffda --- /dev/null +++ b/Library/Homebrew/test/formula_spec_selection_spec.rb @@ -0,0 +1,100 @@ +require "formula" + +describe Formula do + describe "::new" do + it "selects stable by default" do + f = formula do + url "foo-1.0" + devel { url "foo-1.1a" } + head "foo" + end + + expect(f).to be_stable + end + + it "selects stable when exclusive" do + f = formula { url "foo-1.0" } + expect(f).to be_stable + end + + it "selects devel before HEAD" do + f = formula do + devel { url "foo-1.1a" } + head "foo" + end + + expect(f).to be_devel + end + + it "selects devel when exclusive" do + f = formula { devel { url "foo-1.1a" } } + expect(f).to be_devel + end + + it "selects HEAD when exclusive" do + f = formula { head "foo" } + expect(f).to be_head + end + + it "does not select an incomplete spec" do + f = formula do + sha256 TEST_SHA256 + version "1.0" + head "foo" + end + + expect(f).to be_head + end + + it "does not set an incomplete stable spec" do + f = formula do + sha256 TEST_SHA256 + devel { url "foo-1.1a" } + head "foo" + end + + expect(f.stable).to be nil + expect(f).to be_devel + end + + it "selects HEAD when requested" do + f = formula("test", spec: :head) do + url "foo-1.0" + devel { url "foo-1.1a" } + head "foo" + end + + expect(f).to be_head + end + + it "selects devel when requested" do + f = formula("test", spec: :devel) do + url "foo-1.0" + devel { url "foo-1.1a" } + head "foo" + end + + expect(f).to be_devel + end + + it "does not set an incomplete devel spec" do + f = formula do + url "foo-1.0" + devel { version "1.1a" } + head "foo" + end + + expect(f.devel).to be nil + expect(f).to be_stable + end + + it "does not raise an error for a missing spec" do + f = formula("test", spec: :devel) do + url "foo-1.0" + head "foo" + end + + expect(f).to be_stable + end + end +end diff --git a/Library/Homebrew/test/formula_spec_selection_test.rb b/Library/Homebrew/test/formula_spec_selection_test.rb deleted file mode 100644 index 7148df173..000000000 --- a/Library/Homebrew/test/formula_spec_selection_test.rb +++ /dev/null @@ -1,99 +0,0 @@ -require "testing_env" -require "formula" - -class FormulaSpecSelectionTests < Homebrew::TestCase - def test_selects_stable_by_default - f = formula do - url "foo-1.0" - devel { url "foo-1.1a" } - head "foo" - end - - assert_predicate f, :stable? - end - - def test_selects_stable_when_exclusive - f = formula { url "foo-1.0" } - assert_predicate f, :stable? - end - - def test_selects_devel_before_head - f = formula do - devel { url "foo-1.1a" } - head "foo" - end - - assert_predicate f, :devel? - end - - def test_selects_devel_when_exclusive - f = formula { devel { url "foo-1.1a" } } - assert_predicate f, :devel? - end - - def test_selects_head_when_exclusive - f = formula { head "foo" } - assert_predicate f, :head? - end - - def test_incomplete_spec_not_selected - f = formula do - sha256 TEST_SHA256 - version "1.0" - head "foo" - end - - assert_predicate f, :head? - end - - def test_incomplete_stable_not_set - f = formula do - sha256 TEST_SHA256 - devel { url "foo-1.1a" } - head "foo" - end - - assert_nil f.stable - assert_predicate f, :devel? - end - - def test_selects_head_when_requested - f = formula("test", Pathname.new(__FILE__).expand_path, :head) do - url "foo-1.0" - devel { url "foo-1.1a" } - head "foo" - end - - assert_predicate f, :head? - end - - def test_selects_devel_when_requested - f = formula("test", Pathname.new(__FILE__).expand_path, :devel) do - url "foo-1.0" - devel { url "foo-1.1a" } - head "foo" - end - - assert_predicate f, :devel? - end - - def test_incomplete_devel_not_set - f = formula do - url "foo-1.0" - devel { version "1.1a" } - head "foo" - end - - assert_nil f.devel - assert_predicate f, :stable? - end - - def test_does_not_raise_for_missing_spec - f = formula("test", Pathname.new(__FILE__).expand_path, :devel) do - url "foo-1.0" - head "foo" - end - - assert_predicate f, :stable? - end -end diff --git a/Library/Homebrew/test/requirements_spec.rb b/Library/Homebrew/test/requirements_spec.rb new file mode 100644 index 000000000..3111a7c9c --- /dev/null +++ b/Library/Homebrew/test/requirements_spec.rb @@ -0,0 +1,26 @@ +require "requirements" + +describe Requirements do + describe "#<<" do + it "returns itself" do + expect(subject << Object.new).to be(subject) + end + + it "merges duplicate requirements" do + subject << X11Requirement.new << X11Requirement.new + expect(subject.count).to eq(1) + subject << Requirement.new + expect(subject.count).to eq(2) + end + + it "prefers the larger requirement when merging duplicates" do + subject << X11Requirement.new << X11Requirement.new("x11", %w[2.6]) + expect(subject.to_a).to eq([X11Requirement.new("x11", %w[2.6])]) + end + + it "does not use the smaller requirement when merging duplicates" do + subject << X11Requirement.new("x11", %w[2.6]) << X11Requirement.new + expect(subject.to_a).to eq([X11Requirement.new("x11", %w[2.6])]) + end + end +end diff --git a/Library/Homebrew/test/support/helper/test_case.rb b/Library/Homebrew/test/support/helper/test_case.rb index 568beb947..5e72bb048 100644 --- a/Library/Homebrew/test/support/helper/test_case.rb +++ b/Library/Homebrew/test/support/helper/test_case.rb @@ -6,11 +6,9 @@ module Homebrew require "test/support/helper/fs_leak_logger" require "test/support/helper/lifecycle_enforcer" require "test/support/helper/shutup" - require "test/support/helper/version_assertions" include Test::Helper::FSLeakLogger include Test::Helper::LifecycleEnforcer include Test::Helper::Shutup - include Test::Helper::VersionAssertions TEST_DIRECTORIES = [ CoreTap.instance.path/"Formula", diff --git a/Library/Homebrew/test/support/helper/version_assertions.rb b/Library/Homebrew/test/support/helper/version_assertions.rb deleted file mode 100644 index dc240d643..000000000 --- a/Library/Homebrew/test/support/helper/version_assertions.rb +++ /dev/null @@ -1,23 +0,0 @@ -require "rubygems" - -module Test - module Helper - module VersionAssertions - def version(v) - Version.create(v) - end - - def assert_version_equal(expected, actual) - assert_equal Version.create(expected), actual - end - - def assert_version_detected(expected, url, specs = {}) - assert_equal expected, Version.detect(url, specs).to_s - end - - def assert_version_nil(url) - assert Version.parse(url).null? - end - end - end -end diff --git a/Library/Homebrew/test/uninstall_test.rb b/Library/Homebrew/test/uninstall_test.rb deleted file mode 100644 index a9230ffac..000000000 --- a/Library/Homebrew/test/uninstall_test.rb +++ /dev/null @@ -1,62 +0,0 @@ -require "testing_env" -require "cmd/uninstall" - -class UninstallTests < Homebrew::TestCase - def setup - super - - @dependency = formula("dependency") { url "f-1" } - @dependent = formula("dependent") do - url "f-1" - depends_on "dependency" - end - - [@dependency, @dependent].each do |f| - f.installed_prefix.mkpath - Keg.new(f.installed_prefix).optlink - end - - tab = Tab.empty - tab.homebrew_version = "1.1.6" - tab.tabfile = @dependent.installed_prefix/Tab::FILENAME - tab.runtime_dependencies = [ - { "full_name" => "dependency", "version" => "1" }, - ] - tab.write - - stub_formula_loader @dependency - stub_formula_loader @dependent - end - - def teardown - Homebrew.failed = false - super - end - - def handle_unsatisfied_dependents - capture_stderr do - opts = { @dependency.rack => [Keg.new(@dependency.installed_prefix)] } - Homebrew.handle_unsatisfied_dependents(opts) - end - end - - def test_check_for_testball_f2s_when_developer - assert_match "Warning", handle_unsatisfied_dependents - refute_predicate Homebrew, :failed? - end - - def test_check_for_dependents_when_not_developer - run_as_not_developer do - assert_match "Error", handle_unsatisfied_dependents - assert_predicate Homebrew, :failed? - end - end - - def test_check_for_dependents_when_ignore_dependencies - ARGV << "--ignore-dependencies" - run_as_not_developer do - assert_empty handle_unsatisfied_dependents - refute_predicate Homebrew, :failed? - end - end -end diff --git a/Library/Homebrew/test/version_spec.rb b/Library/Homebrew/test/version_spec.rb new file mode 100644 index 000000000..d3d63a25c --- /dev/null +++ b/Library/Homebrew/test/version_spec.rb @@ -0,0 +1,602 @@ +require "version" + +describe Version::Token do + specify "#inspect" do + expect(Version::Token.new("foo").inspect).to eq('#<Version::Token "foo">') + end + + specify "#to_s" do + expect(Version::Token.new("foo").to_s).to eq("foo") + end +end + +describe Version::NULL do + it "is always smaller" do + expect(Version::NULL).to be < Version.create("1") + end + + it "is never greater" do + expect(Version::NULL).not_to be > Version.create("0") + end + + it "isn't equal to itself" do + expect(Version::NULL).not_to eql(Version::NULL) + end + + it "creates an empty string" do + expect(Version::NULL.to_s).to eq("") + end + + it "produces NaN as a Float" do + # Float::NAN is not equal to itself so compare object IDs + expect(Version::NULL.to_f.object_id).to eql(Float::NAN.object_id) + end +end + +describe Version::NullToken do + specify "#inspect" do + expect(subject.inspect).to eq("#<Version::NullToken>") + end + + it "is equal to itself" do + expect(subject).to be == described_class.new + end +end + +describe Version do + specify "comparison" do + expect(Version.create("0.1")).to be == Version.create("0.1.0") + expect(Version.create("0.1")).to be < Version.create("0.2") + expect(Version.create("1.2.3")).to be > Version.create("1.2.2") + expect(Version.create("1.2.4")).to be < Version.create("1.2.4.1") + + expect(Version.create("1.2.3")).to be > Version.create("1.2.3alpha4") + expect(Version.create("1.2.3")).to be > Version.create("1.2.3beta2") + expect(Version.create("1.2.3")).to be > Version.create("1.2.3rc3") + expect(Version.create("1.2.3")).to be < Version.create("1.2.3-p34") + end + + specify "HEAD" do + expect(Version.create("HEAD")).to be > Version.create("1.2.3") + expect(Version.create("HEAD-abcdef")).to be > Version.create("1.2.3") + expect(Version.create("1.2.3")).to be < Version.create("HEAD") + expect(Version.create("1.2.3")).to be < Version.create("HEAD-fedcba") + expect(Version.create("HEAD-abcdef")).to be == Version.create("HEAD-fedcba") + expect(Version.create("HEAD")).to be == Version.create("HEAD-fedcba") + end + + specify "comparing alpha versions" do + expect(Version.create("1.2.3alpha")).to be < Version.create("1.2.3") + expect(Version.create("1.2.3")).to be < Version.create("1.2.3a") + expect(Version.create("1.2.3alpha4")).to be == Version.create("1.2.3a4") + expect(Version.create("1.2.3alpha4")).to be == Version.create("1.2.3A4") + expect(Version.create("1.2.3alpha4")).to be > Version.create("1.2.3alpha3") + expect(Version.create("1.2.3alpha4")).to be < Version.create("1.2.3alpha5") + expect(Version.create("1.2.3alpha4")).to be < Version.create("1.2.3alpha10") + + expect(Version.create("1.2.3alpha4")).to be < Version.create("1.2.3beta2") + expect(Version.create("1.2.3alpha4")).to be < Version.create("1.2.3rc3") + expect(Version.create("1.2.3alpha4")).to be < Version.create("1.2.3") + expect(Version.create("1.2.3alpha4")).to be < Version.create("1.2.3-p34") + end + + specify "comparing beta versions" do + expect(Version.create("1.2.3beta2")).to be == Version.create("1.2.3b2") + expect(Version.create("1.2.3beta2")).to be == Version.create("1.2.3B2") + expect(Version.create("1.2.3beta2")).to be > Version.create("1.2.3beta1") + expect(Version.create("1.2.3beta2")).to be < Version.create("1.2.3beta3") + expect(Version.create("1.2.3beta2")).to be < Version.create("1.2.3beta10") + + expect(Version.create("1.2.3beta2")).to be > Version.create("1.2.3alpha4") + expect(Version.create("1.2.3beta2")).to be < Version.create("1.2.3rc3") + expect(Version.create("1.2.3beta2")).to be < Version.create("1.2.3") + expect(Version.create("1.2.3beta2")).to be < Version.create("1.2.3-p34") + end + + specify "comparing RC versions" do + expect(Version.create("1.2.3rc3")).to be == Version.create("1.2.3RC3") + expect(Version.create("1.2.3rc3")).to be > Version.create("1.2.3rc2") + expect(Version.create("1.2.3rc3")).to be < Version.create("1.2.3rc4") + expect(Version.create("1.2.3rc3")).to be < Version.create("1.2.3rc10") + + expect(Version.create("1.2.3rc3")).to be > Version.create("1.2.3alpha4") + expect(Version.create("1.2.3rc3")).to be > Version.create("1.2.3beta2") + expect(Version.create("1.2.3rc3")).to be < Version.create("1.2.3") + expect(Version.create("1.2.3rc3")).to be < Version.create("1.2.3-p34") + end + + specify "comparing patch-level versions" do + expect(Version.create("1.2.3-p34")).to be == Version.create("1.2.3-P34") + expect(Version.create("1.2.3-p34")).to be > Version.create("1.2.3-p33") + expect(Version.create("1.2.3-p34")).to be < Version.create("1.2.3-p35") + expect(Version.create("1.2.3-p34")).to be > Version.create("1.2.3-p9") + + expect(Version.create("1.2.3-p34")).to be > Version.create("1.2.3alpha4") + expect(Version.create("1.2.3-p34")).to be > Version.create("1.2.3beta2") + expect(Version.create("1.2.3-p34")).to be > Version.create("1.2.3rc3") + expect(Version.create("1.2.3-p34")).to be > Version.create("1.2.3") + end + + specify "comparing unevenly-padded versions" do + expect(Version.create("2.1.0-p194")).to be < Version.create("2.1-p195") + expect(Version.create("2.1-p195")).to be > Version.create("2.1.0-p194") + expect(Version.create("2.1-p194")).to be < Version.create("2.1.0-p195") + expect(Version.create("2.1.0-p195")).to be > Version.create("2.1-p194") + expect(Version.create("2-p194")).to be < Version.create("2.1-p195") + end + + it "can be compared against nil" do + expect(Version.create("2.1.0-p194")).to be > nil + end + + it "can be compared against strings" do + expect(Version.create("2.1.0-p194")).to be == "2.1.0-p194" + expect(Version.create("1")).to be == 1 + end + + specify "comparison returns nil for non-version" do + v = Version.create("1.0") + expect(v <=> Object.new).to be nil + expect { v > Object.new }.to raise_error(ArgumentError) + end + + specify "erlang versions" do + versions = %w[R16B R15B03-1 R15B03 R15B02 R15B01 R14B04 R14B03 + R14B02 R14B01 R14B R13B04 R13B03 R13B02-1].reverse + expect(versions.sort_by { |v| Version.create(v) }).to eq(versions) + end + + specify "hash equality" do + v1 = Version.create("0.1.0") + v2 = Version.create("0.1.0") + v3 = Version.create("0.1.1") + + expect(v1).to eql(v2) + expect(v1).not_to eql(v3) + expect(v1.hash).to eq(v2.hash) + expect(v1.hash).not_to eq(v3.hash) + + h = { v1 => :foo } + expect(h[v2]).to eq(:foo) + end + + describe "::create" do + it "accepts objects responding to #to_str" do + value = double(to_str: "0.1") + expect(Version.create(value).to_s).to eq("0.1") + end + + it "raises a TypeError for non-string objects" do + expect { Version.create(1.1) }.to raise_error(TypeError) + expect { Version.create(1) }.to raise_error(TypeError) + expect { Version.create(:symbol) }.to raise_error(TypeError) + end + + it "parses a version from a string" do + v = Version.create("1.20") + expect(v).not_to be_head + expect(v.to_str).to eq("1.20") + end + + specify "HEAD with commit" do + v = Version.create("HEAD-abcdef") + expect(v.commit).to eq("abcdef") + expect(v.to_str).to eq("HEAD-abcdef") + end + + specify "HEAD without commit" do + v = Version.create("HEAD") + expect(v.commit).to be nil + expect(v.to_str).to eq("HEAD") + end + end + + specify "#detected_from_url?" do + expect(Version.create("1.0")).not_to be_detected_from_url + expect(Version::FromURL.new("1.0")).to be_detected_from_url + end + + specify "#head?" do + v1 = Version.create("HEAD-abcdef") + v2 = Version.create("HEAD") + + expect(v1).to be_head + expect(v2).to be_head + end + + specify "#update_commit" do + v1 = Version.create("HEAD-abcdef") + v2 = Version.create("HEAD") + + v1.update_commit("ffffff") + expect(v1.commit).to eq("ffffff") + expect(v1.to_str).to eq("HEAD-ffffff") + + v2.update_commit("ffffff") + expect(v2.commit).to eq("ffffff") + expect(v2.to_str).to eq("HEAD-ffffff") + end + + describe "::parse" do + it "returns a NULL version when the URL cannot be parsed" do + expect(Version.parse("http://example.com/blah.tar")).to be_null + expect(Version.parse("foo")).to be_null + end + end + + describe "::detect" do + matcher :be_detected_from do |url, specs = {}| + match do |version| + Version.detect(url, specs) == version + end + end + + specify "version all dots" do + expect(Version.create("1.14")) + .to be_detected_from("http://example.com/foo.bar.la.1.14.zip") + end + + specify "version underscore separator" do + expect(Version.create("1.1")) + .to be_detected_from("http://example.com/grc_1.1.tar.gz") + end + + specify "boost version style" do + expect(Version.create("1.39.0")) + .to be_detected_from("http://example.com/boost_1_39_0.tar.bz2") + end + + specify "erlang version style" do + expect(Version.create("R13B")) + .to be_detected_from("http://erlang.org/download/otp_src_R13B.tar.gz") + end + + specify "another erlang version style" do + expect(Version.create("R15B01")) + .to be_detected_from("https://github.com/erlang/otp/tarball/OTP_R15B01") + end + + specify "yet another erlang version style" do + expect(Version.create("R15B03-1")) + .to be_detected_from("https://github.com/erlang/otp/tarball/OTP_R15B03-1") + end + + specify "p7zip version style" do + expect(Version.create("9.04")) + .to be_detected_from("http://kent.dl.sourceforge.net/sourceforge/p7zip/p7zip_9.04_src_all.tar.bz2") + end + + specify "new github style" do + expect(Version.create("1.1.4")) + .to be_detected_from("https://github.com/sam-github/libnet/tarball/libnet-1.1.4") + end + + specify "codeload style" do + expect(Version.create("0.7.1")) + .to be_detected_from("https://codeload.github.com/gsamokovarov/jump/tar.gz/v0.7.1") + end + + specify "elasticsearch alpha style" do + expect(Version.create("5.0.0-alpha5")) + .to be_detected_from("https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/5.0.0-alpha5/elasticsearch-5.0.0-alpha5.tar.gz") + end + + specify "gloox beta style" do + expect(Version.create("1.0-beta7")) + .to be_detected_from("http://camaya.net/download/gloox-1.0-beta7.tar.bz2") + end + + specify "sphinx beta style" do + expect(Version.create("1.10-beta")) + .to be_detected_from("http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz") + end + + specify "astyle version style" do + expect(Version.create("1.23")) + .to be_detected_from("http://kent.dl.sourceforge.net/sourceforge/astyle/astyle_1.23_macosx.tar.gz") + end + + specify "version dos2unix" do + expect(Version.create("3.1")) + .to be_detected_from("http://www.sfr-fresh.com/linux/misc/dos2unix-3.1.tar.gz") + end + + specify "version internal dash" do + expect(Version.create("1.1-2")) + .to be_detected_from("http://example.com/foo-arse-1.1-2.tar.gz") + end + + specify "version single digit" do + expect(Version.create("45")) + .to be_detected_from("http://example.com/foo_bar.45.tar.gz") + end + + specify "noseparator single digit" do + expect(Version.create("45")) + .to be_detected_from("http://example.com/foo_bar45.tar.gz") + end + + specify "version developer that hates us format" do + expect(Version.create("1.2.3")) + .to be_detected_from("http://example.com/foo-bar-la.1.2.3.tar.gz") + end + + specify "version regular" do + expect(Version.create("1.21")) + .to be_detected_from("http://example.com/foo_bar-1.21.tar.gz") + end + + specify "version sourceforge download" do + expect(Version.create("1.21")) + .to be_detected_from("http://sourceforge.net/foo_bar-1.21.tar.gz/download") + expect(Version.create("1.21")) + .to be_detected_from("http://sf.net/foo_bar-1.21.tar.gz/download") + end + + specify "version github" do + expect(Version.create("1.0.5")) + .to be_detected_from("http://github.com/lloyd/yajl/tarball/1.0.5") + end + + specify "version github with high patch number" do + expect(Version.create("1.2.34")) + .to be_detected_from("http://github.com/lloyd/yajl/tarball/v1.2.34") + end + + specify "yet another version" do + expect(Version.create("0.15.1b")) + .to be_detected_from("http://example.com/mad-0.15.1b.tar.gz") + end + + specify "lame version style" do + expect(Version.create("398-2")) + .to be_detected_from("http://kent.dl.sourceforge.net/sourceforge/lame/lame-398-2.tar.gz") + end + + specify "ruby version style" do + expect(Version.create("1.9.1-p243")) + .to be_detected_from("ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz") + end + + specify "omega version style" do + expect(Version.create("0.80.2")) + .to be_detected_from("http://www.alcyone.com/binaries/omega/omega-0.80.2-src.tar.gz") + end + + specify "rc style" do + expect(Version.create("1.2.2rc1")) + .to be_detected_from("http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2") + end + + specify "dash rc style" do + expect(Version.create("1.8.0-rc1")) + .to be_detected_from("http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz") + end + + specify "angband version style" do + expect(Version.create("3.0.9b")) + .to be_detected_from("http://rephial.org/downloads/3.0/angband-3.0.9b-src.tar.gz") + end + + specify "stable suffix" do + expect(Version.create("1.4.14b")) + .to be_detected_from("http://www.monkey.org/~provos/libevent-1.4.14b-stable.tar.gz") + end + + specify "debian style 1" do + expect(Version.create("3.03")) + .to be_detected_from("http://ftp.de.debian.org/debian/pool/main/s/sl/sl_3.03.orig.tar.gz") + end + + specify "debian style 2" do + expect(Version.create("1.01b")) + .to be_detected_from("http://ftp.de.debian.org/debian/pool/main/m/mmv/mmv_1.01b.orig.tar.gz") + end + + specify "bottle style" do + expect(Version.create("4.8.0")) + .to be_detected_from("https://homebrew.bintray.com/bottles/qt-4.8.0.lion.bottle.tar.gz") + end + + specify "versioned bottle style" do + expect(Version.create("4.8.1")) + .to be_detected_from("https://homebrew.bintray.com/bottles/qt-4.8.1.lion.bottle.1.tar.gz") + end + + specify "erlang bottle style" do + expect(Version.create("R15B")) + .to be_detected_from("https://homebrew.bintray.com/bottles/erlang-R15B.lion.bottle.tar.gz") + end + + specify "another erlang bottle style" do + expect(Version.create("R15B01")) + .to be_detected_from("https://homebrew.bintray.com/bottles/erlang-R15B01.mountain_lion.bottle.tar.gz") + end + + specify "yet another erlang bottle style" do + expect(Version.create("R15B03-1")) + .to be_detected_from("https://homebrew.bintray.com/bottles/erlang-R15B03-1.mountainlion.bottle.tar.gz") + end + + specify "imagemagick style" do + expect(Version.create("6.7.5-7")) + .to be_detected_from("http://downloads.sf.net/project/machomebrew/mirror/ImageMagick-6.7.5-7.tar.bz2") + end + + specify "imagemagick bottle style" do + expect(Version.create("6.7.5-7")) + .to be_detected_from("https://homebrew.bintray.com/bottles/imagemagick-6.7.5-7.lion.bottle.tar.gz") + end + + specify "imagemagick versioned bottle style" do + expect(Version.create("6.7.5-7")) + .to be_detected_from("https://homebrew.bintray.com/bottles/imagemagick-6.7.5-7.lion.bottle.1.tar.gz") + end + + specify "dash version style" do + expect(Version.create("3.4")) + .to be_detected_from("http://www.antlr.org/download/antlr-3.4-complete.jar") + end + + specify "jenkins version style" do + expect(Version.create("1.486")) + .to be_detected_from("http://mirrors.jenkins-ci.org/war/1.486/jenkins.war") + expect(Version.create("0.10.11")) + .to be_detected_from("https://github.com/hechoendrupal/DrupalConsole/releases/download/0.10.11/drupal.phar") + end + + specify "apache version style" do + expect(Version.create("1.2.0-rc2")) + .to be_detected_from("http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz") + end + + specify "jpeg version style" do + expect(Version.create("8d")) + .to be_detected_from("http://www.ijg.org/files/jpegsrc.v8d.tar.gz") + end + + specify "ghc version style" do + expect(Version.create("7.0.4")) + .to be_detected_from("http://www.haskell.org/ghc/dist/7.0.4/ghc-7.0.4-x86_64-apple-darwin.tar.bz2") + expect(Version.create("7.0.4")) + .to be_detected_from("http://www.haskell.org/ghc/dist/7.0.4/ghc-7.0.4-i386-apple-darwin.tar.bz2") + end + + specify "pypy version style" do + expect(Version.create("1.4.1")) + .to be_detected_from("http://pypy.org/download/pypy-1.4.1-osx.tar.bz2") + end + + specify "openssl version style" do + expect(Version.create("0.9.8s")) + .to be_detected_from("http://www.openssl.org/source/openssl-0.9.8s.tar.gz") + end + + specify "xaw3d version style" do + expect(Version.create("1.5E")) + .to be_detected_from("ftp://ftp.visi.com/users/hawkeyd/X/Xaw3d-1.5E.tar.gz") + end + + specify "assimp version style" do + expect(Version.create("2.0.863")) + .to be_detected_from("http://downloads.sourceforge.net/project/assimp/assimp-2.0/assimp--2.0.863-sdk.zip") + end + + specify "cmucl version style" do + expect(Version.create("20c")) + .to be_detected_from("http://common-lisp.net/project/cmucl/downloads/release/20c/cmucl-20c-x86-darwin.tar.bz2") + end + + specify "fann version style" do + expect(Version.create("2.1.0beta")) + .to be_detected_from("http://downloads.sourceforge.net/project/fann/fann/2.1.0beta/fann-2.1.0beta.zip") + end + + specify "grads version style" do + expect(Version.create("2.0.1")) + .to be_detected_from("ftp://iges.org/grads/2.0/grads-2.0.1-bin-darwin9.8-intel.tar.gz") + end + + specify "haxe version style" do + expect(Version.create("2.08")) + .to be_detected_from("http://haxe.org/file/haxe-2.08-osx.tar.gz") + end + + specify "imap version style" do + expect(Version.create("2007f")) + .to be_detected_from("ftp://ftp.cac.washington.edu/imap/imap-2007f.tar.gz") + end + + specify "suite3270 version style" do + expect(Version.create("3.3.12ga7")) + .to be_detected_from("http://downloads.sourceforge.net/project/x3270/x3270/3.3.12ga7/suite3270-3.3.12ga7-src.tgz") + end + + specify "wwwoffle version style" do + expect(Version.create("2.9h")) + .to be_detected_from("http://www.gedanken.demon.co.uk/download-wwwoffle/wwwoffle-2.9h.tgz") + end + + specify "synergy version style" do + expect(Version.create("1.3.6p2")) + .to be_detected_from("http://synergy.googlecode.com/files/synergy-1.3.6p2-MacOSX-Universal.zip") + end + + specify "fontforge version style" do + expect(Version.create("20120731")) + .to be_detected_from("http://downloads.sourceforge.net/project/fontforge/fontforge-source/fontforge_full-20120731-b.tar.bz2") + end + + specify "ezlupdate version style" do + expect(Version.create("2011.10")) + .to be_detected_from("https://github.com/downloads/ezsystems/ezpublish-legacy/ezpublish_community_project-2011.10-with_ezc.tar.bz2") + end + + specify "aespipe version style" do + expect(Version.create("2.4c")) + .to be_detected_from("http://loop-aes.sourceforge.net/aespipe/aespipe-v2.4c.tar.bz2") + end + + specify "win version style" do + expect(Version.create("0.9.17")) + .to be_detected_from("http://ftpmirror.gnu.org/libmicrohttpd/libmicrohttpd-0.9.17-w32.zip") + expect(Version.create("1.29")) + .to be_detected_from("http://ftpmirror.gnu.org/libidn/libidn-1.29-win64.zip") + end + + specify "with arch" do + expect(Version.create("4.0.18-1")) + .to be_detected_from("http://ftpmirror.gnu.org/mtools/mtools-4.0.18-1.i686.rpm") + expect(Version.create("5.5.7-5")) + .to be_detected_from("http://ftpmirror.gnu.org/autogen/autogen-5.5.7-5.i386.rpm") + expect(Version.create("2.8")) + .to be_detected_from("http://ftpmirror.gnu.org/libtasn1/libtasn1-2.8-x86.zip") + expect(Version.create("2.8")) + .to be_detected_from("http://ftpmirror.gnu.org/libtasn1/libtasn1-2.8-x64.zip") + expect(Version.create("4.0.18")) + .to be_detected_from("http://ftpmirror.gnu.org/mtools/mtools_4.0.18_i386.deb") + end + + specify "opam version" do + expect(Version.create("2.18.3")) + .to be_detected_from("https://opam.ocaml.org/archives/lablgtk.2.18.3+opam.tar.gz") + expect(Version.create("1.9")) + .to be_detected_from("https://opam.ocaml.org/archives/sha.1.9+opam.tar.gz") + expect(Version.create("0.99.2")) + .to be_detected_from("https://opam.ocaml.org/archives/ppx_tools.0.99.2+opam.tar.gz") + expect(Version.create("1.0.2")) + .to be_detected_from("https://opam.ocaml.org/archives/easy-format.1.0.2+opam.tar.gz") + end + + specify "no extension version" do + expect(Version.create("1.8.12")) + .to be_detected_from("https://waf.io/waf-1.8.12") + expect(Version.create("0.7.1")) + .to be_detected_from("https://codeload.github.com/gsamokovarov/jump/tar.gz/v0.7.1") + expect(Version.create("0.9.1234")) + .to be_detected_from("https://my.datomic.com/downloads/free/0.9.1234") + expect(Version.create("0.9")) + .to be_detected_from("https://my.datomic.com/downloads/free/0.9.1t34") + expect(Version.create("1.2.3")) + .to be_detected_from("https://my.datomic.com/downloads/free/1.2.3") + end + + specify "dash separated version" do + expect(Version.create("6-20151227")) + .to be_detected_from("ftp://gcc.gnu.org/pub/gcc/snapshots/6-20151227/gcc-6-20151227.tar.bz2") + end + + specify "from URL" do + expect(Version.create("1.2.3")) + .to be_detected_from("http://github.com/foo/bar.git", tag: "v1.2.3") + end + end +end + +describe Pathname do + specify "#version" do + d = HOMEBREW_CELLAR/"foo-0.1.9" + d.mkpath + expect(d.version).to eq(Version.create("0.1.9")) + end +end diff --git a/Library/Homebrew/test/versions_test.rb b/Library/Homebrew/test/versions_test.rb deleted file mode 100644 index b6814b1d1..000000000 --- a/Library/Homebrew/test/versions_test.rb +++ /dev/null @@ -1,528 +0,0 @@ -require "testing_env" -require "version" - -class VersionTests < Homebrew::TestCase - def test_accepts_objects_responding_to_to_str - value = stub(to_str: "0.1") - assert_equal "0.1", Version.create(value).to_s - end - - def test_raises_for_non_string_objects - assert_raises(TypeError) { Version.create(1.1) } - assert_raises(TypeError) { Version.create(1) } - assert_raises(TypeError) { Version.create(:symbol) } - end - - def test_detected_from_url? - refute Version.create("1.0").detected_from_url? - assert Version::FromURL.new("1.0").detected_from_url? - end -end - -class VersionTokenTests < Homebrew::TestCase - def test_inspect - assert_equal '#<Version::Token "foo">', - Version::Token.new("foo").inspect - end - - def test_to_s - assert_equal "foo", Version::Token.new("foo").to_s - end -end - -class NullVersionTests < Homebrew::TestCase - def test_null_version_is_always_smaller - assert_operator Version::NULL, :<, version("1") - end - - def test_null_version_is_never_greater - refute_operator Version::NULL, :>, version("0") - end - - def test_null_version_is_not_equal_to_itself - refute_eql Version::NULL, Version::NULL - end - - def test_null_version_creates_an_empty_string - assert_eql "", Version::NULL.to_s - end - - def test_null_version_produces_nan_as_a_float - # Float::NAN is not equal to itself so compare object IDs - assert_eql Float::NAN.object_id, Version::NULL.to_f.object_id - end -end - -class VersionNullTokenTests < Homebrew::TestCase - def test_inspect - assert_equal "#<Version::NullToken>", Version::NullToken.new.inspect - end - - def test_comparing_null - assert_operator Version::NullToken.new, :==, Version::NullToken.new - end -end - -class VersionComparisonTests < Homebrew::TestCase - def test_comparing_regular_versions - assert_operator version("0.1"), :==, version("0.1.0") - assert_operator version("0.1"), :<, version("0.2") - assert_operator version("1.2.3"), :>, version("1.2.2") - assert_operator version("1.2.4"), :<, version("1.2.4.1") - - assert_operator version("1.2.3"), :>, version("1.2.3alpha4") - assert_operator version("1.2.3"), :>, version("1.2.3beta2") - assert_operator version("1.2.3"), :>, version("1.2.3rc3") - assert_operator version("1.2.3"), :<, version("1.2.3-p34") - end - - def test_head - assert_operator version("HEAD"), :>, version("1.2.3") - assert_operator version("HEAD-abcdef"), :>, version("1.2.3") - assert_operator version("1.2.3"), :<, version("HEAD") - assert_operator version("1.2.3"), :<, version("HEAD-fedcba") - assert_operator version("HEAD-abcdef"), :==, version("HEAD-fedcba") - assert_operator version("HEAD"), :==, version("HEAD-fedcba") - end - - def test_comparing_alpha_versions - assert_operator version("1.2.3alpha"), :<, version("1.2.3") - assert_operator version("1.2.3"), :<, version("1.2.3a") - assert_operator version("1.2.3alpha4"), :==, version("1.2.3a4") - assert_operator version("1.2.3alpha4"), :==, version("1.2.3A4") - assert_operator version("1.2.3alpha4"), :>, version("1.2.3alpha3") - assert_operator version("1.2.3alpha4"), :<, version("1.2.3alpha5") - assert_operator version("1.2.3alpha4"), :<, version("1.2.3alpha10") - - assert_operator version("1.2.3alpha4"), :<, version("1.2.3beta2") - assert_operator version("1.2.3alpha4"), :<, version("1.2.3rc3") - assert_operator version("1.2.3alpha4"), :<, version("1.2.3") - assert_operator version("1.2.3alpha4"), :<, version("1.2.3-p34") - end - - def test_comparing_beta_versions - assert_operator version("1.2.3beta2"), :==, version("1.2.3b2") - assert_operator version("1.2.3beta2"), :==, version("1.2.3B2") - assert_operator version("1.2.3beta2"), :>, version("1.2.3beta1") - assert_operator version("1.2.3beta2"), :<, version("1.2.3beta3") - assert_operator version("1.2.3beta2"), :<, version("1.2.3beta10") - - assert_operator version("1.2.3beta2"), :>, version("1.2.3alpha4") - assert_operator version("1.2.3beta2"), :<, version("1.2.3rc3") - assert_operator version("1.2.3beta2"), :<, version("1.2.3") - assert_operator version("1.2.3beta2"), :<, version("1.2.3-p34") - end - - def test_comparing_rc_versions - assert_operator version("1.2.3rc3"), :==, version("1.2.3RC3") - assert_operator version("1.2.3rc3"), :>, version("1.2.3rc2") - assert_operator version("1.2.3rc3"), :<, version("1.2.3rc4") - assert_operator version("1.2.3rc3"), :<, version("1.2.3rc10") - - assert_operator version("1.2.3rc3"), :>, version("1.2.3alpha4") - assert_operator version("1.2.3rc3"), :>, version("1.2.3beta2") - assert_operator version("1.2.3rc3"), :<, version("1.2.3") - assert_operator version("1.2.3rc3"), :<, version("1.2.3-p34") - end - - def test_comparing_patchlevel_versions - assert_operator version("1.2.3-p34"), :==, version("1.2.3-P34") - assert_operator version("1.2.3-p34"), :>, version("1.2.3-p33") - assert_operator version("1.2.3-p34"), :<, version("1.2.3-p35") - assert_operator version("1.2.3-p34"), :>, version("1.2.3-p9") - - assert_operator version("1.2.3-p34"), :>, version("1.2.3alpha4") - assert_operator version("1.2.3-p34"), :>, version("1.2.3beta2") - assert_operator version("1.2.3-p34"), :>, version("1.2.3rc3") - assert_operator version("1.2.3-p34"), :>, version("1.2.3") - end - - def test_comparing_unevenly_padded_versions - assert_operator version("2.1.0-p194"), :<, version("2.1-p195") - assert_operator version("2.1-p195"), :>, version("2.1.0-p194") - assert_operator version("2.1-p194"), :<, version("2.1.0-p195") - assert_operator version("2.1.0-p195"), :>, version("2.1-p194") - assert_operator version("2-p194"), :<, version("2.1-p195") - end - - def test_comparing_against_nil - assert_operator version("2.1.0-p194"), :>, nil - end - - def test_comparing_against_strings - assert_operator version("2.1.0-p194"), :==, "2.1.0-p194" - assert_operator version("1"), :==, 1 - end - - def test_comparison_returns_nil_for_non_version - v = version("1.0") - assert_nil v <=> Object.new - assert_raises(ArgumentError) { v > Object.new } - end - - def test_erlang_version - versions = %w[R16B R15B03-1 R15B03 R15B02 R15B01 R14B04 R14B03 - R14B02 R14B01 R14B R13B04 R13B03 R13B02-1].reverse - assert_equal versions, versions.sort_by { |v| version(v) } - end - - def test_hash_equality - v1 = version("0.1.0") - v2 = version("0.1.0") - v3 = version("0.1.1") - - assert_eql v1, v2 - refute_eql v1, v3 - assert_equal v1.hash, v2.hash - - h = { v1 => :foo } - assert_equal :foo, h[v2] - end -end - -class VersionParsingTests < Homebrew::TestCase - def test_pathname_version - d = HOMEBREW_CELLAR/"foo-0.1.9" - d.mkpath - assert_equal version("0.1.9"), d.version - end - - def test_no_version - assert_version_nil "http://example.com/blah.tar" - assert_version_nil "foo" - end - - def test_create - v = Version.create("1.20") - refute_predicate v, :head? - assert_equal "1.20", v.to_str - end - - def test_version_all_dots - assert_version_detected "1.14", "http://example.com/foo.bar.la.1.14.zip" - end - - def test_version_underscore_separator - assert_version_detected "1.1", "http://example.com/grc_1.1.tar.gz" - end - - def test_boost_version_style - assert_version_detected "1.39.0", "http://example.com/boost_1_39_0.tar.bz2" - end - - def test_erlang_version_style - assert_version_detected "R13B", "http://erlang.org/download/otp_src_R13B.tar.gz" - end - - def test_another_erlang_version_style - assert_version_detected "R15B01", "https://github.com/erlang/otp/tarball/OTP_R15B01" - end - - def test_yet_another_erlang_version_style - assert_version_detected "R15B03-1", "https://github.com/erlang/otp/tarball/OTP_R15B03-1" - end - - def test_p7zip_version_style - assert_version_detected "9.04", - "http://kent.dl.sourceforge.net/sourceforge/p7zip/p7zip_9.04_src_all.tar.bz2" - end - - def test_new_github_style - assert_version_detected "1.1.4", "https://github.com/sam-github/libnet/tarball/libnet-1.1.4" - end - - def test_codeload_style - assert_version_detected "0.7.1", "https://codeload.github.com/gsamokovarov/jump/tar.gz/v0.7.1" - end - - def test_elasticsearch_alpha_style - assert_version_detected "5.0.0-alpha5", "https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/5.0.0-alpha5/elasticsearch-5.0.0-alpha5.tar.gz" - end - - def test_gloox_beta_style - assert_version_detected "1.0-beta7", "http://camaya.net/download/gloox-1.0-beta7.tar.bz2" - end - - def test_sphinx_beta_style - assert_version_detected "1.10-beta", "http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz" - end - - def test_astyle_verson_style - assert_version_detected "1.23", "http://kent.dl.sourceforge.net/sourceforge/astyle/astyle_1.23_macosx.tar.gz" - end - - def test_version_dos2unix - assert_version_detected "3.1", "http://www.sfr-fresh.com/linux/misc/dos2unix-3.1.tar.gz" - end - - def test_version_internal_dash - assert_version_detected "1.1-2", "http://example.com/foo-arse-1.1-2.tar.gz" - end - - def test_version_single_digit - assert_version_detected "45", "http://example.com/foo_bar.45.tar.gz" - end - - def test_noseparator_single_digit - assert_version_detected "45", "http://example.com/foo_bar45.tar.gz" - end - - def test_version_developer_that_hates_us_format - assert_version_detected "1.2.3", "http://example.com/foo-bar-la.1.2.3.tar.gz" - end - - def test_version_regular - assert_version_detected "1.21", "http://example.com/foo_bar-1.21.tar.gz" - end - - def test_version_sourceforge_download - assert_version_detected "1.21", "http://sourceforge.net/foo_bar-1.21.tar.gz/download" - assert_version_detected "1.21", "http://sf.net/foo_bar-1.21.tar.gz/download" - end - - def test_version_github - assert_version_detected "1.0.5", "http://github.com/lloyd/yajl/tarball/1.0.5" - end - - def test_version_github_with_high_patch_number - assert_version_detected "1.2.34", "http://github.com/lloyd/yajl/tarball/v1.2.34" - end - - def test_yet_another_version - assert_version_detected "0.15.1b", "http://example.com/mad-0.15.1b.tar.gz" - end - - def test_lame_version_style - assert_version_detected "398-2", "http://kent.dl.sourceforge.net/sourceforge/lame/lame-398-2.tar.gz" - end - - def test_ruby_version_style - assert_version_detected "1.9.1-p243", "ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz" - end - - def test_omega_version_style - assert_version_detected "0.80.2", "http://www.alcyone.com/binaries/omega/omega-0.80.2-src.tar.gz" - end - - def test_rc_style - assert_version_detected "1.2.2rc1", "http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2" - end - - def test_dash_rc_style - assert_version_detected "1.8.0-rc1", "http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz" - end - - def test_angband_version_style - assert_version_detected "3.0.9b", "http://rephial.org/downloads/3.0/angband-3.0.9b-src.tar.gz" - end - - def test_stable_suffix - assert_version_detected "1.4.14b", "http://www.monkey.org/~provos/libevent-1.4.14b-stable.tar.gz" - end - - def test_debian_style_1 - assert_version_detected "3.03", "http://ftp.de.debian.org/debian/pool/main/s/sl/sl_3.03.orig.tar.gz" - end - - def test_debian_style_2 - assert_version_detected "1.01b", "http://ftp.de.debian.org/debian/pool/main/m/mmv/mmv_1.01b.orig.tar.gz" - end - - def test_bottle_style - assert_version_detected "4.8.0", "https://homebrew.bintray.com/bottles/qt-4.8.0.lion.bottle.tar.gz" - end - - def test_versioned_bottle_style - assert_version_detected "4.8.1", "https://homebrew.bintray.com/bottles/qt-4.8.1.lion.bottle.1.tar.gz" - end - - def test_erlang_bottle_style - assert_version_detected "R15B", "https://homebrew.bintray.com/bottles/erlang-R15B.lion.bottle.tar.gz" - end - - def test_another_erlang_bottle_style - assert_version_detected "R15B01", "https://homebrew.bintray.com/bottles/erlang-R15B01.mountain_lion.bottle.tar.gz" - end - - def test_yet_another_erlang_bottle_style - assert_version_detected "R15B03-1", "https://homebrew.bintray.com/bottles/erlang-R15B03-1.mountainlion.bottle.tar.gz" - end - - def test_imagemagick_style - assert_version_detected "6.7.5-7", "http://downloads.sf.net/project/machomebrew/mirror/ImageMagick-6.7.5-7.tar.bz2" - end - - def test_imagemagick_bottle_style - assert_version_detected "6.7.5-7", "https://homebrew.bintray.com/bottles/imagemagick-6.7.5-7.lion.bottle.tar.gz" - end - - def test_imagemagick_versioned_bottle_style - assert_version_detected "6.7.5-7", "https://homebrew.bintray.com/bottles/imagemagick-6.7.5-7.lion.bottle.1.tar.gz" - end - - def test_dash_version_dash_style - assert_version_detected "3.4", "http://www.antlr.org/download/antlr-3.4-complete.jar" - end - - def test_jenkins_version_style - assert_version_detected "1.486", "http://mirrors.jenkins-ci.org/war/1.486/jenkins.war" - assert_version_detected "0.10.11", "https://github.com/hechoendrupal/DrupalConsole/releases/download/0.10.11/drupal.phar" - end - - def test_apache_version_style - assert_version_detected "1.2.0-rc2", "http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz" - end - - def test_jpeg_style - assert_version_detected "8d", "http://www.ijg.org/files/jpegsrc.v8d.tar.gz" - end - - def test_version_ghc_style - assert_version_detected "7.0.4", "http://www.haskell.org/ghc/dist/7.0.4/ghc-7.0.4-x86_64-apple-darwin.tar.bz2" - assert_version_detected "7.0.4", "http://www.haskell.org/ghc/dist/7.0.4/ghc-7.0.4-i386-apple-darwin.tar.bz2" - end - - def test_pypy_version - assert_version_detected "1.4.1", "http://pypy.org/download/pypy-1.4.1-osx.tar.bz2" - end - - def test_openssl_version - assert_version_detected "0.9.8s", "http://www.openssl.org/source/openssl-0.9.8s.tar.gz" - end - - def test_xaw3d_version - assert_version_detected "1.5E", "ftp://ftp.visi.com/users/hawkeyd/X/Xaw3d-1.5E.tar.gz" - end - - def test_assimp_version - assert_version_detected "2.0.863", "http://downloads.sourceforge.net/project/assimp/assimp-2.0/assimp--2.0.863-sdk.zip" - end - - def test_cmucl_version - assert_version_detected "20c", "http://common-lisp.net/project/cmucl/downloads/release/20c/cmucl-20c-x86-darwin.tar.bz2" - end - - def test_fann_version - assert_version_detected "2.1.0beta", "http://downloads.sourceforge.net/project/fann/fann/2.1.0beta/fann-2.1.0beta.zip" - end - - def test_grads_version - assert_version_detected "2.0.1", "ftp://iges.org/grads/2.0/grads-2.0.1-bin-darwin9.8-intel.tar.gz" - end - - def test_haxe_version - assert_version_detected "2.08", "http://haxe.org/file/haxe-2.08-osx.tar.gz" - end - - def test_imap_version - assert_version_detected "2007f", "ftp://ftp.cac.washington.edu/imap/imap-2007f.tar.gz" - end - - def test_suite3270_version - assert_version_detected "3.3.12ga7", "http://downloads.sourceforge.net/project/x3270/x3270/3.3.12ga7/suite3270-3.3.12ga7-src.tgz" - end - - def test_wwwoffle_version - assert_version_detected "2.9h", "http://www.gedanken.demon.co.uk/download-wwwoffle/wwwoffle-2.9h.tgz" - end - - def test_synergy_version - assert_version_detected "1.3.6p2", "http://synergy.googlecode.com/files/synergy-1.3.6p2-MacOSX-Universal.zip" - end - - def test_fontforge_version - assert_version_detected "20120731", "http://downloads.sourceforge.net/project/fontforge/fontforge-source/fontforge_full-20120731-b.tar.bz2" - end - - def test_ezlupdate_version - assert_version_detected "2011.10", "https://github.com/downloads/ezsystems/ezpublish-legacy/ezpublish_community_project-2011.10-with_ezc.tar.bz2" - end - - def test_aespipe_version_style - assert_version_detected "2.4c", - "http://loop-aes.sourceforge.net/aespipe/aespipe-v2.4c.tar.bz2" - end - - def test_win_style - assert_version_detected "0.9.17", - "http://ftpmirror.gnu.org/libmicrohttpd/libmicrohttpd-0.9.17-w32.zip" - assert_version_detected "1.29", - "http://ftpmirror.gnu.org/libidn/libidn-1.29-win64.zip" - end - - def test_with_arch - assert_version_detected "4.0.18-1", - "http://ftpmirror.gnu.org/mtools/mtools-4.0.18-1.i686.rpm" - assert_version_detected "5.5.7-5", - "http://ftpmirror.gnu.org/autogen/autogen-5.5.7-5.i386.rpm" - assert_version_detected "2.8", - "http://ftpmirror.gnu.org/libtasn1/libtasn1-2.8-x86.zip" - assert_version_detected "2.8", - "http://ftpmirror.gnu.org/libtasn1/libtasn1-2.8-x64.zip" - assert_version_detected "4.0.18", - "http://ftpmirror.gnu.org/mtools/mtools_4.0.18_i386.deb" - end - - def test_opam_version - assert_version_detected "2.18.3", - "https://opam.ocaml.org/archives/lablgtk.2.18.3+opam.tar.gz" - assert_version_detected "1.9", - "https://opam.ocaml.org/archives/sha.1.9+opam.tar.gz" - assert_version_detected "0.99.2", - "https://opam.ocaml.org/archives/ppx_tools.0.99.2+opam.tar.gz" - assert_version_detected "1.0.2", - "https://opam.ocaml.org/archives/easy-format.1.0.2+opam.tar.gz" - end - - def test_no_extension_version - assert_version_detected "1.8.12", "https://waf.io/waf-1.8.12" - assert_version_detected "0.7.1", "https://codeload.github.com/gsamokovarov/jump/tar.gz/v0.7.1" - assert_version_detected "0.9.1234", "https://my.datomic.com/downloads/free/0.9.1234" - assert_version_detected "0.9", "https://my.datomic.com/downloads/free/0.9.1t34" - assert_version_detected "1.2.3", "https://my.datomic.com/downloads/free/1.2.3" - end - - def test_dash_separated_version - assert_version_detected "6-20151227", "ftp://gcc.gnu.org/pub/gcc/snapshots/6-20151227/gcc-6-20151227.tar.bz2" - end - - def test_from_url - assert_version_detected "1.2.3", - "http://github.com/foo/bar.git", tag: "v1.2.3" - end -end - -class HeadVersionTests < Homebrew::TestCase - def test_create_head - v1 = Version.create("HEAD-abcdef") - v2 = Version.create("HEAD") - - assert_predicate v1, :head? - assert_predicate v2, :head? - end - - def test_commit_assigned - v = Version.create("HEAD-abcdef") - assert_equal "abcdef", v.commit - assert_equal "HEAD-abcdef", v.to_str - end - - def test_no_commit - v = Version.create("HEAD") - assert_nil v.commit - assert_equal "HEAD", v.to_str - end - - def test_update_commit - v1 = Version.create("HEAD-abcdef") - v2 = Version.create("HEAD") - - v1.update_commit("ffffff") - assert_equal "ffffff", v1.commit - assert_equal "HEAD-ffffff", v1.to_str - - v2.update_commit("ffffff") - assert_equal "ffffff", v2.commit - assert_equal "HEAD-ffffff", v2.to_str - end -end |
