# Copyright 2015 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.

"""Tests that recipes can modify configuration options in various ways."""

# This code is typically located inside a module/config.py file, but we inline
# it here for the testing purposes.
from recipe_engine.config import (
    config_item_context, ConfigGroup, ConfigList, Dict, List, Single, Static)

def BaseConfig(**_kwargs):
  return ConfigGroup(
    # Various config options to be exercised in tests.
    thedict    = Dict(value_type=tuple),
    thelist    = List(basestring),
    thestring  = Single(basestring, required=True),
    thebool    = Single(bool, required=False, empty_val=False),
    thesubconfig  = ConfigGroup(
      thefloat = Single(float),
      thestaticint = Static(42, hidden=False),
    ),
  )

config_ctx = config_item_context(BaseConfig)

@config_ctx()
def test1(c): # pragma: no cover
  c.thedict['a'] = (1, 2)

@config_ctx()
def test2a(c): # pragma: no cover
  c.thelist.append('foo')

@config_ctx(includes=['test2a'])
def test2(c): # pragma: no cover
  c.thestring = 'foobar'


# This is where the actual recipe code begins.
DEPS = [
  'step',
  'json',
]

def DumpRecipeEngineTestConfig(api, config):
  api.step('config', cmd=None).presentation.logs['config'] = api.json.dumps(
      config.as_jsonish(), indent=2).splitlines()


def RunSteps(api):
  config = test1()        # api.module.set_config('test1')
  config = test2(config)  # api.module.apply_config('test2')

  DumpRecipeEngineTestConfig(api, config)

  config.thelist.append('bar')
  config.thelist.extend(['baz'])
  config.thelist.remove('bar')

  DumpRecipeEngineTestConfig(api, config)

  config.thedict['b'] = ('bar', 'baz')
  del config.thedict['a']

  DumpRecipeEngineTestConfig(api, config)

  config.thebool = True
  config.thestring = 'cookoo'
  config.thesubconfig.thefloat = float(
      config.thesubconfig.thestaticint)

  DumpRecipeEngineTestConfig(api, config)


def GenTests(api):
  yield api.test('basic')
