text: """
  Copyright (c) Contributors to the Open 3D Engine Project.
  For complete copyright and license terms please see the LICENSE at the root of this distribution.
  
  SPDX-License-Identifier: Apache-2.0 OR MIT
  """
  
  
  # Test case ID : C6090553
  # Test Case Title : Check that force region exerts simple drag force on rigid bodies (negative test)
  
  
  
  # fmt: off
  class Tests():
      enter_game_mode          = ("Entered game mode",              "Failed to enter game mode")
      find_ball                = ("Ball found",                     "Ball not found")
      find_force_region        = ("Force Region found",             "Force Region not found")
      ball_gravity_disabled    = ("Ball gravity disabled",          "Ball gravity not disabled")
      ball_fell                = ("The ball fell",                  "The ball did not fall")
      ball_enters_force_region = ("Ball entered force region",      "Ball did not enter force region")
      ball_exits_force_region  = ("Ball exited force region",       "Ball did not exit force region")
      force_region_slows_ball  = ("Force Region did not slow ball", "Force Region slows ball")
      exit_game_mode           = ("Exited game mode",               "Couldn't exit game mode")
  # fmt: on
  
  
  def C6090553_ForceRegion_SimpleDragForceOnRigidBodies():
      """
      Summary:
      Runs an automated test to ensure that force region exerts simple drag force on rigid bodies(negative test).
  
      Level Description:
      Ball (entity)         -  contains a sphere mesh, PhysX Collider (sphere shape) and PhysX RigidBody. Ball is
                               placed above force region
      Force Region (entity) -  contains Physx Force Region with Simple Drag force with Region Density as 0 and
                               PhysX Collider (box shape)
  
      Expected Behavior:
      When game mode is entered, Sphere falls through force region as though force region doesn't exist because
      region density for the simple drag force is zero and has no effect on the dropping sphere.
  
      Test Steps:
        1)  Open level
        2)  Enter Game mode
        3)  Validate the entities in the scene
        4)  Check ball gravity is disabled or not
        5)  Get initial velocity of ball
        6)  Wait for ball to enter force region
        7)  Gets z velocity and position of ball
        8)  Wait for ball to exit force region
        9)  Gets new velocity and position of ball
        10) Check that the ball does not slow due to the force region
        11) Exits game mode and editor
  
      Note:
      - This test file must be called from the Open 3D Engine Editor command terminal
      - Any passed and failed tests are written to the Editor.log file.
              Parsing the file or running a log_monitor are required to observe the test results.
  
      :return: None
      """
  
      import os
      import sys
  
      import ImportPathHelper as imports
  
      imports.init()
  
      import azlmbr.legacy.general as general
      import azlmbr.bus
  
      from editor_python_test_tools.utils import Report
      from editor_python_test_tools.utils import TestHelper as helper
  
      # Holds details about the ball
      class Ball:
          id = None
          initial_velocity_z = 0.0
          start_velocity_z = 0.0
          end_velocity_z = 0.0
          ball_start_z_position = 0.0
          ball_end_z_position = 0.0
          entered_force_region = False
          exited_force_region = False
          ball_fell_down = False
          ball_slows = False
  
      def on_trigger_enter(args):
          other_id = args[0]
          if other_id.Equal(Ball.id):
              Ball.entered_force_region = True
  
      def on_trigger_exit(args):
          other_id = args[0]
          if other_id.Equal(Ball.id):
              Ball.exited_force_region = True
  
      # Constants
      TIMEOUT = 2.0
      CLOSE_ENOUGH_THRESHOLD = 0.01
  
      helper.init_idle()
  
      # 1) Open level
      helper.open_level("Physics", "C6090553_ForceRegion_SimpleDragForceOnRigidBodies")
  
      # 2) Enter game mode
      helper.enter_game_mode(Tests.enter_game_mode)
  
      # 3) Validate the entities in the scene
      Ball.id = general.find_game_entity("Sphere")
      Report.critical_result(Tests.find_ball, Ball.id.IsValid())
  
      force_region_id = general.find_game_entity("Force Region")
      Report.critical_result(Tests.find_force_region, force_region_id.IsValid())
  
      # 4) Check ball gravity is disabled or not
      gravity_enabled = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "IsGravityEnabled", Ball.id)
      Report.critical_result(Tests.ball_gravity_disabled, not gravity_enabled)
  
      # 5) Get initial velocity of ball
      # Ball linear velocity is set at (0, 0, -5) in the level
      Ball.initial_velocity_z = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "GetLinearVelocity", Ball.id).z
      Report.info("Ball initial velocity = {}".format(Ball.initial_velocity_z))
  
      # 6) Wait for ball to enter force region
      handler = azlmbr.physics.TriggerNotificationBusHandler()
      handler.connect(force_region_id)
      handler.add_callback("OnTriggerEnter", on_trigger_enter)
      handler.add_callback("OnTriggerExit", on_trigger_exit)
  
      helper.wait_for_condition(lambda: Ball.entered_force_region, TIMEOUT)
      Report.critical_result(Tests.ball_enters_force_region, Ball.entered_force_region)
  
      # 7) Gets z velocity and position of ball
      Ball.start_velocity_z = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "GetLinearVelocity", Ball.id).z
      Ball.ball_start_z_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", Ball.id)
      Report.info(
          "Ball Start Z position = {}  Ball Start Z Velocity = {}".format(
              Ball.ball_start_z_position, Ball.start_velocity_z
          )
      )
  
      # 8) Wait for ball to exit force region
      helper.wait_for_condition(lambda: Ball.exited_force_region, TIMEOUT)
      Report.critical_result(Tests.ball_exits_force_region, Ball.exited_force_region)
  
      # 9) Gets new velocity and position of ball
      Ball.end_velocity_z = azlmbr.physics.RigidBodyRequestBus(azlmbr.bus.Event, "GetLinearVelocity", Ball.id).z
      Ball.ball_end_z_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", Ball.id)
      Report.info(
          "Ball End Z position = {}  Ball End Z Velocity = {}".format(Ball.ball_end_z_position, Ball.end_velocity_z)
      )
  
      # 10) Check that the ball does not slow due to the force region
      # Check ball fell down or not
      if (Ball.ball_end_z_position - CLOSE_ENOUGH_THRESHOLD) < Ball.ball_start_z_position:
          Ball.ball_fell_down = True
  
      Report.critical_result(Tests.ball_fell, Ball.ball_fell_down)
  
      # Ball initial velocity is -5.0. Check that the ball does not slow down in force region
      if ((Ball.end_velocity_z - Ball.initial_velocity_z) < CLOSE_ENOUGH_THRESHOLD) and (
          (Ball.start_velocity_z - Ball.initial_velocity_z) < CLOSE_ENOUGH_THRESHOLD
      ):
          Ball.ball_slows = True
  
      Report.critical_result(Tests.force_region_slows_ball, Ball.ball_slows)
  
      # 11) Exits game mode and editor
      helper.exit_game_mode(Tests.exit_game_mode)
  
  
  if __name__ == "__main__":
      import ImportPathHelper as imports
      imports.init()
  
      from editor_python_test_tools.utils import Report
      Report.start_test(C6090553_ForceRegion_SimpleDragForceOnRigidBodies)
  