require 'rails_helper' RSpec.describe UnitConversion::Conversion do def get_value_unit(value, units) UnitConversion.parse(value, units) end def get_number(number) UnitConversion::ParsedNumber.new(number) end def get_unit(unit) UnitConversion::ParsedUnit.new(unit) end describe UnitConversion::ScaleConversion do it 'scales' do expect(UnitConversion::ScaleConversion.new(get_number(2)).convert(get_value_unit(4, 'cups')).raw_value).to eq 8 expect(UnitConversion::ScaleConversion.new(get_number('1/2')).convert(get_value_unit(4, 'cups')).raw_value).to eq 2 end it 'leaves the unit alone' do expect(UnitConversion::ScaleConversion.new(get_number(2)).convert(get_value_unit(4, 'cups')).unit.original_unit).to eq 'cups' expect(UnitConversion::ScaleConversion.new(get_number(2)).convert(get_value_unit(4, 'cats')).unit.original_unit).to eq 'cats' end end describe UnitConversion::ConvertConversion do it 'converts standard units' do expect(UnitConversion::ConvertConversion.new(get_unit('tbsp')).convert(get_value_unit(1, 'cups')).raw_value).to eq 16 expect(UnitConversion::ConvertConversion.new(get_unit('cups')).convert(get_value_unit(8, 'tbsp')).raw_value).to eq 0.5 end it 'takes on the new unit' do expect(UnitConversion::ConvertConversion.new(get_unit('tbsp')).convert(get_value_unit(1, 'cups')).unit.original_unit).to eq 'tbsp' expect(UnitConversion::ConvertConversion.new(get_unit('gallons')).convert(get_value_unit(1, 'cups')).unit.original_unit).to eq 'gallons' end it 'converts from mass to volume' do expect(UnitConversion::ConvertConversion.new(get_unit('oz'), get_value_unit(5, 'oz/c')).convert(get_value_unit(2, 'cups')).raw_value).to be_within(0.01).of(10) end it 'converts from volume to mass' do expect(UnitConversion::ConvertConversion.new(get_unit('c'), get_value_unit(5, 'oz/c')).convert(get_value_unit(10, 'oz')).raw_value).to be_within(0.01).of(2) end it 'raises an error when attempting a mass/volume conversion without density' do expect { UnitConversion::ConvertConversion.new(get_unit('c')).convert(get_value_unit(10, 'oz')) }.to raise_error(UnitConversion::MissingDensityError) expect { UnitConversion::ConvertConversion.new(get_unit('oz')).convert(get_value_unit(10, 'c')) }.to raise_error(UnitConversion::MissingDensityError) end it 'raises an error when density param is not a density' do expect { UnitConversion::ConvertConversion.new(get_unit('oz'), get_value_unit(2, 'g/oz')) }.to raise_error(UnitConversion::UnknownUnitError) expect { UnitConversion::ConvertConversion.new(get_unit('oz'), get_value_unit(2, 'cats')) }.to raise_error(UnitConversion::UnknownUnitError) expect { UnitConversion::ConvertConversion.new(get_unit('oz'), get_value_unit(2, 'g')) }.to raise_error(UnitConversion::UnknownUnitError) end it 'preserves the formatter for standard units' do original = get_value_unit(10, 'tbsp') converted = UnitConversion::ConvertConversion.new(get_unit('c')).convert(original) expect(original.formatter).to be converted.formatter original = get_value_unit("10.0", 'tbsp') converted = UnitConversion::ConvertConversion.new(get_unit('c')).convert(original) expect(original.formatter).to be converted.formatter end it 'always sets the formatter to a DecimalFormatter for metric units' do original = get_value_unit(10, 'tbsp') expect(original.formatter).to be_a UnitConversion::RationalFormatter converted = UnitConversion::ConvertConversion.new(get_unit('ml')).convert(original) expect(converted.formatter).to be_a UnitConversion::DecimalFormatter end end end