use crate::exact_math::{multiply_to_raw, ratio_to_tick, select_liquidity_levels, weighted_average_to_tick, LiquidityTarget, RoundingDirection};
assert_eq!(weighted_average_to_tick(&[level(99, 1)], tick, RoundingDirection::Up).unwrap(), raw(100));
assert_eq!(weighted_average_to_tick(&[level(100, 1)], tick, RoundingDirection::Up).unwrap(), raw(100));
assert_eq!(weighted_average_to_tick(&[level(101, 1)], tick, RoundingDirection::Up).unwrap(), raw(200));
assert_eq!(weighted_average_to_tick(&levels, raw(100), RoundingDirection::Up).unwrap(), raw(200));
assert_eq!(weighted_average_to_tick(&levels, raw(100), RoundingDirection::Down).unwrap(), raw(100));
assert_eq!(weighted_average_to_tick(&levels, raw(100), RoundingDirection::Up).unwrap(), raw(200));
let selected = select_liquidity_levels(&levels, raw(1), LiquidityTarget::Notional, raw(100)).unwrap();
let selected = select_liquidity_levels(&levels, raw(101), LiquidityTarget::Quantity, raw(100)).unwrap();
let result = ratio_to_tick(raw(1), raw(9_999_999_999_999_999), raw(100), RoundingDirection::Up).unwrap();
assert_eq!(multiply_to_raw(raw(1), raw(1), RoundingDirection::Down).unwrap(), FPDecimal::ZERO);
let rounded = weighted_average_to_tick(&levels, raw(tick_raw), RoundingDirection::Up).unwrap();
let rounded = weighted_average_to_tick(&levels, raw(tick_raw), RoundingDirection::Down).unwrap();
.fold(U512::zero(), |sum, item| sum.checked_add(item.p.num.full_mul(item.q.num)).unwrap());
let levels = vec![PriceLevel { p: maximum, q: maximum }, PriceLevel { p: maximum, q: maximum }];