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

import html_to_wrapper
import os
import shutil
import tempfile
import unittest

_HERE_DIR = os.path.dirname(__file__)


class HtmlToWrapperTest(unittest.TestCase):
  def setUp(self):
    self.maxDiff = None
    self._out_folder = None

  def tearDown(self):
    if self._out_folder:
      shutil.rmtree(self._out_folder)

  def _read_out_file(self, file_name):
    assert self._out_folder
    with open(os.path.join(self._out_folder, file_name), 'r') as f:
      return f.read()

  def _run_test(
    self,
    html_file,
    wrapper_file,
    wrapper_file_expected,
    template=None,
    minify=False,
    use_js=False,
    scheme=None,
  ):
    assert not self._out_folder
    self._out_folder = tempfile.mkdtemp(dir=_HERE_DIR)
    args = [
      '--in_folder',
      os.path.join(_HERE_DIR, 'tests'),
      '--out_folder',
      self._out_folder,
      '--in_files',
      html_file,
    ]

    if template:
      args += ['--template', template]

    if minify:
      args.append('--minify')

    if use_js:
      args.append('--use_js')

    if scheme:
      args += ['--scheme', scheme]

    html_to_wrapper.main(args)

    actual_wrapper = self._read_out_file(wrapper_file)
    with open(
      os.path.join(_HERE_DIR, 'tests', wrapper_file_expected), 'r'
    ) as f:
      expected_wrapper = f.read()
    self.assertMultiLineEqual(str(expected_wrapper), str(actual_wrapper))

  def testHtmlToWrapperPolymerElement(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.ts',
      'html_to_wrapper/expected/foo.html.ts',
      template='polymer',
    )

  def testHtmlToWrapperPolymerElement_Detect(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.ts',
      'html_to_wrapper/expected/foo.html.ts',
      template='detect',
    )

  def testHtmlToWrapperLitElement(self):
    self._run_test(
      'html_to_wrapper/foo_lit.html',
      'html_to_wrapper/foo_lit.html.ts',
      'html_to_wrapper/expected/foo_lit.html.ts',
    )

  def testHtmlToWrapperLitElement_Detect(self):
    self._run_test(
      'html_to_wrapper/foo_lit.html',
      'html_to_wrapper/foo_lit.html.ts',
      'html_to_wrapper/expected/foo_lit.html.ts',
      template='detect',
    )

  def testHtmlToWrapperLitElement_Minify(self):
    self._run_test(
      'html_to_wrapper/foo_lit.html',
      'html_to_wrapper/foo_lit.html.ts',
      'html_to_wrapper/expected/foo_lit.html.ts',
      minify=True,
    )

  def testHtmlToWrapperLitElement_WithImports(self):
    self._run_test(
      'html_to_wrapper/foo_lit_with_imports.html',
      'html_to_wrapper/foo_lit_with_imports.html.ts',
      'html_to_wrapper/expected/foo_lit_with_imports.html.ts',
    )

  def testHtmlToWrapperNativeElement(self):
    self._run_test(
      'html_to_wrapper/foo_native.html',
      'html_to_wrapper/foo_native.html.ts',
      'html_to_wrapper/expected/foo_native.html.ts',
      template='native',
    )

  def testHtmlToWrapperNativeElement_Detect(self):
    self._run_test(
      'html_to_wrapper/foo_native.html',
      'html_to_wrapper/foo_native.html.ts',
      'html_to_wrapper/expected/foo_native.html.ts',
      template='detect',
    )

  def testHtmlToWrapperIcons(self):
    self._run_test(
      'html_to_wrapper/icons.html',
      'html_to_wrapper/icons.html.ts',
      'html_to_wrapper/expected/icons.html.ts',
      template='polymer',
    )

  def testHtmlToWrapperIconsLit(self):
    self._run_test(
      'html_to_wrapper/cr_icons.html',
      'html_to_wrapper/cr_icons.html.ts',
      'html_to_wrapper/expected/cr_icons.html.ts',
    )

  def testHtmlToWrapperIconsLit_Detect(self):
    self._run_test(
      'html_to_wrapper/cr_icons.html',
      'html_to_wrapper/cr_icons.html.ts',
      'html_to_wrapper/expected/cr_icons.html.ts',
      template='detect',
    )

  def testHtmlToWrapperLitFromPolymer(self):
    self._run_test(
      'html_to_wrapper/icons_lit.html',
      'html_to_wrapper/icons_lit.html.ts',
      'html_to_wrapper/expected/cr_icons.html.ts',
      template='detect',
    )

  def testHtmlToWrapper_Minify(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.ts',
      'html_to_wrapper/expected/foo.min.html.ts',
      template='polymer',
      minify=True,
    )

  def testHtmlToWrapper_MinifyDetect(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.ts',
      'html_to_wrapper/expected/foo.min.html.ts',
      minify=True,
      template='detect',
    )

  def testHtmlToWrapper_UseJs(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.js',
      'html_to_wrapper/expected/foo.html.ts',
      template='polymer',
      use_js=True,
    )

  def testHtmlToWrapper_UseJsDetect(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.js',
      'html_to_wrapper/expected/foo.html.ts',
      use_js=True,
      template='detect',
    )

  def testHtmlToWrapperSchemeRelative(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.ts',
      'html_to_wrapper/expected/foo.html.ts',
      template='polymer',
      scheme='relative',
    )

  def testHtmlToWrapperSchemeChrome(self):
    self._run_test(
      'html_to_wrapper/foo.html',
      'html_to_wrapper/foo.html.ts',
      'html_to_wrapper/expected/foo_chrome.html.ts',
      template='polymer',
      scheme='chrome',
    )


if __name__ == '__main__':
  unittest.main()
