use crate::types::basic::DateTime;
use crate::types::basic::{Double, OSString};
use crate::types::enums::{Rule, StoryboardElementState, StoryboardElementType};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SimulationTimeCondition {
#[serde(rename = "@value")]
pub value: Double,
#[serde(rename = "@rule")]
pub rule: Rule,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ParameterCondition {
#[serde(rename = "@parameterRef")]
pub parameter_ref: OSString,
#[serde(rename = "@rule")]
pub rule: Rule,
#[serde(rename = "@value")]
pub value: OSString,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TimeOfDayCondition {
#[serde(rename = "@dateTime")]
pub date_time: DateTime,
#[serde(rename = "@rule")]
pub rule: Rule,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StoryboardElementStateCondition {
#[serde(rename = "@storyboardElementRef")]
pub storyboard_element_ref: OSString,
#[serde(rename = "@state")]
pub state: StoryboardElementState,
#[serde(rename = "@storyboardElementType")]
pub storyboard_element_type: StoryboardElementType,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UserDefinedValueCondition {
#[serde(rename = "@name")]
pub name: OSString,
#[serde(rename = "@rule")]
pub rule: Rule,
#[serde(rename = "@value")]
pub value: OSString,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TrafficSignalCondition {
#[serde(rename = "@name")]
pub name: OSString,
#[serde(rename = "@state")]
pub state: OSString,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TrafficSignalControllerCondition {
#[serde(rename = "@trafficSignalControllerRef")]
pub traffic_signal_controller_ref: OSString,
#[serde(rename = "@phase")]
pub phase: OSString,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct VariableCondition {
#[serde(rename = "@variableRef")]
pub variable_ref: OSString,
#[serde(rename = "@rule")]
pub rule: Rule,
#[serde(rename = "@value")]
pub value: OSString,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ByValueCondition {
#[serde(rename = "ParameterCondition", skip_serializing_if = "Option::is_none")]
pub parameter_condition: Option<ParameterCondition>,
#[serde(rename = "TimeOfDayCondition", skip_serializing_if = "Option::is_none")]
pub time_of_day_condition: Option<TimeOfDayCondition>,
#[serde(
rename = "SimulationTimeCondition",
skip_serializing_if = "Option::is_none"
)]
pub simulation_time_condition: Option<SimulationTimeCondition>,
#[serde(
rename = "StoryboardElementStateCondition",
skip_serializing_if = "Option::is_none"
)]
pub storyboard_element_state_condition: Option<StoryboardElementStateCondition>,
#[serde(
rename = "UserDefinedValueCondition",
skip_serializing_if = "Option::is_none"
)]
pub user_defined_value_condition: Option<UserDefinedValueCondition>,
#[serde(
rename = "TrafficSignalCondition",
skip_serializing_if = "Option::is_none"
)]
pub traffic_signal_condition: Option<TrafficSignalCondition>,
#[serde(
rename = "TrafficSignalControllerCondition",
skip_serializing_if = "Option::is_none"
)]
pub traffic_signal_controller_condition: Option<TrafficSignalControllerCondition>,
#[serde(rename = "VariableCondition", skip_serializing_if = "Option::is_none")]
pub variable_condition: Option<VariableCondition>,
}
impl Default for SimulationTimeCondition {
fn default() -> Self {
Self {
value: Double::literal(10.0),
rule: Rule::GreaterThan,
}
}
}
impl Default for ParameterCondition {
fn default() -> Self {
Self {
parameter_ref: OSString::literal("defaultParam".to_string()),
rule: Rule::EqualTo,
value: OSString::literal("defaultValue".to_string()),
}
}
}
impl Default for TimeOfDayCondition {
fn default() -> Self {
Self {
date_time: DateTime::literal(chrono::Utc::now()),
rule: Rule::GreaterThan,
}
}
}
impl Default for StoryboardElementStateCondition {
fn default() -> Self {
Self {
storyboard_element_ref: OSString::literal("defaultElement".to_string()),
state: StoryboardElementState::RunningState,
storyboard_element_type: StoryboardElementType::Story,
}
}
}
impl Default for UserDefinedValueCondition {
fn default() -> Self {
Self {
name: OSString::literal("defaultCondition".to_string()),
rule: Rule::EqualTo,
value: OSString::literal("defaultValue".to_string()),
}
}
}
impl Default for TrafficSignalCondition {
fn default() -> Self {
Self {
name: OSString::literal("defaultSignal".to_string()),
state: OSString::literal("green".to_string()),
}
}
}
impl Default for TrafficSignalControllerCondition {
fn default() -> Self {
Self {
traffic_signal_controller_ref: OSString::literal("defaultController".to_string()),
phase: OSString::literal("phase1".to_string()),
}
}
}
impl Default for VariableCondition {
fn default() -> Self {
Self {
variable_ref: OSString::literal("defaultVariable".to_string()),
rule: Rule::EqualTo,
value: OSString::literal("defaultValue".to_string()),
}
}
}
impl Default for ByValueCondition {
fn default() -> Self {
Self {
parameter_condition: None,
time_of_day_condition: None,
simulation_time_condition: Some(SimulationTimeCondition::default()),
storyboard_element_state_condition: None,
user_defined_value_condition: None,
traffic_signal_condition: None,
traffic_signal_controller_condition: None,
variable_condition: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_simulation_time_condition_default() {
let cond = SimulationTimeCondition::default();
assert_eq!(cond.value.as_literal().unwrap(), &10.0);
assert_eq!(cond.rule, Rule::GreaterThan);
}
#[test]
fn test_simulation_time_condition_xml_roundtrip() {
let cond = SimulationTimeCondition {
value: Double::literal(5.0),
rule: Rule::EqualTo,
};
let xml = quick_xml::se::to_string(&cond).unwrap();
let deserialized: SimulationTimeCondition = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(cond, deserialized);
}
#[test]
fn test_parameter_condition_default() {
let cond = ParameterCondition::default();
assert_eq!(cond.parameter_ref.as_literal().unwrap(), "defaultParam");
assert_eq!(cond.rule, Rule::EqualTo);
assert_eq!(cond.value.as_literal().unwrap(), "defaultValue");
}
#[test]
fn test_traffic_signal_condition_xml_roundtrip() {
let cond = TrafficSignalCondition {
name: OSString::literal("signal1".to_string()),
state: OSString::literal("red".to_string()),
};
let xml = quick_xml::se::to_string(&cond).unwrap();
let deserialized: TrafficSignalCondition = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(cond, deserialized);
}
#[test]
fn test_by_value_condition_default_has_simulation_time() {
let cond = ByValueCondition::default();
assert!(cond.simulation_time_condition.is_some());
assert!(cond.parameter_condition.is_none());
assert!(cond.variable_condition.is_none());
}
#[test]
fn test_storyboard_element_state_condition_default() {
let cond = StoryboardElementStateCondition::default();
assert_eq!(cond.state, StoryboardElementState::RunningState);
assert_eq!(cond.storyboard_element_type, StoryboardElementType::Story);
}
#[test]
fn test_variable_condition_xml_roundtrip() {
let cond = VariableCondition {
variable_ref: OSString::literal("speed".to_string()),
rule: Rule::GreaterThan,
value: OSString::literal("100".to_string()),
};
let xml = quick_xml::se::to_string(&cond).unwrap();
let deserialized: VariableCondition = quick_xml::de::from_str(&xml).unwrap();
assert_eq!(cond, deserialized);
}
}