Spaces:
Sleeping
Sleeping
import numpy as np | |
import pytest | |
from easydict import EasyDict | |
from .game_2048_env import Game2048Env | |
class TestGame2048(): | |
def setup(self) -> None: | |
# Configuration for the Game2048 environment | |
cfg = EasyDict(dict( | |
env_name="game_2048", | |
# (str) The render mode. Options are 'None', 'state_realtime_mode', 'image_realtime_mode' or 'image_savefile_mode'. If None, then the game will not be rendered. | |
render_mode=None, | |
replay_format='gif', | |
replay_name_suffix='eval', | |
replay_path=None, | |
act_scale=True, | |
channel_last=True, | |
# (str) The type of observation to use. Options are 'raw_board', 'raw_encoded_board', and 'dict_encoded_board'. | |
obs_type='raw_encoded_board', | |
reward_type='raw', # options=['raw', 'merged_tiles_plus_log_max_tile_num'] | |
reward_normalize=False, | |
reward_norm_scale=100, | |
max_tile=int(2 ** 16), # 2**11=2048, 2**16=65536 | |
delay_reward_step=0, | |
prob_random_agent=0., | |
max_episode_steps=int(1e6), | |
is_collect=True, | |
ignore_legal_actions=True, | |
need_flatten=False, | |
num_of_possible_chance_tile=2, | |
possible_tiles=np.array([2, 4]), | |
tile_probabilities=np.array([0.9, 0.1]), | |
)) | |
# Create a Game2048 environment that will be used in the following tests. | |
self.env = Game2048Env(cfg) | |
# Test the initialization of the Game2048 environment. | |
def test_initialization(self): | |
assert isinstance(self.env, Game2048Env) | |
# Test the reset method of the Game2048 environment. | |
# Ensure that the shape of the observation is as expected. | |
def test_reset(self): | |
obs = self.env.reset() | |
assert obs.shape == (4, 4, 16) | |
# Test the step method of the Game2048 environment. | |
# Ensure that the shape of the observation, the type of the reward, | |
# the type of the done flag and the type of the info are as expected. | |
def test_step_shape(self): | |
self.env.reset() | |
obs, reward, done, info = self.env.step(1) | |
assert obs.shape == (4, 4, 16) | |
assert isinstance(reward, np.ndarray) | |
assert isinstance(done, bool) | |
assert isinstance(info, dict) | |
# Test the render method of the Game2048 environment. | |
# Ensure that the shape of the rendered image is as expected. | |
def test_render(self): | |
# (str) The render mode. Options are 'None', 'state_realtime_mode', 'image_realtime_mode' or 'image_savefile_mode'. If None, then the game will not be rendered. | |
self.env.reset() | |
self.env.render(mode='state_realtime_mode') | |
self.env.render(mode='image_savefile_mode') | |
self.env.render(mode='image_realtime_mode') | |
# Test the seed method of the Game2048 environment. | |
# Ensure that the random seed is set correctly. | |
def test_seed(self): | |
self.env.seed(0) | |
assert self.env.np_random.randn() != np.random.randn() | |
def test_step_action_case1(self): | |
init_board = np.array([[8, 4, 0, 0], | |
[2, 0, 0, 0], | |
[2, 0, 0, 0], | |
[2, 4, 2, 0]]) | |
# Test action 0 (Assuming it represents 'up' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(0) | |
expected_board_up = np.array([[8, 8, 2, 0], | |
[4, 0, 0, 0], | |
[2, 0, 0, 0], | |
[0, 0, 0, 0]]) | |
assert np.array_equal(self.env.board, expected_board_up) | |
# Test action 1 (Assuming it represents 'right' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(1) | |
expected_board_right = np.array([[0, 0, 8, 4], | |
[0, 0, 0, 2], | |
[0, 0, 0, 2], | |
[0, 2, 4, 2]]) | |
assert np.array_equal(self.env.board, expected_board_right) | |
# Test action 2 (Assuming it represents 'down' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(2) | |
expected_board_down = np.array([[0, 0, 0, 0], | |
[8, 0, 0, 0], | |
[2, 0, 0, 0], | |
[4, 8, 2, 0]]) | |
assert np.array_equal(self.env.board, expected_board_down) | |
# Test action 3 (Assuming it represents 'left' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(3) | |
expected_board_left = np.array([[8, 4, 0, 0], | |
[2, 0, 0, 0], | |
[2, 0, 0, 0], | |
[2, 4, 2, 0]]) | |
assert np.array_equal(self.env.board, expected_board_left) | |
def test_step_action_case2(self): | |
init_board = np.array([[8, 4, 2, 0], | |
[2, 0, 2, 0], | |
[2, 2, 4, 0], | |
[2, 4, 2, 0]]) | |
# Test action 0 (Assuming it represents 'up' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(0) | |
expected_board_up = np.array([[8, 4, 4, 0], | |
[4, 2, 4, 0], | |
[2, 4, 2, 0], | |
[0, 0, 0, 0]]) | |
assert np.array_equal(self.env.board, expected_board_up) | |
# Test action 1 (Assuming it represents 'right' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(1) | |
expected_board_right = np.array([[0, 8, 4, 2], | |
[0, 0, 0, 4], | |
[0, 0, 4, 4], | |
[0, 2, 4, 2]]) | |
assert np.array_equal(self.env.board, expected_board_right) | |
# Test action 2 (Assuming it represents 'down' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(2) | |
expected_board_down = np.array([[0, 0, 0, 0], | |
[8, 4, 4, 0], | |
[2, 2, 4, 0], | |
[4, 4, 2, 0]]) | |
assert np.array_equal(self.env.board, expected_board_down) | |
# Test action 3 (Assuming it represents 'left' move) | |
self.env.reset(init_board=init_board, add_random_tile_flag=False) | |
obs, reward, done, info = self.env.step(3) | |
expected_board_left = np.array([[8, 4, 2, 0], | |
[4, 0, 0, 0], | |
[4, 4, 0, 0], | |
[2, 4, 2, 0]]) | |
assert np.array_equal(self.env.board, expected_board_left) | |