# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License
"""Test SoftMicPlatformService messages match between web app and platform"""

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

import _env  # pylint: disable=unused-import

from cobalt.black_box_tests import black_box_tests
from cobalt.black_box_tests.threaded_web_server import ThreadedWebServer
from cobalt.tools.automated_testing import webdriver_utils

keys = webdriver_utils.import_selenium_module('webdriver.common.keys')


class SoftMicPlatformServiceTest(black_box_tests.BlackBoxTestCase):

  def test_soft_mic_platform_service(self):
    with ThreadedWebServer(binding_address=self.GetBindingAddress()) as server:
      url = server.GetURL(
          file_name='testdata/soft_mic_platform_service_test.html')

      # The webpage listens for NUMPAD1 through NUMPAD9 at opening.
      with self.CreateCobaltRunner(url=url) as runner:
        # Press NUMPAD1 to test bothUndefined
        runner.SendKeys(keys.Keys.NUMPAD1)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url, target_params=['--has_soft_mic_support=true']) as runner:
        # Press NUMPAD2 to test hardMicUndefinedSoftMicTrue
        runner.SendKeys(keys.Keys.NUMPAD2)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url, target_params=['--has_soft_mic_support=false']) as runner:
        # Press NUMPAD3 to test hardMicUndefinedSoftMicFalse
        runner.SendKeys(keys.Keys.NUMPAD3)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url, target_params=['--has_hard_mic_support=true']) as runner:
        # Press NUMPAD4 to test hardMicTrueSoftMicUndefined
        runner.SendKeys(keys.Keys.NUMPAD4)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url,
          target_params=([
              '--has_hard_mic_support=true', '--has_soft_mic_support=true'
          ])) as runner:
        # Press NUMPAD5 to test hardMicTrueSoftMicTrue
        runner.SendKeys(keys.Keys.NUMPAD5)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url,
          target_params=([
              '--has_hard_mic_support=true', '--has_soft_mic_support=false'
          ])) as runner:
        # Press NUMPAD6 to test hardMicTrueSoftMicFalse
        runner.SendKeys(keys.Keys.NUMPAD6)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url, target_params=['--has_hard_mic_support=false']) as runner:
        # Press NUMPAD7 to test hardMicFalseSoftMicUndefined
        runner.SendKeys(keys.Keys.NUMPAD7)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url,
          target_params=([
              '--has_hard_mic_support=false', '--has_soft_mic_support=true'
          ])) as runner:
        # Press NUMPAD8 to test hardMicFalseSoftMicTrue
        runner.SendKeys(keys.Keys.NUMPAD8)
        self.assertTrue(runner.JSTestsSucceeded())

      with self.CreateCobaltRunner(
          url=url,
          target_params=([
              '--has_hard_mic_support=false', '--has_soft_mic_support=false'
          ])) as runner:
        # Press NUMPAD9 to test hardMicFalseSoftMicFalse
        runner.SendKeys(keys.Keys.NUMPAD9)
        self.assertTrue(runner.JSTestsSucceeded())
