#[macro_use]
extern crate permutation_rs;

use std::collections::HashMap;
use permutation_rs::group::{Group, GroupElement, Morphism};
use permutation_rs::group::special::SLPPermutation;
use permutation_rs::group::tree::SLP;
use permutation_rs::group::free::Word;
use permutation_rs::group::permutation::Permutation;

#[test]
fn check_returned_word() {
    let group = s6();

    let element = SLPPermutation::new(
        SLP::Identity,
        permute!(
            0, 1,
            1, 0,
            2, 5,
            3, 4,
            4, 3,
            5, 2
        ),
    );

    let stripped = group.strip(element);

    let morphism = morphism!(0, 't', 1, 'r');


    assert!(stripped.element.1.is_identity());
    assert_eq!(stripped.transform(&morphism).inverse(), Word::new(vec![('r', 4), ('t', 1), ('r', -5), ('t', -1), ('r', 2), ('t', -1), ('r', 1), ('t', -1), ('r', -3), ('t', 1), ('r', 5), ('t', 1), ('r', -3), ('t', -1), ('r', -1), ('t', 1), ('r', 1), ('t', 1), ('r', 3), ('t', 1), ('r', -2), ('t', 1)]));
}

fn s6() -> Group<u64, SLPPermutation> {
    let transposition = SLPPermutation::new(
        SLP::Generator(0),
        permute!(
            0, 1,
            1, 0,
            2, 2,
            3, 3,
            4, 4,
            5, 5
        ),
    );

    let rotation = SLPPermutation::new(
        SLP::Generator(1),
        permute!(
            0, 1,
            1, 2,
            2, 3,
            3, 4,
            4, 5,
            5, 0
        ),
    );

    let gset = vec!(0u64, 1u64, 2u64, 3u64, 4u64, 5u64);
    let generators = vec!(transposition, rotation);

    Group::new(gset, generators)
}