expect() with formatting -> unwrap_or_else()
[kaka/rust-sdl-test.git] / src / common.rs
CommitLineData
296187ca
TW
1use std::ops::{Add, AddAssign};
2
787dbfb4 3#[macro_export]
296187ca
TW
4macro_rules! point {
5 ( $x:expr, $y:expr ) => { Point2D { x:$x, y:$y } };
6}
7
8#[derive(Debug, Copy, Clone, PartialEq)]
9pub struct Point2D<T> {
10 pub x: T,
11 pub y: T,
12}
13
14impl Point2D<f64> {
15 pub fn length(self) -> f64 {
16 ((self.x * self.x) + (self.y * self.y)).sqrt()
17 }
18}
19
20impl<T: Add<Output=T>> Add for Point2D<T> {
21 type Output = Point2D<T>;
22
23 fn add(self, rhs: Point2D<T>) -> Self::Output {
24 Point2D { x: self.x + rhs.x, y: self.y + rhs.y }
25 }
26}
27
28impl<T: AddAssign> AddAssign for Point2D<T> {
29 fn add_assign(&mut self, rhs: Point2D<T>) {
30 self.x += rhs.x;
31 self.y += rhs.y;
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 #[test]
40 fn immutable_copy_of_point() {
41 let a = point!(0, 0);
42 let mut b = a; // Copy
43 assert_eq!(a, b); // PartialEq
44 b.x = 1;
45 assert_ne!(a, b); // PartialEq
46 }
47
48 #[test]
49 fn add_points() {
50 let mut a = point!(1, 0);
51 assert_eq!(a + point!(2, 2), point!(3, 2)); // Add
52 a += point!(2, 2); // AddAssign
53 assert_eq!(a, point!(3, 2));
54 }
55}