# Copyright 2013 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.

from recipe_engine.recipe_api import Property

DEPS = [
  'generator_script',
  'json',
  'path',
  'properties',
  'step',
]

PROPERTIES = {
  'script_name': Property(kind=str),
}

def RunSteps(api, script_name):
  api.path['checkout'] = api.path['tmp_base']
  script_name = api.properties['script_name']
  api.generator_script(script_name)

def GenTests(api):
  yield (
    api.test('basic') +
    api.properties(script_name="bogus") +
    api.generator_script(
      'bogus',
      {'name': 'mock.step.binary', 'cmd': ['echo', 'mock step binary']}
    )
  )

  yield (
    api.test('basic_python') +
    api.properties(script_name="bogus.py") +
    api.generator_script(
      'bogus.py',
      {'name': 'mock.step.python', 'cmd': ['echo', 'mock step python']},
    )
  )

  yield (
    api.test('presentation') +
    api.properties(script_name='presentation.py') +
    api.generator_script(
      'presentation.py', {
        'name': 'mock.step.presentation',
        'cmd': ['echo', 'mock step presentation'],
        'outputs_presentation_json': True
      }
    ) +
    api.step_data(
      'mock.step.presentation',
      api.json.output({'step_text': 'mock step text'})
    )
  )

  yield (
    api.test('always_run') +
    api.properties(script_name='always_run.py') +
    api.generator_script(
      'always_run.py',
      {'name': 'runs', 'cmd': ['echo', 'runs succeeds']},
      {'name': 'fails', 'cmd': ['echo', 'fails fails!']},
      {'name': 'skipped', 'cmd': ['echo', 'absent']},
      {'name': 'always_runs', 'cmd': ['echo', 'runs anyway'],
       'always_run': True},
    ) +
    api.step_data('fails', retcode=1)
  )

  yield (
    api.test('malformed_list') +
    api.properties(script_name='not_list.py') +
    api.step_data(
      'gen step(not_list.py)',
      api.json.output({'not': 'a list'}))
  )

  yield (
    api.test('malformed_command') +
    api.properties(script_name='malformed.py') +
    api.generator_script(
      'malformed.py',
      {'name': 'run', 'cmd': ['echo', 'there are', 4, 'cows']})
  )

  yield (
    api.test('bad_key') +
    api.properties(script_name='bad_key.py') +
    api.generator_script(
      'bad_key.py',
      {'name': 'whatever', 'bad': 'key'})
  )
