10 #include "tactics/selfatari.h"
11 #include "tactics/ladder.h"
14 static bool board_printed
;
17 board_load(struct board
*b
, FILE *f
, unsigned int size
)
19 board_printed
= false;
20 board_resize(b
, size
);
22 for (int y
= size
- 1; y
>= 0; y
--) {
24 if (!fgets(line
, sizeof(line
), f
)) {
25 fprintf(stderr
, "Premature EOF.\n");
28 line
[strlen(line
) - 1] = 0; // chomp
29 if (strlen(line
) != size
* 2 - 1) {
30 fprintf(stderr
, "Line not %d char long: %s\n", size
* 2 - 1, line
);
33 for (unsigned int i
= 0; i
< size
* 2; i
++) {
36 case '.': s
= S_NONE
; break;
37 case 'X': s
= S_BLACK
; break;
38 case 'O': s
= S_WHITE
; break;
39 default: fprintf(stderr
, "Invalid stone '%c'\n", line
[i
]);
43 if (line
[i
] != ' ' && i
/2 < size
- 1) {
44 fprintf(stderr
, "No space after stone %i: '%c'\n", i
/2 + 1, line
[i
]);
47 if (s
== S_NONE
) continue;
48 struct move m
= { .color
= s
, .coord
= coord_xy(b
, i
/2 + 1, y
+ 1) };
49 if (board_play(b
, &m
) < 0) {
50 fprintf(stderr
, "Failed to play %s %s\n",
51 stone2str(s
), coord2sstr(m
.coord
, b
));
52 board_print(b
, stderr
);
58 board_print(b
, stderr
);
59 int suicides
= b
->captures
[S_BLACK
] || b
->captures
[S_WHITE
];
64 test_sar(struct board
*b
, char *arg
)
66 enum stone color
= str2stone(arg
);
68 coord_t
*cc
= str2coord(arg
, board_size(b
));
69 coord_t c
= *cc
; coord_done(cc
);
70 arg
+= strcspn(arg
, " ") + 1;
73 printf("sar %s %s %d...\t", stone2str(color
), coord2sstr(c
, b
), eres
);
75 assert(board_at(b
, c
) == S_NONE
);
76 int rres
= is_bad_selfatari(b
, color
, c
);
82 if (debug_level
<= 2) {
83 if (DEBUGL(0) && !board_printed
) {
84 board_print(b
, stderr
);
87 printf("sar %s %s %d...\t", stone2str(color
), coord2sstr(c
, b
), eres
);
89 printf("FAILED (%d)\n", rres
);
95 test_ladder(struct board
*b
, char *arg
)
97 enum stone color
= str2stone(arg
);
99 coord_t
*cc
= str2coord(arg
, board_size(b
));
100 coord_t c
= *cc
; coord_done(cc
);
101 arg
+= strcspn(arg
, " ") + 1;
102 int eres
= atoi(arg
);
104 printf("ladder %s %s %d...\t", stone2str(color
), coord2sstr(c
, b
), eres
);
106 assert(board_at(b
, c
) == S_NONE
);
107 group_t atari_neighbor
= board_get_atari_neighbor(b
, c
, color
);
108 assert(atari_neighbor
);
109 int rres
= is_ladder(b
, c
, atari_neighbor
, true);
115 if (debug_level
<= 2) {
116 if (DEBUGL(0) && !board_printed
) {
117 board_print(b
, stderr
);
118 board_printed
= true;
120 printf("ladder %s %s %d...\t", stone2str(color
), coord2sstr(c
, b
), eres
);
122 printf("FAILED (%d)\n", rres
);
125 return (rres
== eres
);
130 unittest(char *filename
)
132 FILE *f
= fopen(filename
, "r");
142 struct board
*b
= board_init(NULL
);
145 while (fgets(line
, sizeof(line
), f
)) {
146 line
[strlen(line
) - 1] = 0; // chomp
148 case '%': printf("\n%s\n", line
); continue;
149 case '!': printf("%s...\tSKIPPED\n", line
); skipped
++; continue;
152 if (!strncmp(line
, "boardsize ", 10)) {
153 board_load(b
, f
, atoi(line
+ 10));
158 if (!strncmp(line
, "sar ", 4))
159 passed
+= test_sar(b
, line
+ 4);
160 else if (!strncmp(line
, "ladder ", 7))
161 passed
+= test_ladder(b
, line
+ 7);
163 fprintf(stderr
, "Syntax error: %s\n", line
);
170 printf("\n\n----------- [ %i/%i tests passed (%i%%) ] -----------\n\n", passed
, total
, passed
* 100 / total
);
172 printf("\nAll tests PASSED");
174 printf("\nSome tests FAILED\n");
178 printf(", %d test(s) SKIPPED", skipped
);