min2phase 0.2.4

An optimized implementation of two-phase algorithm for solving Rubik's cube
Documentation
use min2phase::{random_cube, random_moves, from_moves, apply_moves, solve};
use std::time::Instant;

const MAX_SOL_LEN: u8 = 20;
const N_TEST: u32 = 1000;

#[test]
fn random_move_solve() {
	let now = Instant::now();
	let n_moves = 100;
	for _ in 0..N_TEST {
		let scramble: String = random_moves(n_moves);
		assert!(scramble.len() == (n_moves as usize * 3));
		if let Some(cube) = from_moves(&scramble) {
			let solution = solve(&cube, MAX_SOL_LEN);
			if let Some(solved_cubie) = apply_moves(&cube, &solution) {
				assert!(solved_cubie == "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB");
			} else {
				assert!(false);
			}
		} else {
			println!("scramble={}", scramble);
			println!("move parse error!!");
			assert!(false);
		}
	}
	let elapsed = now.elapsed() / N_TEST;
	println!("Random move solve avg: {:.3?}", elapsed);
}

#[test]
fn random_state_solve() {
	let now = Instant::now();
	for _ in 0..N_TEST {
		let cube = random_cube();
		let solution = solve(&cube, MAX_SOL_LEN);
		if let Some(solved_cubie) = apply_moves(&cube, &solution) {
			assert!(solved_cubie == "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB");
		} else {
			assert!(false);
		}
	}
	let elapsed = now.elapsed() / N_TEST;
	println!("Random state solve avg: {:.3?}", elapsed);
}