mirror of
https://github.com/Farama-Foundation/Gymnasium.git
synced 2025-07-31 22:04:31 +00:00
* init * add .gitignore * fix .gitignore * remove internal backend use * fix VideoRecorder test * fix .gitignore * fix order enforcing tests * adapt play.py * reformat * fix .gitignore * add type to DummyPlayEnv
102 lines
2.3 KiB
Python
102 lines
2.3 KiB
Python
import gc
|
|
import os
|
|
import time
|
|
|
|
import pytest
|
|
|
|
import gym
|
|
from gym.wrappers.monitoring.video_recorder import VideoRecorder
|
|
|
|
|
|
class BrokenRecordableEnv(gym.Env):
|
|
metadata = {"render_modes": ["rgb_array"]}
|
|
|
|
def __init__(self, render_mode="rgb_array"):
|
|
self.render_mode = render_mode
|
|
|
|
def render(self):
|
|
pass
|
|
|
|
|
|
class UnrecordableEnv(gym.Env):
|
|
metadata = {"render_modes": [None]}
|
|
|
|
def __init__(self, render_mode=None):
|
|
self.render_mode = render_mode
|
|
|
|
def render(self):
|
|
pass
|
|
|
|
|
|
def test_record_simple():
|
|
env = gym.make("CartPole-v1", render_mode="rgb_array", disable_env_checker=True)
|
|
rec = VideoRecorder(env)
|
|
env.reset()
|
|
rec.capture_frame()
|
|
|
|
rec.close()
|
|
|
|
assert not rec.broken
|
|
assert os.path.exists(rec.path)
|
|
f = open(rec.path)
|
|
assert os.fstat(f.fileno()).st_size > 100
|
|
|
|
|
|
def test_autoclose():
|
|
def record():
|
|
env = gym.make("CartPole-v1", render_mode="rgb_array", disable_env_checker=True)
|
|
rec = VideoRecorder(env)
|
|
env.reset()
|
|
rec.capture_frame()
|
|
|
|
rec_path = rec.path
|
|
|
|
# The function ends without an explicit `rec.close()` call
|
|
# The Python interpreter will implicitly do `del rec` on garbage cleaning
|
|
return rec_path
|
|
|
|
rec_path = record()
|
|
|
|
gc.collect() # do explicit garbage collection for test
|
|
time.sleep(5) # wait for subprocess exiting
|
|
|
|
assert os.path.exists(rec_path)
|
|
f = open(rec_path)
|
|
assert os.fstat(f.fileno()).st_size > 100
|
|
|
|
|
|
def test_no_frames():
|
|
env = BrokenRecordableEnv()
|
|
rec = VideoRecorder(env)
|
|
rec.close()
|
|
assert rec.functional
|
|
assert not os.path.exists(rec.path)
|
|
|
|
|
|
def test_record_unrecordable_method():
|
|
env = UnrecordableEnv()
|
|
rec = VideoRecorder(env)
|
|
assert not rec.enabled
|
|
rec.close()
|
|
|
|
|
|
@pytest.mark.filterwarnings("ignore:.*Env returned None on render.*")
|
|
def test_record_breaking_render_method():
|
|
env = BrokenRecordableEnv()
|
|
rec = VideoRecorder(env)
|
|
rec.capture_frame()
|
|
rec.close()
|
|
assert rec.broken
|
|
assert not os.path.exists(rec.path)
|
|
|
|
|
|
def test_text_envs():
|
|
env = gym.make("FrozenLake-v1", render_mode="rgb_array", disable_env_checker=True)
|
|
video = VideoRecorder(env)
|
|
try:
|
|
env.reset()
|
|
video.capture_frame()
|
|
video.close()
|
|
finally:
|
|
os.remove(video.path)
|