# 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.
"""Full test of environment module."""

from recipe_engine.recipe_api import Property

DEPS = [
    'fuchsia/status_check',
    'pigweed/environment',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
]

PYTHON_VERSION_COMPATIBILITY = "PY3"


def RunSteps(api):  # pylint: disable=invalid-name
    # pylint: disable=missing-function-docstring
    api.environment.init(
        checkout_root=api.path['start_dir'], use_constraint_file=False,
    )

    # The next couple lines help cover all of api.py.
    try:
        # VIRTUAL_ENV is set in almost all cases, but not in the 'empty' test.
        _ = api.environment.VIRTUAL_ENV
        _ = api.environment.VARIABLE_NAME_UNLIKELY_TO_BE_USED_ELSEWHERE
    except AttributeError:
        pass

    with api.environment():
        pass


def GenTests(api):  # pylint: disable=invalid-name
    props = api.environment.properties()

    yield (
        api.status_check.test('normal')
        + api.properties(**props)
        + api.platform.name('mac')
        + api.environment.test_data()
    )

    yield (
        api.status_check.test('windows')
        + api.properties(**props)
        + api.platform.name('win')
    )

    yield api.status_check.test('empty')
