# Copyright 2017 The PDFium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Presubmit script for PDFium testing corpus.

See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into depot_tools.
"""

PRESUBMIT_VERSION = '2.0.0'

USE_PYTHON3 = True

def _CheckNoIn(input_api, output_api):
  """Checks that corpus tests don't contain .in files. Corpus tests should be
  .pdf files, having both can cause race conditions on the bots, which run the
  tests in parallel.
  """
  results = []
  for f in input_api.AffectedFiles(include_deletes=False):
    if f.LocalPath().endswith('.in'):
      results.append(output_api.PresubmitError(
          f'Remove {f.LocalPath()} since corpus tests should not use .in files'
      ))
  return results

def _CheckPngNames(input_api, output_api):
  """Checks that .png files have the right file name format, which must be in
  the form:

  NAME_expected(_gdi)?(_(agg|skia))?(_(linux|mac|win))?.pdf.\d+.png

  This must be the same format as the one in PDFium's PRESUBMIT.py.
  """
  expected_pattern = input_api.re.compile(
      r'.+_expected(_gdi)?(_(agg|skia))?(_(linux|mac|win))?\.pdf\.\d+.png')
  results = []
  for f in input_api.AffectedFiles(include_deletes=False):
    if not f.LocalPath().endswith('.png'):
      continue
    if expected_pattern.match(f.LocalPath()):
      continue
    results.append(
        output_api.PresubmitError(
            'PNG file %s does not have the correct format' % f.LocalPath()))
  return results

def ChecksCommon(input_api, output_api):
  results = []

  results.extend(
      input_api.canned_checks.PanProjectChecks(
          input_api, output_api, project_name='PDFium'))

  return results

def CheckChangeOnUpload(input_api, output_api):
  results = []
  results += _CheckPngNames(input_api, output_api)
  results += _CheckNoIn(input_api, output_api)
  return results
