rdf_parsers/sparql/
mod.rs1pub 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 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 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}