package mmrnmhrm.ui.editor.ref;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import static melnorme.utilbox.core.CoreUtil.listFrom;
import static melnorme.utilbox.misc.ArrayUtil.nullToEmpty;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import dtool.ast.definitions.EArcheType;
import dtool.ddoc.TextUI;
import dtool.engine.operations.DeeNamedElementLabelProvider;
import dtool.engine.util.NamedElementUtil;
import dtool.sourcegen.AnnotatedSource;
import dtool.sourcegen.AnnotatedSource.MetadataEntry;
import melnorme.lang.ide.ui.editor.structure.AbstractLangStructureEditor;
import melnorme.lang.tooling.symbols.INamedElement;
import melnorme.util.swt.SWTTestUtils;
import melnorme.utilbox.misc.Location;
import melnorme.utilbox.misc.MiscUtil;
import melnorme.utilbox.misc.ReflectionUtils;
import mmrnmhrm.core.engine.CoreResolverSourceTests;
import mmrnmhrm.core.engine.DeeLanguageEngine;
import mmrnmhrm.ui.CommonDeeUITest;
import mmrnmhrm.ui.editor.codeassist.DeeContentAssistProposal;
public class ContentAssistUISourceTests extends CoreResolverSourceTests {
static {
MiscUtil.loadClass(CommonDeeUITest.class);
}
public ContentAssistUISourceTests(String testUIDescription, File file) {
super(testUIDescription, file);
}
protected static AbstractLangStructureEditor editor;
@Override
public void cleanupTestCase() {
super.cleanupTestCase();
SWTTestUtils.________________clearEventQueue________________();
}
@Override
public void prepareTestCase_do(String explicitModuleName, String projectFolderName, AnnotatedSource testCase)
throws CoreException, IOException {
super.prepareTestCase_do(explicitModuleName, projectFolderName, testCase);
IFile file = (IFile) overlayedFile;
editor = CommonDeeUITest.openDeeEditorForFile(file);
ContentAssistant ca = ContentAssistUI_CommonTest.getContentAssistant(editor);
ca.enableAutoInsert(false);
ca.enablePrefixCompletion(false);
SWTTestUtils.________________clearEventQueue________________();
}
@Override
public void runRefSearchTest_________(RefSearchOptions options) {
try {
testComputeProposalsWithRepLen(options.offset, options.expectedResults);
} catch (NoSuchFieldException e) {
throw melnorme.utilbox.core.ExceptionAdapter.unchecked(e);
}
}
public void testComputeProposalsWithRepLen(int offset, String... expectedResults) throws NoSuchFieldException {
ContentAssistant ca = ContentAssistUI_CommonTest.getContentAssistant(editor);
ReflectionUtils.invokeMethod(ca, "hide"); //ca.hide();
SWTTestUtils.________________clearEventQueue________________();
Location previousOverride = DeeLanguageEngine.compilerPathOverride;
try {
DeeLanguageEngine.compilerPathOverride = COMPILER_PATH;
ContentAssistUI_CommonTest.invokeContentAssist(editor, offset);
} finally {
DeeLanguageEngine.compilerPathOverride = previousOverride;
}
Object completionProposalPopup = ReflectionUtils.readField(ca, "fProposalPopup");
ICompletionProposal[] proposals = (ICompletionProposal[])
ReflectionUtils.readField(completionProposalPopup, "fComputedProposals");
ICompletionProposal[] filtered = (ICompletionProposal[])
ReflectionUtils.readField(completionProposalPopup, "fFilteredProposals");
if(nullToEmpty(proposals).length == 0) {
assertTrue(filtered.length == 0 ||
(filtered.length == 1 && filtered[0].getClass().getSimpleName().endsWith("EmptyProposal")));
} else {
assertEqualArrays(proposals, filtered);
}
checkProposals(proposals, expectedResults);
}
protected void checkProposals(ICompletionProposal[] proposals, String... expectedResults) {
List<INamedElement> results = proposalResultsToDefUnit(proposals);
checkResults(results, expectedResults);
}
@Override
public void precheckOriginalResults(Iterable<INamedElement> resultDefElementsOriginal) {
for (INamedElement defElement : resultDefElementsOriginal) {
TextUI.getLabelForHoverSignature(defElement);
DeeNamedElementLabelProvider.getLabelForContentAssistPopup(defElement);
}
}
public List<INamedElement> proposalResultsToDefUnit(ICompletionProposal[] proposals) {
ArrayList<INamedElement> results = new ArrayList<>();
for(ICompletionProposal completionProposal : listFrom(proposals)) {
if(completionProposal instanceof DeeContentAssistProposal) {
DeeContentAssistProposal deeProposal = (DeeContentAssistProposal) completionProposal;
results.add(deeProposal.namedElement);
}
}
return results;
}
@Override
public void removeDefUnitsFromExpected(LinkedList<INamedElement> resultDefUnits) {
for (ListIterator<INamedElement> iterator = resultDefUnits.listIterator(); iterator.hasNext(); ) {
INamedElement defElement = iterator.next();
if(defElement.getArcheType() == EArcheType.Module) {
String fqName = NamedElementUtil.getElementTypedLabel(defElement);
if(fqName.equals("object/") || fqName.equals("std.stdio/")) {
iterator.remove();
}
}
}
}
/* ----------------- Find def cases - don't test that ----------------- */
@Override
protected void runFindTest_________(MetadataEntry mde) {
}
@Override
protected void runFindFailTest_________(MetadataEntry mde) {
}
@Override
protected void runFindMissingTest_________(MetadataEntry mde) {
}
}