/* * Copyright 2009 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; import com.google.javascript.rhino.Token; import junit.framework.TestCase; /** * Test class for the default {@link CodingConvention}. */ public class DefaultCodingConventionTest extends TestCase { private CodingConvention conv = CodingConventions.getDefault(); public void testVarAndOptionalParams() { Node args = new Node(Token.PARAM_LIST, Node.newString(Token.NAME, "a"), Node.newString(Token.NAME, "b")); Node optArgs = new Node(Token.PARAM_LIST, Node.newString(Token.NAME, "opt_a"), Node.newString(Token.NAME, "opt_b")); assertFalse(conv.isVarArgsParameter(args.getFirstChild())); assertTrue(conv.isVarArgsParameter(args.getLastChild())); assertFalse(conv.isVarArgsParameter(optArgs.getFirstChild())); assertTrue(conv.isVarArgsParameter(optArgs.getLastChild())); assertTrue(conv.isOptionalParameter(args.getFirstChild())); assertFalse(conv.isOptionalParameter(args.getLastChild())); assertTrue(conv.isOptionalParameter(optArgs.getFirstChild())); assertFalse(conv.isOptionalParameter(optArgs.getLastChild())); } public void testInlineName() { assertFalse(conv.isConstant("a")); assertFalse(conv.isConstant("XYZ123_")); assertFalse(conv.isConstant("ABC")); assertFalse(conv.isConstant("ABCdef")); assertFalse(conv.isConstant("aBC")); assertFalse(conv.isConstant("A")); assertFalse(conv.isConstant("_XYZ123")); assertFalse(conv.isConstant("a$b$XYZ123_")); assertFalse(conv.isConstant("a$b$ABC_DEF")); assertFalse(conv.isConstant("a$b$A")); assertFalse(conv.isConstant("a$b$a")); assertFalse(conv.isConstant("a$b$ABCdef")); assertFalse(conv.isConstant("a$b$aBC")); assertFalse(conv.isConstant("a$b$")); assertFalse(conv.isConstant("$")); } public void testExportedName() { assertFalse(conv.isExported("_a")); assertFalse(conv.isExported("_a_")); assertFalse(conv.isExported("a")); assertFalse(conv.isExported("$super", false)); assertTrue(conv.isExported("$super", true)); assertTrue(conv.isExported("$super")); } public void testPrivateName() { assertFalse(conv.isPrivate("a_")); assertFalse(conv.isPrivate("a")); assertFalse(conv.isPrivate("_a_")); } public void testEnumKey() { assertTrue(conv.isValidEnumKey("A")); assertTrue(conv.isValidEnumKey("123")); assertTrue(conv.isValidEnumKey("FOO_BAR")); assertTrue(conv.isValidEnumKey("a")); assertTrue(conv.isValidEnumKey("someKeyInCamelCase")); assertTrue(conv.isValidEnumKey("_FOO_BAR")); } public void testInheritanceDetection1() { assertNotClassDefining("goog.foo(A, B);"); } public void testInheritanceDetection2() { assertNotClassDefining("goog.inherits(A, B);"); } public void testInheritanceDetection3() { assertNotClassDefining("A.inherits(B);"); } public void testInheritanceDetection4() { assertNotClassDefining("goog.inherits(goog.A, goog.B);"); } public void testInheritanceDetection5() { assertNotClassDefining("goog.A.inherits(goog.B);"); } public void testInheritanceDetection6() { assertNotClassDefining("A.inherits(this.B);"); } public void testInheritanceDetection7() { assertNotClassDefining("this.A.inherits(B);"); } public void testInheritanceDetection8() { assertNotClassDefining("goog.inherits(A, B, C);"); } public void testInheritanceDetection9() { assertNotClassDefining("A.mixin(B.prototype);"); } public void testInheritanceDetection10() { assertNotClassDefining("goog.mixin(A.prototype, B.prototype);"); } public void testInheritanceDetectionPostCollapseProperties() { assertNotClassDefining("goog$inherits(A, B);"); assertNotClassDefining("goog$inherits(A);"); } public void testFunctionBind() { assertNotFunctionBind("goog.bind(f)"); assertNotFunctionBind("goog$bind(f)"); assertNotFunctionBind("goog.partial(f)"); assertNotFunctionBind("goog$partial(f)"); assertFunctionBind("(function(){}).bind()"); assertFunctionBind("(function(){}).bind(obj)"); assertFunctionBind("(function(){}).bind(obj, p1)"); assertNotFunctionBind("Function.prototype.bind.call()"); assertFunctionBind("Function.prototype.bind.call(obj)"); assertFunctionBind("Function.prototype.bind.call(obj, p1)"); } private void assertFunctionBind(String code) { Node n = parseTestCode(code); assertNotNull(conv.describeFunctionBind(n.getFirstChild())); } private void assertNotFunctionBind(String code) { Node n = parseTestCode(code); assertNull(conv.describeFunctionBind(n.getFirstChild())); } private void assertNotClassDefining(String code) { Node n = parseTestCode(code); assertNull(conv.getClassesDefinedByCall(n.getFirstChild())); } private Node parseTestCode(String code) { Compiler compiler = new Compiler(); return compiler.parseTestCode(code).getFirstChild(); } }