/*
* Copyright 2012-2014 Sergey Ignatov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.erlang.console;
import com.intellij.execution.filters.Filter;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.erlang.sdk.ErlangSdkRelease;
import org.intellij.erlang.sdk.ErlangSdkType;
import org.intellij.erlang.utils.ErlangLightPlatformCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.regex.Pattern;
@SuppressWarnings("ConstantConditions")
public class FileReferenceFilterTest extends ErlangLightPlatformCodeInsightFixtureTestCase {
public void setUp() throws Exception {
super.setUp();
File currentTestRoot = new File("testData/rebar/sampleProject");
FileUtil.copyDir(currentTestRoot, new File(getProject().getBaseDir().getPath()));
setUpProjectSdk();
}
public void testCompilationErrorRelativePath() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.COMPILATION_ERROR_PATH);
String consoleOutput = "some text||src/a_module.erl:123: more text here";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertEquals(11, result.highlightStartOffset);
assertEquals(31, result.highlightEndOffset);
assertNotNull(result.hyperlinkInfo);
}
public void testCompilationErrorAbsolutePath() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.COMPILATION_ERROR_PATH);
String consoleOutput = "some text||" + getProject().getBasePath() + "/src/a_module.erl:123: more text here";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertEquals(11, result.highlightStartOffset);
assertEquals(32 + getProject().getBasePath().length(), result.highlightEndOffset);
assertNotNull(result.hyperlinkInfo);
}
public void testCompilationErrorMissingPath() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.COMPILATION_ERROR_PATH);
String consoleOutput = "some text||src/B_module.erl:123: more text here"; // may be case insensitive
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertEquals(11, result.highlightStartOffset);
assertEquals(31, result.highlightEndOffset);
assertNull(result.hyperlinkInfo);
}
public void testEunitErrorPath() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.EUNIT_ERROR_PATH);
String consoleOutput = "some text (src/a_module.erl, line 123) more text here";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertEquals(11, result.highlightStartOffset);
assertEquals(37, result.highlightEndOffset);
assertNotNull(result.hyperlinkInfo);
}
public void testEunitFullErrorPath() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.EUNIT_ERROR_PATH);
File base = new File(getProject().getBaseDir().getPath());
File file = ContainerUtil.getFirstItem(FileUtil.findFilesByMask(Pattern.compile(".*\\.erl"), base));
VirtualFile vFile = LocalFileSystem.getInstance().findFileByIoFile(file);
assertNotNull(vFile);
String canonicalPath = vFile.getCanonicalPath();
String consoleOutput = "in function bisect_server_test:'-false_test/0-fun-0-'/0 (" + canonicalPath + ", line 14)";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertNotNull(result.hyperlinkInfo);
}
public void testEunitFailurePath() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.EUNIT_FAILURE_PATH);
String consoleOutput = "some text [{file,\"src/a_module.erl\"},{line,123}] more text here";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertEquals(10, result.highlightStartOffset);
assertEquals(48, result.highlightEndOffset);
assertNotNull(result.hyperlinkInfo);
}
public void testLinkToSdkFile() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.COMPILATION_ERROR_PATH);
String consoleOutput = "some text||src/lists.erl:123: more text here";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertNotNull(result.hyperlinkInfo);
}
public void testLinkToSdkFileNoSrc() {
FileReferenceFilter compilationErrorFilter = new FileReferenceFilter(getProject(), ErlangConsoleUtil.COMPILATION_ERROR_PATH);
String consoleOutput = "some text||lists.erl:123: more text here";
Filter.Result result = compilationErrorFilter.applyFilter(consoleOutput, consoleOutput.length());
assertNotNull(result.hyperlinkInfo);
}
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
return new DefaultLightProjectDescriptor() {
@Override
public Sdk getSdk() {
return ErlangSdkType.createMockSdk("testData/mockSdk-R15B02/", ErlangSdkRelease.V_R15B02);
}
};
}
}