#!/usr/bin/env python
# Copyright 2016 the V8 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.

import itertools
import os
import sys
import tempfile
import unittest

# Needed because the test runner contains relative imports.
TOOLS_PATH = os.path.dirname(os.path.dirname(os.path.dirname(
    os.path.abspath(__file__))))
sys.path.append(TOOLS_PATH)

from testrunner.local.testsuite import TestSuite, TestGenerator
from testrunner.objects.testcase import TestCase
from testrunner.test_config import TestConfig


class TestSuiteTest(unittest.TestCase):
  def setUp(self):
    test_dir = os.path.dirname(__file__)
    self.test_root = os.path.join(test_dir, "fake_testsuite")
    self.test_config = TestConfig(
        command_prefix=[],
        extra_flags=[],
        isolates=False,
        mode_flags=[],
        no_harness=False,
        noi18n=False,
        random_seed=0,
        run_skipped=False,
        shell_dir='fake_testsuite/fake_d8',
        timeout=10,
        verbose=False,
    )

    self.suite = TestSuite.Load(
        self.test_root, self.test_config, "standard_runner")

  def testLoadingTestSuites(self):
    self.assertEquals(self.suite.name, "fake_testsuite")
    self.assertEquals(self.suite.test_config, self.test_config)

    # Verify that the components of the TestSuite aren't loaded yet.
    self.assertIsNone(self.suite.tests)
    self.assertIsNone(self.suite.statusfile)

  def testLoadingTestsFromDisk(self):
    tests = self.suite.load_tests_from_disk(
      statusfile_variables={})
    def is_generator(iterator):
      return iterator == iter(iterator)

    self.assertTrue(is_generator(tests))
    self.assertEquals(tests.test_count_estimate, 2)

    slow_tests, fast_tests = list(tests.slow_tests), list(tests.fast_tests)
    # Verify that the components of the TestSuite are loaded.
    self.assertTrue(len(slow_tests) == len(fast_tests) == 1)
    self.assertTrue(all(test.is_slow for test in slow_tests))
    self.assertFalse(any(test.is_slow for test in fast_tests))
    self.assertIsNotNone(self.suite.statusfile)

  def testMergingTestGenerators(self):
    tests = self.suite.load_tests_from_disk(
      statusfile_variables={})
    more_tests = self.suite.load_tests_from_disk(
      statusfile_variables={})

    # Merge the test generators
    tests.merge(more_tests)
    self.assertEquals(tests.test_count_estimate, 4)

    # Check the tests are sorted by speed
    test_speeds = []
    for test in tests:
      test_speeds.append(test.is_slow)

    self.assertEquals(test_speeds, [True, True, False, False])


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