use expect_test::expect_file;
use rustc_data_structures::fx::FxIndexMap;
use rustc_span::create_default_session_globals_then;
use test::Bencher;

use super::{DecorationInfo, write_code};

const STYLE: &str = r#"
<style>
.kw { color: #8959A8; }
.kw-2, .prelude-ty { color: #4271AE; }
.number, .string { color: #718C00; }
.self, .bool-val, .prelude-val, .attr, .attr .ident { color: #C82829; }
.macro, .macro-nonterminal { color: #3E999F; }
.lifetime { color: #B76514; }
.question-mark { color: #ff9011; }
</style>
"#;

#[test]
fn test_html_highlighting() {
    create_default_session_globals_then(|| {
        let src = include_str!("fixtures/sample.rs");
        let html = {
            let mut out = String::new();
            write_code(&mut out, src, None, None, None);
            format!("{STYLE}<pre><code>{out}</code></pre>\n")
        };
        expect_file!["fixtures/sample.html"].assert_eq(&html);
    });
}

#[test]
fn test_dos_backline() {
    create_default_session_globals_then(|| {
        let src = "pub fn foo() {\r\n\
    println!(\"foo\");\r\n\
}\r\n";
        let mut html = String::new();
        write_code(&mut html, src, None, None, None);
        expect_file!["fixtures/dos_line.html"].assert_eq(&html);
    });
}

#[test]
fn test_keyword_highlight() {
    create_default_session_globals_then(|| {
        let src = "use crate::a::foo;
use self::whatever;
let x = super::b::foo;
let y = Self::whatever;";

        let mut html = String::new();
        write_code(&mut html, src, None, None, None);
        expect_file!["fixtures/highlight.html"].assert_eq(&html);
    });
}

#[test]
fn test_union_highlighting() {
    create_default_session_globals_then(|| {
        let src = include_str!("fixtures/union.rs");
        let mut html = String::new();
        write_code(&mut html, src, None, None, None);
        expect_file!["fixtures/union.html"].assert_eq(&html);
    });
}

#[test]
fn test_decorations() {
    create_default_session_globals_then(|| {
        let src = "let x = 1;
let y = 2;
let z = 3;
let a = 4;";
        let mut decorations = FxIndexMap::default();
        decorations.insert("example", vec![(0, 10), (11, 21)]);
        decorations.insert("example2", vec![(22, 32)]);

        let mut html = String::new();
        write_code(&mut html, src, None, Some(&DecorationInfo(decorations)), None);
        expect_file!["fixtures/decorations.html"].assert_eq(&html);
    });
}

#[bench]
fn bench_html_highlighting(b: &mut Bencher) {
    let src = include_str!("../../../../compiler/rustc_ast/src/visit.rs");

    create_default_session_globals_then(|| {
        b.iter(|| {
            let mut out = String::new();
            write_code(&mut out, src, None, None, None);
            out
        });
    });
}
