Красимир обнови решението на 18.11.2016 15:18 (преди над 8 години)
+# rspec solution.rb -r ./version.rb -c -f doc
+describe Version do
+ describe '#initialize' do
+ it 'initializes an object when given empty string' do
+ Version.new("")
+ end
+
+ it 'initializes an object when given no argument' do
+ Version.new
+ end
+
+ it 'initializes an object when given correct version' do
+ Version.new("1.0.0.0.0.0.2.10.23.0.0")
+ end
+
+ it 'initializes an object when given another object of class Version' do
+ test_param = Version.new
+ Version.new(test_param)
+ end
+
+ it 'throws ArgumentError with correct message' do
+ test_param = [1, 0, 5]
+ msg_one = "Invalid version string \'#{test_param}\'"
+ msg_two = 'Invalid version string \'.1.1\''
+ msg_three = 'Invalid version string \'0..3\''
+ expect { Version.new(test_param) }.to raise_error(ArgumentError, msg_one)
+ expect { Version.new(".1.1") }.to raise_error(ArgumentError, msg_two)
+ expect { Version.new("0..3") }.to raise_error(ArgumentError, msg_three)
+ end
+ end
+
+ describe '#<' do
+ bigger = Version.new("1.0.1.6")
+ smaller = Version.new("1.0.0.8")
+ dup_of_smaller = Version.new(smaller)
+
+ it 'returns true when called with <smaller> and <bigger> argument' do
+ expect( smaller < bigger).to be true
+ end
+
+ it 'returns false when called with equal arguments' do
+ expect( smaller < dup_of_smaller ).to be false
+ end
+
+ it 'returns false when called with <bigger> and <smaller> arguments' do
+ expect( bigger < smaller ).to be false
+ end
+ end
+
+ describe '#>' do
+ bigger = Version.new("1.0.1.6")
+ smaller = Version.new("1.0.0.8")
+ dup_of_smaller = Version.new(smaller)
+
+ it 'returns false when called with <smaller> and <bigger> argument' do
+ expect( smaller > bigger).to eq false
+ end
+
+ it 'returns false when called with equal arguments' do
+ expect( smaller > dup_of_smaller ).to eq false
+ end
+
+ it 'returns true when called with <bigger> and <smaller> arguments' do
+ expect( bigger > smaller ).to eq true
+ end
+ end
+
+ describe '#>=' do
+ bigger = Version.new("1.0.1.6")
+ smaller = Version.new("1.0.0.8")
+ dup_of_smaller = Version.new(smaller)
+
+ it 'returns false when called with <smaller> and <bigger> argument' do
+ expect( smaller >= bigger).to eq false
+ end
+
+ it 'returns true when called with equal arguments' do
+ expect( smaller >= dup_of_smaller ).to eq true
+ end
+
+ it 'returns true when called with <bigger> and <smaller> arguments' do
+ expect( bigger >= smaller ).to eq true
+ end
+ end
+
+ describe '#<=>' do
+ bigger = Version.new("1.0.1.6")
+ smaller = Version.new("1.0.0.8")
+ dup_of_smaller = Version.new(smaller)
+
+ it 'returns -1 when called with <smaller> and <bigger> argument' do
+ expect( smaller <=> bigger).to eq -1
+ end
+
+ it 'returns 0 when called with equal arguments' do
+ expect( smaller <=> dup_of_smaller ).to eq 0
+ end
+
+ it 'returns 1 when called with <bigger> and <smaller> arguments' do
+ expect( bigger <=> smaller ).to eq 1
+ end
+ end
+
+ describe '#<=' do
+ bigger = Version.new("1.0.1.6")
+ smaller = Version.new("1.0.0.8")
+ dup_of_smaller = Version.new(smaller)
+
+ it 'returns true when called with <smaller> and <bigger> argument' do
+ expect( smaller <= bigger).to eq true
+ end
+
+ it 'returns true when called with equal arguments' do
+ expect( smaller <= dup_of_smaller ).to eq true
+ end
+
+ it 'returns false when called with <bigger> and <smaller> arguments' do
+ expect( bigger <= smaller ).to eq false
+ end
+ end
+
+ describe '#==' do
+ bigger = Version.new("1.0.1.6")
+ smaller = Version.new("1.0.0.8")
+ dup_of_smaller = Version.new(smaller)
+
+ it 'returns true when called with equal arguments' do
+ expect( smaller == dup_of_smaller ).to eq true
+ end
+
+ it 'returns false when called with <bigger> and <smaller> arguments' do
+ expect( bigger == smaller ).to eq false
+ end
+ end
+
+ describe '#components' do
+ it 'truncates trailing zeroes' do
+ test_obj = Version.new("1.0.0.0.0.0.0.10.0.0.0.0.0.0.0.0.0")
+ expect(test_obj.components).to eq [1, 0, 0, 0, 0, 0, 0, 10]
+ end
+
+ it 'does not change internal state' do
+ test_obj = Version.new("1.0.0.0.0.0.0.10.0.0.0.0.0.0.0.0.0")
+ test_obj.components << 123_123_21
+ expect(test_obj.components).to eq [1, 0, 0, 0, 0, 0, 0, 10]
+ end
+
+ it 'does not change non trailing zeroes components' do
+ test_obj = Version.new('100.51')
+ expect(test_obj.components).to eq [100, 51]
+ end
+
+ it 'returns exactly N components' do
+ test_obj = Version.new('20.30.1.2.0.0.0')
+ expect(test_obj.components(3)).to eq [20, 30, 1]
+ test_obj = Version.new('1.0.1')
+ expect(test_obj.components(5)).to eq [1, 0, 1, 0, 0]
+ end
+ end
+
+ describe "::Range" do
+ describe '#initialize' do
+ it 'constructs an object' do
+ Version::Range.new("0.1.1.0.123", "1.9241.0.0.1.5.3.2")
+ version_obj = Version.new("0.3.1.2")
+ Version::Range.new(version_obj, version_obj)
+ Version::Range.new("125.12.513.1", version_obj)
+ Version::Range.new(version_obj, "12.643.0.532")
+ end
+ end
+
+ describe "#include?" do
+ it 'checks whether version is in between' do
+ # strings:
+ test_obj = Version::Range.new("0.1.2.3.4.5", "0.1.2.3.4.7")
+ expect(test_obj.include?("0.1.2.3.4.6.0.0.1")).to eq true
+ expect(test_obj.include?("0.1.2.3.4.5")).to eq true
+ expect(test_obj.include?("0.1.2.3.5")).to eq false
+ expect(test_obj.include?("0.0.1")).to eq false
+ expect(test_obj.include?("100.1")).to eq false
+ # versions:
+ expect(test_obj.include?(Version.new("0.1.2.3.4.6.0.0.1"))).to eq true
+ expect(test_obj.include?(Version.new("0.1.2.3.4.5"))).to eq true
+ expect(test_obj.include?(Version.new("0.1.2.3.5"))).to eq false
+ expect(test_obj.include?(Version.new("0.0.1"))).to eq false
+ expect(test_obj.include?(Version.new("100.1"))).to eq false
+ end
+ end
+
+ describe "#to_a" do
+ it 'does not return versions which are not inbetween' do
+ test_obj = Version::Range.new("0.0.0", "0.0.0")
+ expect(test_obj.to_a).to eq []
+ end
+
+ it 'returns all versions in between' do
+ test_obj = Version::Range.new("0.0.8", "0.1.1")
+ first = Version.new("0.0.8")
+ middle = Version.new("0.0.9")
+ last = Version.new("0.1.0")
+ expect(test_obj.to_a).to eq [first, middle, last]
+
+ test_obj = Version::Range.new("0.9.9", "1.0.1")
+ first = Version.new("0.9.9")
+ last = Version.new("1.0.0")
+ expect(test_obj.to_a).to eq [first, last]
+ end
+ end
+ end
+end