1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use super::Mask;
use std::net::Ipv6Addr;

impl Mask for Ipv6Addr {
	type Output = Self;

	fn mask(&self, other: &Self) -> Self::Output {
		Self::Output::from((u128::from(*self)) & (u128::from(*other)))
	}
}

#[cfg(test)]
mod tests {
	use super::*;

	#[test]
	fn returns_correct_answer() {
		let a: Ipv6Addr = "2001:db8::dead:beef".parse().unwrap();
		let b: Ipv6Addr = "ffff:ffff::".parse().unwrap();

		assert_eq!(a.mask(&b), "2001:db8::".parse::<Ipv6Addr>().unwrap());
	}

	#[test]
	fn is_reflexive() {
		let a: Ipv6Addr = "2001:db8::dead:beef".parse().unwrap();
		let b: Ipv6Addr = "ffff:ffff::".parse().unwrap();

		assert_eq!(a.mask(&b), b.mask(&a));
	}
}