#[cfg(test)] mod model_tests { use sgf_parser::Action::Move; use sgf_parser::*; #[test] fn can_get_unknown_nodes() { let tree: GameTree = parse("(;B[dc];W[ef]AC[23](;B[dd])(;AS[234]))").unwrap(); let unknowns = tree.get_unknown_nodes(); assert_eq!(unknowns.len(), 2); assert_eq!( *unknowns[0], GameNode { tokens: vec![ SgfToken::Move { color: Color::White, action: Move(5, 6), }, SgfToken::Unknown(("AC".to_string(), "23".to_string())) ] } ); assert_eq!( *unknowns[1], GameNode { tokens: vec![SgfToken::Unknown(("AS".to_string(), "234".to_string()))] } ); } #[test] fn can_get_invalid_nodes() { let tree: GameTree = parse("(;B[dc];W[foobar](;B[dd])(;B[234]))").unwrap(); let unknowns = tree.get_invalid_nodes(); assert_eq!(unknowns.len(), 2); assert_eq!( *unknowns[0], GameNode { tokens: vec![SgfToken::Invalid(("W".to_string(), "foobar".to_string()))] } ); assert_eq!( *unknowns[1], GameNode { tokens: vec![SgfToken::Invalid(("B".to_string(), "234".to_string()))] } ); } #[test] fn can_iterate_over_simple_tree() { let tree: GameTree = parse("(;B[dc];W[ef])").unwrap(); let mut iter = tree.iter(); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::Black, action: Move(4, 3), }] }) ); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::White, action: Move(5, 6), }] }) ); assert_eq!(iter.next(), None); } #[test] fn can_iterate_with_branch() { let tree: GameTree = parse("(;B[dc];W[ef](;B[aa])(;B[cc]))").unwrap(); let mut iter = tree.iter(); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::Black, action: Move(4, 3), }] }) ); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::White, action: Move(5, 6), }] }) ); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::Black, action: Move(1, 1), }] }) ); assert_eq!(iter.next(), None); } #[test] fn iterator_can_switch_branch() { let tree: GameTree = parse("(;B[dc];W[ef](;B[aa])(;B[cc]))").unwrap(); let mut iter = tree.iter(); assert!(iter.has_variations()); assert_eq!(iter.count_variations(), 2); assert!(iter.pick_variation(1).is_ok()); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::Black, action: Move(4, 3), }] }) ); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::White, action: Move(5, 6), }] }) ); assert_eq!( iter.next(), Some(&GameNode { tokens: vec![SgfToken::Move { color: Color::Black, action: Move(3, 3), }] }) ); assert_eq!(iter.next(), None); } #[test] fn count_tree_length() { let tree: GameTree = parse("(;B[dc];W[ef](;B[aa])(;B[cc];W[dd]))").unwrap(); assert_eq!(tree.count_max_nodes(), 4); } }