Skip to content

Instantly share code, notes, and snippets.

@dylanerichards
Last active December 31, 2015 21:55
Show Gist options
  • Select an option

  • Save dylanerichards/02f22e03333041accd46 to your computer and use it in GitHub Desktop.

Select an option

Save dylanerichards/02f22e03333041accd46 to your computer and use it in GitHub Desktop.
require "mathn"
module Calculator
extend self
def call(expression)
eval(sanitize(expression)).to_f
end
private
def sanitize(expression)
# Remove non-numeric and non-operational characters
expression.gsub(/[^()*+\-\/0-9]/, '')
end
end
require_relative "../lib/calculator"
describe Calculator do
let(:calculator) { described_class }
it "adds" do
expect(calculator.("1 + 1")).to eq 2
end
it "subracts" do
expect(calculator.("1 - 1")).to eq 0
end
it "multiplies" do
expect(calculator.("1 * 1")).to eq 1
end
it "divides" do
expect(calculator.("5 / 2")).to eq 2.5
end
it "understands order of operations" do
expect(calculator.("5 + 3 / 2")).to eq 6.5
end
it "evaluates parentheses first" do
expect(calculator.("(5 + 3) / 2")).to eq 4
end
it "evaluates exponents second" do
expect(calculator.("(5 + 3) / 2 ** 2")).to eq 2
end
it 'disregards non-numeric and non-operational characters' do
expect(calculator.("2abc + 1abc")).to eq 3
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment