Решение на Четвърта задача - Unit тестване от Теодор Филипов

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

Към профила на Теодор Филипов

Резултати

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

Код

RSpec.describe 'Version' do
describe '#initialise' do
context 'With correct arguments' do
it 'Builds object from \'1.3.1\'' do
version = Version.new '1.3.1'
Version.new version
end
it 'Builds object from \'1.33.1\'' do
version = Version.new '1.33.1'
Version.new version
end
it 'Builds object from \'0001.0003.01\'' do
version = Version.new '0001.0003.01'
Version.new version
end
it 'Builds object from arbitary long argument' do
(0..1000).each do |el|
arg = ''
(0...el).each { arg << '.11' }
arg[0] = '1'
version = Version.new arg
Version.new version
end
end
it 'Builds object from \'\'' do
version = Version.new ''
Version.new version
end
it 'Builds object with no args' do
version = Version.new
Version.new version
end
end
context 'With incorect arguments' do
it 'Throws argument error with correct message for \'1.\'' do
exception_thrown = false
begin
Version.new '1.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'ab\'' do
exception_thrown = false
begin
Version.new 'ab'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.1\'' do
exception_thrown = false
begin
Version.new '.1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'1..1\'' do
exception_thrown = false
begin
Version.new '1..1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.\'' do
exception_thrown = false
begin
Version.new '.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Catches additional dot' do
arg = ''
1000.times { arg << '.11' }
arg[0] = ''
(0..2999).step(3).each do |el|
string = String.new arg
string[el] = '.'
exception_thrown = false
begin
Version.new string
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
exception_thrown = false
arg << '.'
begin
Version.new arg
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
end
end
describe '#compare' do
context 'With equal versions' do
def expect_versions_to_be_equal(a_version1, a_version2)
composite_version = Version.new a_version1
expect(a_version1 == composite_version).to be true
expect(a_version1 == a_version2).to be true
expect(a_version2 == a_version1).to be true
expect(a_version1 <=> a_version2).to be 0
expect(a_version2 <=> a_version1).to be 0
expect(a_version1 <= a_version2).to be true
expect(a_version2 <= a_version1).to be true
expect(a_version1 >= a_version2).to be true
expect(a_version2 >= a_version1).to be true
expect(a_version1 > a_version2).to be false
expect(a_version2 > a_version1).to be false
expect(a_version1 < a_version2).to be false
expect(a_version2 < a_version1).to be false
end
it 'compares basic equal versions' do
version1 = Version.new
version2 = Version.new
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '0'
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '0000'
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '0.00.0.0'
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '12.13.2.14.15'
version2 = Version.new '12.13.2.14.15'
expect_versions_to_be_equal(version1, version2)
end
it 'compares equal versions with trailing zeros' do
version1 = Version.new '1.3.17.0.0.000'
version2 = Version.new '1.3.17'
expect_versions_to_be_equal(version1, version2)
version2 = Version.new '1.3.17.00'
expect_versions_to_be_equal(version1, version2)
end
end
context 'With diffrent versions' do
def expect_lesser_version1(a_version1, a_version2)
expect(a_version1 == a_version2).to be false
expect(a_version2 == a_version1).to be false
expect(a_version1 <=> a_version2).to be -1
expect(a_version2 <=> a_version1).to be 1
expect(a_version1 <= a_version2).to be true
expect(a_version2 <= a_version1).to be false
expect(a_version1 >= a_version2).to be false
expect(a_version2 >= a_version1).to be true
expect(a_version1 > a_version2).to be false
expect(a_version2 > a_version1).to be true
expect(a_version1 < a_version2).to be true
expect(a_version2 < a_version1).to be false
end
it 'compares versions with equal length' do
version1 = Version.new '12.15.1.2.3'
version2 = Version.new '13.15.1.2.3'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.16.0.1.252'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.15.2.543.0'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.15.1.33.0'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.15.1.2.6'
expect_lesser_version1(version1, version2)
end
it 'compares versions with diffrent length' do
version1 = Version.new '11.4.2.123'
version2 = Version.new '16.111.432.222.4.4.4.4'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.0'
expect_lesser_version1(version1, version2)
version2 = Version.new '11.17.0.0.0.0.0'
expect_lesser_version1(version1, version2)
version1 = Version.new '0.12.13'
version2 = Version.new '0000016.0'
expect_lesser_version1(version1, version2)
end
end
end
describe '#to_s' do
it 'converts versions to string' do
version = Version.new
expect(version.to_s == '').to be true
version = Version.new ''
expect(version.to_s == '').to be true
version = Version.new '00000'
expect(version.to_s == '').to be true
version = Version.new '0.000.0.0.00'
expect(version.to_s == '').to be true
version = Version.new '1.2.22.40'
expect(version.to_s == '1.2.22.40').to be true
version = Version.new '12.16.0.22.15.22.0.0.0.000'
expect(version.to_s == '12.16.0.22.15.22').to be true
version = Version.new '0.000.12.3'
expect(version.to_s == '0.0.12.3').to be true
end
end
describe '#components' do
it 'converts versions to array' do
version = Version.new
expect(version.components == []).to be true
expect(version.components(2) == [0, 0]).to be true
version = Version.new ''
expect(version.components == []).to be true
version = Version.new '00000'
expect(version.components == []).to be true
version = Version.new '0.000.0.0.00'
expect(version.components == []).to be true
version = Version.new '1.2.22.40'
expect(version.components == [1, 2, 22, 40]).to be true
expect(version.components(3) == [1, 2, 22]).to be true
version = Version.new '12.16.0.22.15.22.0.0.0.000'
expect(version.components == [12, 16, 0, 22, 15, 22]).to be true
version = Version.new '0.000.12.3'
expect(version.components == [0, 0, 12, 3]).to be true
expect(version.components(2) == [0, 0]).to be true
expect(version.components(4) == [0, 0, 12, 3]).to be true
end
it 'does not allow inner modifications' do
version = Version.new '0.00.12.16.0.2'
comps = version.components
comps << 2
expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
comps[0] = 20
expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
comps[0] += 2
expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
end
end
context 'Range tests' do
describe '#initialise' do
context 'With correct arguments' do
it 'Builds object from \'1.3.1\'' do
version = Version.new '1.3.1'
Version::Range.new version, '1.3.1'
Version::Range.new '1.3.1', version
Version::Range.new '1.3.1', '1.3.1'
Version::Range.new version, version
end
it 'Builds object from \'1.33.1\'' do
version = Version.new '1.33.1'
Version::Range.new version, '1.33.1'
Version::Range.new '1.33.1', version
Version::Range.new '1.33.1', '1.33.1'
Version::Range.new version, version
end
it 'Builds object from \'0001.0003.01\'' do
version = Version.new '0001.0003.01'
Version::Range.new version, '0001.0003.01'
Version::Range.new '0001.0003.01', version
Version::Range.new '0001.0003.01', '0001.0003.01'
Version::Range.new version, version
end
it 'Builds object from arbitary long argument' do
(0..1000).each do |el|
arg = ''
(0...el).each { arg << '.11' }
arg[0] = '1'
version = Version.new arg
Version::Range.new version, arg
Version::Range.new arg, version
Version::Range.new arg, arg
Version::Range.new version, version
end
end
it 'Builds object from \'\'' do
version = Version.new ''
Version::Range.new version, ''
Version::Range.new '', version
Version::Range.new '', ''
Version::Range.new version, version
end
end
context 'With incorect arguments' do
it 'Throws argument error with correct message for \'1.\'' do
exception_thrown = false
begin
Version::Range.new '1.', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '1.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'ab\'' do
exception_thrown = false
begin
Version::Range.new 'ab', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', 'ab'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.1\'' do
exception_thrown = false
begin
Version::Range.new '.1', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '.1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'1..1\'' do
exception_thrown = false
begin
Version::Range.new '1..1', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '1..1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.\'' do
exception_thrown = false
begin
Version::Range.new '.', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Catches additional dot' do
arg = ''
1000.times { arg << '.11' }
arg[0] = ''
(0..2999).step(3).each do |el|
string = String.new arg
string[el] = '.'
exception_thrown = false
begin
Version::Range.new string, ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', string
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
exception_thrown = false
arg << '.'
begin
Version::Range.new arg, ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
arg << '.'
begin
Version::Range.new '', arg
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
end
end
describe '#include?' do
it 'can tell if version is in the range' do
range = Version::Range.new '0.25.3.70.0.0', '1'
version = Version.new '0.25.3.70'
expect(range.include?(version)).to be true
expect(range.include?('0.25.3.70')).to be true
version = Version.new '1'
expect(range.include?(version)).to be false
expect(range.include?('1.000.00')).to be false
version = Version.new '0.999.9999.999.9999.999.9999.9999'
expect(range.include?(version)).to be true
expect(range.include?('0.999.9999.999.9999.999.9999.9999')).to be true
range = Version::Range.new Version.new('0.1'), Version.new('0.0.1')
version = Version.new '0.1'
expect(range.include?(version)).to be false
expect(range.include?('0.0.1')).to be false
end
context 'With incorect arguments' do
it 'Throws argument error with correct message for \'1.\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '1.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'ab\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? 'ab'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.1\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '.1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'1..1\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '1..1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Catches additional dot' do
range = Version::Range.new '', ''
arg = ''
1000.times { arg << '.11' }
arg[0] = ''
(0..2999).step(3).each do |el|
string = String.new arg
string[el] = '.'
exception_thrown = false
begin
range.include? string
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
arg << '.'
begin
range.include? arg
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
end
end
end
describe '#to_a' do
it 'converts range to array' do
range = Version::Range.new '0.8.4', '1'
expect(range.to_a ==
[
'0.8.4', '0.8.5', '0.8.6', '0.8.7', '0.8.8',
'0.8.9', '0.9.0', '0.9.1', '0.9.2', '0.9.3', '0.9.4', '0.9.5',
'0.9.6', '0.9.7', '0.9.8', '0.9.9'
]
)
range = Version::Range.new '1', '1.0.0'
expect(range.to_a == [])
range = Version::Range.new '0.1', '0.1.3'
expect(range.to_a == ['0.1.0', '0.1.1', '0.1.2'])
range = Version::Range.new '1.9.9', '2.0.1'
expect(range.to_a == ['1.9.9', '2.0.0'])
end
end
end
end

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

FF/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F/home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:60:in `getwd': No such file or directory - getcwd (Errno::ENOENT)
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:60:in `pwd'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:60:in `block in pwd'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:59:in `pwd'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:161:in `search_up'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:148:in `find_file'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/shared_helpers.rb:131:in `print_major_deprecations!'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler.rb:95:in `setup'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.13.2/lib/bundler/setup.rb:20:in `<top (required)>'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/pyfmi/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
FFF/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
FF/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
.FF/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
FF/data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `expand_path': No such file or directory - getcwd (Errno::ENOENT)
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:33:in `relative_path'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:90:in `file_and_line_number'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:65:in `store_computed'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/metadata.rb:49:in `[]'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/example.rb:41:in `block (2 levels) in delegate_to_metadata'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_formatter.rb:191:in `read_failed_line'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:300:in `dump_failure_info'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:294:in `dump_failure'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:24:in `block in dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `each_with_index'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/formatters/base_text_formatter.rb:22:in `dump_failures'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:130:in `block in notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `each'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:129:in `notify'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:109:in `finish'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/reporter.rb:60:in `report'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/command_line.rb:21:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:103:in `run'
	from /data/rails/evans-2016/shared/bundle/ruby/2.3.0/gems/rspec-core-2.99.2/lib/rspec/core/runner.rb:17:in `block in autorun'
F

Failures:

  1) spec Version passes for the correct solution
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:238: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 ArgumentError with the correct message
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:257: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 checks for the type of ArgumentError
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:276: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)>'

  4) spec Version checks that initialize can be given an empty string
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:295: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)>'

  5) spec Version checks that initialize can be given no arguments
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:314: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)>'

  6) spec Version checks for comparison operators positively
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:332: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)>'

  7) spec Version checks for comparison operators negatively
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:368: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)>'

  8) spec Version tests #components without arguments
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:402: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)>'

  9) spec Version tests #components with less components than present
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:420: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)>'

  10) spec Version tests #components with more components than present
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:438: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)>'

  11) spec Version tests that #components cannot be used to modify the version
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/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)>'

  12) spec Version tests #to_s
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:466: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)>'

  13) spec Version::Range tests constructing ranges with strings
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/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)>'

  14) spec Version::Range smoke-tests include?
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:502: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)>'

  15) spec Version::Range tests include? with versions greater than the start one
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:512: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)>'

  16) spec Version::Range tests include? with versions lower than the start one
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/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)>'

  17) spec Version::Range smoke-tests #to_a
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:532: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)>'

  18) spec Version::Range tests each #to_a element
     Failure/Error: output = `#{command}`
     Timeout::Error:
       execution expired
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in ``'
     # /tmp/d20161119-19072-pawsso/spec.rb:35:in `execute'
     # /tmp/d20161119-19072-pawsso/spec.rb:29:in `block (2 levels) in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `chdir'
     # /tmp/d20161119-19072-pawsso/spec.rb:25:in `block in test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:24:in `test_solution'
     # /tmp/d20161119-19072-pawsso/spec.rb:65:in `block (2 levels) in <top (required)>'
     # /tmp/d20161119-19072-pawsso/spec.rb:544: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 1 minute 43.75 seconds
19 examples, 18 failures

Failed examples:

rspec /tmp/d20161119-19072-pawsso/spec.rb:237 # spec Version passes for the correct solution
rspec /tmp/d20161119-19072-pawsso/spec.rb:241 # spec Version checks for ArgumentError with the correct message
rspec /tmp/d20161119-19072-pawsso/spec.rb:260 # spec Version checks for the type of ArgumentError
rspec /tmp/d20161119-19072-pawsso/spec.rb:279 # spec Version checks that initialize can be given an empty string
rspec /tmp/d20161119-19072-pawsso/spec.rb:298 # spec Version checks that initialize can be given no arguments
rspec /tmp/d20161119-19072-pawsso/spec.rb:317 # spec Version checks for comparison operators positively
rspec /tmp/d20161119-19072-pawsso/spec.rb:353 # spec Version checks for comparison operators negatively
rspec /tmp/d20161119-19072-pawsso/spec.rb:389 # spec Version tests #components without arguments
rspec /tmp/d20161119-19072-pawsso/spec.rb:405 # spec Version tests #components with less components than present
rspec /tmp/d20161119-19072-pawsso/spec.rb:423 # spec Version tests #components with more components than present
rspec /tmp/d20161119-19072-pawsso/spec.rb:441 # spec Version tests that #components cannot be used to modify the version
rspec /tmp/d20161119-19072-pawsso/spec.rb:459 # spec Version tests #to_s
rspec /tmp/d20161119-19072-pawsso/spec.rb:471 # spec Version::Range tests constructing ranges with strings
rspec /tmp/d20161119-19072-pawsso/spec.rb:495 # spec Version::Range smoke-tests include?
rspec /tmp/d20161119-19072-pawsso/spec.rb:505 # spec Version::Range tests include? with versions greater than the start one
rspec /tmp/d20161119-19072-pawsso/spec.rb:515 # spec Version::Range tests include? with versions lower than the start one
rspec /tmp/d20161119-19072-pawsso/spec.rb:525 # spec Version::Range smoke-tests #to_a
rspec /tmp/d20161119-19072-pawsso/spec.rb:535 # spec Version::Range tests each #to_a element

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

Теодор обнови решението на 18.11.2016 01:06 (преди над 7 години)

+RSpec.describe 'Version' do
+ describe '#initialise' do
+ context 'With correct arguments' do
+ it 'Builds object from \'1.3.1\'' do
+ version = Version.new '1.3.1'
+ Version.new version
+ end
+
+ it 'Builds object from \'1.33.1\'' do
+ version = Version.new '1.33.1'
+ Version.new version
+ end
+
+ it 'Builds object from \'0001.0003.01\'' do
+ version = Version.new '0001.0003.01'
+ Version.new version
+ end
+
+ it 'Builds object from arbitary long argument' do
+ (0..1000).each do |el|
+ arg = ''
+ (0...el).each { arg << '.11' }
+ arg[0] = '1'
+ version = Version.new arg
+ Version.new version
+ end
+ end
+
+ it 'Builds object from \'\'' do
+ version = Version.new ''
+ Version.new version
+ end
+
+ it 'Builds object with no args' do
+ version = Version.new
+ Version.new version
+ end
+ end
+
+ context 'With incorect arguments' do
+ it 'Throws argument error with correct message for \'1.\'' do
+ exception_thrown = false
+ begin
+ Version.new '1.'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'ab\'' do
+ exception_thrown = false
+ begin
+ Version.new 'ab'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'ab\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'.1\'' do
+ exception_thrown = false
+ begin
+ Version.new '.1'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'1..1\'' do
+ exception_thrown = false
+ begin
+ Version.new '1..1'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1..1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'.\'' do
+ exception_thrown = false
+ begin
+ Version.new '.'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Catches additional dot' do
+ arg = ''
+ 1000.times { arg << '.11' }
+
+ arg[0] = ''
+ (0..2999).step(3).each do |el|
+ string = String.new arg
+ string[el] = '.'
+ exception_thrown = false
+ begin
+ Version.new string
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{string}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ exception_thrown = false
+ arg << '.'
+ begin
+ Version.new arg
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{arg}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+ end
+ end
+
+ describe '#compare' do
+ context 'With equal versions' do
+ def expect_versions_to_be_equal(a_version1, a_version2)
+ composite_version = Version.new a_version1
+ expect(a_version1 == composite_version).to be true
+
+ expect(a_version1 == a_version2).to be true
+ expect(a_version2 == a_version1).to be true
+
+ expect(a_version1 <=> a_version2).to be 0
+ expect(a_version2 <=> a_version1).to be 0
+
+ expect(a_version1 <= a_version2).to be true
+ expect(a_version2 <= a_version1).to be true
+
+ expect(a_version1 >= a_version2).to be true
+ expect(a_version2 >= a_version1).to be true
+
+ expect(a_version1 > a_version2).to be false
+ expect(a_version2 > a_version1).to be false
+
+ expect(a_version1 < a_version2).to be false
+ expect(a_version2 < a_version1).to be false
+ end
+
+ it 'compares basic equal versions' do
+ version1 = Version.new
+ version2 = Version.new
+
+ expect_versions_to_be_equal(version1, version2)
+
+ version1 = Version.new '0'
+ expect_versions_to_be_equal(version1, version2)
+
+ version1 = Version.new '0000'
+ expect_versions_to_be_equal(version1, version2)
+
+ version1 = Version.new '0.00.0.0'
+ expect_versions_to_be_equal(version1, version2)
+
+ version1 = Version.new '12.13.2.14.15'
+ version2 = Version.new '12.13.2.14.15'
+ expect_versions_to_be_equal(version1, version2)
+ end
+
+ it 'compares equal versions with trailing zeros' do
+ version1 = Version.new '1.3.17.0.0.000'
+ version2 = Version.new '1.3.17'
+ expect_versions_to_be_equal(version1, version2)
+
+ version2 = Version.new '1.3.17.00'
+ expect_versions_to_be_equal(version1, version2)
+ end
+ end
+
+ context 'With diffrent versions' do
+ def expect_lesser_version1(a_version1, a_version2)
+ expect(a_version1 == a_version2).to be false
+ expect(a_version2 == a_version1).to be false
+
+ expect(a_version1 <=> a_version2).to be -1
+ expect(a_version2 <=> a_version1).to be 1
+
+ expect(a_version1 <= a_version2).to be true
+ expect(a_version2 <= a_version1).to be false
+
+ expect(a_version1 >= a_version2).to be false
+ expect(a_version2 >= a_version1).to be true
+
+ expect(a_version1 > a_version2).to be false
+ expect(a_version2 > a_version1).to be true
+
+ expect(a_version1 < a_version2).to be true
+ expect(a_version2 < a_version1).to be false
+ end
+
+ it 'compares versions with equal length' do
+ version1 = Version.new '12.15.1.2.3'
+ version2 = Version.new '13.15.1.2.3'
+ expect_lesser_version1(version1, version2)
+
+ version2 = Version.new '12.16.0.1.252'
+ expect_lesser_version1(version1, version2)
+
+ version2 = Version.new '12.15.2.543.0'
+ expect_lesser_version1(version1, version2)
+
+ version2 = Version.new '12.15.1.33.0'
+ expect_lesser_version1(version1, version2)
+
+ version2 = Version.new '12.15.1.2.6'
+ expect_lesser_version1(version1, version2)
+ end
+
+ it 'compares versions with diffrent length' do
+ version1 = Version.new '11.4.2.123'
+ version2 = Version.new '16.111.432.222.4.4.4.4'
+ expect_lesser_version1(version1, version2)
+
+ version2 = Version.new '12.0'
+ expect_lesser_version1(version1, version2)
+
+ version2 = Version.new '11.17.0.0.0.0.0'
+ expect_lesser_version1(version1, version2)
+
+ version1 = Version.new '0.12.13'
+ version2 = Version.new '0000016.0'
+ expect_lesser_version1(version1, version2)
+ end
+ end
+ end
+
+ describe '#to_s' do
+ it 'converts versions to string' do
+ version = Version.new
+ expect(version.to_s == '').to be true
+
+ version = Version.new ''
+ expect(version.to_s == '').to be true
+
+ version = Version.new '00000'
+ expect(version.to_s == '').to be true
+
+ version = Version.new '0.000.0.0.00'
+ expect(version.to_s == '').to be true
+
+ version = Version.new '1.2.22.40'
+ expect(version.to_s == '1.2.22.40').to be true
+
+ version = Version.new '12.16.0.22.15.22.0.0.0.000'
+ expect(version.to_s == '12.16.0.22.15.22').to be true
+
+ version = Version.new '0.000.12.3'
+ expect(version.to_s == '0.0.12.3').to be true
+ end
+ end
+
+ describe '#components' do
+ it 'converts versions to array' do
+ version = Version.new
+ expect(version.components == []).to be true
+
+ version = Version.new ''
+ expect(version.components == []).to be true
+
+ version = Version.new '00000'
+ expect(version.components == []).to be true
+
+ version = Version.new '0.000.0.0.00'
+ expect(version.components == []).to be true
+
+ version = Version.new '1.2.22.40'
+ expect(version.components == [1, 2, 22, 40]).to be true
+
+ version = Version.new '12.16.0.22.15.22.0.0.0.000'
+ expect(version.components == [12, 16, 0, 22, 15, 22]).to be true
+
+ version = Version.new '0.000.12.3'
+ expect(version.components == [0, 0, 12, 3]).to be true
+ end
+
+ it 'does not allow inner modifications' do
+ version = Version.new '0.00.12.16.0.2'
+ comps = version.components
+
+ comps << 2
+
+ expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
+
+ comps[0] = 20
+
+ expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
+
+ comps[0] += 2
+
+ expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
+ end
+ end
+
+ context 'Range tests' do
+ describe '#initialise' do
+ context 'With correct arguments' do
+ it 'Builds object from \'1.3.1\'' do
+ version = Version.new '1.3.1'
+ Version::Range.new version, '1.3.1'
+ Version::Range.new '1.3.1', version
+ Version::Range.new '1.3.1', '1.3.1'
+ Version::Range.new version, version
+ end
+
+ it 'Builds object from \'1.33.1\'' do
+ version = Version.new '1.33.1'
+ Version::Range.new version, '1.33.1'
+ Version::Range.new '1.33.1', version
+ Version::Range.new '1.33.1', '1.33.1'
+ Version::Range.new version, version
+ end
+
+ it 'Builds object from \'0001.0003.01\'' do
+ version = Version.new '0001.0003.01'
+ Version::Range.new version, '0001.0003.01'
+ Version::Range.new '0001.0003.01', version
+ Version::Range.new '0001.0003.01', '0001.0003.01'
+ Version::Range.new version, version
+ end
+
+ it 'Builds object from arbitary long argument' do
+ (0..1000).each do |el|
+ arg = ''
+ (0...el).each { arg << '.11' }
+ arg[0] = '1'
+ version = Version.new arg
+ Version::Range.new version, arg
+ Version::Range.new arg, version
+ Version::Range.new arg, arg
+ Version::Range.new version, version
+ end
+ end
+
+ it 'Builds object from \'\'' do
+ version = Version.new ''
+ Version::Range.new version, ''
+ Version::Range.new '', version
+ Version::Range.new '', ''
+ Version::Range.new version, version
+ end
+ end
+
+ context 'With incorect arguments' do
+ it 'Throws argument error with correct message for \'1.\'' do
+ exception_thrown = false
+ begin
+ Version::Range.new '1.', ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ begin
+ Version::Range.new '', '1.'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'ab\'' do
+ exception_thrown = false
+ begin
+ Version::Range.new 'ab', ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'ab\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ begin
+ Version::Range.new '', 'ab'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'ab\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'.1\'' do
+ exception_thrown = false
+ begin
+ Version::Range.new '.1', ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ begin
+ Version::Range.new '', '.1'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'1..1\'' do
+ exception_thrown = false
+ begin
+ Version::Range.new '1..1', ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1..1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ begin
+ Version::Range.new '', '1..1'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1..1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'.\'' do
+ exception_thrown = false
+ begin
+ Version::Range.new '.', ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ begin
+ Version::Range.new '', '.'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Catches additional dot' do
+ arg = ''
+ 1000.times { arg << '.11' }
+
+ arg[0] = ''
+
+ (0..2999).step(3).each do |el|
+ string = String.new arg
+ string[el] = '.'
+ exception_thrown = false
+ begin
+ Version::Range.new string, ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{string}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ begin
+ Version::Range.new '', string
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{string}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ exception_thrown = false
+ arg << '.'
+ begin
+ Version::Range.new arg, ''
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{arg}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+
+ exception_thrown = false
+ arg << '.'
+ begin
+ Version::Range.new '', arg
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{arg}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+ end
+ end
+
+ describe '#include?' do
+ it 'can tell if version is in the range' do
+ range = Version::Range.new '0.25.3.70.0.0', '1'
+
+ version = Version.new '0.25.3.70'
+ expect(range.include?(version)).to be true
+ expect(range.include?('0.25.3.70')).to be true
+
+ version = Version.new '1'
+ expect(range.include?(version)).to be false
+ expect(range.include?('1.000.00')).to be false
+
+ version = Version.new '0.999.9999.999.9999.999.9999.9999'
+ expect(range.include?(version)).to be true
+ expect(range.include?('0.999.9999.999.9999.999.9999.9999')).to be true
+
+ range = Version::Range.new Version.new('0.1'), Version.new('0.0.1')
+
+ version = Version.new '0.1'
+ expect(range.include?(version)).to be false
+ expect(range.include?('0.0.1')).to be false
+ end
+
+ context 'With incorect arguments' do
+ it 'Throws argument error with correct message for \'1.\'' do
+ range = Version::Range.new '', ''
+ exception_thrown = false
+ begin
+ range.include? '1.'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'ab\'' do
+ range = Version::Range.new '', ''
+ exception_thrown = false
+ begin
+ range.include? 'ab'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'ab\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'.1\'' do
+ range = Version::Range.new '', ''
+ exception_thrown = false
+ begin
+ range.include? '.1'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'1..1\'' do
+ range = Version::Range.new '', ''
+ exception_thrown = false
+ begin
+ range.include? '1..1'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'1..1\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Throws argument error with correct message for \'.\'' do
+ range = Version::Range.new '', ''
+ exception_thrown = false
+ begin
+ range.include? '.'
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq 'Invalid version string \'.\''
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+
+ it 'Catches additional dot' do
+ range = Version::Range.new '', ''
+ arg = ''
+ 1000.times { arg << '.11' }
+
+ arg[0] = ''
+
+ (0..2999).step(3).each do |el|
+ string = String.new arg
+ string[el] = '.'
+ exception_thrown = false
+ begin
+ range.include? string
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{string}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ exception_thrown = false
+ arg << '.'
+ begin
+ range.include? arg
+ rescue ArgumentError => e
+ exception_thrown = true
+ expect(e.message).to eq "Invalid version string '#{arg}'"
+ expect(e.class).to be ArgumentError
+ end
+ expect(exception_thrown).to be true
+ end
+ end
+ end
+ end
+ end
+end

Теодор обнови решението на 18.11.2016 01:22 (преди над 7 години)

RSpec.describe 'Version' do
describe '#initialise' do
context 'With correct arguments' do
it 'Builds object from \'1.3.1\'' do
version = Version.new '1.3.1'
Version.new version
end
it 'Builds object from \'1.33.1\'' do
version = Version.new '1.33.1'
Version.new version
end
it 'Builds object from \'0001.0003.01\'' do
version = Version.new '0001.0003.01'
Version.new version
end
it 'Builds object from arbitary long argument' do
(0..1000).each do |el|
arg = ''
(0...el).each { arg << '.11' }
arg[0] = '1'
version = Version.new arg
Version.new version
end
end
it 'Builds object from \'\'' do
version = Version.new ''
Version.new version
end
it 'Builds object with no args' do
version = Version.new
Version.new version
end
end
context 'With incorect arguments' do
it 'Throws argument error with correct message for \'1.\'' do
exception_thrown = false
begin
Version.new '1.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'ab\'' do
exception_thrown = false
begin
Version.new 'ab'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.1\'' do
exception_thrown = false
begin
Version.new '.1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'1..1\'' do
exception_thrown = false
begin
Version.new '1..1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.\'' do
exception_thrown = false
begin
Version.new '.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Catches additional dot' do
arg = ''
1000.times { arg << '.11' }
arg[0] = ''
(0..2999).step(3).each do |el|
string = String.new arg
string[el] = '.'
exception_thrown = false
begin
Version.new string
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
exception_thrown = false
arg << '.'
begin
Version.new arg
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
end
end
describe '#compare' do
context 'With equal versions' do
def expect_versions_to_be_equal(a_version1, a_version2)
composite_version = Version.new a_version1
expect(a_version1 == composite_version).to be true
expect(a_version1 == a_version2).to be true
expect(a_version2 == a_version1).to be true
expect(a_version1 <=> a_version2).to be 0
expect(a_version2 <=> a_version1).to be 0
expect(a_version1 <= a_version2).to be true
expect(a_version2 <= a_version1).to be true
expect(a_version1 >= a_version2).to be true
expect(a_version2 >= a_version1).to be true
expect(a_version1 > a_version2).to be false
expect(a_version2 > a_version1).to be false
expect(a_version1 < a_version2).to be false
expect(a_version2 < a_version1).to be false
end
it 'compares basic equal versions' do
version1 = Version.new
version2 = Version.new
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '0'
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '0000'
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '0.00.0.0'
expect_versions_to_be_equal(version1, version2)
version1 = Version.new '12.13.2.14.15'
version2 = Version.new '12.13.2.14.15'
expect_versions_to_be_equal(version1, version2)
end
it 'compares equal versions with trailing zeros' do
version1 = Version.new '1.3.17.0.0.000'
version2 = Version.new '1.3.17'
expect_versions_to_be_equal(version1, version2)
version2 = Version.new '1.3.17.00'
expect_versions_to_be_equal(version1, version2)
end
end
context 'With diffrent versions' do
def expect_lesser_version1(a_version1, a_version2)
expect(a_version1 == a_version2).to be false
expect(a_version2 == a_version1).to be false
expect(a_version1 <=> a_version2).to be -1
expect(a_version2 <=> a_version1).to be 1
expect(a_version1 <= a_version2).to be true
expect(a_version2 <= a_version1).to be false
expect(a_version1 >= a_version2).to be false
expect(a_version2 >= a_version1).to be true
expect(a_version1 > a_version2).to be false
expect(a_version2 > a_version1).to be true
expect(a_version1 < a_version2).to be true
expect(a_version2 < a_version1).to be false
end
it 'compares versions with equal length' do
version1 = Version.new '12.15.1.2.3'
version2 = Version.new '13.15.1.2.3'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.16.0.1.252'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.15.2.543.0'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.15.1.33.0'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.15.1.2.6'
expect_lesser_version1(version1, version2)
end
it 'compares versions with diffrent length' do
version1 = Version.new '11.4.2.123'
version2 = Version.new '16.111.432.222.4.4.4.4'
expect_lesser_version1(version1, version2)
version2 = Version.new '12.0'
expect_lesser_version1(version1, version2)
version2 = Version.new '11.17.0.0.0.0.0'
expect_lesser_version1(version1, version2)
version1 = Version.new '0.12.13'
version2 = Version.new '0000016.0'
expect_lesser_version1(version1, version2)
end
end
end
describe '#to_s' do
it 'converts versions to string' do
version = Version.new
expect(version.to_s == '').to be true
version = Version.new ''
expect(version.to_s == '').to be true
version = Version.new '00000'
expect(version.to_s == '').to be true
version = Version.new '0.000.0.0.00'
expect(version.to_s == '').to be true
version = Version.new '1.2.22.40'
expect(version.to_s == '1.2.22.40').to be true
version = Version.new '12.16.0.22.15.22.0.0.0.000'
expect(version.to_s == '12.16.0.22.15.22').to be true
version = Version.new '0.000.12.3'
expect(version.to_s == '0.0.12.3').to be true
end
end
describe '#components' do
it 'converts versions to array' do
version = Version.new
expect(version.components == []).to be true
+ expect(version.components(2) == [0, 0]).to be true
version = Version.new ''
expect(version.components == []).to be true
version = Version.new '00000'
expect(version.components == []).to be true
version = Version.new '0.000.0.0.00'
expect(version.components == []).to be true
version = Version.new '1.2.22.40'
expect(version.components == [1, 2, 22, 40]).to be true
+ expect(version.components(3) == [1, 2, 22]).to be true
version = Version.new '12.16.0.22.15.22.0.0.0.000'
expect(version.components == [12, 16, 0, 22, 15, 22]).to be true
version = Version.new '0.000.12.3'
expect(version.components == [0, 0, 12, 3]).to be true
+ expect(version.components(2) == [0, 0]).to be true
+ expect(version.components(4) == [0, 0, 12, 3]).to be true
end
it 'does not allow inner modifications' do
version = Version.new '0.00.12.16.0.2'
comps = version.components
comps << 2
expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
comps[0] = 20
expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
comps[0] += 2
expect(version.components == [0, 0, 12, 16, 0, 2]).to be true
end
end
context 'Range tests' do
describe '#initialise' do
context 'With correct arguments' do
it 'Builds object from \'1.3.1\'' do
version = Version.new '1.3.1'
Version::Range.new version, '1.3.1'
Version::Range.new '1.3.1', version
Version::Range.new '1.3.1', '1.3.1'
Version::Range.new version, version
end
it 'Builds object from \'1.33.1\'' do
version = Version.new '1.33.1'
Version::Range.new version, '1.33.1'
Version::Range.new '1.33.1', version
Version::Range.new '1.33.1', '1.33.1'
Version::Range.new version, version
end
it 'Builds object from \'0001.0003.01\'' do
version = Version.new '0001.0003.01'
Version::Range.new version, '0001.0003.01'
Version::Range.new '0001.0003.01', version
Version::Range.new '0001.0003.01', '0001.0003.01'
Version::Range.new version, version
end
it 'Builds object from arbitary long argument' do
(0..1000).each do |el|
arg = ''
(0...el).each { arg << '.11' }
arg[0] = '1'
version = Version.new arg
Version::Range.new version, arg
Version::Range.new arg, version
Version::Range.new arg, arg
Version::Range.new version, version
end
end
it 'Builds object from \'\'' do
version = Version.new ''
Version::Range.new version, ''
Version::Range.new '', version
Version::Range.new '', ''
Version::Range.new version, version
end
end
context 'With incorect arguments' do
it 'Throws argument error with correct message for \'1.\'' do
exception_thrown = false
begin
Version::Range.new '1.', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '1.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'ab\'' do
exception_thrown = false
begin
Version::Range.new 'ab', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', 'ab'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.1\'' do
exception_thrown = false
begin
Version::Range.new '.1', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '.1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'1..1\'' do
exception_thrown = false
begin
Version::Range.new '1..1', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '1..1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.\'' do
exception_thrown = false
begin
Version::Range.new '.', ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', '.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Catches additional dot' do
arg = ''
1000.times { arg << '.11' }
arg[0] = ''
(0..2999).step(3).each do |el|
string = String.new arg
string[el] = '.'
exception_thrown = false
begin
Version::Range.new string, ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
begin
Version::Range.new '', string
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
exception_thrown = false
arg << '.'
begin
Version::Range.new arg, ''
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
arg << '.'
begin
Version::Range.new '', arg
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
end
end
describe '#include?' do
it 'can tell if version is in the range' do
range = Version::Range.new '0.25.3.70.0.0', '1'
version = Version.new '0.25.3.70'
expect(range.include?(version)).to be true
expect(range.include?('0.25.3.70')).to be true
version = Version.new '1'
expect(range.include?(version)).to be false
expect(range.include?('1.000.00')).to be false
version = Version.new '0.999.9999.999.9999.999.9999.9999'
expect(range.include?(version)).to be true
expect(range.include?('0.999.9999.999.9999.999.9999.9999')).to be true
range = Version::Range.new Version.new('0.1'), Version.new('0.0.1')
version = Version.new '0.1'
expect(range.include?(version)).to be false
expect(range.include?('0.0.1')).to be false
end
context 'With incorect arguments' do
it 'Throws argument error with correct message for \'1.\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '1.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'ab\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? 'ab'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'ab\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.1\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '.1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'1..1\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '1..1'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'1..1\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Throws argument error with correct message for \'.\'' do
range = Version::Range.new '', ''
exception_thrown = false
begin
range.include? '.'
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq 'Invalid version string \'.\''
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
it 'Catches additional dot' do
range = Version::Range.new '', ''
arg = ''
1000.times { arg << '.11' }
arg[0] = ''
(0..2999).step(3).each do |el|
string = String.new arg
string[el] = '.'
exception_thrown = false
begin
range.include? string
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{string}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
exception_thrown = false
arg << '.'
begin
range.include? arg
rescue ArgumentError => e
exception_thrown = true
expect(e.message).to eq "Invalid version string '#{arg}'"
expect(e.class).to be ArgumentError
end
expect(exception_thrown).to be true
end
end
+ end
+ end
+
+ describe '#to_a' do
+ it 'converts range to array' do
+ range = Version::Range.new '0.8.4', '1'
+
+ expect(range.to_a ==
+ [
+ '0.8.4', '0.8.5', '0.8.6', '0.8.7', '0.8.8',
+ '0.8.9', '0.9.0', '0.9.1', '0.9.2', '0.9.3', '0.9.4', '0.9.5',
+ '0.9.6', '0.9.7', '0.9.8', '0.9.9'
+ ]
+ )
+
+ range = Version::Range.new '1', '1.0.0'
+ expect(range.to_a == [])
+
+ range = Version::Range.new '0.1', '0.1.3'
+ expect(range.to_a == ['0.1.0', '0.1.1', '0.1.2'])
+
+ range = Version::Range.new '1.9.9', '2.0.1'
+ expect(range.to_a == ['1.9.9', '2.0.0'])
end
end
end
end

Пуснах ти тестовете без лимита за време. Имаш 17 от 19, което са 5 точки.

Взимам ти две точки заради:

  1. Циклите в тестовете - изрично сме казвали на лекции, че тестовете трябва да са очевидни и да няма цикли, условия и подобни конструкции вътре
  2. Огромни тестови случаи (брой редове)
  3. Начина на хващане на грешките - има expect { ... }.to raise_error - виж решенията на колегите си
  4. expect(version.components == [0, 0, 12, 16, 0, 2]).to be true вместо expect(version.components).to eq [0, 0, 12, 16, 0, 2]

Лог от тестовете:

Running spec for /Users/stormbreaker/dev/ruby/ruby-secrets/tasks/2016/04/solution.rb

spec
  Version
    passes for the correct solution
    checks for ArgumentError with the correct message
    checks for the type of ArgumentError
    checks that initialize can be given an empty string
    checks that initialize can be given no arguments
    checks for comparison operators positively
    checks for comparison operators negatively
    tests #components without arguments
    tests #components with less components than present
    tests #components with more components than present
    tests that #components cannot be used to modify the version
    tests #to_s
  Version::Range
    tests constructing ranges with strings
    tests constructing ranges with versions
    smoke-tests include?
    tests include? with versions greater than the start one
    tests include? with versions lower than the start one (FAILED - 1)
    smoke-tests #to_a (FAILED - 2)
    tests each #to_a element

Failures:

  1) 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
     # ./tasks/2016/04/spec.rb:522:in `block (3 levels) in <top (required)>'

  2) spec Version::Range smoke-tests #to_a
     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
           def to_a
             []
           end
             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
     # ./tasks/2016/04/spec.rb:532:in `block (3 levels) in <top (required)>'

Finished in 1 minute 55.79 seconds (files took 4.62 seconds to load)
19 examples, 2 failures

Failed examples:

rspec ./tasks/2016/04/spec.rb:515 # spec Version::Range tests include? with versions lower than the start one
rspec ./tasks/2016/04/spec.rb:525 # spec Version::Range smoke-tests #to_a