aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE4
-rw-r--r--Makefile26
-rw-r--r--README.md5
-rw-r--r--cube.c1520
-rw-r--r--cube.h95
-rw-r--r--test/000_basic/all.in0
-rw-r--r--test/000_basic/all.out7
-rw-r--r--test/000_basic/basic_tests.c33
-rw-r--r--test/001_cube_conversion/00_solved.in1
-rw-r--r--test/001_cube_conversion/00_solved.out1
-rw-r--r--test/001_cube_conversion/01_scrambled.in1
-rw-r--r--test/001_cube_conversion/01_scrambled.out1
-rw-r--r--test/001_cube_conversion/cube_conversion_tests.c27
-rw-r--r--test/010_math_permsign/00_solved.in8
-rw-r--r--test/010_math_permsign/00_solved.out1
-rw-r--r--test/010_math_permsign/01_3cycle.in6
-rw-r--r--test/010_math_permsign/01_3cycle.out1
-rw-r--r--test/010_math_permsign/02_22swap.in13
-rw-r--r--test/010_math_permsign/02_22swap.out1
-rw-r--r--test/010_math_permsign/03_singleswap.in7
-rw-r--r--test/010_math_permsign/03_singleswap.out1
-rw-r--r--test/010_math_permsign/04_5ycle.in11
-rw-r--r--test/010_math_permsign/04_5ycle.out1
-rw-r--r--test/010_math_permsign/05_6ycle.in9
-rw-r--r--test/010_math_permsign/05_6ycle.out1
-rw-r--r--test/010_math_permsign/permsgn_tests.c22
-rw-r--r--test/020_io_H48_read_write/00_garbage.in3
-rw-r--r--test/020_io_H48_read_write/00_garbage.out1
-rw-r--r--test/020_io_H48_read_write/01_solved_oneline.in1
-rw-r--r--test/020_io_H48_read_write/01_solved_oneline.out1
-rw-r--r--test/020_io_H48_read_write/02_solved_oneline_whitespace.in1
-rw-r--r--test/020_io_H48_read_write/02_solved_oneline_whitespace.out1
-rw-r--r--test/020_io_H48_read_write/03_solved_multiline.in9
-rw-r--r--test/020_io_H48_read_write/03_solved_multiline.out1
-rw-r--r--test/020_io_H48_read_write/04_unsolvable_ep.in1
-rw-r--r--test/020_io_H48_read_write/04_unsolvable_ep.out1
-rw-r--r--test/020_io_H48_read_write/05_unsolvable_eo.in1
-rw-r--r--test/020_io_H48_read_write/05_unsolvable_eo.out1
-rw-r--r--test/020_io_H48_read_write/06_unsolvable_cp.in1
-rw-r--r--test/020_io_H48_read_write/06_unsolvable_cp.out1
-rw-r--r--test/020_io_H48_read_write/07_unsolvable_co.in1
-rw-r--r--test/020_io_H48_read_write/07_unsolvable_co.out1
-rw-r--r--test/020_io_H48_read_write/08_unsolved.in6
-rw-r--r--test/020_io_H48_read_write/08_unsolved.out1
-rw-r--r--test/020_io_H48_read_write/io_H48_tests.c24
-rw-r--r--test/023_io_LST_write/01_solved.in1
-rw-r--r--test/023_io_LST_write/01_solved.out1
-rw-r--r--test/023_io_LST_write/02_scrambled.in1
-rw-r--r--test/023_io_LST_write/02_scrambled.out1
-rw-r--r--test/023_io_LST_write/io_LST_tests.c24
-rw-r--r--test/024_io_LST_read/01_solved.in1
-rw-r--r--test/024_io_LST_read/01_solved.out1
-rw-r--r--test/024_io_LST_read/02_scrambled.in1
-rw-r--r--test/024_io_LST_read/02_scrambled.out1
-rw-r--r--test/024_io_LST_read/io_LST_tests.c24
-rw-r--r--test/030_move/000_nomove_solved.in2
-rw-r--r--test/030_move/000_nomove_solved.out1
-rw-r--r--test/030_move/001_nomove_scrambled.in2
-rw-r--r--test/030_move/001_nomove_scrambled.out1
-rw-r--r--test/030_move/010_U_solved.in2
-rw-r--r--test/030_move/010_U_solved.out1
-rw-r--r--test/030_move/011_U_scrambled.in2
-rw-r--r--test/030_move/011_U_scrambled.out1
-rw-r--r--test/030_move/012_U_inverse.in2
-rw-r--r--test/030_move/012_U_inverse.out1
-rw-r--r--test/030_move/020_U2_solved.in2
-rw-r--r--test/030_move/020_U2_solved.out1
-rw-r--r--test/030_move/021_U2_scrambled.in2
-rw-r--r--test/030_move/021_U2_scrambled.out1
-rw-r--r--test/030_move/022_U2_inverse.in2
-rw-r--r--test/030_move/022_U2_inverse.out1
-rw-r--r--test/030_move/030_U3_solved.in2
-rw-r--r--test/030_move/030_U3_solved.out1
-rw-r--r--test/030_move/031_U3_inverse.in2
-rw-r--r--test/030_move/031_U3_inverse.out1
-rw-r--r--test/030_move/032_U3_scrambled.in2
-rw-r--r--test/030_move/032_U3_scrambled.out1
-rw-r--r--test/030_move/033_U3_with_prime.in2
-rw-r--r--test/030_move/033_U3_with_prime.out1
-rw-r--r--test/030_move/040_D_solved.in2
-rw-r--r--test/030_move/040_D_solved.out1
-rw-r--r--test/030_move/050_D2_solved.in2
-rw-r--r--test/030_move/050_D2_solved.out1
-rw-r--r--test/030_move/060_D3_solved.in2
-rw-r--r--test/030_move/060_D3_solved.out1
-rw-r--r--test/030_move/070_R_solved.in2
-rw-r--r--test/030_move/070_R_solved.out1
-rw-r--r--test/030_move/071_R_scrambled.in2
-rw-r--r--test/030_move/071_R_scrambled.out1
-rw-r--r--test/030_move/080_R2_solved.in2
-rw-r--r--test/030_move/080_R2_solved.out1
-rw-r--r--test/030_move/090_R3_solved.in2
-rw-r--r--test/030_move/090_R3_solved.out1
-rw-r--r--test/030_move/100_L_solved.in2
-rw-r--r--test/030_move/100_L_solved.out1
-rw-r--r--test/030_move/110_L2_solved.in2
-rw-r--r--test/030_move/110_L2_solved.out1
-rw-r--r--test/030_move/120_L3_solved.in2
-rw-r--r--test/030_move/120_L3_solved.out1
-rw-r--r--test/030_move/130_F_solved.in2
-rw-r--r--test/030_move/130_F_solved.out1
-rw-r--r--test/030_move/132_F_scrambled.in2
-rw-r--r--test/030_move/132_F_scrambled.out1
-rw-r--r--test/030_move/133_F_scrambled_2.in2
-rw-r--r--test/030_move/133_F_scrambled_2.out1
-rw-r--r--test/030_move/140_F2_solved.in2
-rw-r--r--test/030_move/140_F2_solved.out1
-rw-r--r--test/030_move/150_F3_solved.in2
-rw-r--r--test/030_move/150_F3_solved.out1
-rw-r--r--test/030_move/160_B_solved.in2
-rw-r--r--test/030_move/160_B_solved.out1
-rw-r--r--test/030_move/170_B2_solved.in2
-rw-r--r--test/030_move/170_B2_solved.out1
-rw-r--r--test/030_move/180_B3_solved.in2
-rw-r--r--test/030_move/180_B3_solved.out1
-rw-r--r--test/030_move/200_scramble_solved.in2
-rw-r--r--test/030_move/200_scramble_solved.out1
-rw-r--r--test/030_move/201_solution_scrambled.in2
-rw-r--r--test/030_move/201_solution_scrambled.out1
-rw-r--r--test/030_move/300_multimove_solved.in2
-rw-r--r--test/030_move/300_multimove_solved.out1
-rw-r--r--test/030_move/301_multimove_scrambled.in2
-rw-r--r--test/030_move/301_multimove_scrambled.out1
-rw-r--r--test/030_move/move_tests.c25
-rw-r--r--test/040_inverse_cube/00_solved.in1
-rw-r--r--test/040_inverse_cube/00_solved.out1
-rw-r--r--test/040_inverse_cube/01_scrambled.in1
-rw-r--r--test/040_inverse_cube/01_scrambled.out1
-rw-r--r--test/040_inverse_cube/inverse_tests.c23
-rw-r--r--test/050_compose/00_solved_solved.in2
-rw-r--r--test/050_compose/00_solved_solved.out1
-rw-r--r--test/050_compose/01_solved_U.in2
-rw-r--r--test/050_compose/01_solved_U.out1
-rw-r--r--test/050_compose/02_solved_scrambled.in2
-rw-r--r--test/050_compose/02_solved_scrambled.out1
-rw-r--r--test/050_compose/11_U_solved.in2
-rw-r--r--test/050_compose/11_U_solved.out1
-rw-r--r--test/050_compose/12_scrambled_solved.in2
-rw-r--r--test/050_compose/12_scrambled_solved.out1
-rw-r--r--test/050_compose/20_U_U.in2
-rw-r--r--test/050_compose/20_U_U.out1
-rw-r--r--test/050_compose/21_U_Uinverse.in2
-rw-r--r--test/050_compose/21_U_Uinverse.out1
-rw-r--r--test/050_compose/22_F_Finverse.in2
-rw-r--r--test/050_compose/22_F_Finverse.out1
-rw-r--r--test/050_compose/23_F2_F2.in2
-rw-r--r--test/050_compose/23_F2_F2.out1
-rw-r--r--test/050_compose/24_U_F.in2
-rw-r--r--test/050_compose/24_U_F.out1
-rw-r--r--test/050_compose/25_F_R.in2
-rw-r--r--test/050_compose/25_F_R.out1
-rw-r--r--test/050_compose/30_scrambled_inverse.in4
-rw-r--r--test/050_compose/30_scrambled_inverse.out1
-rw-r--r--test/050_compose/31_scrambled_scrambled.in4
-rw-r--r--test/050_compose/31_scrambled_scrambled.out1
-rw-r--r--test/050_compose/compose_tests.c26
-rw-r--r--test/060_transform/000_solved_UFr.in2
-rw-r--r--test/060_transform/000_solved_UFr.out1
-rw-r--r--test/060_transform/001_solved_BLm.in2
-rw-r--r--test/060_transform/001_solved_BLm.out1
-rw-r--r--test/060_transform/100_UFr_U.in2
-rw-r--r--test/060_transform/100_UFr_U.out1
-rw-r--r--test/060_transform/101_UFm_U.in2
-rw-r--r--test/060_transform/101_UFm_U.out1
-rw-r--r--test/060_transform/102_UFr_R.in2
-rw-r--r--test/060_transform/102_UFr_R.out1
-rw-r--r--test/060_transform/103_UFm_R.in2
-rw-r--r--test/060_transform/103_UFm_R.out1
-rw-r--r--test/060_transform/104_UFr_F.in2
-rw-r--r--test/060_transform/104_UFr_F.out1
-rw-r--r--test/060_transform/105_UFm_F.in2
-rw-r--r--test/060_transform/105_UFm_F.out1
-rw-r--r--test/060_transform/106_ULr_U.in2
-rw-r--r--test/060_transform/106_ULr_U.out1
-rw-r--r--test/060_transform/107_ULm_U.in2
-rw-r--r--test/060_transform/107_ULm_U.out1
-rw-r--r--test/060_transform/108_ULr_R.in2
-rw-r--r--test/060_transform/108_ULr_R.out1
-rw-r--r--test/060_transform/109_ULm_R.in2
-rw-r--r--test/060_transform/109_ULm_R.out1
-rw-r--r--test/060_transform/110_ULr_F.in2
-rw-r--r--test/060_transform/110_ULr_F.out1
-rw-r--r--test/060_transform/111_ULm_F.in2
-rw-r--r--test/060_transform/111_ULm_F.out1
-rw-r--r--test/060_transform/112_UBr_U.in2
-rw-r--r--test/060_transform/112_UBr_U.out1
-rw-r--r--test/060_transform/113_UBm_U.in2
-rw-r--r--test/060_transform/113_UBm_U.out1
-rw-r--r--test/060_transform/114_UBr_R.in2
-rw-r--r--test/060_transform/114_UBr_R.out1
-rw-r--r--test/060_transform/115_UBm_R.in2
-rw-r--r--test/060_transform/115_UBm_R.out1
-rw-r--r--test/060_transform/116_UBr_F.in2
-rw-r--r--test/060_transform/116_UBr_F.out1
-rw-r--r--test/060_transform/117_UBm_F.in2
-rw-r--r--test/060_transform/117_UBm_F.out1
-rw-r--r--test/060_transform/118_URr_U.in2
-rw-r--r--test/060_transform/118_URr_U.out1
-rw-r--r--test/060_transform/119_URm_U.in2
-rw-r--r--test/060_transform/119_URm_U.out1
-rw-r--r--test/060_transform/120_URr_R.in2
-rw-r--r--test/060_transform/120_URr_R.out1
-rw-r--r--test/060_transform/121_URm_R.in2
-rw-r--r--test/060_transform/121_URm_R.out1
-rw-r--r--test/060_transform/122_URr_F.in2
-rw-r--r--test/060_transform/122_URr_F.out1
-rw-r--r--test/060_transform/123_URm_F.in2
-rw-r--r--test/060_transform/123_URm_F.out1
-rw-r--r--test/060_transform/124_DFr_U.in2
-rw-r--r--test/060_transform/124_DFr_U.out1
-rw-r--r--test/060_transform/125_DFm_U.in2
-rw-r--r--test/060_transform/125_DFm_U.out1
-rw-r--r--test/060_transform/126_DFr_R.in2
-rw-r--r--test/060_transform/126_DFr_R.out1
-rw-r--r--test/060_transform/127_DFm_R.in2
-rw-r--r--test/060_transform/127_DFm_R.out1
-rw-r--r--test/060_transform/128_DFr_F.in2
-rw-r--r--test/060_transform/128_DFr_F.out1
-rw-r--r--test/060_transform/129_DFm_F.in2
-rw-r--r--test/060_transform/129_DFm_F.out1
-rw-r--r--test/060_transform/130_DLr_U.in2
-rw-r--r--test/060_transform/130_DLr_U.out1
-rw-r--r--test/060_transform/131_DLm_U.in2
-rw-r--r--test/060_transform/131_DLm_U.out1
-rw-r--r--test/060_transform/132_DLr_R.in2
-rw-r--r--test/060_transform/132_DLr_R.out1
-rw-r--r--test/060_transform/133_DLm_R.in2
-rw-r--r--test/060_transform/133_DLm_R.out1
-rw-r--r--test/060_transform/134_DLr_F.in2
-rw-r--r--test/060_transform/134_DLr_F.out1
-rw-r--r--test/060_transform/135_DLm_F.in2
-rw-r--r--test/060_transform/135_DLm_F.out1
-rw-r--r--test/060_transform/136_DBr_U.in2
-rw-r--r--test/060_transform/136_DBr_U.out1
-rw-r--r--test/060_transform/137_DBm_U.in2
-rw-r--r--test/060_transform/137_DBm_U.out1
-rw-r--r--test/060_transform/138_DBr_R.in2
-rw-r--r--test/060_transform/138_DBr_R.out1
-rw-r--r--test/060_transform/139_DBm_R.in2
-rw-r--r--test/060_transform/139_DBm_R.out1
-rw-r--r--test/060_transform/140_DBr_F.in2
-rw-r--r--test/060_transform/140_DBr_F.out1
-rw-r--r--test/060_transform/141_DBm_F.in2
-rw-r--r--test/060_transform/141_DBm_F.out1
-rw-r--r--test/060_transform/142_DRr_U.in2
-rw-r--r--test/060_transform/142_DRr_U.out1
-rw-r--r--test/060_transform/143_DRm_U.in2
-rw-r--r--test/060_transform/143_DRm_U.out1
-rw-r--r--test/060_transform/144_DRr_R.in2
-rw-r--r--test/060_transform/144_DRr_R.out1
-rw-r--r--test/060_transform/145_DRm_R.in2
-rw-r--r--test/060_transform/145_DRm_R.out1
-rw-r--r--test/060_transform/146_DRr_F.in2
-rw-r--r--test/060_transform/146_DRr_F.out1
-rw-r--r--test/060_transform/147_DRm_F.in2
-rw-r--r--test/060_transform/147_DRm_F.out1
-rw-r--r--test/060_transform/148_RUr_U.in2
-rw-r--r--test/060_transform/148_RUr_U.out1
-rw-r--r--test/060_transform/149_RUm_U.in2
-rw-r--r--test/060_transform/149_RUm_U.out1
-rw-r--r--test/060_transform/150_RUr_R.in2
-rw-r--r--test/060_transform/150_RUr_R.out1
-rw-r--r--test/060_transform/151_RUm_R.in2
-rw-r--r--test/060_transform/151_RUm_R.out1
-rw-r--r--test/060_transform/152_RUr_F.in2
-rw-r--r--test/060_transform/152_RUr_F.out1
-rw-r--r--test/060_transform/153_RUm_F.in2
-rw-r--r--test/060_transform/153_RUm_F.out1
-rw-r--r--test/060_transform/154_RFr_U.in2
-rw-r--r--test/060_transform/154_RFr_U.out1
-rw-r--r--test/060_transform/155_RFm_U.in2
-rw-r--r--test/060_transform/155_RFm_U.out1
-rw-r--r--test/060_transform/156_RFr_R.in2
-rw-r--r--test/060_transform/156_RFr_R.out1
-rw-r--r--test/060_transform/157_RFm_R.in2
-rw-r--r--test/060_transform/157_RFm_R.out1
-rw-r--r--test/060_transform/158_RFr_F.in2
-rw-r--r--test/060_transform/158_RFr_F.out1
-rw-r--r--test/060_transform/159_RFm_F.in2
-rw-r--r--test/060_transform/159_RFm_F.out1
-rw-r--r--test/060_transform/160_RDr_U.in2
-rw-r--r--test/060_transform/160_RDr_U.out1
-rw-r--r--test/060_transform/161_RDm_U.in2
-rw-r--r--test/060_transform/161_RDm_U.out1
-rw-r--r--test/060_transform/162_RDr_R.in2
-rw-r--r--test/060_transform/162_RDr_R.out1
-rw-r--r--test/060_transform/163_RDm_R.in2
-rw-r--r--test/060_transform/163_RDm_R.out1
-rw-r--r--test/060_transform/164_RDr_F.in2
-rw-r--r--test/060_transform/164_RDr_F.out1
-rw-r--r--test/060_transform/165_RDm_F.in2
-rw-r--r--test/060_transform/165_RDm_F.out1
-rw-r--r--test/060_transform/166_RBr_U.in2
-rw-r--r--test/060_transform/166_RBr_U.out1
-rw-r--r--test/060_transform/167_RBm_U.in2
-rw-r--r--test/060_transform/167_RBm_U.out1
-rw-r--r--test/060_transform/168_RBr_R.in2
-rw-r--r--test/060_transform/168_RBr_R.out1
-rw-r--r--test/060_transform/169_RBm_R.in2
-rw-r--r--test/060_transform/169_RBm_R.out1
-rw-r--r--test/060_transform/170_RBr_F.in2
-rw-r--r--test/060_transform/170_RBr_F.out1
-rw-r--r--test/060_transform/171_RBm_F.in2
-rw-r--r--test/060_transform/171_RBm_F.out1
-rw-r--r--test/060_transform/172_LUr_U.in2
-rw-r--r--test/060_transform/172_LUr_U.out1
-rw-r--r--test/060_transform/173_LUm_U.in2
-rw-r--r--test/060_transform/173_LUm_U.out1
-rw-r--r--test/060_transform/174_LUr_R.in2
-rw-r--r--test/060_transform/174_LUr_R.out1
-rw-r--r--test/060_transform/175_LUm_R.in2
-rw-r--r--test/060_transform/175_LUm_R.out1
-rw-r--r--test/060_transform/176_LUr_F.in2
-rw-r--r--test/060_transform/176_LUr_F.out1
-rw-r--r--test/060_transform/177_LUm_F.in2
-rw-r--r--test/060_transform/177_LUm_F.out1
-rw-r--r--test/060_transform/178_LFr_U.in2
-rw-r--r--test/060_transform/178_LFr_U.out1
-rw-r--r--test/060_transform/179_LFm_U.in2
-rw-r--r--test/060_transform/179_LFm_U.out1
-rw-r--r--test/060_transform/180_LFr_R.in2
-rw-r--r--test/060_transform/180_LFr_R.out1
-rw-r--r--test/060_transform/181_LFm_R.in2
-rw-r--r--test/060_transform/181_LFm_R.out1
-rw-r--r--test/060_transform/182_LFr_F.in2
-rw-r--r--test/060_transform/182_LFr_F.out1
-rw-r--r--test/060_transform/183_LFm_F.in2
-rw-r--r--test/060_transform/183_LFm_F.out1
-rw-r--r--test/060_transform/184_LDr_U.in2
-rw-r--r--test/060_transform/184_LDr_U.out1
-rw-r--r--test/060_transform/185_LDm_U.in2
-rw-r--r--test/060_transform/185_LDm_U.out1
-rw-r--r--test/060_transform/186_LDr_R.in2
-rw-r--r--test/060_transform/186_LDr_R.out1
-rw-r--r--test/060_transform/187_LDm_R.in2
-rw-r--r--test/060_transform/187_LDm_R.out1
-rw-r--r--test/060_transform/188_LDr_F.in2
-rw-r--r--test/060_transform/188_LDr_F.out1
-rw-r--r--test/060_transform/189_LDm_F.in2
-rw-r--r--test/060_transform/189_LDm_F.out1
-rw-r--r--test/060_transform/190_LBr_U.in2
-rw-r--r--test/060_transform/190_LBr_U.out1
-rw-r--r--test/060_transform/191_LBm_U.in2
-rw-r--r--test/060_transform/191_LBm_U.out1
-rw-r--r--test/060_transform/192_LBr_R.in2
-rw-r--r--test/060_transform/192_LBr_R.out1
-rw-r--r--test/060_transform/193_LBm_R.in2
-rw-r--r--test/060_transform/193_LBm_R.out1
-rw-r--r--test/060_transform/194_LBr_F.in2
-rw-r--r--test/060_transform/194_LBr_F.out1
-rw-r--r--test/060_transform/195_LBm_F.in2
-rw-r--r--test/060_transform/195_LBm_F.out1
-rw-r--r--test/060_transform/196_FUr_U.in2
-rw-r--r--test/060_transform/196_FUr_U.out1
-rw-r--r--test/060_transform/197_FUm_U.in2
-rw-r--r--test/060_transform/197_FUm_U.out1
-rw-r--r--test/060_transform/198_FUr_R.in2
-rw-r--r--test/060_transform/198_FUr_R.out1
-rw-r--r--test/060_transform/199_FUm_R.in2
-rw-r--r--test/060_transform/199_FUm_R.out1
-rw-r--r--test/060_transform/200_FUr_F.in2
-rw-r--r--test/060_transform/200_FUr_F.out1
-rw-r--r--test/060_transform/201_FUm_F.in2
-rw-r--r--test/060_transform/201_FUm_F.out1
-rw-r--r--test/060_transform/202_FRr_U.in2
-rw-r--r--test/060_transform/202_FRr_U.out1
-rw-r--r--test/060_transform/203_FRm_U.in2
-rw-r--r--test/060_transform/203_FRm_U.out1
-rw-r--r--test/060_transform/204_FRr_R.in2
-rw-r--r--test/060_transform/204_FRr_R.out1
-rw-r--r--test/060_transform/205_FRm_R.in2
-rw-r--r--test/060_transform/205_FRm_R.out1
-rw-r--r--test/060_transform/206_FRr_F.in2
-rw-r--r--test/060_transform/206_FRr_F.out1
-rw-r--r--test/060_transform/207_FRm_F.in2
-rw-r--r--test/060_transform/207_FRm_F.out1
-rw-r--r--test/060_transform/208_FDr_U.in2
-rw-r--r--test/060_transform/208_FDr_U.out1
-rw-r--r--test/060_transform/209_FDm_U.in2
-rw-r--r--test/060_transform/209_FDm_U.out1
-rw-r--r--test/060_transform/210_FDr_R.in2
-rw-r--r--test/060_transform/210_FDr_R.out1
-rw-r--r--test/060_transform/211_FDm_R.in2
-rw-r--r--test/060_transform/211_FDm_R.out1
-rw-r--r--test/060_transform/212_FDr_F.in2
-rw-r--r--test/060_transform/212_FDr_F.out1
-rw-r--r--test/060_transform/213_FDm_F.in2
-rw-r--r--test/060_transform/213_FDm_F.out1
-rw-r--r--test/060_transform/214_FLr_U.in2
-rw-r--r--test/060_transform/214_FLr_U.out1
-rw-r--r--test/060_transform/215_FLm_U.in2
-rw-r--r--test/060_transform/215_FLm_U.out1
-rw-r--r--test/060_transform/216_FLr_R.in2
-rw-r--r--test/060_transform/216_FLr_R.out1
-rw-r--r--test/060_transform/217_FLm_R.in2
-rw-r--r--test/060_transform/217_FLm_R.out1
-rw-r--r--test/060_transform/218_FLr_F.in2
-rw-r--r--test/060_transform/218_FLr_F.out1
-rw-r--r--test/060_transform/219_FLm_F.in2
-rw-r--r--test/060_transform/219_FLm_F.out1
-rw-r--r--test/060_transform/220_BUr_U.in2
-rw-r--r--test/060_transform/220_BUr_U.out1
-rw-r--r--test/060_transform/221_BUm_U.in2
-rw-r--r--test/060_transform/221_BUm_U.out1
-rw-r--r--test/060_transform/222_BUr_R.in2
-rw-r--r--test/060_transform/222_BUr_R.out1
-rw-r--r--test/060_transform/223_BUm_R.in2
-rw-r--r--test/060_transform/223_BUm_R.out1
-rw-r--r--test/060_transform/224_BUr_F.in2
-rw-r--r--test/060_transform/224_BUr_F.out1
-rw-r--r--test/060_transform/225_BUm_F.in2
-rw-r--r--test/060_transform/225_BUm_F.out1
-rw-r--r--test/060_transform/226_BRr_U.in2
-rw-r--r--test/060_transform/226_BRr_U.out1
-rw-r--r--test/060_transform/227_BRm_U.in2
-rw-r--r--test/060_transform/227_BRm_U.out1
-rw-r--r--test/060_transform/228_BRr_R.in2
-rw-r--r--test/060_transform/228_BRr_R.out1
-rw-r--r--test/060_transform/229_BRm_R.in2
-rw-r--r--test/060_transform/229_BRm_R.out1
-rw-r--r--test/060_transform/230_BRr_F.in2
-rw-r--r--test/060_transform/230_BRr_F.out1
-rw-r--r--test/060_transform/231_BRm_F.in2
-rw-r--r--test/060_transform/231_BRm_F.out1
-rw-r--r--test/060_transform/232_BDr_U.in2
-rw-r--r--test/060_transform/232_BDr_U.out1
-rw-r--r--test/060_transform/233_BDm_U.in2
-rw-r--r--test/060_transform/233_BDm_U.out1
-rw-r--r--test/060_transform/234_BDr_R.in2
-rw-r--r--test/060_transform/234_BDr_R.out1
-rw-r--r--test/060_transform/235_BDm_R.in2
-rw-r--r--test/060_transform/235_BDm_R.out1
-rw-r--r--test/060_transform/236_BDr_F.in2
-rw-r--r--test/060_transform/236_BDr_F.out1
-rw-r--r--test/060_transform/237_BDm_F.in2
-rw-r--r--test/060_transform/237_BDm_F.out1
-rw-r--r--test/060_transform/238_BLr_U.in2
-rw-r--r--test/060_transform/238_BLr_U.out1
-rw-r--r--test/060_transform/239_BLm_U.in2
-rw-r--r--test/060_transform/239_BLm_U.out1
-rw-r--r--test/060_transform/240_BLr_R.in2
-rw-r--r--test/060_transform/240_BLr_R.out1
-rw-r--r--test/060_transform/241_BLm_R.in2
-rw-r--r--test/060_transform/241_BLm_R.out1
-rw-r--r--test/060_transform/242_BLr_F.in2
-rw-r--r--test/060_transform/242_BLr_F.out1
-rw-r--r--test/060_transform/243_BLm_F.in2
-rw-r--r--test/060_transform/243_BLm_F.out1
-rw-r--r--test/060_transform/transform_tests.c25
-rw-r--r--test/061_inverse_trans/00_all.in0
-rw-r--r--test/061_inverse_trans/00_all.out0
-rw-r--r--test/061_inverse_trans/inverse_trans_tests.c38
-rw-r--r--test/071_coord_eo/00_solved.in1
-rw-r--r--test/071_coord_eo/00_solved.out1
-rw-r--r--test/071_coord_eo/01_U.in1
-rw-r--r--test/071_coord_eo/01_U.out1
-rw-r--r--test/071_coord_eo/02_U2.in1
-rw-r--r--test/071_coord_eo/02_U2.out1
-rw-r--r--test/071_coord_eo/03_U3.in1
-rw-r--r--test/071_coord_eo/03_U3.out1
-rw-r--r--test/071_coord_eo/04_D.in1
-rw-r--r--test/071_coord_eo/04_D.out1
-rw-r--r--test/071_coord_eo/07_R.in1
-rw-r--r--test/071_coord_eo/07_R.out1
-rw-r--r--test/071_coord_eo/08_R2.in1
-rw-r--r--test/071_coord_eo/08_R2.out1
-rw-r--r--test/071_coord_eo/10_L.in1
-rw-r--r--test/071_coord_eo/10_L.out1
-rw-r--r--test/071_coord_eo/13_F.in1
-rw-r--r--test/071_coord_eo/13_F.out1
-rw-r--r--test/071_coord_eo/14_F2.in1
-rw-r--r--test/071_coord_eo/14_F2.out1
-rw-r--r--test/071_coord_eo/15_F3.in1
-rw-r--r--test/071_coord_eo/15_F3.out1
-rw-r--r--test/071_coord_eo/16_B.in1
-rw-r--r--test/071_coord_eo/16_B.out1
-rw-r--r--test/071_coord_eo/17_B2.in1
-rw-r--r--test/071_coord_eo/17_B2.out1
-rw-r--r--test/071_coord_eo/18_B3.in1
-rw-r--r--test/071_coord_eo/18_B3.out1
-rw-r--r--test/071_coord_eo/20_scrambled.in3
-rw-r--r--test/071_coord_eo/20_scrambled.out1
-rw-r--r--test/071_coord_eo/coord_eo_tests.c21
-rw-r--r--test/072_coord_co/00_solved.in1
-rw-r--r--test/072_coord_co/00_solved.out1
-rw-r--r--test/072_coord_co/01_U.in1
-rw-r--r--test/072_coord_co/01_U.out1
-rw-r--r--test/072_coord_co/02_U2.in1
-rw-r--r--test/072_coord_co/02_U2.out1
-rw-r--r--test/072_coord_co/03_U3.in1
-rw-r--r--test/072_coord_co/03_U3.out1
-rw-r--r--test/072_coord_co/04_D.in1
-rw-r--r--test/072_coord_co/04_D.out1
-rw-r--r--test/072_coord_co/07_R.in1
-rw-r--r--test/072_coord_co/07_R.out1
-rw-r--r--test/072_coord_co/08_R2.in1
-rw-r--r--test/072_coord_co/08_R2.out1
-rw-r--r--test/072_coord_co/10_L.in1
-rw-r--r--test/072_coord_co/10_L.out1
-rw-r--r--test/072_coord_co/13_F.in1
-rw-r--r--test/072_coord_co/13_F.out1
-rw-r--r--test/072_coord_co/14_F2.in1
-rw-r--r--test/072_coord_co/14_F2.out1
-rw-r--r--test/072_coord_co/16_B.in1
-rw-r--r--test/072_coord_co/16_B.out1
-rw-r--r--test/072_coord_co/17_B2.in1
-rw-r--r--test/072_coord_co/17_B2.out1
-rw-r--r--test/072_coord_co/20_scrambled.in3
-rw-r--r--test/072_coord_co/20_scrambled.out1
-rw-r--r--test/072_coord_co/coord_co_tests.c21
-rw-r--r--test/test.h27
-rwxr-xr-xtest/test.sh39
512 files changed, 2808 insertions, 0 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0044899
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,4 @@
1CubeCore is public domain.
2
3Everyone is allowed to copy, modify, use and distribute this software
4without any restrictions.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..448c625
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,26 @@
1CFLAGS = -std=c99 -pedantic -Wall -Wextra -O3
2DBGFLAGS = -std=c99 -pedantic -Wall -Wextra -g3 -DDEBUG
3
4CC = cc
5
6all: cube.o debugcube.o
7
8cube.s: clean
9 ${CC} ${CFLAGS} -c -S -o cube.s cube.c
10
11cube.o: clean
12 ${CC} ${CFLAGS} -c -o cube.o cube.c
13
14debugcube.o: clean
15 ${CC} ${DBGFLAGS} -c -o debugcube.o cube.c
16
17clean:
18 rm -rf *.o
19
20test: debugcube.o
21 CUBETYPE=${CUBETYPE} TEST=${TEST} ./test/test.sh
22
23benchmark: cube.o
24 CUBETYPE=${CUBETYPE} ./benchmark/bench.sh
25
26.PHONY: all clean test benchmark
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b49cefd
--- /dev/null
+++ b/README.md
@@ -0,0 +1,5 @@
1# CubeCore
2
3A simple set of basic routines for working with a 3x3x3 Rubik's Cube.
4
5Work in progress.
diff --git a/cube.c b/cube.c
new file mode 100644
index 0000000..16a5338
--- /dev/null
+++ b/cube.c
@@ -0,0 +1,1520 @@
1#include <inttypes.h>
2#include <stdbool.h>
3#include <string.h>
4
5#include "cube.h"
6
7#ifdef DEBUG
8
9#include <stdio.h>
10#define _static
11#define _static_inline
12#define DBG_LOG(...) fprintf(stderr, __VA_ARGS__)
13#define DBG_WARN(condition, ...) if (!(condition)) DBG_LOG(__VA_ARGS__);
14#define DBG_ASSERT(condition, retval, ...) \
15 if (!(condition)) { \
16 DBG_LOG(__VA_ARGS__); \
17 return retval; \
18 }
19
20#else
21
22#define _static static
23#define _static_inline static inline
24#define DBG_LOG(...)
25#define DBG_WARN(condition, ...)
26#define DBG_ASSERT(condition, retval, ...)
27
28#endif
29
30/******************************************************************************
31Section: mathematical constants
32******************************************************************************/
33
34#define _2p11 2048U
35#define _2p12 4096U
36#define _3p7 2187U
37#define _3p8 6561U
38#define _12c4 495U
39#define _8c4 70U
40
41_static int64_t binomial[12][12] = {
42 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
43 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
44 {1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
45 {1, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0},
46 {1, 4, 6, 4, 1, 0, 0, 0, 0, 0, 0, 0},
47 {1, 5, 10, 10, 5, 1, 0, 0, 0, 0, 0, 0},
48 {1, 6, 15, 20, 15, 6, 1, 0, 0, 0, 0, 0},
49 {1, 7, 21, 35, 35, 21, 7, 1, 0, 0, 0, 0},
50 {1, 8, 28, 56, 70, 56, 28, 8, 1, 0, 0, 0},
51 {1, 9, 36, 84, 126, 126, 84, 36, 9, 1, 0, 0},
52 {1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, 0},
53 {1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1},
54};
55
56/******************************************************************************
57Section: moves definitions and tables
58******************************************************************************/
59
60#define U 0U
61#define U2 1U
62#define U3 2U
63#define D 3U
64#define D2 4U
65#define D3 5U
66#define R 6U
67#define R2 7U
68#define R3 8U
69#define L 9U
70#define L2 10U
71#define L3 11U
72#define F 12U
73#define F2 13U
74#define F3 14U
75#define B 15U
76#define B2 16U
77#define B3 17U
78
79#define UFr 0
80#define ULr 1
81#define UBr 2
82#define URr 3
83#define DFr 4
84#define DLr 5
85#define DBr 6
86#define DRr 7
87#define RUr 8
88#define RFr 9
89#define RDr 10
90#define RBr 11
91#define LUr 12
92#define LFr 13
93#define LDr 14
94#define LBr 15
95#define FUr 16
96#define FRr 17
97#define FDr 18
98#define FLr 19
99#define BUr 20
100#define BRr 21
101#define BDr 22
102#define BLr 23
103
104#define UFm 24
105#define ULm 25
106#define UBm 26
107#define URm 27
108#define DFm 28
109#define DLm 29
110#define DBm 30
111#define DRm 31
112#define RUm 32
113#define RFm 33
114#define RDm 34
115#define RBm 35
116#define LUm 36
117#define LFm 37
118#define LDm 38
119#define LBm 39
120#define FUm 40
121#define FRm 41
122#define FDm 42
123#define FLm 43
124#define BUm 44
125#define BRm 45
126#define BDm 46
127#define BLm 47
128
129#define _c_ufr 0U
130#define _c_ubl 1U
131#define _c_dfl 2U
132#define _c_dbr 3U
133#define _c_ufl 4U
134#define _c_ubr 5U
135#define _c_dfr 6U
136#define _c_dbl 7U
137
138#define _e_uf 0U
139#define _e_ub 1U
140#define _e_db 2U
141#define _e_df 3U
142#define _e_ur 4U
143#define _e_ul 5U
144#define _e_dl 6U
145#define _e_dr 7U
146#define _e_fr 8U
147#define _e_fl 9U
148#define _e_bl 10U
149#define _e_br 11U
150
151#define _eoshift 4U
152#define _coshift 5U
153
154#define _pbits 0xFU
155#define _esepbit1 0x4U
156#define _esepbit2 0x8U
157#define _csepbit 0x4U
158#define _eobit 0x10U
159#define _cobits 0xF0U
160#define _cobits2 0x60U
161#define _ctwist_cw 0x20U
162#define _ctwist_ccw 0x40U
163#define _eflip 0x10U
164#define _error 0xFFU
165
166_static cube_t zero = { .corner = {0}, .edge = {0} };
167_static cube_t solved = {
168 .corner = {0, 1, 2, 3, 4, 5, 6, 7},
169 .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
170};
171
172#define zero_fast fastcube( \
173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
174#define solved_fast fastcube( \
175 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
176
177#define _move_cube_U fastcube( \
178 5, 4, 2, 3, 0, 1, 6, 7, 4, 5, 2, 3, 1, 0, 6, 7, 8, 9, 10, 11)
179#define _move_cube_U2 fastcube( \
180 1, 0, 2, 3, 5, 4, 6, 7, 1, 0, 2, 3, 5, 4, 6, 7, 8, 9, 10, 11)
181#define _move_cube_U3 fastcube( \
182 4, 5, 2, 3, 1, 0, 6, 7, 5, 4, 2, 3, 0, 1, 6, 7, 8, 9, 10, 11)
183#define _move_cube_D fastcube( \
184 0, 1, 7, 6, 4, 5, 2, 3, 0, 1, 7, 6, 4, 5, 2, 3, 8, 9, 10, 11)
185#define _move_cube_D2 fastcube( \
186 0, 1, 3, 2, 4, 5, 7, 6, 0, 1, 3, 2, 4, 5, 7, 6, 8, 9, 10, 11)
187#define _move_cube_D3 fastcube( \
188 0, 1, 6, 7, 4, 5, 3, 2, 0, 1, 6, 7, 4, 5, 3, 2, 8, 9, 10, 11)
189#define _move_cube_R fastcube( \
190 70, 1, 2, 69, 4, 32, 35, 7, 0, 1, 2, 3, 8, 5, 6, 11, 7, 9, 10, 4)
191#define _move_cube_R2 fastcube( \
192 3, 1, 2, 0, 4, 6, 5, 7, 0, 1, 2, 3, 7, 5, 6, 4, 11, 9, 10, 8)
193#define _move_cube_R3 fastcube( \
194 69, 1, 2, 70, 4, 35, 32, 7, 0, 1, 2, 3, 11, 5, 6, 8, 4, 9, 10, 7)
195#define _move_cube_L fastcube( \
196 0, 71, 68, 3, 33, 5, 6, 34, 0, 1, 2, 3, 4, 10, 9, 7, 8, 5, 6, 11)
197#define _move_cube_L2 fastcube( \
198 0, 2, 1, 3, 7, 5, 6, 4, 0, 1, 2, 3, 4, 6, 5, 7, 8, 10, 9, 11)
199#define _move_cube_L3 fastcube( \
200 0, 68, 71, 3, 34, 5, 6, 33, 0, 1, 2, 3, 4, 9, 10, 7, 8, 6, 5, 11)
201#define _move_cube_F fastcube( \
202 36, 1, 38, 3, 66, 5, 64, 7, 25, 1, 2, 24, 4, 5, 6, 7, 16, 19, 10, 11)
203#define _move_cube_F2 fastcube( \
204 2, 1, 0, 3, 6, 5, 4, 7, 3, 1, 2, 0, 4, 5, 6, 7, 9, 8, 10, 11)
205#define _move_cube_F3 fastcube( \
206 38, 1, 36, 3, 64, 5, 66, 7, 24, 1, 2, 25, 4, 5, 6, 7, 19, 16, 10, 11)
207#define _move_cube_B fastcube( \
208 0, 37, 2, 39, 4, 67, 6, 65, 0, 27, 26, 3, 4, 5, 6, 7, 8, 9, 17, 18)
209#define _move_cube_B2 fastcube( \
210 0, 3, 2, 1, 4, 7, 6, 5, 0, 2, 1, 3, 4, 5, 6, 7, 8, 9, 11, 10)
211#define _move_cube_B3 fastcube( \
212 0, 39, 2, 37, 4, 65, 6, 67, 0, 26, 27, 3, 4, 5, 6, 7, 8, 9, 18, 17)
213
214#define _trans_cube_UFr fastcube( \
215 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
216#define _trans_cube_UFr_inverse fastcube( \
217 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
218#define _trans_cube_ULr fastcube( \
219 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
220#define _trans_cube_ULr_inverse fastcube( \
221 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
222#define _trans_cube_UBr fastcube( \
223 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
224#define _trans_cube_UBr_inverse fastcube( \
225 1, 0, 3, 2, 5, 4, 7, 6, 1, 0, 3, 2, 5, 4, 7, 6, 10, 11, 8, 9)
226#define _trans_cube_URr fastcube( \
227 5, 4, 6, 7, 0, 1, 3, 2, 4, 5, 6, 7, 1, 0, 3, 2, 27, 24, 25, 26)
228#define _trans_cube_URr_inverse fastcube( \
229 4, 5, 7, 6, 1, 0, 2, 3, 5, 4, 7, 6, 0, 1, 2, 3, 25, 26, 27, 24)
230#define _trans_cube_DFr fastcube( \
231 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
232#define _trans_cube_DFr_inverse fastcube( \
233 2, 3, 0, 1, 6, 7, 4, 5, 3, 2, 1, 0, 6, 7, 4, 5, 9, 8, 11, 10)
234#define _trans_cube_DLr fastcube( \
235 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
236#define _trans_cube_DLr_inverse fastcube( \
237 7, 6, 4, 5, 2, 3, 1, 0, 6, 7, 4, 5, 2, 3, 0, 1, 26, 25, 24, 27)
238#define _trans_cube_DBr fastcube( \
239 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
240#define _trans_cube_DBr_inverse fastcube( \
241 3, 2, 1, 0, 7, 6, 5, 4, 2, 3, 0, 1, 7, 6, 5, 4, 11, 10, 9, 8)
242#define _trans_cube_DRr fastcube( \
243 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
244#define _trans_cube_DRr_inverse fastcube( \
245 6, 7, 5, 4, 3, 2, 0, 1, 7, 6, 5, 4, 3, 2, 1, 0, 24, 27, 26, 25)
246#define _trans_cube_RUr fastcube( \
247 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
248#define _trans_cube_RUr_inverse fastcube( \
249 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
250#define _trans_cube_RFr fastcube( \
251 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
252#define _trans_cube_RFr_inverse fastcube( \
253 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
254#define _trans_cube_RDr fastcube( \
255 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
256#define _trans_cube_RDr_inverse fastcube( \
257 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
258#define _trans_cube_RBr fastcube( \
259 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
260#define _trans_cube_RBr_inverse fastcube( \
261 37, 38, 39, 36, 67, 64, 65, 66, 27, 24, 25, 26, 20, 23, 22, 21, 17, 18, 19, 16)
262#define _trans_cube_LUr fastcube( \
263 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
264#define _trans_cube_LUr_inverse fastcube( \
265 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
266#define _trans_cube_LFr fastcube( \
267 36, 39, 38, 37, 66, 65, 64, 67, 25, 26, 27, 24, 21, 22, 23, 20, 16, 19, 18, 17)
268#define _trans_cube_LFr_inverse fastcube( \
269 38, 37, 36, 39, 64, 67, 66, 65, 24, 27, 26, 25, 23, 20, 21, 22, 19, 16, 17, 18)
270#define _trans_cube_LDr fastcube( \
271 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
272#define _trans_cube_LDr_inverse fastcube( \
273 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
274#define _trans_cube_LBr fastcube( \
275 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
276#define _trans_cube_LBr_inverse fastcube( \
277 39, 36, 37, 38, 65, 66, 67, 64, 26, 25, 24, 27, 22, 21, 20, 23, 18, 17, 16, 19)
278#define _trans_cube_FUr fastcube( \
279 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
280#define _trans_cube_FUr_inverse fastcube( \
281 68, 70, 69, 71, 32, 34, 33, 35, 16, 19, 18, 17, 9, 8, 11, 10, 5, 4, 7, 6)
282#define _trans_cube_FRr fastcube( \
283 32, 34, 35, 33, 70, 68, 69, 71, 8, 9, 10, 11, 16, 19, 18, 17, 20, 23, 22, 21)
284#define _trans_cube_FRr_inverse fastcube( \
285 64, 67, 65, 66, 37, 38, 36, 39, 20, 23, 22, 21, 24, 27, 26, 25, 0, 1, 2, 3)
286#define _trans_cube_FDr fastcube( \
287 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
288#define _trans_cube_FDr_inverse fastcube( \
289 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
290#define _trans_cube_FLr fastcube( \
291 34, 32, 33, 35, 68, 70, 71, 69, 9, 8, 11, 10, 19, 16, 17, 18, 22, 21, 20, 23)
292#define _trans_cube_FLr_inverse fastcube( \
293 65, 66, 64, 67, 36, 39, 37, 38, 21, 22, 23, 20, 26, 25, 24, 27, 1, 0, 3, 2)
294#define _trans_cube_BUr fastcube( \
295 69, 71, 68, 70, 33, 35, 32, 34, 17, 18, 19, 16, 11, 10, 9, 8, 4, 5, 6, 7)
296#define _trans_cube_BUr_inverse fastcube( \
297 70, 68, 71, 69, 34, 32, 35, 33, 19, 16, 17, 18, 8, 9, 10, 11, 7, 6, 5, 4)
298#define _trans_cube_BRr fastcube( \
299 35, 33, 32, 34, 69, 71, 70, 68, 11, 10, 9, 8, 18, 17, 16, 19, 23, 20, 21, 22)
300#define _trans_cube_BRr_inverse fastcube( \
301 66, 65, 67, 64, 39, 36, 38, 37, 22, 21, 20, 23, 25, 26, 27, 24, 3, 2, 1, 0)
302#define _trans_cube_BDr fastcube( \
303 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
304#define _trans_cube_BDr_inverse fastcube( \
305 71, 69, 70, 68, 35, 33, 34, 32, 18, 17, 16, 19, 10, 11, 8, 9, 6, 7, 4, 5)
306#define _trans_cube_BLr fastcube( \
307 33, 35, 34, 32, 71, 69, 68, 70, 10, 11, 8, 9, 17, 18, 19, 16, 21, 22, 23, 20)
308#define _trans_cube_BLr_inverse fastcube( \
309 67, 64, 66, 65, 38, 37, 39, 36, 23, 20, 21, 22, 27, 24, 25, 26, 2, 3, 0, 1)
310#define _trans_cube_UFm fastcube( \
311 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
312#define _trans_cube_UFm_inverse fastcube( \
313 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 5, 4, 7, 6, 9, 8, 11, 10)
314#define _trans_cube_ULm fastcube( \
315 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
316#define _trans_cube_ULm_inverse fastcube( \
317 0, 1, 3, 2, 5, 4, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3, 24, 27, 26, 25)
318#define _trans_cube_UBm fastcube( \
319 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
320#define _trans_cube_UBm_inverse fastcube( \
321 5, 4, 7, 6, 1, 0, 3, 2, 1, 0, 3, 2, 4, 5, 6, 7, 11, 10, 9, 8)
322#define _trans_cube_URm fastcube( \
323 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
324#define _trans_cube_URm_inverse fastcube( \
325 1, 0, 2, 3, 4, 5, 7, 6, 5, 4, 7, 6, 1, 0, 3, 2, 26, 25, 24, 27)
326#define _trans_cube_DFm fastcube( \
327 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
328#define _trans_cube_DFm_inverse fastcube( \
329 6, 7, 4, 5, 2, 3, 0, 1, 3, 2, 1, 0, 7, 6, 5, 4, 8, 9, 10, 11)
330#define _trans_cube_DLm fastcube( \
331 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
332#define _trans_cube_DLm_inverse fastcube( \
333 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
334#define _trans_cube_DBm fastcube( \
335 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
336#define _trans_cube_DBm_inverse fastcube( \
337 7, 6, 5, 4, 3, 2, 1, 0, 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9)
338#define _trans_cube_DRm fastcube( \
339 2, 3, 1, 0, 7, 6, 4, 5, 6, 7, 4, 5, 3, 2, 1, 0, 25, 26, 27, 24)
340#define _trans_cube_DRm_inverse fastcube( \
341 3, 2, 0, 1, 6, 7, 5, 4, 7, 6, 5, 4, 2, 3, 0, 1, 27, 24, 25, 26)
342#define _trans_cube_RUm fastcube( \
343 68, 71, 69, 70, 33, 34, 32, 35, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
344#define _trans_cube_RUm_inverse fastcube( \
345 70, 68, 69, 71, 32, 34, 35, 33, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
346#define _trans_cube_RFm fastcube( \
347 34, 33, 32, 35, 68, 71, 70, 69, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
348#define _trans_cube_RFm_inverse fastcube( \
349 66, 65, 64, 67, 36, 39, 38, 37, 25, 26, 27, 24, 22, 21, 20, 23, 19, 16, 17, 18)
350#define _trans_cube_RDm fastcube( \
351 71, 68, 70, 69, 34, 33, 35, 32, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
352#define _trans_cube_RDm_inverse fastcube( \
353 71, 69, 68, 70, 33, 35, 34, 32, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
354#define _trans_cube_RBm fastcube( \
355 33, 34, 35, 32, 71, 68, 69, 70, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
356#define _trans_cube_RBm_inverse fastcube( \
357 67, 64, 65, 66, 37, 38, 39, 36, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
358#define _trans_cube_LUm fastcube( \
359 69, 70, 68, 71, 32, 35, 33, 34, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
360#define _trans_cube_LUm_inverse fastcube( \
361 68, 70, 71, 69, 34, 32, 33, 35, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
362#define _trans_cube_LFm fastcube( \
363 32, 35, 34, 33, 70, 69, 68, 71, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
364#define _trans_cube_LFm_inverse fastcube( \
365 64, 67, 66, 65, 38, 37, 36, 39, 24, 27, 26, 25, 20, 23, 22, 21, 16, 19, 18, 17)
366#define _trans_cube_LDm fastcube( \
367 70, 69, 71, 68, 35, 32, 34, 33, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
368#define _trans_cube_LDm_inverse fastcube( \
369 69, 71, 70, 68, 35, 33, 32, 34, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
370#define _trans_cube_LBm fastcube( \
371 35, 32, 33, 34, 69, 70, 71, 68, 27, 24, 25, 26, 23, 20, 21, 22, 18, 17, 16, 19)
372#define _trans_cube_LBm_inverse fastcube( \
373 65, 66, 67, 64, 39, 36, 37, 38, 26, 25, 24, 27, 21, 22, 23, 20, 17, 18, 19, 16)
374#define _trans_cube_FUm fastcube( \
375 64, 66, 65, 67, 36, 38, 37, 39, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
376#define _trans_cube_FUm_inverse fastcube( \
377 32, 34, 33, 35, 68, 70, 69, 71, 16, 19, 18, 17, 8, 9, 10, 11, 4, 5, 6, 7)
378#define _trans_cube_FRm fastcube( \
379 36, 38, 39, 37, 66, 64, 65, 67, 9, 8, 11, 10, 16, 19, 18, 17, 21, 22, 23, 20)
380#define _trans_cube_FRm_inverse fastcube( \
381 37, 38, 36, 39, 64, 67, 65, 66, 20, 23, 22, 21, 27, 24, 25, 26, 1, 0, 3, 2)
382#define _trans_cube_FDm fastcube( \
383 66, 64, 67, 65, 38, 36, 39, 37, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
384#define _trans_cube_FDm_inverse fastcube( \
385 33, 35, 32, 34, 69, 71, 68, 70, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
386#define _trans_cube_FLm fastcube( \
387 38, 36, 37, 39, 64, 66, 67, 65, 8, 9, 10, 11, 19, 16, 17, 18, 23, 20, 21, 22)
388#define _trans_cube_FLm_inverse fastcube( \
389 36, 39, 37, 38, 65, 66, 64, 67, 21, 22, 23, 20, 25, 26, 27, 24, 0, 1, 2, 3)
390#define _trans_cube_BUm fastcube( \
391 65, 67, 64, 66, 37, 39, 36, 38, 17, 18, 19, 16, 10, 11, 8, 9, 5, 4, 7, 6)
392#define _trans_cube_BUm_inverse fastcube( \
393 34, 32, 35, 33, 70, 68, 71, 69, 19, 16, 17, 18, 9, 8, 11, 10, 6, 7, 4, 5)
394#define _trans_cube_BRm fastcube( \
395 39, 37, 36, 38, 65, 67, 66, 64, 10, 11, 8, 9, 18, 17, 16, 19, 22, 21, 20, 23)
396#define _trans_cube_BRm_inverse fastcube( \
397 39, 36, 38, 37, 66, 65, 67, 64, 22, 21, 20, 23, 26, 25, 24, 27, 2, 3, 0, 1)
398#define _trans_cube_BDm fastcube( \
399 67, 65, 66, 64, 39, 37, 38, 36, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
400#define _trans_cube_BDm_inverse fastcube( \
401 35, 33, 34, 32, 71, 69, 70, 68, 18, 17, 16, 19, 11, 10, 9, 8, 7, 6, 5, 4)
402#define _trans_cube_BLm fastcube( \
403 37, 39, 38, 36, 67, 65, 64, 66, 11, 10, 9, 8, 17, 18, 19, 16, 20, 23, 22, 21)
404#define _trans_cube_BLm_inverse fastcube( \
405 38, 37, 39, 36, 67, 64, 66, 65, 23, 20, 21, 22, 24, 27, 26, 25, 3, 2, 1, 0)
406
407_static char *cornerstr[] = {
408 [_c_ufr] = "UFR",
409 [_c_ubl] = "UBL",
410 [_c_dfl] = "DFL",
411 [_c_dbr] = "DBR",
412 [_c_ufl] = "UFL",
413 [_c_ubr] = "UBR",
414 [_c_dfr] = "DFR",
415 [_c_dbl] = "DBL"
416};
417
418_static char *cornerstralt[] = {
419 [_c_ufr] = "URF",
420 [_c_ubl] = "ULB",
421 [_c_dfl] = "DLF",
422 [_c_dbr] = "DRB",
423 [_c_ufl] = "ULF",
424 [_c_ubr] = "URB",
425 [_c_dfr] = "DRF",
426 [_c_dbl] = "DLB"
427};
428
429_static char *edgestr[] = {
430 [_e_uf] = "UF",
431 [_e_ub] = "UB",
432 [_e_db] = "DB",
433 [_e_df] = "DF",
434 [_e_ur] = "UR",
435 [_e_ul] = "UL",
436 [_e_dl] = "DL",
437 [_e_dr] = "DR",
438 [_e_fr] = "FR",
439 [_e_fl] = "FL",
440 [_e_bl] = "BL",
441 [_e_br] = "BR"
442};
443
444_static char *movestr[] = {
445 [U] = "U",
446 [U2] = "U2",
447 [U3] = "U'",
448 [D] = "D",
449 [D2] = "D2",
450 [D3] = "D'",
451 [R] = "R",
452 [R2] = "R2",
453 [R3] = "R'",
454 [L] = "L",
455 [L2] = "L2",
456 [L3] = "L'",
457 [F] = "F",
458 [F2] = "F2",
459 [F3] = "F'",
460 [B] = "B",
461 [B2] = "B2",
462 [B3] = "B'",
463};
464
465_static char *transstr[] = {
466 [UFr] = "rotation UF",
467 [UFm] = "mirrored UF",
468 [ULr] = "rotation UL",
469 [ULm] = "mirrored UL",
470 [UBr] = "rotation UB",
471 [UBm] = "mirrored UB",
472 [URr] = "rotation UR",
473 [URm] = "mirrored UR",
474 [DFr] = "rotation DF",
475 [DFm] = "mirrored DF",
476 [DLr] = "rotation DL",
477 [DLm] = "mirrored DL",
478 [DBr] = "rotation DB",
479 [DBm] = "mirrored DB",
480 [DRr] = "rotation DR",
481 [DRm] = "mirrored DR",
482 [RUr] = "rotation RU",
483 [RUm] = "mirrored RU",
484 [RFr] = "rotation RF",
485 [RFm] = "mirrored RF",
486 [RDr] = "rotation RD",
487 [RDm] = "mirrored RD",
488 [RBr] = "rotation RB",
489 [RBm] = "mirrored RB",
490 [LUr] = "rotation LU",
491 [LUm] = "mirrored LU",
492 [LFr] = "rotation LF",
493 [LFm] = "mirrored LF",
494 [LDr] = "rotation LD",
495 [LDm] = "mirrored LD",
496 [LBr] = "rotation LB",
497 [LBm] = "mirrored LB",
498 [FUr] = "rotation FU",
499 [FUm] = "mirrored FU",
500 [FRr] = "rotation FR",
501 [FRm] = "mirrored FR",
502 [FDr] = "rotation FD",
503 [FDm] = "mirrored FD",
504 [FLr] = "rotation FL",
505 [FLm] = "mirrored FL",
506 [BUr] = "rotation BU",
507 [BUm] = "mirrored BU",
508 [BRr] = "rotation BR",
509 [BRm] = "mirrored BR",
510 [BDr] = "rotation BD",
511 [BDm] = "mirrored BD",
512 [BLr] = "rotation BL",
513 [BLm] = "mirrored BL",
514};
515
516static uint8_t inverse_trans_table[48] = {
517 [UFr] = UFr,
518 [UFm] = UFm,
519 [ULr] = URr,
520 [ULm] = ULm,
521 [UBr] = UBr,
522 [UBm] = UBm,
523 [URr] = ULr,
524 [URm] = URm,
525 [DFr] = DFr,
526 [DFm] = DFm,
527 [DLr] = DLr,
528 [DLm] = DRm,
529 [DBr] = DBr,
530 [DBm] = DBm,
531 [DRr] = DRr,
532 [DRm] = DLm,
533 [RUr] = FRr,
534 [RUm] = FLm,
535 [RFr] = LFr,
536 [RFm] = RFm,
537 [RDr] = BLr,
538 [RDm] = BRm,
539 [RBr] = RBr,
540 [RBm] = LBm,
541 [LUr] = FLr,
542 [LUm] = FRm,
543 [LFr] = RFr,
544 [LFm] = LFm,
545 [LDr] = BRr,
546 [LDm] = BLm,
547 [LBr] = LBr,
548 [LBm] = RBm,
549 [FUr] = FUr,
550 [FUm] = FUm,
551 [FRr] = RUr,
552 [FRm] = LUm,
553 [FDr] = BUr,
554 [FDm] = BUm,
555 [FLr] = LUr,
556 [FLm] = RUm,
557 [BUr] = FDr,
558 [BUm] = FDm,
559 [BRr] = LDr,
560 [BRm] = RDm,
561 [BDr] = BDr,
562 [BDm] = BDm,
563 [BLr] = RDr,
564 [BLm] = LDm,
565};
566
567/******************************************************************************
568Section: portable fast methods
569
570This section contains performance-critical methods that do not use
571advanced CPU instructions. They are used as an alternative to the ones
572in the previous section(s) for unsupported architectures.
573******************************************************************************/
574
575typedef cube_t cube_fast_t;
576
577_static_inline cube_fast_t fastcube(
578 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t,
579 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t,
580 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t,
581 uint8_t, uint8_t, uint8_t, uint8_t, uint8_t
582);
583_static cube_fast_t cubetofast(cube_t);
584_static cube_t fasttocube(cube_fast_t);
585_static_inline bool equal_fast(cube_fast_t, cube_fast_t);
586_static_inline bool issolved_fast(cube_fast_t);
587_static_inline cube_fast_t invertco_fast(cube_fast_t);
588_static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t);
589
590_static_inline int64_t coord_fast_co(cube_fast_t);
591_static_inline int64_t coord_fast_eo(cube_fast_t);
592
593_static_inline cube_fast_t
594fastcube(
595 uint8_t c_ufr,
596 uint8_t c_ubl,
597 uint8_t c_dfl,
598 uint8_t c_dbr,
599 uint8_t c_ufl,
600 uint8_t c_ubr,
601 uint8_t c_dfr,
602 uint8_t c_dbl,
603
604 uint8_t e_uf,
605 uint8_t e_ub,
606 uint8_t e_db,
607 uint8_t e_df,
608 uint8_t e_ur,
609 uint8_t e_ul,
610 uint8_t e_dl,
611 uint8_t e_dr,
612 uint8_t e_fr,
613 uint8_t e_fl,
614 uint8_t e_bl,
615 uint8_t e_br
616)
617{
618 cube_fast_t cube = {
619 .corner = {
620 c_ufr, c_ubl, c_dfl, c_dbr, c_ufl, c_ubr, c_dfr, c_dbl
621 },
622 .edge = {
623 e_uf, e_ub, e_db, e_df, e_ur, e_ul,
624 e_dl, e_dr, e_fr, e_fl, e_bl, e_br
625 }
626 };
627
628 return cube;
629}
630
631_static cube_fast_t
632cubetofast(cube_t cube)
633{
634 cube_fast_t fast;
635 memcpy(&fast, &cube, sizeof(cube_fast_t));
636 return fast;
637}
638
639_static cube_t
640fasttocube(cube_fast_t fast)
641{
642 cube_t cube;
643 memcpy(&cube, &fast, sizeof(cube_fast_t));
644 return cube;
645}
646
647_static_inline bool
648equal_fast(cube_fast_t c1, cube_fast_t c2)
649{
650 uint8_t i;
651 bool ret;
652
653 ret = true;
654 for (i = 0; i < 8; i++)
655 ret = ret && c1.corner[i] == c2.corner[i];
656 for (i = 0; i < 12; i++)
657 ret = ret && c1.edge[i] == c2.edge[i];
658
659 return ret;
660}
661
662_static_inline bool
663issolved_fast(cube_fast_t cube)
664{
665 return equal_fast(cube, solved_fast);
666}
667
668_static_inline cube_fast_t
669invertco_fast(cube_fast_t c)
670{
671 uint8_t i, piece, orien;
672 cube_fast_t ret;
673
674 ret = c;
675 for (i = 0; i < 8; i++) {
676 piece = c.corner[i];
677 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
678 ret.corner[i] = (piece & _pbits) | orien;
679 }
680
681 return ret;
682}
683
684_static_inline cube_fast_t
685compose_fast(cube_fast_t c1, cube_fast_t c2)
686{
687 cube_fast_t ret;
688 uint8_t i, piece1, piece2, p, orien, aux, auy;
689
690 ret = zero_fast;
691
692 for (i = 0; i < 12; i++) {
693 piece2 = c2.edge[i];
694 p = piece2 & _pbits;
695 piece1 = c1.edge[p];
696 orien = (piece2 ^ piece1) & _eobit;
697 ret.edge[i] = (piece1 & _pbits) | orien;
698 }
699
700 for (i = 0; i < 8; i++) {
701 piece2 = c2.corner[i];
702 p = piece2 & _pbits;
703 piece1 = c1.corner[p];
704 aux = (piece2 & _cobits) + (piece1 & _cobits);
705 auy = (aux + _ctwist_cw) >> 2U;
706 orien = (aux + auy) & _cobits2;
707 ret.corner[i] = (piece1 & _pbits) | orien;
708 }
709
710 return ret;
711}
712
713_static_inline int64_t
714coord_fast_co(cube_fast_t c)
715{
716 int i, p;
717 int64_t ret;
718
719 for (ret = 0, i = 0, p = 1; i < 7; i++, p *= 3)
720 ret += p * (c.corner[i] >> _coshift);
721
722 return ret;
723}
724
725_static_inline int64_t
726coord_fast_eo(cube_fast_t c)
727{
728 int i, p;
729 int64_t ret;
730
731 for (ret = 0, i = 1, p = 1; i < 12; i++, p *= 2)
732 ret += p * (c.edge[i] >> _eoshift);
733
734 return ret;
735}
736
737/******************************************************************************
738Section: generic methods
739
740This section contains generic functionality, including the public functions.
741Some of these routines depend on the efficient functions implemented in the
742previous sections, while some other operate directly on the cube.
743******************************************************************************/
744
745#define _move(M, c) compose_fast(c, _move_cube_ ## M)
746#define _premove(M, c) compose_fast(_move_cube_ ## M, c)
747#define _trans_rotation(T, c) \
748 compose_fast(compose_fast(_trans_cube_ ## T, c), \
749 _trans_cube_ ## T ## _inverse)
750#define _trans_mirrored(T, c) \
751 invertco_fast(compose_fast(compose_fast(_trans_cube_ ## T, c), \
752 _trans_cube_ ## T ## _inverse))
753
754#define _foreach_move(_m, _c, _d, instruction) \
755 for (_m = 0; _m < 18; _m++) { _d = move(_c, _m); instruction }
756#define _foreach_trans(_t, _c, _d, instruction) \
757 for (_t = 0; _t < 48; _t++) { _d = transform(_c, _t); instruction }
758
759cube_t solvedcube(void);
760bool isconsistent(cube_t);
761bool issolvable(cube_t);
762bool issolved(cube_t cube);
763bool equal(cube_t, cube_t);
764bool iserror(cube_t);
765cube_t compose(cube_t, cube_t);
766cube_t inverse(cube_t);
767cube_t applymoves(cube_t, char *);
768cube_t applytrans(cube_t, char *);
769cube_t readcube(char *, char *);
770void writecube(char *, cube_t, char *);
771
772_static int permsign(uint8_t *, int);
773_static uint8_t readco(char *);
774_static uint8_t readcp(char *);
775_static uint8_t readeo(char *);
776_static uint8_t readep(char *);
777_static cube_t readcube_H48(char *);
778_static uint8_t readpiece_LST(char **);
779_static cube_t readcube_LST(char *);
780_static int writepiece_LST(uint8_t, char *);
781_static void writecube_H48(cube_t, char *);
782_static void writecube_LST(cube_t, char *);
783_static uint8_t readmove(char);
784_static uint8_t readmodifier(char);
785_static uint8_t readtrans(char *);
786_static int writemoves(uint8_t *, int, char *);
787_static void writetrans(uint8_t, char *);
788_static cube_fast_t move(cube_fast_t, uint8_t);
789_static cube_fast_t transform(cube_fast_t, uint8_t);
790
791cube_t
792solvedcube(void)
793{
794 return solved;
795}
796
797bool
798isconsistent(cube_t cube)
799{
800 uint8_t i, p, e, piece;
801 bool found[12];
802
803 for (i = 0; i < 12; i++)
804 found[i] = false;
805 for (i = 0; i < 12; i++) {
806 piece = cube.edge[i];
807 p = piece & _pbits;
808 e = piece & _eobit;
809 if (p >= 12)
810 goto inconsistent_ep;
811 if (e != 0 && e != _eobit)
812 goto inconsistent_eo;
813 found[p] = true;
814 }
815 for (i = 0; i < 12; i++)
816 if (!found[i])
817 goto inconsistent_ep;
818
819 for (i = 0; i < 8; i++)
820 found[i] = false;
821 for (i = 0; i < 8; i++) {
822 piece = cube.corner[i];
823 p = piece & _pbits;
824 e = piece & _cobits;
825 if (p >= 8)
826 goto inconsistent_cp;
827 if (e != 0 && e != _ctwist_cw && e != _ctwist_ccw)
828 goto inconsistent_co;
829 found[p] = true;
830 }
831 for (i = 0; i < 8; i++)
832 if (!found[i])
833 goto inconsistent_co;
834
835 return true;
836
837inconsistent_ep:
838 DBG_LOG("Inconsistent EP\n");
839 return false;
840inconsistent_cp:
841 DBG_LOG("Inconsistent CP\n");
842 return false;
843inconsistent_eo:
844 DBG_LOG("Inconsistent EO\n");
845 return false;
846inconsistent_co:
847 DBG_LOG("Inconsistent CO\n");
848 return false;
849}
850
851bool
852issolvable(cube_t cube)
853{
854 uint8_t i, eo, co, piece, edges[12], corners[8];
855
856 DBG_ASSERT(isconsistent(cube), false,
857 "issolvable: cube is inconsistent\n");
858
859 for (i = 0; i < 12; i++)
860 edges[i] = cube.edge[i] & _pbits;
861 for (i = 0; i < 8; i++)
862 corners[i] = cube.corner[i] & _pbits;
863
864 if (permsign(edges, 12) != permsign(corners, 8))
865 goto issolvable_parity;
866
867 eo = 0;
868 for (i = 0; i < 12; i++) {
869 piece = cube.edge[i];
870 eo += (piece & _eobit) >> _eoshift;
871 }
872 if (eo % 2 != 0)
873 goto issolvable_eo;
874
875 co = 0;
876 for (i = 0; i < 8; i++) {
877 piece = cube.corner[i];
878 co += (piece & _cobits) >> _coshift;
879 }
880 if (co % 3 != 0)
881 goto issolvable_co;
882
883 return true;
884
885issolvable_parity:
886 DBG_LOG("EP and CP parities are different\n");
887 return false;
888issolvable_eo:
889 DBG_LOG("Odd number of flipped edges\n");
890 return false;
891issolvable_co:
892 DBG_LOG("Sum of corner orientation is not multiple of 3\n");
893 return false;
894}
895
896bool
897issolved(cube_t cube)
898{
899 return equal(cube, solved);
900}
901
902bool
903equal(cube_t c1, cube_t c2)
904{
905 int i;
906 bool ret;
907
908 ret = true;
909 for (i = 0; i < 8; i++)
910 ret = ret && c1.corner[i] == c2.corner[i];
911 for (i = 0; i < 12; i++)
912 ret = ret && c1.edge[i] == c2.edge[i];
913
914 return ret;
915}
916
917bool
918iserror(cube_t cube)
919{
920 return equal(cube, zero);
921}
922
923cube_t
924compose(cube_t c1, cube_t c2)
925{
926 DBG_ASSERT(isconsistent(c1) && isconsistent(c2),
927 zero, "compose error: inconsistent cube\n")
928
929 return fasttocube(compose_fast(cubetofast(c1), cubetofast(c2)));
930}
931
932cube_t
933inverse(cube_t cube)
934{
935 cube_t ret;
936 uint8_t i, piece, orien;
937
938 DBG_ASSERT(isconsistent(cube), zero,
939 "inverse error: inconsistent cube\n");
940
941 ret = zero;
942
943 for (i = 0; i < 12; i++) {
944 piece = cube.edge[i];
945 orien = piece & _eobit;
946 ret.edge[piece & _pbits] = i | orien;
947 }
948
949 for (i = 0; i < 8; i++) {
950 piece = cube.corner[i];
951 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
952 ret.corner[piece & _pbits] = i | orien;
953 }
954
955 return ret;
956}
957
958cube_t
959applymoves(cube_t cube, char *buf)
960{
961 cube_fast_t fast;
962 uint8_t r, m;
963 char *b;
964
965 DBG_ASSERT(isconsistent(cube), zero,
966 "move error: inconsistent cube\n");
967
968 fast = cubetofast(cube);
969
970 for (b = buf; *b != '\0'; b++) {
971 while (*b == ' ' || *b == '\t' || *b == '\n')
972 b++;
973 if (*b == '\0')
974 goto applymoves_finish;
975 if ((r = readmove(*b)) == _error)
976 goto applymoves_error;
977 if ((m = readmodifier(*(b+1))) != 0)
978 b++;
979 fast = move(fast, r + m);
980 }
981
982applymoves_finish:
983 return fasttocube(fast);
984
985applymoves_error:
986 DBG_LOG("applymoves error\n");
987 return zero;
988}
989
990cube_t
991applytrans(cube_t cube, char *buf)
992{
993 cube_fast_t fast;
994 uint8_t t;
995
996 DBG_ASSERT(isconsistent(cube), zero,
997 "transformation error: inconsistent cube\n");
998
999 t = readtrans(buf);
1000 fast = cubetofast(cube);
1001 fast = transform(fast, t);
1002
1003 return fasttocube(fast);
1004}
1005
1006cube_t
1007readcube(char *format, char *buf)
1008{
1009 cube_t cube;
1010
1011 if (!strcmp(format, "H48")) {
1012 cube = readcube_H48(buf);
1013 } else if (!strcmp(format, "LST")) {
1014 cube = readcube_LST(buf);
1015 } else {
1016 DBG_LOG("Cannot read cube in the given format\n");
1017 cube = zero;
1018 }
1019
1020 return cube;
1021}
1022
1023void
1024writecube(char *format, cube_t cube, char *buf)
1025{
1026 char *errormsg;
1027 size_t len;
1028
1029 if (!isconsistent(cube)) {
1030 errormsg = "ERROR: cannot write inconsistent cube";
1031 goto writecube_error;
1032 }
1033
1034 if (!strcmp(format, "H48")) {
1035 writecube_H48(cube, buf);
1036 } else if (!strcmp(format, "LST")) {
1037 writecube_LST(cube, buf);
1038 } else {
1039 errormsg = "ERROR: cannot write cube in the given format";
1040 goto writecube_error;
1041 }
1042
1043 return;
1044
1045writecube_error:
1046 DBG_LOG("writecube error, see stdout for details\n");
1047 len = strlen(errormsg);
1048 memcpy(buf, errormsg, len);
1049 buf[len] = '\n';
1050 buf[len+1] = '\0';
1051}
1052
1053_static int
1054permsign(uint8_t *a, int n)
1055{
1056 int i, j;
1057 uint8_t ret = 0;
1058
1059 for (i = 0; i < n; i++)
1060 for (j = i+1; j < n; j++)
1061 ret += a[i] > a[j] ? 1 : 0;
1062
1063 return ret % 2;
1064}
1065
1066_static uint8_t
1067readco(char *str)
1068{
1069 if (*str == '0')
1070 return 0;
1071 if (*str == '1')
1072 return _ctwist_cw;
1073 if (*str == '2')
1074 return _ctwist_ccw;
1075
1076 DBG_LOG("Error reading CO\n");
1077 return _error;
1078}
1079
1080_static uint8_t
1081readcp(char *str)
1082{
1083 uint8_t c;
1084
1085 for (c = 0; c < 8; c++)
1086 if (!strncmp(str, cornerstr[c], 3) ||
1087 !strncmp(str, cornerstralt[c], 3))
1088 return c;
1089
1090 DBG_LOG("Error reading CP\n");
1091 return _error;
1092}
1093
1094_static uint8_t
1095readeo(char *str)
1096{
1097 if (*str == '0')
1098 return 0;
1099 if (*str == '1')
1100 return _eflip;
1101
1102 DBG_LOG("Error reading EO\n");
1103 return _error;
1104}
1105
1106_static uint8_t
1107readep(char *str)
1108{
1109 uint8_t e;
1110
1111 for (e = 0; e < 12; e++)
1112 if (!strncmp(str, edgestr[e], 2))
1113 return e;
1114
1115 DBG_LOG("Error reading EP\n");
1116 return _error;
1117}
1118
1119_static cube_t
1120readcube_H48(char *buf)
1121{
1122 int i;
1123 uint8_t piece, orient;
1124 cube_t ret = {0};
1125 char *b;
1126
1127 b = buf;
1128
1129 for (i = 0; i < 12; i++) {
1130 while (*b == ' ' || *b == '\t' || *b == '\n')
1131 b++;
1132 if ((piece = readep(b)) == _error)
1133 return zero;
1134 b += 2;
1135 if ((orient = readeo(b)) == _error)
1136 return zero;
1137 b++;
1138 ret.edge[i] = piece | orient;
1139 }
1140 for (i = 0; i < 8; i++) {
1141 while (*b == ' ' || *b == '\t' || *b == '\n')
1142 b++;
1143 if ((piece = readcp(b)) == _error)
1144 return zero;
1145 b += 3;
1146 if ((orient = readco(b)) == _error)
1147 return zero;
1148 b++;
1149 ret.corner[i] = piece | orient;
1150 }
1151
1152 return ret;
1153}
1154
1155_static uint8_t
1156readpiece_LST(char **b)
1157{
1158 uint8_t ret;
1159 bool read;
1160
1161 while (**b == ',' || **b == ' ' || **b == '\t' || **b == '\n')
1162 (*b)++;
1163
1164 for (ret = 0, read = false; **b >= '0' && **b <= '9'; (*b)++) {
1165 read = true;
1166 ret = ret * 10 + (**b) - '0';
1167 }
1168
1169 return read ? ret : _error;
1170}
1171
1172_static cube_t
1173readcube_LST(char *buf)
1174{
1175 int i;
1176 cube_t ret = {0};
1177
1178 for (i = 0; i < 8; i++)
1179 ret.corner[i] = readpiece_LST(&buf);
1180
1181 for (i = 0; i < 12; i++)
1182 ret.edge[i] = readpiece_LST(&buf);
1183
1184 return ret;
1185}
1186
1187_static int
1188writepiece_LST(uint8_t piece, char *buf)
1189{
1190 char digits[3];
1191 int i, len = 0;
1192
1193 while (piece != 0) {
1194 digits[len++] = (piece % 10) + '0';
1195 piece /= 10;
1196 }
1197
1198 if (len == 0)
1199 digits[len++] = '0';
1200
1201 for (i = 0; i < len; i++)
1202 buf[i] = digits[len-i-1];
1203
1204 buf[len] = ',';
1205 buf[len+1] = ' ';
1206
1207 return len+2;
1208}
1209
1210_static void
1211writecube_H48(cube_t cube, char *buf)
1212{
1213 uint8_t piece, perm, orient;
1214 int i;
1215
1216 for (i = 0; i < 12; i++) {
1217 piece = cube.edge[i];
1218 perm = piece & _pbits;
1219 orient = (piece & _eobit) >> _eoshift;
1220 buf[4*i ] = edgestr[perm][0];
1221 buf[4*i + 1] = edgestr[perm][1];
1222 buf[4*i + 2] = orient + '0';
1223 buf[4*i + 3] = ' ';
1224 }
1225 for (i = 0; i < 8; i++) {
1226 piece = cube.corner[i];
1227 perm = piece & _pbits;
1228 orient = (piece & _cobits) >> _coshift;
1229 buf[48 + 5*i ] = cornerstr[perm][0];
1230 buf[48 + 5*i + 1] = cornerstr[perm][1];
1231 buf[48 + 5*i + 2] = cornerstr[perm][2];
1232 buf[48 + 5*i + 3] = orient + '0';
1233 buf[48 + 5*i + 4] = ' ';
1234 }
1235
1236 buf[48+39] = '\0';
1237}
1238
1239_static void
1240writecube_LST(cube_t cube, char *buf)
1241{
1242 int i, ptr;
1243 uint8_t piece;
1244
1245 ptr = 0;
1246
1247 for (i = 0; i < 8; i++) {
1248 piece = cube.corner[i];
1249 ptr += writepiece_LST(piece, buf + ptr);
1250 }
1251
1252 for (i = 0; i < 12; i++) {
1253 piece = cube.edge[i];
1254 ptr += writepiece_LST(piece, buf + ptr);
1255 }
1256
1257 *(buf+ptr-2) = 0;
1258}
1259
1260_static uint8_t
1261readmove(char c)
1262{
1263 switch (c) {
1264 case 'U':
1265 return U;
1266 case 'D':
1267 return D;
1268 case 'R':
1269 return R;
1270 case 'L':
1271 return L;
1272 case 'F':
1273 return F;
1274 case 'B':
1275 return B;
1276 default:
1277 return _error;
1278 }
1279}
1280
1281_static uint8_t
1282readmodifier(char c)
1283{
1284 switch (c) {
1285 case '1': /* Fallthrough */
1286 case '2': /* Fallthrough */
1287 case '3':
1288 return c - '0' - 1;
1289 case '\'':
1290 return 2;
1291 default:
1292 return 0;
1293 }
1294}
1295
1296_static uint8_t
1297readtrans(char *buf)
1298{
1299 uint8_t t;
1300
1301 for (t = 0; t < 48; t++)
1302 if (!strncmp(buf, transstr[t], 11))
1303 return t;
1304
1305 DBG_LOG("readtrans error\n");
1306 return _error;
1307}
1308
1309_static int
1310writemoves(uint8_t *m, int n, char *buf)
1311{
1312 int i;
1313 size_t len;
1314 char *b, *s;
1315
1316 for (i = 0, b = buf; i < n; i++, b++) {
1317 s = movestr[m[i]];
1318 len = strlen(s);
1319 memcpy(b, s, len);
1320 b += len;
1321 *b = ' ';
1322 }
1323
1324 if (b != buf)
1325 b--; /* Remove last space */
1326 *b = '\0';
1327
1328 return b - buf;
1329}
1330
1331_static void
1332writetrans(uint8_t t, char *buf)
1333{
1334 if (t >= 48)
1335 memcpy(buf, "error trans", 11);
1336 else
1337 memcpy(buf, transstr[t], 11);
1338 buf[11] = '\0';
1339}
1340
1341_static cube_fast_t
1342move(cube_fast_t c, uint8_t m)
1343{
1344 switch (m) {
1345 case U:
1346 return _move(U, c);
1347 case U2:
1348 return _move(U2, c);
1349 case U3:
1350 return _move(U3, c);
1351 case D:
1352 return _move(D, c);
1353 case D2:
1354 return _move(D2, c);
1355 case D3:
1356 return _move(D3, c);
1357 case R:
1358 return _move(R, c);
1359 case R2:
1360 return _move(R2, c);
1361 case R3:
1362 return _move(R3, c);
1363 case L:
1364 return _move(L, c);
1365 case L2:
1366 return _move(L2, c);
1367 case L3:
1368 return _move(L3, c);
1369 case F:
1370 return _move(F, c);
1371 case F2:
1372 return _move(F2, c);
1373 case F3:
1374 return _move(F3, c);
1375 case B:
1376 return _move(B, c);
1377 case B2:
1378 return _move(B2, c);
1379 case B3:
1380 return _move(B3, c);
1381 default:
1382 DBG_LOG("move error, unknown move\n");
1383 return zero_fast;
1384 }
1385}
1386
1387_static cube_fast_t
1388transform(cube_fast_t c, uint8_t t)
1389{
1390 switch (t) {
1391 case UFr:
1392 return _trans_rotation(UFr, c);
1393 case ULr:
1394 return _trans_rotation(ULr, c);
1395 case UBr:
1396 return _trans_rotation(UBr, c);
1397 case URr:
1398 return _trans_rotation(URr, c);
1399 case DFr:
1400 return _trans_rotation(DFr, c);
1401 case DLr:
1402 return _trans_rotation(DLr, c);
1403 case DBr:
1404 return _trans_rotation(DBr, c);
1405 case DRr:
1406 return _trans_rotation(DRr, c);
1407 case RUr:
1408 return _trans_rotation(RUr, c);
1409 case RFr:
1410 return _trans_rotation(RFr, c);
1411 case RDr:
1412 return _trans_rotation(RDr, c);
1413 case RBr:
1414 return _trans_rotation(RBr, c);
1415 case LUr:
1416 return _trans_rotation(LUr, c);
1417 case LFr:
1418 return _trans_rotation(LFr, c);
1419 case LDr:
1420 return _trans_rotation(LDr, c);
1421 case LBr:
1422 return _trans_rotation(LBr, c);
1423 case FUr:
1424 return _trans_rotation(FUr, c);
1425 case FRr:
1426 return _trans_rotation(FRr, c);
1427 case FDr:
1428 return _trans_rotation(FDr, c);
1429 case FLr:
1430 return _trans_rotation(FLr, c);
1431 case BUr:
1432 return _trans_rotation(BUr, c);
1433 case BRr:
1434 return _trans_rotation(BRr, c);
1435 case BDr:
1436 return _trans_rotation(BDr, c);
1437 case BLr:
1438 return _trans_rotation(BLr, c);
1439 case UFm:
1440 return _trans_mirrored(UFm, c);
1441 case ULm:
1442 return _trans_mirrored(ULm, c);
1443 case UBm:
1444 return _trans_mirrored(UBm, c);
1445 case URm:
1446 return _trans_mirrored(URm, c);
1447 case DFm:
1448 return _trans_mirrored(DFm, c);
1449 case DLm:
1450 return _trans_mirrored(DLm, c);
1451 case DBm:
1452 return _trans_mirrored(DBm, c);
1453 case DRm:
1454 return _trans_mirrored(DRm, c);
1455 case RUm:
1456 return _trans_mirrored(RUm, c);
1457 case RFm:
1458 return _trans_mirrored(RFm, c);
1459 case RDm:
1460 return _trans_mirrored(RDm, c);
1461 case RBm:
1462 return _trans_mirrored(RBm, c);
1463 case LUm:
1464 return _trans_mirrored(LUm, c);
1465 case LFm:
1466 return _trans_mirrored(LFm, c);
1467 case LDm:
1468 return _trans_mirrored(LDm, c);
1469 case LBm:
1470 return _trans_mirrored(LBm, c);
1471 case FUm:
1472 return _trans_mirrored(FUm, c);
1473 case FRm:
1474 return _trans_mirrored(FRm, c);
1475 case FDm:
1476 return _trans_mirrored(FDm, c);
1477 case FLm:
1478 return _trans_mirrored(FLm, c);
1479 case BUm:
1480 return _trans_mirrored(BUm, c);
1481 case BRm:
1482 return _trans_mirrored(BRm, c);
1483 case BDm:
1484 return _trans_mirrored(BDm, c);
1485 case BLm:
1486 return _trans_mirrored(BLm, c);
1487 default:
1488 DBG_LOG("transform error, unknown transformation\n");
1489 return zero_fast;
1490 }
1491}
1492
1493/******************************************************************************
1494Section: moves, move sequences and transformations
1495
1496This section contains methods to work with moves and arrays of moves. They
1497do not rely on the cube structure.
1498******************************************************************************/
1499
1500_static_inline uint8_t inverse_trans(uint8_t);
1501_static_inline uint8_t movebase(uint8_t);
1502_static_inline uint8_t moveaxis(uint8_t);
1503
1504_static_inline uint8_t
1505inverse_trans(uint8_t t)
1506{
1507 return inverse_trans_table[t];
1508}
1509
1510_static_inline uint8_t
1511movebase(uint8_t move)
1512{
1513 return move / 3;
1514}
1515
1516_static_inline uint8_t
1517moveaxis(uint8_t move)
1518{
1519 return move / 6;
1520}
diff --git a/cube.h b/cube.h
new file mode 100644
index 0000000..72447a7
--- /dev/null
+++ b/cube.h
@@ -0,0 +1,95 @@
1/******************************************************************************
2Cube type definition
3
4Each piece is represented by an (unsigned) 8-bit integer. The 4
5least-significant bits determine which piece it is, the other 4 determine
6the orientation.
7
8Edges are numbered as follows (see also cube.c):
9UF=0 UB=1 DB=2 DF=3 UR=4 UL=5 DL=6 DR=7 FR=8 FL=9 BL=10 BR=11
10
11Corners are numbered as follows:
12UFR=0 UBL=1 DFL=2 DBR=3 UFL=4 UBR=5 DFR=6 DBL=7
13
14The orientation of the edges is with respect to F/B, the orientation of
15corners is with respect to U/D.
16
17The permutation of the center pieces is not stored. This means that the
18cube is assumed to be in a fixed orientation.
19
20TODO: define EO and CO better, explain how to use them
21TODO: encode centers?
22
23The exact cube type structure depends on your system's configuration. If
24you operate on the cube only via the functions provided below, you don't
25need to worry about this.
26******************************************************************************/
27
28typedef struct {
29 uint8_t corner[8];
30 uint8_t edge[12];
31} cube_t;
32
33/* Returns a copy of the solved cube */
34cube_t solvedcube(void);
35
36/* Basic checks on the cube */
37bool isconsistent(cube_t);
38bool issolvable(cube_t);
39bool issolved(cube_t);
40bool equal(cube_t, cube_t);
41
42/* All functions can return an error value, use iserror() to check this */
43bool iserror(cube_t);
44
45/* Apply the second cube on the first as a move sequence */
46cube_t compose(cube_t, cube_t);
47
48/* Invert the cube */
49cube_t inverse(cube_t);
50
51/* Check if a cube represent a valid state (possibly unsolvable) */
52
53/* TODO comment on these and the format for moves and trans */
54/* For trans, only one trans is supported */
55cube_t applymoves(cube_t, char *);
56cube_t applytrans(cube_t, char *);
57
58/******************************************************************************
59Read / write utilities
60
61Reading and writing is not done directly via stdin / stdout, but via an
62array of char (called buf in the prototypes below).
63
64Multiple representations of the cube as text are supported:
65
66- H48: a human-readable format.
67 Each edge is represented by two letters denoting the sides it
68 belongs to and one number denoting its orientation (0 oriented, 1
69 mis-oriented). Similarly, each corner is represented by three letters and
70 a number (0 oriented, 1 twisted clockwise, 2 twisted counter-clockwise).
71
72 The solved cube looks like this:
73
74 UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0
75 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
76
77 The cube after the moves R'U'F looks like this:
78
79 FL1 BR0 DB0 UR1 UF0 UB0 DL0 FR0 UL1 DF1 BL0 DR0
80 UBL1 DBR1 UFR2 DFR2 DFL2 UBL2 UFL2 DBL0
81
82 Whitespace (including newlines) between pieces is ignored when reading the
83 cube. A single whitespace character is added between pieces when writing.
84
85- SRC: format used to generate code for internal use.
86 If OUT is the output in SRC format, one can use `cube_t cube = OUT` to
87 declare a new cube object.
88
89- LST: a format for internal use and generating code.
90 The cube is printed as a comma-separated list of 20 integers, as they appear
91 in cube_t. Corners come first, followed by edge (unlike H48).
92******************************************************************************/
93
94cube_t readcube(char *format, char *buf);
95void writecube(char *format, cube_t cube, char *buf);
diff --git a/test/000_basic/all.in b/test/000_basic/all.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/000_basic/all.in
diff --git a/test/000_basic/all.out b/test/000_basic/all.out
new file mode 100644
index 0000000..892ad22
--- /dev/null
+++ b/test/000_basic/all.out
@@ -0,0 +1,7 @@
1Solved is solvable
2Solved is solved
3Zero is NOT solvable
4Zero is NOT solved
5Solved and Solved are equal
6Solved and Zero are NOT equal
7Zero and Solved are NOT equal
diff --git a/test/000_basic/basic_tests.c b/test/000_basic/basic_tests.c
new file mode 100644
index 0000000..c4434c5
--- /dev/null
+++ b/test/000_basic/basic_tests.c
@@ -0,0 +1,33 @@
1#include "../test.h"
2
3bool issolved(cube_t);
4bool equal(cube_t, cube_t);
5
6void
7check(cube_t cube, char *name)
8{
9 printf("%s is%s solvable\n", name, issolvable(cube) ? "" : " NOT");
10 printf("%s is%s solved\n", name, issolved(cube) ? "" : " NOT");
11}
12
13void
14check2(cube_t cube1, char *name1, cube_t cube2, char *name2)
15{
16 printf("%s and %s are%s equal\n", name1, name2,
17 equal(cube1, cube2) ? "" : " NOT");
18}
19
20int main(void) {
21 cube_t zero, solved;
22
23 memset(&zero, 0, sizeof(cube_t));
24 solved = solvedcube();
25 check(solved, "Solved");
26 check(zero, "Zero");
27
28 check2(solved, "Solved", solved, "Solved");
29 check2(solved, "Solved", zero, "Zero");
30 check2(zero, "Zero", solved, "Solved");
31
32 return 0;
33}
diff --git a/test/001_cube_conversion/00_solved.in b/test/001_cube_conversion/00_solved.in
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/001_cube_conversion/00_solved.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/001_cube_conversion/00_solved.out b/test/001_cube_conversion/00_solved.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/001_cube_conversion/00_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/001_cube_conversion/01_scrambled.in b/test/001_cube_conversion/01_scrambled.in
new file mode 100644
index 0000000..453cc8a
--- /dev/null
+++ b/test/001_cube_conversion/01_scrambled.in
@@ -0,0 +1 @@
BL1 DB0 UL1 DF0 BR1 UF1 DL0 FL1 UB0 DR1 FR1 UR1 UBR2 UBL1 DFR2 DBL2 DBR0 DFL0 UFR0 UFL2
diff --git a/test/001_cube_conversion/01_scrambled.out b/test/001_cube_conversion/01_scrambled.out
new file mode 100644
index 0000000..453cc8a
--- /dev/null
+++ b/test/001_cube_conversion/01_scrambled.out
@@ -0,0 +1 @@
BL1 DB0 UL1 DF0 BR1 UF1 DL0 FL1 UB0 DR1 FR1 UR1 UBR2 UBL1 DFR2 DBL2 DBR0 DFL0 UFR0 UFL2
diff --git a/test/001_cube_conversion/cube_conversion_tests.c b/test/001_cube_conversion/cube_conversion_tests.c
new file mode 100644
index 0000000..589eb82
--- /dev/null
+++ b/test/001_cube_conversion/cube_conversion_tests.c
@@ -0,0 +1,27 @@
1#include "../test.h"
2
3cube_fast_t cubetofast(cube_t);
4cube_t fasttocube(cube_fast_t);
5bool equal(cube_t, cube_t);
6
7int main(void) {
8 char cubestr[STRLENMAX];
9 cube_t cube, cube2;
10 cube_fast_t fast;
11
12 fgets(cubestr, STRLENMAX, stdin);
13 cube = readcube("H48", cubestr);
14 fast = cubetofast(cube);
15 cube2 = fasttocube(fast);
16
17 if (iserror(cube)) {
18 printf("Error reading cube\n");
19 } else if (iserror(cube2)) {
20 printf("Error converting cube\n");
21 } else {
22 writecube("H48", cube2, cubestr);
23 printf("%s\n", cubestr);
24 }
25
26 return 0;
27}
diff --git a/test/010_math_permsign/00_solved.in b/test/010_math_permsign/00_solved.in
new file mode 100644
index 0000000..54b5db0
--- /dev/null
+++ b/test/010_math_permsign/00_solved.in
@@ -0,0 +1,8 @@
17
20
31
42
53
64
75
86
diff --git a/test/010_math_permsign/00_solved.out b/test/010_math_permsign/00_solved.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/010_math_permsign/00_solved.out
@@ -0,0 +1 @@
0
diff --git a/test/010_math_permsign/01_3cycle.in b/test/010_math_permsign/01_3cycle.in
new file mode 100644
index 0000000..bfabfd6
--- /dev/null
+++ b/test/010_math_permsign/01_3cycle.in
@@ -0,0 +1,6 @@
15
20
34
41
53
62
diff --git a/test/010_math_permsign/01_3cycle.out b/test/010_math_permsign/01_3cycle.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/010_math_permsign/01_3cycle.out
@@ -0,0 +1 @@
0
diff --git a/test/010_math_permsign/02_22swap.in b/test/010_math_permsign/02_22swap.in
new file mode 100644
index 0000000..d0b0921
--- /dev/null
+++ b/test/010_math_permsign/02_22swap.in
@@ -0,0 +1,13 @@
112
20
31
48
53
65
74
86
97
102
119
1210
1311
diff --git a/test/010_math_permsign/02_22swap.out b/test/010_math_permsign/02_22swap.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/010_math_permsign/02_22swap.out
@@ -0,0 +1 @@
0
diff --git a/test/010_math_permsign/03_singleswap.in b/test/010_math_permsign/03_singleswap.in
new file mode 100644
index 0000000..42a584b
--- /dev/null
+++ b/test/010_math_permsign/03_singleswap.in
@@ -0,0 +1,7 @@
16
24
31
42
53
60
75
diff --git a/test/010_math_permsign/03_singleswap.out b/test/010_math_permsign/03_singleswap.out
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/test/010_math_permsign/03_singleswap.out
@@ -0,0 +1 @@
1
diff --git a/test/010_math_permsign/04_5ycle.in b/test/010_math_permsign/04_5ycle.in
new file mode 100644
index 0000000..630f6fa
--- /dev/null
+++ b/test/010_math_permsign/04_5ycle.in
@@ -0,0 +1,11 @@
110
20
31
46
52
63
74
85
97
108
119
diff --git a/test/010_math_permsign/04_5ycle.out b/test/010_math_permsign/04_5ycle.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/010_math_permsign/04_5ycle.out
@@ -0,0 +1 @@
0
diff --git a/test/010_math_permsign/05_6ycle.in b/test/010_math_permsign/05_6ycle.in
new file mode 100644
index 0000000..a226bae
--- /dev/null
+++ b/test/010_math_permsign/05_6ycle.in
@@ -0,0 +1,9 @@
18
26
30
41
53
62
74
85
97
diff --git a/test/010_math_permsign/05_6ycle.out b/test/010_math_permsign/05_6ycle.out
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/test/010_math_permsign/05_6ycle.out
@@ -0,0 +1 @@
1
diff --git a/test/010_math_permsign/permsgn_tests.c b/test/010_math_permsign/permsgn_tests.c
new file mode 100644
index 0000000..46c7377
--- /dev/null
+++ b/test/010_math_permsign/permsgn_tests.c
@@ -0,0 +1,22 @@
1#include "../test.h"
2
3int permsign(uint8_t *, int);
4
5int main(void) {
6 char str[STRLENMAX];
7 uint8_t a[100];
8 int n, i, p;
9
10 fgets(str, STRLENMAX, stdin);
11 n = atoi(str);
12
13 for (i = 0; i < n; i++) {
14 fgets(str, STRLENMAX, stdin);
15 a[i] = atoi(str);
16 }
17
18 p = permsign(a, n);
19 printf("%d\n", p);
20
21 return 0;
22}
diff --git a/test/020_io_H48_read_write/00_garbage.in b/test/020_io_H48_read_write/00_garbage.in
new file mode 100644
index 0000000..9ac203a
--- /dev/null
+++ b/test/020_io_H48_read_write/00_garbage.in
@@ -0,0 +1,3 @@
1FUF0 UBBBR2 k4
2hello
3garbage
diff --git a/test/020_io_H48_read_write/00_garbage.out b/test/020_io_H48_read_write/00_garbage.out
new file mode 100644
index 0000000..5b9114e
--- /dev/null
+++ b/test/020_io_H48_read_write/00_garbage.out
@@ -0,0 +1 @@
Error reading cube
diff --git a/test/020_io_H48_read_write/01_solved_oneline.in b/test/020_io_H48_read_write/01_solved_oneline.in
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/020_io_H48_read_write/01_solved_oneline.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/01_solved_oneline.out b/test/020_io_H48_read_write/01_solved_oneline.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/020_io_H48_read_write/01_solved_oneline.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/02_solved_oneline_whitespace.in b/test/020_io_H48_read_write/02_solved_oneline_whitespace.in
new file mode 100644
index 0000000..5d10368
--- /dev/null
+++ b/test/020_io_H48_read_write/02_solved_oneline_whitespace.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/02_solved_oneline_whitespace.out b/test/020_io_H48_read_write/02_solved_oneline_whitespace.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/020_io_H48_read_write/02_solved_oneline_whitespace.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/03_solved_multiline.in b/test/020_io_H48_read_write/03_solved_multiline.in
new file mode 100644
index 0000000..9f9652b
--- /dev/null
+++ b/test/020_io_H48_read_write/03_solved_multiline.in
@@ -0,0 +1,9 @@
1UF0 UB0
2DB0 DF0 UR0 UL0 DL0
3DR0 FR0 FL0 BL0 BR0 UFR0
4
5UBL0 DFL0 DBR0
6
7
8UFL0 UBR0 DFR0
9 DBL0
diff --git a/test/020_io_H48_read_write/03_solved_multiline.out b/test/020_io_H48_read_write/03_solved_multiline.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/020_io_H48_read_write/03_solved_multiline.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/04_unsolvable_ep.in b/test/020_io_H48_read_write/04_unsolvable_ep.in
new file mode 100644
index 0000000..8483962
--- /dev/null
+++ b/test/020_io_H48_read_write/04_unsolvable_ep.in
@@ -0,0 +1 @@
UB0 UF0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/04_unsolvable_ep.out b/test/020_io_H48_read_write/04_unsolvable_ep.out
new file mode 100644
index 0000000..e35c6e4
--- /dev/null
+++ b/test/020_io_H48_read_write/04_unsolvable_ep.out
@@ -0,0 +1 @@
Cube is not solvable
diff --git a/test/020_io_H48_read_write/05_unsolvable_eo.in b/test/020_io_H48_read_write/05_unsolvable_eo.in
new file mode 100644
index 0000000..a92089d
--- /dev/null
+++ b/test/020_io_H48_read_write/05_unsolvable_eo.in
@@ -0,0 +1 @@
UF1 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/05_unsolvable_eo.out b/test/020_io_H48_read_write/05_unsolvable_eo.out
new file mode 100644
index 0000000..e35c6e4
--- /dev/null
+++ b/test/020_io_H48_read_write/05_unsolvable_eo.out
@@ -0,0 +1 @@
Cube is not solvable
diff --git a/test/020_io_H48_read_write/06_unsolvable_cp.in b/test/020_io_H48_read_write/06_unsolvable_cp.in
new file mode 100644
index 0000000..2085dd5
--- /dev/null
+++ b/test/020_io_H48_read_write/06_unsolvable_cp.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/06_unsolvable_cp.out b/test/020_io_H48_read_write/06_unsolvable_cp.out
new file mode 100644
index 0000000..e35c6e4
--- /dev/null
+++ b/test/020_io_H48_read_write/06_unsolvable_cp.out
@@ -0,0 +1 @@
Cube is not solvable
diff --git a/test/020_io_H48_read_write/07_unsolvable_co.in b/test/020_io_H48_read_write/07_unsolvable_co.in
new file mode 100644
index 0000000..abd74e2
--- /dev/null
+++ b/test/020_io_H48_read_write/07_unsolvable_co.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR1 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/020_io_H48_read_write/07_unsolvable_co.out b/test/020_io_H48_read_write/07_unsolvable_co.out
new file mode 100644
index 0000000..e35c6e4
--- /dev/null
+++ b/test/020_io_H48_read_write/07_unsolvable_co.out
@@ -0,0 +1 @@
Cube is not solvable
diff --git a/test/020_io_H48_read_write/08_unsolved.in b/test/020_io_H48_read_write/08_unsolved.in
new file mode 100644
index 0000000..c992ce7
--- /dev/null
+++ b/test/020_io_H48_read_write/08_unsolved.in
@@ -0,0 +1,6 @@
1UL1 DR0 UB0 DL1
2UR0 FR1 DB0 BR0
3UF1 DF0 BL0 FL0
4
5UBL0 DLF1 DBR2 UFR1
6DFR1 UBR1 UFL0 DBL0
diff --git a/test/020_io_H48_read_write/08_unsolved.out b/test/020_io_H48_read_write/08_unsolved.out
new file mode 100644
index 0000000..8c132cf
--- /dev/null
+++ b/test/020_io_H48_read_write/08_unsolved.out
@@ -0,0 +1 @@
UL1 DR0 UB0 DL1 UR0 FR1 DB0 BR0 UF1 DF0 BL0 FL0 UBL0 DFL1 DBR2 UFR1 DFR1 UBR1 UFL0 DBL0
diff --git a/test/020_io_H48_read_write/io_H48_tests.c b/test/020_io_H48_read_write/io_H48_tests.c
new file mode 100644
index 0000000..705356c
--- /dev/null
+++ b/test/020_io_H48_read_write/io_H48_tests.c
@@ -0,0 +1,24 @@
1#include "../test.h"
2
3int main(void) {
4 char str[STRLENMAX], *aux;
5 cube_t cube;
6
7 aux = str;
8 while (fgets(aux, STRLENMAX, stdin) != NULL)
9 while (*aux != '\n')
10 aux++;
11
12 cube = readcube("H48", str);
13
14 if (iserror(cube)) {
15 printf("Error reading cube\n");
16 } else if (!issolvable(cube)) {
17 printf("Cube is not solvable\n");
18 } else {
19 writecube("H48", cube, str);
20 printf("%s\n", str);
21 }
22
23 return 0;
24}
diff --git a/test/023_io_LST_write/01_solved.in b/test/023_io_LST_write/01_solved.in
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/023_io_LST_write/01_solved.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/023_io_LST_write/01_solved.out b/test/023_io_LST_write/01_solved.out
new file mode 100644
index 0000000..c5b394b
--- /dev/null
+++ b/test/023_io_LST_write/01_solved.out
@@ -0,0 +1 @@
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
diff --git a/test/023_io_LST_write/02_scrambled.in b/test/023_io_LST_write/02_scrambled.in
new file mode 100644
index 0000000..6a05bbc
--- /dev/null
+++ b/test/023_io_LST_write/02_scrambled.in
@@ -0,0 +1 @@
FL0 DB0 UB1 FR0 UR0 DF0 UF0 BR1 UL1 BL1 DL0 DR0 DFR1 UFR1 UBR1 UFL2 DBR2 DFL0 DBL2 UBL0
diff --git a/test/023_io_LST_write/02_scrambled.out b/test/023_io_LST_write/02_scrambled.out
new file mode 100644
index 0000000..9fcb603
--- /dev/null
+++ b/test/023_io_LST_write/02_scrambled.out
@@ -0,0 +1 @@
38, 32, 37, 68, 67, 2, 71, 1, 9, 2, 17, 8, 4, 3, 0, 27, 21, 26, 6, 7
diff --git a/test/023_io_LST_write/io_LST_tests.c b/test/023_io_LST_write/io_LST_tests.c
new file mode 100644
index 0000000..df35632
--- /dev/null
+++ b/test/023_io_LST_write/io_LST_tests.c
@@ -0,0 +1,24 @@
1#include "../test.h"
2
3int main(void) {
4 char str[STRLENMAX], *aux;
5 cube_t cube;
6
7 aux = str;
8 while (fgets(aux, STRLENMAX, stdin) != NULL)
9 while (*aux != '\n')
10 aux++;
11
12 cube = readcube("H48", str);
13
14 if (iserror(cube)) {
15 printf("Error reading cube\n");
16 } else if (!issolvable(cube)) {
17 printf("Cube is not solvable\n");
18 } else {
19 writecube("LST", cube, str);
20 printf("%s\n", str);
21 }
22
23 return 0;
24}
diff --git a/test/024_io_LST_read/01_solved.in b/test/024_io_LST_read/01_solved.in
new file mode 100644
index 0000000..c5b394b
--- /dev/null
+++ b/test/024_io_LST_read/01_solved.in
@@ -0,0 +1 @@
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
diff --git a/test/024_io_LST_read/01_solved.out b/test/024_io_LST_read/01_solved.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/024_io_LST_read/01_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/024_io_LST_read/02_scrambled.in b/test/024_io_LST_read/02_scrambled.in
new file mode 100644
index 0000000..9fcb603
--- /dev/null
+++ b/test/024_io_LST_read/02_scrambled.in
@@ -0,0 +1 @@
38, 32, 37, 68, 67, 2, 71, 1, 9, 2, 17, 8, 4, 3, 0, 27, 21, 26, 6, 7
diff --git a/test/024_io_LST_read/02_scrambled.out b/test/024_io_LST_read/02_scrambled.out
new file mode 100644
index 0000000..6a05bbc
--- /dev/null
+++ b/test/024_io_LST_read/02_scrambled.out
@@ -0,0 +1 @@
FL0 DB0 UB1 FR0 UR0 DF0 UF0 BR1 UL1 BL1 DL0 DR0 DFR1 UFR1 UBR1 UFL2 DBR2 DFL0 DBL2 UBL0
diff --git a/test/024_io_LST_read/io_LST_tests.c b/test/024_io_LST_read/io_LST_tests.c
new file mode 100644
index 0000000..506a23d
--- /dev/null
+++ b/test/024_io_LST_read/io_LST_tests.c
@@ -0,0 +1,24 @@
1#include "../test.h"
2
3int main(void) {
4 char str[STRLENMAX], *aux;
5 cube_t cube;
6
7 aux = str;
8 while (fgets(aux, STRLENMAX, stdin) != NULL)
9 while (*aux != '\n')
10 aux++;
11
12 cube = readcube("LST", str);
13
14 if (iserror(cube)) {
15 printf("Error reading cube\n");
16 } else if (!issolvable(cube)) {
17 printf("Cube is not solvable\n");
18 } else {
19 writecube("H48", cube, str);
20 printf("%s\n", str);
21 }
22
23 return 0;
24}
diff --git a/test/030_move/000_nomove_solved.in b/test/030_move/000_nomove_solved.in
new file mode 100644
index 0000000..07cf178
--- /dev/null
+++ b/test/030_move/000_nomove_solved.in
@@ -0,0 +1,2 @@
1
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/000_nomove_solved.out b/test/030_move/000_nomove_solved.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/030_move/000_nomove_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/001_nomove_scrambled.in b/test/030_move/001_nomove_scrambled.in
new file mode 100644
index 0000000..fd1d23c
--- /dev/null
+++ b/test/030_move/001_nomove_scrambled.in
@@ -0,0 +1,2 @@
1
2BR0 DF1 DL1 FR0 UB1 DR1 UF0 UR0 UL0 FL1 BL0 DB1 UBL0 DBR1 UFL1 DFR2 UFR0 UBR1 DBL1 DFL0
diff --git a/test/030_move/001_nomove_scrambled.out b/test/030_move/001_nomove_scrambled.out
new file mode 100644
index 0000000..bd2cca0
--- /dev/null
+++ b/test/030_move/001_nomove_scrambled.out
@@ -0,0 +1 @@
BR0 DF1 DL1 FR0 UB1 DR1 UF0 UR0 UL0 FL1 BL0 DB1 UBL0 DBR1 UFL1 DFR2 UFR0 UBR1 DBL1 DFL0
diff --git a/test/030_move/010_U_solved.in b/test/030_move/010_U_solved.in
new file mode 100644
index 0000000..62495cb
--- /dev/null
+++ b/test/030_move/010_U_solved.in
@@ -0,0 +1,2 @@
1U
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/010_U_solved.out b/test/030_move/010_U_solved.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/030_move/010_U_solved.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/030_move/011_U_scrambled.in b/test/030_move/011_U_scrambled.in
new file mode 100644
index 0000000..012faaf
--- /dev/null
+++ b/test/030_move/011_U_scrambled.in
@@ -0,0 +1,2 @@
1U
2BR0 DF1 DL1 FR0 UB1 DR1 UF0 UR0 UL0 FL1 BL0 DB1 UBL0 DBR1 UFL1 DFR2 UFR0 UBR1 DBL1 DFL0
diff --git a/test/030_move/011_U_scrambled.out b/test/030_move/011_U_scrambled.out
new file mode 100644
index 0000000..46d2ef7
--- /dev/null
+++ b/test/030_move/011_U_scrambled.out
@@ -0,0 +1 @@
UB1 DR1 DL1 FR0 DF1 BR0 UF0 UR0 UL0 FL1 BL0 DB1 UBR1 UFR0 UFL1 DFR2 UBL0 DBR1 DBL1 DFL0
diff --git a/test/030_move/012_U_inverse.in b/test/030_move/012_U_inverse.in
new file mode 100644
index 0000000..2aa7ffa
--- /dev/null
+++ b/test/030_move/012_U_inverse.in
@@ -0,0 +1,2 @@
1U
2UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/030_move/012_U_inverse.out b/test/030_move/012_U_inverse.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/030_move/012_U_inverse.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/020_U2_solved.in b/test/030_move/020_U2_solved.in
new file mode 100644
index 0000000..ccc84ef
--- /dev/null
+++ b/test/030_move/020_U2_solved.in
@@ -0,0 +1,2 @@
1U2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/020_U2_solved.out b/test/030_move/020_U2_solved.out
new file mode 100644
index 0000000..316ad57
--- /dev/null
+++ b/test/030_move/020_U2_solved.out
@@ -0,0 +1 @@
UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0
diff --git a/test/030_move/021_U2_scrambled.in b/test/030_move/021_U2_scrambled.in
new file mode 100644
index 0000000..bdc034e
--- /dev/null
+++ b/test/030_move/021_U2_scrambled.in
@@ -0,0 +1,2 @@
1U2
2BR0 DF1 DL1 FR0 UB1 DR1 UF0 UR0 UL0 FL1 BL0 DB1 UBL0 DBR1 UFL1 DFR2 UFR0 UBR1 DBL1 DFL0
diff --git a/test/030_move/021_U2_scrambled.out b/test/030_move/021_U2_scrambled.out
new file mode 100644
index 0000000..c89ca1f
--- /dev/null
+++ b/test/030_move/021_U2_scrambled.out
@@ -0,0 +1 @@
DF1 BR0 DL1 FR0 DR1 UB1 UF0 UR0 UL0 FL1 BL0 DB1 DBR1 UBL0 UFL1 DFR2 UBR1 UFR0 DBL1 DFL0
diff --git a/test/030_move/022_U2_inverse.in b/test/030_move/022_U2_inverse.in
new file mode 100644
index 0000000..8ace160
--- /dev/null
+++ b/test/030_move/022_U2_inverse.in
@@ -0,0 +1,2 @@
1U2
2UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0
diff --git a/test/030_move/022_U2_inverse.out b/test/030_move/022_U2_inverse.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/030_move/022_U2_inverse.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/030_U3_solved.in b/test/030_move/030_U3_solved.in
new file mode 100644
index 0000000..49a8847
--- /dev/null
+++ b/test/030_move/030_U3_solved.in
@@ -0,0 +1,2 @@
1U3
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/030_U3_solved.out b/test/030_move/030_U3_solved.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/030_move/030_U3_solved.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/030_move/031_U3_inverse.in b/test/030_move/031_U3_inverse.in
new file mode 100644
index 0000000..44b6ce3
--- /dev/null
+++ b/test/030_move/031_U3_inverse.in
@@ -0,0 +1,2 @@
1U3
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/030_move/031_U3_inverse.out b/test/030_move/031_U3_inverse.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/030_move/031_U3_inverse.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/032_U3_scrambled.in b/test/030_move/032_U3_scrambled.in
new file mode 100644
index 0000000..a00608c
--- /dev/null
+++ b/test/030_move/032_U3_scrambled.in
@@ -0,0 +1,2 @@
1U3
2UF1 BR0 DL1 UR1 FR1 FL0 UL0 BL1 DR0 DF1 DB0 UB0 UBR2 DFL1 UFL0 DBR1 UBL2 DFR0 DBL2 UFR1
diff --git a/test/030_move/032_U3_scrambled.out b/test/030_move/032_U3_scrambled.out
new file mode 100644
index 0000000..7d1e8cd
--- /dev/null
+++ b/test/030_move/032_U3_scrambled.out
@@ -0,0 +1 @@
FL0 FR1 DL1 UR1 UF1 BR0 UL0 BL1 DR0 DF1 DB0 UB0 UBL2 DFR0 UFL0 DBR1 DFL1 UBR2 DBL2 UFR1
diff --git a/test/030_move/033_U3_with_prime.in b/test/030_move/033_U3_with_prime.in
new file mode 100644
index 0000000..95e5405
--- /dev/null
+++ b/test/030_move/033_U3_with_prime.in
@@ -0,0 +1,2 @@
1U'
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/033_U3_with_prime.out b/test/030_move/033_U3_with_prime.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/030_move/033_U3_with_prime.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/030_move/040_D_solved.in b/test/030_move/040_D_solved.in
new file mode 100644
index 0000000..cb5edb7
--- /dev/null
+++ b/test/030_move/040_D_solved.in
@@ -0,0 +1,2 @@
1D
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/040_D_solved.out b/test/030_move/040_D_solved.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/030_move/040_D_solved.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/030_move/050_D2_solved.in b/test/030_move/050_D2_solved.in
new file mode 100644
index 0000000..56f47cd
--- /dev/null
+++ b/test/030_move/050_D2_solved.in
@@ -0,0 +1,2 @@
1D2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/050_D2_solved.out b/test/030_move/050_D2_solved.out
new file mode 100644
index 0000000..13b229e
--- /dev/null
+++ b/test/030_move/050_D2_solved.out
@@ -0,0 +1 @@
UF0 UB0 DF0 DB0 UR0 UL0 DR0 DL0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBR0 DFL0 UFL0 UBR0 DBL0 DFR0
diff --git a/test/030_move/060_D3_solved.in b/test/030_move/060_D3_solved.in
new file mode 100644
index 0000000..64d1dd8
--- /dev/null
+++ b/test/030_move/060_D3_solved.in
@@ -0,0 +1,2 @@
1D3
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/060_D3_solved.out b/test/030_move/060_D3_solved.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/030_move/060_D3_solved.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/030_move/070_R_solved.in b/test/030_move/070_R_solved.in
new file mode 100644
index 0000000..108538a
--- /dev/null
+++ b/test/030_move/070_R_solved.in
@@ -0,0 +1,2 @@
1R
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/070_R_solved.out b/test/030_move/070_R_solved.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/030_move/070_R_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/030_move/071_R_scrambled.in b/test/030_move/071_R_scrambled.in
new file mode 100644
index 0000000..0c9dcaf
--- /dev/null
+++ b/test/030_move/071_R_scrambled.in
@@ -0,0 +1,2 @@
1R
2UF1 BR0 DL1 UR1 FR1 FL0 UL0 BL1 DR0 DF1 DB0 UB0 UBR2 DFL1 UFL0 DBR1 UBL2 DFR0 DBL2 UFR1
diff --git a/test/030_move/071_R_scrambled.out b/test/030_move/071_R_scrambled.out
new file mode 100644
index 0000000..650bcc8
--- /dev/null
+++ b/test/030_move/071_R_scrambled.out
@@ -0,0 +1 @@
UF1 BR0 DL1 UR1 DR0 FL0 UL0 UB0 BL1 DF1 DB0 FR1 DBL1 DFL1 UFL0 DFR2 UBL2 UBR0 DBR2 UFR1
diff --git a/test/030_move/080_R2_solved.in b/test/030_move/080_R2_solved.in
new file mode 100644
index 0000000..554a084
--- /dev/null
+++ b/test/030_move/080_R2_solved.in
@@ -0,0 +1,2 @@
1R2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/080_R2_solved.out b/test/030_move/080_R2_solved.out
new file mode 100644
index 0000000..90765e2
--- /dev/null
+++ b/test/030_move/080_R2_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 DR0 UL0 DL0 UR0 BR0 FL0 BL0 FR0 DBR0 UBL0 DFL0 UFR0 UFL0 DFR0 UBR0 DBL0
diff --git a/test/030_move/090_R3_solved.in b/test/030_move/090_R3_solved.in
new file mode 100644
index 0000000..ca6cfd8
--- /dev/null
+++ b/test/030_move/090_R3_solved.in
@@ -0,0 +1,2 @@
1R3
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/090_R3_solved.out b/test/030_move/090_R3_solved.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/030_move/090_R3_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/030_move/100_L_solved.in b/test/030_move/100_L_solved.in
new file mode 100644
index 0000000..14ebb5f
--- /dev/null
+++ b/test/030_move/100_L_solved.in
@@ -0,0 +1,2 @@
1L
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/100_L_solved.out b/test/030_move/100_L_solved.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/030_move/100_L_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/030_move/110_L2_solved.in b/test/030_move/110_L2_solved.in
new file mode 100644
index 0000000..8224bcd
--- /dev/null
+++ b/test/030_move/110_L2_solved.in
@@ -0,0 +1,2 @@
1L2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/110_L2_solved.out b/test/030_move/110_L2_solved.out
new file mode 100644
index 0000000..2498c87
--- /dev/null
+++ b/test/030_move/110_L2_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 DL0 UL0 DR0 FR0 BL0 FL0 BR0 UFR0 DFL0 UBL0 DBR0 DBL0 UBR0 DFR0 UFL0
diff --git a/test/030_move/120_L3_solved.in b/test/030_move/120_L3_solved.in
new file mode 100644
index 0000000..552d319
--- /dev/null
+++ b/test/030_move/120_L3_solved.in
@@ -0,0 +1,2 @@
1L3
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/120_L3_solved.out b/test/030_move/120_L3_solved.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/030_move/120_L3_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/030_move/130_F_solved.in b/test/030_move/130_F_solved.in
new file mode 100644
index 0000000..abdbd35
--- /dev/null
+++ b/test/030_move/130_F_solved.in
@@ -0,0 +1,2 @@
1F
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/130_F_solved.out b/test/030_move/130_F_solved.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/030_move/130_F_solved.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/030_move/132_F_scrambled.in b/test/030_move/132_F_scrambled.in
new file mode 100644
index 0000000..8b15575
--- /dev/null
+++ b/test/030_move/132_F_scrambled.in
@@ -0,0 +1,2 @@
1F
2DL1 BR0 DR0 UR1 DF0 FL1 BL0 UL0 FR0 UF0 DB1 UB0 UFR0 DBL1 DBR0 UFL1 DFR1 DFL1 UBL2 UBR0
diff --git a/test/030_move/132_F_scrambled.out b/test/030_move/132_F_scrambled.out
new file mode 100644
index 0000000..3aea663
--- /dev/null
+++ b/test/030_move/132_F_scrambled.out
@@ -0,0 +1 @@
UF1 BR0 DR0 FR1 DF0 FL1 BL0 UL0 DL0 UR0 DB1 UB0 DFR2 DBL1 UBL0 UFL1 DBR2 DFL1 UFR2 UBR0
diff --git a/test/030_move/133_F_scrambled_2.in b/test/030_move/133_F_scrambled_2.in
new file mode 100644
index 0000000..fdd5139
--- /dev/null
+++ b/test/030_move/133_F_scrambled_2.in
@@ -0,0 +1,2 @@
1F
2BL1 DB0 UL1 DF0 BR1 UF1 DL0 FL1 UB0 DR1 FR1 UR1 UBR2 UBL1 DFR2 DBL2 DBR0 DFL0 UFR0 UFL2
diff --git a/test/030_move/133_F_scrambled_2.out b/test/030_move/133_F_scrambled_2.out
new file mode 100644
index 0000000..3546894
--- /dev/null
+++ b/test/030_move/133_F_scrambled_2.out
@@ -0,0 +1 @@
DR0 DB0 UL1 UB1 BR1 UF1 DL0 FL1 BL0 DF1 FR1 UR1 DBR1 UBL1 UFR1 DBL2 DFR1 DFL0 UBR1 UFL2
diff --git a/test/030_move/140_F2_solved.in b/test/030_move/140_F2_solved.in
new file mode 100644
index 0000000..83aab30
--- /dev/null
+++ b/test/030_move/140_F2_solved.in
@@ -0,0 +1,2 @@
1F2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/140_F2_solved.out b/test/030_move/140_F2_solved.out
new file mode 100644
index 0000000..8aa701f
--- /dev/null
+++ b/test/030_move/140_F2_solved.out
@@ -0,0 +1 @@
DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0
diff --git a/test/030_move/150_F3_solved.in b/test/030_move/150_F3_solved.in
new file mode 100644
index 0000000..2c766c1
--- /dev/null
+++ b/test/030_move/150_F3_solved.in
@@ -0,0 +1,2 @@
1F3
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/150_F3_solved.out b/test/030_move/150_F3_solved.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/030_move/150_F3_solved.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/030_move/160_B_solved.in b/test/030_move/160_B_solved.in
new file mode 100644
index 0000000..6062e45
--- /dev/null
+++ b/test/030_move/160_B_solved.in
@@ -0,0 +1,2 @@
1B
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/160_B_solved.out b/test/030_move/160_B_solved.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/030_move/160_B_solved.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/030_move/170_B2_solved.in b/test/030_move/170_B2_solved.in
new file mode 100644
index 0000000..0ff1190
--- /dev/null
+++ b/test/030_move/170_B2_solved.in
@@ -0,0 +1,2 @@
1B2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/170_B2_solved.out b/test/030_move/170_B2_solved.out
new file mode 100644
index 0000000..9b33e35
--- /dev/null
+++ b/test/030_move/170_B2_solved.out
@@ -0,0 +1 @@
UF0 DB0 UB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BR0 BL0 UFR0 DBR0 DFL0 UBL0 UFL0 DBL0 DFR0 UBR0
diff --git a/test/030_move/180_B3_solved.in b/test/030_move/180_B3_solved.in
new file mode 100644
index 0000000..c59636f
--- /dev/null
+++ b/test/030_move/180_B3_solved.in
@@ -0,0 +1,2 @@
1B3
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/180_B3_solved.out b/test/030_move/180_B3_solved.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/030_move/180_B3_solved.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/030_move/200_scramble_solved.in b/test/030_move/200_scramble_solved.in
new file mode 100644
index 0000000..939d876
--- /dev/null
+++ b/test/030_move/200_scramble_solved.in
@@ -0,0 +1,2 @@
1B' D' B' R2 B' R F D F2 U2 B D2 F R2 F2 L2 F L2 U2
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/200_scramble_solved.out b/test/030_move/200_scramble_solved.out
new file mode 100644
index 0000000..690ff6b
--- /dev/null
+++ b/test/030_move/200_scramble_solved.out
@@ -0,0 +1 @@
BR0 DF0 FL1 UB0 BL0 FR1 UR1 UL0 DR1 DB0 UF1 DL1 DFL0 DFR0 UFL1 UBL2 DBR1 DBL0 UFR1 UBR1
diff --git a/test/030_move/201_solution_scrambled.in b/test/030_move/201_solution_scrambled.in
new file mode 100644
index 0000000..a838b4c
--- /dev/null
+++ b/test/030_move/201_solution_scrambled.in
@@ -0,0 +1,2 @@
1F' B' D2 U2 F2 U' L' U D B D' R2 B' L' R' D' R D L2 U' L' B L L U F U' F' U F U' F2 L' F U F U' F' U2 F2 R2 L2 B2
2BR0 DF0 FL1 UB0 BL0 FR1 UR1 UL0 DR1 DB0 UF1 DL1 DFL0 DFR0 UFL1 UBL2 DBR1 DBL0 UFR1 UBR1
diff --git a/test/030_move/201_solution_scrambled.out b/test/030_move/201_solution_scrambled.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/030_move/201_solution_scrambled.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/300_multimove_solved.in b/test/030_move/300_multimove_solved.in
new file mode 100644
index 0000000..e084353
--- /dev/null
+++ b/test/030_move/300_multimove_solved.in
@@ -0,0 +1,2 @@
1B2 D' L2 D' B2 D B2 R2 B2 D U2 R D R2 B L' B' L2 U B2 U
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/030_move/300_multimove_solved.out b/test/030_move/300_multimove_solved.out
new file mode 100644
index 0000000..6c52430
--- /dev/null
+++ b/test/030_move/300_multimove_solved.out
@@ -0,0 +1 @@
UB1 UL0 UF1 DL0 FL0 DB0 BR0 BL0 DF0 FR0 DR0 UR0 UBR1 DFR1 UBL0 DFL2 DBR1 DBL2 UFR1 UFL1
diff --git a/test/030_move/301_multimove_scrambled.in b/test/030_move/301_multimove_scrambled.in
new file mode 100644
index 0000000..cc649c0
--- /dev/null
+++ b/test/030_move/301_multimove_scrambled.in
@@ -0,0 +1,2 @@
1D2 B2 L U2 B2 L' B2 R' D2 R D2 B F L U F2 L' R' B2 U B2
2UB1 UL0 UF1 DL0 FL0 DB0 BR0 BL0 DF0 FR0 DR0 UR0 UBR1 DFR1 UBL0 DFL2 DBR1 DBL2 UFR1 UFL1
diff --git a/test/030_move/301_multimove_scrambled.out b/test/030_move/301_multimove_scrambled.out
new file mode 100644
index 0000000..102ac1b
--- /dev/null
+++ b/test/030_move/301_multimove_scrambled.out
@@ -0,0 +1 @@
UL1 UB0 DL1 UR0 BL1 DR1 BR0 DB0 FL1 UF0 FR1 DF0 DFR2 DFL0 DBL0 UFL0 UBR1 UBL0 UFR2 DBR1
diff --git a/test/030_move/move_tests.c b/test/030_move/move_tests.c
new file mode 100644
index 0000000..73e9dbe
--- /dev/null
+++ b/test/030_move/move_tests.c
@@ -0,0 +1,25 @@
1#include "../test.h"
2
3cube_t applymoves(cube_t, char *);
4
5int main(void) {
6 char movestr[STRLENMAX], cubestr[STRLENMAX];
7 cube_t cube;
8
9 fgets(movestr, STRLENMAX, stdin);
10 fgets(cubestr, STRLENMAX, stdin);
11 cube = readcube("H48", cubestr);
12
13 cube = applymoves(cube, movestr);
14
15 if (iserror(cube)) {
16 printf("Error moving cube\n");
17 } else if (!issolvable(cube)) {
18 printf("Moved cube is not solvable\n");
19 } else {
20 writecube("H48", cube, cubestr);
21 printf("%s\n", cubestr);
22 }
23
24 return 0;
25}
diff --git a/test/040_inverse_cube/00_solved.in b/test/040_inverse_cube/00_solved.in
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/040_inverse_cube/00_solved.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/040_inverse_cube/00_solved.out b/test/040_inverse_cube/00_solved.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/040_inverse_cube/00_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/040_inverse_cube/01_scrambled.in b/test/040_inverse_cube/01_scrambled.in
new file mode 100644
index 0000000..263213b
--- /dev/null
+++ b/test/040_inverse_cube/01_scrambled.in
@@ -0,0 +1 @@
DR0 DB0 BL0 DF1 UB0 UR1 FR1 UF0 FL1 DL0 BR1 UL1 DBL2 DFL0 UBR1 DFR2 UFR0 DBR1 UBL0 UFL0
diff --git a/test/040_inverse_cube/01_scrambled.out b/test/040_inverse_cube/01_scrambled.out
new file mode 100644
index 0000000..25089c6
--- /dev/null
+++ b/test/040_inverse_cube/01_scrambled.out
@@ -0,0 +1 @@
DR0 UR0 UB0 DF1 UL1 BR1 FL0 UF0 DL1 FR1 DB0 BL1 UFL0 DFR0 UBL0 UBR2 DBL0 DFL2 DBR1 UFR1
diff --git a/test/040_inverse_cube/inverse_tests.c b/test/040_inverse_cube/inverse_tests.c
new file mode 100644
index 0000000..2ff3bc7
--- /dev/null
+++ b/test/040_inverse_cube/inverse_tests.c
@@ -0,0 +1,23 @@
1#include "../test.h"
2
3cube_t inverse(cube_t);
4
5int main(void) {
6 char str[STRLENMAX];
7 cube_t cube, inv;
8
9 fgets(str, STRLENMAX, stdin);
10 cube = readcube("H48", str);
11 inv = inverse(cube);
12
13 if (iserror(inv)) {
14 printf("Error inverting cube\n");
15 } else if (!issolvable(inv)) {
16 printf("Inverted cube is not solvable\n");
17 } else {
18 writecube("H48", inv, str);
19 printf("%s\n", str);
20 }
21
22 return 0;
23}
diff --git a/test/050_compose/00_solved_solved.in b/test/050_compose/00_solved_solved.in
new file mode 100644
index 0000000..4ccdb6e
--- /dev/null
+++ b/test/050_compose/00_solved_solved.in
@@ -0,0 +1,2 @@
1UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/00_solved_solved.out b/test/050_compose/00_solved_solved.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/050_compose/00_solved_solved.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/01_solved_U.in b/test/050_compose/01_solved_U.in
new file mode 100644
index 0000000..e0559dd
--- /dev/null
+++ b/test/050_compose/01_solved_U.in
@@ -0,0 +1,2 @@
1UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/050_compose/01_solved_U.out b/test/050_compose/01_solved_U.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/050_compose/01_solved_U.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/050_compose/02_solved_scrambled.in b/test/050_compose/02_solved_scrambled.in
new file mode 100644
index 0000000..ad36258
--- /dev/null
+++ b/test/050_compose/02_solved_scrambled.in
@@ -0,0 +1,2 @@
1UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
2DR0 DB0 BL0 DF1 UB0 UR1 FR1 UF0 FL1 DL0 BR1 UL1 DBL2 DFL0 UBR1 DFR2 UFR0 DBR1 UBL0 UFL0
diff --git a/test/050_compose/02_solved_scrambled.out b/test/050_compose/02_solved_scrambled.out
new file mode 100644
index 0000000..263213b
--- /dev/null
+++ b/test/050_compose/02_solved_scrambled.out
@@ -0,0 +1 @@
DR0 DB0 BL0 DF1 UB0 UR1 FR1 UF0 FL1 DL0 BR1 UL1 DBL2 DFL0 UBR1 DFR2 UFR0 DBR1 UBL0 UFL0
diff --git a/test/050_compose/11_U_solved.in b/test/050_compose/11_U_solved.in
new file mode 100644
index 0000000..5993795
--- /dev/null
+++ b/test/050_compose/11_U_solved.in
@@ -0,0 +1,2 @@
1UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/11_U_solved.out b/test/050_compose/11_U_solved.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/050_compose/11_U_solved.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/050_compose/12_scrambled_solved.in b/test/050_compose/12_scrambled_solved.in
new file mode 100644
index 0000000..3efd52c
--- /dev/null
+++ b/test/050_compose/12_scrambled_solved.in
@@ -0,0 +1,2 @@
1DR0 DB0 BL0 DF1 UB0 UR1 FR1 UF0 FL1 DL0 BR1 UL1 DBL2 DFL0 UBR1 DFR2 UFR0 DBR1 UBL0 UFL0
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/12_scrambled_solved.out b/test/050_compose/12_scrambled_solved.out
new file mode 100644
index 0000000..263213b
--- /dev/null
+++ b/test/050_compose/12_scrambled_solved.out
@@ -0,0 +1 @@
DR0 DB0 BL0 DF1 UB0 UR1 FR1 UF0 FL1 DL0 BR1 UL1 DBL2 DFL0 UBR1 DFR2 UFR0 DBR1 UBL0 UFL0
diff --git a/test/050_compose/20_U_U.in b/test/050_compose/20_U_U.in
new file mode 100644
index 0000000..2778e82
--- /dev/null
+++ b/test/050_compose/20_U_U.in
@@ -0,0 +1,2 @@
1UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/050_compose/20_U_U.out b/test/050_compose/20_U_U.out
new file mode 100644
index 0000000..316ad57
--- /dev/null
+++ b/test/050_compose/20_U_U.out
@@ -0,0 +1 @@
UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0
diff --git a/test/050_compose/21_U_Uinverse.in b/test/050_compose/21_U_Uinverse.in
new file mode 100644
index 0000000..495220e
--- /dev/null
+++ b/test/050_compose/21_U_Uinverse.in
@@ -0,0 +1,2 @@
1UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
2UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/050_compose/21_U_Uinverse.out b/test/050_compose/21_U_Uinverse.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/050_compose/21_U_Uinverse.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/22_F_Finverse.in b/test/050_compose/22_F_Finverse.in
new file mode 100644
index 0000000..4a2f1e6
--- /dev/null
+++ b/test/050_compose/22_F_Finverse.in
@@ -0,0 +1,2 @@
1FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
2FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/050_compose/22_F_Finverse.out b/test/050_compose/22_F_Finverse.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/050_compose/22_F_Finverse.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/23_F2_F2.in b/test/050_compose/23_F2_F2.in
new file mode 100644
index 0000000..5fd1081
--- /dev/null
+++ b/test/050_compose/23_F2_F2.in
@@ -0,0 +1,2 @@
1DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0
2DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0
diff --git a/test/050_compose/23_F2_F2.out b/test/050_compose/23_F2_F2.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/050_compose/23_F2_F2.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/24_U_F.in b/test/050_compose/24_U_F.in
new file mode 100644
index 0000000..d353f95
--- /dev/null
+++ b/test/050_compose/24_U_F.in
@@ -0,0 +1,2 @@
1UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/050_compose/24_U_F.out b/test/050_compose/24_U_F.out
new file mode 100644
index 0000000..4fda397
--- /dev/null
+++ b/test/050_compose/24_U_F.out
@@ -0,0 +1 @@
FL1 UL0 DB0 FR1 UB0 UF0 DL0 DR0 UR1 DF1 BL0 BR0 UFR1 UFL0 DFR1 DBR0 DFL2 UBL0 UBR2 DBL0
diff --git a/test/050_compose/25_F_R.in b/test/050_compose/25_F_R.in
new file mode 100644
index 0000000..2cb5455
--- /dev/null
+++ b/test/050_compose/25_F_R.in
@@ -0,0 +1,2 @@
1FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/050_compose/25_F_R.out b/test/050_compose/25_F_R.out
new file mode 100644
index 0000000..2119f37
--- /dev/null
+++ b/test/050_compose/25_F_R.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UF1 UL0 DL0 BR0 DR0 DF1 BL0 UR0 UFR1 UBL0 DFR1 UBR2 DFL2 UFL2 DBR1 DBL0
diff --git a/test/050_compose/30_scrambled_inverse.in b/test/050_compose/30_scrambled_inverse.in
new file mode 100644
index 0000000..abf72e2
--- /dev/null
+++ b/test/050_compose/30_scrambled_inverse.in
@@ -0,0 +1,4 @@
1UL0 BL0 BR1 DL0 FR0 DF0 DB1 DR1 UB0 FL0 UF0 UR1 DFL0 UFR1 DBR1 UBR2 DBL2 DFR0 UFL1 UBL2
2BL0 FR0 DL1 UL0 BR1 UF0 DF0 DR1 UR0 FL0 UB0 DB1 UBL2 DBL1 UFR0 DFL2 DFR2 DBR1 UBR0 UFL1
3
4// Scramble: U R D' L D' F L2 D L F B D2 B' L2 F U2 L2 D2 R2 L2 B'
diff --git a/test/050_compose/30_scrambled_inverse.out b/test/050_compose/30_scrambled_inverse.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/050_compose/30_scrambled_inverse.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/050_compose/31_scrambled_scrambled.in b/test/050_compose/31_scrambled_scrambled.in
new file mode 100644
index 0000000..7fe874c
--- /dev/null
+++ b/test/050_compose/31_scrambled_scrambled.in
@@ -0,0 +1,4 @@
1UL0 BL0 BR1 DL0 FR0 DF0 DB1 DR1 UB0 FL0 UF0 UR1 DFL0 UFR1 DBR1 UBR2 DBL2 DFR0 UFL1 UBL2
2FL1 BR0 DB0 UR1 UF0 UB0 DL0 FR0 UL1 DF1 BL0 DR0 UBL1 DBR1 UFR2 DFR2 DFL2 UBR2 UFL2 DBL0
3// Scramble: U R D' L D' F L2 D L F B D2 B' L2 F U2 L2 D2 R2 L2 B'
4// Followed by R' U' F
diff --git a/test/050_compose/31_scrambled_scrambled.out b/test/050_compose/31_scrambled_scrambled.out
new file mode 100644
index 0000000..353fb49
--- /dev/null
+++ b/test/050_compose/31_scrambled_scrambled.out
@@ -0,0 +1 @@
FL1 UR1 BR1 FR1 UL0 BL0 DB1 UB0 DF1 DL1 UF0 DR1 UFR2 UBR0 DFL2 UFL0 DBR0 DFR2 DBL1 UBL2
diff --git a/test/050_compose/compose_tests.c b/test/050_compose/compose_tests.c
new file mode 100644
index 0000000..0ea4eff
--- /dev/null
+++ b/test/050_compose/compose_tests.c
@@ -0,0 +1,26 @@
1#include "../test.h"
2
3cube_t compose(cube_t, cube_t);
4
5int main(void) {
6 char str[STRLENMAX];
7 cube_t c1, c2, c3;
8
9 fgets(str, STRLENMAX, stdin);
10 c1 = readcube("H48", str);
11 fgets(str, STRLENMAX, stdin);
12 c2 = readcube("H48", str);
13
14 c3 = compose(c1, c2);
15
16 if (iserror(c3)) {
17 printf("Error composing cubes\n");
18 } else if (!issolvable(c3)) {
19 printf("Composed cube is not solvable\n");
20 } else {
21 writecube("H48", c3, str);
22 printf("%s\n", str);
23 }
24
25 return 0;
26}
diff --git a/test/060_transform/000_solved_UFr.in b/test/060_transform/000_solved_UFr.in
new file mode 100644
index 0000000..aa89e85
--- /dev/null
+++ b/test/060_transform/000_solved_UFr.in
@@ -0,0 +1,2 @@
1rotation UF
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/060_transform/000_solved_UFr.out b/test/060_transform/000_solved_UFr.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/060_transform/000_solved_UFr.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/060_transform/001_solved_BLm.in b/test/060_transform/001_solved_BLm.in
new file mode 100644
index 0000000..43aadb8
--- /dev/null
+++ b/test/060_transform/001_solved_BLm.in
@@ -0,0 +1,2 @@
1mirrored BL
2UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/060_transform/001_solved_BLm.out b/test/060_transform/001_solved_BLm.out
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/060_transform/001_solved_BLm.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/060_transform/100_UFr_U.in b/test/060_transform/100_UFr_U.in
new file mode 100644
index 0000000..80d7af7
--- /dev/null
+++ b/test/060_transform/100_UFr_U.in
@@ -0,0 +1,2 @@
1rotation UF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/100_UFr_U.out b/test/060_transform/100_UFr_U.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/100_UFr_U.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/101_UFm_U.in b/test/060_transform/101_UFm_U.in
new file mode 100644
index 0000000..17d110e
--- /dev/null
+++ b/test/060_transform/101_UFm_U.in
@@ -0,0 +1,2 @@
1mirrored UF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/101_UFm_U.out b/test/060_transform/101_UFm_U.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/101_UFm_U.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/102_UFr_R.in b/test/060_transform/102_UFr_R.in
new file mode 100644
index 0000000..96099d6
--- /dev/null
+++ b/test/060_transform/102_UFr_R.in
@@ -0,0 +1,2 @@
1rotation UF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/102_UFr_R.out b/test/060_transform/102_UFr_R.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/102_UFr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/103_UFm_R.in b/test/060_transform/103_UFm_R.in
new file mode 100644
index 0000000..c70a8b5
--- /dev/null
+++ b/test/060_transform/103_UFm_R.in
@@ -0,0 +1,2 @@
1mirrored UF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/103_UFm_R.out b/test/060_transform/103_UFm_R.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/103_UFm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/104_UFr_F.in b/test/060_transform/104_UFr_F.in
new file mode 100644
index 0000000..0f3585b
--- /dev/null
+++ b/test/060_transform/104_UFr_F.in
@@ -0,0 +1,2 @@
1rotation UF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/104_UFr_F.out b/test/060_transform/104_UFr_F.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/104_UFr_F.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/105_UFm_F.in b/test/060_transform/105_UFm_F.in
new file mode 100644
index 0000000..e7647bc
--- /dev/null
+++ b/test/060_transform/105_UFm_F.in
@@ -0,0 +1,2 @@
1mirrored UF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/105_UFm_F.out b/test/060_transform/105_UFm_F.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/105_UFm_F.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/106_ULr_U.in b/test/060_transform/106_ULr_U.in
new file mode 100644
index 0000000..a02f9c3
--- /dev/null
+++ b/test/060_transform/106_ULr_U.in
@@ -0,0 +1,2 @@
1rotation UL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/106_ULr_U.out b/test/060_transform/106_ULr_U.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/106_ULr_U.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/107_ULm_U.in b/test/060_transform/107_ULm_U.in
new file mode 100644
index 0000000..73bc6a1
--- /dev/null
+++ b/test/060_transform/107_ULm_U.in
@@ -0,0 +1,2 @@
1mirrored UL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/107_ULm_U.out b/test/060_transform/107_ULm_U.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/107_ULm_U.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/108_ULr_R.in b/test/060_transform/108_ULr_R.in
new file mode 100644
index 0000000..a7cbbb8
--- /dev/null
+++ b/test/060_transform/108_ULr_R.in
@@ -0,0 +1,2 @@
1rotation UL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/108_ULr_R.out b/test/060_transform/108_ULr_R.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/108_ULr_R.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/109_ULm_R.in b/test/060_transform/109_ULm_R.in
new file mode 100644
index 0000000..7ecf097
--- /dev/null
+++ b/test/060_transform/109_ULm_R.in
@@ -0,0 +1,2 @@
1mirrored UL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/109_ULm_R.out b/test/060_transform/109_ULm_R.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/109_ULm_R.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/110_ULr_F.in b/test/060_transform/110_ULr_F.in
new file mode 100644
index 0000000..09a5a9a
--- /dev/null
+++ b/test/060_transform/110_ULr_F.in
@@ -0,0 +1,2 @@
1rotation UL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/110_ULr_F.out b/test/060_transform/110_ULr_F.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/110_ULr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/111_ULm_F.in b/test/060_transform/111_ULm_F.in
new file mode 100644
index 0000000..711de44
--- /dev/null
+++ b/test/060_transform/111_ULm_F.in
@@ -0,0 +1,2 @@
1mirrored UL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/111_ULm_F.out b/test/060_transform/111_ULm_F.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/111_ULm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/112_UBr_U.in b/test/060_transform/112_UBr_U.in
new file mode 100644
index 0000000..ce39549
--- /dev/null
+++ b/test/060_transform/112_UBr_U.in
@@ -0,0 +1,2 @@
1rotation UB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/112_UBr_U.out b/test/060_transform/112_UBr_U.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/112_UBr_U.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/113_UBm_U.in b/test/060_transform/113_UBm_U.in
new file mode 100644
index 0000000..14ca42a
--- /dev/null
+++ b/test/060_transform/113_UBm_U.in
@@ -0,0 +1,2 @@
1mirrored UB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/113_UBm_U.out b/test/060_transform/113_UBm_U.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/113_UBm_U.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/114_UBr_R.in b/test/060_transform/114_UBr_R.in
new file mode 100644
index 0000000..5a878d8
--- /dev/null
+++ b/test/060_transform/114_UBr_R.in
@@ -0,0 +1,2 @@
1rotation UB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/114_UBr_R.out b/test/060_transform/114_UBr_R.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/114_UBr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/115_UBm_R.in b/test/060_transform/115_UBm_R.in
new file mode 100644
index 0000000..a4e3aa8
--- /dev/null
+++ b/test/060_transform/115_UBm_R.in
@@ -0,0 +1,2 @@
1mirrored UB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/115_UBm_R.out b/test/060_transform/115_UBm_R.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/115_UBm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/116_UBr_F.in b/test/060_transform/116_UBr_F.in
new file mode 100644
index 0000000..fc34148
--- /dev/null
+++ b/test/060_transform/116_UBr_F.in
@@ -0,0 +1,2 @@
1rotation UB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/116_UBr_F.out b/test/060_transform/116_UBr_F.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/116_UBr_F.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/117_UBm_F.in b/test/060_transform/117_UBm_F.in
new file mode 100644
index 0000000..79433a7
--- /dev/null
+++ b/test/060_transform/117_UBm_F.in
@@ -0,0 +1,2 @@
1mirrored UB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/117_UBm_F.out b/test/060_transform/117_UBm_F.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/117_UBm_F.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/118_URr_U.in b/test/060_transform/118_URr_U.in
new file mode 100644
index 0000000..79ca262
--- /dev/null
+++ b/test/060_transform/118_URr_U.in
@@ -0,0 +1,2 @@
1rotation UR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/118_URr_U.out b/test/060_transform/118_URr_U.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/118_URr_U.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/119_URm_U.in b/test/060_transform/119_URm_U.in
new file mode 100644
index 0000000..4581c22
--- /dev/null
+++ b/test/060_transform/119_URm_U.in
@@ -0,0 +1,2 @@
1mirrored UR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/119_URm_U.out b/test/060_transform/119_URm_U.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/119_URm_U.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/120_URr_R.in b/test/060_transform/120_URr_R.in
new file mode 100644
index 0000000..4803ca4
--- /dev/null
+++ b/test/060_transform/120_URr_R.in
@@ -0,0 +1,2 @@
1rotation UR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/120_URr_R.out b/test/060_transform/120_URr_R.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/120_URr_R.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/121_URm_R.in b/test/060_transform/121_URm_R.in
new file mode 100644
index 0000000..df12fd4
--- /dev/null
+++ b/test/060_transform/121_URm_R.in
@@ -0,0 +1,2 @@
1mirrored UR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/121_URm_R.out b/test/060_transform/121_URm_R.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/121_URm_R.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/122_URr_F.in b/test/060_transform/122_URr_F.in
new file mode 100644
index 0000000..7d06199
--- /dev/null
+++ b/test/060_transform/122_URr_F.in
@@ -0,0 +1,2 @@
1rotation UR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/122_URr_F.out b/test/060_transform/122_URr_F.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/122_URr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/123_URm_F.in b/test/060_transform/123_URm_F.in
new file mode 100644
index 0000000..8bc2c20
--- /dev/null
+++ b/test/060_transform/123_URm_F.in
@@ -0,0 +1,2 @@
1mirrored UR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/123_URm_F.out b/test/060_transform/123_URm_F.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/123_URm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/124_DFr_U.in b/test/060_transform/124_DFr_U.in
new file mode 100644
index 0000000..67200ec
--- /dev/null
+++ b/test/060_transform/124_DFr_U.in
@@ -0,0 +1,2 @@
1rotation DF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/124_DFr_U.out b/test/060_transform/124_DFr_U.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/124_DFr_U.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/125_DFm_U.in b/test/060_transform/125_DFm_U.in
new file mode 100644
index 0000000..33ae235
--- /dev/null
+++ b/test/060_transform/125_DFm_U.in
@@ -0,0 +1,2 @@
1mirrored DF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/125_DFm_U.out b/test/060_transform/125_DFm_U.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/125_DFm_U.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/126_DFr_R.in b/test/060_transform/126_DFr_R.in
new file mode 100644
index 0000000..f74ba46
--- /dev/null
+++ b/test/060_transform/126_DFr_R.in
@@ -0,0 +1,2 @@
1rotation DF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/126_DFr_R.out b/test/060_transform/126_DFr_R.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/126_DFr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/127_DFm_R.in b/test/060_transform/127_DFm_R.in
new file mode 100644
index 0000000..5d930d2
--- /dev/null
+++ b/test/060_transform/127_DFm_R.in
@@ -0,0 +1,2 @@
1mirrored DF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/127_DFm_R.out b/test/060_transform/127_DFm_R.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/127_DFm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/128_DFr_F.in b/test/060_transform/128_DFr_F.in
new file mode 100644
index 0000000..eb04f3b
--- /dev/null
+++ b/test/060_transform/128_DFr_F.in
@@ -0,0 +1,2 @@
1rotation DF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/128_DFr_F.out b/test/060_transform/128_DFr_F.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/128_DFr_F.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/129_DFm_F.in b/test/060_transform/129_DFm_F.in
new file mode 100644
index 0000000..ccd60a7
--- /dev/null
+++ b/test/060_transform/129_DFm_F.in
@@ -0,0 +1,2 @@
1mirrored DF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/129_DFm_F.out b/test/060_transform/129_DFm_F.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/129_DFm_F.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/130_DLr_U.in b/test/060_transform/130_DLr_U.in
new file mode 100644
index 0000000..4aa7b90
--- /dev/null
+++ b/test/060_transform/130_DLr_U.in
@@ -0,0 +1,2 @@
1rotation DL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/130_DLr_U.out b/test/060_transform/130_DLr_U.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/130_DLr_U.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/131_DLm_U.in b/test/060_transform/131_DLm_U.in
new file mode 100644
index 0000000..6097c66
--- /dev/null
+++ b/test/060_transform/131_DLm_U.in
@@ -0,0 +1,2 @@
1mirrored DL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/131_DLm_U.out b/test/060_transform/131_DLm_U.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/131_DLm_U.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/132_DLr_R.in b/test/060_transform/132_DLr_R.in
new file mode 100644
index 0000000..60f1ede
--- /dev/null
+++ b/test/060_transform/132_DLr_R.in
@@ -0,0 +1,2 @@
1rotation DL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/132_DLr_R.out b/test/060_transform/132_DLr_R.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/132_DLr_R.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/133_DLm_R.in b/test/060_transform/133_DLm_R.in
new file mode 100644
index 0000000..018921c
--- /dev/null
+++ b/test/060_transform/133_DLm_R.in
@@ -0,0 +1,2 @@
1mirrored DL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/133_DLm_R.out b/test/060_transform/133_DLm_R.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/133_DLm_R.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/134_DLr_F.in b/test/060_transform/134_DLr_F.in
new file mode 100644
index 0000000..5254f1f
--- /dev/null
+++ b/test/060_transform/134_DLr_F.in
@@ -0,0 +1,2 @@
1rotation DL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/134_DLr_F.out b/test/060_transform/134_DLr_F.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/134_DLr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/135_DLm_F.in b/test/060_transform/135_DLm_F.in
new file mode 100644
index 0000000..57c8406
--- /dev/null
+++ b/test/060_transform/135_DLm_F.in
@@ -0,0 +1,2 @@
1mirrored DL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/135_DLm_F.out b/test/060_transform/135_DLm_F.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/135_DLm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/136_DBr_U.in b/test/060_transform/136_DBr_U.in
new file mode 100644
index 0000000..34f37cb
--- /dev/null
+++ b/test/060_transform/136_DBr_U.in
@@ -0,0 +1,2 @@
1rotation DB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/136_DBr_U.out b/test/060_transform/136_DBr_U.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/136_DBr_U.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/137_DBm_U.in b/test/060_transform/137_DBm_U.in
new file mode 100644
index 0000000..5425205
--- /dev/null
+++ b/test/060_transform/137_DBm_U.in
@@ -0,0 +1,2 @@
1mirrored DB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/137_DBm_U.out b/test/060_transform/137_DBm_U.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/137_DBm_U.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/138_DBr_R.in b/test/060_transform/138_DBr_R.in
new file mode 100644
index 0000000..99974cd
--- /dev/null
+++ b/test/060_transform/138_DBr_R.in
@@ -0,0 +1,2 @@
1rotation DB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/138_DBr_R.out b/test/060_transform/138_DBr_R.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/138_DBr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/139_DBm_R.in b/test/060_transform/139_DBm_R.in
new file mode 100644
index 0000000..cb84382
--- /dev/null
+++ b/test/060_transform/139_DBm_R.in
@@ -0,0 +1,2 @@
1mirrored DB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/139_DBm_R.out b/test/060_transform/139_DBm_R.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/139_DBm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/140_DBr_F.in b/test/060_transform/140_DBr_F.in
new file mode 100644
index 0000000..1342ce5
--- /dev/null
+++ b/test/060_transform/140_DBr_F.in
@@ -0,0 +1,2 @@
1rotation DB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/140_DBr_F.out b/test/060_transform/140_DBr_F.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/140_DBr_F.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/141_DBm_F.in b/test/060_transform/141_DBm_F.in
new file mode 100644
index 0000000..a7fb608
--- /dev/null
+++ b/test/060_transform/141_DBm_F.in
@@ -0,0 +1,2 @@
1mirrored DB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/141_DBm_F.out b/test/060_transform/141_DBm_F.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/141_DBm_F.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/142_DRr_U.in b/test/060_transform/142_DRr_U.in
new file mode 100644
index 0000000..c24b8a3
--- /dev/null
+++ b/test/060_transform/142_DRr_U.in
@@ -0,0 +1,2 @@
1rotation DR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/142_DRr_U.out b/test/060_transform/142_DRr_U.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/142_DRr_U.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/143_DRm_U.in b/test/060_transform/143_DRm_U.in
new file mode 100644
index 0000000..27d922f
--- /dev/null
+++ b/test/060_transform/143_DRm_U.in
@@ -0,0 +1,2 @@
1mirrored DR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/143_DRm_U.out b/test/060_transform/143_DRm_U.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/143_DRm_U.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/144_DRr_R.in b/test/060_transform/144_DRr_R.in
new file mode 100644
index 0000000..ed38629
--- /dev/null
+++ b/test/060_transform/144_DRr_R.in
@@ -0,0 +1,2 @@
1rotation DR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/144_DRr_R.out b/test/060_transform/144_DRr_R.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/144_DRr_R.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/145_DRm_R.in b/test/060_transform/145_DRm_R.in
new file mode 100644
index 0000000..e973e52
--- /dev/null
+++ b/test/060_transform/145_DRm_R.in
@@ -0,0 +1,2 @@
1mirrored DR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/145_DRm_R.out b/test/060_transform/145_DRm_R.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/145_DRm_R.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/146_DRr_F.in b/test/060_transform/146_DRr_F.in
new file mode 100644
index 0000000..03b1d5b
--- /dev/null
+++ b/test/060_transform/146_DRr_F.in
@@ -0,0 +1,2 @@
1rotation DR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/146_DRr_F.out b/test/060_transform/146_DRr_F.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/146_DRr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/147_DRm_F.in b/test/060_transform/147_DRm_F.in
new file mode 100644
index 0000000..25992d6
--- /dev/null
+++ b/test/060_transform/147_DRm_F.in
@@ -0,0 +1,2 @@
1mirrored DR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/147_DRm_F.out b/test/060_transform/147_DRm_F.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/147_DRm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/148_RUr_U.in b/test/060_transform/148_RUr_U.in
new file mode 100644
index 0000000..b808fc6
--- /dev/null
+++ b/test/060_transform/148_RUr_U.in
@@ -0,0 +1,2 @@
1rotation RU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/148_RUr_U.out b/test/060_transform/148_RUr_U.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/148_RUr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/149_RUm_U.in b/test/060_transform/149_RUm_U.in
new file mode 100644
index 0000000..55665cb
--- /dev/null
+++ b/test/060_transform/149_RUm_U.in
@@ -0,0 +1,2 @@
1mirrored RU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/149_RUm_U.out b/test/060_transform/149_RUm_U.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/149_RUm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/150_RUr_R.in b/test/060_transform/150_RUr_R.in
new file mode 100644
index 0000000..94895e0
--- /dev/null
+++ b/test/060_transform/150_RUr_R.in
@@ -0,0 +1,2 @@
1rotation RU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/150_RUr_R.out b/test/060_transform/150_RUr_R.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/150_RUr_R.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/151_RUm_R.in b/test/060_transform/151_RUm_R.in
new file mode 100644
index 0000000..442548e
--- /dev/null
+++ b/test/060_transform/151_RUm_R.in
@@ -0,0 +1,2 @@
1mirrored RU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/151_RUm_R.out b/test/060_transform/151_RUm_R.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/151_RUm_R.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/152_RUr_F.in b/test/060_transform/152_RUr_F.in
new file mode 100644
index 0000000..07bb28e
--- /dev/null
+++ b/test/060_transform/152_RUr_F.in
@@ -0,0 +1,2 @@
1rotation RU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/152_RUr_F.out b/test/060_transform/152_RUr_F.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/152_RUr_F.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/153_RUm_F.in b/test/060_transform/153_RUm_F.in
new file mode 100644
index 0000000..d3364d0
--- /dev/null
+++ b/test/060_transform/153_RUm_F.in
@@ -0,0 +1,2 @@
1mirrored RU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/153_RUm_F.out b/test/060_transform/153_RUm_F.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/153_RUm_F.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/154_RFr_U.in b/test/060_transform/154_RFr_U.in
new file mode 100644
index 0000000..ddec358
--- /dev/null
+++ b/test/060_transform/154_RFr_U.in
@@ -0,0 +1,2 @@
1rotation RF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/154_RFr_U.out b/test/060_transform/154_RFr_U.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/154_RFr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/155_RFm_U.in b/test/060_transform/155_RFm_U.in
new file mode 100644
index 0000000..bd4b0e5
--- /dev/null
+++ b/test/060_transform/155_RFm_U.in
@@ -0,0 +1,2 @@
1mirrored RF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/155_RFm_U.out b/test/060_transform/155_RFm_U.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/155_RFm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/156_RFr_R.in b/test/060_transform/156_RFr_R.in
new file mode 100644
index 0000000..5263302
--- /dev/null
+++ b/test/060_transform/156_RFr_R.in
@@ -0,0 +1,2 @@
1rotation RF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/156_RFr_R.out b/test/060_transform/156_RFr_R.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/156_RFr_R.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/157_RFm_R.in b/test/060_transform/157_RFm_R.in
new file mode 100644
index 0000000..42c4e14
--- /dev/null
+++ b/test/060_transform/157_RFm_R.in
@@ -0,0 +1,2 @@
1mirrored RF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/157_RFm_R.out b/test/060_transform/157_RFm_R.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/157_RFm_R.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/158_RFr_F.in b/test/060_transform/158_RFr_F.in
new file mode 100644
index 0000000..dc60055
--- /dev/null
+++ b/test/060_transform/158_RFr_F.in
@@ -0,0 +1,2 @@
1rotation RF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/158_RFr_F.out b/test/060_transform/158_RFr_F.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/158_RFr_F.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/159_RFm_F.in b/test/060_transform/159_RFm_F.in
new file mode 100644
index 0000000..046926a
--- /dev/null
+++ b/test/060_transform/159_RFm_F.in
@@ -0,0 +1,2 @@
1mirrored RF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/159_RFm_F.out b/test/060_transform/159_RFm_F.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/159_RFm_F.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/160_RDr_U.in b/test/060_transform/160_RDr_U.in
new file mode 100644
index 0000000..3bac222
--- /dev/null
+++ b/test/060_transform/160_RDr_U.in
@@ -0,0 +1,2 @@
1rotation RD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/160_RDr_U.out b/test/060_transform/160_RDr_U.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/160_RDr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/161_RDm_U.in b/test/060_transform/161_RDm_U.in
new file mode 100644
index 0000000..e5e4bba
--- /dev/null
+++ b/test/060_transform/161_RDm_U.in
@@ -0,0 +1,2 @@
1mirrored RD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/161_RDm_U.out b/test/060_transform/161_RDm_U.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/161_RDm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/162_RDr_R.in b/test/060_transform/162_RDr_R.in
new file mode 100644
index 0000000..d1e5f31
--- /dev/null
+++ b/test/060_transform/162_RDr_R.in
@@ -0,0 +1,2 @@
1rotation RD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/162_RDr_R.out b/test/060_transform/162_RDr_R.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/162_RDr_R.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/163_RDm_R.in b/test/060_transform/163_RDm_R.in
new file mode 100644
index 0000000..8b1ee98
--- /dev/null
+++ b/test/060_transform/163_RDm_R.in
@@ -0,0 +1,2 @@
1mirrored RD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/163_RDm_R.out b/test/060_transform/163_RDm_R.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/163_RDm_R.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/164_RDr_F.in b/test/060_transform/164_RDr_F.in
new file mode 100644
index 0000000..4b49b13
--- /dev/null
+++ b/test/060_transform/164_RDr_F.in
@@ -0,0 +1,2 @@
1rotation RD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/164_RDr_F.out b/test/060_transform/164_RDr_F.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/164_RDr_F.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/165_RDm_F.in b/test/060_transform/165_RDm_F.in
new file mode 100644
index 0000000..db4f4ee
--- /dev/null
+++ b/test/060_transform/165_RDm_F.in
@@ -0,0 +1,2 @@
1mirrored RD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/165_RDm_F.out b/test/060_transform/165_RDm_F.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/165_RDm_F.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/166_RBr_U.in b/test/060_transform/166_RBr_U.in
new file mode 100644
index 0000000..48f85f1
--- /dev/null
+++ b/test/060_transform/166_RBr_U.in
@@ -0,0 +1,2 @@
1rotation RB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/166_RBr_U.out b/test/060_transform/166_RBr_U.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/166_RBr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/167_RBm_U.in b/test/060_transform/167_RBm_U.in
new file mode 100644
index 0000000..036bb07
--- /dev/null
+++ b/test/060_transform/167_RBm_U.in
@@ -0,0 +1,2 @@
1mirrored RB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/167_RBm_U.out b/test/060_transform/167_RBm_U.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/167_RBm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/168_RBr_R.in b/test/060_transform/168_RBr_R.in
new file mode 100644
index 0000000..94f799c
--- /dev/null
+++ b/test/060_transform/168_RBr_R.in
@@ -0,0 +1,2 @@
1rotation RB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/168_RBr_R.out b/test/060_transform/168_RBr_R.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/168_RBr_R.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/169_RBm_R.in b/test/060_transform/169_RBm_R.in
new file mode 100644
index 0000000..46cce80
--- /dev/null
+++ b/test/060_transform/169_RBm_R.in
@@ -0,0 +1,2 @@
1mirrored RB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/169_RBm_R.out b/test/060_transform/169_RBm_R.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/169_RBm_R.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/170_RBr_F.in b/test/060_transform/170_RBr_F.in
new file mode 100644
index 0000000..54b6b57
--- /dev/null
+++ b/test/060_transform/170_RBr_F.in
@@ -0,0 +1,2 @@
1rotation RB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/170_RBr_F.out b/test/060_transform/170_RBr_F.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/170_RBr_F.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/171_RBm_F.in b/test/060_transform/171_RBm_F.in
new file mode 100644
index 0000000..b0b4c04
--- /dev/null
+++ b/test/060_transform/171_RBm_F.in
@@ -0,0 +1,2 @@
1mirrored RB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/171_RBm_F.out b/test/060_transform/171_RBm_F.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/171_RBm_F.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/172_LUr_U.in b/test/060_transform/172_LUr_U.in
new file mode 100644
index 0000000..d4de425
--- /dev/null
+++ b/test/060_transform/172_LUr_U.in
@@ -0,0 +1,2 @@
1rotation LU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/172_LUr_U.out b/test/060_transform/172_LUr_U.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/172_LUr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/173_LUm_U.in b/test/060_transform/173_LUm_U.in
new file mode 100644
index 0000000..7530802
--- /dev/null
+++ b/test/060_transform/173_LUm_U.in
@@ -0,0 +1,2 @@
1mirrored LU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/173_LUm_U.out b/test/060_transform/173_LUm_U.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/173_LUm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/174_LUr_R.in b/test/060_transform/174_LUr_R.in
new file mode 100644
index 0000000..ac3b675
--- /dev/null
+++ b/test/060_transform/174_LUr_R.in
@@ -0,0 +1,2 @@
1rotation LU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/174_LUr_R.out b/test/060_transform/174_LUr_R.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/174_LUr_R.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/175_LUm_R.in b/test/060_transform/175_LUm_R.in
new file mode 100644
index 0000000..42168b5
--- /dev/null
+++ b/test/060_transform/175_LUm_R.in
@@ -0,0 +1,2 @@
1mirrored LU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/175_LUm_R.out b/test/060_transform/175_LUm_R.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/175_LUm_R.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/176_LUr_F.in b/test/060_transform/176_LUr_F.in
new file mode 100644
index 0000000..65f37e9
--- /dev/null
+++ b/test/060_transform/176_LUr_F.in
@@ -0,0 +1,2 @@
1rotation LU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/176_LUr_F.out b/test/060_transform/176_LUr_F.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/176_LUr_F.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/177_LUm_F.in b/test/060_transform/177_LUm_F.in
new file mode 100644
index 0000000..c4428a7
--- /dev/null
+++ b/test/060_transform/177_LUm_F.in
@@ -0,0 +1,2 @@
1mirrored LU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/177_LUm_F.out b/test/060_transform/177_LUm_F.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/177_LUm_F.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/178_LFr_U.in b/test/060_transform/178_LFr_U.in
new file mode 100644
index 0000000..9d20035
--- /dev/null
+++ b/test/060_transform/178_LFr_U.in
@@ -0,0 +1,2 @@
1rotation LF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/178_LFr_U.out b/test/060_transform/178_LFr_U.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/178_LFr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/179_LFm_U.in b/test/060_transform/179_LFm_U.in
new file mode 100644
index 0000000..c773f71
--- /dev/null
+++ b/test/060_transform/179_LFm_U.in
@@ -0,0 +1,2 @@
1mirrored LF
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/179_LFm_U.out b/test/060_transform/179_LFm_U.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/179_LFm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/180_LFr_R.in b/test/060_transform/180_LFr_R.in
new file mode 100644
index 0000000..059725a
--- /dev/null
+++ b/test/060_transform/180_LFr_R.in
@@ -0,0 +1,2 @@
1rotation LF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/180_LFr_R.out b/test/060_transform/180_LFr_R.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/180_LFr_R.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/181_LFm_R.in b/test/060_transform/181_LFm_R.in
new file mode 100644
index 0000000..23d26dc
--- /dev/null
+++ b/test/060_transform/181_LFm_R.in
@@ -0,0 +1,2 @@
1mirrored LF
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/181_LFm_R.out b/test/060_transform/181_LFm_R.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/181_LFm_R.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/182_LFr_F.in b/test/060_transform/182_LFr_F.in
new file mode 100644
index 0000000..94d3342
--- /dev/null
+++ b/test/060_transform/182_LFr_F.in
@@ -0,0 +1,2 @@
1rotation LF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/182_LFr_F.out b/test/060_transform/182_LFr_F.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/182_LFr_F.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/183_LFm_F.in b/test/060_transform/183_LFm_F.in
new file mode 100644
index 0000000..4170885
--- /dev/null
+++ b/test/060_transform/183_LFm_F.in
@@ -0,0 +1,2 @@
1mirrored LF
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/183_LFm_F.out b/test/060_transform/183_LFm_F.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/183_LFm_F.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/184_LDr_U.in b/test/060_transform/184_LDr_U.in
new file mode 100644
index 0000000..d8a9460
--- /dev/null
+++ b/test/060_transform/184_LDr_U.in
@@ -0,0 +1,2 @@
1rotation LD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/184_LDr_U.out b/test/060_transform/184_LDr_U.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/184_LDr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/185_LDm_U.in b/test/060_transform/185_LDm_U.in
new file mode 100644
index 0000000..692a72b
--- /dev/null
+++ b/test/060_transform/185_LDm_U.in
@@ -0,0 +1,2 @@
1mirrored LD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/185_LDm_U.out b/test/060_transform/185_LDm_U.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/185_LDm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/186_LDr_R.in b/test/060_transform/186_LDr_R.in
new file mode 100644
index 0000000..e303013
--- /dev/null
+++ b/test/060_transform/186_LDr_R.in
@@ -0,0 +1,2 @@
1rotation LD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/186_LDr_R.out b/test/060_transform/186_LDr_R.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/186_LDr_R.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/187_LDm_R.in b/test/060_transform/187_LDm_R.in
new file mode 100644
index 0000000..b09a13c
--- /dev/null
+++ b/test/060_transform/187_LDm_R.in
@@ -0,0 +1,2 @@
1mirrored LD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/187_LDm_R.out b/test/060_transform/187_LDm_R.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/187_LDm_R.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/188_LDr_F.in b/test/060_transform/188_LDr_F.in
new file mode 100644
index 0000000..9af43b3
--- /dev/null
+++ b/test/060_transform/188_LDr_F.in
@@ -0,0 +1,2 @@
1rotation LD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/188_LDr_F.out b/test/060_transform/188_LDr_F.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/188_LDr_F.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/189_LDm_F.in b/test/060_transform/189_LDm_F.in
new file mode 100644
index 0000000..97d8e51
--- /dev/null
+++ b/test/060_transform/189_LDm_F.in
@@ -0,0 +1,2 @@
1mirrored LD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/189_LDm_F.out b/test/060_transform/189_LDm_F.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/189_LDm_F.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/190_LBr_U.in b/test/060_transform/190_LBr_U.in
new file mode 100644
index 0000000..2003378
--- /dev/null
+++ b/test/060_transform/190_LBr_U.in
@@ -0,0 +1,2 @@
1rotation LB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/190_LBr_U.out b/test/060_transform/190_LBr_U.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/190_LBr_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/191_LBm_U.in b/test/060_transform/191_LBm_U.in
new file mode 100644
index 0000000..c3e7251
--- /dev/null
+++ b/test/060_transform/191_LBm_U.in
@@ -0,0 +1,2 @@
1mirrored LB
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/191_LBm_U.out b/test/060_transform/191_LBm_U.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/191_LBm_U.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/192_LBr_R.in b/test/060_transform/192_LBr_R.in
new file mode 100644
index 0000000..67bdd40
--- /dev/null
+++ b/test/060_transform/192_LBr_R.in
@@ -0,0 +1,2 @@
1rotation LB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/192_LBr_R.out b/test/060_transform/192_LBr_R.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/192_LBr_R.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/193_LBm_R.in b/test/060_transform/193_LBm_R.in
new file mode 100644
index 0000000..b8f4b6f
--- /dev/null
+++ b/test/060_transform/193_LBm_R.in
@@ -0,0 +1,2 @@
1mirrored LB
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/193_LBm_R.out b/test/060_transform/193_LBm_R.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/193_LBm_R.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/194_LBr_F.in b/test/060_transform/194_LBr_F.in
new file mode 100644
index 0000000..3ff9823
--- /dev/null
+++ b/test/060_transform/194_LBr_F.in
@@ -0,0 +1,2 @@
1rotation LB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/194_LBr_F.out b/test/060_transform/194_LBr_F.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/194_LBr_F.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/195_LBm_F.in b/test/060_transform/195_LBm_F.in
new file mode 100644
index 0000000..35cb55f
--- /dev/null
+++ b/test/060_transform/195_LBm_F.in
@@ -0,0 +1,2 @@
1mirrored LB
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/195_LBm_F.out b/test/060_transform/195_LBm_F.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/195_LBm_F.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/196_FUr_U.in b/test/060_transform/196_FUr_U.in
new file mode 100644
index 0000000..489b248
--- /dev/null
+++ b/test/060_transform/196_FUr_U.in
@@ -0,0 +1,2 @@
1rotation FU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/196_FUr_U.out b/test/060_transform/196_FUr_U.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/196_FUr_U.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/197_FUm_U.in b/test/060_transform/197_FUm_U.in
new file mode 100644
index 0000000..e11003f
--- /dev/null
+++ b/test/060_transform/197_FUm_U.in
@@ -0,0 +1,2 @@
1mirrored FU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/197_FUm_U.out b/test/060_transform/197_FUm_U.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/197_FUm_U.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/198_FUr_R.in b/test/060_transform/198_FUr_R.in
new file mode 100644
index 0000000..d44ba29
--- /dev/null
+++ b/test/060_transform/198_FUr_R.in
@@ -0,0 +1,2 @@
1rotation FU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/198_FUr_R.out b/test/060_transform/198_FUr_R.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/198_FUr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/199_FUm_R.in b/test/060_transform/199_FUm_R.in
new file mode 100644
index 0000000..a803843
--- /dev/null
+++ b/test/060_transform/199_FUm_R.in
@@ -0,0 +1,2 @@
1mirrored FU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/199_FUm_R.out b/test/060_transform/199_FUm_R.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/199_FUm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/200_FUr_F.in b/test/060_transform/200_FUr_F.in
new file mode 100644
index 0000000..beaac09
--- /dev/null
+++ b/test/060_transform/200_FUr_F.in
@@ -0,0 +1,2 @@
1rotation FU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/200_FUr_F.out b/test/060_transform/200_FUr_F.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/200_FUr_F.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/201_FUm_F.in b/test/060_transform/201_FUm_F.in
new file mode 100644
index 0000000..802b0b3
--- /dev/null
+++ b/test/060_transform/201_FUm_F.in
@@ -0,0 +1,2 @@
1mirrored FU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/201_FUm_F.out b/test/060_transform/201_FUm_F.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/201_FUm_F.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/202_FRr_U.in b/test/060_transform/202_FRr_U.in
new file mode 100644
index 0000000..ac903a9
--- /dev/null
+++ b/test/060_transform/202_FRr_U.in
@@ -0,0 +1,2 @@
1rotation FR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/202_FRr_U.out b/test/060_transform/202_FRr_U.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/202_FRr_U.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/203_FRm_U.in b/test/060_transform/203_FRm_U.in
new file mode 100644
index 0000000..e11a81e
--- /dev/null
+++ b/test/060_transform/203_FRm_U.in
@@ -0,0 +1,2 @@
1mirrored FR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/203_FRm_U.out b/test/060_transform/203_FRm_U.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/203_FRm_U.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/204_FRr_R.in b/test/060_transform/204_FRr_R.in
new file mode 100644
index 0000000..1a06d75
--- /dev/null
+++ b/test/060_transform/204_FRr_R.in
@@ -0,0 +1,2 @@
1rotation FR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/204_FRr_R.out b/test/060_transform/204_FRr_R.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/204_FRr_R.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/205_FRm_R.in b/test/060_transform/205_FRm_R.in
new file mode 100644
index 0000000..cd0caf6
--- /dev/null
+++ b/test/060_transform/205_FRm_R.in
@@ -0,0 +1,2 @@
1mirrored FR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/205_FRm_R.out b/test/060_transform/205_FRm_R.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/205_FRm_R.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/206_FRr_F.in b/test/060_transform/206_FRr_F.in
new file mode 100644
index 0000000..1afb42b
--- /dev/null
+++ b/test/060_transform/206_FRr_F.in
@@ -0,0 +1,2 @@
1rotation FR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/206_FRr_F.out b/test/060_transform/206_FRr_F.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/206_FRr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/207_FRm_F.in b/test/060_transform/207_FRm_F.in
new file mode 100644
index 0000000..e2f75d0
--- /dev/null
+++ b/test/060_transform/207_FRm_F.in
@@ -0,0 +1,2 @@
1mirrored FR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/207_FRm_F.out b/test/060_transform/207_FRm_F.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/207_FRm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/208_FDr_U.in b/test/060_transform/208_FDr_U.in
new file mode 100644
index 0000000..f18744e
--- /dev/null
+++ b/test/060_transform/208_FDr_U.in
@@ -0,0 +1,2 @@
1rotation FD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/208_FDr_U.out b/test/060_transform/208_FDr_U.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/208_FDr_U.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/209_FDm_U.in b/test/060_transform/209_FDm_U.in
new file mode 100644
index 0000000..5ac46b4
--- /dev/null
+++ b/test/060_transform/209_FDm_U.in
@@ -0,0 +1,2 @@
1mirrored FD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/209_FDm_U.out b/test/060_transform/209_FDm_U.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/209_FDm_U.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/210_FDr_R.in b/test/060_transform/210_FDr_R.in
new file mode 100644
index 0000000..26b394c
--- /dev/null
+++ b/test/060_transform/210_FDr_R.in
@@ -0,0 +1,2 @@
1rotation FD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/210_FDr_R.out b/test/060_transform/210_FDr_R.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/210_FDr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/211_FDm_R.in b/test/060_transform/211_FDm_R.in
new file mode 100644
index 0000000..5a10ec6
--- /dev/null
+++ b/test/060_transform/211_FDm_R.in
@@ -0,0 +1,2 @@
1mirrored FD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/211_FDm_R.out b/test/060_transform/211_FDm_R.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/211_FDm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/212_FDr_F.in b/test/060_transform/212_FDr_F.in
new file mode 100644
index 0000000..2382615
--- /dev/null
+++ b/test/060_transform/212_FDr_F.in
@@ -0,0 +1,2 @@
1rotation FD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/212_FDr_F.out b/test/060_transform/212_FDr_F.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/212_FDr_F.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/213_FDm_F.in b/test/060_transform/213_FDm_F.in
new file mode 100644
index 0000000..0515b51
--- /dev/null
+++ b/test/060_transform/213_FDm_F.in
@@ -0,0 +1,2 @@
1mirrored FD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/213_FDm_F.out b/test/060_transform/213_FDm_F.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/213_FDm_F.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/214_FLr_U.in b/test/060_transform/214_FLr_U.in
new file mode 100644
index 0000000..da3f3a4
--- /dev/null
+++ b/test/060_transform/214_FLr_U.in
@@ -0,0 +1,2 @@
1rotation FL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/214_FLr_U.out b/test/060_transform/214_FLr_U.out
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/060_transform/214_FLr_U.out
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/215_FLm_U.in b/test/060_transform/215_FLm_U.in
new file mode 100644
index 0000000..0dd99c3
--- /dev/null
+++ b/test/060_transform/215_FLm_U.in
@@ -0,0 +1,2 @@
1mirrored FL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/215_FLm_U.out b/test/060_transform/215_FLm_U.out
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/060_transform/215_FLm_U.out
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/060_transform/216_FLr_R.in b/test/060_transform/216_FLr_R.in
new file mode 100644
index 0000000..b8488d1
--- /dev/null
+++ b/test/060_transform/216_FLr_R.in
@@ -0,0 +1,2 @@
1rotation FL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/216_FLr_R.out b/test/060_transform/216_FLr_R.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/216_FLr_R.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/217_FLm_R.in b/test/060_transform/217_FLm_R.in
new file mode 100644
index 0000000..624882c
--- /dev/null
+++ b/test/060_transform/217_FLm_R.in
@@ -0,0 +1,2 @@
1mirrored FL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/217_FLm_R.out b/test/060_transform/217_FLm_R.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/217_FLm_R.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/218_FLr_F.in b/test/060_transform/218_FLr_F.in
new file mode 100644
index 0000000..03950c5
--- /dev/null
+++ b/test/060_transform/218_FLr_F.in
@@ -0,0 +1,2 @@
1rotation FL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/218_FLr_F.out b/test/060_transform/218_FLr_F.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/218_FLr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/219_FLm_F.in b/test/060_transform/219_FLm_F.in
new file mode 100644
index 0000000..ff909bf
--- /dev/null
+++ b/test/060_transform/219_FLm_F.in
@@ -0,0 +1,2 @@
1mirrored FL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/219_FLm_F.out b/test/060_transform/219_FLm_F.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/219_FLm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/220_BUr_U.in b/test/060_transform/220_BUr_U.in
new file mode 100644
index 0000000..c923f4d
--- /dev/null
+++ b/test/060_transform/220_BUr_U.in
@@ -0,0 +1,2 @@
1rotation BU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/220_BUr_U.out b/test/060_transform/220_BUr_U.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/220_BUr_U.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/221_BUm_U.in b/test/060_transform/221_BUm_U.in
new file mode 100644
index 0000000..d939385
--- /dev/null
+++ b/test/060_transform/221_BUm_U.in
@@ -0,0 +1,2 @@
1mirrored BU
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/221_BUm_U.out b/test/060_transform/221_BUm_U.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/221_BUm_U.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/222_BUr_R.in b/test/060_transform/222_BUr_R.in
new file mode 100644
index 0000000..89a46f4
--- /dev/null
+++ b/test/060_transform/222_BUr_R.in
@@ -0,0 +1,2 @@
1rotation BU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/222_BUr_R.out b/test/060_transform/222_BUr_R.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/222_BUr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/223_BUm_R.in b/test/060_transform/223_BUm_R.in
new file mode 100644
index 0000000..2f5d234
--- /dev/null
+++ b/test/060_transform/223_BUm_R.in
@@ -0,0 +1,2 @@
1mirrored BU
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/223_BUm_R.out b/test/060_transform/223_BUm_R.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/223_BUm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/224_BUr_F.in b/test/060_transform/224_BUr_F.in
new file mode 100644
index 0000000..0ad8995
--- /dev/null
+++ b/test/060_transform/224_BUr_F.in
@@ -0,0 +1,2 @@
1rotation BU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/224_BUr_F.out b/test/060_transform/224_BUr_F.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/224_BUr_F.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/225_BUm_F.in b/test/060_transform/225_BUm_F.in
new file mode 100644
index 0000000..3ff7e4d
--- /dev/null
+++ b/test/060_transform/225_BUm_F.in
@@ -0,0 +1,2 @@
1mirrored BU
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/225_BUm_F.out b/test/060_transform/225_BUm_F.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/225_BUm_F.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/226_BRr_U.in b/test/060_transform/226_BRr_U.in
new file mode 100644
index 0000000..46ebe30
--- /dev/null
+++ b/test/060_transform/226_BRr_U.in
@@ -0,0 +1,2 @@
1rotation BR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/226_BRr_U.out b/test/060_transform/226_BRr_U.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/226_BRr_U.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/227_BRm_U.in b/test/060_transform/227_BRm_U.in
new file mode 100644
index 0000000..63897c9
--- /dev/null
+++ b/test/060_transform/227_BRm_U.in
@@ -0,0 +1,2 @@
1mirrored BR
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/227_BRm_U.out b/test/060_transform/227_BRm_U.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/227_BRm_U.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/228_BRr_R.in b/test/060_transform/228_BRr_R.in
new file mode 100644
index 0000000..7e2de76
--- /dev/null
+++ b/test/060_transform/228_BRr_R.in
@@ -0,0 +1,2 @@
1rotation BR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/228_BRr_R.out b/test/060_transform/228_BRr_R.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/228_BRr_R.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/229_BRm_R.in b/test/060_transform/229_BRm_R.in
new file mode 100644
index 0000000..c9e6e82
--- /dev/null
+++ b/test/060_transform/229_BRm_R.in
@@ -0,0 +1,2 @@
1mirrored BR
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/229_BRm_R.out b/test/060_transform/229_BRm_R.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/229_BRm_R.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/230_BRr_F.in b/test/060_transform/230_BRr_F.in
new file mode 100644
index 0000000..fe288dc
--- /dev/null
+++ b/test/060_transform/230_BRr_F.in
@@ -0,0 +1,2 @@
1rotation BR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/230_BRr_F.out b/test/060_transform/230_BRr_F.out
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/060_transform/230_BRr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/231_BRm_F.in b/test/060_transform/231_BRm_F.in
new file mode 100644
index 0000000..5411345
--- /dev/null
+++ b/test/060_transform/231_BRm_F.in
@@ -0,0 +1,2 @@
1mirrored BR
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/231_BRm_F.out b/test/060_transform/231_BRm_F.out
new file mode 100644
index 0000000..2ac2912
--- /dev/null
+++ b/test/060_transform/231_BRm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 FL0 BL0 DR0 FR0 DL0 UL0 BR0 UFR0 UFL2 DBL2 DBR0 DFL1 UBR0 DFR0 UBL1
diff --git a/test/060_transform/232_BDr_U.in b/test/060_transform/232_BDr_U.in
new file mode 100644
index 0000000..1a8f5d3
--- /dev/null
+++ b/test/060_transform/232_BDr_U.in
@@ -0,0 +1,2 @@
1rotation BD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/232_BDr_U.out b/test/060_transform/232_BDr_U.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/232_BDr_U.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/233_BDm_U.in b/test/060_transform/233_BDm_U.in
new file mode 100644
index 0000000..b6b1ec4
--- /dev/null
+++ b/test/060_transform/233_BDm_U.in
@@ -0,0 +1,2 @@
1mirrored BD
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/233_BDm_U.out b/test/060_transform/233_BDm_U.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/233_BDm_U.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/234_BDr_R.in b/test/060_transform/234_BDr_R.in
new file mode 100644
index 0000000..f12b7bb
--- /dev/null
+++ b/test/060_transform/234_BDr_R.in
@@ -0,0 +1,2 @@
1rotation BD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/234_BDr_R.out b/test/060_transform/234_BDr_R.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/234_BDr_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/235_BDm_R.in b/test/060_transform/235_BDm_R.in
new file mode 100644
index 0000000..a281b6c
--- /dev/null
+++ b/test/060_transform/235_BDm_R.in
@@ -0,0 +1,2 @@
1mirrored BD
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/235_BDm_R.out b/test/060_transform/235_BDm_R.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/235_BDm_R.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/236_BDr_F.in b/test/060_transform/236_BDr_F.in
new file mode 100644
index 0000000..68a3262
--- /dev/null
+++ b/test/060_transform/236_BDr_F.in
@@ -0,0 +1,2 @@
1rotation BD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/236_BDr_F.out b/test/060_transform/236_BDr_F.out
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/060_transform/236_BDr_F.out
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/060_transform/237_BDm_F.in b/test/060_transform/237_BDm_F.in
new file mode 100644
index 0000000..9200d9a
--- /dev/null
+++ b/test/060_transform/237_BDm_F.in
@@ -0,0 +1,2 @@
1mirrored BD
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/237_BDm_F.out b/test/060_transform/237_BDm_F.out
new file mode 100644
index 0000000..2864f5b
--- /dev/null
+++ b/test/060_transform/237_BDm_F.out
@@ -0,0 +1 @@
UF0 UB0 DL0 DR0 UR0 UL0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFR0 DBL0 UFL0 UBR0 DBR0 DFL0
diff --git a/test/060_transform/238_BLr_U.in b/test/060_transform/238_BLr_U.in
new file mode 100644
index 0000000..ae1bb2e
--- /dev/null
+++ b/test/060_transform/238_BLr_U.in
@@ -0,0 +1,2 @@
1rotation BL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/238_BLr_U.out b/test/060_transform/238_BLr_U.out
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/060_transform/238_BLr_U.out
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/060_transform/239_BLm_U.in b/test/060_transform/239_BLm_U.in
new file mode 100644
index 0000000..82eef50
--- /dev/null
+++ b/test/060_transform/239_BLm_U.in
@@ -0,0 +1,2 @@
1mirrored BL
2UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/239_BLm_U.out b/test/060_transform/239_BLm_U.out
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/060_transform/239_BLm_U.out
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/060_transform/240_BLr_R.in b/test/060_transform/240_BLr_R.in
new file mode 100644
index 0000000..5aeee46
--- /dev/null
+++ b/test/060_transform/240_BLr_R.in
@@ -0,0 +1,2 @@
1rotation BL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/240_BLr_R.out b/test/060_transform/240_BLr_R.out
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/060_transform/240_BLr_R.out
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/060_transform/241_BLm_R.in b/test/060_transform/241_BLm_R.in
new file mode 100644
index 0000000..4aff162
--- /dev/null
+++ b/test/060_transform/241_BLm_R.in
@@ -0,0 +1,2 @@
1mirrored BL
2UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/060_transform/241_BLm_R.out b/test/060_transform/241_BLm_R.out
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/060_transform/241_BLm_R.out
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/060_transform/242_BLr_F.in b/test/060_transform/242_BLr_F.in
new file mode 100644
index 0000000..a621e5e
--- /dev/null
+++ b/test/060_transform/242_BLr_F.in
@@ -0,0 +1,2 @@
1rotation BL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/242_BLr_F.out b/test/060_transform/242_BLr_F.out
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/060_transform/242_BLr_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/060_transform/243_BLm_F.in b/test/060_transform/243_BLm_F.in
new file mode 100644
index 0000000..6aa4a5a
--- /dev/null
+++ b/test/060_transform/243_BLm_F.in
@@ -0,0 +1,2 @@
1mirrored BL
2FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/060_transform/243_BLm_F.out b/test/060_transform/243_BLm_F.out
new file mode 100644
index 0000000..d4abffc
--- /dev/null
+++ b/test/060_transform/243_BLm_F.out
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 BR0 UL0 DL0 FR0 UR0 FL0 BL0 DR0 UBR2 UBL0 DFL0 DFR2 UFL0 DBR1 UFR1 DBL0
diff --git a/test/060_transform/transform_tests.c b/test/060_transform/transform_tests.c
new file mode 100644
index 0000000..f95ad67
--- /dev/null
+++ b/test/060_transform/transform_tests.c
@@ -0,0 +1,25 @@
1#include "../test.h"
2
3cube_t applytrans(cube_t, char *);
4
5int main(void) {
6 char cubestr[STRLENMAX], transtr[STRLENMAX];
7 cube_t cube;
8
9 fgets(transtr, STRLENMAX, stdin);
10 fgets(cubestr, STRLENMAX, stdin);
11 cube = readcube("H48", cubestr);
12
13 cube = applytrans(cube, transtr);
14
15 if (iserror(cube)) {
16 printf("Error transforming cube\n");
17 } else if (!issolvable(cube)) {
18 printf("Transformed cube is not solvable\n");
19 } else {
20 writecube("H48", cube, cubestr);
21 printf("%s\n", cubestr);
22 }
23
24 return 0;
25}
diff --git a/test/061_inverse_trans/00_all.in b/test/061_inverse_trans/00_all.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/061_inverse_trans/00_all.in
diff --git a/test/061_inverse_trans/00_all.out b/test/061_inverse_trans/00_all.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/061_inverse_trans/00_all.out
diff --git a/test/061_inverse_trans/inverse_trans_tests.c b/test/061_inverse_trans/inverse_trans_tests.c
new file mode 100644
index 0000000..77bd40b
--- /dev/null
+++ b/test/061_inverse_trans/inverse_trans_tests.c
@@ -0,0 +1,38 @@
1#include "../test.h"
2
3uint8_t readtrans(char *);
4uint8_t inverse_trans(uint8_t);
5cube_t applymoves(cube_t, char *);
6cube_t applytrans(cube_t, char *);
7extern char *transstr[];
8
9int main(void) {
10 uint8_t t, tinv;
11 cube_t cube;
12
13 for (t = 0; t < 48; t++) {
14 cube = solvedcube();
15 cube = applymoves(cube, "R");
16 cube = applymoves(cube, "U");
17 cube = applymoves(cube, "F");
18
19 cube = applytrans(cube, transstr[t]);
20 tinv = inverse_trans(t);
21 cube = applytrans(cube, transstr[tinv]);
22
23 if (iserror(cube)) {
24 printf("Error transforming cube\n");
25 } else if (!issolvable(cube)) {
26 printf("Transformed cube is not solvable\n");
27 } else {
28 cube = applymoves(cube, "F'");
29 cube = applymoves(cube, "U'");
30 cube = applymoves(cube, "R'");
31 if (!issolved(cube))
32 printf("%s: Error! Got %" PRIu8 "\n",
33 transstr[t], tinv);
34 }
35 }
36
37 return 0;
38}
diff --git a/test/071_coord_eo/00_solved.in b/test/071_coord_eo/00_solved.in
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/071_coord_eo/00_solved.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/071_coord_eo/00_solved.out b/test/071_coord_eo/00_solved.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/00_solved.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/01_U.in b/test/071_coord_eo/01_U.in
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/071_coord_eo/01_U.in
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/071_coord_eo/01_U.out b/test/071_coord_eo/01_U.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/01_U.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/02_U2.in b/test/071_coord_eo/02_U2.in
new file mode 100644
index 0000000..316ad57
--- /dev/null
+++ b/test/071_coord_eo/02_U2.in
@@ -0,0 +1 @@
UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0
diff --git a/test/071_coord_eo/02_U2.out b/test/071_coord_eo/02_U2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/02_U2.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/03_U3.in b/test/071_coord_eo/03_U3.in
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/071_coord_eo/03_U3.in
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/071_coord_eo/03_U3.out b/test/071_coord_eo/03_U3.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/03_U3.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/04_D.in b/test/071_coord_eo/04_D.in
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/071_coord_eo/04_D.in
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/071_coord_eo/04_D.out b/test/071_coord_eo/04_D.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/04_D.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/07_R.in b/test/071_coord_eo/07_R.in
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/071_coord_eo/07_R.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/071_coord_eo/07_R.out b/test/071_coord_eo/07_R.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/07_R.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/08_R2.in b/test/071_coord_eo/08_R2.in
new file mode 100644
index 0000000..90765e2
--- /dev/null
+++ b/test/071_coord_eo/08_R2.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 DR0 UL0 DL0 UR0 BR0 FL0 BL0 FR0 DBR0 UBL0 DFL0 UFR0 UFL0 DFR0 UBR0 DBL0
diff --git a/test/071_coord_eo/08_R2.out b/test/071_coord_eo/08_R2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/08_R2.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/10_L.in b/test/071_coord_eo/10_L.in
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/071_coord_eo/10_L.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/071_coord_eo/10_L.out b/test/071_coord_eo/10_L.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/10_L.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/13_F.in b/test/071_coord_eo/13_F.in
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/071_coord_eo/13_F.in
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/071_coord_eo/13_F.out b/test/071_coord_eo/13_F.out
new file mode 100644
index 0000000..2c60641
--- /dev/null
+++ b/test/071_coord_eo/13_F.out
@@ -0,0 +1 @@
388
diff --git a/test/071_coord_eo/14_F2.in b/test/071_coord_eo/14_F2.in
new file mode 100644
index 0000000..8aa701f
--- /dev/null
+++ b/test/071_coord_eo/14_F2.in
@@ -0,0 +1 @@
DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0
diff --git a/test/071_coord_eo/14_F2.out b/test/071_coord_eo/14_F2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/14_F2.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/15_F3.in b/test/071_coord_eo/15_F3.in
new file mode 100644
index 0000000..40f1260
--- /dev/null
+++ b/test/071_coord_eo/15_F3.in
@@ -0,0 +1 @@
FR1 UB0 DB0 FL1 UR0 UL0 DL0 DR0 DF1 UF1 BL0 BR0 DFR1 UBL0 UFL1 DBR0 UFR2 UBR0 DFL2 DBL0
diff --git a/test/071_coord_eo/15_F3.out b/test/071_coord_eo/15_F3.out
new file mode 100644
index 0000000..2c60641
--- /dev/null
+++ b/test/071_coord_eo/15_F3.out
@@ -0,0 +1 @@
388
diff --git a/test/071_coord_eo/16_B.in b/test/071_coord_eo/16_B.in
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/071_coord_eo/16_B.in
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/071_coord_eo/16_B.out b/test/071_coord_eo/16_B.out
new file mode 100644
index 0000000..1fd9918
--- /dev/null
+++ b/test/071_coord_eo/16_B.out
@@ -0,0 +1 @@
1539
diff --git a/test/071_coord_eo/17_B2.in b/test/071_coord_eo/17_B2.in
new file mode 100644
index 0000000..9b33e35
--- /dev/null
+++ b/test/071_coord_eo/17_B2.in
@@ -0,0 +1 @@
UF0 DB0 UB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BR0 BL0 UFR0 DBR0 DFL0 UBL0 UFL0 DBL0 DFR0 UBR0
diff --git a/test/071_coord_eo/17_B2.out b/test/071_coord_eo/17_B2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/071_coord_eo/17_B2.out
@@ -0,0 +1 @@
0
diff --git a/test/071_coord_eo/18_B3.in b/test/071_coord_eo/18_B3.in
new file mode 100644
index 0000000..1367517
--- /dev/null
+++ b/test/071_coord_eo/18_B3.in
@@ -0,0 +1 @@
UF0 BL1 BR1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 DB1 UB1 UFR0 DBL1 DFL0 UBR1 UFL0 UBL2 DFR0 DBR2
diff --git a/test/071_coord_eo/18_B3.out b/test/071_coord_eo/18_B3.out
new file mode 100644
index 0000000..1fd9918
--- /dev/null
+++ b/test/071_coord_eo/18_B3.out
@@ -0,0 +1 @@
1539
diff --git a/test/071_coord_eo/20_scrambled.in b/test/071_coord_eo/20_scrambled.in
new file mode 100644
index 0000000..274d30b
--- /dev/null
+++ b/test/071_coord_eo/20_scrambled.in
@@ -0,0 +1,3 @@
1UL0 BL0 BR1 DL0 FR0 DF0 DB1 DR1 UB0 FL0 UF0 UR1 DFL0 UFR1 DBR1 UBR2 DBL2 DFR0 UFL1 UBL2
2
3// Scramble: U R D' L D' F L2 D L F B D2 B' L2 F U2 L2 D2 R2 L2 B'
diff --git a/test/071_coord_eo/20_scrambled.out b/test/071_coord_eo/20_scrambled.out
new file mode 100644
index 0000000..aa309cc
--- /dev/null
+++ b/test/071_coord_eo/20_scrambled.out
@@ -0,0 +1 @@
1122
diff --git a/test/071_coord_eo/coord_eo_tests.c b/test/071_coord_eo/coord_eo_tests.c
new file mode 100644
index 0000000..85128e0
--- /dev/null
+++ b/test/071_coord_eo/coord_eo_tests.c
@@ -0,0 +1,21 @@
1#include "../test.h"
2
3int64_t coord_fast_eo(cube_fast_t);
4cube_fast_t cubetofast(cube_t);
5
6int main(void) {
7 char str[STRLENMAX];
8 cube_t cube;
9 cube_fast_t fast;
10 int64_t result;
11
12 fgets(str, STRLENMAX, stdin);
13 cube = readcube("H48", str);
14 fast = cubetofast(cube);
15
16 result = coord_fast_eo(fast);
17
18 printf("%" PRId64 "\n", result);
19
20 return 0;
21}
diff --git a/test/072_coord_co/00_solved.in b/test/072_coord_co/00_solved.in
new file mode 100644
index 0000000..dff224d
--- /dev/null
+++ b/test/072_coord_co/00_solved.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0
diff --git a/test/072_coord_co/00_solved.out b/test/072_coord_co/00_solved.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/00_solved.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/01_U.in b/test/072_coord_co/01_U.in
new file mode 100644
index 0000000..b5b36ad
--- /dev/null
+++ b/test/072_coord_co/01_U.in
@@ -0,0 +1 @@
UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0
diff --git a/test/072_coord_co/01_U.out b/test/072_coord_co/01_U.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/01_U.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/02_U2.in b/test/072_coord_co/02_U2.in
new file mode 100644
index 0000000..316ad57
--- /dev/null
+++ b/test/072_coord_co/02_U2.in
@@ -0,0 +1 @@
UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0
diff --git a/test/072_coord_co/02_U2.out b/test/072_coord_co/02_U2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/02_U2.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/03_U3.in b/test/072_coord_co/03_U3.in
new file mode 100644
index 0000000..7721ab5
--- /dev/null
+++ b/test/072_coord_co/03_U3.in
@@ -0,0 +1 @@
UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0
diff --git a/test/072_coord_co/03_U3.out b/test/072_coord_co/03_U3.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/03_U3.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/04_D.in b/test/072_coord_co/04_D.in
new file mode 100644
index 0000000..cf4f816
--- /dev/null
+++ b/test/072_coord_co/04_D.in
@@ -0,0 +1 @@
UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0
diff --git a/test/072_coord_co/04_D.out b/test/072_coord_co/04_D.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/04_D.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/07_R.in b/test/072_coord_co/07_R.in
new file mode 100644
index 0000000..8c8fcb3
--- /dev/null
+++ b/test/072_coord_co/07_R.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0
diff --git a/test/072_coord_co/07_R.out b/test/072_coord_co/07_R.out
new file mode 100644
index 0000000..1f3d8a7
--- /dev/null
+++ b/test/072_coord_co/07_R.out
@@ -0,0 +1 @@
1028
diff --git a/test/072_coord_co/08_R2.in b/test/072_coord_co/08_R2.in
new file mode 100644
index 0000000..90765e2
--- /dev/null
+++ b/test/072_coord_co/08_R2.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 DR0 UL0 DL0 UR0 BR0 FL0 BL0 FR0 DBR0 UBL0 DFL0 UFR0 UFL0 DFR0 UBR0 DBL0
diff --git a/test/072_coord_co/08_R2.out b/test/072_coord_co/08_R2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/08_R2.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/10_L.in b/test/072_coord_co/10_L.in
new file mode 100644
index 0000000..0b0565c
--- /dev/null
+++ b/test/072_coord_co/10_L.in
@@ -0,0 +1 @@
UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1
diff --git a/test/072_coord_co/10_L.out b/test/072_coord_co/10_L.out
new file mode 100644
index 0000000..f96ac06
--- /dev/null
+++ b/test/072_coord_co/10_L.out
@@ -0,0 +1 @@
105
diff --git a/test/072_coord_co/13_F.in b/test/072_coord_co/13_F.in
new file mode 100644
index 0000000..e805af8
--- /dev/null
+++ b/test/072_coord_co/13_F.in
@@ -0,0 +1 @@
FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0
diff --git a/test/072_coord_co/13_F.out b/test/072_coord_co/13_F.out
new file mode 100644
index 0000000..86868c5
--- /dev/null
+++ b/test/072_coord_co/13_F.out
@@ -0,0 +1 @@
1630
diff --git a/test/072_coord_co/14_F2.in b/test/072_coord_co/14_F2.in
new file mode 100644
index 0000000..8aa701f
--- /dev/null
+++ b/test/072_coord_co/14_F2.in
@@ -0,0 +1 @@
DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0
diff --git a/test/072_coord_co/14_F2.out b/test/072_coord_co/14_F2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/14_F2.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/16_B.in b/test/072_coord_co/16_B.in
new file mode 100644
index 0000000..f7fb13c
--- /dev/null
+++ b/test/072_coord_co/16_B.in
@@ -0,0 +1 @@
UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2
diff --git a/test/072_coord_co/16_B.out b/test/072_coord_co/16_B.out
new file mode 100644
index 0000000..1c599d4
--- /dev/null
+++ b/test/072_coord_co/16_B.out
@@ -0,0 +1 @@
516
diff --git a/test/072_coord_co/17_B2.in b/test/072_coord_co/17_B2.in
new file mode 100644
index 0000000..9b33e35
--- /dev/null
+++ b/test/072_coord_co/17_B2.in
@@ -0,0 +1 @@
UF0 DB0 UB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BR0 BL0 UFR0 DBR0 DFL0 UBL0 UFL0 DBL0 DFR0 UBR0
diff --git a/test/072_coord_co/17_B2.out b/test/072_coord_co/17_B2.out
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/072_coord_co/17_B2.out
@@ -0,0 +1 @@
0
diff --git a/test/072_coord_co/20_scrambled.in b/test/072_coord_co/20_scrambled.in
new file mode 100644
index 0000000..274d30b
--- /dev/null
+++ b/test/072_coord_co/20_scrambled.in
@@ -0,0 +1,3 @@
1UL0 BL0 BR1 DL0 FR0 DF0 DB1 DR1 UB0 FL0 UF0 UR1 DFL0 UFR1 DBR1 UBR2 DBL2 DFR0 UFL1 UBL2
2
3// Scramble: U R D' L D' F L2 D L F B D2 B' L2 F U2 L2 D2 R2 L2 B'
diff --git a/test/072_coord_co/20_scrambled.out b/test/072_coord_co/20_scrambled.out
new file mode 100644
index 0000000..6943e4d
--- /dev/null
+++ b/test/072_coord_co/20_scrambled.out
@@ -0,0 +1 @@
957
diff --git a/test/072_coord_co/coord_co_tests.c b/test/072_coord_co/coord_co_tests.c
new file mode 100644
index 0000000..bb061e5
--- /dev/null
+++ b/test/072_coord_co/coord_co_tests.c
@@ -0,0 +1,21 @@
1#include "../test.h"
2
3int64_t coord_fast_co(cube_fast_t);
4cube_fast_t cubetofast(cube_t);
5
6int main(void) {
7 char str[STRLENMAX];
8 cube_t cube;
9 cube_fast_t fast;
10 int64_t result;
11
12 fgets(str, STRLENMAX, stdin);
13 cube = readcube("H48", str);
14 fast = cubetofast(cube);
15
16 result = coord_fast_co(fast);
17
18 printf("%" PRId64 "\n", result);
19
20 return 0;
21}
diff --git a/test/test.h b/test/test.h
new file mode 100644
index 0000000..3cbfd10
--- /dev/null
+++ b/test/test.h
@@ -0,0 +1,27 @@
1#include <inttypes.h>
2#include <stdbool.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7#define STRLENMAX 10000
8
9typedef struct {
10 uint8_t corner[8];
11 uint8_t edge[12];
12} cube_t;
13
14#ifdef CUBE_AVX2
15#include <immintrin.h>
16typedef __m256i cube_fast_t;
17#else
18typedef cube_t cube_fast_t;
19#endif
20
21/* Basic functions used in most tests */
22cube_t solvedcube(void);
23bool iserror(cube_t);
24bool issolvable(cube_t);
25bool issolved(cube_t);
26cube_t readcube(char *, char *);
27void writecube(char *, cube_t, char *);
diff --git a/test/test.sh b/test/test.sh
new file mode 100755
index 0000000..77bd8ca
--- /dev/null
+++ b/test/test.sh
@@ -0,0 +1,39 @@
1#!/bin/sh
2
3detectsan() { cc -fsanitize=$1 -dM -E -x c - </dev/null | grep "SANITIZE"; }
4
5re="${TEST:-$@}"
6
7CC="cc -DDEBUG -std=c99 -pedantic -Wall -Wextra -g3"
8
9[ -n "$(detectsan address)" ] && CC="$CC -fsanitize=address"
10[ -n "$(detectsan undefined)" ] && CC="$CC -fsanitize=undefined"
11
12TESTBIN="test/run"
13TESTOUT="test/last.out"
14TESTERR="test/last.err"
15CUBEOBJ="debugcube.o"
16
17for t in test/*; do
18 if [ -n "$re" ] && [ -z "$(echo "$t" | grep "$re")" ]; then
19 continue
20 fi
21 if [ ! -d $t ]; then continue; fi
22 $CC -o $TESTBIN $t/*.c $CUBEOBJ || exit 1;
23 for cin in $t/*.in; do
24 c=$(echo "$cin" | sed 's/\.in//')
25 cout=$c.out
26 printf "$c: "
27 $TESTBIN < "$cin" > $TESTOUT 2> $TESTERR
28 if diff $cout $TESTOUT; then
29 printf "OK\n"
30 else
31 printf "Test failed! stderr:\n"
32 cat $TESTERR
33 exit 1
34 fi
35 done
36done
37
38echo "All tests passed!"
39rm -rf $TESTBIN $TESTOUT $TESTERR $CUBEOBJ

Generated with cgit - Back to sebastiano.tronto.net