use crate::system::defs::base::*;
use crate::system::defs::dimensionless::*;
use crate::system::defs::mechanics::*;
use crate::system::prefixes::*;
use crate::{quantity, unit};
use typenum::*;
quantity!(LuminousFlux: M Z0, L Z0, T Z0, I Z0, Th Z0, N Z0, J P1; marked);
unit!(compound: Lumen, "lm", [(Candela, P1), (Steradian, P1)]; marked LuminousFlux);
quantity!(Luminance: M Z0, L N2, T Z0, I Z0, Th Z0, N Z0, J P1);
unit!(compound: Nit, "nt", [(Candela, P1), (Metre, N2)]; prefixable);
quantity!(Illuminance: M Z0, L N2, T Z0, I Z0, Th Z0, N Z0, J P1; marked);
unit!(compound: Lux, "lx", [(Lumen, P1), (SquareMetre, N1)]; prefixable, marked Illuminance);
unit!(prefix: Kilolux, Kilo, Lux);
quantity!(OpticalPower: M Z0, L N1, T Z0, I Z0, Th Z0, N Z0, J Z0; marked);
unit!(compound: Dioptre, "D", [(Metre, N1)]; marked OpticalPower);
quantity!(LuminousEnergy: M Z0, L Z0, T P1, I Z0, Th Z0, N Z0, J P1; marked);
unit!(compound: LumenSecond, "lm⋅s", [(Lumen, P1), (Second, P1)]; marked LuminousEnergy);
unit!(derived: Talbot, "T", (1, LumenSecond));
quantity!(LuminousExposure: M Z0, L N2, T P1, I Z0, Th Z0, N Z0, J P1; marked);
unit!(compound: LuxSecond, "lx⋅s", [(Lux, P1), (Second, P1)]; marked LuminousExposure);
quantity!(LuminousEfficacy: M N1, L N2, T P3, I Z0, Th Z0, N Z0, J P1; marked);
unit!(compound: LumenPerWatt, "lm/W", [(Lumen, P1), (Watt, N1)]; marked LuminousEfficacy);
quantity!(Radiance: M P1, L Z0, T N3, I Z0, Th Z0, N Z0, J Z0; marked);
unit!(compound: WattPerSquareMetreSteradian, "W/(m²⋅sr)", [(Watt, P1), (Metre, N2), (Steradian, N1)]; marked Radiance);
quantity!(RadiantIntensity: M P1, L P2, T N3, I Z0, Th Z0, N Z0, J Z0; marked);
unit!(compound: WattPerSteradian, "W/sr", [(Watt, P1), (Steradian, N1)]; marked RadiantIntensity);
quantity!(Irradiance: M P1, L Z0, T N3, I Z0, Th Z0, N Z0, J Z0);
unit!(compound: WattPerSquareMetre, "W/m²", [(Watt, P1), (Metre, N2)]);
quantity!(SpectralRadiance: M P1, L N1, T N3, I Z0, Th Z0, N Z0, J Z0; marked);
unit!(compound: WattPerSquareMetreMetreSteradian, "W/(m³⋅sr)", [(Watt, P1), (Metre, N3), (Steradian, N1)]; marked SpectralRadiance);
unit!(compound: WattPerSquareMetreNanometreSteradian, "W/(m²⋅nm⋅sr)", [(Watt, P1), (Metre, N2), (Nanometre, N1), (Steradian, N1)]; marked SpectralRadiance);
#[cfg(test)]
mod tests {
use super::*;
use crate::common::verify_unit;
verify_unit!(Lumen, LuminousFlux, 1.0);
verify_unit!(Nit, Luminance, 1.0);
verify_unit!(Lux, Illuminance, 1.0);
verify_unit!(Kilolux, Illuminance, 1000.0);
verify_unit!(Dioptre, OpticalPower, 1.0);
verify_unit!(LumenSecond, LuminousEnergy, 1.0);
verify_unit!(Talbot, LuminousEnergy, 1.0);
verify_unit!(LuxSecond, LuminousExposure, 1.0);
verify_unit!(LumenPerWatt, LuminousEfficacy, 1.0);
verify_unit!(WattPerSquareMetreSteradian, Radiance, 1.0);
verify_unit!(WattPerSteradian, RadiantIntensity, 1.0);
verify_unit!(WattPerSquareMetre, Irradiance, 1.0);
verify_unit!(WattPerSquareMetreMetreSteradian, SpectralRadiance, 1.0);
verify_unit!(WattPerSquareMetreNanometreSteradian, SpectralRadiance, 1e9);
}