spec/ruby-measurement/measurement_spec.rb in ruby-measurement-1.2.2 vs spec/ruby-measurement/measurement_spec.rb in ruby-measurement-1.2.3
- old
+ new
@@ -1,339 +1,373 @@
+# encoding: UTF-8
+
require 'spec_helper'
RSpec.describe Measurement do
subject { described_class }
-
+
describe '.new' do
describe 'with valid quantity' do
it 'sets the quantity' do
expect(subject.new(3).quantity).to eq 3
end
-
+
it 'sets the default unit' do
expect(subject.new(3).unit).to eq subject::Unit[:count]
end
end
-
+
describe 'with valid quantity and unit name' do
it 'sets the quantity' do
expect(subject.new(2, :dozen).quantity).to eq 2
end
-
+
it 'sets the unit' do
expect(subject.new(2, :dozen).unit).to eq subject::Unit[:dozen]
end
end
-
+
describe 'with valid quantity and unit' do
it 'sets the quantity' do
expect(subject.new(2, subject::Unit[:dozen]).quantity).to eq 2
end
-
+
it 'sets the unit' do
expect(subject.new(2, subject::Unit[:dozen]).unit).to eq subject::Unit[:dozen]
end
end
-
+
describe 'with invalid quantity' do
it 'raises exception' do
expect { subject.new('hi') }.to raise_exception
end
end
-
+
describe 'with invalid unit' do
it 'raises exception' do
expect { subject.new(3, :finklebaum) }.to raise_exception
end
end
end
-
+
describe '.parse' do
describe 'quantity' do
it 'parses scientific notation' do
m = subject.parse('4.3e12')
expect(m.quantity).to eq 4.3e12
expect(m.unit).to eq Measurement::Unit[:count]
-
+
m = subject.parse('4.3e12 dozen')
expect(m.quantity).to eq 4.3e12
expect(m.unit).to eq Measurement::Unit[:dozen]
-
+
m = subject.parse('4.3e12doz')
expect(m.quantity).to eq 4.3e12
expect(m.unit).to eq Measurement::Unit[:dozen]
end
-
+
it 'parses fractions' do
m = subject.parse('1/4')
expect(m.quantity).to eq 0.25
expect(m.unit).to eq Measurement::Unit[:count]
-
+
m = subject.parse('1/4 dozen')
expect(m.quantity).to eq 0.25
expect(m.unit).to eq Measurement::Unit[:dozen]
-
+
m = subject.parse('1/4doz')
expect(m.quantity).to eq 0.25
expect(m.unit).to eq Measurement::Unit[:dozen]
end
-
+
it 'parses mixed fractions' do
m = subject.parse('3 2/5')
expect(m.quantity).to eq 3.4
expect(m.unit).to eq Measurement::Unit[:count]
-
+
m = subject.parse('3 2/5 dozen')
expect(m.quantity).to eq 3.4
expect(m.unit).to eq Measurement::Unit[:dozen]
-
- m = subject.parse('3 2/5')
- expect(m.quantity).to eq 3.4
+ end
+
+ it 'parses fractions with special characters' do
+ m = subject.parse('⅜')
+ expect(m.quantity).to eq 0.375
expect(m.unit).to eq Measurement::Unit[:count]
+
+ m = subject.parse('⅜ dozen')
+ expect(m.quantity).to eq 0.375
+ expect(m.unit).to eq Measurement::Unit[:dozen]
+
+ m = subject.parse('⅜doz')
+ expect(m.quantity).to eq 0.375
+ expect(m.unit).to eq Measurement::Unit[:dozen]
end
-
+
+ it 'parses mixed fractions with special characters' do
+ m = subject.parse('3⅜')
+ expect(m.quantity).to eq 3.375
+ expect(m.unit).to eq Measurement::Unit[:count]
+
+ m = subject.parse('3 ⅜')
+ expect(m.quantity).to eq 3.375
+ expect(m.unit).to eq Measurement::Unit[:count]
+
+ m = subject.parse('3⅜ dozen')
+ expect(m.quantity).to eq 3.375
+ expect(m.unit).to eq Measurement::Unit[:dozen]
+
+ m = subject.parse('3 ⅜ dozen')
+ expect(m.quantity).to eq 3.375
+ expect(m.unit).to eq Measurement::Unit[:dozen]
+
+ m = subject.parse('3⅜doz')
+ expect(m.quantity).to eq 3.375
+ expect(m.unit).to eq Measurement::Unit[:dozen]
+ end
+
it 'parses decimals' do
m = subject.parse('2.1')
expect(m.quantity).to eq 2.1
expect(m.unit).to eq Measurement::Unit[:count]
-
+
m = subject.parse('2.1 dozen')
expect(m.quantity).to eq 2.1
expect(m.unit).to eq Measurement::Unit[:dozen]
-
+
m = subject.parse('2.1doz')
expect(m.quantity).to eq 2.1
expect(m.unit).to eq Measurement::Unit[:dozen]
end
end
-
+
describe 'unit' do
it 'converts when defined' do
expect(subject.parse('3 dozen').unit).to eq Measurement::Unit[:dozen]
end
-
+
it 'raises exception when undefined' do
expect { subject.parse('3 finklebaums') }.to raise_error
end
end
end
-
+
describe '.define' do
it 'delegates to Unit.define' do
expect(Measurement::Unit).to receive(:define)
subject.define(:something)
end
end
-
+
describe '#convert_to' do
let(:measurement) { subject.new(3) }
-
+
it 'returns copy of self when target unit matches current unit' do
result = measurement.convert_to(:count)
expect(result).to_not be measurement
expect(result).to eq measurement
end
-
+
it 'returns target unit if it exists and is convertable' do
result = measurement.convert_to(:dozen)
expect(result.quantity).to eq 0.25
expect(result.unit).to eq Measurement::Unit[:dozen]
end
-
+
it 'raises exception if unit exists and is not convertable' do
expect { measurement.convert_to(:inches) }.to raise_error
end
-
+
it 'raises exception if unit does not exist' do
expect { measurement.convert_to(:finklebaum) }.to raise_error
end
end
-
+
describe '#convert_to!' do
let(:measurement) { subject.new(3) }
-
+
it 'modifies the object' do
measurement.convert_to!(:dozen)
expect(measurement.quantity).to eq 0.25
expect(measurement.unit).to eq Measurement::Unit[:dozen]
end
end
-
+
describe '#+' do
let(:measurement) { subject.new(3) }
-
+
it 'adds numeric values' do
result = measurement + 4
expect(result.quantity).to eq 7
expect(result.unit).to eq measurement.unit
end
-
+
it 'adds units of the same type' do
other = subject.new(4)
expect(other.unit).to eq measurement.unit
-
+
result = measurement + other
expect(result.quantity).to eq 7
expect(result.unit).to eq measurement.unit
end
-
+
it 'adds units of a convertable type' do
other = subject.new(2, :dozen)
expect(other.unit).to_not eq measurement.unit
-
+
result = measurement + other
expect(result.quantity).to eq 27
expect(result.unit).to eq measurement.unit
end
-
+
it 'raises exception for incompatible units' do
other = subject.new(4, :inches)
expect(other.unit).to_not eq measurement.unit
expect { measurement + other }.to raise_error
end
end
-
+
describe '#-' do
let(:measurement) { subject.new(3) }
-
+
it 'subtracts numeric values' do
result = measurement - 4
expect(result.quantity).to eq -1
expect(result.unit).to eq measurement.unit
end
-
+
it 'subtracts units of the same type' do
other = subject.new(4)
expect(other.unit).to eq measurement.unit
-
+
result = measurement - other
expect(result.quantity).to eq -1
expect(result.unit).to eq measurement.unit
end
-
+
it 'subtracts units of a convertable type' do
other = subject.new(2, :dozen)
expect(other.unit).to_not eq measurement.unit
-
+
result = measurement - other
expect(result.quantity).to eq -21
expect(result.unit).to eq measurement.unit
end
-
+
it 'raises exception for incompatible units' do
other = subject.new(4, :inches)
expect(other.unit).to_not eq measurement.unit
expect { measurement - other }.to raise_error
end
end
-
+
describe '#*' do
let(:measurement) { subject.new(3) }
-
+
it 'multiplies numeric values' do
result = measurement * 4
expect(result.quantity).to eq 12
expect(result.unit).to eq measurement.unit
end
-
+
it 'multiplies units of the same type' do
other = subject.new(4)
expect(other.unit).to eq measurement.unit
-
+
result = measurement * other
expect(result.quantity).to eq 12
expect(result.unit).to eq measurement.unit
end
-
+
it 'multiplies units of a convertable type' do
other = subject.new(2, :dozen)
expect(other.unit).to_not eq measurement.unit
-
+
result = measurement * other
expect(result.quantity).to eq 72
expect(result.unit).to eq measurement.unit
end
-
+
it 'raises exception for incompatible units' do
other = subject.new(4, :inches)
expect(other.unit).to_not eq measurement.unit
expect { measurement * other }.to raise_error
end
end
-
+
describe '#/' do
let(:measurement) { subject.new(12) }
-
+
it 'divides numeric values' do
result = measurement / 4
expect(result.quantity).to eq 3
expect(result.unit).to eq measurement.unit
end
-
+
it 'divides units of the same type' do
other = subject.new(4)
expect(other.unit).to eq measurement.unit
-
+
result = measurement / other
expect(result.quantity).to eq 3
expect(result.unit).to eq measurement.unit
end
-
+
it 'divides units of a convertable type' do
other = subject.new(1, :dozen)
expect(other.unit).to_not eq measurement.unit
-
+
result = measurement / other
expect(result.quantity).to eq 1
expect(result.unit).to eq measurement.unit
end
-
+
it 'raises exception for incompatible units' do
other = subject.new(4, :inches)
expect(other.unit).to_not eq measurement.unit
expect { measurement / other }.to raise_error
end
end
-
+
describe '#**' do
let(:measurement) { subject.new(3) }
-
+
it 'raises to the power of numeric values' do
expect((measurement ** 3).quantity).to eq 27
end
-
+
it 'raises exception for non-numeric values' do
expect { measurement ** subject.new(3) }.to raise_error
end
end
-
+
describe '#==' do
let(:measurement) { subject.new(3) }
-
+
it 'returns true for measurements with same quantity and unit' do
expect(measurement == subject.new(3)).to be true
end
-
+
it 'returns false for measurements with same quantity and different unit' do
expect(measurement == subject.new(3, :dozen)).to be false
end
-
+
it 'returns false for measurements with same unit and different quantity' do
expect(measurement == subject.new(4)).to be false
end
-
+
it 'returns false for non-measurement objects' do
expect(measurement == 3).to be false
end
end
-
+
describe '#to_s' do
it 'returns the quantity and unit' do
expect(subject.new(3.5).to_s).to eq '3.5 count'
expect(subject.new(2, :dozen).to_s).to eq '2 doz'
end
end
-
+
describe '#inspect' do
it 'returns the quantity and unit' do
expect(subject.new(3.5).inspect).to eq '3.5 count'
expect(subject.new(2, :dozen).inspect).to eq '2 doz'
end