nissy-nx

A Rubik's cube optimal solver
git clone https://git.tronto.net/nissy-nx
Download | Log | Files | Refs | README | LICENSE

fst_tests.c (3539B)


      1 #include "fst_tests.h"
      2 
      3 static bool testmethod_fst_is_consistent(void *);
      4 static bool testmethod_cube_to_fst_to_cube(void *);
      5 static bool testmethod_fst_move(void *);
      6 static bool testmethod_fst_inverse(void *);
      7 static bool check_equal_and_log(Cube *, Cube *);
      8 static void void_to_cube(void *, Cube *);
      9 
     10 char *algs[] = {
     11 	"",
     12 	"U", "U2", "U'", "D", "D2", "D'", "R", "R2", "R'",
     13 	"L", "L2", "L'", "F", "F2", "F'", "B", "B2", "B'",
     14 	"U2 R2 U2 R2 U2",
     15 	"U2 F2 R2 B2 U2 D2 F2 L2 B2",
     16 	"RUR'URU2R'",
     17 	"L2 D R U2 B2 L",
     18 	"R'U'F",
     19 	"F2 U' R2 D' B2 D2 R2 D2 R2 U' F L' U' R B F2 R B' D2",
     20 	"D L2 F2 R2 D R2 U L2 U' B2 D L' F2 U2 B' L D' U' R' B2 F2",
     21 	"F' L2 F' D' R F2 L U L' D2 R2 F2 D2 R2 B' L2 B2 U2 F D2 B",
     22 	NULL,
     23 };
     24 
     25 Test test_fst_is_consistent = {
     26 	.name  = "Consitency of FST (converted from cube)",
     27 	.t     = testmethod_fst_is_consistent,
     28 	.cases = (void **)algs,
     29 };
     30 Test test_cube_to_fst_to_cube = {
     31 	.name  = "Cube to FST to cube",
     32 	.t     = testmethod_cube_to_fst_to_cube,
     33 	.cases = (void **)algs,
     34 };
     35 Test test_fst_move = {
     36 	.name  = "FST move",
     37 	.t     = testmethod_fst_move,
     38 	.cases = (void **)algs,
     39 };
     40 Test test_fst_inverse = {
     41 	.name  = "FST inverse",
     42 	.t     = testmethod_fst_inverse,
     43 	.cases = (void **)algs,
     44 };
     45 
     46 Test *fst_pre_init[] = {
     47 	&test_fst_is_consistent,
     48 	&test_cube_to_fst_to_cube,
     49 	NULL
     50 };
     51 TestSuite fst_pre_init_suite = {
     52 	.setup    = NULL,
     53 	.tests    = fst_pre_init,
     54 	.teardown = NULL,
     55 };
     56 
     57 Test *fst_post_init[] = {
     58 	&test_fst_move,
     59 	&test_fst_inverse,
     60 	NULL
     61 };
     62 TestSuite fst_post_init_suite = {
     63 	.setup    = init_fst,
     64 	.tests    = fst_post_init,
     65 	.teardown = NULL,
     66 };
     67 
     68 TestSuite *fst_suites[] = {
     69 	&fst_pre_init_suite,
     70 	&fst_post_init_suite,
     71 	NULL
     72 };
     73 
     74 static bool
     75 check_equal_and_log(Cube *c, Cube *d)
     76 {
     77 	bool ret = equal(c, d);
     78 
     79 	if (!ret) {
     80 		printf("\n");
     81 		printf("These cubes should be equal, but are not:\n\n");
     82 		print_cube(c);
     83 		printf("\n");
     84 		print_cube(d);
     85 		printf("\n");
     86 	}
     87 
     88 	return ret;
     89 }
     90 
     91 static void
     92 void_to_cube(void *a, Cube *c)
     93 {
     94 	char *algstr;
     95 	Alg *alg;
     96 
     97 	algstr = (char *)a;
     98 	alg = new_alg(algstr);
     99 	make_solved(c);
    100 	apply_alg(alg, c);
    101 	free_alg(alg);
    102 }
    103 
    104 bool
    105 testmethod_fst_is_consistent(void *a)
    106 {
    107 	FstCube fst_uf, fst_fr, fst_rd;
    108 	Cube c, c_fr, c_rd;
    109 	bool consistent_fr, consistent_rd, result;
    110 
    111 	void_to_cube(a, &c);
    112 	copy_cube(&c, &c_fr);
    113 	apply_trans(fr, &c_fr);
    114 
    115 	copy_cube(&c, &c_rd);
    116 	apply_trans(rd, &c_rd);
    117 
    118 	fst_uf = cube_to_fst(&c);
    119 	fst_fr = cube_to_fst(&c_fr);
    120 	fst_rd = cube_to_fst(&c_rd);
    121 
    122 	consistent_fr = fst_uf.fr_eofb == fst_fr.uf_eofb &&
    123 			fst_uf.fr_eposepe == fst_fr.uf_eposepe &&
    124 			fst_uf.fr_coud == fst_fr.uf_coud;
    125 
    126 	consistent_rd = fst_uf.rd_eofb == fst_rd.uf_eofb &&
    127 			fst_uf.rd_eposepe == fst_rd.uf_eposepe &&
    128 			fst_uf.rd_coud == fst_rd.uf_coud;
    129 
    130 	result = consistent_fr && consistent_rd;
    131 
    132 	if (!result)
    133 		printf("\nFailed with alg %s\n", (char *)a);
    134 
    135 	return result;
    136 }
    137 
    138 bool
    139 testmethod_cube_to_fst_to_cube(void *a)
    140 {
    141 	Cube c, d;
    142 	FstCube fst;
    143 
    144 	void_to_cube(a, &c);
    145 	fst = cube_to_fst(&c);
    146 	fst_to_cube(fst, &d);
    147 
    148 	return check_equal_and_log(&c, &d);;
    149 }
    150 
    151 bool
    152 testmethod_fst_move(void *a)
    153 {
    154 	int i;
    155 	Alg *alg;
    156 	Cube c, d;
    157 	FstCube fst;
    158 
    159 	void_to_cube(a, &c);
    160 	alg = new_alg((char *)a);
    161 	make_solved(&d);
    162 	fst = cube_to_fst(&d);
    163 
    164 	for (i = 0; i < alg->len; i++)
    165 		fst = fst_move(alg->move[i], fst);
    166 
    167 	fst_to_cube(fst, &d);
    168 
    169 	free_alg(alg);
    170 
    171 	return check_equal_and_log(&c, &d);
    172 }
    173 
    174 bool
    175 testmethod_fst_inverse(void *a)
    176 {
    177 	Cube c, d;
    178 
    179 	void_to_cube(a, &c);
    180 	fst_to_cube(fst_inverse(cube_to_fst(&c)), &d);
    181 	invert_cube(&c);
    182 
    183 	return check_equal_and_log(&c, &d);
    184 }