#![allow(clippy::unreadable_literal)]
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq)]
pub struct GeolocationPosition {
pub latitude: f64,
pub longitude: f64,
pub accuracy: f64,
pub altitude: Option<f64>,
pub altitude_accuracy: Option<f64>,
pub heading: Option<f64>,
pub speed: Option<f64>,
}
impl GeolocationPosition {
#[must_use]
pub fn new(latitude: f64, longitude: f64, accuracy: f64) -> Self {
assert!(
(-90.0..=90.0).contains(&latitude),
"Latitude must be between -90 and 90 degrees"
);
assert!(
(-180.0..=180.0).contains(&longitude),
"Longitude must be between -180 and 180 degrees"
);
assert!(accuracy >= 0.0, "Accuracy must be non-negative");
Self {
latitude,
longitude,
accuracy,
altitude: None,
altitude_accuracy: None,
heading: None,
speed: None,
}
}
#[must_use]
pub fn with_altitude(mut self, altitude: f64, accuracy: f64) -> Self {
self.altitude = Some(altitude);
self.altitude_accuracy = Some(accuracy);
self
}
#[must_use]
pub fn with_heading(mut self, heading: f64) -> Self {
assert!(
(0.0..=360.0).contains(&heading),
"Heading must be between 0 and 360 degrees"
);
self.heading = Some(heading);
self
}
#[must_use]
pub fn with_speed(mut self, speed: f64) -> Self {
assert!(speed >= 0.0, "Speed must be non-negative");
self.speed = Some(speed);
self
}
#[must_use]
pub fn new_york() -> Self {
Self::new(40.758896, -73.985130, 10.0)
}
#[must_use]
pub fn tokyo() -> Self {
Self::new(35.659492, 139.700472, 10.0)
}
#[must_use]
pub fn london() -> Self {
Self::new(51.508039, -0.128069, 10.0)
}
#[must_use]
pub fn paris() -> Self {
Self::new(48.858370, 2.294481, 10.0)
}
#[must_use]
pub fn sydney() -> Self {
Self::new(-33.856784, 151.215297, 10.0)
}
#[must_use]
pub fn san_francisco() -> Self {
Self::new(37.820587, -122.478264, 10.0)
}
#[must_use]
pub fn berlin() -> Self {
Self::new(52.516275, 13.377704, 10.0)
}
#[must_use]
pub fn singapore() -> Self {
Self::new(1.283404, 103.860435, 10.0)
}
#[must_use]
pub fn dubai() -> Self {
Self::new(25.197197, 55.274376, 10.0)
}
#[must_use]
pub fn sao_paulo() -> Self {
Self::new(-23.561414, -46.655881, 10.0)
}
}
#[derive(Debug, Clone)]
pub struct GeolocationMock {
current_position: Option<GeolocationPosition>,
presets: HashMap<String, GeolocationPosition>,
enabled: bool,
permission_granted: bool,
error_mode: Option<GeolocationError>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum GeolocationError {
PermissionDenied,
PositionUnavailable,
Timeout,
}
impl Default for GeolocationMock {
fn default() -> Self {
Self::new()
}
}
impl GeolocationMock {
#[must_use]
pub fn new() -> Self {
let mut presets = HashMap::new();
presets.insert("new_york".to_string(), GeolocationPosition::new_york());
presets.insert("tokyo".to_string(), GeolocationPosition::tokyo());
presets.insert("london".to_string(), GeolocationPosition::london());
presets.insert("paris".to_string(), GeolocationPosition::paris());
presets.insert("sydney".to_string(), GeolocationPosition::sydney());
presets.insert(
"san_francisco".to_string(),
GeolocationPosition::san_francisco(),
);
presets.insert("berlin".to_string(), GeolocationPosition::berlin());
presets.insert("singapore".to_string(), GeolocationPosition::singapore());
presets.insert("dubai".to_string(), GeolocationPosition::dubai());
presets.insert("sao_paulo".to_string(), GeolocationPosition::sao_paulo());
Self {
current_position: None,
presets,
enabled: true,
permission_granted: true,
error_mode: None,
}
}
pub fn set_position(&mut self, position: GeolocationPosition) {
self.current_position = Some(position);
}
pub fn set_preset(&mut self, name: &str) -> bool {
if let Some(position) = self.presets.get(name) {
self.current_position = Some(position.clone());
true
} else {
false
}
}
pub fn add_preset(&mut self, name: &str, position: GeolocationPosition) {
let _ = self.presets.insert(name.to_string(), position);
}
pub fn get_current_position(&self) -> Result<GeolocationPosition, GeolocationError> {
if let Some(ref error) = self.error_mode {
return Err(error.clone());
}
if !self.enabled {
return Err(GeolocationError::PositionUnavailable);
}
if !self.permission_granted {
return Err(GeolocationError::PermissionDenied);
}
self.current_position
.clone()
.ok_or(GeolocationError::PositionUnavailable)
}
pub fn set_enabled(&mut self, enabled: bool) {
self.enabled = enabled;
}
#[must_use]
pub fn is_enabled(&self) -> bool {
self.enabled
}
pub fn set_permission(&mut self, granted: bool) {
self.permission_granted = granted;
}
#[must_use]
pub fn is_permission_granted(&self) -> bool {
self.permission_granted
}
pub fn simulate_error(&mut self, error: GeolocationError) {
self.error_mode = Some(error);
}
pub fn clear_error(&mut self) {
self.error_mode = None;
}
#[must_use]
pub fn list_presets(&self) -> Vec<&str> {
self.presets.keys().map(String::as_str).collect()
}
#[must_use]
pub fn get_preset(&self, name: &str) -> Option<&GeolocationPosition> {
self.presets.get(name)
}
pub fn clear_position(&mut self) {
self.current_position = None;
}
pub fn reset(&mut self) {
self.current_position = None;
self.enabled = true;
self.permission_granted = true;
self.error_mode = None;
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn test_position_new() {
let pos = GeolocationPosition::new(40.7128, -74.0060, 5.0);
assert!((pos.latitude - 40.7128).abs() < 0.0001);
assert!((pos.longitude - (-74.0060)).abs() < 0.0001);
assert!((pos.accuracy - 5.0).abs() < 0.0001);
assert!(pos.altitude.is_none());
assert!(pos.heading.is_none());
assert!(pos.speed.is_none());
}
#[test]
#[should_panic(expected = "Latitude must be between -90 and 90 degrees")]
fn test_position_invalid_latitude_high() {
let _ = GeolocationPosition::new(91.0, 0.0, 10.0);
}
#[test]
#[should_panic(expected = "Latitude must be between -90 and 90 degrees")]
fn test_position_invalid_latitude_low() {
let _ = GeolocationPosition::new(-91.0, 0.0, 10.0);
}
#[test]
#[should_panic(expected = "Longitude must be between -180 and 180 degrees")]
fn test_position_invalid_longitude_high() {
let _ = GeolocationPosition::new(0.0, 181.0, 10.0);
}
#[test]
#[should_panic(expected = "Longitude must be between -180 and 180 degrees")]
fn test_position_invalid_longitude_low() {
let _ = GeolocationPosition::new(0.0, -181.0, 10.0);
}
#[test]
#[should_panic(expected = "Accuracy must be non-negative")]
fn test_position_invalid_accuracy() {
let _ = GeolocationPosition::new(0.0, 0.0, -1.0);
}
#[test]
fn test_position_with_altitude() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0).with_altitude(100.0, 5.0);
assert_eq!(pos.altitude, Some(100.0));
assert_eq!(pos.altitude_accuracy, Some(5.0));
}
#[test]
fn test_position_with_heading() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0).with_heading(90.0);
assert_eq!(pos.heading, Some(90.0));
}
#[test]
#[should_panic(expected = "Heading must be between 0 and 360 degrees")]
fn test_position_invalid_heading() {
let _ = GeolocationPosition::new(0.0, 0.0, 10.0).with_heading(361.0);
}
#[test]
fn test_position_with_speed() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0).with_speed(10.0);
assert_eq!(pos.speed, Some(10.0));
}
#[test]
#[should_panic(expected = "Speed must be non-negative")]
fn test_position_invalid_speed() {
let _ = GeolocationPosition::new(0.0, 0.0, 10.0).with_speed(-1.0);
}
#[test]
fn test_position_builder_chain() {
let pos = GeolocationPosition::new(40.7128, -74.0060, 5.0)
.with_altitude(10.0, 2.0)
.with_heading(45.0)
.with_speed(5.0);
assert!((pos.latitude - 40.7128).abs() < 0.0001);
assert_eq!(pos.altitude, Some(10.0));
assert_eq!(pos.heading, Some(45.0));
assert_eq!(pos.speed, Some(5.0));
}
#[test]
fn test_preset_new_york() {
let pos = GeolocationPosition::new_york();
assert!((pos.latitude - 40.758896).abs() < 0.0001);
assert!((pos.longitude - (-73.985130)).abs() < 0.0001);
}
#[test]
fn test_preset_tokyo() {
let pos = GeolocationPosition::tokyo();
assert!((pos.latitude - 35.659492).abs() < 0.0001);
assert!((pos.longitude - 139.700472).abs() < 0.0001);
}
#[test]
fn test_preset_london() {
let pos = GeolocationPosition::london();
assert!((pos.latitude - 51.508039).abs() < 0.0001);
assert!((pos.longitude - (-0.128069)).abs() < 0.0001);
}
#[test]
fn test_preset_paris() {
let pos = GeolocationPosition::paris();
assert!((pos.latitude - 48.858370).abs() < 0.0001);
assert!((pos.longitude - 2.294481).abs() < 0.0001);
}
#[test]
fn test_preset_sydney() {
let pos = GeolocationPosition::sydney();
assert!(pos.latitude < 0.0); assert!(pos.longitude > 0.0);
}
#[test]
fn test_preset_san_francisco() {
let pos = GeolocationPosition::san_francisco();
assert!((pos.latitude - 37.820587).abs() < 0.0001);
assert!((pos.longitude - (-122.478264)).abs() < 0.0001);
}
#[test]
fn test_preset_berlin() {
let pos = GeolocationPosition::berlin();
assert!((pos.latitude - 52.516275).abs() < 0.0001);
assert!((pos.longitude - 13.377704).abs() < 0.0001);
}
#[test]
fn test_preset_singapore() {
let pos = GeolocationPosition::singapore();
assert!(pos.latitude > 0.0 && pos.latitude < 2.0); assert!(pos.longitude > 100.0);
}
#[test]
fn test_preset_dubai() {
let pos = GeolocationPosition::dubai();
assert!((pos.latitude - 25.197197).abs() < 0.0001);
assert!((pos.longitude - 55.274376).abs() < 0.0001);
}
#[test]
fn test_preset_sao_paulo() {
let pos = GeolocationPosition::sao_paulo();
assert!(pos.latitude < 0.0); assert!(pos.longitude < 0.0); }
#[test]
fn test_mock_new() {
let mock = GeolocationMock::new();
assert!(mock.is_enabled());
assert!(mock.is_permission_granted());
assert!(mock.get_current_position().is_err());
}
#[test]
fn test_mock_default() {
let mock = GeolocationMock::default();
assert!(mock.is_enabled());
}
#[test]
fn test_mock_set_position() {
let mut mock = GeolocationMock::new();
let pos = GeolocationPosition::new(40.0, -74.0, 10.0);
mock.set_position(pos.clone());
let result = mock.get_current_position().unwrap();
assert_eq!(result, pos);
}
#[test]
fn test_mock_set_preset() {
let mut mock = GeolocationMock::new();
assert!(mock.set_preset("new_york"));
let pos = mock.get_current_position().unwrap();
assert!((pos.latitude - 40.758896).abs() < 0.0001);
}
#[test]
fn test_mock_set_preset_unknown() {
let mut mock = GeolocationMock::new();
assert!(!mock.set_preset("unknown_city"));
}
#[test]
fn test_mock_add_custom_preset() {
let mut mock = GeolocationMock::new();
let pos = GeolocationPosition::new(12.0, 34.0, 5.0);
mock.add_preset("custom", pos.clone());
assert!(mock.set_preset("custom"));
let result = mock.get_current_position().unwrap();
assert_eq!(result, pos);
}
#[test]
fn test_mock_list_presets() {
let mock = GeolocationMock::new();
let presets = mock.list_presets();
assert!(presets.contains(&"new_york"));
assert!(presets.contains(&"tokyo"));
assert!(presets.contains(&"london"));
assert!(presets.len() >= 10);
}
#[test]
fn test_mock_get_preset() {
let mock = GeolocationMock::new();
let pos = mock.get_preset("tokyo");
assert!(pos.is_some());
let unknown = mock.get_preset("unknown");
assert!(unknown.is_none());
}
#[test]
fn test_mock_permission_denied() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.set_permission(false);
let result = mock.get_current_position();
assert_eq!(result, Err(GeolocationError::PermissionDenied));
}
#[test]
fn test_mock_disabled() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.set_enabled(false);
let result = mock.get_current_position();
assert_eq!(result, Err(GeolocationError::PositionUnavailable));
}
#[test]
fn test_mock_simulate_error() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.simulate_error(GeolocationError::Timeout);
let result = mock.get_current_position();
assert_eq!(result, Err(GeolocationError::Timeout));
}
#[test]
fn test_mock_clear_error() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.simulate_error(GeolocationError::Timeout);
mock.clear_error();
assert!(mock.get_current_position().is_ok());
}
#[test]
fn test_mock_clear_position() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.clear_position();
assert!(mock.get_current_position().is_err());
}
#[test]
fn test_mock_reset() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.set_permission(false);
mock.set_enabled(false);
mock.simulate_error(GeolocationError::Timeout);
mock.reset();
assert!(mock.is_enabled());
assert!(mock.is_permission_granted());
assert!(mock.get_current_position().is_err()); }
#[test]
fn test_error_priority() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.set_permission(true);
mock.set_enabled(true);
mock.simulate_error(GeolocationError::Timeout);
assert_eq!(mock.get_current_position(), Err(GeolocationError::Timeout));
}
#[test]
fn test_position_equality() {
let pos1 = GeolocationPosition::new(40.0, -74.0, 10.0);
let pos2 = GeolocationPosition::new(40.0, -74.0, 10.0);
let pos3 = GeolocationPosition::new(40.0, -74.0, 15.0);
assert_eq!(pos1, pos2);
assert_ne!(pos1, pos3);
}
#[test]
fn test_error_equality() {
assert_eq!(
GeolocationError::PermissionDenied,
GeolocationError::PermissionDenied
);
assert_ne!(
GeolocationError::PermissionDenied,
GeolocationError::Timeout
);
}
#[test]
fn test_mock_clone() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
let cloned = mock.clone();
assert!(cloned.get_current_position().is_ok());
}
#[test]
fn test_position_clone() {
let pos = GeolocationPosition::new_york()
.with_altitude(100.0, 5.0)
.with_heading(90.0)
.with_speed(10.0);
let cloned = pos.clone();
assert_eq!(pos, cloned);
}
mod h0_position_tests {
use super::*;
#[test]
fn h0_geo_01_position_new() {
let pos = GeolocationPosition::new(45.0, -90.0, 10.0);
assert!((pos.latitude - 45.0).abs() < 0.001);
assert!((pos.longitude - (-90.0)).abs() < 0.001);
}
#[test]
fn h0_geo_02_position_accuracy() {
let pos = GeolocationPosition::new(0.0, 0.0, 25.0);
assert!((pos.accuracy - 25.0).abs() < 0.001);
}
#[test]
fn h0_geo_03_position_no_altitude() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0);
assert!(pos.altitude.is_none());
}
#[test]
fn h0_geo_04_position_with_altitude() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0).with_altitude(500.0, 10.0);
assert_eq!(pos.altitude, Some(500.0));
assert_eq!(pos.altitude_accuracy, Some(10.0));
}
#[test]
fn h0_geo_05_position_no_heading() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0);
assert!(pos.heading.is_none());
}
#[test]
fn h0_geo_06_position_with_heading() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0).with_heading(180.0);
assert_eq!(pos.heading, Some(180.0));
}
#[test]
fn h0_geo_07_position_no_speed() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0);
assert!(pos.speed.is_none());
}
#[test]
fn h0_geo_08_position_with_speed() {
let pos = GeolocationPosition::new(0.0, 0.0, 10.0).with_speed(15.0);
assert_eq!(pos.speed, Some(15.0));
}
#[test]
fn h0_geo_09_position_boundary_latitude_max() {
let pos = GeolocationPosition::new(90.0, 0.0, 10.0);
assert!((pos.latitude - 90.0).abs() < 0.001);
}
#[test]
fn h0_geo_10_position_boundary_latitude_min() {
let pos = GeolocationPosition::new(-90.0, 0.0, 10.0);
assert!((pos.latitude - (-90.0)).abs() < 0.001);
}
}
mod h0_preset_location_tests {
use super::*;
#[test]
fn h0_geo_11_new_york_northern_hemisphere() {
let pos = GeolocationPosition::new_york();
assert!(pos.latitude > 0.0);
}
#[test]
fn h0_geo_12_new_york_western_hemisphere() {
let pos = GeolocationPosition::new_york();
assert!(pos.longitude < 0.0);
}
#[test]
fn h0_geo_13_tokyo_eastern_hemisphere() {
let pos = GeolocationPosition::tokyo();
assert!(pos.longitude > 0.0);
}
#[test]
fn h0_geo_14_london_near_prime_meridian() {
let pos = GeolocationPosition::london();
assert!(pos.longitude.abs() < 1.0);
}
#[test]
fn h0_geo_15_paris_europe() {
let pos = GeolocationPosition::paris();
assert!(pos.latitude > 45.0 && pos.latitude < 50.0);
}
#[test]
fn h0_geo_16_sydney_southern_hemisphere() {
let pos = GeolocationPosition::sydney();
assert!(pos.latitude < 0.0);
}
#[test]
fn h0_geo_17_san_francisco_west_coast() {
let pos = GeolocationPosition::san_francisco();
assert!(pos.longitude < -120.0);
}
#[test]
fn h0_geo_18_berlin_central_europe() {
let pos = GeolocationPosition::berlin();
assert!(pos.longitude > 10.0 && pos.longitude < 15.0);
}
#[test]
fn h0_geo_19_singapore_near_equator() {
let pos = GeolocationPosition::singapore();
assert!(pos.latitude.abs() < 5.0);
}
#[test]
fn h0_geo_20_sao_paulo_south_america() {
let pos = GeolocationPosition::sao_paulo();
assert!(pos.latitude < 0.0);
assert!(pos.longitude < 0.0);
}
}
mod h0_mock_tests {
use super::*;
#[test]
fn h0_geo_21_mock_new_enabled() {
let mock = GeolocationMock::new();
assert!(mock.is_enabled());
}
#[test]
fn h0_geo_22_mock_new_permission_granted() {
let mock = GeolocationMock::new();
assert!(mock.is_permission_granted());
}
#[test]
fn h0_geo_23_mock_default() {
let mock = GeolocationMock::default();
assert!(mock.is_enabled());
}
#[test]
fn h0_geo_24_mock_no_initial_position() {
let mock = GeolocationMock::new();
assert!(mock.get_current_position().is_err());
}
#[test]
fn h0_geo_25_mock_set_position() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
assert!(mock.get_current_position().is_ok());
}
#[test]
fn h0_geo_26_mock_set_preset_valid() {
let mut mock = GeolocationMock::new();
assert!(mock.set_preset("tokyo"));
}
#[test]
fn h0_geo_27_mock_set_preset_invalid() {
let mut mock = GeolocationMock::new();
assert!(!mock.set_preset("invalid_city"));
}
#[test]
fn h0_geo_28_mock_add_custom_preset() {
let mut mock = GeolocationMock::new();
mock.add_preset("custom", GeolocationPosition::new(10.0, 20.0, 5.0));
assert!(mock.set_preset("custom"));
}
#[test]
fn h0_geo_29_mock_list_presets() {
let mock = GeolocationMock::new();
let presets = mock.list_presets();
assert!(presets.len() >= 10);
}
#[test]
fn h0_geo_30_mock_get_preset() {
let mock = GeolocationMock::new();
assert!(mock.get_preset("london").is_some());
}
}
mod h0_mock_state_tests {
use super::*;
#[test]
fn h0_geo_31_mock_set_enabled() {
let mut mock = GeolocationMock::new();
mock.set_enabled(false);
assert!(!mock.is_enabled());
}
#[test]
fn h0_geo_32_mock_set_permission() {
let mut mock = GeolocationMock::new();
mock.set_permission(false);
assert!(!mock.is_permission_granted());
}
#[test]
fn h0_geo_33_mock_clear_position() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.clear_position();
assert!(mock.get_current_position().is_err());
}
#[test]
fn h0_geo_34_mock_reset() {
let mut mock = GeolocationMock::new();
mock.set_enabled(false);
mock.set_permission(false);
mock.reset();
assert!(mock.is_enabled());
assert!(mock.is_permission_granted());
}
#[test]
fn h0_geo_35_mock_clone() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
let cloned = mock.clone();
assert!(cloned.get_current_position().is_ok());
}
}
mod h0_error_tests {
use super::*;
#[test]
fn h0_geo_36_error_permission_denied() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.set_permission(false);
assert_eq!(
mock.get_current_position(),
Err(GeolocationError::PermissionDenied)
);
}
#[test]
fn h0_geo_37_error_position_unavailable() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.set_enabled(false);
assert_eq!(
mock.get_current_position(),
Err(GeolocationError::PositionUnavailable)
);
}
#[test]
fn h0_geo_38_error_timeout_simulated() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.simulate_error(GeolocationError::Timeout);
assert_eq!(mock.get_current_position(), Err(GeolocationError::Timeout));
}
#[test]
fn h0_geo_39_error_clear() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.simulate_error(GeolocationError::Timeout);
mock.clear_error();
assert!(mock.get_current_position().is_ok());
}
#[test]
fn h0_geo_40_error_priority_over_state() {
let mut mock = GeolocationMock::new();
mock.set_position(GeolocationPosition::new_york());
mock.simulate_error(GeolocationError::Timeout);
assert_eq!(mock.get_current_position(), Err(GeolocationError::Timeout));
}
}
mod h0_position_equality_tests {
use super::*;
#[test]
fn h0_geo_41_position_equal() {
let p1 = GeolocationPosition::new(40.0, -74.0, 10.0);
let p2 = GeolocationPosition::new(40.0, -74.0, 10.0);
assert_eq!(p1, p2);
}
#[test]
fn h0_geo_42_position_not_equal_latitude() {
let p1 = GeolocationPosition::new(40.0, -74.0, 10.0);
let p2 = GeolocationPosition::new(41.0, -74.0, 10.0);
assert_ne!(p1, p2);
}
#[test]
fn h0_geo_43_position_not_equal_longitude() {
let p1 = GeolocationPosition::new(40.0, -74.0, 10.0);
let p2 = GeolocationPosition::new(40.0, -75.0, 10.0);
assert_ne!(p1, p2);
}
#[test]
fn h0_geo_44_error_equal() {
assert_eq!(
GeolocationError::PermissionDenied,
GeolocationError::PermissionDenied
);
}
#[test]
fn h0_geo_45_error_not_equal() {
assert_ne!(
GeolocationError::PermissionDenied,
GeolocationError::Timeout
);
}
}
mod h0_dubai_preset_tests {
use super::*;
#[test]
fn h0_geo_46_dubai_latitude() {
let pos = GeolocationPosition::dubai();
assert!(pos.latitude > 20.0 && pos.latitude < 30.0);
}
#[test]
fn h0_geo_47_dubai_longitude() {
let pos = GeolocationPosition::dubai();
assert!(pos.longitude > 50.0 && pos.longitude < 60.0);
}
#[test]
fn h0_geo_48_preset_accuracy() {
let pos = GeolocationPosition::new_york();
assert!((pos.accuracy - 10.0).abs() < 0.001);
}
#[test]
fn h0_geo_49_position_builder_complete() {
let pos = GeolocationPosition::new(45.0, -90.0, 5.0)
.with_altitude(100.0, 2.0)
.with_heading(45.0)
.with_speed(10.0);
assert!(pos.altitude.is_some());
assert!(pos.heading.is_some());
assert!(pos.speed.is_some());
}
#[test]
fn h0_geo_50_boundary_longitude() {
let pos1 = GeolocationPosition::new(0.0, 180.0, 10.0);
let pos2 = GeolocationPosition::new(0.0, -180.0, 10.0);
assert!((pos1.longitude - 180.0).abs() < 0.001);
assert!((pos2.longitude - (-180.0)).abs() < 0.001);
}
}
}