Решение на Четвърта задача - Unit тестване от Натали Арабаджийска

Обратно към всички решения

Към профила на Натали Арабаджийска

Резултати

  • 5 точки от тестове
  • 0 бонус точки
  • 5 точки общо
  • 16 успешни тест(а)
  • 3 неуспешни тест(а)

Код

RSpec.describe 'Version' do
describe '#Version' do
it 'can raise Error for wrong version' do
expect { Version.new('.2') }.to raise_error(
ArgumentError, "Invalid version string '.2'"
)
expect { Version.new('1..2') }.to raise_error(
ArgumentError, "Invalid version string '1..2'"
)
expect { Version.new('1.2.n') }.to raise_error(
ArgumentError, "Invalid version string '1.2.n'"
)
expect { Version.new('1.2.') }.to raise_error(
ArgumentError, "Invalid version string '1.2.'"
)
expect { Version.new('1.2.$') }.to raise_error(
ArgumentError, "Invalid version string '1.2.$'"
)
end
end
describe '#<=>' do
context 'can check which version is the new one' do
it 'can compare with ==' do
expect(Version.new('1.2.3') == Version.new('1.2.3.0')).to eq(true)
expect(Version.new('1.2.3') == Version.new('1.3.3')).to eq(false)
end
it 'can compare with >' do
expect(Version.new('1.3.1') > Version.new('1.2.3')).to eq(true)
expect(Version.new('1.2.3') > Version.new('1.3.1')).to eq(false)
expect(Version.new('1.4') > Version.new('1.3.1')).to eq(true)
end
it 'can compare with >=' do
expect(Version.new('1.3.1') >= Version.new('1.2.3')).to eq(true)
expect(Version.new('1.2.3') >= Version.new('1.3.1')).to eq(false)
expect(Version.new('1.4') >= Version.new('1.3.1')).to eq(true)
end
it 'can compare with <' do
expect(Version.new('1.2.3') < Version.new('1.3.1')).to eq(true)
expect(Version.new('1.3.1') < Version.new('1.2.3')).to eq(false)
expect(Version.new('1.3.1') < Version.new('1.4')).to eq(true)
end
it 'can compare with <=' do
expect(Version.new('1.2.3') <= Version.new('1.3.1')).to eq(true)
expect(Version.new('1.3.1') <= Version.new('1.2.3')).to eq(false)
expect(Version.new('1.3.1') <= Version.new('1.4')).to eq(true)
end
it 'can compare with <=>' do
expect(Version.new('1.3.1') <=> Version.new('1.2.3')).to eq(1)
expect(Version.new('1.2.3') <=> Version.new('1.2.3.0')).to eq(0)
expect(Version.new('1.2.3') <=> Version.new('1.3.1')).to eq(-1)
end
end
end
describe '#to_s' do
it 'can return the version without the zero components at the end' do
expect(Version.new('1.2.3.0.0').to_s).to eq('1.2.3')
end
it 'can turn the version into a string with empty string parameter' do
expect(Version.new('0')).to eq('')
expect(Version.new('')).to eq('')
end
it 'can turn the version into a string without parameter' do
expect(Version.new).to eq('')
end
end
describe '#components' do
it 'can turn the version into array' do
expect(Version.new('1.2.3').components).to eq([1, 2, 3])
expect(Version.new('1.2.3').components.size).to eq(3)
end
it 'can return the array without zeroes' do
expect(Version.new('1.2.3.0').components).to eq([1, 2, 3])
end
it 'can return the array with the exact number of components' do
expect(Version.new('1.2.3.4').components(2)).to eq([1, 2])
end
it 'can add zeroes at the end of the array' do
expect(Version.new('1.2.3').components(4)).to eq([1, 2, 3, 0])
end
it 'doesnt change the version' do
original_version = Version.new('1.2.3')
version = original_version.to_s
expect(original_version.components(6)).to eq([1, 2, 3, 0, 0, 0])

Тук трябва да направиш още нещо, за да тестваш, че не променя версията. Можеш ли да се сетиш как може да се използва components, за да се промени обекта, ако нямаше dup в кода му?

В този си вид теста е безсмислен - очевидно е, че единствено с извикване на components няма да се промени версията.

expect(original_version.to_s).to eq(version)
end
end
describe '#Range' do
describe '#include?' do
it 'can say if the Version object is in the range of versions' do
range = Version::Range.new(Version.new('1'), Version.new('2'))
expect(range.include?(Version.new('1.2'))).to eq(true)
expect(range.include?(Version.new('2.2'))).to eq(false)
expect(range.include?(Version.new('1'))).to eq(true)
end
it 'can say if the Version object/string is in the range of versions' do
range1 = Version::Range.new(Version.new('1'), '2')
range2 = Version::Range.new('1', Version.new('2'))
range3 = Version::Range.new('1', '2')
expect(range1.include?(Version.new('1.2'))).to eq(true)
expect(range1.include?('1.2')).to eq(true)
expect(range2.include?(Version.new('1.2'))).to eq(true)
expect(range2.include?('1.2')).to eq(true)
expect(range3.include?(Version.new('1.2'))).to eq(true)
expect(range3.include?('1.2')).to eq(true)
end
end
describe '#to_a?' do
it 'contains the first version' do
range = Version::Range.new(Version.new('1.2.3'), Version.new('2.3.4'))
array = range.to_a
expect(array.first).to eq('1.2.3')
end
it 'doesnt contain the last version' do
range = Version::Range.new(Version.new('1.2.3'), Version.new('2.3.4'))
array = range.to_a
expect(array.last).to_not eq('2.3.4')
expect(array.last).to eq('2.3.3')
end
it 'contains all the versions' do
range = Version::Range.new(Version.new('1.2.3'), Version.new('1.3.0'))
array = range.to_a
expect(array[0] < array[1]).to eq(true)
expect(array[1] > array[2]).to eq(false)
expect(Version.new.to_s.length <= 5).to eq(true)
expect(Version.new.to_s.length > 5).to eq(false)
expect(array.size).to eq(7)
expect(array).to eq(
[
'1.2.3', '1.2.4', '1.2.5', '1.2.6', '1.2.7', '1.2.8', '1.2.9'
]
)
end
end
end
end

Лог от изпълнението

..........F.F...F..

Failures:

  1) spec Version tests that #components cannot be used to modify the version
     Failure/Error: expect(@solution).to_not pass_tests
       expected this solution to not pass the tests:
       
         class Version
           VALID_VERSION_REGEXP = /\A\z|\A[0-9]+(\.[0-9]+)*\z/
         
           include Comparable
         
           def initialize(version = '')
             unless VALID_VERSION_REGEXP.match(version.to_s)
               raise ArgumentError, "Invalid version string '#{version}'"
             end
         
             @components = version.to_s
               .split('.')
               .map(&:to_i)
               .reverse
               .drop_while(&:zero?)
               .reverse
           end
         
           def <=>(other)
             @components <=> Version.new(other).internal_components
           end
         
           def internal_components(positions = 0)
             padding_size = positions - @components.size
         
             if padding_size > 0
               @components + [0] * padding_size
             elsif positions != 0
               @components.take(positions)
             else
               @components.dup
             end
           end
         
           def components(positions = 0)
             padding_size = positions - @components.size
           
             if padding_size > 0
               @components + [0] * padding_size
             elsif positions != 0
               @components.take(positions)
             else
               @components
             end
           end
         
           def to_s
             @components.join('.')
           end
         
           class Range
             include Enumerable
         
             def initialize(start_version, end_version)
               @start_version = Version.new(start_version)
               @end_version   = Version.new(end_version)
             end
         
             def include?(version)
               (@start_version <=> version) < 1 && (@end_version <=> version) == 1
             end
         
             def each
               current_version = @start_version
         
               while (current_version <=> @end_version) == -1
                 yield current_version
         
                 current_version = increment_version(current_version)
               end
             end
         
             private
         
             def increment_version(version)
               components = version.internal_components(3)
         
               components[2] += 1
         
               components.to_enum.with_index.reverse_each do |_, index|
                 component = components[index]
         
                 if component >= 10 && components[index - 1]
                   components[index]      = 0
                   components[index - 1] += 1
                 end
               end
         
               Version.new(components.join('.'))
             end
           end
         end
     # /tmp/d20161119-19072-sqey10/spec.rb:456:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  2) spec Version::Range tests constructing ranges with strings
     Failure/Error: expect(@solution).to_not pass_tests
       expected this solution to not pass the tests:
       
         class Version
           VALID_VERSION_REGEXP = /\A\z|\A[0-9]+(\.[0-9]+)*\z/
         
           include Comparable
         
           def initialize(version = '')
             unless VALID_VERSION_REGEXP.match(version.to_s)
               raise ArgumentError, "Invalid version string '#{version}'"
             end
         
             @components = version.to_s
               .split('.')
               .map(&:to_i)
               .reverse
               .drop_while(&:zero?)
               .reverse
           end
         
           def <=>(other)
             @components <=> Version.new(other).internal_components
           end
         
           def internal_components(positions = 0)
             padding_size = positions - @components.size
         
             if padding_size > 0
               @components + [0] * padding_size
             elsif positions != 0
               @components.take(positions)
             else
               @components.dup
             end
           end
         
           def components(positions = 0)
             padding_size = positions - @components.size
         
             if padding_size > 0
               @components + [0] * padding_size
             elsif positions != 0
               @components.take(positions)
             else
               @components.dup
             end
           end
         
           def to_s
             @components.join('.')
           end
         
           class Range
             include Enumerable
         
             def initialize(start_version, end_version)
               @start_version = start_version
               @end_version   = end_version
             end
         
             def include?(version)
               (@start_version <=> version) < 1 && (@end_version <=> version) == 1
             end
         
             def each
               current_version = @start_version
         
               while (current_version <=> @end_version) == -1
                 yield current_version
         
                 current_version = increment_version(current_version)
               end
             end
         
             private
         
             def increment_version(version)
               components = version.internal_components(3)
         
               components[2] += 1
         
               components.to_enum.with_index.reverse_each do |_, index|
                 component = components[index]
         
                 if component >= 10 && components[index - 1]
                   components[index]      = 0
                   components[index - 1] += 1
                 end
               end
         
               Version.new(components.join('.'))
             end
           end
         end
     # /tmp/d20161119-19072-sqey10/spec.rb:479:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

  3) spec Version::Range tests include? with versions lower than the start one
     Failure/Error: expect(@solution).to_not pass_tests
       expected this solution to not pass the tests:
       
         class Version
           VALID_VERSION_REGEXP = /\A\z|\A[0-9]+(\.[0-9]+)*\z/
         
           include Comparable
         
           def initialize(version = '')
             unless VALID_VERSION_REGEXP.match(version.to_s)
               raise ArgumentError, "Invalid version string '#{version}'"
             end
         
             @components = version.to_s
               .split('.')
               .map(&:to_i)
               .reverse
               .drop_while(&:zero?)
               .reverse
           end
         
           def <=>(other)
             @components <=> Version.new(other).internal_components
           end
         
           def internal_components(positions = 0)
             padding_size = positions - @components.size
         
             if padding_size > 0
               @components + [0] * padding_size
             elsif positions != 0
               @components.take(positions)
             else
               @components.dup
             end
           end
         
           def components(positions = 0)
             padding_size = positions - @components.size
         
             if padding_size > 0
               @components + [0] * padding_size
             elsif positions != 0
               @components.take(positions)
             else
               @components.dup
             end
           end
         
           def to_s
             @components.join('.')
           end
         
           class Range
             include Enumerable
         
             def initialize(start_version, end_version)
               @start_version = Version.new(start_version)
               @end_version   = Version.new(end_version)
             end
         
             def include?(version)
               @end_version > version
             end
         
             def each
               current_version = @start_version
         
               while (current_version <=> @end_version) == -1
                 yield current_version
         
                 current_version = increment_version(current_version)
               end
             end
         
             private
         
             def increment_version(version)
               components = version.internal_components(3)
         
               components[2] += 1
         
               components.to_enum.with_index.reverse_each do |_, index|
                 component = components[index]
         
                 if component >= 10 && components[index - 1]
                   components[index]      = 0
                   components[index - 1] += 1
                 end
               end
         
               Version.new(components.join('.'))
             end
           end
         end
     # /tmp/d20161119-19072-sqey10/spec.rb:522:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'

Finished in 18.71 seconds
19 examples, 3 failures

Failed examples:

rspec /tmp/d20161119-19072-sqey10/spec.rb:441 # spec Version tests that #components cannot be used to modify the version
rspec /tmp/d20161119-19072-sqey10/spec.rb:471 # spec Version::Range tests constructing ranges with strings
rspec /tmp/d20161119-19072-sqey10/spec.rb:515 # spec Version::Range tests include? with versions lower than the start one

История (3 версии и 7 коментара)

Натали обнови решението на 16.11.2016 17:47 (преди над 7 години)

+RSpec.describe 'Version' do
+ describe '#Version' do
+ it 'can raise Error for wrong version' do
+ expect { Version.new('.2') }.to raise_error(
+ ArgumentError, "Invalid version string '.2'"
+ )
+ expect { Version.new('1..2') }.to raise_error(
+ ArgumentError, "Invalid version string '1..2'"
+ )
+ expect { Version.new('1.2.n') }.to raise_error(
+ ArgumentError, "Invalid version string '1.2.n'"
+ )
+ expect { Version.new('1.2.') }.to raise_error(
+ ArgumentError, "Invalid version string '1.2.'"
+ )
+ expect { Version.new('1.2.$') }.to raise_error(
+ ArgumentError, "Invalid version string '1.2.$'"
+ )
+ end
+ end
+
+ describe '#<=>' do
+ context 'can check which version is the new one' do
+ it 'can compare with ==' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('1.2.3')
+ version3 = Version.new('1.2.3.0')
+ version4 = Version.new('1.3.3')
+ expect(version1 == version2).to be true
+ expect(version1 == version3).to be true
+ expect(version1 == version4).to be false
+ end
+
+ it 'can compare with >' do
+ version1 = Version.new('1.3.1')
+ version2 = Version.new('1.3.1')
+ version3 = Version.new('1.2.3')
+ version4 = Version.new('1.4')
+ expect(version1 > version3).to be true
+ expect(version3 > version1).to be false
+ expect(version1 > version2).to be false
+ expect(version4 > version1).to be true
+ end
+
+ it 'can compare with >=' do
+ version1 = Version.new('1.3.1')
+ version2 = Version.new('1.3.1')
+ version3 = Version.new('1.2.3')
+ version4 = Version.new('1.4')
+ expect(version1 >= version3).to be true
+ expect(version3 >= version1).to be false
+ expect(version1 >= version2).to be true
+ expect(version4 >= version1).to be true
+ end
+
+ it 'can compare with <' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('1.2.3')
+ version3 = Version.new('1.3.1')
+ version4 = Version.new('1.4')
+ expect(version1 < version3).to be true
+ expect(version3 < version1).to be false
+ expect(version1 < version2).to be false
+ expect(version3 < version4).to be true
+ end
+
+ it 'can compare with <=' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('1.2.3')
+ version3 = Version.new('1.3.1')
+ version4 = Version.new('1.4')
+ expect(version1 <= version3).to be true
+ expect(version3 <= version1).to be false
+ expect(version1 <= version2).to be true
+ expect(version3 <= version4).to be true
+ end
+
+ it 'can compare with <=>' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('1.2.3')
+ version3 = Version.new('1.3.1')
+ expect(version3 <=> version1).to eq(1)
+ expect(version1 <=> version2).to eq(0)
+ expect(version1 <=> version3).to eq(-1)
+ end
+ end
+ end
+
+ describe '#to_s' do
+ it 'can turn the version into a string' do
+ version1 = Version.new('1.2.3')
+ version2 = version1.to_s
+ expect(version1.is_a?(String)).to be false
+ expect(version2.is_a?(String)).to be true
+ end
+
+ it 'can return the version without the zero components at the end' do
+ version1 = Version.new('1.2.3.0.0')
+ expect(version1.to_s).to eq('1.2.3')
+ end
+
+ it 'can turn the version into a string with empty string parameter' do
+ expect(Version.new('0')).to eq('')
+ expect(Version.new('')).to eq('')
+ end
+
+ it 'can turn the version into a string without parameter' do
+ expect(Version.new).to eq('')
+ end
+ end
+
+ describe '#components' do
+ it 'can turn the version into array' do
+ version = Version.new('1.2.3')
+ expect(version.components.to_a.is_a?(Array)).to be true
+ expect(version.components).to eq([1, 2, 3])
+ expect(version.components.size).to eq(3)
+ end
+
+ it 'can return the array without zeroes' do
+ version = Version.new('1.2.3.0')
+ expect(version.components).to eq([1, 2, 3])
+ end
+
+ it 'can return the array with the exact number of components' do
+ version = Version.new('1.2.3.4')
+ expect(version.components(2)).to eq([1, 2])
+ end
+
+ it 'can add zeroes at the end of the array' do
+ version = Version.new('1.2.3')
+ expect(version.components(4)).to eq([1, 2, 3, 0])
+ end
+
+ it 'doesnt change the version' do
+ original_version = Version.new('1.2.3')
+ version = original_version.to_s
+ expect(original_version.components(6)).to eq([1, 2, 3, 0, 0, 0])
+ expect(original_version.to_s).to eq(version)
+ end
+ end
+
+ describe '#Range' do
+ describe '#include?' do
+ it 'can say if the Version object is in the range of versions' do
+ version1 = Version.new('1')
+ version2 = Version.new('2')
+ version3 = Version.new('1.2')
+ version4 = Version.new('2.2')
+ version5 = Version.new('1')
+ range = Version::Range.new(version1, version2)
+ expect(range.include?(version3)).to be true
+ expect(range.include?(version4)).to be false
+ expect(range.include?(version5)).to be true
+ end
+
+ it 'can say if the Version object/string is in the range of versions' do
+ version1 = Version.new('1')
+ version2 = Version.new('2')
+ version3 = Version.new('1.2')
+ range1 = Version::Range.new(version1, '2')
+ range2 = Version::Range.new('1', version2)
+ range3 = Version::Range.new('1', '2')
+ expect(range1.include?(version3)).to be true
+ expect(range1.include?('1.2')).to be true
+ expect(range2.include?(version3)).to be true
+ expect(range2.include?('1.2')).to be true
+ expect(range3.include?(version3)).to be true
+ expect(range3.include?('1.2')).to be true
+ end
+ end
+
+ describe '#to_a?' do
+ it 'contains the first version' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('2.3.4')
+ range = Version::Range.new(version1, version2)
+ array = range.to_a
+ expect(array.first).to eq('1.2.3')
+ end
+
+ it 'doesnt contain the last version' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('2.3.4')
+ range = Version::Range.new(version1, version2)
+ array = range.to_a
+ expect(array.last).to_not eq('2.3.4')
+ expect(array.last).to eq('2.3.3')
+ end
+
+ it 'contains all the versions' do
+ version1 = Version.new('1.2.3')
+ version2 = Version.new('1.3.4')
+ range = Version::Range.new(version1, version2)
+ array = range.to_a
+ expect(array.size).to eq(11)
+ end
+ end
+ end
+end

Натали обнови решението на 16.11.2016 23:44 (преди над 7 години)

RSpec.describe 'Version' do
describe '#Version' do
it 'can raise Error for wrong version' do
expect { Version.new('.2') }.to raise_error(
ArgumentError, "Invalid version string '.2'"
)
expect { Version.new('1..2') }.to raise_error(
ArgumentError, "Invalid version string '1..2'"
)
expect { Version.new('1.2.n') }.to raise_error(
ArgumentError, "Invalid version string '1.2.n'"
)
expect { Version.new('1.2.') }.to raise_error(
ArgumentError, "Invalid version string '1.2.'"
)
expect { Version.new('1.2.$') }.to raise_error(
ArgumentError, "Invalid version string '1.2.$'"
)
end
end
describe '#<=>' do
context 'can check which version is the new one' do
it 'can compare with ==' do
version1 = Version.new('1.2.3')
version2 = Version.new('1.2.3')
version3 = Version.new('1.2.3.0')
version4 = Version.new('1.3.3')

Това изреждане на променливи не ми харесва особено. Сложи ги долу в expect-овете. Ще е по-очевидно какви версии тестваш.

Ако решиш да ги оставиш тук ще трябва да им дадеш по-добри имена от versionN, което не е лека задача.

expect(version1 == version2).to be true
expect(version1 == version3).to be true
expect(version1 == version4).to be false
end
it 'can compare with >' do
version1 = Version.new('1.3.1')
version2 = Version.new('1.3.1')
version3 = Version.new('1.2.3')
version4 = Version.new('1.4')
expect(version1 > version3).to be true
expect(version3 > version1).to be false
expect(version1 > version2).to be false
expect(version4 > version1).to be true
end
it 'can compare with >=' do
version1 = Version.new('1.3.1')
version2 = Version.new('1.3.1')
version3 = Version.new('1.2.3')
version4 = Version.new('1.4')
expect(version1 >= version3).to be true
expect(version3 >= version1).to be false
expect(version1 >= version2).to be true
expect(version4 >= version1).to be true
end
it 'can compare with <' do
version1 = Version.new('1.2.3')
version2 = Version.new('1.2.3')
version3 = Version.new('1.3.1')
version4 = Version.new('1.4')
expect(version1 < version3).to be true
expect(version3 < version1).to be false
expect(version1 < version2).to be false
expect(version3 < version4).to be true
end
it 'can compare with <=' do
version1 = Version.new('1.2.3')
version2 = Version.new('1.2.3')
version3 = Version.new('1.3.1')
version4 = Version.new('1.4')
expect(version1 <= version3).to be true
expect(version3 <= version1).to be false
expect(version1 <= version2).to be true
expect(version3 <= version4).to be true
end
it 'can compare with <=>' do
version1 = Version.new('1.2.3')
version2 = Version.new('1.2.3')
version3 = Version.new('1.3.1')
expect(version3 <=> version1).to eq(1)
expect(version1 <=> version2).to eq(0)
expect(version1 <=> version3).to eq(-1)
end
end
end
describe '#to_s' do
- it 'can turn the version into a string' do
- version1 = Version.new('1.2.3')
- version2 = version1.to_s
- expect(version1.is_a?(String)).to be false
- expect(version2.is_a?(String)).to be true
- end
-
it 'can return the version without the zero components at the end' do
version1 = Version.new('1.2.3.0.0')
expect(version1.to_s).to eq('1.2.3')
end
it 'can turn the version into a string with empty string parameter' do
expect(Version.new('0')).to eq('')
expect(Version.new('')).to eq('')
end
it 'can turn the version into a string without parameter' do
expect(Version.new).to eq('')
end
end
describe '#components' do
it 'can turn the version into array' do
version = Version.new('1.2.3')
- expect(version.components.to_a.is_a?(Array)).to be true
expect(version.components).to eq([1, 2, 3])
expect(version.components.size).to eq(3)
end
it 'can return the array without zeroes' do
version = Version.new('1.2.3.0')
expect(version.components).to eq([1, 2, 3])
end
it 'can return the array with the exact number of components' do
version = Version.new('1.2.3.4')
expect(version.components(2)).to eq([1, 2])
end
it 'can add zeroes at the end of the array' do
version = Version.new('1.2.3')
expect(version.components(4)).to eq([1, 2, 3, 0])
end
it 'doesnt change the version' do
original_version = Version.new('1.2.3')
version = original_version.to_s
expect(original_version.components(6)).to eq([1, 2, 3, 0, 0, 0])

Тук трябва да направиш още нещо, за да тестваш, че не променя версията. Можеш ли да се сетиш как може да се използва components, за да се промени обекта, ако нямаше dup в кода му?

В този си вид теста е безсмислен - очевидно е, че единствено с извикване на components няма да се промени версията.

expect(original_version.to_s).to eq(version)
end
end
describe '#Range' do
describe '#include?' do
it 'can say if the Version object is in the range of versions' do
version1 = Version.new('1')
version2 = Version.new('2')
version3 = Version.new('1.2')
version4 = Version.new('2.2')
version5 = Version.new('1')
range = Version::Range.new(version1, version2)
expect(range.include?(version3)).to be true
expect(range.include?(version4)).to be false
expect(range.include?(version5)).to be true
end
it 'can say if the Version object/string is in the range of versions' do
version1 = Version.new('1')
version2 = Version.new('2')
version3 = Version.new('1.2')
range1 = Version::Range.new(version1, '2')
range2 = Version::Range.new('1', version2)
range3 = Version::Range.new('1', '2')
expect(range1.include?(version3)).to be true
expect(range1.include?('1.2')).to be true
expect(range2.include?(version3)).to be true
expect(range2.include?('1.2')).to be true
expect(range3.include?(version3)).to be true
expect(range3.include?('1.2')).to be true
end
end
describe '#to_a?' do
it 'contains the first version' do
version1 = Version.new('1.2.3')
version2 = Version.new('2.3.4')
range = Version::Range.new(version1, version2)
array = range.to_a
expect(array.first).to eq('1.2.3')
end
it 'doesnt contain the last version' do
version1 = Version.new('1.2.3')
version2 = Version.new('2.3.4')
range = Version::Range.new(version1, version2)
array = range.to_a
expect(array.last).to_not eq('2.3.4')
expect(array.last).to eq('2.3.3')
end
it 'contains all the versions' do
version1 = Version.new('1.2.3')
version2 = Version.new('1.3.4')
range = Version::Range.new(version1, version2)
array = range.to_a
expect(array.size).to eq(11)
end
end
end
end

Натали обнови решението на 18.11.2016 19:13 (преди над 7 години)

RSpec.describe 'Version' do
describe '#Version' do
it 'can raise Error for wrong version' do
expect { Version.new('.2') }.to raise_error(
ArgumentError, "Invalid version string '.2'"
)
expect { Version.new('1..2') }.to raise_error(
ArgumentError, "Invalid version string '1..2'"
)
expect { Version.new('1.2.n') }.to raise_error(
ArgumentError, "Invalid version string '1.2.n'"
)
expect { Version.new('1.2.') }.to raise_error(
ArgumentError, "Invalid version string '1.2.'"
)
expect { Version.new('1.2.$') }.to raise_error(
ArgumentError, "Invalid version string '1.2.$'"
)
end
end
describe '#<=>' do
context 'can check which version is the new one' do
it 'can compare with ==' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('1.2.3')
- version3 = Version.new('1.2.3.0')
- version4 = Version.new('1.3.3')
- expect(version1 == version2).to be true
- expect(version1 == version3).to be true
- expect(version1 == version4).to be false
+ expect(Version.new('1.2.3') == Version.new('1.2.3.0')).to eq(true)
+ expect(Version.new('1.2.3') == Version.new('1.3.3')).to eq(false)
end
it 'can compare with >' do
- version1 = Version.new('1.3.1')
- version2 = Version.new('1.3.1')
- version3 = Version.new('1.2.3')
- version4 = Version.new('1.4')
- expect(version1 > version3).to be true
- expect(version3 > version1).to be false
- expect(version1 > version2).to be false
- expect(version4 > version1).to be true
+ expect(Version.new('1.3.1') > Version.new('1.2.3')).to eq(true)
+ expect(Version.new('1.2.3') > Version.new('1.3.1')).to eq(false)
+ expect(Version.new('1.4') > Version.new('1.3.1')).to eq(true)
end
it 'can compare with >=' do
- version1 = Version.new('1.3.1')
- version2 = Version.new('1.3.1')
- version3 = Version.new('1.2.3')
- version4 = Version.new('1.4')
- expect(version1 >= version3).to be true
- expect(version3 >= version1).to be false
- expect(version1 >= version2).to be true
- expect(version4 >= version1).to be true
+ expect(Version.new('1.3.1') >= Version.new('1.2.3')).to eq(true)
+ expect(Version.new('1.2.3') >= Version.new('1.3.1')).to eq(false)
+ expect(Version.new('1.4') >= Version.new('1.3.1')).to eq(true)
end
it 'can compare with <' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('1.2.3')
- version3 = Version.new('1.3.1')
- version4 = Version.new('1.4')
- expect(version1 < version3).to be true
- expect(version3 < version1).to be false
- expect(version1 < version2).to be false
- expect(version3 < version4).to be true
+ expect(Version.new('1.2.3') < Version.new('1.3.1')).to eq(true)
+ expect(Version.new('1.3.1') < Version.new('1.2.3')).to eq(false)
+ expect(Version.new('1.3.1') < Version.new('1.4')).to eq(true)
end
it 'can compare with <=' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('1.2.3')
- version3 = Version.new('1.3.1')
- version4 = Version.new('1.4')
- expect(version1 <= version3).to be true
- expect(version3 <= version1).to be false
- expect(version1 <= version2).to be true
- expect(version3 <= version4).to be true
+ expect(Version.new('1.2.3') <= Version.new('1.3.1')).to eq(true)
+ expect(Version.new('1.3.1') <= Version.new('1.2.3')).to eq(false)
+ expect(Version.new('1.3.1') <= Version.new('1.4')).to eq(true)
end
it 'can compare with <=>' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('1.2.3')
- version3 = Version.new('1.3.1')
- expect(version3 <=> version1).to eq(1)
- expect(version1 <=> version2).to eq(0)
- expect(version1 <=> version3).to eq(-1)
+ expect(Version.new('1.3.1') <=> Version.new('1.2.3')).to eq(1)
+ expect(Version.new('1.2.3') <=> Version.new('1.2.3.0')).to eq(0)
+ expect(Version.new('1.2.3') <=> Version.new('1.3.1')).to eq(-1)
end
end
end
describe '#to_s' do
it 'can return the version without the zero components at the end' do
- version1 = Version.new('1.2.3.0.0')
- expect(version1.to_s).to eq('1.2.3')
+ expect(Version.new('1.2.3.0.0').to_s).to eq('1.2.3')
end
it 'can turn the version into a string with empty string parameter' do
expect(Version.new('0')).to eq('')
expect(Version.new('')).to eq('')
end
it 'can turn the version into a string without parameter' do
expect(Version.new).to eq('')
end
end
describe '#components' do
it 'can turn the version into array' do
- version = Version.new('1.2.3')
- expect(version.components).to eq([1, 2, 3])
- expect(version.components.size).to eq(3)
+ expect(Version.new('1.2.3').components).to eq([1, 2, 3])
+ expect(Version.new('1.2.3').components.size).to eq(3)
end
it 'can return the array without zeroes' do
- version = Version.new('1.2.3.0')
- expect(version.components).to eq([1, 2, 3])
+ expect(Version.new('1.2.3.0').components).to eq([1, 2, 3])
end
it 'can return the array with the exact number of components' do
- version = Version.new('1.2.3.4')
- expect(version.components(2)).to eq([1, 2])
+ expect(Version.new('1.2.3.4').components(2)).to eq([1, 2])
end
it 'can add zeroes at the end of the array' do
- version = Version.new('1.2.3')
- expect(version.components(4)).to eq([1, 2, 3, 0])
+ expect(Version.new('1.2.3').components(4)).to eq([1, 2, 3, 0])
end
it 'doesnt change the version' do
original_version = Version.new('1.2.3')
version = original_version.to_s
expect(original_version.components(6)).to eq([1, 2, 3, 0, 0, 0])
expect(original_version.to_s).to eq(version)
end
end
describe '#Range' do
describe '#include?' do
it 'can say if the Version object is in the range of versions' do
- version1 = Version.new('1')
- version2 = Version.new('2')
- version3 = Version.new('1.2')
- version4 = Version.new('2.2')
- version5 = Version.new('1')
- range = Version::Range.new(version1, version2)
- expect(range.include?(version3)).to be true
- expect(range.include?(version4)).to be false
- expect(range.include?(version5)).to be true
+ range = Version::Range.new(Version.new('1'), Version.new('2'))
+ expect(range.include?(Version.new('1.2'))).to eq(true)
+ expect(range.include?(Version.new('2.2'))).to eq(false)
+ expect(range.include?(Version.new('1'))).to eq(true)
end
it 'can say if the Version object/string is in the range of versions' do
- version1 = Version.new('1')
- version2 = Version.new('2')
- version3 = Version.new('1.2')
- range1 = Version::Range.new(version1, '2')
- range2 = Version::Range.new('1', version2)
+ range1 = Version::Range.new(Version.new('1'), '2')
+ range2 = Version::Range.new('1', Version.new('2'))
range3 = Version::Range.new('1', '2')
- expect(range1.include?(version3)).to be true
- expect(range1.include?('1.2')).to be true
- expect(range2.include?(version3)).to be true
- expect(range2.include?('1.2')).to be true
- expect(range3.include?(version3)).to be true
- expect(range3.include?('1.2')).to be true
+ expect(range1.include?(Version.new('1.2'))).to eq(true)
+ expect(range1.include?('1.2')).to eq(true)
+ expect(range2.include?(Version.new('1.2'))).to eq(true)
+ expect(range2.include?('1.2')).to eq(true)
+ expect(range3.include?(Version.new('1.2'))).to eq(true)
+ expect(range3.include?('1.2')).to eq(true)
end
end
describe '#to_a?' do
it 'contains the first version' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('2.3.4')
- range = Version::Range.new(version1, version2)
+ range = Version::Range.new(Version.new('1.2.3'), Version.new('2.3.4'))
array = range.to_a
expect(array.first).to eq('1.2.3')
end
it 'doesnt contain the last version' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('2.3.4')
- range = Version::Range.new(version1, version2)
+ range = Version::Range.new(Version.new('1.2.3'), Version.new('2.3.4'))
array = range.to_a
expect(array.last).to_not eq('2.3.4')
expect(array.last).to eq('2.3.3')
end
it 'contains all the versions' do
- version1 = Version.new('1.2.3')
- version2 = Version.new('1.3.4')
- range = Version::Range.new(version1, version2)
+ range = Version::Range.new(Version.new('1.2.3'), Version.new('1.3.0'))
array = range.to_a
- expect(array.size).to eq(11)
+ expect(array[0] < array[1]).to eq(true)
+ expect(array[1] > array[2]).to eq(false)
+ expect(Version.new.to_s.length <= 5).to eq(true)
+ expect(Version.new.to_s.length > 5).to eq(false)
+ expect(array.size).to eq(7)
+ expect(array).to eq(
+ [
+ '1.2.3', '1.2.4', '1.2.5', '1.2.6', '1.2.7', '1.2.8', '1.2.9'
+ ]
+ )
end
end
end
end
+
+