Skip to content

Instantly share code, notes, and snippets.

@ZaWertun
Created May 10, 2020 11:24
Show Gist options
  • Save ZaWertun/5ff96c43bcf87219bb2344633fe3d136 to your computer and use it in GitHub Desktop.
Save ZaWertun/5ff96c43bcf87219bb2344633fe3d136 to your computer and use it in GitHub Desktop.
require "spec"
class GenericVersion
include Comparable(self)
getter parts : Array(String)
def initialize(parts : Array(String | Int32))
@parts = parts.map{|x| x.to_s}
end
def initialize(*parts)
@parts = parts.to_a.map{|x| x.to_s}
end
def to_s(io : IO)
@parts.join('.', io)
end
def <=>(other : self) : Int32
res = 0
invert = false
parts1 = self.parts
parts2 = other.parts
if parts2.size > parts1.size
parts1, parts2 = parts2, parts1
invert = true
end
parts1.each_with_index do |str1, i|
res = 0
if i > parts2.size - 1
res = 1
else
str2 = parts2[i]
int1 = str1.to_i rescue nil
int2 = str2.to_i rescue nil
if int1 && int2
res = int1 <=> int2
elsif int1 && !int2
res = 1
elsif !int1 && int2
res = -1
else
res = str1 <=> str2
end
end
break unless res == 0
end
res * (invert ? -1 : 1)
end
def self.parse(str : String)
self.new(str.split('.'))
end
end
describe GenericVersion do
describe "<=>" do
it "'' < '1'" do
res = GenericVersion.parse("") <=> GenericVersion.parse("1")
res.should eq -1
end
it "'0' > 'Z'" do
res = GenericVersion.parse("0") <=> GenericVersion.parse("Z")
res.should eq 1
end
it "'1.3' > '1.2'" do
res = GenericVersion.parse("1.3") <=> GenericVersion.parse("1.2")
res.should eq 1
end
it "'1.2' < '1.2.0'" do
res = GenericVersion.parse("1.2") <=> GenericVersion.parse("1.2.0")
res.should eq -1
end
it "'1.05' = '1.5'" do
res = GenericVersion.parse("1.05") <=> GenericVersion.parse("1.5")
res.should eq 0
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment