spec/lib/danica/function_spec.rb in danica-2.0.3 vs spec/lib/danica/function_spec.rb in danica-2.0.4
- old
+ new
@@ -1,248 +1,251 @@
require 'spec_helper'
describe Danica::Function do
- module Danica
- class Function::Spatial < Function
- variables :time, :acceleration, :initial_space, :initial_velocity
- delegate :to_f, :to_tex, :to_gnu, to: :sum
-
- private
-
- def sum
- @sum ||= Sum.new(parcels)
- end
-
- def parcels
- [
- initial_space,
- spatial_velocity,
- spatial_acceleration
- ]
- end
-
- def spatial_velocity
- Product.new(initial_velocity, time)
- end
-
- def spatial_acceleration
- Division.new(Product.new(acceleration, time_squared), 2)
- end
-
- def time_squared
- Power.new(time, 2)
- end
- end
- end
-
- let(:variables) do
- {
- time: :t,
- acceleration: 'a',
- initial_space: { name: :S0, latex: 'S_0' },
- initial_velocity: { name: :V0, latex: 'V_0' }
- }
- end
-
- subject { described_class::Spatial.new(variables) }
-
- describe '#to_tex' do
- context 'when creating the spatial operator for constantly accelerated movement' do
- let(:expected) { 'S_0 + V_0 \cdot t + \frac{a \cdot t^{2}}{2}' }
-
- it 'return the latex format CAM' do
- expect(subject.to_tex).to eq(expected)
- end
- end
- end
-
- describe '#to_gnu' do
- context 'when creating the spatial operator for constantly accelerated movement' do
- let(:expected) { 'S0 + V0 * t + a * t**2/2' }
-
- it 'return the latex format CAM' do
- expect(subject.to_gnu).to eq(expected)
- end
- end
- end
-
- describe '#variables_hash' do
- let(:expected) do
+ describe 'spatial' do
+ let(:variables) do
{
- time: Danica::Variable.new(name: :t),
- acceleration: Danica::Variable.new(name: 'a'),
- initial_space: Danica::Variable.new( name: :S0, latex: 'S_0' ),
- initial_velocity: Danica::Variable.new( name: :V0, latex: 'V_0' )
+ time: :t,
+ acceleration: 'a',
+ initial_space: { name: :S0, latex: 'S_0' },
+ initial_velocity: { name: :V0, latex: 'V_0' }
}
end
- context 'when variables are already wrapped with DanicaVariable' do
- let(:variables) { expected }
- it 'returns a hash with the variabels' do
- expect(subject.variables_hash).to eq(expected)
- end
- end
+ subject { described_class::Spatial.new(variables) }
+ it_behaves_like 'an object that respond to basic_methods'
- context 'when variables have been defined with string name' do
- before do
- variables.change_keys!(&:to_s)
- end
+ describe '#to_tex' do
+ context 'when creating the spatial operator for constantly accelerated movement' do
+ let(:expected) { 'S_0 + V_0 \cdot t + \frac{a \cdot t^{2}}{2}' }
- it 'returns a hash with the variabels' do
- expect(subject.variables_hash).to eq(expected)
+ it 'return the latex format CAM' do
+ expect(subject.to_tex).to eq(expected)
+ end
end
end
- context 'when variables are not wrapped yet' do
- it 'returns a hash with the variabels' do
- expect(subject.variables_hash).to eq(expected)
+ describe '#to_gnu' do
+ context 'when creating the spatial operator for constantly accelerated movement' do
+ let(:expected) { 'S0 + V0 * t + a * t**2/2' }
+
+ it 'return the latex format CAM' do
+ expect(subject.to_gnu).to eq(expected)
+ end
end
end
- context 'when changing a variable' do
- before do
- subject.time = :x
- expected[:time] = Danica::Variable.new(name: :x)
+ describe '#variables_hash' do
+ let(:expected) do
+ {
+ time: Danica::Variable.new(name: :t),
+ acceleration: Danica::Variable.new(name: 'a'),
+ initial_space: Danica::Variable.new( name: :S0, latex: 'S_0' ),
+ initial_velocity: Danica::Variable.new( name: :V0, latex: 'V_0' )
+ }
end
- it do
- expect(subject.variables_hash).to eq(expected)
+ context 'when variables are already wrapped with DanicaVariable' do
+ let(:variables) { expected }
+ it 'returns a hash with the variabels' do
+ expect(subject.variables_hash).to eq(expected)
+ end
end
- end
- context 'when initializing with array' do
- context 'as hash' do
- let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
- subject { described_class::Spatial.new(variables) }
+ context 'when variables have been defined with string name' do
+ before do
+ variables.change_keys!(&:to_s)
+ end
it 'returns a hash with the variabels' do
expect(subject.variables_hash).to eq(expected)
end
end
- end
- context 'when initializing with sequence' do
- context 'as hash' do
- let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
- subject { described_class::Spatial.new(*variables, {}) }
-
+ context 'when variables are not wrapped yet' do
it 'returns a hash with the variabels' do
expect(subject.variables_hash).to eq(expected)
end
end
- end
- context 'when initializing with variables array' do
- context 'as hash' do
- let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
- subject { described_class::Spatial.new(variables: variables) }
+ context 'when changing a variable' do
+ before do
+ subject.time = :x
+ expected[:time] = Danica::Variable.new(name: :x)
+ end
- it 'returns a hash with the variabels' do
+ it do
expect(subject.variables_hash).to eq(expected)
end
end
- end
- end
- describe '#variables' do
- context 'when initialized with an array of variables' do
- subject { described_class::Spatial.new(variables: variables.values) }
- let(:expected) { variables.values.map { |v| subject.send(:wrap_value, v)} }
- it do
- expect(subject.variables.compact).to eq(expected)
+ context 'when initializing with array' do
+ context 'as hash' do
+ let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
+ subject { described_class::Spatial.new(variables) }
+
+ it 'returns a hash with the variabels' do
+ expect(subject.variables_hash).to eq(expected)
+ end
+ end
end
- end
- context 'when not initializing all variables' do
- subject { described_class::Spatial.new }
- let(:time) { Danica::Variable.new(name: :t) }
+ context 'when initializing with sequence' do
+ context 'as hash' do
+ let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
+ subject { described_class::Spatial.new(*variables, {}) }
- context 'when initialized with an empty variable set' do
- it do
- expect(subject.variables.compact).to be_empty
+ it 'returns a hash with the variabels' do
+ expect(subject.variables_hash).to eq(expected)
+ end
end
end
- context 'when changing a variable' do
- before do
- subject.time = time
+ context 'when initializing with variables array' do
+ context 'as hash' do
+ let(:variables) { [ :t, 'a', {name: :S0, latex: 'S_0'}, { name: :V0, latex: 'V_0' } ] }
+ subject { described_class::Spatial.new(variables: variables) }
+
+ it 'returns a hash with the variabels' do
+ expect(subject.variables_hash).to eq(expected)
+ end
end
+ end
+ end
- it 'returns the list of variables' do
- expect(subject.variables.compact).to eq([ time ])
+ describe '#variables' do
+ context 'when initialized with an array of variables' do
+ subject { described_class::Spatial.new(variables: variables.values) }
+ let(:expected) { variables.values.map { |v| subject.send(:wrap_value, v)} }
+ it do
+ expect(subject.variables.compact).to eq(expected)
end
end
- context 'when initializing with a variable set' do
- let(:names) { [ :t, :a, :s0, :v0 ] }
- subject { described_class::Spatial.new *names }
+ context 'when not initializing all variables' do
+ subject { described_class::Spatial.new }
+ let(:time) { Danica::Variable.new(name: :t) }
- it 'returns the variables given oin initialization' do
- expect(subject.variables.map(&:name)).to eq(names)
+ context 'when initialized with an empty variable set' do
+ it do
+ expect(subject.variables.compact).to be_empty
+ end
end
- context 'when initializing variables with a hash out of order' do
- let(:variables) do
- {
- initial_velocity: :v0,
- initial_space: :s0,
- acceleration: :a,
- time: :t
- }
+ context 'when changing a variable' do
+ before do
+ subject.time = time
end
- subject { described_class::Spatial.new variables }
- it 'returns the variables given on initialization' do
+ it 'returns the list of variables' do
+ expect(subject.variables.compact).to eq([ time ])
+ end
+ end
+
+ context 'when initializing with a variable set' do
+ let(:names) { [ :t, :a, :s0, :v0 ] }
+ subject { described_class::Spatial.new *names }
+
+ it 'returns the variables given oin initialization' do
expect(subject.variables.map(&:name)).to eq(names)
end
+
+ context 'when initializing variables with a hash out of order' do
+ let(:variables) do
+ {
+ initial_velocity: :v0,
+ initial_space: :s0,
+ acceleration: :a,
+ time: :t
+ }
+ end
+ subject { described_class::Spatial.new variables }
+
+ it 'returns the variables given on initialization' do
+ expect(subject.variables.map(&:name)).to eq(names)
+ end
+ end
end
end
end
- end
- describe '#calculate' do
- context 'when all variables have value' do
- let(:time_value) { 2 }
- let(:time) { time_value }
- let(:acceleration) { 3 }
- let(:initial_space) { 1 }
- let(:initial_velocity) { 1 }
- subject { described_class::Spatial.new(time, acceleration, initial_space, initial_velocity) }
- let(:expected) { initial_space + initial_velocity * time_value + acceleration * (time_value ** 2) / 2.0 }
+ describe '#calculate' do
+ context 'when all variables have value' do
+ let(:time_value) { 2 }
+ let(:time) { time_value }
+ let(:acceleration) { 3 }
+ let(:initial_space) { 1 }
+ let(:initial_velocity) { 1 }
+ subject { described_class::Spatial.new(time, acceleration, initial_space, initial_velocity) }
+ let(:expected) { initial_space + initial_velocity * time_value + acceleration * (time_value ** 2) / 2.0 }
- it 'retuirns the calculated value' do
- expect(subject.calculate).to eq(expected)
- end
+ it 'retuirns the calculated value' do
+ expect(subject.calculate).to eq(expected)
+ end
- context 'when not all variables have value' do
- let(:time) { :t }
+ context 'when not all variables have value' do
+ let(:time) { :t }
- it do
- expect { subject.calculate }.to raise_error(Danica::Exception::NotDefined)
- end
+ it do
+ expect { subject.calculate }.to raise_error(Danica::Exception::NotDefined)
+ end
- context 'but calling calculate with a value for the variables' do
- it 'calculate using the given value' do
- expect(subject.calculate(time_value)).to eq(expected)
+ context 'but calling calculate with a value for the variables' do
+ it 'calculate using the given value' do
+ expect(subject.calculate(time_value)).to eq(expected)
+ end
+
+ it 'does not change the values of then valued variables' do
+ expect do
+ subject.calculate(time_value)
+ end.not_to change(subject.time, :valued?)
+ end
end
- it 'does not change the values of then valued variables' do
- expect do
- subject.calculate(time_value)
- end.not_to change(subject.time, :valued?)
+ context 'when calling with a hash for the values' do
+ it 'calculate using the given value' do
+ expect(subject.calculate(time: time_value)).to eq(expected)
+ end
+
+ it 'does not change the values of then valued variables' do
+ expect do
+ subject.calculate(time: time_value)
+ end.not_to change(subject.time, :valued?)
+ end
end
end
+ end
+ end
+ end
- context 'when calling with a hash for the values' do
- it 'calculate using the given value' do
- expect(subject.calculate(time: time_value)).to eq(expected)
- end
+ describe 'gauss' do
+ let(:variables) do
+ {
+ x: :x,
+ median: :u,
+ variance_root: :v
+ }
+ end
- it 'does not change the values of then valued variables' do
- expect do
- subject.calculate(time: time_value)
- end.not_to change(subject.time, :valued?)
- end
+ subject { described_class::Gauss.new(variables) }
+ it_behaves_like 'an object that respond to basic_methods'
+
+ describe '#to_tex' do
+ context 'when creating the spatial operator for constantly accelerated movement' do
+ let(:expected) { '\frac{1}{\sqrt{6.283185307179586 \cdot v^{2}}} \cdot e^{-\frac{(x + -u)^{2}}{2 \cdot v^{2}}}' }
+
+ it 'return the latex format CAM' do
+ expect(subject.to_tex).to eq(expected)
+ end
+ end
+ end
+
+ describe '#to_gnu' do
+ context 'when creating the spatial operator for constantly accelerated movement' do
+ let(:expected) { '1/sqrt(6.283185307179586 * v**2) * exp(-(x + -u)**2/2 * v**2)' }
+
+ it 'return the latex format CAM' do
+ expect(subject.to_gnu).to eq(expected)
end
end
end
end
end