use crate::{
BatteryType, ComponentCategory, ComponentGraph, ComponentGraphConfig, Edge, Error,
EvChargerType, InverterType, Node,
};
#[derive(Clone, Debug, PartialEq)]
pub(super) struct TestComponent(u64, ComponentCategory);
impl TestComponent {
pub(super) fn new(id: u64, category: ComponentCategory) -> Self {
TestComponent(id, category)
}
}
impl Node for TestComponent {
fn component_id(&self) -> u64 {
self.0
}
fn category(&self) -> ComponentCategory {
self.1
}
}
#[derive(Clone, Debug, PartialEq)]
pub(super) struct TestConnection(u64, u64);
impl TestConnection {
pub(super) fn new(source: u64, destination: u64) -> Self {
TestConnection(source, destination)
}
}
impl Edge for TestConnection {
fn source(&self) -> u64 {
self.0
}
fn destination(&self) -> u64 {
self.1
}
}
#[derive(Eq, Hash, PartialEq, Copy, Clone)]
pub(super) struct ComponentHandle(u64);
impl ComponentHandle {
pub(super) fn new(id: u64) -> Self {
ComponentHandle(id)
}
pub(super) fn component_id(&self) -> u64 {
self.0
}
}
pub(super) struct ComponentGraphBuilder {
components: Vec<TestComponent>,
connections: Vec<TestConnection>,
next_id: u64,
}
impl ComponentGraphBuilder {
pub(super) fn new() -> Self {
ComponentGraphBuilder {
components: Vec::new(),
connections: Vec::new(),
next_id: 0,
}
}
pub(super) fn add_component(&mut self, category: ComponentCategory) -> ComponentHandle {
let id = self.next_id;
self.next_id += 1;
self.components.push(TestComponent::new(id, category));
ComponentHandle(id)
}
pub(super) fn add_component_with_id(
&mut self,
id: u64,
category: ComponentCategory,
) -> ComponentHandle {
self.components.push(TestComponent::new(id, category));
ComponentHandle(id)
}
pub(super) fn pop_component(&mut self) -> Option<TestComponent> {
self.components.pop()
}
pub(super) fn pop_connection(&mut self) -> Option<TestConnection> {
self.connections.pop()
}
pub(super) fn grid(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::GridConnectionPoint)
}
pub(super) fn meter(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::Meter)
}
pub(super) fn battery(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::Battery(BatteryType::LiIon))
}
pub(super) fn battery_inverter(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::Inverter(InverterType::Battery))
}
pub(super) fn solar_inverter(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::Inverter(InverterType::Pv))
}
pub(super) fn ev_charger(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::EvCharger(EvChargerType::Ac))
}
pub(super) fn chp(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::Chp)
}
pub(super) fn wind_turbine(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::WindTurbine)
}
pub(super) fn steam_boiler(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::SteamBoiler)
}
pub(super) fn power_transformer(&mut self) -> ComponentHandle {
self.add_component(ComponentCategory::PowerTransformer)
}
pub(super) fn connect(&mut self, from: ComponentHandle, to: ComponentHandle) -> &mut Self {
self.connections
.push(TestConnection::new(from.component_id(), to.component_id()));
self
}
pub(super) fn meter_bat_chain(
&mut self,
num_inverters: usize,
num_batteries: usize,
) -> ComponentHandle {
let meter = self.meter();
let mut inverters = vec![];
for _ in 0..num_inverters {
let inverter = self.battery_inverter();
self.connect(meter, inverter);
inverters.push(inverter);
}
for _ in 0..num_batteries {
let battery = self.battery();
for inverter in &inverters {
self.connect(*inverter, battery);
}
}
meter
}
pub(super) fn inv_bat_chain(&mut self, num_batteries: usize) -> ComponentHandle {
let inverter = self.battery_inverter();
let mut batteries = vec![];
for _ in 0..num_batteries {
let battery = self.battery();
self.connect(inverter, battery);
batteries.push(battery);
}
inverter
}
pub(super) fn meter_pv_chain(&mut self, num_inverters: usize) -> ComponentHandle {
let meter = self.meter();
for _ in 0..num_inverters {
let inverter = self.solar_inverter();
self.connect(meter, inverter);
}
meter
}
pub(super) fn meter_chp_chain(&mut self, num_chp: usize) -> ComponentHandle {
let meter = self.meter();
for _ in 0..num_chp {
let chp = self.chp();
self.connect(meter, chp);
}
meter
}
pub(super) fn meter_ev_charger_chain(&mut self, num_ev_chargers: usize) -> ComponentHandle {
let meter = self.meter();
for _ in 0..num_ev_chargers {
let ev_charger = self.ev_charger();
self.connect(meter, ev_charger);
}
meter
}
pub(super) fn meter_wind_turbine_chain(&mut self, num_wind_turbines: usize) -> ComponentHandle {
let meter = self.meter();
for _ in 0..num_wind_turbines {
let wind_turbine = self.wind_turbine();
self.connect(meter, wind_turbine);
}
meter
}
pub(super) fn meter_steam_boiler_chain(&mut self, num_steam_boilers: usize) -> ComponentHandle {
let meter = self.meter();
for _ in 0..num_steam_boilers {
let steam_boiler = self.steam_boiler();
self.connect(meter, steam_boiler);
}
meter
}
pub(super) fn build(
&self,
config: Option<ComponentGraphConfig>,
) -> Result<ComponentGraph<TestComponent, TestConnection>, Error> {
ComponentGraph::try_new(
self.components.clone(),
self.connections.clone(),
config.unwrap_or_default(),
)
}
}