import unittest

import ray
import ray.rllib.agents.ppo as ppo
from ray.rllib.utils.test_utils import check_compute_single_action, \
    framework_iterator


class TestAPPO(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        ray.init()

    @classmethod
    def tearDownClass(cls):
        ray.shutdown()

    def test_appo_compilation(self):
        """Test whether an APPOTrainer can be built with both frameworks."""
        config = ppo.appo.DEFAULT_CONFIG.copy()
        config["num_workers"] = 1
        num_iterations = 2

        for _ in framework_iterator(config, frameworks=("torch", "tf")):
            _config = config.copy()
            trainer = ppo.APPOTrainer(config=_config, env="CartPole-v0")
            for i in range(num_iterations):
                print(trainer.train())
            check_compute_single_action(trainer)

            _config = config.copy()
            _config["vtrace"] = True
            trainer = ppo.APPOTrainer(config=_config, env="CartPole-v0")
            for i in range(num_iterations):
                print(trainer.train())
            check_compute_single_action(trainer)


if __name__ == "__main__":
    import pytest
    import sys
    sys.exit(pytest.main(["-v", __file__]))

[(12, 'ray.init', 'ray.init', False, 'import ray\n'), (16, 'ray.shutdown', 'ray.shutdown', False, 'import ray\n'), (20, 'ray.rllib.agents.ppo.appo.DEFAULT_CONFIG.copy', 'ppo.appo.DEFAULT_CONFIG.copy', True, 'import ray.rllib.agents.ppo as ppo\n'), (24, 'ray.rllib.utils.test_utils.framework_iterator', 'framework_iterator', False, 'from ray.rllib.utils.test_utils import check_compute_single_action, framework_iterator\n'), (42, 'pytest.main', 'pytest.main', False, 'import pytest\n'), (26, 'ray.rllib.agents.ppo.APPOTrainer', 'ppo.APPOTrainer', True, 'import ray.rllib.agents.ppo as ppo\n'), (29, 'ray.rllib.utils.test_utils.check_compute_single_action', 'check_compute_single_action', False, 'from ray.rllib.utils.test_utils import check_compute_single_action, framework_iterator\n'), (33, 'ray.rllib.agents.ppo.APPOTrainer', 'ppo.APPOTrainer', True, 'import ray.rllib.agents.ppo as ppo\n'), (36, 'ray.rllib.utils.test_utils.check_compute_single_action', 'check_compute_single_action', False, 'from ray.rllib.utils.test_utils import check_compute_single_action, framework_iterator\n')]