/*******************************************************************************
* Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others.
* 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
*******************************************************************************/
package org.xpect.xtext.lib.tests;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static org.eclipse.xtext.diagnostics.Severity.ERROR;
import static org.eclipse.xtext.diagnostics.Severity.INFO;
import static org.eclipse.xtext.diagnostics.Severity.WARNING;
import java.util.Collection;
import java.util.List;
import org.eclipse.xtext.diagnostics.Severity;
import org.eclipse.xtext.validation.Issue;
import org.junit.Assert;
import org.junit.ComparisonFailure;
import org.junit.runner.RunWith;
import org.xpect.XpectImport;
import org.xpect.expectation.ILinesExpectation;
import org.xpect.runner.LiveExecutionType;
import org.xpect.runner.Xpect;
import org.xpect.runner.XpectRunner;
import org.xpect.text.IRegion;
import org.xpect.util.IssueVisualizer;
import org.xpect.xtext.lib.setup.XtextStandaloneSetup;
import org.xpect.xtext.lib.setup.XtextWorkspaceSetup;
import org.xpect.xtext.lib.tests.ValidationTestModuleSetup.ConsumedIssues;
import org.xpect.xtext.lib.tests.ValidationTestModuleSetup.IssuesByLine;
import org.xpect.xtext.lib.tests.ValidationTestModuleSetup.IssuesByLineProvider;
import org.xpect.xtext.lib.tests.ValidationTestModuleSetup.SeverityPredicate;
import org.xpect.xtext.lib.util.IssueFormatter;
import org.xpect.xtext.lib.util.NextLine;
import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
/**
* @author Moritz Eysholdt - Initial contribution and API
*/
@RunWith(XpectRunner.class)
@XpectImport({ XtextStandaloneSetup.class, XtextWorkspaceSetup.class, ValidationTestModuleSetup.class, IssuesByLineProvider.class, ValidationTestConfig.class })
public class ValidationTest {
protected Function<? super Issue, String> createIssueFormatter(CharSequence document) {
return new IssueFormatter(document, false);
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues(ERROR)
public void errors(ILinesExpectation expectation, @IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line, ValidationTestConfig cfg) {
List<String> issues = getActualIssues(line2issue, line, cfg, ERROR);
expectation.assertEquals(issues);
}
protected List<String> getActualIssues(Multimap<IRegion, Issue> line2issue, IRegion line, ValidationTestConfig cfg, Severity... severities) {
Collection<Issue> issuesInLine = line2issue.get(line);
List<Issue> filteredIssues = Lists.newArrayList(filter(issuesInLine, Predicates.and(new SeverityPredicate(severities), cfg.getIgnoreFilter())));
List<String> formattedIssues = newArrayList(transform(filteredIssues, createIssueFormatter(line.getDocument())));
if (formattedIssues.isEmpty())
Assert.fail("No issues found in line " + line);
return formattedIssues;
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues(INFO)
public void infos(ILinesExpectation expectation, @IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line, ValidationTestConfig cfg) {
List<String> issues = getActualIssues(line2issue, line, cfg, INFO);
expectation.assertEquals(issues);
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues({ INFO, ERROR, WARNING })
public void issues(ILinesExpectation expectation, @IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line, ValidationTestConfig cfg) {
List<String> issues = getActualIssues(line2issue, line, cfg, INFO, ERROR, WARNING);
expectation.assertEquals(issues);
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues({ INFO, ERROR, WARNING })
public void noIssues(@IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line) {
assertNoIssuesInLine(line2issue, line, INFO, ERROR, WARNING);
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues({ ERROR })
public void noErrors(@IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line) {
assertNoIssuesInLine(line2issue, line, ERROR);
}
@Xpect
@Deprecated
@ConsumedIssues({ ERROR })
public void noerrors(@IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line) {
assertNoIssuesInLine(line2issue, line, ERROR);
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues({ WARNING })
public void noWarnings(@IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line) {
assertNoIssuesInLine(line2issue, line, WARNING);
}
@Xpect
@Deprecated
@ConsumedIssues({ WARNING })
public void nowarnings(@IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line) {
assertNoIssuesInLine(line2issue, line, WARNING);
}
protected void assertNoIssuesInLine(Multimap<IRegion, Issue> line2issue, IRegion line, Severity... serverities) throws ComparisonFailure {
Collection<Issue> issues = line2issue.get(line);
if (!issues.isEmpty()) {
String document = line.getDocument().toString();
String visualized = new IssueVisualizer().visualize(document, issues);
throw new ComparisonFailure("no Issues expected, but found:", document, visualized);
}
}
@Xpect(liveExecution = LiveExecutionType.FAST)
@ConsumedIssues({ WARNING })
public void warnings(ILinesExpectation expectation, @IssuesByLine Multimap<IRegion, Issue> line2issue, @NextLine IRegion line, ValidationTestConfig cfg) {
List<String> issues = getActualIssues(line2issue, line, cfg, WARNING);
expectation.assertEquals(issues);
}
}