Skip to main content

rdf_parsers/sparql/
mod.rs

1pub mod parser;
2
3pub mod convert;
4pub use parser::*;
5
6#[cfg(test)]
7mod format_tests {
8    use crate::{
9        parse,
10        sparql::{Lang, Rule, SyntaxKind},
11    };
12
13    fn format_sparql(input: &str, width: usize) -> String {
14        let rule = Rule::new(SyntaxKind::QueryUnit);
15        let (result, _) = parse(rule, input);
16        let root = result.syntax::<Lang>();
17        crate::sparql::parser::format::format(&root, width)
18    }
19
20    #[test]
21    fn format_simple_select() {
22        let input = "SELECT ?s ?p ?o WHERE { ?s ?p ?o }";
23        let out = format_sparql(input, 80);
24        assert_eq!(out, "SELECT ?s ?p ?o\nWHERE {\n  ?s ?p ?o\n}\n");
25    }
26
27    #[test]
28    fn format_select_with_prefix() {
29        let input = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?s foaf:name ?name }";
30        let out = format_sparql(input, 80);
31        assert_eq!(
32            out,
33            "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n\nSELECT ?name\nWHERE {\n  ?s foaf:name ?name\n}\n"
34        );
35    }
36
37    #[test]
38    fn format_select_with_semicolon() {
39        let input = "SELECT ?s WHERE { ?s <a> <b>; <c> <d> }";
40        let out = format_sparql(input, 80);
41        assert_eq!(out, "SELECT ?s\nWHERE {\n  ?s <a> <b>; <c> <d>\n}\n");
42    }
43
44    #[test]
45    fn format_select_with_filter() {
46        let input = "SELECT ?s WHERE { ?s <a> ?o . FILTER(?o > 5) }";
47        let out = format_sparql(input, 80);
48        assert_eq!(
49            out,
50            "SELECT ?s\nWHERE {\n  ?s <a> ?o.\n  FILTER (?o>5)\n}\n"
51        );
52    }
53
54    #[test]
55    fn format_select_with_optional() {
56        let input = "SELECT ?s ?o WHERE { ?s <a> <b> . OPTIONAL { ?s <c> ?o } }";
57        let out = format_sparql(input, 80);
58        assert_eq!(
59            out,
60            "SELECT ?s ?o\nWHERE {\n  ?s <a> <b>.\n  OPTIONAL {\n    ?s <c> ?o\n  }\n\n}\n"
61        );
62    }
63
64    #[test]
65    fn format_select_with_order_by() {
66        let input = "SELECT ?s WHERE { ?s <a> <b> } ORDER BY ?s LIMIT 10";
67        let out = format_sparql(input, 80);
68        assert_eq!(
69            out,
70            "SELECT ?s\nWHERE {\n  ?s <a> <b>\n}\nORDER BY ?s\nLIMIT 10\n"
71        );
72    }
73
74    #[test]
75    fn format_select_with_group_having() {
76        let input = "SELECT ?s (COUNT(?o) AS ?c) WHERE { ?s <a> ?o } GROUP BY ?s HAVING(?c > 1)";
77        let out = format_sparql(input, 80);
78        assert_eq!(
79            out,
80            "SELECT ?s (COUNT(?o) AS  ?c)\nWHERE {\n  ?s <a> ?o\n}\nGROUP BY ?s\nHAVING (?c>1)\n"
81        );
82    }
83
84    #[test]
85    fn format_select_with_union() {
86        let input = "SELECT ?s WHERE { { ?s <a> <b> } UNION { ?s <c> <d> } }";
87        let out = format_sparql(input, 80);
88        assert_eq!(
89            out,
90            "SELECT ?s\nWHERE {\n  {\n    ?s <a> <b>\n  }\n\n  UNION\n  {\n    ?s <c> <d>\n  }\n\n}\n"
91        );
92    }
93
94    #[test]
95    fn format_construct_query() {
96        let input = "CONSTRUCT { ?s <a> ?o } WHERE { ?s <b> ?o }";
97        let out = format_sparql(input, 80);
98        assert_eq!(
99            out,
100            "CONSTRUCT {\n  ?s <a> ?o\n}\n\nWHERE {\n  ?s <b> ?o\n}\n"
101        );
102    }
103
104    #[test]
105    fn format_select_breaking() {
106        // At width 40, the SELECT line breaks but the WHERE clause triples still fit flat.
107        let input = "SELECT ?subject ?predicate ?object WHERE { ?subject ?predicate ?object }";
108        let out = format_sparql(input, 40);
109        assert_eq!(
110            out,
111            "SELECT ?subject ?predicate ?object\nWHERE {\n  ?subject ?predicate ?object\n}\n"
112        );
113    }
114
115    #[test]
116    fn format_ask_query() {
117        let input = "ASK WHERE { ?s <a> <b> }";
118        let out = format_sparql(input, 80);
119        assert_eq!(out, "ASK\nWHERE {\n  ?s <a> <b>\n}\n");
120    }
121
122    #[test]
123    fn format_describe_query() {
124        let input = "DESCRIBE <http://example.org/resource>";
125        let out = format_sparql(input, 80);
126        assert_eq!(out, "DESCRIBE <http://example.org/resource>\n");
127    }
128
129    #[test]
130    fn format_select_distinct_star() {
131        let input = "SELECT DISTINCT * WHERE { ?s ?p ?o }";
132        let out = format_sparql(input, 80);
133        assert_eq!(out, "SELECT DISTINCT *\nWHERE {\n  ?s ?p ?o\n}\n");
134    }
135
136    #[test]
137    fn format_multiple_prefixes() {
138        let input = "PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?name WHERE { ?s foaf:name ?name }";
139        let out = format_sparql(input, 80);
140        assert_eq!(
141            out,
142            "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\nPREFIX dc: <http://purl.org/dc/elements/1.1/>\n\nSELECT ?name\nWHERE {\n  ?s foaf:name ?name\n}\n"
143        );
144    }
145
146    #[test]
147    fn format_order_by_desc() {
148        let input = "SELECT ?s WHERE { ?s <a> ?o } ORDER BY DESC(?o) LIMIT 5 OFFSET 10";
149        let out = format_sparql(input, 80);
150        assert_eq!(
151            out,
152            "SELECT ?s\nWHERE {\n  ?s <a> ?o\n}\nORDER BY DESC(?o)\nLIMIT 5\nOFFSET 10\n"
153        );
154    }
155
156    #[test]
157    fn format_select_with_bind() {
158        let input = "SELECT ?s ?label WHERE { ?s <a> ?o . BIND(CONCAT(?o, \"_suffix\") AS ?label) }";
159        let out = format_sparql(input, 80);
160        assert_eq!(
161            out,
162            "SELECT ?s ?label\nWHERE {\n  ?s <a> ?o.\n  BIND (CONCAT(?o, \"_suffix\") AS ?label)\n}\n"
163        );
164    }
165
166    #[test]
167    fn format_select_with_minus() {
168        let input = "SELECT ?s WHERE { ?s <a> <b> . MINUS { ?s <c> <d> } }";
169        let out = format_sparql(input, 80);
170        assert_eq!(
171            out,
172            "SELECT ?s\nWHERE {\n  ?s <a> <b>.\n  MINUS {\n    ?s <c> <d>\n  }\n\n}\n"
173        );
174    }
175
176    #[test]
177    fn format_select_with_graph() {
178        let input = "SELECT ?s WHERE { GRAPH <http://example.org/g> { ?s <a> <b> } }";
179        let out = format_sparql(input, 80);
180        assert_eq!(
181            out,
182            "SELECT ?s\nWHERE {\n  GRAPH <http://example.org/g> {\n    ?s <a> <b>\n  }\n\n}\n"
183        );
184    }
185
186    #[test]
187    fn format_property_list_breaking() {
188        // Semicolons force a line break when the property list is too wide.
189        let input = "SELECT ?s WHERE { ?s <very-long-predicate-one> <object-one>; <very-long-predicate-two> <object-two> }";
190        let out = format_sparql(input, 40);
191        assert_eq!(
192            out,
193            "SELECT ?s\nWHERE {\n  ?s <very-long-predicate-one> <object-one>;\n  <very-long-predicate-two> <object-two>\n}\n"
194        );
195    }
196
197    #[test]
198    fn format_multiple_objects_in_list() {
199        let input = "SELECT ?s WHERE { ?s <a> <b>, <c>, <d> }";
200        let out = format_sparql(input, 80);
201        assert_eq!(out, "SELECT ?s\nWHERE {\n  ?s <a> <b>, <c>, <d>\n}\n");
202    }
203
204    #[test]
205    fn format_multiple_objects_in_list_wrapping() {
206        let input = "SELECT ?s WHERE { ?s <a> <b>, <c>, <d>, <e>, <f> }";
207        let out = format_sparql(input, 20);
208        assert_eq!(
209            out,
210            "SELECT ?s\nWHERE {\n  ?s <a> <b>,\n  <c>,\n  <d>,\n  <e>,\n  <f>\n}\n"
211        );
212    }
213}