def test_way_relation_update_only_resets_if_no_possible_found(self):
        wayRelation = WayRelation(mockOSMWay_01_01_LongCurvy)
        location_rad = wayRelation.bbox[
            0]  # Location inside bbox but outside actual way (due to padding)

        wayRelation.update(location_rad, 0., 10.)

        self.assertTrue(wayRelation.is_location_in_bbox(location_rad))
        self.assert_wayRelation_variables_reset(wayRelation)
    def test_way_relation_update_resets_on_update(self):
        wayRelation = WayRelation(mockOSMWay_01_01_LongCurvy)
        self.make_wayRelation_location_dirty(wayRelation)
        location_rad = np.array([0., 0.])  # Location outside bbox

        wayRelation.update(location_rad, 0., 10.)

        self.assertFalse(wayRelation.is_location_in_bbox(location_rad))
        self.assert_wayRelation_variables_reset(wayRelation)
    def test_way_relation_updates_will_become_inactive_if_too_far_from_way(
            self):
        wayRelation = WayRelation(mockOSMWay_01_01_LongCurvy)
        # Location is 24.9 mts away from the way. There are 2 Lanes in this way.
        location_rad = np.radians(
            np.array([52.328634560607746, 13.445609877522788]))
        location_stdev = 5.5  # threshold is 4 * location_stdev + LANE_WIDTH
        distance_threshold = 4. * location_stdev + wayRelation.lanes * LANE_WIDTH / 2.

        wayRelation.update(location_rad, 0., location_stdev)
        self.assertTrue(wayRelation.active)
        self.assertLess(wayRelation._distance_to_way, distance_threshold)

        location_stdev = 5.

        wayRelation.update(location_rad, 0., location_stdev)
        self.assertFalse(wayRelation.active)
    def test_way_relation_updates_in_the_correct_direction_with_correct_property_values(
            self):
        wayRelation = WayRelation(mockOSMWay_01_01_LongCurvy)
        location_rad = np.radians(
            np.array([52.32855593146639, 13.445320150125069]))
        bearing_rad = 0.

        wayRelation.update(location_rad, bearing_rad, 10.)

        self.assertTrue(wayRelation.is_location_in_bbox(location_rad))
        self.assertEqual(wayRelation.direction, DIRECTION.FORWARD)
        self.assertEqual(wayRelation.ahead_idx, 17)
        self.assertEqual(wayRelation.behind_idx, 16)
        self.assertAlmostEqual(wayRelation._distance_to_way, 3.43290781621360)
        self.assertAlmostEqual(wayRelation._active_bearing_delta,
                               0.320717420388962)
        self.assertAlmostEqual(wayRelation.distance_to_node_ahead,
                               25.4998961709014)
        self.assertTrue(wayRelation.active)
        self.assertFalse(wayRelation.diverting)
        assert_array_almost_equal(wayRelation.location_rad, location_rad)
        self.assertEqual(wayRelation.bearing_rad, bearing_rad)
        self.assertIsNone(wayRelation._speed_limit)

        bearing_rad = 180.

        wayRelation.update(location_rad, bearing_rad, 10.)

        self.assertTrue(wayRelation.is_location_in_bbox(location_rad))
        self.assertEqual(wayRelation.direction, DIRECTION.BACKWARD)
        self.assertEqual(wayRelation.ahead_idx, 16)
        self.assertEqual(wayRelation.behind_idx, 17)
        self.assertAlmostEqual(wayRelation._distance_to_way, 3.43290781621360)
        self.assertAlmostEqual(wayRelation._active_bearing_delta,
                               0.9507682562504284)
        self.assertAlmostEqual(wayRelation.distance_to_node_ahead,
                               11.11623371145368)
        self.assertTrue(wayRelation.active)
        self.assertFalse(wayRelation.diverting)
        assert_array_almost_equal(wayRelation.location_rad, location_rad)
        self.assertEqual(wayRelation.bearing_rad, bearing_rad)
        self.assertIsNone(wayRelation._speed_limit)
    def test_way_relation_updates_will_update_diverting_correctly(self):
        wayRelation = WayRelation(mockOSMWay_01_01_LongCurvy)
        # Location is 24.9 mts away from the way. There are 2 Lanes in this way.
        location_rad = np.radians(
            np.array([52.328634560607746, 13.445609877522788]))
        location_stdev = 11.
        distance_threshold = 2. * location_stdev + wayRelation.lanes * LANE_WIDTH / 2.

        wayRelation.update(location_rad, 0., location_stdev)

        self.assertLess(wayRelation._distance_to_way, distance_threshold)
        self.assertFalse(wayRelation.diverting)

        location_stdev = 10.
        distance_threshold = 2. * location_stdev + wayRelation.lanes * LANE_WIDTH / 2.

        wayRelation.update(location_rad, 0., location_stdev)

        self.assertGreater(wayRelation._distance_to_way, distance_threshold)
        self.assertTrue(wayRelation.diverting)
    def test_way_relation_updates_with_location_closest_to_way_when_multiple_possible(
            self):
        wayRelation = WayRelation(mockOSMWay_01_02_Loop)
        location_rad = np.radians(
            np.array([52.313303275461564, 13.437729236325788]))
        bearing_rad = np.radians(10.)

        wayRelation.update(location_rad, bearing_rad, 10.)

        self.assertTrue(wayRelation.is_location_in_bbox(location_rad))
        self.assertEqual(wayRelation.direction, DIRECTION.BACKWARD)
        self.assertEqual(wayRelation.ahead_idx, 26)
        self.assertEqual(wayRelation.behind_idx, 27)
        self.assertAlmostEqual(wayRelation._distance_to_way,
                               10.151775235257011)
        self.assertAlmostEqual(wayRelation._active_bearing_delta,
                               0.06371131069242782)
        self.assertAlmostEqual(wayRelation.distance_to_node_ahead,
                               10.174073707120915)
        self.assertTrue(wayRelation.active)
        self.assertFalse(wayRelation.diverting)
        assert_array_almost_equal(wayRelation.location_rad, location_rad)
        self.assertEqual(wayRelation.bearing_rad, bearing_rad)
        self.assertIsNone(wayRelation._speed_limit)