# 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 non-repo non-submodule functionality of checkout module."""

from PB.recipe_modules.pigweed.checkout.tests.properties import InputProperties

DEPS = [
    'fuchsia/status_check',
    'pigweed/checkout',
    'recipe_engine/json',
    'recipe_engine/properties',
    'recipe_engine/step',
]

PROPERTIES = InputProperties


def RunSteps(api, props):  # pylint: disable=invalid-name
    checkout = api.checkout(props.checkout_options)

    def steplog(name, value):  # pylint: disable=invalid-name
        with api.step.nest(name) as pres:
            pres.step_summary_text = repr(value)

    # These lines are needed for coverage.
    steplog('revision', checkout.revision())
    steplog('revision', checkout.revision())  # Intentional repeat (caching).
    steplog('gerrit_host', checkout.gerrit_host())
    steplog('gerrit_project', checkout.gerrit_project())
    steplog('submodules', checkout.submodules())


def GenTests(api):  # pylint: disable=invalid-name
    def props(host=api.checkout.pigweed_repo, branch=None, **kwargs):
        return api.properties(
            **api.checkout.git_properties(remote=host, branch=branch, **kwargs)
        )

    yield (api.status_check.test('ci') + props() + api.checkout.ci_test_data())

    yield (
        api.status_check.test('try')
        + props(root_subdirectory='foo')
        + api.checkout.try_test_data()
        + api.checkout.cl_branch_parents(num_parents=2)
    )

    yield api.status_check.test('other') + props()

    yield (
        api.status_check.test('not_in_gerrit')
        + props()
        + api.step_data(
            'checkout pigweed.change data.number', api.json.output({}),
        )
    )
