@@ -1019,68 +1019,136 @@ describe('opencode LSP completion', function()
10191019 end )
10201020
10211021 it (' embeds the original item in data._opencode_item' , function ()
1022- package.loaded [' blink.cmp' ] = nil
1023- package.loaded [' opencode.lsp.opencode_ls' ] = nil
1024- ls = require (' opencode.lsp.opencode_ls' )
1025-
1026- package.loaded [' opencode.ui.completion' ] = nil
1027- local completion = require (' opencode.ui.completion' )
1028- completion ._sources = {}
1029-
1030- local original_item = {
1031- label = ' OriginalItem' ,
1032- kind = ' file' ,
1033- kind_icon = ' ' ,
1034- insert_text = ' OriginalItem' ,
1035- source_name = ' data_test_source' ,
1036- data = { custom = ' value' },
1037- }
1038-
1039- completion .register_source ({
1040- name = ' data_test_source' ,
1041- priority = 1 ,
1042- complete = function ()
1043- return Promise .new ():resolve ({ original_item })
1044- end ,
1045- get_trigger_character = function ()
1046- return ' @'
1047- end ,
1048- })
1049-
1050- vim .api .nvim_buf_get_lines = function ()
1051- return { ' @test' }
1052- end
1053- vim .api .nvim_get_current_line = function ()
1054- return ' @test'
1055- end
1056- vim .api .nvim_win_get_cursor = function ()
1057- return { 1 , 5 }
1058- end
1059-
1060- local config_obj = ls .create_config ()
1061- local server = config_obj .cmd ({}, {})
1062-
1063- local done = false
1064- local callback_result = nil
1065- server .request (' textDocument/completion' , {
1066- position = { line = 0 , character = 5 },
1067- }, function (err , result )
1068- callback_result = result
1069- done = true
1070- end )
1071-
1072- vim .wait (200 , function ()
1073- return done
1074- end )
1075-
1076- assert .is_not_nil (callback_result )
1077- assert .are .equal (1 , # callback_result .items )
1078- local lsp_item = callback_result .items [1 ]
1079- assert .is_not_nil (lsp_item .data )
1080- assert .is_not_nil (lsp_item .data ._opencode_item )
1081- assert .are .equal (original_item .label , lsp_item .data ._opencode_item .label )
1082- assert .are .equal (' value' , lsp_item .data ._opencode_item .data .custom )
1083- end )
1022+ package.loaded [' blink.cmp' ] = nil
1023+ package.loaded [' opencode.lsp.opencode_ls' ] = nil
1024+ ls = require (' opencode.lsp.opencode_ls' )
1025+
1026+ package.loaded [' opencode.ui.completion' ] = nil
1027+ local completion = require (' opencode.ui.completion' )
1028+ completion ._sources = {}
1029+
1030+ local original_item = {
1031+ label = ' OriginalItem' ,
1032+ kind = ' file' ,
1033+ kind_icon = ' ' ,
1034+ insert_text = ' OriginalItem' ,
1035+ source_name = ' data_test_source' ,
1036+ data = { custom = ' value' },
1037+ }
1038+
1039+ completion .register_source ({
1040+ name = ' data_test_source' ,
1041+ priority = 1 ,
1042+ complete = function ()
1043+ return Promise .new ():resolve ({ original_item })
1044+ end ,
1045+ get_trigger_character = function ()
1046+ return ' @'
1047+ end ,
1048+ })
1049+
1050+ vim .api .nvim_buf_get_lines = function ()
1051+ return { ' @test' }
1052+ end
1053+ vim .api .nvim_get_current_line = function ()
1054+ return ' @test'
1055+ end
1056+ vim .api .nvim_win_get_cursor = function ()
1057+ return { 1 , 5 }
1058+ end
1059+
1060+ local config_obj = ls .create_config ()
1061+ local server = config_obj .cmd ({}, {})
1062+
1063+ local done = false
1064+ local callback_result = nil
1065+ server .request (' textDocument/completion' , {
1066+ position = { line = 0 , character = 5 },
1067+ }, function (err , result )
1068+ callback_result = result
1069+ done = true
1070+ end )
1071+
1072+ vim .wait (200 , function ()
1073+ return done
1074+ end )
1075+
1076+ assert .is_not_nil (callback_result )
1077+ assert .are .equal (1 , # callback_result .items )
1078+ local lsp_item = callback_result .items [1 ]
1079+ assert .is_not_nil (lsp_item .data )
1080+ assert .is_not_nil (lsp_item .data ._opencode_item )
1081+ assert .are .equal (original_item .label , lsp_item .data ._opencode_item .label )
1082+ assert .are .equal (' value' , lsp_item .data ._opencode_item .data .custom )
1083+ end )
1084+
1085+ it (' calculates correct textEdit range to replace typed word' , function ()
1086+ package.loaded [' blink.cmp' ] = nil
1087+ package.loaded [' opencode.lsp.opencode_ls' ] = nil
1088+ ls = require (' opencode.lsp.opencode_ls' )
1089+
1090+ package.loaded [' opencode.ui.completion' ] = nil
1091+ local completion = require (' opencode.ui.completion' )
1092+ completion ._sources = {}
1093+
1094+ local item_for_range_test = {
1095+ label = ' tests' ,
1096+ kind = ' file' ,
1097+ kind_icon = ' ' ,
1098+ insert_text = ' tests' ,
1099+ source_name = ' range_test_source' ,
1100+ data = {},
1101+ }
1102+
1103+ completion .register_source ({
1104+ name = ' range_test_source' ,
1105+ priority = 1 ,
1106+ complete = function ()
1107+ return Promise .new ():resolve ({ item_for_range_test })
1108+ end ,
1109+ get_trigger_character = function ()
1110+ return ' @'
1111+ end ,
1112+ })
1113+
1114+ vim .api .nvim_buf_get_lines = function ()
1115+ return { ' @te' }
1116+ end
1117+ vim .api .nvim_get_current_line = function ()
1118+ return ' @te'
1119+ end
1120+ vim .api .nvim_win_get_cursor = function ()
1121+ return { 1 , 3 }
1122+ end
1123+
1124+ local config_obj = ls .create_config ()
1125+ local server = config_obj .cmd ({}, {})
1126+
1127+ local done = false
1128+ local callback_result = nil
1129+ server .request (' textDocument/completion' , {
1130+ position = { line = 0 , character = 3 },
1131+ }, function (err , result )
1132+ callback_result = result
1133+ done = true
1134+ end )
1135+
1136+ vim .wait (200 , function ()
1137+ return done
1138+ end )
1139+
1140+ assert .is_not_nil (callback_result )
1141+ assert .are .equal (1 , # callback_result .items )
1142+ local lsp_item = callback_result .items [1 ]
1143+ assert .is_not_nil (lsp_item .textEdit )
1144+ assert .is_not_nil (lsp_item .textEdit .range )
1145+
1146+ local range = lsp_item .textEdit .range
1147+ assert .are .equal (1 , range .start .character , ' start should be at trigger char position + 1' )
1148+ assert .are .equal (3 , range [' end' ].character , ' end should be at cursor position' )
1149+ assert .are .equal (0 , range .start .line , ' line should be 0' )
1150+ assert .are .equal (0 , range [' end' ].line , ' line should be 0' )
1151+ end )
10841152 end )
10851153 end )
10861154end )
0 commit comments