# Copyright 2018 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 import post_process
from recipe_engine.recipe_api import Property

DEPS = ['tricium', 'properties']

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

_BAD_CASES = {
    'bad start_line':
        dict(start_line=-1),
    'file level comment: end_line':
        dict(start_line=0, end_line=1),
    'file level comment: start_char':
        dict(start_line=0, start_char=1),
    'file level comment: end_char':
        dict(start_line=0, end_char=1),
    'end_line':
        dict(start_line=2, end_line=1),
    'start_char':
        dict(start_line=1, start_char=-1, end_line=2),
    'end_char':
        dict(start_line=1, start_char=1, end_line=2, end_char=-1),
    'wrong-range':
        dict(start_line=5, start_char=5, end_line=5, end_char=5),
    'absolute path':
        dict(start_line=3, end_line=3, path="/usr/home/me/checkout/foo.txt"),
}
_OK_CASES = {
    'exactly 1 char': dict(start_line=5, start_char=5, end_line=5, end_char=6),
    'end of 1 line': dict(start_line=5, start_char=5, end_line=6, end_char=1),
    'just 1 entire line': dict(start_line=3, end_line=3),
    'several entire lines': dict(start_line=3, end_line=5),
}

def RunSteps(api, case):
  # Set valid default.
  kwargs = dict(
      category='test',
      message='msg',
      path='path/to/file',
  )
  if case in _BAD_CASES:
    kwargs.update(_BAD_CASES[case])
  elif case in _OK_CASES:
    kwargs.update(_OK_CASES[case])
  else:  # pragma: nocover
    assert 'unknown case', case
  api.tricium.add_comment(**kwargs)


def GenTests(api):
  for name in _BAD_CASES:
    yield api.test(name, api.properties(case=name),
                   api.expect_exception(ValueError.__name__),
                   api.post_process(post_process.DropExpectation))
  for name in _OK_CASES:
    yield api.test(name, api.properties(case=name),
                   api.post_process(post_process.DropExpectation))
