diff --git a/src/NCRings.jl b/src/NCRings.jl index 24a9c40ede..3b082fab3e 100644 --- a/src/NCRings.jl +++ b/src/NCRings.jl @@ -83,13 +83,17 @@ end *(x::NCRingElement, y::NCRingElem) = parent(y)(x)*y +# general fallback for comparison of elements via promotion. +# This is different from Julia's existing promotion logic because +# it takes parents into account function ==(x::NCRingElem, y::NCRingElem) - fl, u, v = try_promote(x, y) - if fl - return u == v - else - return false - end + # avoid infinite recursion: we only get here if a ring type "forgot" to + # implement ==, so only do something if x and y have different type + if typeof(x) !== typeof(y) + fl, u, v = try_promote(x, y) + fl && return u == v + end + throw(NotImplementedError(:(==), x, y)) end ==(x::NCRingElem, y::NCRingElement) = x == parent(x)(y) diff --git a/test/generic/AbsSeries-test.jl b/test/generic/AbsSeries-test.jl index 67de078a50..fabf56cd37 100644 --- a/test/generic/AbsSeries-test.jl +++ b/test/generic/AbsSeries-test.jl @@ -90,13 +90,6 @@ end @test isa(l, Generic.AbsSeries) - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) - R, x = power_series_ring(ZZ, 30, "x", model=:capped_absolute) S, x = power_series_ring(ZZ, 30, "x", model=:capped_absolute) @test R === S diff --git a/test/generic/FactoredFraction-test.jl b/test/generic/FactoredFraction-test.jl index 1944a0d461..3e70bf9d35 100644 --- a/test/generic/FactoredFraction-test.jl +++ b/test/generic/FactoredFraction-test.jl @@ -218,12 +218,6 @@ end TT = factored_fraction_field(polynomial_ring(QQ, "x")[1]) a = TT(1) b = T(2) - - @test a in [a, b] - @test a in [b, a] - @test !(a in [b]) - @test a in keys(Dict(a => 1)) - @test !(b in keys(Dict(a => 1))) end @testset "Generic.FactoredFracFieldElem.printing" begin diff --git a/test/generic/Fraction-test.jl b/test/generic/Fraction-test.jl index bdfe96bcb1..21b559adf1 100644 --- a/test/generic/Fraction-test.jl +++ b/test/generic/Fraction-test.jl @@ -46,12 +46,6 @@ b = T(2) @test is_perfect(TT) - @test a in [a, b] - @test a in [b, a] - @test !(a in [b]) - @test a in keys(Dict(a => 1)) - @test !(b in keys(Dict(a => 1))) - # trivial rings can not be fields R = residue_ring(ZZ, 1)[1] @test is_trivial(R) diff --git a/test/generic/FreeAssociativeAlgebra-test.jl b/test/generic/FreeAssociativeAlgebra-test.jl index dad6935b0e..ec18a7d638 100644 --- a/test/generic/FreeAssociativeAlgebra-test.jl +++ b/test/generic/FreeAssociativeAlgebra-test.jl @@ -125,14 +125,6 @@ @test collect(exponent_words(varlist[1] + 1)) == [Int[1], Int[]] @test isone(varlist[1]^0) - - _, varlist = polynomial_ring(QQ, var_names) - y = varlist[1] - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) end end diff --git a/test/generic/FunctionField-test.jl b/test/generic/FunctionField-test.jl index 3afcb3219e..f617b675e1 100644 --- a/test/generic/FunctionField-test.jl +++ b/test/generic/FunctionField-test.jl @@ -74,13 +74,6 @@ P2 = [(x2 + 1)*z2 + (x2 + 2), z2 + (x2 + 1)//(x2 + 2), z2^2 + 3z2 + 1, @test !is_perfect(S2) @test var(S1) == :y1 - - @test y1 in [y1, y2] - @test y1 in [y2, y1] - @test !(y1 in [y2]) - - @test y1 in keys(Dict(y1 => 1)) - @test !(y2 in keys(Dict(y1 => 1))) end @testset "Generic.FunctionField.printing" begin diff --git a/test/generic/LaurentSeries-test.jl b/test/generic/LaurentSeries-test.jl index c3fa19df1c..674f4e2672 100644 --- a/test/generic/LaurentSeries-test.jl +++ b/test/generic/LaurentSeries-test.jl @@ -104,13 +104,6 @@ end l = T(t) @test isa(l, Generic.LaurentSeriesElem) - - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) R, x = laurent_series_ring(ZZ, 30, "x") RR, x = laurent_series_ring(ZZ, 30, "x") diff --git a/test/generic/MPoly-test.jl b/test/generic/MPoly-test.jl index a758dcdc91..84e52e6cdd 100644 --- a/test/generic/MPoly-test.jl +++ b/test/generic/MPoly-test.jl @@ -83,14 +83,6 @@ f3 = finish(C) @test f1 == f3 - - _, varlist = polynomial_ring(QQ, var_names) - y = varlist[1] - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) end R1, (x, y) = polynomial_ring(QQ, ["x", "y"]) diff --git a/test/generic/Matrix-test.jl b/test/generic/Matrix-test.jl index 59fa2f18a4..5e367264d6 100644 --- a/test/generic/Matrix-test.jl +++ b/test/generic/Matrix-test.jl @@ -308,9 +308,23 @@ end @test D4[5, 5] == R(5) @test D4 isa Generic.MatSpaceElem{elem_type(R)} + # test comparison of matrices over different ring, and of different sizes x = zero_matrix(R, 2, 2) y = zero_matrix(ZZ, 2, 3) + @test x != y + @test x in [x, y] + @test x in [y, x] + @test !(x in [y]) + + @test x in keys(Dict(x => 1)) + @test !(y in keys(Dict(x => 1))) + + # test comparison of matrices over same ring, but of different sizes + x = zero_matrix(ZZ, 2, 2) + y = zero_matrix(ZZ, 2, 3) + + @test x != y @test x in [x, y] @test x in [y, x] @test !(x in [y]) diff --git a/test/generic/Poly-test.jl b/test/generic/Poly-test.jl index 7a8bae24d4..51a533d3a5 100644 --- a/test/generic/Poly-test.jl +++ b/test/generic/Poly-test.jl @@ -95,13 +95,6 @@ end n = S([ZZ(1), ZZ(2), ZZ(3)]) @test isa(n, PolyRingElem) - - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) end @testset "Generic.Poly.constructors.varname" begin diff --git a/test/generic/PuiseuxSeries-test.jl b/test/generic/PuiseuxSeries-test.jl index 930946a89c..b9c1dcde0e 100644 --- a/test/generic/PuiseuxSeries-test.jl +++ b/test/generic/PuiseuxSeries-test.jl @@ -98,13 +98,6 @@ end l = T(t) @test isa(l, Generic.PuiseuxSeriesElem) - - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) end @testset "Generic.PuiseuxSeries.printing" begin diff --git a/test/generic/RationalFunctionField-test.jl b/test/generic/RationalFunctionField-test.jl index ed9827cb03..8d3b114609 100644 --- a/test/generic/RationalFunctionField-test.jl +++ b/test/generic/RationalFunctionField-test.jl @@ -40,12 +40,6 @@ end a = TT(1) b = T(2) - @test a in [a, b] - @test a in [b, a] - @test !(a in [b]) - @test a in keys(Dict(a => 1)) - @test !(b in keys(Dict(a => 1))) - # Multivariate T, (x, y) = rational_function_field(QQ, ["x", "y"]) diff --git a/test/generic/RelSeries-test.jl b/test/generic/RelSeries-test.jl index edb03b32f7..a7afc80297 100644 --- a/test/generic/RelSeries-test.jl +++ b/test/generic/RelSeries-test.jl @@ -99,13 +99,6 @@ end @test isa(l, Generic.RelSeries) - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) - @test_throws DomainError O(0+O(x^0)) @test !occursin("\n", sprint(show, T)) diff --git a/test/generic/Residue-test.jl b/test/generic/Residue-test.jl index 06054de76e..ebf94f9bcf 100644 --- a/test/generic/Residue-test.jl +++ b/test/generic/Residue-test.jl @@ -105,16 +105,6 @@ end k = T(1) @test isa(k, EuclideanRingResidueRingElem) - - S, = Generic.residue_ring(B, 164538890) - x = R(1) - y = S(1) - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) end @testset "EuclideanRingResidueRingElem.is_trivial" begin diff --git a/test/generic/ResidueField-test.jl b/test/generic/ResidueField-test.jl index 5429328468..e306a46cff 100644 --- a/test/generic/ResidueField-test.jl +++ b/test/generic/ResidueField-test.jl @@ -58,16 +58,6 @@ @test isa(g, EuclideanRingResidueFieldElem) - S, = Generic.residue_ring(B, 2) - x = R(1) - y = S(1) - @test x in [x, y] - @test x in [y, x] - @test !(x in [y]) - - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) - # trivial rings can not be fields @test_throws ArgumentError residue_field(ZZ, 1) R = residue_ring(ZZ, 1)[1] diff --git a/test/generic/UnivPoly-test.jl b/test/generic/UnivPoly-test.jl index 9c4249741d..bc3e891430 100644 --- a/test/generic/UnivPoly-test.jl +++ b/test/generic/UnivPoly-test.jl @@ -75,15 +75,6 @@ @test f1 == f3 - @test x in [x, y] - @test x in [y, x] - @test y in [y, z] - @test !(x in [y]) - @test !(y in [x]) - @test x in keys(Dict(x => 1)) - @test !(y in keys(Dict(x => 1))) - @test !(y in keys(Dict(z => 1))) - S2, x = universal_polynomial_ring(R, :x => 1:3; internal_ordering=ord) @test length(x) == 3