#!/usr/bin/env python3
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

'''
Tests for font-subset
'''

import filecmp
import os
import subprocess
import sys
from zipfile import ZipFile

# Dictionary to map the platform name to the output directory
# of the font artifacts.
PLATFORM_2_PATH = {
    'darwin': 'darwin-x64',
    'linux': 'linux-x64',
    'linux2': 'linux-x64',
    'cygwin': 'windows-x64',
    'win': 'windows-x64',
    'win32': 'windows-x64',
}

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, '..', '..', '..'))
MATERIAL_TTF = os.path.join(SCRIPT_DIR, 'fixtures', 'MaterialIcons-Regular.ttf')
VARIABLE_MATERIAL_TTF = os.path.join(
    SCRIPT_DIR, 'fixtures', 'MaterialSymbols-Variable.ttf'
)
IS_WINDOWS = sys.platform.startswith(('cygwin', 'win'))
EXE = '.exe' if IS_WINDOWS else ''
BAT = '.bat' if IS_WINDOWS else ''
FONT_SUBSET = os.path.join(SRC_DIR, 'out', 'host_debug', 'font-subset' + EXE)
FONT_SUBSET_ZIP = os.path.join(
    SRC_DIR, 'out', 'host_debug', 'zip_archives',
    PLATFORM_2_PATH.get(sys.platform, ''), 'font-subset.zip'
)
if not os.path.isfile(FONT_SUBSET):
  FONT_SUBSET = os.path.join(
      SRC_DIR, 'out', 'host_debug_unopt', 'font-subset' + EXE
  )
  FONT_SUBSET_ZIP = os.path.join(
      SRC_DIR, 'out', 'host_debug_unopt', 'zip_archives',
      PLATFORM_2_PATH.get(sys.platform, ''), 'font-subset.zip'
  )
if not os.path.isfile(FONT_SUBSET):
  raise Exception(
      'Could not locate font-subset%s in host_debug or host_debug_unopt - build before running this script.'
      % EXE
  )

COMPARE_TESTS = (
    (True, '1.ttf', MATERIAL_TTF, [r'57347']),
    (True, '1.ttf', MATERIAL_TTF, [r'0xE003']),
    (True, '1.ttf', MATERIAL_TTF, [r'\uE003']),
    (False, '1.ttf', MATERIAL_TTF, [r'57348'
                                   ]),  # False because different codepoint
    (True, '2.ttf', MATERIAL_TTF, [r'0xE003', r'0xE004']),
    (True, '2.ttf', MATERIAL_TTF, [r'0xE003', r'optional:0xE004'
                                  ]),  # Optional codepoint that is found
    (True, '2.ttf', MATERIAL_TTF, [
        r'0xE003',
        r'0xE004',
        r'optional:0x12',
    ]),  # Optional codepoint that is not found
    (True, '2.ttf', MATERIAL_TTF, [
        r'0xE003',
        r'0xE004',
        r'57347',
    ]),  # Duplicated codepoint
    (True, '3.ttf', MATERIAL_TTF, [
        r'0xE003',
        r'0xE004',
        r'0xE021',
    ]),
    # repeat tests with variable input font and verified variable output goldens
    (True, '1variable.ttf', VARIABLE_MATERIAL_TTF, [r'57347']),
    (True, '1variable.ttf', VARIABLE_MATERIAL_TTF, [r'0xE003']),
    (True, '1variable.ttf', VARIABLE_MATERIAL_TTF, [r'\uE003']),
    (False, '1variable.ttf', VARIABLE_MATERIAL_TTF,
     [r'57348']),  # False because different codepoint
    (True, '2variable.ttf', VARIABLE_MATERIAL_TTF, [r'0xE003', r'0xE004']),
    (
        True, '2variable.ttf', VARIABLE_MATERIAL_TTF, [
            r'0xE003',
            r'0xE004',
            r'57347',
        ]
    ),  # Duplicated codepoint
    (
        True, '3variable.ttf', VARIABLE_MATERIAL_TTF, [
            r'0xE003',
            r'0xE004',
            r'0xE021',
        ]
    ),
)

FAIL_TESTS = [
    ([FONT_SUBSET, 'output.ttf', 'does-not-exist.ttf'], [
        '1',
    ]),  # non-existent input font
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], [
        '0xFFFFFFFF',
    ]),  # Value too big.
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], [
        '-1',
    ]),  # invalid value
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], [
        'foo',
    ]),  # no valid values
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], [
        '0xE003',
        '0x12',
        '0xE004',
    ]),  # codepoint not in font
    ([FONT_SUBSET, 'non-existent-dir/output.ttf', MATERIAL_TTF], [
        '0xE003',
    ]),  # dir doesn't exist
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], [
        ' ',
    ]),  # empty input
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], []),  # empty input
    ([FONT_SUBSET, 'output.ttf', MATERIAL_TTF], ['']),  # empty input
    # repeat tests with variable input font
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], [
        '0xFFFFFFFF',
    ]),  # Value too big.
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], [
        '-1',
    ]),  # invalid value
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], [
        'foo',
    ]),  # no valid values
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], [
        '0xE003',
        '0x12',
        '0xE004',
    ]),  # codepoint not in font
    ([FONT_SUBSET, 'non-existent-dir/output.ttf', VARIABLE_MATERIAL_TTF], [
        '0xE003',
    ]),  # dir doesn't exist
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], [
        ' ',
    ]),  # empty input
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], []),  # empty input
    ([FONT_SUBSET, 'output.ttf', VARIABLE_MATERIAL_TTF], ['']),  # empty input
]


def RunCmd(cmd, codepoints, fail=False):
  print('Running command:')
  print('       %s' % ' '.join(cmd))
  print('STDIN: "%s"' % ' '.join(codepoints))
  p = subprocess.Popen(
      cmd,
      stdout=subprocess.PIPE,
      stdin=subprocess.PIPE,
      stderr=subprocess.PIPE,
      cwd=SRC_DIR
  )
  stdout_data, stderr_data = p.communicate(input=' '.join(codepoints).encode())
  if p.returncode != 0 and fail == False:
    print('FAILURE: %s' % p.returncode)
    print('STDOUT:')
    print(stdout_data)
    print('STDERR:')
    print(stderr_data)
  elif p.returncode == 0 and fail == True:
    print('FAILURE - test passed but should have failed.')
    print('STDOUT:')
    print(stdout_data)
    print('STDERR:')
    print(stderr_data)
  else:
    print('Success.')

  return p.returncode


def TestZip():
  with ZipFile(FONT_SUBSET_ZIP, 'r') as zip:
    files = zip.namelist()
    if 'font-subset%s' % EXE not in files:
      print('expected %s to contain font-subset%s' % (files, EXE))
      return 1
    return 0


def main():
  print('Using font subset binary at %s (%s)' % (FONT_SUBSET, FONT_SUBSET_ZIP))
  failures = 0

  failures += TestZip()

  for should_pass, golden_font, input_font, codepoints in COMPARE_TESTS:
    gen_ttf = os.path.join(SCRIPT_DIR, 'gen', golden_font)
    golden_ttf = os.path.join(SCRIPT_DIR, 'fixtures', golden_font)
    cmd = [FONT_SUBSET, gen_ttf, input_font]
    RunCmd(cmd, codepoints)
    cmp = filecmp.cmp(gen_ttf, golden_ttf, shallow=False)
    if (should_pass and not cmp) or (not should_pass and cmp):
      print('Test case %s failed.' % cmd)
      failures += 1

  with open(os.devnull, 'w') as devnull:
    for cmd, codepoints in FAIL_TESTS:
      if RunCmd(cmd, codepoints, fail=True) == 0:
        failures += 1

  if failures > 0:
    print('%s test(s) failed.' % failures)
    return 1

  print('All tests passed')
  return 0


if __name__ == '__main__':
  sys.exit(main())
