@testset "FPGroups" begin A = Alphabet([:a, :A, :b, :B, :c, :C], [2,1,4,3,6,5]) @test FreeGroup(A) isa FreeGroup @test sprint(show, FreeGroup(A)) == "free group on 3 generators" F = FreeGroup([:a, :b, :c], A) @test sprint(show, F) == "free group on 3 generators" a,b,c = gens(F) @test c*b*a isa FPGroupElement # quotient of F: G = FPGroup(F, [a*b=>b*a, a*c=>c*a, b*c=>c*b]) @test G isa FPGroup @test sprint(show, G) == "⟨ a b c | \n\t a*b => b*a a*c => c*a b*c => c*b ⟩" @test rand(G) isa FPGroupElement f = a*c*b @test word(f) isa Word{UInt8} aG,bG,cG = gens(G) @test aG isa FPGroupElement @test_throws AssertionError aG == a @test word(aG) == word(a) g = aG*cG*bG @test_throws AssertionError f == g @test word(f) == word(g) @test word(g) == [1, 5, 3] Groups.normalform!(g) @test word(g) == [1, 3, 5] let g = aG*cG*bG # test that we normalize g before printing @test sprint(show, g) == "a*b*c" end # quotient of G H = FPGroup(G, [aG^2=>cG, bG*cG=>aG], maxrules=200) h = H(word(g)) @test h isa FPGroupElement @test_throws AssertionError h == g @test_throws MethodError h*g H′ = FPGroup(G, [aG^2=>cG, bG*cG=>aG], maxrules=200) @test_throws AssertionError one(H) == one(H′) Groups.normalform!(h) @test h == H([5]) @test_logs (:warn, "using generic isfiniteorder(::AbstractFPGroupElement): the returned `false` might be wrong") isfiniteorder(h) @test_logs (:warn, "using generic isfinite(::AbstractFPGroup): the returned `false` might be wrong") isfinite(H) Logging.with_logger(Logging.NullLogger()) do @testset "GroupsCore conformance: H" begin test_Group_interface(H) test_GroupElement_interface(rand(H, 2)...) end end end