@@ -80,3 +80,117 @@ pub(crate) fn get_statement_for_completions<'a>(
80
80
. map ( |t| t. 0 )
81
81
}
82
82
}
83
+
84
+ #[ cfg( test) ]
85
+ mod tests {
86
+ use itertools:: Itertools ;
87
+ use pgt_fs:: PgTPath ;
88
+ use pgt_text_size:: TextSize ;
89
+
90
+ use crate :: workspace:: Document ;
91
+
92
+ use super :: get_statement_for_completions;
93
+
94
+ static CURSOR_POSITION : & str = "€" ;
95
+
96
+ fn get_doc_and_pos ( sql : & str ) -> ( Document , TextSize ) {
97
+ let pos = sql
98
+ . find ( CURSOR_POSITION )
99
+ . expect ( "Please add cursor position to test sql" ) ;
100
+
101
+ let pos: u32 = pos. try_into ( ) . unwrap ( ) ;
102
+
103
+ (
104
+ Document :: new (
105
+ PgTPath :: new ( "test.sql" ) ,
106
+ sql. replace ( CURSOR_POSITION , "" ) . into ( ) ,
107
+ 5 ,
108
+ ) ,
109
+ TextSize :: new ( pos) ,
110
+ )
111
+ }
112
+
113
+ #[ test]
114
+ fn finds_matching_statement ( ) {
115
+ let sql = format ! (
116
+ r#"
117
+ select * from users;
118
+
119
+ update {}users set email = 'myemail@com';
120
+
121
+ select 1;
122
+ "# ,
123
+ CURSOR_POSITION
124
+ ) ;
125
+
126
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
127
+
128
+ let ( _, _, text) =
129
+ get_statement_for_completions ( & doc, position) . expect ( "Expected Statement" ) ;
130
+
131
+ assert_eq ! ( text, "update users set email = 'myemail@com';" )
132
+ }
133
+
134
+ #[ test]
135
+ fn does_not_break_when_no_statements_exist ( ) {
136
+ let sql = format ! ( "{}" , CURSOR_POSITION ) ;
137
+
138
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
139
+
140
+ assert_eq ! ( get_statement_for_completions( & doc, position) , None ) ;
141
+ }
142
+
143
+ #[ test]
144
+ fn does_not_return_overlapping_statements_if_too_close ( ) {
145
+ let sql = format ! ( "select * from {}select 1;" , CURSOR_POSITION ) ;
146
+
147
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
148
+
149
+ // make sure these are parsed as two
150
+ assert_eq ! ( doc. iter_statements( ) . try_len( ) . unwrap( ) , 2 ) ;
151
+
152
+ assert_eq ! ( get_statement_for_completions( & doc, position) , None ) ;
153
+ }
154
+
155
+ #[ test]
156
+ fn is_fine_with_spaces ( ) {
157
+ let sql = format ! ( "select * from {} ;" , CURSOR_POSITION ) ;
158
+
159
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
160
+
161
+ let ( _, _, text) =
162
+ get_statement_for_completions ( & doc, position) . expect ( "Expected Statement" ) ;
163
+
164
+ assert_eq ! ( text, "select * from ;" )
165
+ }
166
+
167
+ #[ test]
168
+ fn considers_offset ( ) {
169
+ let sql = format ! ( "select * from {}" , CURSOR_POSITION ) ;
170
+
171
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
172
+
173
+ let ( _, _, text) =
174
+ get_statement_for_completions ( & doc, position) . expect ( "Expected Statement" ) ;
175
+
176
+ assert_eq ! ( text, "select * from" )
177
+ }
178
+
179
+ #[ test]
180
+ fn does_not_consider_too_far_offset ( ) {
181
+ let sql = format ! ( "select * from {}" , CURSOR_POSITION ) ;
182
+
183
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
184
+
185
+ assert_eq ! ( get_statement_for_completions( & doc, position) , None ) ;
186
+ }
187
+
188
+ #[ test]
189
+ fn does_not_consider_offset_if_statement_terminated_by_semi ( ) {
190
+ let sql = format ! ( "select * from users;{}" , CURSOR_POSITION ) ;
191
+
192
+ let ( doc, position) = get_doc_and_pos ( sql. as_str ( ) ) ;
193
+
194
+ assert_eq ! ( get_statement_for_completions( & doc, position) , None ) ;
195
+ }
196
+ }
0 commit comments