/*
* 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;
public class J2clEqualitySameRewriterPassTest extends TypeICompilerTestCase {
private static final String EXTERN = "Equality.$same = function(a, b) {};";
private boolean useTypesForOptimization = true;
public J2clEqualitySameRewriterPassTest() {
super(MINIMAL_EXTERNS + EXTERN);
}
@Override
public void setUp() {
this.mode = TypeInferenceMode.BOTH;
}
@Override
protected CompilerPass getProcessor(Compiler compiler) {
return new J2clEqualitySameRewriterPass(compiler);
}
@Override
protected CompilerOptions getOptions() {
CompilerOptions options = super.getOptions();
options.setJ2clPass(CompilerOptions.J2clPassMode.ON);
return options;
}
public void testRewriteEqualitySame() {
test(
LINE_JOINER.join(
"Equality.$same(0, '');",
"var a = 'ABC';",
"Equality.$same(a, 'ABC');",
"var b = 5;",
"Equality.$same(b, 5);",
"Equality.$same(b, []);",
"Equality.$same(b, null);",
"Equality.$same(null, b);"),
LINE_JOINER.join(
"0 === '';",
"var a = 'ABC';",
"a === 'ABC';",
"var b = 5;",
"b === 5;",
"b === [];",
"b == null;",
"null == b;"));
}
public void testNotRewriteEqualitySame() {
testSame(
LINE_JOINER.join(
"Equality.$same(c, d);",
"/** @type {number} */",
"var num = 5",
"/** @type {string} */",
"var str = 'ABC';",
"/** @type {*} */",
"var allType = null;",
"Equality.$same(num, str);",
"Equality.$same(num, allType);",
"Equality.$same(str, allType);"));
}
public void testNotRewriteEqualitySame_sameTypes() {
testSame(
LINE_JOINER.join(
"/** @type {number|undefined} */",
"var num1 = 5;",
"/** @type {?number} */",
"var num2 = 5;",
"Equality.$same(num1, num2);",
"/** @type {string} */",
"var str1 = '';",
"/** @type {string|undefined} */",
"var str2 = 'abc';",
"Equality.$same(str1, str2);",
"/** @type {!Object} */",
"var obj1 = {};",
"/** @type {Object} */",
"var obj2 = null;",
"Equality.$same(obj1, obj2);",
"Equality.$same(obj1, str2);",
"Equality.$same(obj1, num2);",
"/** @type {*} */",
"var allType1 = 1;",
"/** @type {*} */",
"var allType2 = '1';",
"Equality.$same(allType1, allType2);"));
}
}