def Diagnostics_ZeroBasedLineAndColumn_test(app): filepath = PathToTestFile('testy', 'Program.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) for _ in (0, 1): # First call always returns blank for some reason event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, contains( has_entries({ 'kind': equal_to('ERROR'), 'text': contains_string( "Unexpected symbol `}'', expecting identifier"), 'location': LocationMatcher(filepath, 11, 2), 'location_extent': RangeMatcher(filepath, (11, 2), (11, 2)), })))
def Diagnostics_WithRange_test(app): filepath = PathToTestFile('testy', 'DiagnosticRange.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) for _ in (0, 1): # First call always returns blank for some reason event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, contains( has_entries({ 'kind': equal_to('WARNING'), 'text': contains_string("Name should have prefix '_'"), 'location': LocationMatcher(filepath, 3, 16), 'location_extent': RangeMatcher(filepath, (3, 16), (3, 25)) })))
def Diagnostics_HandleZeroColumnDiagnostic_test(app): filepath = PathToTestFile('testy', 'ZeroColumnDiagnostic.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) for _ in (0, 1): # First call always returns blank for some reason event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, contains( has_entries({ 'kind': equal_to('ERROR'), 'text': contains_string("Unexpected symbol `}'', " "expecting `;'', `{'', or `where''"), 'location': LocationMatcher(filepath, 3, 1), 'location_extent': RangeMatcher(filepath, (3, 1), (3, 1)) })))
def Diagnostics_MultipleSolution_test(app): filepaths = [ PathToTestFile('testy', 'Program.cs'), PathToTestFile('testy-multiple-solutions', 'solution-named-like-folder', 'testy', 'Program.cs') ] lines = [11, 10] for filepath, line in zip(filepaths, lines): with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) for _ in (0, 1): # First call always returns blank for some reason event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, contains( has_entries({ 'kind': equal_to('ERROR'), 'text': contains_string("Unexpected symbol `}'', " "expecting identifier"), 'location': LocationMatcher(filepath, line, 2), 'location_extent': RangeMatcher(filepath, (line, 2), (line, 2)) })))
def test_GetCompletions_PathWithSpace(self, app): filepath = PathToTestFile('неприличное слово', 'Program.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) completion_data = BuildRequest(filepath=filepath, filetype='cs', contents=contents, line_num=9, column_num=12) response_data = app.post_json('/completions', completion_data).json print('Response: ', response_data) assert_that( response_data, has_entries({ 'completion_start_column': 12, 'completions': has_items( CompletionEntryMatcher('CursorLeft', 'CursorLeft', {'kind': 'Property'}), CompletionEntryMatcher('CursorSize', 'CursorSize', {'kind': 'Property'}), ), 'errors': empty(), }))
def Diagnostics_WithRange_test(app): filepath = PathToTestFile('testy', 'DiagnosticRange.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, has_items( has_entries({ 'kind': equal_to('ERROR'), 'text': contains_string( "A namespace cannot directly " "contain members such as fields or methods"), 'location': LocationMatcher(filepath, 1, 1), 'location_extent': RangeMatcher(filepath, (1, 1), (1, 6)) })))
def SignatureHelp_TriggerParen_test(app): filepath = PathToTestFile('testy', 'ContinuousTest.cs') contents = ReadFile(filepath) request = BuildRequest(line_num=10, column_num=9, filetypes=['cs'], filepath=filepath, contents=contents) with WrapOmniSharpServer(app, filepath): response = app.post_json('/signature_help', request).json LOGGER.debug('response = %s', response) assert_that( response, has_entries({ 'errors': empty(), 'signature_help': has_entries({ 'activeSignature': 0, 'activeParameter': 0, 'signatures': contains( SignatureMatcher( 'void ContinuousTest.Main(string[] args)', [ParameterMatcher(25, 38)])) }) }))
def test_Subcommands_OrganizeImports(self, app): filepath = PathToTestFile('testy', 'ImportTest.cs') with WrapOmniSharpServer(app, filepath): request = BuildRequest(command_arguments=['OrganizeImports'], line_num=11, column_num=2, contents=ReadFile(filepath), filetype='cs', filepath=filepath) response = app.post_json('/run_completer_command', request).json print('completer response = ', response) assert_that( response, has_entries({ 'fixits': contains_exactly( has_entries({ 'location': LocationMatcher(filepath, 11, 2), 'chunks': contains_exactly( ChunkMatcher( ' ', LocationMatcher(filepath, 5, 1), LocationMatcher(filepath, 5, 2), ), ChunkMatcher( '', LocationMatcher(filepath, 1, 1), LocationMatcher(filepath, 3, 1), )) })) }))
def Subcommands_FixIt_Single_test(app): fixit_test = PathToTestFile('testy', 'FixItTestCase.cs') with WrapOmniSharpServer(app, fixit_test): contents = ReadFile(fixit_test) request = BuildRequest(completer_target='filetype_default', command_arguments=['FixIt'], line_num=4, column_num=23, contents=contents, filetype='cs', filepath=fixit_test) response = app.post_json('/run_completer_command', request).json LOGGER.debug('r = %s', response) assert_that( response, has_entries({ 'fixits': contains( has_entries({ 'location': LocationMatcher(fixit_test, 4, 23), 'chunks': contains( has_entries({ 'replacement_text': '\n {\n NewMethod();\n }\n\n' ' private static void NewMethod()\n {\r\n', 'range': RangeMatcher(fixit_test, (3, 31), (4, 1)) })) })) }))
def Diagnostics_WithRange_test(app): filepath = PathToTestFile('testy', 'DiagnosticRange.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, contains( has_entries({ 'kind': equal_to('WARNING'), 'text': contains_string( "The variable '\u4e5d' is assigned but its value is never used" ), 'location': LocationMatcher(filepath, 6, 13), 'location_extent': RangeMatcher(filepath, (6, 13), (6, 16)) })))
def Subcommands_GoToImplementationElseDeclaration_MultipleImplementations_test( app ): filepath = PathToTestFile( 'testy', 'GotoTestCase.cs' ) with WrapOmniSharpServer( app, filepath ): contents = ReadFile( filepath ) goto_data = BuildRequest( completer_target = 'filetype_default', command_arguments = [ 'GoToImplementationElseDeclaration' ], line_num = 21, column_num = 13, contents = contents, filetype = 'cs', filepath = filepath ) eq_( [ { 'filepath': PathToTestFile( 'testy', 'GotoTestCase.cs' ), 'line_num': 43, 'column_num': 3 }, { 'filepath': PathToTestFile( 'testy', 'GotoTestCase.cs' ), 'line_num': 48, 'column_num': 3 } ], app.post_json( '/run_completer_command', goto_data ).json )
def StopServer_KeepLogFiles(app): filepath = PathToTestFile('testy', 'GotoTestCase.cs') with WrapOmniSharpServer(app, filepath): event_data = BuildRequest(filetype='cs', filepath=filepath) response = app.post_json('/debug_info', event_data).json logfiles = [] for server in response['completer']['servers']: logfiles.extend(server['logfiles']) try: for logfile in logfiles: assert_that(os.path.exists(logfile), f'Logfile should exist at { logfile }') finally: app.post_json( '/run_completer_command', BuildRequest(filetype='cs', filepath=filepath, command_arguments=['StopServer'])) if user_options_store.Value('server_keep_logfiles'): for logfile in logfiles: assert_that(os.path.exists(logfile), f'Logfile should still exist at { logfile }') else: for logfile in logfiles: assert_that(not os.path.exists(logfile), f'Logfile should no longer exist at { logfile }')
def Diagnostics_ZeroBasedLineAndColumn_test(app): filepath = PathToTestFile('testy', 'Program.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, has_items( has_entries({ 'kind': equal_to('ERROR'), 'text': contains_string("Identifier expected"), 'location': LocationMatcher(filepath, 10, 12), 'location_extent': RangeMatcher(filepath, (10, 12), (10, 12)), })))
def GetCompletions_Basic_NoSigHelp_test( app ): filepath = PathToTestFile( 'testy', 'Program.cs' ) with WrapOmniSharpServer( app, filepath ): WaitUntilCsCompleterIsReady( app, filepath ) contents = ReadFile( filepath ) completion_data = BuildRequest( filepath = filepath, filetype = 'cs', contents = contents, line_num = 10, column_num = 12 ) response_data = app.post_json( '/completions', completion_data ).json print( 'Response: ', response_data ) assert_that( response_data, has_entries( { 'completion_start_column': 12, 'completions': has_items( CompletionEntryMatcher( 'CursorLeft', 'CursorLeft', { 'kind': 'Property' } ), CompletionEntryMatcher( 'CursorSize', 'CursorSize', { 'kind': 'Property' } ), ), 'errors': empty(), } ) )
def Diagnostics_MultipleSolution_test(app): filepaths = [ PathToTestFile('testy', 'Program.cs'), PathToTestFile('testy-multiple-solutions', 'solution-named-like-folder', 'testy', 'Program.cs') ] for filepath in filepaths: with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) results = app.post_json('/event_notification', event_data).json assert_that( results, has_items( has_entries({ 'kind': equal_to('ERROR'), 'text': contains_string("Identifier expected"), 'location': LocationMatcher(filepath, 10, 12), 'location_extent': RangeMatcher(filepath, (10, 12), (10, 12)) })))
def test_SignatureHelp_TriggerComma(self, app): filepath = PathToTestFile('testy', 'ContinuousTest.cs') contents = ReadFile(filepath) request = BuildRequest(line_num=17, column_num=16, filetypes=['cs'], filepath=filepath, contents=contents) with WrapOmniSharpServer(app, filepath): response = app.post_json('/signature_help', request).json LOGGER.debug('response = %s', response) assert_that( response, has_entries({ 'errors': empty(), 'signature_help': has_entries({ 'activeSignature': 0, 'activeParameter': 1, 'signatures': contains_exactly( SignatureMatcher( 'void ContinuousTest.MultiArg(int i, string s)', [ ParameterMatcher(29, 34), ParameterMatcher(36, 44) ])) }) }))
def GetCompletions_NonForcedReturnsNoResults_test(app): filepath = PathToTestFile('testy', 'ContinuousTest.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) event_data = BuildRequest(filepath=filepath, filetype='cs', contents=contents, event_name='FileReadyToParse') app.post_json('/event_notification', event_data) completion_data = BuildRequest(filepath=filepath, filetype='cs', contents=contents, line_num=9, column_num=21, force_semantic=False, query='Date') results = app.post_json('/completions', completion_data).json # There are no semantic completions. However, we fall back to identifier # completer in this case. assert_that( results, has_entries({ 'completions': has_item( has_entries({ 'insertion_text': 'String', 'extra_menu_info': '[ID]', })), 'errors': empty(), }))
def Subcommands_FixIt_Single_test(app): fixit_test = PathToTestFile('testy', 'FixItTestCase.cs') with WrapOmniSharpServer(app, fixit_test, wait_for_diags=False): contents = ReadFile(fixit_test) request = BuildRequest(completer_target='filetype_default', command_arguments=['FixIt'], line_num=4, column_num=17, contents=contents, filetype='cs', filepath=fixit_test) response = app.post_json('/run_completer_command', request).json LOGGER.debug('r = %s', response) assert_that( response, has_entries({ 'fixits': contains_exactly( has_entries({ 'location': LocationMatcher(fixit_test, 4, 17), 'chunks': contains_exactly( has_entries({ 'replacement_text': 'var', 'range': RangeMatcher(fixit_test, (4, 13), (4, 16)) })) })) }))
def Subcommands_RefactorRename_Unicode_test(app): unicode_test = PathToTestFile('testy', 'Unicode.cs') with WrapOmniSharpServer(app, unicode_test, wait_for_diags=False): contents = ReadFile(unicode_test) request = BuildRequest(completer_target='filetype_default', command_arguments=['RefactorRename', 'x'], line_num=30, column_num=31, contents=contents, filetype='cs', filepath=unicode_test) response = app.post_json('/run_completer_command', request).json assert_that( response, has_entries({ 'fixits': contains_exactly( has_entries({ 'location': LocationMatcher(unicode_test, 30, 31), 'chunks': contains_exactly( has_entries({ 'replacement_text': 'x', 'range': RangeMatcher(unicode_test, (30, 29), (30, 35)) })) })) }))
def GetCompletions_MultipleSolution_test(app): filepaths = [ PathToTestFile('testy', 'Program.cs'), PathToTestFile('testy-multiple-solutions', 'solution-named-like-folder', 'testy', 'Program.cs') ] for filepath in filepaths: with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) completion_data = BuildRequest(filepath=filepath, filetype='cs', contents=contents, line_num=10, column_num=12) response_data = app.post_json('/completions', completion_data).json print('Response: ', response_data) assert_that( response_data, has_entries({ 'completion_start_column': 12, 'completions': has_items( CompletionEntryMatcher('CursorLeft', 'CursorLeft', {'kind': 'Property'}), CompletionEntryMatcher('CursorSize', 'CursorSize', {'kind': 'Property'}), ), 'errors': empty(), }))
def GetCompletions_Unicode_test(app): filepath = PathToTestFile('testy', 'Unicode.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) completion_data = BuildRequest(filepath=filepath, filetype='cs', contents=contents, line_num=43, column_num=26) response_data = app.post_json('/completions', completion_data).json assert_that( response_data, has_entries({ 'completion_start_column': 26, 'completions': has_items( CompletionEntryMatcher('DoATest'), CompletionEntryMatcher('an_int'), CompletionEntryMatcher('a_unicøde'), CompletionEntryMatcher('øøø'), ), 'errors': empty(), }))
def GetCompletions_ImportsOrderedAfter_test( app ): filepath = PathToTestFile( 'testy', 'ImportTest.cs' ) with WrapOmniSharpServer( app, filepath ): contents = ReadFile( filepath ) completion_data = BuildRequest( filepath = filepath, filetype = 'cs', contents = contents, line_num = 9, column_num = 12, force_semantic = True, query = 'Date' ) response_data = app.post_json( '/completions', completion_data ).json min_import_index = min( loc for loc, val in enumerate( response_data[ 'completions' ] ) if val[ 'extra_data' ][ 'required_namespace_import' ] ) max_nonimport_index = max( loc for loc, val in enumerate( response_data[ 'completions' ] ) if not val[ 'extra_data' ][ 'required_namespace_import' ] ) assert_that( min_import_index, greater_than( max_nonimport_index ) ),
def Subcommands_RefactorRename_Basic_test(app): continuous_test = PathToTestFile('testy', 'ContinuousTest.cs') with WrapOmniSharpServer(app, continuous_test): contents = ReadFile(continuous_test) request = BuildRequest(completer_target='filetype_default', command_arguments=['RefactorRename', 'x'], line_num=5, column_num=15, contents=contents, filetype='cs', filepath=continuous_test) response = app.post_json('/run_completer_command', request).json assert_that( response, has_entries({ 'fixits': contains( has_entries({ 'location': LocationMatcher(continuous_test, 5, 15), 'chunks': contains( has_entries({ 'replacement_text': 'x', 'range': RangeMatcher(continuous_test, (5, 15), (5, 29)) })) })) }))
def Diagnostics_Basic_test(app): filepath = PathToTestFile('testy', 'Program.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) event_data = BuildRequest(filepath=filepath, event_name='FileReadyToParse', filetype='cs', contents=contents) app.post_json('/event_notification', event_data) diag_data = BuildRequest(filepath=filepath, filetype='cs', contents=contents, line_num=11, column_num=2) results = app.post_json('/detailed_diagnostic', diag_data).json assert_that( results, has_entry( 'message', contains_string( "'Console' does not contain a definition for ''")))
def Subcommands_RefactorRename_MultiFile_test( app ): continuous_test = PathToTestFile( 'testy', 'ContinuousTest.cs' ) fixit_test = PathToTestFile( 'testy', 'FixItTestCase.cs' ) get_type_test = PathToTestFile( 'testy', 'GetTypeTestCase.cs' ) goto_test = PathToTestFile( 'testy', 'GotoTestCase.cs' ) import_test = PathToTestFile( 'testy', 'ImportTest.cs' ) program = PathToTestFile( 'testy', 'Program.cs' ) get_doc_test = PathToTestFile( 'testy', 'GetDocTestCase.cs' ) unicode_test = PathToTestFile( 'testy', 'Unicode.cs' ) with WrapOmniSharpServer( app, continuous_test ): contents = ReadFile( continuous_test ) request = BuildRequest( completer_target = 'filetype_default', command_arguments = [ 'RefactorRename', 'x' ], line_num = 3, column_num = 11, contents = contents, filetype = 'cs', filepath = continuous_test ) response = app.post_json( '/run_completer_command', request ).json print( 'response = ', response ) assert_that( response, has_entries( { 'fixits': contains_exactly( has_entries( { 'location': LocationMatcher( continuous_test, 3, 11 ), 'chunks': contains_exactly( has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( continuous_test, ( 3, 11 ), ( 3, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( fixit_test, ( 1, 11 ), ( 1, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( get_doc_test, ( 4, 11 ), ( 4, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( get_type_test, ( 2, 11 ), ( 2, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( goto_test, ( 4, 11 ), ( 4, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( import_test, ( 3, 11 ), ( 3, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( program, ( 3, 11 ), ( 3, 16 ) ) } ), has_entries( { 'replacement_text': 'x', 'range': RangeMatcher( unicode_test, ( 4, 11 ), ( 4, 16 ) ) } ), ) } ) ) } ) )
def SignatureHelp_MultipleSignatures_test( app ): filepath = PathToTestFile( 'testy', 'ContinuousTest.cs' ) contents = ReadFile( filepath ) request = BuildRequest( line_num = 18, column_num = 15, filetypes = [ 'cs' ], filepath = filepath, contents = contents ) with WrapOmniSharpServer( app, filepath ): response = app.post_json( '/signature_help', request ).json LOGGER.debug( 'response = %s', response ) assert_that( response, has_entries( { 'errors': empty(), 'signature_help': has_entries( { 'activeSignature': 0, 'activeParameter': 0, 'signatures': contains_exactly( SignatureMatcher( 'void ContinuousTest.Overloaded(int i, int a)', [ ParameterMatcher( 31, 36 ), ParameterMatcher( 38, 43 ) ] ), SignatureMatcher( 'void ContinuousTest.Overloaded(string s)', [ ParameterMatcher( 31, 39 ) ] ), ) } ) } ) ) request[ 'column_num' ] = 20 with WrapOmniSharpServer( app, filepath ): response = app.post_json( '/signature_help', request ).json LOGGER.debug( 'response = %s', response ) assert_that( response, has_entries( { 'errors': empty(), 'signature_help': has_entries( { 'activeSignature': 0, 'activeParameter': 1, 'signatures': contains_exactly( SignatureMatcher( 'void ContinuousTest.Overloaded(int i, int a)', [ ParameterMatcher( 31, 36 ), ParameterMatcher( 38, 43 ) ] ), SignatureMatcher( 'void ContinuousTest.Overloaded(string s)', [ ParameterMatcher( 31, 39 ) ] ), ) } ) } ) )
def GetCompletions_ReloadSolution_Basic_test(app): filepath = PathToTestFile('testy', 'Program.cs') with WrapOmniSharpServer(app, filepath): result = app.post_json( '/run_completer_command', BuildRequest(completer_target='filetype_default', command_arguments=['ReloadSolution'], filepath=filepath, filetype='cs')).json eq_(result, True)
def Subcommands_FixIt_Multi_test(app): fixit_test = PathToTestFile('testy', 'FixItTestCase.cs') with WrapOmniSharpServer(app, fixit_test): contents = ReadFile(fixit_test) request = BuildRequest(completer_target='filetype_default', command_arguments=['FixIt'], line_num=4, column_num=27, contents=contents, filetype='cs', filepath=fixit_test) response = app.post_json('/run_completer_command', request).json assert_that( response, has_entries({ 'fixits': contains( has_entries({ 'text': 'Introduce constant', 'command': has_entries({'index': 0}), 'resolve': True }), has_entries({ 'text': 'Convert to binary', 'command': has_entries({'index': 1}), 'resolve': True }), has_entries({ 'text': 'Convert to hex', 'command': has_entries({'index': 2}), 'resolve': True }), ) })) request.pop('command_arguments') request.update({'fixit': response['fixits'][1]}) response = app.post_json('/resolve_fixit', request).json LOGGER.debug('r = %s', response) assert_that( response, has_entries({ 'fixits': contains( has_entries({ 'location': LocationMatcher(fixit_test, 4, 27), 'chunks': contains(has_entries({ 'replacement_text': '0b101', })) })) }))
def Subcommands_FixIt_NoFixitsFound_test(app): fixit_test = PathToTestFile('testy', 'FixItTestCase.cs') with WrapOmniSharpServer(app, fixit_test): contents = ReadFile(fixit_test) request = BuildRequest(completer_target='filetype_default', command_arguments=['FixIt'], line_num=1, column_num=1, contents=contents, filetype='cs', filepath=fixit_test) response = app.post_json('/run_completer_command', request).json assert_that(response, has_entries({'fixits': empty()}))
def Subcommands_GetType_VariableUsage_test(app): filepath = PathToTestFile('testy', 'GetTypeTestCase.cs') with WrapOmniSharpServer(app, filepath): contents = ReadFile(filepath) gettype_data = BuildRequest(completer_target='filetype_default', command_arguments=['GetType'], line_num=6, column_num=5, contents=contents, filetype='cs', filepath=filepath) response = app.post_json('/run_completer_command', gettype_data).json assert_that(response, has_entry('message', 'string str'))