Мила обнови решението на 17.11.2016 22:31 (преди над 8 години)
+RSpec.describe 'Version' do
+ describe '#initialize' do
+ it 'makes instance by given string' do
+ new_version = Version.new('1.2.3')
+
+ expect(new_version).to be_an_instance_of(Version)
Този тест кога може да се счупи?
+ end
+
+ it 'makes instance by empty string' do
+ new_version = Version.new('')
+
+ expect(new_version).to be_an_instance_of(Version)
+ end
+
+ it 'makes instance with no argument' do
+ new_version = Version.new
+
+ expect(new_version).to be_an_instance_of(Version)
+ end
+
+ it 'makes instance by given another instance' do
+ old_version = Version.new('1.2')
+ new_version = Version.new(old_version)
+
+ expect(new_version).to be_an_instance_of(Version)
+ end
+ context 'when is given invalid argument' do
+ it 'raises ArgumentError when the argument starts with a dot' do
+ expect { Version.new('.2.3') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '.2.3'"
+ )
+ end
+
+ it 'raises ArgumentError when argument ends with a dot' do
+ expect { Version.new('1.3.') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '1.3.'"
+ )
+ end
+
+ it 'raises ArgumentError when argument contains two consecutive dots' do
+ expect { Version.new('1..3') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '1..3'"
+ )
+ end
+
+ it 'raises ArgumentError when argument has negative number' do
+ expect { Version.new('1.-2.1') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '1.-2.1'"
+ )
+ end
+ end
+ end
+
+ describe 'comparing two versions' do
+ it 'compres equal versions' do
+ first_version = Version.new('1.2.3')
+ second_version = Version.new('1.2.3')
+
+ expect(first_version > second_version).to eq(false)
Виж matcher-ите от лекцията в понеделник и използвай нещо по-подходящо тук.
+ expect(first_version < second_version).to eq(false)
+ expect(first_version >= second_version).to eq(true)
+ expect(first_version <= second_version).to eq(true)
+ expect(first_version == second_version).to eq(true)
+ expect(first_version <=> second_version).to eq(0)
+ end
+
+ it 'compres versions when one is ending with zeros' do
+ first_version = Version.new('1.2')
+ second_version = Version.new('1.2.0.0')
+
+ expect(first_version > second_version).to eq(false)
+ expect(first_version < second_version).to eq(false)
+ expect(first_version >= second_version).to eq(true)
+ expect(first_version <= second_version).to eq(true)
+ expect(first_version == second_version).to eq(true)
+ expect(first_version <=> second_version).to eq(0)
+ end
+
+ it 'compres from left to right' do
+ first_version = Version.new('1.2.3')
+ second_version = Version.new('1.3.1')
+
+ expect(first_version > second_version).to eq(false)
+ expect(first_version < second_version).to eq(true)
+ expect(first_version >= second_version).to eq(false)
+ expect(first_version <= second_version).to eq(true)
+ expect(first_version == second_version).to eq(false)
+ expect(first_version <=> second_version).to eq(-1)
+ end
+
+ it 'compres versions with different length' do
+ first_version = Version.new('1.2.3.4')
+ second_version = Version.new('1.3')
+
+ expect(first_version > second_version).to eq(false)
+ expect(first_version < second_version).to eq(true)
+ expect(first_version >= second_version).to eq(false)
+ expect(first_version <= second_version).to eq(true)
+ expect(first_version == second_version).to eq(false)
+ expect(first_version <=> second_version).to eq(-1)
+ end
+
+ it 'zero version is the smallest version' do
+ first_version = Version.new('0.0.1')
+ second_version = Version.new('')
+
+ expect(first_version > second_version).to eq(true)
+ expect(first_version < second_version).to eq(false)
+ expect(first_version >= second_version).to eq(true)
+ expect(first_version <= second_version).to eq(false)
+ expect(first_version == second_version).to eq(false)
+ expect(first_version <=> second_version).to eq(1)
+ end
+ end
+
+ describe '#to_s' do
+ it 'converts simple version to string' do
+ expect(Version.new('1.0.1').to_s).to eq('1.0.1')
+ end
+
+ it 'converts version ending with zeros' do
+ expect(Version.new('1.0.0').to_s).to eq('1')
+ end
+
+ it 'converts empty version to empty string' do
+ expect(Version.new('').to_s).to eq('')
+ end
+
+ it 'converts version with zeros to empty string' do
+ expect(Version.new('0.0').to_s).to eq('')
+ end
+ end
+
+ describe '#components' do
+ it 'returns array of the components of version' do
+ expect(Version.new('1.3.15.6').components).to match_array([1, 3, 15, 6])
Каква е разликата между eq
и match_array
?
+ end
+
+ it 'returns array of the components of version ending with zeros' do
+ expect(Version.new('1.3.0.0').components).to match_array([1, 3])
+ end
+
+ it 'returns array of the components of version containing zeros' do
+ expect(Version.new('1.0.1').components).to match_array([1, 0, 1])
+ end
+
+ it 'returns array of the components of version starting with zeros' do
+ expect(Version.new('0.0.1').components).to match_array([0, 0, 1])
+ end
+
+ it 'returns hole array of components when given argument' do
+ expect(Version.new('1.3.5').components(3)).to match_array([1, 3, 5])
+ end
+
+ it 'returns part of the array of components when given argument' do
+ expect(Version.new('1.3.5.6').components(2)).to match_array([1, 3])
+ end
+
+ it 'returns array of components filled with zeros in the blank places' do
+ expect(Version.new('1.3').components(4)).to match_array([1, 3, 0, 0])
+ end
+
+ it 'does not modify the version when getting superversion' do
+ version = Version.new('1.2.3')
+ version.components(2)
+
+ expect(version).to eq(Version.new('1.2.3'))
+ end
+
+ it 'does not modify the version when getting subversion' do
+ new_version = Version.new('1.2.3')
+ new_version.components(5)
+
+ expect(new_version).to eq(Version.new('1.2.3'))
Това е очевидно, че няма да промени нищо. Махни .dup
от имплементацията и се опитай да се сетиш как може да се промени версията отвън ако го няма. После го направи на тест.
+ end
+ end
+
+ describe 'Range#include?' do
+ it 'returns true for version in range of instances' do
+ range = Version::Range.new(Version.new('1'), Version.new('2'))
+
+ expect((range.include? Version.new('1.5'))).to eq(true)
Моля те, оправи си скобите. Това не е Haskell или Scheme.
+ end
+
+ it 'returns false for version in range of instances' do
+ range = Version::Range.new(Version.new('1'), Version.new('2'))
+
+ expect((range.include? Version.new('2'))).to eq(false)
+ end
+
+ it 'returns true for string in range of instances' do
+ range = Version::Range.new(Version.new('1'), Version.new('2'))
+
+ expect((range.include? '1.5')).to eq(true)
+ end
+
+ it 'returns false for string not in range of instances' do
+ range = Version::Range.new(Version.new('1'), Version.new('2'))
+
+ expect((range.include? '2.5')).to eq(false)
+ end
+
+ it 'returns true for string in range of strings' do
+ expect((Version::Range.new('1', '2').include? '1.2')).to eq(true)
+ end
+
+ it 'returns false for string not in range of strings' do
+ expect((Version::Range.new('1', '2').include? '2.2')).to eq(false)
+ end
+
+ it 'returns true for instance in range of strings' do
+ range = Version::Range.new('1', '2')
+ expect((range.include? Version.new('1.2'))).to eq(true)
+ end
+
+ it 'returns false for instance in range of strings' do
+ range = Version::Range.new('1', '2')
+ expect((range.include? Version.new('2.2'))).to eq(false)
+ end
+
+ it 'returns true for big version in range' do
+ range = Version::Range.new('1', '2')
+ expect((range.include? Version.new('1.20'))).to eq(true)
+ end
+ end
+
+ describe 'Range#to_a' do
+ it 'generates the corret array when versions have 3 components' do
+ range = Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2'))
+ output = [
+ '1.1', '1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5', '1.1.6', '1.1.7',
+ '1.1.8', '1.1.9', '1.2', '1.2.1'
+ ]
+
+ expect(range.to_a).to eq(output)
+ end
+
+ it 'generates the corret array when versions have 2 components' do
+ range = Version::Range.new(Version.new('1.1'), Version.new('1.2'))
+ output = [
+ '1.1', '1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5', '1.1.6',
+ '1.1.7', '1.1.8', '1.1.9'
+ ]
+
+ expect(range.to_a).to eq(output)
+ end
+
+ it 'generates the corret array when versions have 1 components' do
+ range = Version::Range.new(Version.new('1'), Version.new('1.2'))
+ output = [
+ '1', '1.0.1', '1.0.2', '1.0.3', '1.0.4', '1.0.5', '1.0.6', '1.0.7',
+ '1.0.8', '1.0.9', '1.1', '1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5',
+ '1.1.6', '1.1.7', '1.1.8', '1.1.9'
+ ]
+
+ expect(range.to_a).to eq(output)
+ end
+ end
+end