44
55from gym import spaces
66from 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' )
5049def 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