Skip to content

Commit f863601

Browse files
ervtengvincentpierre
authored andcommitted
Release 0.7 Fix gym_unity Tests (#1744)
* Change gym-unity tests to use Mock instead of MockCommunicator * move creation of mock objects into helper functions * Fix comment * Fix Codacy errors * Fix ending whitespace * Minor fixes
1 parent 397b992 commit f863601

File tree

1 file changed

+71
-27
lines changed

1 file changed

+71
-27
lines changed

gym-unity/tests/test_gym.py

Lines changed: 71 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,17 @@
44

55
from gym import spaces
66
from gym_unity.envs import UnityEnv, UnityGymException
7-
from mock_communicator import MockCommunicator
87

9-
@mock.patch('mlagents.envs.UnityEnvironment.executable_launcher')
10-
@mock.patch('mlagents.envs.UnityEnvironment.get_communicator')
11-
def test_gym_wrapper(mock_communicator, mock_launcher):
12-
mock_communicator.return_value = MockCommunicator(
13-
discrete_action=False, visual_inputs=0, stack=False, num_agents=1)
8+
# Tests
149

15-
# Test for incorrect number of agents.
16-
with pytest.raises(UnityGymException):
17-
UnityEnv(' ', use_visual=False, multiagent=True)
1810

19-
env = UnityEnv(' ', use_visual=False)
11+
@mock.patch('gym_unity.envs.unity_env.UnityEnvironment')
12+
def test_gym_wrapper(mock_env):
13+
mock_brain = create_mock_brainparams()
14+
mock_braininfo = create_mock_vector_braininfo()
15+
setup_mock_unityenvironment(mock_env, mock_brain, mock_braininfo)
16+
17+
env = UnityEnv(' ', use_visual=False, multiagent=False)
2018
assert isinstance(env, UnityEnv)
2119
assert isinstance(env.reset(), np.ndarray)
2220
actions = env.action_space.sample()
@@ -27,13 +25,13 @@ def test_gym_wrapper(mock_communicator, mock_launcher):
2725
assert isinstance(done, bool)
2826
assert isinstance(info, dict)
2927

30-
@mock.patch('mlagents.envs.UnityEnvironment.executable_launcher')
31-
@mock.patch('mlagents.envs.UnityEnvironment.get_communicator')
32-
def test_multi_agent(mock_communicator, mock_launcher):
33-
mock_communicator.return_value = MockCommunicator(
34-
discrete_action=False, visual_inputs=0, stack=False, num_agents=2)
3528

36-
# Test for incorrect number of agents.
29+
@mock.patch('gym_unity.envs.unity_env.UnityEnvironment')
30+
def test_multi_agent(mock_env):
31+
mock_brain = create_mock_brainparams()
32+
mock_braininfo = create_mock_vector_braininfo(num_agents=2)
33+
setup_mock_unityenvironment(mock_env, mock_brain, mock_braininfo)
34+
3735
with pytest.raises(UnityGymException):
3836
UnityEnv(' ', multiagent=False)
3937

@@ -46,19 +44,13 @@ def test_multi_agent(mock_communicator, mock_launcher):
4644
assert isinstance(done, list)
4745
assert isinstance(info, dict)
4846

47+
4948
@mock.patch('gym_unity.envs.unity_env.UnityEnvironment')
5049
def test_branched_flatten(mock_env):
51-
mock_env.return_value.academy_name = 'MockAcademy'
52-
mock_brain = mock.Mock();
53-
mock_brain.return_value.number_visual_observations = 0
54-
mock_brain.return_value.num_stacked_vector_observations = 1
55-
mock_brain.return_value.vector_action_space_type = 'discrete'
56-
mock_brain.return_value.vector_observation_space_size = 1
57-
# Unflattened action space
58-
mock_brain.return_value.vector_action_space_size = [2,2,3]
59-
60-
mock_env.return_value.brains = {'MockBrain':mock_brain()}
61-
mock_env.return_value.external_brain_names = ['MockBrain']
50+
mock_brain = create_mock_brainparams(vector_action_space_type='discrete', vector_action_space_size=[2,2,3])
51+
mock_braininfo = create_mock_vector_braininfo(num_agents=1)
52+
setup_mock_unityenvironment(mock_env, mock_brain, mock_braininfo)
53+
6254
env = UnityEnv(' ', use_visual=False, multiagent=False, flatten_branched=True)
6355
assert isinstance(env.action_space, spaces.Discrete)
6456
assert env.action_space.n==12
@@ -68,3 +60,55 @@ def test_branched_flatten(mock_env):
6860
# Check that False produces a MultiDiscrete
6961
env = UnityEnv(' ', use_visual=False, multiagent=False, flatten_branched=False)
7062
assert isinstance(env.action_space, spaces.MultiDiscrete)
63+
64+
# Helper methods
65+
66+
67+
def create_mock_brainparams(number_visual_observations=0, num_stacked_vector_observations=1,
68+
vector_action_space_type='continuous', vector_observation_space_size=3,
69+
vector_action_space_size=None):
70+
"""
71+
Creates a mock BrainParameters object with parameters.
72+
"""
73+
# Avoid using mutable object as default param
74+
if vector_action_space_size is None:
75+
vector_action_space_size = [2]
76+
mock_brain = mock.Mock();
77+
mock_brain.return_value.number_visual_observations = number_visual_observations
78+
mock_brain.return_value.num_stacked_vector_observations = num_stacked_vector_observations
79+
mock_brain.return_value.vector_action_space_type = vector_action_space_type
80+
mock_brain.return_value.vector_observation_space_size = vector_observation_space_size
81+
mock_brain.return_value.vector_action_space_size = vector_action_space_size
82+
return mock_brain()
83+
84+
85+
def create_mock_vector_braininfo(num_agents = 1):
86+
"""
87+
Creates a mock BrainInfo with vector observations. Imitates constant
88+
vector observations, rewards, dones, and agents.
89+
90+
:int num_agents: Number of "agents" to imitate in your BrainInfo values.
91+
"""
92+
mock_braininfo = mock.Mock()
93+
mock_braininfo.return_value.vector_observations = np.array([num_agents*[1, 2, 3,]])
94+
mock_braininfo.return_value.rewards = num_agents*[1.0]
95+
mock_braininfo.return_value.local_done = num_agents*[False]
96+
mock_braininfo.return_value.text_observations = num_agents*['']
97+
mock_braininfo.return_value.agents = range(0,num_agents)
98+
return mock_braininfo()
99+
100+
101+
def setup_mock_unityenvironment(mock_env, mock_brain, mock_braininfo):
102+
"""
103+
Takes a mock UnityEnvironment and adds the appropriate properties, defined by the mock
104+
BrainParameters and BrainInfo.
105+
106+
:Mock mock_env: A mock UnityEnvironment, usually empty.
107+
:Mock mock_brain: A mock Brain object that specifies the params of this environment.
108+
:Mock mock_braininfo: A mock BrainInfo object that will be returned at each step and reset.
109+
"""
110+
mock_env.return_value.academy_name = 'MockAcademy'
111+
mock_env.return_value.brains = {'MockBrain':mock_brain}
112+
mock_env.return_value.external_brain_names = ['MockBrain']
113+
mock_env.return_value.reset.return_value = {'MockBrain':mock_braininfo}
114+
mock_env.return_value.step.return_value = {'MockBrain':mock_braininfo}

0 commit comments

Comments
 (0)