33from fastapi .testclient import TestClient
44
55from draughts import get_board
6- from draughts .engine import AlphaBetaEngine
6+ from draughts .engine import AlphaBetaEngine , Engine
77from draughts .server .server import Server
88from draughts .move import Move
99
1010
11- class _SlowStaleEngine :
11+ class _SlowStaleEngine ( Engine ) :
1212 """Engine stub that always returns the same *initial* move after a delay.
1313
1414 This simulates autoplay overlap: a long search returns a move that was legal
@@ -22,8 +22,10 @@ def __init__(self, stale_move, delay_s: float = 0.15):
2222 self ._delay_s = delay_s
2323 self ._time = time
2424
25- def get_best_move (self , _board ):
25+ def get_best_move (self , _board , with_evaluation = False ):
2626 self ._time .sleep (self ._delay_s )
27+ if with_evaluation :
28+ return self ._stale_move , 0.0
2729 return self ._stale_move
2830
2931
@@ -122,21 +124,21 @@ def test_set_depth_clamps_and_updates_engine():
122124 try :
123125 Server .APP = _new_test_app ()
124126 board = get_board ("standard" )
125- engine = AlphaBetaEngine (depth = 6 )
127+ engine = AlphaBetaEngine (depth_limit = 6 )
126128 server = Server (
127- board = board , get_best_move_method = engine . get_best_move , engine = engine
129+ board = board , white_engine = engine , black_engine = engine
128130 )
129131 client = TestClient (server .APP )
130132
131133 r = client .get ("/set_depth/0" )
132134 assert r .status_code == 200
133135 assert r .json ()["depth" ] == 1
134- assert engine .depth == 1
136+ assert engine .depth_limit == 1
135137
136138 r = client .get ("/set_depth/999" )
137139 assert r .status_code == 200
138140 assert r .json ()["depth" ] == 10
139- assert engine .depth == 10
141+ assert engine .depth_limit == 10
140142 finally :
141143 Server .APP = old_app
142144
@@ -158,7 +160,7 @@ def test_overlapping_best_move_requests_do_not_corrupt_board():
158160 stale_move = list (board .legal_moves )[0 ]
159161
160162 engine = _SlowStaleEngine (stale_move = stale_move , delay_s = 0.15 )
161- server = Server (board = board , get_best_move_method = engine . get_best_move , engine = engine )
163+ server = Server (board = board , white_engine = engine , black_engine = engine )
162164 client = TestClient (server .APP )
163165
164166 barrier = threading .Barrier (3 )
@@ -200,11 +202,14 @@ def test_best_move_falls_back_if_engine_returns_illegal_move():
200202 Server .APP = _new_test_app ()
201203 board = get_board ("standard" )
202204
203- def bad_engine (_board ):
204- # Definitely illegal: no-op move
205- return Move ([0 , 0 ])
205+ class BadEngine (Engine ):
206+ def get_best_move (self , _board , with_evaluation = False ):
207+ # Definitely illegal: no-op move
208+ move = Move ([0 , 0 ])
209+ return (move , 0.0 ) if with_evaluation else move
206210
207- server = Server (board = board , get_best_move_method = bad_engine )
211+ bad_engine = BadEngine ()
212+ server = Server (board = board , white_engine = bad_engine , black_engine = bad_engine )
208213 client = TestClient (server .APP )
209214
210215 r = client .get ("/best_move" )
0 commit comments