# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

"""Unit tests for the export module.
"""

import logging
import os
import shutil
import tempfile
import unittest

import pyquery as pq

from . import audioproc_wrapper
from . import collect_data
from . import eval_scores_factory
from . import evaluation
from . import export
from . import simulation
from . import test_data_generation_factory


class TestExport(unittest.TestCase):
  """Unit tests for the export module.
  """

  _CLEAN_TMP_OUTPUT = True

  def setUp(self):
    """Creates temporary data to export."""
    self._tmp_path = tempfile.mkdtemp()

    # Run a fake experiment to produce data to export.
    simulator = simulation.ApmModuleSimulator(
        test_data_generator_factory=(
            test_data_generation_factory.TestDataGeneratorFactory(
                aechen_ir_database_path='',
                noise_tracks_path='',
                copy_with_identity=False)),
        evaluation_score_factory=(
          eval_scores_factory.EvaluationScoreWorkerFactory(
              polqa_tool_bin_path=os.path.join(
                  os.path.dirname(os.path.abspath(__file__)), 'fake_polqa'),
              echo_metric_tool_bin_path=None
          )),
        ap_wrapper=audioproc_wrapper.AudioProcWrapper(
            audioproc_wrapper.AudioProcWrapper.DEFAULT_APM_SIMULATOR_BIN_PATH),
        evaluator=evaluation.ApmModuleEvaluator())
    simulator.Run(
        config_filepaths=['apm_configs/default.json'],
        capture_input_filepaths=[
            os.path.join(self._tmp_path, 'pure_tone-440_1000.wav'),
            os.path.join(self._tmp_path, 'pure_tone-880_1000.wav'),
        ],
        test_data_generator_names=['identity', 'white_noise'],
        eval_score_names=['audio_level_peak', 'audio_level_mean'],
        output_dir=self._tmp_path)

    # Export results.
    p = collect_data.InstanceArgumentsParser()
    args = p.parse_args(['--output_dir', self._tmp_path])
    src_path = collect_data.ConstructSrcPath(args)
    self._data_to_export = collect_data.FindScores(src_path, args)

  def tearDown(self):
    """Recursively deletes temporary folders."""
    if self._CLEAN_TMP_OUTPUT:
      shutil.rmtree(self._tmp_path)
    else:
      logging.warning(self.id() + ' did not clean the temporary path ' + (
          self._tmp_path))

  def testCreateHtmlReport(self):
    fn_out = os.path.join(self._tmp_path, 'results.html')
    exporter = export.HtmlExport(fn_out)
    exporter.Export(self._data_to_export)

    document = pq.PyQuery(filename=fn_out)
    self.assertIsInstance(document, pq.PyQuery)
    # TODO(alessiob): Use PyQuery API to check the HTML file.
