//! Mock version of std::fs::OpenOptions;
use mockall::mock;

use crate::fs::mocks::MockFile;
#[cfg(unix)]
use std::os::unix::fs::OpenOptionsExt;
#[cfg(windows)]
use std::os::windows::fs::OpenOptionsExt;
use std::{io, path::Path};

mock! {
    #[derive(Debug)]
    pub OpenOptions {
        pub fn append(&mut self, append: bool) -> &mut Self;
        pub fn create(&mut self, create: bool) -> &mut Self;
        pub fn create_new(&mut self, create_new: bool) -> &mut Self;
        pub fn open<P: AsRef<Path> + 'static>(&self, path: P) -> io::Result<MockFile>;
        pub fn read(&mut self, read: bool) -> &mut Self;
        pub fn truncate(&mut self, truncate: bool) -> &mut Self;
        pub fn write(&mut self, write: bool) -> &mut Self;
    }
    impl Clone for OpenOptions {
        fn clone(&self) -> Self;
    }
    #[cfg(unix)]
    impl OpenOptionsExt for OpenOptions {
        fn custom_flags(&mut self, flags: i32) -> &mut Self;
        fn mode(&mut self, mode: u32) -> &mut Self;
    }
    #[cfg(windows)]
    impl OpenOptionsExt for OpenOptions {
        fn access_mode(&mut self, access: u32) -> &mut Self;
        fn share_mode(&mut self, val: u32) -> &mut Self;
        fn custom_flags(&mut self, flags: u32) -> &mut Self;
        fn attributes(&mut self, val: u32) -> &mut Self;
        fn security_qos_flags(&mut self, flags: u32) -> &mut Self;
    }
}
