package com.google.jstestdriver.idea.assertFramework;
import com.google.common.collect.Lists;
import com.google.jstestdriver.idea.assertFramework.jasmine.JasmineFileStructureBuilder;
import com.google.jstestdriver.idea.assertFramework.jstd.JstdTestFileStructureBuilder;
import com.google.jstestdriver.idea.assertFramework.qunit.QUnitFileStructureBuilder;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.openapi.util.Key;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author Sergey Simonchik
*/
public class TestFileStructureProviderImpl implements TestFileStructureManager.Provider {
private static final Key<CachedValue<TestFileStructurePack>> TEST_FILE_STRUCTURE_REGISTRY_KEY = Key.create(
TestFileStructurePack.class.getName()
);
private final List<AbstractTestFileStructureBuilder> myBuilders = Lists.newArrayList(
JstdTestFileStructureBuilder.getInstance(),
QUnitFileStructureBuilder.getInstance(),
JasmineFileStructureBuilder.getInstance()
);
@Nullable
public TestFileStructurePack fetchTestFileStructurePackByJsFile(final JSFile jsFile) {
CachedValuesManager cachedValuesManager = CachedValuesManager.getManager(jsFile.getProject());
return cachedValuesManager.getCachedValue(jsFile, TEST_FILE_STRUCTURE_REGISTRY_KEY,
new CachedValueProvider<TestFileStructurePack>() {
@Override
public Result<TestFileStructurePack> compute() {
long startTime = System.currentTimeMillis();
List<AbstractTestFileStructure> fileStructures = Lists.newArrayList();
for (AbstractTestFileStructureBuilder builder : myBuilders) {
AbstractTestFileStructure testFileStructure = builder.buildTestFileStructure(jsFile);
fileStructures.add(testFileStructure);
}
long endTime = System.currentTimeMillis();
System.out.println("Creating TestFileStructurePack for " + jsFile.getName() + " takes "
+ (endTime - startTime) + " ms");
return Result.create(new TestFileStructurePack(fileStructures), jsFile);
}
}, false);
}
}