use crate::data::stars::StarKey;
use crate::data::types::*;
use crate::models::star::Star;
use crate::utils::fix_index;
pub fn get_major_stars(
ziwei_index: usize,
tianfu_index: usize,
yearly_stem: HeavenlyStem,
lang: Language,
config: &Config,
) -> [Vec<Star>; 12] {
let mut result: [Vec<Star>; 12] = Default::default();
let ziwei_group: [(usize, StarKey); 6] = [
(0, StarKey::ZiweiMaj),
(1, StarKey::TianjiMaj),
(3, StarKey::TaiyangMaj),
(4, StarKey::WuquMaj),
(5, StarKey::TiantongMaj),
(8, StarKey::LianzhenMaj),
];
for (offset, key) in ziwei_group {
let idx = fix_index(ziwei_index as i32 - offset as i32, 12);
let star = crate::star::make_star(
key,
StarType::Major,
Scope::Origin,
idx,
Some(yearly_stem),
lang,
config,
);
result[idx].push(star);
}
let tianfu_group: [(usize, StarKey); 8] = [
(0, StarKey::TianfuMaj),
(1, StarKey::TaiyinMaj),
(2, StarKey::TanlangMaj),
(3, StarKey::JumenMaj),
(4, StarKey::TianxiangMaj),
(5, StarKey::TianliangMaj),
(6, StarKey::QishaMaj),
(10, StarKey::PojunMaj),
];
for (offset, key) in tianfu_group {
let idx = fix_index(tianfu_index as i32 + offset as i32, 12);
let star = crate::star::make_star(
key,
StarType::Major,
Scope::Origin,
idx,
Some(yearly_stem),
lang,
config,
);
result[idx].push(star);
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_major_stars_count() {
let result = get_major_stars(0, 0, HeavenlyStem::Jia, Language::ZhCN, &Config::default());
let total: usize = result.iter().map(|v| v.len()).sum();
assert_eq!(total, 14);
}
#[test]
fn test_all_major_type() {
let result = get_major_stars(3, 9, HeavenlyStem::Yi, Language::ZhCN, &Config::default());
for palace in &result {
for star in palace {
assert_eq!(star.star_type, StarType::Major);
assert_eq!(star.scope, Scope::Origin);
}
}
}
}