# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Test API for enviroment."""

import re

from PB.recipe_modules.pigweed.environment import options as env_options
from recipe_engine import recipe_test_api


class EnvironmentTestApi(recipe_test_api.RecipeTestApi):
    """Test API for Enviroment."""

    def properties(self, **kwargs):
        opts = env_options.Options()
        opts.config_file = kwargs.pop('config_file', 'config_file.json')
        opts.root_variable_name = kwargs.pop('root_variable_name', 'FOO_ROOT')
        opts.relative_pigweed_root = kwargs.pop(
            'relative_pigweed_root', 'pigweed'
        )
        opts.skip_submodule_check = kwargs.pop('skip_submodule_check', False)
        for key, value in kwargs.pop('additional_variables', {}).items():
            opts.additional_variables[key] = str(value)

        name = kwargs.pop('name', 'environment_options')
        assert not kwargs

        return self.m.properties(**{name: opts})

    def test_data(
        self,
        env_files=('actions.json', 'setup.sh', 'irrelevant.foo'),
        venv_files=('pip.log', 'pyvenv.cfg'),
    ):
        return self.step_data(
            'environment.run pw_env_setup.environment.ls',
            self.m.file.listdir(env_files),
        ) + self.step_data(
            'environment.run pw_env_setup.venv.ls',
            self.m.file.listdir(venv_files),
        )
