]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/drop-trait-enum.rs
doc: remove incomplete sentence
[rust.git] / src / test / run-pass / drop-trait-enum.rs
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use std::task;
12 use std::sync::mpsc::{channel, Sender};
13
14 #[derive(PartialEq, Show)]
15 enum Message {
16     Dropped,
17     DestructorRan
18 }
19
20 struct SendOnDrop {
21     sender: Sender<Message>
22 }
23
24 impl Drop for SendOnDrop {
25     fn drop(&mut self) {
26         self.sender.send(Message::Dropped).unwrap();
27     }
28 }
29
30 enum Foo {
31     SimpleVariant(Sender<Message>),
32     NestedVariant(Box<uint>, SendOnDrop, Sender<Message>),
33     FailingVariant { on_drop: SendOnDrop }
34 }
35
36 impl Drop for Foo {
37     fn drop(&mut self) {
38         match self {
39             &Foo::SimpleVariant(ref mut sender) => {
40                 sender.send(Message::DestructorRan).unwrap();
41             }
42             &Foo::NestedVariant(_, _, ref mut sender) => {
43                 sender.send(Message::DestructorRan).unwrap();
44             }
45             &Foo::FailingVariant { .. } => {
46                 panic!("Failed");
47             }
48         }
49     }
50 }
51
52 pub fn main() {
53     let (sender, receiver) = channel();
54     {
55         let v = Foo::SimpleVariant(sender);
56     }
57     assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
58     assert_eq!(receiver.recv().ok(), None);
59
60     let (sender, receiver) = channel();
61     {
62         let v = Foo::NestedVariant(box 42u, SendOnDrop { sender: sender.clone() }, sender);
63     }
64     assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
65     assert_eq!(receiver.recv().unwrap(), Message::Dropped);
66     assert_eq!(receiver.recv().ok(), None);
67
68     let (sender, receiver) = channel();
69     task::spawn(move|| {
70         let v = Foo::FailingVariant { on_drop: SendOnDrop { sender: sender } };
71     });
72     assert_eq!(receiver.recv().unwrap(), Message::Dropped);
73     assert_eq!(receiver.recv().ok(), None);
74
75     let (sender, receiver) = channel();
76     {
77         task::spawn(move|| {
78             let mut v = Foo::NestedVariant(box 42u, SendOnDrop {
79                 sender: sender.clone()
80             }, sender.clone());
81             v = Foo::NestedVariant(box 42u, SendOnDrop { sender: sender.clone() }, sender.clone());
82             v = Foo::SimpleVariant(sender.clone());
83             v = Foo::FailingVariant { on_drop: SendOnDrop { sender: sender } };
84         });
85     }
86     assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
87     assert_eq!(receiver.recv().unwrap(), Message::Dropped);
88     assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
89     assert_eq!(receiver.recv().unwrap(), Message::Dropped);
90     assert_eq!(receiver.recv().unwrap(), Message::DestructorRan);
91     assert_eq!(receiver.recv().unwrap(), Message::Dropped);
92     assert_eq!(receiver.recv().ok(), None);
93 }