inlyne 0.1.7

Introducing Inlyne, a GPU powered yet browsless tool to help you quickly view markdown files in the blink of an eye.
use std::{ffi::OsString, path::PathBuf};

use crate::opts::config::FontOptions;
use crate::opts::Args;

use super::{cli, config, Opts, ThemeType};

fn gen_args(args: Vec<&str>) -> Vec<OsString> {
    std::iter::once("inlyne")
        .chain(args.into_iter())
        .map(OsString::from)
        .collect()
}

#[test]
fn debug_assert() {
    cli::command(
        "Factor to scale rendered file by [default: Window's scale factor]",
        ThemeType::Dark,
    )
    .debug_assert();
}

#[test]
fn defaults() {
    let config = config::Config::default();
    assert_eq!(
        Opts::parse_and_load_from(
            &Args::parse_from(gen_args(vec!["file.md"]), &config),
            config::Config::default()
        ),
        Opts {
            file_path: PathBuf::from("file.md"),
            theme: ThemeType::default().as_theme(),
            scale: None,
            font_opts: FontOptions::default(),
        }
    );
}

#[test]
fn config_overrides_default() {
    let config = config::Config {
        theme: ThemeType::Dark,
        ..Default::default()
    };
    assert_eq!(
        Opts::parse_and_load_from(
            &Args::parse_from(gen_args(vec!["file.md"]), &config),
            config
        ),
        Opts {
            file_path: PathBuf::from("file.md"),
            theme: ThemeType::Dark.as_theme(),
            scale: None,
            font_opts: FontOptions::default(),
        }
    );
    let config = config::Config {
        scale: Some(1.5),
        ..Default::default()
    };
    assert_eq!(
        Opts::parse_and_load_from(
            &Args::parse_from(gen_args(vec!["file.md"]), &config),
            config,
        ),
        Opts {
            file_path: PathBuf::from("file.md"),
            theme: ThemeType::default().as_theme(),
            scale: Some(1.5),
            font_opts: FontOptions::default(),
        }
    );
}

#[test]
fn from_cli() {
    let config = config::Config::default();
    assert_eq!(
        Opts::parse_and_load_from(
            &Args::parse_from(gen_args(vec!["--theme", "dark", "file.md"]), &config),
            config::Config::default()
        ),
        Opts {
            file_path: PathBuf::from("file.md"),
            theme: ThemeType::Dark.as_theme(),
            scale: None,
            font_opts: FontOptions::default(),
        }
    );

    // CLI takes precedence over config
    let config = config::Config {
        theme: ThemeType::Dark,
        scale: Some(0.1),
        ..Default::default()
    };
    assert_eq!(
        Opts::parse_and_load_from(
            &Args::parse_from(gen_args(vec!["--scale", "1.5", "file.md"]), &config),
            config
        ),
        Opts {
            file_path: PathBuf::from("file.md"),
            theme: ThemeType::Dark.as_theme(),
            scale: Some(1.5),
            font_opts: FontOptions::default(),
        }
    );
}