#!/usr/bin/python2
"""Simple benchmark for going from browse to guide and back."""

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
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 = 20

BROWSE_TO_GUIDE_EVENT_NAME = "wbBrowseToGuide"
BROWSE_TO_GUIDE_EVENT_TYPE = tv_testcase_util.EVENT_TYPE_KEY_DOWN

GUIDE_TO_BROWSE_EVENT_NAME = "wbGuideToBrowse"
GUIDE_TO_BROWSE_EVENT_TYPE = tv_testcase_util.EVENT_TYPE_KEY_DOWN


class BrowseToGuideTest(tv_testcase.TvTestCase):

  def test_simple(self):
    recorder_options = tv_testcase_event_recorder.EventRecorderOptions(
        self, BROWSE_TO_GUIDE_EVENT_NAME, BROWSE_TO_GUIDE_EVENT_TYPE)
    browse_to_guide_recorder = tv_testcase_event_recorder.EventRecorder(
        recorder_options)

    recorder_options = tv_testcase_event_recorder.EventRecorderOptions(
        self, GUIDE_TO_BROWSE_EVENT_NAME, GUIDE_TO_BROWSE_EVENT_TYPE)
    guide_to_browse_recorder = tv_testcase_event_recorder.EventRecorder(
        recorder_options)

    for _ in xrange(NUM_LOAD_TV_CALLS):
      self.load_tv()
      self.assert_displayed(tv.FOCUSED_SHELF)

      for _ in xrange(NUM_ITERATIONS_PER_LOAD_TV_CALL):
        browse_to_guide_recorder.on_start_event()
        self.send_keys(tv.FOCUSED_SHELF, keys.Keys.ARROW_LEFT)
        self.wait_for_processing_complete()
        self.assert_displayed(tv.FOCUSED_GUIDE)
        browse_to_guide_recorder.on_end_event()

        guide_to_browse_recorder.on_start_event()
        self.send_keys(tv.FOCUSED_GUIDE, keys.Keys.ARROW_RIGHT)
        self.wait_for_processing_complete_after_focused_shelf()
        guide_to_browse_recorder.on_end_event()

    browse_to_guide_recorder.on_end_test()
    guide_to_browse_recorder.on_end_test()


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