/*******************************************************************************
* Copyright (c) 2012 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package dtool.engine.analysis;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import static melnorme.utilbox.misc.MiscUtil.nullToOther;
import java.io.File;
import melnorme.lang.tooling.context.EmptySemanticResolution;
import melnorme.utilbox.misc.Location;
import dtool.ast.references.NamedReference;
import dtool.engine.operations.CodeCompletionOperation;
import dtool.engine.operations.DeeSymbolCompletionResult;
import dtool.engine.operations.FindDefinitionOperation;
import dtool.engine.operations.FindDefinitionResult;
import dtool.engine.tests.BaseResolverSourceTests;
import dtool.engine.tests.TestsSimpleModuleResolver;
import dtool.parser.DeeParser;
import dtool.parser.DeeParserResult.ParsedModule;
import dtool.sourcegen.AnnotatedSource;
import dtool.sourcegen.AnnotatedSource.MetadataEntry;
public class ResolverSourceTests extends BaseResolverSourceTests {
public ResolverSourceTests(String testUIDescription, File file) {
super(testUIDescription, file);
}
protected ParsedModule parseResult;
@Override
public void prepareTestCase(String moduleName, String projectFolderName, AnnotatedSource testCase) {
moduleName = nullToOther(moduleName, DEFAULT_MODULE_NAME);
parseResult = DeeParser.parseUnlocatedModule(testCase.source, moduleName);
if(projectFolderName == null || projectFolderName.isEmpty()) {
mr = new EmptySemanticResolution();
return;
}
TestsSimpleModuleResolver existingMR = moduleResolvers.get(projectFolderName);
if(existingMR == null) {
File projectFolder = getProjectDirectory(projectFolderName);
existingMR = new TestsSimpleModuleResolver(Location.create_fromValid(projectFolder.toPath()));
moduleResolvers.put(projectFolderName, existingMR); // Cache the MR data
}
if(moduleName != null) {
existingMR.setExtraModule(moduleName, parseResult);
} else {
existingMR.setExtraModule(null, null);
}
mr = existingMR;
assertNotNull(mr);
}
@Override
public void runRefSearchTest_________(RefSearchOptions options) {
__resetSemantics();
DeeSymbolCompletionResult completion = CodeCompletionOperation.completionSearch(parseResult, options.offset, mr);
assertEquals(completion.getResultCode(), options.expectedStatusCode);
assertEquals(completion.getReplaceLength(), options.rplLen);
checkResults(completion.getElementResults(), options.expectedResults);
}
private void __resetSemantics() {
boolean resetSemantics = true;
if(resetSemantics) {
mr._resetSemantics();
}
}
@Override
protected void runFindFailTest_________(MetadataEntry mde) {
FindDefinitionResult findDefResult = resolveAtOffset(mde.offset);
assertTrue(!findDefResult.isValidPickRef());
}
@Override
public void runFindMissingTest_________(MetadataEntry mde) {
assertTrue(mde.sourceValue == null);
FindDefinitionResult findDefResult = resolveAtOffset(mde.offset);
assertTrue(findDefResult.isValidPickRef() == false);
assertTrue(findDefResult.pickedReference instanceof NamedReference);
NamedReference pickedRef_named = (NamedReference) findDefResult.pickedReference;
assertTrue(pickedRef_named.isMissingCoreReference());
}
@Override
protected void runFindTest_________(MetadataEntry mde) {
String[] expectedResults = splitValues(mde.sourceValue);
FindDefinitionResult findDefResult = resolveAtOffset(mde.offset);
assertTrue(findDefResult.isValidPickRef());
checkResults(findDefResult.resultsRaw, expectedResults, false, false, false, true);
resolveAtOffset(mde.offset);
}
public FindDefinitionResult resolveAtOffset(int offset) {
__resetSemantics();
return FindDefinitionOperation.findDefinition(parseResult.module, offset, mr);
}
}