concepts: Add alternative Post implementation with states as types
[learn-rust.git] / concepts / tests / test_lib.rs
1 use std::cell::RefCell;
2
3 use learning::*;
4
5 #[test]
6 fn test_longest() {
7     assert_eq!(longest("abc", "de"), "abc");
8     assert_eq!(longest("abc", "def"), "def");
9     assert_eq!(longest("abc", "defg"), "defg");
10 }
11
12 #[test]
13 fn test_cacher_int_int() {
14     let called = RefCell::new(0);
15     let mut cacher = Cacher::new(|x| {
16         *(called.borrow_mut()) += 1;
17         2 * x
18     });
19     assert_eq!(cacher.value(1), 2);
20     assert_eq!(*called.borrow(), 1);
21     // second time cached
22     assert_eq!(cacher.value(1), 2);
23     assert_eq!(*called.borrow(), 1);
24     // re-evaluated for new value
25     assert_eq!(cacher.value(-2), -4);
26     assert_eq!(*called.borrow(), 2);
27     // old arg still cached
28     assert_eq!(cacher.value(1), 2);
29     assert_eq!(*called.borrow(), 2);
30 }
31
32 #[test]
33 fn test_cacher_str_usize() {
34     let called = RefCell::new(0);
35     let mut cacher = Cacher::new(|x: &str| {
36         *(called.borrow_mut()) += 1;
37         x.len()
38     });
39     assert_eq!(cacher.value("abc"), 3);
40     assert_eq!(*called.borrow(), 1);
41     // second time cached
42     assert_eq!(cacher.value("abc"), 3);
43     assert_eq!(*called.borrow(), 1);
44     // re-evaluated for new value
45     assert_eq!(cacher.value("defg"), 4);
46     assert_eq!(*called.borrow(), 2);
47     // old arg still cached
48     assert_eq!(cacher.value("abc"), 3);
49     assert_eq!(*called.borrow(), 2);
50 }