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

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

Към профила на Александър Ойнаков

Резултати

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

Код

RSpec.describe 'Version' do
describe "#new" do
context "when version is invalid" do
it "returns ArgumentError: Invalid version string" do
expect { Version.new('9..2') }.to raise_error(
ArgumentError,
"Invalid version string '9..2'"
)
expect { Version.new('.9.2') }.to raise_error(
ArgumentError,
"Invalid version string '.9.2'"
)
expect { Version.new('9.2.') }.to raise_error(
ArgumentError,
"Invalid version string '9.2.'"
)
expect { Version.new('9.2,1.0') }.to raise_error(
ArgumentError,
"Invalid version string '9.2,1.0'"
)
end
end
context "when version is empty string" do
it "is not raising error" do
expect { Version.new("") }.to_not raise_error
end
it "use version 0" do
expect(Version.new("").to_s).to eq("")
end
end
context "when not passing argument" do
it "is not raising error" do
expect { Version.new }.to_not raise_error
end
it "use version 0" do
expect(Version.new.to_s).to eq("")
end
end
context "when valid version" do
it "is not raising error" do
expect { Version.new("1.2.3.4") }.to_not raise_error
expect { Version.new("0.0.0.0") }.to_not raise_error
expect { Version.new("0.1") }.to_not raise_error
expect { Version.new("0.1.0") }.to_not raise_error
end
end
end
describe "#to_s" do
it "is not raising error" do
expect { Version.new("0.0.1") }.to_not raise_error
end
it "returns version without last zeros" do
version1 = Version.new("1.2.0.0")
version2 = Version.new("0.9")
expect(version1.to_s).to eq("1.2")
expect(version2.to_s).to eq("0.9")
end
end
describe "#components" do
it "is not raising error" do
expect { Version.new("0.0.1").components }
.to_not raise_error
expect { Version.new("1.2.3.4").components(2) }
.to_not raise_error
expect { Version.new("0.0.0.0").components(5) }
.to_not raise_error
expect { Version.new("0.0.0.0").components(1) }
.to_not raise_error
expect { Version.new("0.0.0.0").components }
.to_not raise_error
end
it "returns components array" do
version1 = Version.new("1.2.3.4")
version2 = Version.new("0.1.0.0")
version3 = Version.new("0.0.0.0")
expect(version1.components).to eq([1, 2, 3, 4])
expect(version1.components(2)).to eq([1, 2])
expect(version1.components(5)).to eq([1, 2, 3, 4, 0])
expect(version2.components).to eq([0, 1])
expect(version2.components(1)).to eq([0])
expect(version2.components(5)).to eq([0, 1, 0, 0, 0])
expect(version3.components).to eq([])
expect(version3.components(5)).to eq([0, 0, 0, 0, 0])
end
it "is not modifying version" do
expect(Version.new("1.2.3.4").components.reverse!)
.to_not eq(Version.new("1.2.3.4").components)
end
end
describe 'Range' do
describe "#new" do
context "when instace of Version class" do
it "is not raising error" do
expect { Version::Range.new(Version.new('1'), Version.new('2')) }
.to_not raise_error
end
end
context "when strings" do
it "is not raising error" do
expect { Version::Range.new('1', '2') }.to_not raise_error
expect { Version::Range.new('', '') }.to_not raise_error
expect { Version::Range.new('', '1') }.to_not raise_error
expect { Version::Range.new('1', '') }.to_not raise_error
end
end
end
describe"#include?" do
context "when instance of Version class" do
it "is not raising error" do
expect do
Version::Range.new(Version.new('1'), Version.new('2'))
.include? Version.new('1.5')
end.to_not raise_error
expect do
Version::Range.new(Version.new(''), Version.new('2'))
.include? Version.new('1.5')
end.to_not raise_error
expect do
Version::Range.new(Version.new(''), Version.new(''))
.include? Version.new('1.5')
end.to_not raise_error
expect do
Version::Range.new(Version.new(''), Version.new(''))
.include? Version.new('')
end.to_not raise_error
end
it "checks if range include version" do
expect((
Version::Range.new(Version.new('1'), Version.new('2'))
.include? Version.new('1.5'))
).to eq(true)
expect((
Version::Range.new(Version.new('1'), Version.new('2'))
.include? Version.new('3'))
).to eq(false)
expect((
Version::Range.new(Version.new('1.5'), Version.new('1.8'))
.include? Version.new('1.6'))
).to eq(true)
expect((
Version::Range.new(Version.new, Version.new('2'))
.include? Version.new('1'))
).to eq(true)
expect((
Version::Range.new(Version.new, Version.new(''))
.include? Version.new('1'))
).to eq(false)
expect((
Version::Range.new(Version.new, Version.new)
.include? Version.new('1'))
).to eq(false)
expect((
Version::Range.new(Version.new('1'), Version.new)
.include? Version.new('1'))
).to eq(false)
expect((
Version::Range.new(Version.new, Version.new)
.include? Version.new)
).to eq(false)
expect((
Version::Range.new(Version.new(''), Version.new(''))
.include? Version.new(''))
).to eq(false)
expect((
Version::Range.new(Version.new, Version.new('1'))
.include? Version.new(''))
).to eq(true)
expect((
Version::Range.new(Version.new('2'), Version.new('4'))
.include? Version.new(''))
).to eq(false)
end
end
context "when strings" do
it "is not raising error" do
expect { Version::Range.new('1', '2').include? '1.5' }
.to_not raise_error
expect { Version::Range.new('', '2').include? '1.5' }
.to_not raise_error
expect { Version::Range.new('', '').include? '1.5' }
.to_not raise_error
expect { Version::Range.new('', '' ).include? '' }
.to_not raise_error
expect { Version::Range.new(nil, nil ).include? nil }
.to_not raise_error
end
it "checks if range include version" do
expect((Version::Range.new('1', '2').include? '1.5')).to eq(true)
expect((Version::Range.new('1', '2').include? '3')).to eq(false)
expect((Version::Range.new('1.5', '1.8').include? '1.6')).to eq(true)
expect((Version::Range.new(nil, '2').include? '1')).to eq(true)
expect((Version::Range.new(nil, '').include? '1')).to eq(false)
expect((Version::Range.new(nil, nil).include? '1')).to eq(false)
expect((Version::Range.new('1', nil).include?'1')).to eq(false)
expect((Version::Range.new(nil, nil).include? nil)).to eq(false)
expect((Version::Range.new('', '').include? '')).to eq(false)
expect((Version::Range.new(nil, '1').include?'')).to eq(true)
expect((Version::Range.new('2', '4').include? '')).to eq(false)
end
end
end
describe "#to_a" do
it "is not raising error" do
expect do
Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2')).to_a
end.to_not raise_error
expect do
Version::Range.new(Version.new(''), Version.new('1.2.2')).to_a
end.to_not raise_error
expect do
Version::Range.new(Version.new, Version.new('1.2.2')).to_a
end.to_not raise_error
expect do
Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2')).to_a
end.to_not raise_error
expect do
Version::Range.new(Version.new, Version.new).to_a
end.to_not raise_error
end
it "returns array of range" do
arr = [
'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(Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2'))
.to_a.to_a
.map(&:to_s)
)
.to eq(arr)
expect(Version::Range.new(Version.new('1.1'), Version.new('1.2'))
.to_a.map(&:to_s)
)
.to match_array([
'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'
]
)
end
end
end
end

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

.....FF...F........

Failures:

  1) spec Version checks for comparison operators positively
     Failure/Error: expect(@solution).to_not pass_tests
       expected this solution to not pass the tests:
       
         class Version
         def >(other)
           false
         end
           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)
               (@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-gq0s9t/spec.rb:323: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 checks for comparison operators negatively
     Failure/Error: expect(@solution).to_not pass_tests
       expected this solution to not pass the tests:
       
         class Version
         def >(other)
           true
         end
           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)
               (@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-gq0s9t/spec.rb:359: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 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-gq0s9t/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)>'

Finished in 14.73 seconds
19 examples, 3 failures

Failed examples:

rspec /tmp/d20161119-19072-gq0s9t/spec.rb:317 # spec Version checks for comparison operators positively
rspec /tmp/d20161119-19072-gq0s9t/spec.rb:353 # spec Version checks for comparison operators negatively
rspec /tmp/d20161119-19072-gq0s9t/spec.rb:441 # spec Version tests that #components cannot be used to modify the version

История (1 версия и 0 коментара)

Александър обнови решението на 18.11.2016 22:11 (преди над 7 години)

+RSpec.describe 'Version' do
+ describe "#new" do
+ context "when version is invalid" do
+ it "returns ArgumentError: Invalid version string" do
+ expect { Version.new('9..2') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '9..2'"
+ )
+ expect { Version.new('.9.2') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '.9.2'"
+ )
+ expect { Version.new('9.2.') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '9.2.'"
+ )
+ expect { Version.new('9.2,1.0') }.to raise_error(
+ ArgumentError,
+ "Invalid version string '9.2,1.0'"
+ )
+ end
+ end
+ context "when version is empty string" do
+ it "is not raising error" do
+ expect { Version.new("") }.to_not raise_error
+ end
+ it "use version 0" do
+ expect(Version.new("").to_s).to eq("")
+ end
+ end
+ context "when not passing argument" do
+ it "is not raising error" do
+ expect { Version.new }.to_not raise_error
+ end
+ it "use version 0" do
+ expect(Version.new.to_s).to eq("")
+ end
+ end
+ context "when valid version" do
+ it "is not raising error" do
+ expect { Version.new("1.2.3.4") }.to_not raise_error
+ expect { Version.new("0.0.0.0") }.to_not raise_error
+ expect { Version.new("0.1") }.to_not raise_error
+ expect { Version.new("0.1.0") }.to_not raise_error
+ end
+ end
+ end
+ describe "#to_s" do
+ it "is not raising error" do
+ expect { Version.new("0.0.1") }.to_not raise_error
+ end
+ it "returns version without last zeros" do
+ version1 = Version.new("1.2.0.0")
+ version2 = Version.new("0.9")
+ expect(version1.to_s).to eq("1.2")
+ expect(version2.to_s).to eq("0.9")
+ end
+ end
+ describe "#components" do
+ it "is not raising error" do
+ expect { Version.new("0.0.1").components }
+ .to_not raise_error
+ expect { Version.new("1.2.3.4").components(2) }
+ .to_not raise_error
+ expect { Version.new("0.0.0.0").components(5) }
+ .to_not raise_error
+ expect { Version.new("0.0.0.0").components(1) }
+ .to_not raise_error
+ expect { Version.new("0.0.0.0").components }
+ .to_not raise_error
+ end
+ it "returns components array" do
+ version1 = Version.new("1.2.3.4")
+ version2 = Version.new("0.1.0.0")
+ version3 = Version.new("0.0.0.0")
+ expect(version1.components).to eq([1, 2, 3, 4])
+ expect(version1.components(2)).to eq([1, 2])
+ expect(version1.components(5)).to eq([1, 2, 3, 4, 0])
+ expect(version2.components).to eq([0, 1])
+ expect(version2.components(1)).to eq([0])
+ expect(version2.components(5)).to eq([0, 1, 0, 0, 0])
+ expect(version3.components).to eq([])
+ expect(version3.components(5)).to eq([0, 0, 0, 0, 0])
+ end
+ it "is not modifying version" do
+ expect(Version.new("1.2.3.4").components.reverse!)
+ .to_not eq(Version.new("1.2.3.4").components)
+ end
+ end
+ describe 'Range' do
+ describe "#new" do
+ context "when instace of Version class" do
+ it "is not raising error" do
+ expect { Version::Range.new(Version.new('1'), Version.new('2')) }
+ .to_not raise_error
+ end
+ end
+ context "when strings" do
+ it "is not raising error" do
+ expect { Version::Range.new('1', '2') }.to_not raise_error
+ expect { Version::Range.new('', '') }.to_not raise_error
+ expect { Version::Range.new('', '1') }.to_not raise_error
+ expect { Version::Range.new('1', '') }.to_not raise_error
+ end
+ end
+ end
+ describe"#include?" do
+ context "when instance of Version class" do
+ it "is not raising error" do
+ expect do
+ Version::Range.new(Version.new('1'), Version.new('2'))
+ .include? Version.new('1.5')
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new(''), Version.new('2'))
+ .include? Version.new('1.5')
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new(''), Version.new(''))
+ .include? Version.new('1.5')
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new(''), Version.new(''))
+ .include? Version.new('')
+ end.to_not raise_error
+ end
+ it "checks if range include version" do
+ expect((
+ Version::Range.new(Version.new('1'), Version.new('2'))
+ .include? Version.new('1.5'))
+ ).to eq(true)
+ expect((
+ Version::Range.new(Version.new('1'), Version.new('2'))
+ .include? Version.new('3'))
+ ).to eq(false)
+ expect((
+ Version::Range.new(Version.new('1.5'), Version.new('1.8'))
+ .include? Version.new('1.6'))
+ ).to eq(true)
+ expect((
+ Version::Range.new(Version.new, Version.new('2'))
+ .include? Version.new('1'))
+ ).to eq(true)
+ expect((
+ Version::Range.new(Version.new, Version.new(''))
+ .include? Version.new('1'))
+ ).to eq(false)
+ expect((
+ Version::Range.new(Version.new, Version.new)
+ .include? Version.new('1'))
+ ).to eq(false)
+ expect((
+ Version::Range.new(Version.new('1'), Version.new)
+ .include? Version.new('1'))
+ ).to eq(false)
+ expect((
+ Version::Range.new(Version.new, Version.new)
+ .include? Version.new)
+ ).to eq(false)
+ expect((
+ Version::Range.new(Version.new(''), Version.new(''))
+ .include? Version.new(''))
+ ).to eq(false)
+ expect((
+ Version::Range.new(Version.new, Version.new('1'))
+ .include? Version.new(''))
+ ).to eq(true)
+ expect((
+ Version::Range.new(Version.new('2'), Version.new('4'))
+ .include? Version.new(''))
+ ).to eq(false)
+ end
+ end
+ context "when strings" do
+ it "is not raising error" do
+ expect { Version::Range.new('1', '2').include? '1.5' }
+ .to_not raise_error
+ expect { Version::Range.new('', '2').include? '1.5' }
+ .to_not raise_error
+ expect { Version::Range.new('', '').include? '1.5' }
+ .to_not raise_error
+ expect { Version::Range.new('', '' ).include? '' }
+ .to_not raise_error
+ expect { Version::Range.new(nil, nil ).include? nil }
+ .to_not raise_error
+ end
+ it "checks if range include version" do
+ expect((Version::Range.new('1', '2').include? '1.5')).to eq(true)
+ expect((Version::Range.new('1', '2').include? '3')).to eq(false)
+ expect((Version::Range.new('1.5', '1.8').include? '1.6')).to eq(true)
+ expect((Version::Range.new(nil, '2').include? '1')).to eq(true)
+ expect((Version::Range.new(nil, '').include? '1')).to eq(false)
+ expect((Version::Range.new(nil, nil).include? '1')).to eq(false)
+ expect((Version::Range.new('1', nil).include?'1')).to eq(false)
+ expect((Version::Range.new(nil, nil).include? nil)).to eq(false)
+ expect((Version::Range.new('', '').include? '')).to eq(false)
+ expect((Version::Range.new(nil, '1').include?'')).to eq(true)
+ expect((Version::Range.new('2', '4').include? '')).to eq(false)
+ end
+ end
+ end
+ describe "#to_a" do
+ it "is not raising error" do
+ expect do
+ Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2')).to_a
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new(''), Version.new('1.2.2')).to_a
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new, Version.new('1.2.2')).to_a
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2')).to_a
+ end.to_not raise_error
+ expect do
+ Version::Range.new(Version.new, Version.new).to_a
+ end.to_not raise_error
+ end
+ it "returns array of range" do
+ arr = [
+ '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(Version::Range.new(Version.new('1.1.0'), Version.new('1.2.2'))
+ .to_a.to_a
+ .map(&:to_s)
+ )
+ .to eq(arr)
+ expect(Version::Range.new(Version.new('1.1'), Version.new('1.2'))
+ .to_a.map(&:to_s)
+ )
+ .to match_array([
+ '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'
+ ]
+ )
+ end
+ end
+ end
+end