tiefdownlib 0.10.0

A library to manage and convert TiefDown projects.
Documentation
use rstest::rstest;

use crate::manifest_model::{
    upgrade_manifest_v0_to_v1, upgrade_manifest_v1_to_v2, upgrade_manifest_v2_to_v3,
    upgrade_manifest_v3_to_v4, upgrade_manifest_v4_to_v5,
};

#[rstest]
fn test_upgrade_manifest_v0_to_v1() {
    let manifest_content = r#"
markdown_dir = "Custom Markdown Directory"
templates = ["template1.tex", "template2.typ"]"#;
    let mut manifest = toml::from_str(manifest_content).unwrap();

    let result = upgrade_manifest_v0_to_v1(&mut manifest);

    assert!(result.is_ok());

    let expected_manifest = r#"markdown_dir = "Custom Markdown Directory"
version = 1

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let actual_manifest = toml::to_string(&manifest).unwrap();
    assert_eq!(expected_manifest, actual_manifest);
}

#[rstest]
fn test_upgrade_manifest_v1_to_v2() {
    let manifest_content = r#"
markdown_dir = "Custom Markdown Directory"
version = 1

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let mut manifest = toml::from_str(manifest_content).unwrap();
    let result = upgrade_manifest_v1_to_v2(&mut manifest);
    assert!(result.is_ok());

    let expected_manifest = r#"markdown_dir = "Custom Markdown Directory"
version = 2

[custom_processors]
preprocessors = []

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let actual_manifest = toml::to_string(&manifest).unwrap();
    assert_eq!(expected_manifest, actual_manifest);
}

#[rstest]
fn test_upgrade_manifest_v2_to_v3() {
    let manifest_content = r#"markdown_dir = "Custom Markdown Directory"
version = 2

[custom_processors]
preprocessors = []

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let mut manifest = toml::from_str(manifest_content).unwrap();
    let result = upgrade_manifest_v2_to_v3(&mut manifest);
    assert!(result.is_ok());

    let expected_manifest = r#"markdown_dir = "Custom Markdown Directory"
version = 3

[custom_processors]
preprocessors = []
processors = []

[metadata_fields]

[metadata_settings]

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let actual_manifest = toml::to_string(&manifest).unwrap();
    assert_eq!(expected_manifest, actual_manifest);
}

#[rstest]
fn test_upgrade_manifest_v3_to_v4() {
    let manifest_content = r#"markdown_dir = "Custom Markdown Directory"
version = 3

[custom_processors]
preprocessors = []
processors = []

[metadata_fields]
author = "Author Name"
title = "Document Title"

[metadata_settings]
metadata_prefix = "supermeta"

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let mut manifest = toml::from_str(manifest_content).unwrap();
    let result = upgrade_manifest_v3_to_v4(&mut manifest);
    assert!(result.is_ok());

    let expected_manifest = r#"version = 4

[custom_processors]
preprocessors = []
processors = []

[[markdown_projects]]
name = "Custom Markdown Directory"
output = "."
path = "Custom Markdown Directory"

[metadata_settings]
metadata_prefix = "supermeta"

[shared_metadata]
author = "Author Name"
title = "Document Title"

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"
"#;

    let actual_manifest = toml::to_string(&manifest).unwrap();
    assert_eq!(expected_manifest, actual_manifest);
}

#[rstest]
fn test_upgrade_manifest_v4_to_v5() {
    let manifest_content = r#"version = 4

[custom_processors]
processors = []

[[custom_processors.preprocessors]]
name = "custom preprocessor"
pandoc_args = ["-o", "combined.tex", "-t", "tex", "--listings"]

[[markdown_projects]]
name = "Custom Markdown Directory"
output = "."
path = "Custom Markdown Directory"

[metadata_settings]
metadata_prefix = "supermeta"

[shared_metadata]
author = "Author Name"
title = "Document Title"

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"

[[templates]]
name = "template3"
preprocessor = "custom preprocessor"
template_type = "CustomPandoc"
"#;

    let mut manifest = toml::from_str(manifest_content).unwrap();
    let result = upgrade_manifest_v4_to_v5(&mut manifest);
    assert!(result.is_ok());

    let expected_manifest = r#"version = 5

[custom_processors]
processors = []

[[custom_processors.preprocessors]]
cli_args = ["-t", "tex", "--listings"]
name = "custom preprocessor"

[[markdown_projects]]
name = "Custom Markdown Directory"
output = "."
path = "Custom Markdown Directory"

[metadata_settings]
metadata_prefix = "supermeta"

[shared_metadata]
author = "Author Name"
title = "Document Title"

[[templates]]
name = "template1.tex"
template_type = "Tex"

[[templates]]
name = "template2.typ"
template_type = "Typst"

[[templates]]
name = "template3"
preprocessor = "custom preprocessor"
template_type = "CustomPreprocessors"

[templates.preprocessors]
combined_output = "combined.tex"
preprocessors = ["custom preprocessor"]
"#;

    let actual_manifest = toml::to_string(&manifest).unwrap();
    assert_eq!(expected_manifest, actual_manifest);
}