blob: 1e6c564f98961741bf39329298c47dad665087e4 [file] [log] [blame]
/*
* Copyright (c) 2014, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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 com.google.dart.engine.internal.html.polymer;
import com.google.dart.engine.EngineTestCase;
import com.google.dart.engine.context.AnalysisContext;
import com.google.dart.engine.context.AnalysisContextHelper;
import com.google.dart.engine.context.AnalysisErrorInfo;
import com.google.dart.engine.context.AnalysisException;
import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.element.CompilationUnitElement;
import com.google.dart.engine.element.HtmlElement;
import com.google.dart.engine.element.ToolkitObjectElement;
import com.google.dart.engine.element.polymer.PolymerTagDartElement;
import com.google.dart.engine.element.polymer.PolymerTagHtmlElement;
import com.google.dart.engine.error.AnalysisError;
import com.google.dart.engine.error.ErrorCode;
import com.google.dart.engine.error.GatheringErrorListener;
import com.google.dart.engine.source.Source;
import junit.framework.AssertionFailedError;
import static org.fest.assertions.Assertions.assertThat;
abstract public class PolymerTest extends EngineTestCase {
/**
* @return the offset of given <code>search</code> string in <code>contents</code>. Fails test if
* not found.
*/
protected static int findOffset(String contents, String search) {
int offset = contents.indexOf(search);
assertThat(offset).describedAs(contents).isNotEqualTo(-1);
return offset;
}
protected AnalysisContextHelper contextHelper = new AnalysisContextHelper();
protected AnalysisContext context;
protected Source tagDartSource;
protected String tagDartContents;
protected Source tagHtmlSource;
protected String tagHtmlContents;
protected CompilationUnitElement tagDartUnitElement;
protected HtmlElement tagHtmlUnitElement;
protected PolymerTagDartElement tagDartElement;
protected PolymerTagHtmlElement tagHtmlElement;
protected final void addTagDartSource(String contents) {
tagDartContents = contents;
tagDartSource = contextHelper.addSource("/my-element.dart", contents);
}
protected final void addTagHtmlSource(String contents) {
tagHtmlContents = contents;
tagHtmlSource = contextHelper.addSource("/my-element.html", contents);
}
/**
* Assert that the number of errors reported against the given source matches the number of errors
* that are given and that they have the expected error codes. The order in which the errors were
* gathered is ignored.
*
* @param source the source against which the errors should have been reported
* @param expectedErrorCodes the error codes of the errors that should have been reported
* @throws AnalysisException if the reported errors could not be computed
* @throws AssertionFailedError if a different number of errors have been reported than were
* expected
*/
protected final void assertErrors(Source source, ErrorCode... expectedErrorCodes) {
GatheringErrorListener errorListener = new GatheringErrorListener();
AnalysisErrorInfo errorsInfo = context.getErrors(source);
for (AnalysisError error : errorsInfo.getErrors()) {
errorListener.onError(error);
}
errorListener.assertErrorsWithCodes(expectedErrorCodes);
}
protected final void assertNoErrorsTag() {
assertNoErrorsTagDart();
assertNoErrorsTagHtml();
}
protected final void assertNoErrorsTagDart() {
assertErrors(tagDartSource);
}
protected final void assertNoErrorsTagHtml() {
assertErrors(tagHtmlSource);
}
/**
* @return the offset of given <code>search</code> string in {@link #tagDartContents}. Fails test
* if not found.
*/
protected final int findTagDartOffset(String search) {
return findOffset(tagDartContents, search);
}
/**
* @return the offset of given <code>search</code> string in {@link #tagHtmlContents}. Fails test
* if not found.
*/
protected final int findTagHtmlOffset(String search) {
return findOffset(tagHtmlContents, search);
}
protected final void resolveTagDart() throws Exception {
contextHelper.runTasks();
tagDartUnitElement = contextHelper.getDefiningUnitElement(tagDartSource);
// try to find a PolymerTagDartElement
for (ClassElement classElement : tagDartUnitElement.getTypes()) {
for (ToolkitObjectElement toolkitObject : classElement.getToolkitObjects()) {
if (toolkitObject instanceof PolymerTagDartElement) {
tagDartElement = (PolymerTagDartElement) toolkitObject;
}
}
}
}
protected final void resolveTagHtml() throws Exception {
contextHelper.runTasks();
tagHtmlUnitElement = context.getHtmlElement(tagHtmlSource);
// try to find a PolymerTagHtmlElement
PolymerTagHtmlElement[] polymerTags = tagHtmlUnitElement.getPolymerTags();
if (polymerTags.length != 0) {
tagHtmlElement = polymerTags[0];
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
configureForPolymer(contextHelper);
context = contextHelper.context;
}
@Override
protected void tearDown() throws Exception {
contextHelper = null;
context = null;
tagDartSource = null;
tagDartContents = null;
tagHtmlSource = null;
tagHtmlContents = null;
tagDartUnitElement = null;
tagHtmlUnitElement = null;
tagDartElement = null;
tagHtmlElement = null;
super.tearDown();
}
private void configureForPolymer(AnalysisContextHelper contextHelper) {
contextHelper.addSource(
"/polymer.dart",
createSource(
"library polymer;",
"",
"class CustomTag {",
" final String tagName;",
" const CustomTag(this.tagName);",
"}",
"",
"class ObservableProperty {",
" const ObservableProperty();",
"}",
"const ObservableProperty observable = const ObservableProperty();",
"",
"class PublishedProperty extends ObservableProperty {",
" const PublishedProperty();",
"}",
"const published = const PublishedProperty();",
""));
}
}