require "ruby_algebra" RSpec.configure do |config| config.expect_with :rspec do |expectations| expectations.include_chain_clauses_in_custom_matcher_descriptions = true end end RSpec.describe RubyAlgebra::Parser do describe "#parse" do it "returns nil for an empty string" do expect(RubyAlgebra::Parser.parse("")).to eq nil end it "returns Constant(a) for a" do [10, 100, 343843, 180.1, 777, 0.52242].each do |a| expect(RubyAlgebra::Parser.parse(a.to_s)).to eq RubyAlgebra::Constant.new(a) end end it "returns Variable(x) for x" do ["x", "y", "z", "coolVariable"].each do |x| expect(RubyAlgebra::Parser.parse(x)).to eq RubyAlgebra::Variable.new(x) end end it "returns Addition(Constant(5), Variable(x)) for 5 + x" do expect(RubyAlgebra::Parser.parse("5 + x")).to eq RubyAlgebra::Addition.new(RubyAlgebra::Constant.new(5), RubyAlgebra::Variable.new("x")) end it "returns Subtraction(Variable(z), Variable(h)) for z - h" do expect(RubyAlgebra::Parser.parse("z - h")).to eq RubyAlgebra::Subtraction.new(RubyAlgebra::Variable.new("z"), RubyAlgebra::Variable.new("h")) end it "returns Multiplication(Constant(5), Constant(8)) for 60 * 8" do expect(RubyAlgebra::Parser.parse("60 * 8")).to eq RubyAlgebra::Multiplication.new(RubyAlgebra::Constant.new(60), RubyAlgebra::Constant.new(8)) end it "returns Division(Constant(3), Variable(j)) for 3/j" do expect(RubyAlgebra::Parser.parse("3/j")).to eq RubyAlgebra::Division.new(RubyAlgebra::Constant.new(3), RubyAlgebra::Variable.new("j")) end it "returns Division(Constant(3), Variable(j)) for 3/j" do expect(RubyAlgebra::Parser.parse("3/j")).to eq RubyAlgebra::Division.new(RubyAlgebra::Constant.new(3), RubyAlgebra::Variable.new("j")) end it "returns Power(Constant(2), Constant(24)) for 2^24" do expect(RubyAlgebra::Parser.parse("2^24")).to eq RubyAlgebra::Power.new(RubyAlgebra::Constant.new(2), RubyAlgebra::Constant.new(24)) end it "returns Multiplication(Constant(-1), Variable(x)) for -x" do expect(RubyAlgebra::Parser.parse("-x")).to eq RubyAlgebra::Multiplication.new(RubyAlgebra::Constant.new(-1), RubyAlgebra::Variable.new("x")) end it "returns Variable(x) for +x" do expect(RubyAlgebra::Parser.parse("x")).to eq RubyAlgebra::Variable.new("x") end it "returns Addition(Addition(Constant(3), Constant(30)), Constant(300)) for 3 + 30 + 300" do expect(RubyAlgebra::Parser.parse("3 + 30 + 300")).to eq RubyAlgebra::Addition.new(RubyAlgebra::Addition.new(RubyAlgebra::Constant.new(3), RubyAlgebra::Constant.new(30)), RubyAlgebra::Constant.new(300)) end it "returns Power(Constant(10), Power(Constant(10), Constant(10))) for 10 ^ 10 ^ 10" do expect(RubyAlgebra::Parser.parse("10 ^ 10 ^ 10")).to eq RubyAlgebra::Power.new(RubyAlgebra::Constant.new(10), RubyAlgebra::Power.new(RubyAlgebra::Constant.new(10), RubyAlgebra::Constant.new(10))) end end end