public void doTest(String input, List<SourceFile> files, String expected) {
    testEditor = configureEditor("Test.kt", input);

    if (files != null) {
      for (SourceFile file : files) {
        createSourceFile(file.getName(), file.getContent());
      }
    }

    testEditor.save();
    joinBuildThread();

    try {
      IMarker[] markers =
          testEditor.getEditingFile().findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
      List<IMarkerResolution> resolutions = collectResolutions(markers);
      for (IMarkerResolution resolution : resolutions) {
        resolution.run(null);
      }
    } catch (CoreException e) {
      throw new RuntimeException(e);
    }

    EditorTestUtils.assertByEditor(testEditor.getEditor(), expected);
  }
  @Override
  protected void performTest(String fileText, String expected) {
    IFile file = testEditor.getEditingFile();

    Character typedCharacter = TypingUtils.typedCharacter(fileText);
    if (typedCharacter != null) {
      testEditor.type(typedCharacter);
    }

    for (DiagnosticAnnotation annotation :
        DiagnosticAnnotationUtil.INSTANCE.createParsingDiagnosticAnnotations(file)) {
      AnnotationManager.addProblemMarker(annotation, file);
    }

    try {
      IMarker[] markers =
          testEditor.getEditingFile().findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
      String actual = insertTagsForErrors(EditorUtil.getSourceCode(getEditor()), markers);

      EditorTestUtils.assertByStringWithOffset(actual, expected);
    } catch (CoreException e) {
      KotlinLogger.logAndThrow(e);
    }
  }