brew/Library/Homebrew/test/cask/dsl/version_spec.rb

369 lines
9.9 KiB
Ruby

# frozen_string_literal: true
RSpec.describe Cask::DSL::Version, :cask do
shared_examples "expectations hash" do |input_name, expectations|
expectations.each do |input_value, expected_output|
context "when #{input_name} is #{input_value.inspect}" do
let(input_name.to_sym) { input_value }
it { is_expected.to eq expected_output }
end
end
end
shared_examples "version equality" do
let(:raw_version) { "1.2.3" }
context "when other is nil" do
let(:other) { nil }
it { is_expected.to be false }
end
context "when other is a String" do
context "when other == self.raw_version" do
let(:other) { "1.2.3" }
it { is_expected.to be true }
end
context "when other != self.raw_version" do
let(:other) { "1.2.3.4" }
it { is_expected.to be false }
end
end
context "when other is a #{described_class}" do
context "when other.raw_version == self.raw_version" do
let(:other) { described_class.new("1.2.3") }
it { is_expected.to be true }
end
context "when other.raw_version != self.raw_version" do
let(:other) { described_class.new("1.2.3.4") }
it { is_expected.to be false }
end
end
end
let(:version) { described_class.new(raw_version) }
describe "#initialize" do
it "raises an error when the version contains a slash" do
expect do
described_class.new("0.1,../../directory/traversal")
end.to raise_error(TypeError, %r{invalid characters: /})
end
end
describe "#==" do
subject { version == other }
include_examples "version equality"
end
describe "#eql?" do
subject { version.eql?(other) }
include_examples "version equality"
end
shared_examples "version expectations hash" do |method, hash|
subject { version.send(method) }
include_examples "expectations hash", :raw_version,
{ :latest => "latest",
"latest" => "latest",
"" => "",
nil => "" }.merge(hash)
end
describe "#latest?" do
include_examples "version expectations hash", :latest?,
:latest => true,
"latest" => true,
"" => false,
nil => false,
"1.2.3" => false
end
describe "string manipulation helpers" do
describe "#major" do
include_examples "version expectations hash", :major,
"1" => "1",
"1.2" => "1",
"1.2.3" => "1",
"1.2.3-4,5:6" => "1"
end
describe "#minor" do
include_examples "version expectations hash", :minor,
"1" => "",
"1.2" => "2",
"1.2.3" => "2",
"1.2.3-4,5:6" => "2"
end
describe "#patch" do
include_examples "version expectations hash", :patch,
"1" => "",
"1.2" => "",
"1.2.3" => "3",
"1.2.3-4,5:6" => "3-4"
end
describe "#major_minor" do
include_examples "version expectations hash", :major_minor,
"1" => "1",
"1.2" => "1.2",
"1.2.3" => "1.2",
"1.2.3-4,5:6" => "1.2"
end
describe "#major_minor_patch" do
include_examples "version expectations hash", :major_minor_patch,
"1" => "1",
"1.2" => "1.2",
"1.2.3" => "1.2.3",
"1.2.3-4,5:6" => "1.2.3-4"
end
describe "#minor_patch" do
include_examples "version expectations hash", :minor_patch,
"1" => "",
"1.2" => "2",
"1.2.3" => "2.3",
"1.2.3-4,5:6" => "2.3-4"
end
describe "#csv" do
subject { version.csv }
include_examples "expectations hash", :raw_version,
:latest => ["latest"],
"latest" => ["latest"],
"" => [],
nil => [],
"1.2.3" => ["1.2.3"],
"1.2.3," => ["1.2.3"],
",abc" => ["", "abc"],
"1.2.3,abc" => ["1.2.3", "abc"]
end
describe "#before_comma" do
include_examples "version expectations hash", :before_comma,
"1.2.3" => "1.2.3",
"1.2.3," => "1.2.3",
",abc" => "",
"1.2.3,abc" => "1.2.3"
end
describe "#after_comma" do
include_examples "version expectations hash", :after_comma,
"1.2.3" => "",
"1.2.3," => "",
",abc" => "abc",
"1.2.3,abc" => "abc"
end
describe "#dots_to_hyphens" do
include_examples "version expectations hash", :dots_to_hyphens,
"1.2.3_4-5" => "1-2-3_4-5"
end
describe "#dots_to_underscores" do
include_examples "version expectations hash", :dots_to_underscores,
"1.2.3_4-5" => "1_2_3_4-5"
end
describe "#hyphens_to_dots" do
include_examples "version expectations hash", :hyphens_to_dots,
"1.2.3_4-5" => "1.2.3_4.5"
end
describe "#hyphens_to_underscores" do
include_examples "version expectations hash", :hyphens_to_underscores,
"1.2.3_4-5" => "1.2.3_4_5"
end
describe "#underscores_to_dots" do
include_examples "version expectations hash", :underscores_to_dots,
"1.2.3_4-5" => "1.2.3.4-5"
end
describe "#underscores_to_hyphens" do
include_examples "version expectations hash", :underscores_to_hyphens,
"1.2.3_4-5" => "1.2.3-4-5"
end
describe "#no_dots" do
include_examples "version expectations hash", :no_dots,
"1.2.3_4-5" => "123_4-5"
end
describe "#no_hyphens" do
include_examples "version expectations hash", :no_hyphens,
"1.2.3_4-5" => "1.2.3_45"
end
describe "#no_underscores" do
include_examples "version expectations hash", :no_underscores,
"1.2.3_4-5" => "1.2.34-5"
end
describe "#no_dividers" do
include_examples "version expectations hash", :no_dividers,
"1.2.3_4-5" => "12345"
end
end
describe "#unstable?" do
[
"0.0.11-beta.7",
"0.0.23b-alpha",
"0.1-beta",
"0.1.0-beta.6",
"0.10.0b",
"0.2.0-alpha",
"0.2.0-beta",
"0.2.4-beta.9",
"0.2.588-dev",
"0.3-beta",
"0.3.0-SNAPSHOT-624369f",
"0.4.1-alpha",
"0.4.9-alpha",
"0.5.3,beta",
"0.6-alpha1,a",
"0.7.1b2",
"0.7a19",
"0.8.0b8",
"0.8b3",
"0.9.10-alpha",
"0.9.3b",
"08b2",
"1.0-b9",
"1.0-beta",
"1.0-beta-7.0",
"1.0-beta.3",
"1.0.0-alpha.5",
"1.0.0-alpha5",
"1.0.0-beta-2.2,20160421",
"1.0.0-beta.16",
"1.0.0-rc",
"1.0.6b1",
"1.0.beta-43",
"1.004,alpha",
"1.0b10",
"1.0b12",
"1.1-alpha-20181201a",
"1.1.16-beta-rc2",
"1.1.58.BETA",
"1.10.1,b87:8941241e",
"1.13.0-beta.7",
"1.13beta8",
"1.15.0.b20190302001",
"1.16.2-Beta",
"1.1b23",
"1.2.0,b200",
"1.2.1pre1",
"1.2.2-beta.2845",
"1.20.0-beta.3",
"1.2b24",
"1.3.0,b102",
"1.3.7a",
"1.36.0-beta0",
"1.4.3a",
"1.6.0_65-b14-468",
"1.6.4-beta0-4e46f007",
"1.7,b566",
"1.7b5",
"1.9.3a",
"1.9.3b8",
"17.03.1-beta",
"18.0-Leia_rc4",
"18.2-rc-3",
"1875Beta",
"19.3.2,b4188-155116",
"2.0-rc.22",
"2.0.0-beta.2",
"2.0.0-beta14",
"2.0.0-dev.11,1902221558.a6b3c4a8",
"2.0.12,b1807-50472cde",
"2.0b",
"2.0b2",
"2.0b3-2020",
"2.0b5",
"2.1.1-dev.3",
"2.12.12beta3",
"2.12b1",
"2.2-Beta",
"2.2.0-RC1",
"2.2b2",
"2.3.0-beta1u1",
"2.3.1,rc4",
"2.3b19",
"2.4.0-beta2",
"2.4.6-beta3u2",
"2.6.1-dev_2019-02-09_14-04_git-master-c1f194a",
"2.7.4a1",
"2.79b",
"2.99pre5",
"2019.1-Beta2",
"2019.1-b112",
"2019.1-beta1",
"2019a",
"26.1-rc1-1",
"3.0.0-beta.5",
"3.0.0-beta19",
"3.0.0-canary.8",
"3.0.0-preview-27122-01",
"3.0.0-rc.14",
"3.0.1-beta.19",
"3.0.100-preview-010184",
"3.0.6a",
"3.00b5",
"3.1.0-beta.1",
"3.1.0_b15007",
"3.2.8beta1",
"3.21-beta",
"3.7.9beta03,5210",
"3b19",
"4.0.0a",
"4.2.0-preview",
"4.3-beta5",
"4.3b3",
"4.99beta",
"5.0.0-RC7",
"5.5.0-beta-9",
"6.0.0-beta3,20181228T124823",
"6.0.0_BETA3,127054",
"6.1.1b176",
"6.2.0-preview.4",
"6.2.0.0.beta1",
"6.3.9_b16229",
"6.44b",
"7.0.6-7A69",
"7.3.BETA-3",
"8.5a8",
"8u202,b08:1961070e4c9b4e26a04e7f5a083f551e",
].each do |unstable_version|
it "detects #{unstable_version.inspect} as unstable" do
expect(described_class.new(unstable_version)).to be_unstable
end
end
[
"0.20.1,63d9b84e-bbcf-4a00-9427-0bb3f713c769",
"1.5.4,13:53d8a307-a8ae-4f9b-9a59-a1adb8c67012",
"b226",
].each do |stable_version|
it "does not detect #{stable_version.inspect} as unstable" do
expect(described_class.new(stable_version)).not_to be_unstable
end
end
end
end