#!/usr/bin/python2
"""Simple benchmark for starting a video from browse."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import sys

# The parent directory is a module
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

# pylint: disable=C6204,C6203
import tv_testcase
import tv_testcase_event_recorder
import tv_testcase_util

# selenium imports
keys = tv_testcase_util.import_selenium_module("webdriver.common.keys")

NUM_LOAD_TV_CALLS = 1
NUM_ITERATIONS_PER_LOAD_TV_CALL = 10

BROWSE_TO_WATCH_EVENT_NAME = "wbBrowseToWatch"
BROWSE_TO_WATCH_EVENT_TYPE = tv_testcase_util.EVENT_TYPE_KEY_UP

WATCH_TO_BROWSE_EVENT_NAME = "wbWatchToBrowse"
WATCH_TO_BROWSE_EVENT_TYPE = tv_testcase_util.EVENT_TYPE_KEY_UP


class BrowseToWatchTest(tv_testcase.TvTestCase):

  def test_simple(self):
    recorder_options = tv_testcase_event_recorder.EventRecorderOptions(
        self, BROWSE_TO_WATCH_EVENT_NAME, BROWSE_TO_WATCH_EVENT_TYPE)
    recorder_options.record_rasterize_animations = False
    recorder_options.record_video_start_delay = True
    browse_to_watch_recorder = tv_testcase_event_recorder.EventRecorder(
        recorder_options)

    recorder_options = tv_testcase_event_recorder.EventRecorderOptions(
        self, WATCH_TO_BROWSE_EVENT_NAME, WATCH_TO_BROWSE_EVENT_TYPE)
    recorder_options.record_rasterize_animations = False
    watch_to_browse_recorder = tv_testcase_event_recorder.EventRecorder(
        recorder_options)

    for _ in xrange(NUM_LOAD_TV_CALLS):
      self.load_tv()

      for _ in xrange(NUM_ITERATIONS_PER_LOAD_TV_CALL):
        self.send_keys(keys.Keys.ARROW_DOWN)
        self.wait_for_processing_complete_after_focused_shelf()

        browse_to_watch_recorder.on_start_event()
        self.send_keys(keys.Keys.ENTER)
        self.wait_for_media_element_playing()
        browse_to_watch_recorder.on_end_event()

        # Wait for the title card hidden before sending the escape. Otherwise,
        # two escapes are required to exit the video.
        self.wait_for_title_card_hidden()

        watch_to_browse_recorder.on_start_event()
        self.send_keys(keys.Keys.ESCAPE)
        self.wait_for_processing_complete_after_focused_shelf()
        watch_to_browse_recorder.on_end_event()

    browse_to_watch_recorder.on_end_test()
    watch_to_browse_recorder.on_end_test()


if __name__ == "__main__":
  tv_testcase.main()
