spec/calculator_spec.rb in dentaku-3.0.0 vs spec/calculator_spec.rb in dentaku-3.1.0
- old
+ new
@@ -1,11 +1,13 @@
require 'spec_helper'
require 'dentaku'
describe Dentaku::Calculator do
- let(:calculator) { described_class.new }
- let(:with_memory) { described_class.new.store(apples: 3) }
+ let(:calculator) { described_class.new }
+ let(:with_memory) { described_class.new.store(apples: 3) }
+ let(:with_aliases) { described_class.new(aliases: { round: ['rrround'] }) }
+ let(:without_nested_data) { described_class.new(nested_data_support: false) }
it 'evaluates an expression' do
expect(calculator.evaluate('7+3')).to eq(10)
expect(calculator.evaluate('2 -1')).to eq(1)
expect(calculator.evaluate('-1 + 2')).to eq(1)
@@ -30,10 +32,11 @@
expect(calculator.evaluate('15 % 8')).to eq(7)
expect(calculator.evaluate('(((695759/735000)^(1/(1981-1991)))-1)*1000').round(4)).to eq(5.5018)
expect(calculator.evaluate('0.253/0.253')).to eq(1)
expect(calculator.evaluate('0.253/d', d: 0.253)).to eq(1)
expect(calculator.evaluate('10 + x', x: 'abc')).to be_nil
+ expect(calculator.evaluate('x * y', x: '.123', y: '100')).to eq(12.3)
expect(calculator.evaluate('a/b', a: '10', b: '2')).to eq(5)
expect(calculator.evaluate('t + 1*24*60*60', t: Time.local(2017, 1, 1))).to eq(Time.local(2017, 1, 2))
expect(calculator.evaluate("2 | 3 * 9")).to eq (27)
expect(calculator.evaluate("2 & 3 * 9")).to eq (2)
end
@@ -63,21 +66,25 @@
calculator.store_formula('area', 'length * width')
expect(calculator.evaluate!('area', length: 5, width: 5)).to eq 25
end
it 'stores nested hashes' do
- calculator.store({a: {basket: {of: 'apples'}}, b: 2})
+ calculator.store(a: {basket: {of: 'apples'}}, b: 2)
expect(calculator.evaluate!('a.basket.of')).to eq 'apples'
expect(calculator.evaluate!('b')).to eq 2
end
it 'stores arrays' do
- calculator.store({a: [1, 2, 3]})
+ calculator.store(a: [1, 2, 3])
expect(calculator.evaluate!('a[0]')).to eq 1
expect(calculator.evaluate!('a[x]', x: 1)).to eq 2
expect(calculator.evaluate!('a[x+1]', x: 1)).to eq 3
end
+
+ it 'evalutates arrays' do
+ expect(calculator.evaluate([1, 2, 3])).to eq([1, 2, 3])
+ end
end
describe 'dependencies' do
it "finds dependencies in a generic statement" do
expect(calculator.dependencies("bob + dole / 3")).to eq(['bob', 'dole'])
@@ -90,10 +97,14 @@
end
it "doesn't consider variables in memory as dependencies" do
expect(with_memory.dependencies("apples + oranges")).to eq(['oranges'])
end
+
+ it "finds no dependencies in array literals" do
+ expect(calculator.dependencies([1, 2, 3])).to eq([])
+ end
end
describe 'solve!' do
it "evaluates properly with variables, even if some in memory" do
expect(with_memory.solve!(
@@ -284,11 +295,11 @@
it 'include ROUND' do
expect(calculator.evaluate('round(8.2)')).to eq(8)
expect(calculator.evaluate('round(8.8)')).to eq(9)
expect(calculator.evaluate('round(8.75, 1)')).to eq(BigDecimal.new('8.8'))
- expect(calculator.evaluate('ROUND(apples * 0.93)', { apples: 10 })).to eq(9)
+ expect(calculator.evaluate('ROUND(apples * 0.93)', apples: 10)).to eq(9)
end
it 'include NOT' do
expect(calculator.evaluate('NOT(some_boolean)', some_boolean: true)).to be_falsey
expect(calculator.evaluate('NOT(some_boolean)', some_boolean: false)).to be_truthy
@@ -481,15 +492,15 @@
before do
allow(Dentaku).to receive(:cache_ast?) { true }
end
it 'disables the AST cache' do
- expect(calculator.disable_cache{ |c| c.cache_ast? }).to be false
+ expect(calculator.disable_cache { |c| c.cache_ast? }).to be false
end
it 'calculates normally' do
- expect(calculator.disable_cache{ |c| c.evaluate("2 + 2") }).to eq(4)
+ expect(calculator.disable_cache { |c| c.evaluate("2 + 2") }).to eq(4)
end
end
describe 'clear_cache' do
before do
@@ -535,8 +546,30 @@
describe 'zero-arity functions' do
it 'can be used in formulas' do
calculator.add_function(:two, :numeric, -> { 2 })
expect(calculator.evaluate("max(two(), 1)")).to eq 2
expect(calculator.evaluate("max(1, two())")).to eq 2
+ end
+ end
+
+ describe 'aliases' do
+ it 'accepts aliases as instance option' do
+ expect(with_aliases.evaluate('rrround(5.1)')).to eq 5
+ end
+ end
+
+ describe 'nested_data' do
+ it 'default to nested data enabled' do
+ expect(calculator.nested_data_support).to be_truthy
+ end
+
+ it 'allow opt out of nested data support' do
+ expect(without_nested_data.nested_data_support).to be_falsy
+ end
+
+ it 'should allow optout of nested hash' do
+ expect do
+ without_nested_data.solve!('a.b.c')
+ end.to raise_error(Dentaku::UnboundVariableError)
end
end
end