cubing_core 0.14.4

Features from `cubing.js` in Rust.
Documentation
use std::collections::HashMap;

use cubing_core::{
    alg::Alg,
    kpuzzle::{
        InvalidAlgError, InvalidDefinitionError, KPatternData, KPatternOrbitData, KPuzzle,
        KPuzzleDefinition, KPuzzleOrbitDefinition, KTransformationData, KTransformationOrbitData,
    },
    puzzles::{cube2x2x2_kpuzzle, cube3x3x3_kpuzzle},
};

#[test]
fn it_works() -> Result<(), InvalidAlgError> {
    let kpuzzle = cube3x3x3_kpuzzle();
    assert_eq!(
        &kpuzzle.transformation_from_alg(&("R U R' F' U2").parse::<Alg>()?)?,
        &kpuzzle.transformation_from_alg(&("(L' U' L F U2')'").parse::<Alg>()?)?,
    );
    assert_ne!(
        &kpuzzle.transformation_from_alg(&("(R U R' U)5").parse::<Alg>()?)?,
        &kpuzzle.transformation_from_alg(&("").parse::<Alg>()?)?
    );
    assert_eq!(
        &kpuzzle
            .default_pattern()
            .apply_alg(&("(R U R' U)5").parse::<Alg>()?)?,
        &kpuzzle.default_pattern().apply_alg(&("").parse::<Alg>()?)?
    );

    Ok(())
}

#[test]
fn test_2x2x2() -> Result<(), InvalidAlgError> {
    let kpuzzle = cube2x2x2_kpuzzle();
    assert_eq!(
        kpuzzle.transformation_from_alg(&("z").parse::<Alg>()?)?,
        kpuzzle.transformation_from_alg(&("[x: y]").parse::<Alg>()?)?,
    );
    assert_eq!(
        kpuzzle.transformation_from_alg(&("L").parse::<Alg>()?)?,
        kpuzzle.transformation_from_alg(&("x' R").parse::<Alg>()?)?
    );
    Ok(())
}

#[test]
fn avoids_recursion() -> Result<(), InvalidDefinitionError> {
    let def = KPuzzleDefinition {
        name: "uh-oh".to_owned(),
        orbits: vec![KPuzzleOrbitDefinition {
            orbit_name: "SOLVE_ORBIT".into(),
            num_pieces: 2,
            num_orientations: 1,
        }],
        default_pattern: (KPatternData::from([(
            "SOLVE_ORBIT".into(),
            KPatternOrbitData {
                pieces: vec![1, 0],
                orientation: vec![0; 2],
                orientation_mod: None,
            },
        )])),
        moves: HashMap::from([(
            "A".try_into().unwrap(),
            (KTransformationData::from([(
                "SOLVE_ORBIT".into(),
                KTransformationOrbitData {
                    permutation: vec![1, 0],
                    orientation_delta: vec![0; 2],
                },
            )])),
        )]),
        derived_moves: Some(HashMap::from([
            ("B".try_into().unwrap(), "C".try_into().unwrap()),
            ("C".try_into().unwrap(), "A B".try_into().unwrap()),
        ])),
    };
    assert!(KPuzzle::try_new(def)
        .expect_err("Expected recursive KPuzzle to fail instantiation.")
        .description
        .starts_with("Recursive derived move definition for: "));
    Ok(())
}