/* * Copyright 2016 The Closure Compiler Authors. * * 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 com.google.javascript.jscomp; import com.google.javascript.rhino.Node; /** * Unit tests for {@link PolymerPassSuppressBehaviors} */ public class PolymerPassSuppressBehaviorsTest extends Es6CompilerTestCase { private static final String EXTERNS = LINE_JOINER.join( "/** @constructor */", "var HTMLElement = function() {};", "/** @constructor @extends {HTMLElement} */", "var HTMLInputElement = function() {};", "/** @constructor @extends {HTMLElement} */", "var PolymerElement = function() {};", "/** @type {!Object} */", "PolymerElement.prototype.$;", "PolymerElement.prototype.created = function() {};", "PolymerElement.prototype.ready = function() {};", "PolymerElement.prototype.attached = function() {};", "PolymerElement.prototype.domReady = function() {};", "PolymerElement.prototype.detached = function() {};", "/**", " * Call the callback after a timeout. Calling job again with the same name", " * resets the timer but will not result in additional calls to callback.", " *", " * @param {string} name", " * @param {Function} callback", " * @param {number} timeoutMillis The minimum delay in milliseconds before", " * calling the callback.", " */", "PolymerElement.prototype.job = function(name, callback, timeoutMillis) {};", "/**", " * @param a {!Object}", " * @return {!function()}", " */", "var Polymer = function(a) {};", "var alert = function(msg) {};"); public PolymerPassSuppressBehaviorsTest() { super(EXTERNS); } @Override protected CompilerPass getProcessor(final Compiler compiler) { return new CompilerPass() { @Override public void process(Node externs, Node root) { PolymerPassSuppressBehaviors suppressBehaviorsCallback = new PolymerPassSuppressBehaviors(compiler); NodeTraversal.traverseEs6(compiler, root, suppressBehaviorsCallback); } }; } @Override protected void setUp() throws Exception { super.setUp(); allowExternsChanges(true); enableTypeCheck(); runTypeCheckAfterProcessing = true; parseTypeInfo = true; } @Override protected int getNumRepetitions() { return 1; } public void testPropertyTypeRemoval() { test( LINE_JOINER.join( "/** @polymerBehavior */", "var FunBehavior = {", " properties: {", " /** @type {boolean} */", " isFun: {", " type: Boolean,", " value: true,", " },", " /** @type {!Element} */", " funObject: {", " type: Object,", " },", " /** @type {!Array<String>} */", " funArray: {", " type: Array,", " },", " },", "};"), LINE_JOINER.join( "/** @polymerBehavior @nocollapse */", "var FunBehavior = {", " properties: {", " isFun: {", " type: Boolean,", " value: true,", " },", " funObject: {", " type: Object,", " },", " funArray: {", " type: Array,", " },", " },", "};")); } public void testDefaultValueSuppression() { test( LINE_JOINER.join( "/** @polymerBehavior */", "var FunBehavior = {", " properties: {", " isFun: {", " type: Boolean,", " value: true,", " },", " funObject: {", " type: Object,", " value: function() { return {fun: this.isFun }; },", " },", " funArray: {", " type: Array,", " value: function() { return [this.isFun]; },", " },", " },", "};"), LINE_JOINER.join( "/** @polymerBehavior @nocollapse */", "var FunBehavior = {", " properties: {", " isFun: {", " type: Boolean,", " value: true,", " },", " funObject: {", " type: Object,", " /** @suppress {checkTypes|globalThis|visibility} */", " value: function() { return {fun: this.isFun }; },", " },", " funArray: {", " type: Array,", " /** @suppress {checkTypes|globalThis|visibility} */", " value: function() { return [this.isFun]; },", " },", " },", "};")); } public void testConstBehaviours() { disableTypeCheck(); testEs6( LINE_JOINER.join( "/** @polymerBehavior */", "const FunBehavior = {", "};"), LINE_JOINER.join( "/** @polymerBehavior @nocollapse */", "const FunBehavior = {", "};")); } public void testLetBehaviours() { disableTypeCheck(); testEs6( LINE_JOINER.join( "/** @polymerBehavior */", "let FunBehavior = {", "};"), LINE_JOINER.join( "/** @polymerBehavior @nocollapse */", "let FunBehavior = {", "};")); } }