// Copyright © 2024 Mikhail Hogrefe // // This file is part of Malachite. // // Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU // Lesser General Public License (LGPL) as published by the Free Software Foundation; either version // 3 of the License, or (at your option) any later version. See . use malachite_base::rational_sequences::RationalSequence; use malachite_base::test_util::generators::large_type_gen_var_22; #[test] pub fn test_mutate() { fn test( non_repeating: &[u8], repeating: &[u8], index: usize, new_value: u8, out: u8, non_repeating_out: &[u8], repeating_out: &[u8], ) { let mut xs = RationalSequence::from_slices(non_repeating, repeating); assert_eq!( xs.mutate(index, |x| { *x = new_value; out }), out ); assert_eq!( xs, RationalSequence::from_slices(non_repeating_out, repeating_out) ); } test(&[1, 2, 3], &[], 0, 5, 6, &[5, 2, 3], &[]); test(&[1, 2, 3], &[], 1, 5, 6, &[1, 5, 3], &[]); test(&[1, 2, 3], &[], 2, 5, 6, &[1, 2, 5], &[]); test( &[1, 2, 3], &[4, 5, 6], 3, 100, 6, &[1, 2, 3, 100], &[5, 6, 4], ); test( &[1, 2, 3], &[4, 5, 6], 10, 100, 6, &[1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 100], &[6, 4, 5], ); } #[test] #[should_panic] fn mutate_fail_1() { RationalSequence::::from_vec(vec![]).mutate(0, |_| {}); } #[test] #[should_panic] fn mutate_fail_2() { RationalSequence::from_vec(vec![1, 2, 3]).mutate(3, |_| {}); } #[test] fn mutate_properties() { large_type_gen_var_22::().test_properties(|(mut xs, index, y, z)| { let xs_old = xs.clone(); let x_old = xs[index]; assert_eq!( xs.mutate(index, |x| { *x = y; z }), z ); assert_eq!(xs[index], y); xs.mutate(index, |x| { *x = x_old; }); assert_eq!(xs, xs_old); }); }