use super::*;

#[test]
fn resolves_style_extract_code_actions_from_omena_query() {
    let mut state = LspShellState::default();
    handle_lsp_message(
        &mut state,
        json!({
            "jsonrpc": "2.0",
            "method": "textDocument/didOpen",
            "params": {
                "textDocument": {
                    "uri": "file:///workspace-a/src/App.module.scss",
                    "languageId": "scss",
                    "version": 1,
                    "text": ".button { color: #ff0000; margin: 1rem; }",
                },
            },
        }),
    );

    let code_action_response = handle_lsp_message(
        &mut state,
        json!({
            "jsonrpc": "2.0",
            "id": 1,
            "method": "textDocument/codeAction",
            "params": {
                "textDocument": {
                    "uri": "file:///workspace-a/src/App.module.scss",
                },
                "range": {
                    "start": {
                        "line": 0,
                        "character": 17,
                    },
                    "end": {
                        "line": 0,
                        "character": 24,
                    },
                },
                "context": {
                    "diagnostics": [],
                },
            },
        }),
    );

    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer("/result/0/title")),
        Some(&json!("Extract CSS custom property '--extracted-color'")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer("/result/1/title")),
        Some(&json!("Extract @value 'extractedColor'")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer(
                "/result/0/edit/changes/file:~1~1~1workspace-a~1src~1App.module.scss/0/newText"
            )),
        Some(&json!(":root {\n  --extracted-color: #ff0000;\n}\n\n")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer(
                "/result/0/edit/changes/file:~1~1~1workspace-a~1src~1App.module.scss/1/newText"
            )),
        Some(&json!("var(--extracted-color)")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer("/result/0/data/source")),
        Some(&json!("omenaQueryStyleExtractCodeActions")),
    );
}

#[test]
fn resolves_style_inline_code_actions_from_omena_query() {
    let mut state = LspShellState::default();
    handle_lsp_message(
        &mut state,
        json!({
            "jsonrpc": "2.0",
            "method": "textDocument/didOpen",
            "params": {
                "textDocument": {
                    "uri": "file:///workspace-a/src/App.module.scss",
                    "languageId": "scss",
                    "version": 1,
                    "text": ".button {\n  composes: base;\n  color: red;\n}\n.base {\n  color: blue;\n  margin: 1rem;\n}",
                },
            },
        }),
    );

    let code_action_response = handle_lsp_message(
        &mut state,
        json!({
            "jsonrpc": "2.0",
            "id": 1,
            "method": "textDocument/codeAction",
            "params": {
                "textDocument": {
                    "uri": "file:///workspace-a/src/App.module.scss",
                },
                "range": {
                    "start": {
                        "line": 1,
                        "character": 12,
                    },
                    "end": {
                        "line": 1,
                        "character": 16,
                    },
                },
                "context": {
                    "diagnostics": [],
                },
            },
        }),
    );

    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer("/result/0/title")),
        Some(&json!("Inline composed class 'base'")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer("/result/0/kind")),
        Some(&json!("refactor.inline")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer(
                "/result/0/edit/changes/file:~1~1~1workspace-a~1src~1App.module.scss/0/newText"
            )),
        Some(&json!("color: blue;\n  margin: 1rem;")),
    );
    assert_eq!(
        code_action_response
            .as_ref()
            .and_then(|value| value.pointer("/result/0/data/source")),
        Some(&json!("omenaQueryStyleInlineCodeActions")),
    );
}
