| //@ run-pass |
| #![allow(unused_mut)] |
| #![allow(unused_parens)] |
| #![allow(non_camel_case_types)] |
| |
| use std::cmp; |
| use std::sync::mpsc::channel; |
| |
| // Tests of ports and channels on various types |
| fn test_rec() { |
| struct R { |
| val0: isize, |
| val1: u8, |
| val2: char, |
| } |
| |
| let (tx, rx) = channel(); |
| let r0: R = R { val0: 0, val1: 1, val2: '2' }; |
| tx.send(r0).unwrap(); |
| let mut r1: R; |
| r1 = rx.recv().unwrap(); |
| assert_eq!(r1.val0, 0); |
| assert_eq!(r1.val1, 1); |
| assert_eq!(r1.val2, '2'); |
| } |
| |
| fn test_vec() { |
| let (tx, rx) = channel(); |
| let v0: Vec<isize> = vec![0, 1, 2]; |
| tx.send(v0).unwrap(); |
| let v1 = rx.recv().unwrap(); |
| assert_eq!(v1[0], 0); |
| assert_eq!(v1[1], 1); |
| assert_eq!(v1[2], 2); |
| } |
| |
| fn test_str() { |
| let (tx, rx) = channel(); |
| let s0 = "test".to_string(); |
| tx.send(s0).unwrap(); |
| let s1 = rx.recv().unwrap(); |
| assert_eq!(s1.as_bytes()[0], 't' as u8); |
| assert_eq!(s1.as_bytes()[1], 'e' as u8); |
| assert_eq!(s1.as_bytes()[2], 's' as u8); |
| assert_eq!(s1.as_bytes()[3], 't' as u8); |
| } |
| |
| #[derive(Debug)] |
| enum t { |
| tag1, |
| tag2(isize), |
| tag3(isize, u8, char), |
| } |
| |
| impl cmp::PartialEq for t { |
| fn eq(&self, other: &t) -> bool { |
| match *self { |
| t::tag1 => match (*other) { |
| t::tag1 => true, |
| _ => false, |
| }, |
| t::tag2(e0a) => match (*other) { |
| t::tag2(e0b) => e0a == e0b, |
| _ => false, |
| }, |
| t::tag3(e0a, e1a, e2a) => match (*other) { |
| t::tag3(e0b, e1b, e2b) => e0a == e0b && e1a == e1b && e2a == e2b, |
| _ => false, |
| }, |
| } |
| } |
| fn ne(&self, other: &t) -> bool { |
| !(*self).eq(other) |
| } |
| } |
| |
| fn test_tag() { |
| let (tx, rx) = channel(); |
| tx.send(t::tag1).unwrap(); |
| tx.send(t::tag2(10)).unwrap(); |
| tx.send(t::tag3(10, 11, 'A')).unwrap(); |
| let mut t1: t; |
| t1 = rx.recv().unwrap(); |
| assert_eq!(t1, t::tag1); |
| t1 = rx.recv().unwrap(); |
| assert_eq!(t1, t::tag2(10)); |
| t1 = rx.recv().unwrap(); |
| assert_eq!(t1, t::tag3(10, 11, 'A')); |
| } |
| |
| fn test_chan() { |
| let (tx1, rx1) = channel(); |
| let (tx2, rx2) = channel(); |
| tx1.send(tx2).unwrap(); |
| let tx2 = rx1.recv().unwrap(); |
| // Does the transmitted channel still work? |
| |
| tx2.send(10).unwrap(); |
| let mut i: isize; |
| i = rx2.recv().unwrap(); |
| assert_eq!(i, 10); |
| } |
| |
| pub fn main() { |
| test_rec(); |
| test_vec(); |
| test_str(); |
| test_tag(); |
| test_chan(); |
| } |