use crate::system::defs::base::*;
use crate::system::defs::mechanics::*;
use crate::system::prefixes::*;
use crate::{quantity, unit};
use typenum::*;
quantity!(Charge: M Z0, L Z0, T P1, I P1, Th Z0, N Z0, J Z0);
unit!(compound: Coulomb, "C", [(Second, P1), (Ampere, P1)]; prefixable);
unit!(prefix: Millicoulomb, Milli, Coulomb);
unit!(prefix: Microcoulomb, Micro, Coulomb);
unit!(prefix: Nanocoulomb, Nano, Coulomb);
quantity!(Potential: M P1, L P2, T N3, I N1, Th Z0, N Z0, J Z0);
unit!(compound: Volt, "V", [(Watt, P1), (Ampere, N1)]; prefixable);
unit!(prefix: Millivolt, Milli, Volt);
unit!(prefix: Microvolt, Micro, Volt);
unit!(prefix: Kilovolt, Kilo, Volt);
unit!(prefix: Megavolt, Mega, Volt);
quantity!(Capacitance: M N1, L N2, T P4, I P2, Th Z0, N Z0, J Z0);
unit!(compound: Farad, "F", [(Coulomb, P1), (Volt, N1)]; prefixable);
unit!(prefix: Millifarad, Milli, Farad);
unit!(prefix: Microfarad, Micro, Farad);
unit!(prefix: Nanofarad, Nano, Farad);
unit!(prefix: Picofarad, Pico, Farad);
quantity!(Resistance: M P1, L P2, T N3, I N2, Th Z0, N Z0, J Z0);
unit!(compound: Ohm, "Ω", [(Volt, P1), (Ampere, N1)]; prefixable);
unit!(prefix: Milliohm, Milli, Ohm);
unit!(prefix: Kiloohm, Kilo, Ohm);
unit!(prefix: Megaohm, Mega, Ohm);
quantity!(Conductance: M N1, L N2, T P3, I P2, Th Z0, N Z0, J Z0);
unit!(compound: Siemens, "S", [(Ohm, N1)]; prefixable);
unit!(prefix: Millisiemens, Milli, Siemens);
unit!(prefix: Microsiemens, Micro, Siemens);
quantity!(MagneticFlux: M P1, L P2, T N2, I N1, Th Z0, N Z0, J Z0);
unit!(compound: Weber, "Wb", [(Volt, P1), (Second, P1)]; prefixable);
quantity!(MagneticFluxDensity: M P1, L Z0, T N2, I N1, Th Z0, N Z0, J Z0);
unit!(compound: Tesla, "T", [(Weber, P1), (Metre, N2)]; prefixable);
unit!(derived: Gauss, "G", (1e-4, Tesla));
quantity!(Inductance: M P1, L P2, T N2, I N2, Th Z0, N Z0, J Z0);
unit!(compound: Henry, "H", [(Weber, P1), (Ampere, N1)]; prefixable);
unit!(prefix: Millihenry, Milli, Henry);
unit!(prefix: Microhenry, Micro, Henry);
quantity!(ElectricField: M P1, L P1, T N3, I N1, Th Z0, N Z0, J Z0);
unit!(compound: VoltPerMetre, "V/m", [(Volt, P1), (Metre, N1)]);
quantity!(MagneticFieldStrength: M Z0, L N1, T Z0, I P1, Th Z0, N Z0, J Z0);
unit!(compound: AmperePerMetre, "A/m", [(Ampere, P1), (Metre, N1)]);
quantity!(ElectricConductivity: M N1, L N3, T P3, I P2, Th Z0, N Z0, J Z0);
unit!(compound: SiemensPerMetre, "S/m", [(Siemens, P1), (Metre, N1)]);
quantity!(ElectricDisplacement: M Z0, L N2, T P1, I P1, Th Z0, N Z0, J Z0);
unit!(compound: CoulombPerSquareMetre, "C/m²", [(Coulomb, P1), (SquareMetre, N1)]);
quantity!(Permittivity: M N1, L N3, T P4, I P2, Th Z0, N Z0, J Z0);
unit!(compound: FaradPerMetre, "F/m", [(Farad, P1), (Metre, N1)]);
quantity!(Permeability: M P1, L P1, T N2, I N2, Th Z0, N Z0, J Z0);
unit!(compound: HenryPerMetre, "H/m", [(Henry, P1), (Metre, N1)]);
quantity!(CurrentDensity: M Z0, L N2, T Z0, I P1, Th Z0, N Z0, J Z0);
unit!(compound: AmperePerSquareMetre, "A/m²", [(Ampere, P1), (SquareMetre, N1)]);
quantity!(ChargeDensity: M Z0, L N3, T P1, I P1, Th Z0, N Z0, J Z0);
unit!(compound: CoulombPerCubicMetre, "C/m³", [(Coulomb, P1), (CubicMetre, N1)]);
quantity!(MagneticMoment: M Z0, L P2, T Z0, I P1, Th Z0, N Z0, J Z0);
unit!(compound: AmpereSquareMetre, "A⋅m²", [(Ampere, P1), (SquareMetre, P1)]);
unit!(compound: JoulePerTesla, "J/T", [(Joule, P1), (Tesla, N1)]);
#[cfg(test)]
mod tests {
use super::*;
use crate::common::verify_unit;
verify_unit!(Coulomb, Charge, 1.0);
verify_unit!(Millicoulomb, Charge, 0.001);
verify_unit!(Microcoulomb, Charge, 1e-6);
verify_unit!(Nanocoulomb, Charge, 1e-9);
verify_unit!(Volt, Potential, 1.0);
verify_unit!(Millivolt, Potential, 1e-3);
verify_unit!(Microvolt, Potential, 1e-6);
verify_unit!(Kilovolt, Potential, 1e3);
verify_unit!(Megavolt, Potential, 1e6);
verify_unit!(Farad, Capacitance, 1.0);
verify_unit!(Millifarad, Capacitance, 1e-3);
verify_unit!(Microfarad, Capacitance, 1e-6);
verify_unit!(Nanofarad, Capacitance, 1e-9);
verify_unit!(Picofarad, Capacitance, 1e-12);
verify_unit!(Ohm, Resistance, 1.0);
verify_unit!(Milliohm, Resistance, 1e-3);
verify_unit!(Kiloohm, Resistance, 1e3);
verify_unit!(Megaohm, Resistance, 1e6);
verify_unit!(Siemens, Conductance, 1.0);
verify_unit!(Millisiemens, Conductance, 1e-3);
verify_unit!(Microsiemens, Conductance, 1e-6);
verify_unit!(Weber, MagneticFlux, 1.0);
verify_unit!(Tesla, MagneticFluxDensity, 1.0);
verify_unit!(Gauss, MagneticFluxDensity, 1e-4);
verify_unit!(Henry, Inductance, 1.0);
verify_unit!(Millihenry, Inductance, 1e-3);
verify_unit!(Microhenry, Inductance, 1e-6);
verify_unit!(VoltPerMetre, ElectricField, 1.0);
verify_unit!(AmperePerMetre, MagneticFieldStrength, 1.0);
verify_unit!(SiemensPerMetre, ElectricConductivity, 1.0);
verify_unit!(CoulombPerSquareMetre, ElectricDisplacement, 1.0);
verify_unit!(FaradPerMetre, Permittivity, 1.0);
verify_unit!(HenryPerMetre, Permeability, 1.0);
verify_unit!(AmperePerSquareMetre, CurrentDensity, 1.0);
verify_unit!(CoulombPerCubicMetre, ChargeDensity, 1.0);
verify_unit!(AmpereSquareMetre, MagneticMoment, 1.0);
verify_unit!(JoulePerTesla, MagneticMoment, 1.0);
}