summaryrefslogtreecommitdiff
path: root/support/texlab/src/completion/latex/tikz_lib.rs
blob: fb51fd72297360a3f763114bd3a6e503671e3f75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
use super::combinators::{self, Parameter};
use crate::{
    completion::types::{Item, ItemData},
    feature::FeatureRequest,
    protocol::CompletionParams,
    syntax::LANGUAGE_DATA,
};
use std::iter;

pub async fn complete_latex_pgf_libraries<'a>(
    req: &'a FeatureRequest<CompletionParams>,
    items: &mut Vec<Item<'a>>,
) {
    let param = Parameter {
        name: "usepgflibrary",
        index: 0,
    };
    combinators::argument(req, iter::once(param), |ctx| async move {
        for name in &LANGUAGE_DATA.pgf_libraries {
            let item = Item::new(ctx.range, ItemData::PgfLibrary { name });
            items.push(item);
        }
    })
    .await;
}

pub async fn complete_latex_tikz_libraries<'a>(
    req: &'a FeatureRequest<CompletionParams>,
    items: &mut Vec<Item<'a>>,
) {
    let param = Parameter {
        name: "usetikzlibrary",
        index: 0,
    };
    combinators::argument(req, iter::once(param), |ctx| async move {
        for name in &LANGUAGE_DATA.tikz_libraries {
            let item = Item::new(ctx.range, ItemData::TikzLibrary { name });
            items.push(item);
        }
    })
    .await;
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::feature::FeatureTester;

    #[tokio::test]
    async fn empty_latex_document_pgf() {
        let req = FeatureTester::new()
            .file("main.tex", "")
            .main("main.tex")
            .position(0, 0)
            .test_completion_request()
            .await;
        let mut actual_items = Vec::new();

        complete_latex_pgf_libraries(&req, &mut actual_items).await;

        assert!(actual_items.is_empty());
    }

    #[tokio::test]
    async fn empty_bibtex_document_pgf() {
        let req = FeatureTester::new()
            .file("main.bib", "")
            .main("main.bib")
            .position(0, 0)
            .test_completion_request()
            .await;
        let mut actual_items = Vec::new();

        complete_latex_pgf_libraries(&req, &mut actual_items).await;

        assert!(actual_items.is_empty());
    }

    #[tokio::test]
    async fn empty_latex_document_tikz() {
        let req = FeatureTester::new()
            .file("main.tex", "")
            .main("main.tex")
            .position(0, 0)
            .test_completion_request()
            .await;
        let mut actual_items = Vec::new();

        complete_latex_tikz_libraries(&req, &mut actual_items).await;

        assert!(actual_items.is_empty());
    }

    #[tokio::test]
    async fn empty_bibtex_document_tikz() {
        let req = FeatureTester::new()
            .file("main.bib", "")
            .main("main.bib")
            .position(0, 0)
            .test_completion_request()
            .await;
        let mut actual_items = Vec::new();

        complete_latex_tikz_libraries(&req, &mut actual_items).await;

        assert!(actual_items.is_empty());
    }

    #[tokio::test]
    async fn pgf_library() {
        let req = FeatureTester::new()
            .file("main.tex", r#"\usepgflibrary{}"#)
            .main("main.tex")
            .position(0, 15)
            .test_completion_request()
            .await;
        let mut actual_items = Vec::new();

        complete_latex_pgf_libraries(&req, &mut actual_items).await;

        assert!(!actual_items.is_empty());
    }

    #[tokio::test]
    async fn tikz_library() {
        let req = FeatureTester::new()
            .file("main.tex", r#"\usetikzlibrary{}"#)
            .main("main.tex")
            .position(0, 16)
            .test_completion_request()
            .await;
        let mut actual_items = Vec::new();

        complete_latex_tikz_libraries(&req, &mut actual_items).await;

        assert!(!actual_items.is_empty());
    }
}