spec/csolve_spec.rb in congruence_solver-0.3.1 vs spec/csolve_spec.rb in congruence_solver-0.3.2

- old
+ new

@@ -1,89 +1,99 @@ -require "polynomial_interpreter" - -RSpec.describe PolynomialInterpreter do - describe "::read_congruence" do - context "when input contains no '\='" do - it "raises an ArgumentError" do - not_congruence = "x^2 (mod 5)" - expect {PolynomialInterpreter.read_congruence not_congruence}.to raise_error ArgumentError, "congruence invalid" - end - end - - context "when input contains no mod" do - it "raises an ArgumentError" do - not_congruence = "x^2 = 3" - expect {PolynomialInterpreter.read_congruence not_congruence}.to raise_error ArgumentError, "congruence invalid" - end - end - - context "when input contains an invalid mod" do - it "raises an ArgumentError" do - not_congruence = "x = 5 (mod)" - expect {PolynomialInterpreter.read_congruence not_congruence}.to raise_error ArgumentError, "congruence invalid" - end - end - - context "when lhs is empty" do - it "raises an ArgumentError" do - congruence = "= 3 (mod 4)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" - end - end - - context "when lhs contains invalid characters" do - it "raises an ArgumentError" do - congruence = "x! = 3 (mod 5)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" - end - end - - context "when lhs contains more than one distinct variables" do - it "raises an ArgumentError" do - congruence = "x^2 + y = 0 (mod 6)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" - end - end - - context "when lhs contains negative power" do - it "raises an ArgumentError" do - congruence = "x^-1 = 2 (mod 35)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" - end - end - - context "when rhs is empty" do - it "raises an ArgumentError" do - congruence = "x^3 = (mod 4)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" - end - end - - context "when rhs contains invalid characters" do - it "raises an ArgumentError" do - congruence = "3 = x! (mod 5)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" - end - end - - context "when rhs contains more than one distinct variables" do - it "raises an ArgumentError" do - congruence = "0 = x^2 + y (mod 6)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" - end - end - - context "when rhs contains negative power" do - it "raises an ArgumentError" do - congruence = "2 = x^-1 (mod 35)" - expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" - end - end - - context "when input is a valid polynomial congruence" do - it "formats congruence as a single polynomial congruent to 0" do - congruence = "45x^5 + 5 + 3x ^6 + 5x^2 + x + 3x^5=x^9 + 9 x (mod 16)" - expect( PolynomialInterpreter.read_congruence(congruence)).to eq [[-1, 0, 0, 3, 48, 0, 0, 5, -8, 5].reverse, 16] - end - end - end -end \ No newline at end of file +require "polynomial_interpreter" + +RSpec.describe PolynomialInterpreter do + describe "::read_congruence" do + context "when input contains no '\='" do + it "raises an ArgumentError" do + not_congruence = "x^2 (mod 5)" + expect {PolynomialInterpreter.read_congruence not_congruence}.to raise_error ArgumentError, "congruence invalid" + end + end + + context "when input contains no mod" do + it "raises an ArgumentError" do + not_congruence = "x^2 = 3" + expect {PolynomialInterpreter.read_congruence not_congruence}.to raise_error ArgumentError, "congruence invalid" + end + end + + context "when input contains an invalid mod" do + it "raises an ArgumentError" do + not_congruence = "x = 5 (mod)" + expect {PolynomialInterpreter.read_congruence not_congruence}.to raise_error ArgumentError, "congruence invalid" + end + end + + context "when lhs is empty" do + it "raises an ArgumentError" do + congruence = "= 3 (mod 4)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" + end + end + + context "when lhs contains invalid characters" do + it "raises an ArgumentError" do + congruence = "x! = 3 (mod 5)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" + end + end + + context "when lhs contains more than one distinct variables" do + it "raises an ArgumentError" do + congruence = "x^2 + y = 0 (mod 6)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" + end + end + + context "when lhs contains negative power" do + it "raises an ArgumentError" do + congruence = "x^-1 = 2 (mod 35)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "lhs polynomial invalid" + end + end + + context "when rhs is empty" do + it "raises an ArgumentError" do + congruence = "x^3 = (mod 4)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" + end + end + + context "when rhs contains invalid characters" do + it "raises an ArgumentError" do + congruence = "3 = x! (mod 5)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" + end + end + + context "when rhs contains more than one distinct variables" do + it "raises an ArgumentError" do + congruence = "0 = x^2 + y (mod 6)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" + end + end + + context "when rhs contains negative power" do + it "raises an ArgumentError" do + congruence = "2 = x^-1 (mod 35)" + expect {PolynomialInterpreter.read_congruence congruence}.to raise_error ArgumentError, "rhs polynomial invalid" + end + end + + context "when input is a valid polynomial congruence" do + it "formats congruence as a single polynomial congruent to 0" do + congruence = "45x^5 + 5 + 3x ^6 + 5x^2 + x + 3x^5=x^9 + 9 x (mod 16)" + expect( PolynomialInterpreter.read_congruence(congruence)).to eq [[-1, 0, 0, 3, 48, 0, 0, 5, -8, 5].reverse, 16] + end + end + + context "when coefficient is negative" do + it "reads the coefficient as engative" do + congruence = "x^2 - 2x + 1 = 0 mod 15" + expect( PolynomialInterpreter.read_congruence(congruence) ).to eq [[1,-2,1], 15] + + congruence = "-x^4 = 0 mod 3" + expect(PolynomialInterpreter.read_congruence congruence).to eq [[-1,0,0,0,0].reverse, 3] + end + end + end +end