You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/04/13 20:56:15 UTC
[23/51] [partial] git commit: [flex-falcon]
[refs/heads/feature/maven-migration-test] - - Check-In of the migrated
project to make error analysis easier
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
new file mode 100644
index 0000000..e6ab1e4
--- /dev/null
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
@@ -0,0 +1,1177 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.codegen.js.flexjs;
+
+import java.util.ArrayList;
+
+import org.apache.flex.compiler.driver.IBackend;
+import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogPackage;
+import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
+import org.apache.flex.compiler.internal.driver.js.goog.JSGoogConfiguration;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.tree.as.IFileNode;
+import org.junit.Test;
+
+/**
+ * @author Erik de Bruin
+ */
+public class TestFlexJSPackage extends TestGoogPackage
+{
+ @Override
+ public void setUp()
+ {
+ project = new FlexJSProject(workspace);
+ JSGoogConfiguration config = new JSGoogConfiguration();
+ ArrayList<String> values = new ArrayList<String>();
+ values.add("Event");
+ config.setCompilerKeepAs3Metadata(null, values);
+ ((FlexJSProject)project).config = config;
+ super.setUp();
+ }
+
+ @Override
+ @Test
+ public void testPackageSimple_Class()
+ {
+ // does JS need a implicit constructor function? ... always?
+ // All class nodes in AST get either an implicit or explicit constructor
+ // this is an implicit and the way I have the before/after handler working
+ // with block disallows implicit blocks from getting { }
+
+ // (erikdebruin) the constuctor IS the class definition, in 'goog' JS,
+ // therefor we need to write out implicit constructors
+ // (if I understand the term correctly)
+
+ IFileNode node = compileAS("package {public class A{}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "A = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('A', A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Override
+ @Test
+ public void testPackageQualified_Class()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {public class A{}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Override
+ @Test
+ public void testPackageQualified_ClassBody()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {public class A{public function A(){}}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Override
+ @Test
+ public void testPackageQualified_ClassBodyMethodContents()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {public class A{public function A(){if (a){for (var i:Object in obj){doit();}}}}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " if (a) {\n" +
+ " for (var /** @type {Object} */ i in obj) {\n" +
+ " doit();\n" +
+ " }\n" +
+ " }\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Test
+ public void testPackageQualified_ClassBodyMetaData()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {[Event(name='add', type='mx.events.FlexEvent')]\npublic class A{public function A(){}}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " },\n" +
+ " metadata: function () { return [ { name: 'Event', args: [ { key: 'name', value: 'add'}, { key: 'type', value: 'mx.events.FlexEvent'}]}]; }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Test
+ public void testPackageQualified_ClassAndInternalClass()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {\n" +
+ "public class A {\n" +
+ "public function A(){\n" +
+ "var internalClass:InternalClass = new InternalClass();\n" +
+ "}}}\n" +
+ "class InternalClass {\n" +
+ "public function InternalClass(){}\n" +
+ "}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " var /** @type {foo.bar.baz.A.InternalClass} */ internalClass = new foo.bar.baz.A.InternalClass();\n" +
+ "};\n" +
+ "\n" +
+ "\n/" +
+ "**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'InternalClass', qName: 'foo.bar.baz.A.InternalClass'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A.InternalClass', foo.bar.baz.A.InternalClass);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '', declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Test
+ public void testPackageQualified_ClassAndInternalFunction()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {\n" +
+ "public class A {\n" +
+ "public function A(){\n" +
+ "internalFunction();\n" +
+ "}}}\n" +
+ "function internalFunction(){}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " foo.bar.baz.A.internalFunction();\n" +
+ "};\n" +
+ "\n" +
+ "\n/" +
+ "**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "foo.bar.baz.A.internalFunction = function() {\n" +
+ "}");
+ }
+
+ @Test
+ public void testPackageQualified_ClassAndInternalVariable()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {\n" +
+ "public class A {\n" +
+ "public function A(){\n" +
+ "internalVar = 3;\n" +
+ "}}}\n" +
+ "var internalVar:Number = 2;");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " foo.bar.baz.A.internalVar = 3;\n" +
+ "};\n" +
+ "\n" +
+ "\n/" +
+ "**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {number}\n" +
+ " */\n" +
+ "foo.bar.baz.A.internalVar = 2");
+ }
+
+ @Test
+ public void testPackageQualified_ClassAndInternalClassMethods()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {\n" +
+ "public class A {\n" +
+ "public function A(){\n" +
+ "var internalClass:InternalClass = new InternalClass();\n" +
+ "var myString:String = InternalClass.someString;\n" +
+ "myString = InternalClass.someStaticFunction();\n" +
+ "myString = internalClass.someMethod();\n" +
+ "}}}\n" +
+ "class InternalClass {\n" +
+ "public function InternalClass(){\n" +
+ "}\n" +
+ "public static var someString:String = \"foo\";\n" +
+ "public static function someStaticFunction():String { return \"bar\";}\n" +
+ "public function someMethod():String { return \"baz\";}\n" +
+ "}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " var /** @type {foo.bar.baz.A.InternalClass} */ internalClass = new foo.bar.baz.A.InternalClass();\n" +
+ " var /** @type {string} */ myString = foo.bar.baz.A.InternalClass.someString;\n" +
+ " myString = foo.bar.baz.A.InternalClass.someStaticFunction();\n" +
+ " myString = internalClass.someMethod();\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @type {string}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.someString = \"foo\";\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @return {string}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.someStaticFunction = function() {\n" +
+ " return \"bar\";\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " * @return {string}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.someMethod = function() {\n" +
+ " return \"baz\";\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'InternalClass', qName: 'foo.bar.baz.A.InternalClass'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A.InternalClass', foo.bar.baz.A.InternalClass);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '', declaredBy: 'foo.bar.baz.A.InternalClass'},\n" +
+ " 'someMethod': { type: 'String', declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Test
+ public void testPackageQualified_ClassAndInternalGettersAndSetters()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {\n" +
+ "public class A {\n" +
+ "public function A(){\n" +
+ "var internalClass:InternalClass = new InternalClass();\n" +
+ "myString = internalClass.someString;\n" +
+ "internalClass.someString = myString;\n" +
+ "}\n" +
+ "public function get myString():String {\n" +
+ " return null;\n" +
+ "}\n" +
+ "public function set myString(value:String):void {}\n" +
+ "}}\n" +
+ "class InternalClass {\n" +
+ "public function InternalClass(){\n" +
+ "}\n" +
+ "public function get someString():String {\n" +
+ " return null;\n" +
+ "}\n" +
+ "public function set someString(value:String):void {}\n" +
+ "}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " var /** @type {foo.bar.baz.A.InternalClass} */ internalClass = new foo.bar.baz.A.InternalClass();\n" +
+ " this.myString = internalClass.someString;\n" +
+ " internalClass.someString = this.myString;\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "Object.defineProperties(foo.bar.baz.A.prototype, /** @lends {foo.bar.baz.A.prototype} */ {\n" +
+ "/** @export */\n" +
+ "myString: {\n" +
+ "get: /** @this {foo.bar.baz.A} */ function() {\n" +
+ " return null;\n" +
+ "},\n" +
+ "set: /** @this {foo.bar.baz.A} */ function(value) {\n" +
+ "}}}\n" +
+ ");\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " 'myString': { type: 'String', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "Object.defineProperties(foo.bar.baz.A.InternalClass.prototype, /** @lends {foo.bar.baz.A.InternalClass.prototype} */ {\n" +
+ "/** @export */\n" +
+ "someString: {\n" +
+ "get: /** @this {foo.bar.baz.A.InternalClass} */ function() {\n" +
+ " return null;\n" +
+ "},\n" +
+ "set: /** @this {foo.bar.baz.A.InternalClass} */ function(value) {\n" +
+ "}}}\n" +
+ ");\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'InternalClass', qName: 'foo.bar.baz.A.InternalClass'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A.InternalClass', foo.bar.baz.A.InternalClass);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " 'someString': { type: 'String', declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '', declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n");
+ }
+
+ @Test
+ public void testPackageQualified_ClassAndInternalFLEXJS_CLASS_INFO()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {\n" +
+ "public class A {\n" +
+ "public function A(){\n" +
+ "var internalClass:ITestInterface = new InternalClass() as ITestInterface;\n" +
+ "internalClass.test();\n" +
+ "}\n" +
+ "}}\n" +
+ "interface ITestInterface {\n" +
+ "function test():void;\n" +
+ "}\n" +
+ "class InternalClass implements ITestInterface {\n" +
+ "public function InternalClass(){\n" +
+ "}\n" +
+ "public function test():void {}\n" +
+ "}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * foo.bar.baz.A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('foo.bar.baz.A');\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "foo.bar.baz.A = function() {\n" +
+ " var /** @type {foo.bar.baz.A.ITestInterface} */ internalClass = org.apache.flex.utils.Language.as(new foo.bar.baz.A.InternalClass(), foo.bar.baz.A.ITestInterface);\n" +
+ " internalClass.test();\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A', foo.bar.baz.A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'A': { type: '', declaredBy: 'foo.bar.baz.A'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @interface\n" +
+ " */\n" +
+ "foo.bar.baz.A.ITestInterface = function() {\n" +
+ "};\n" +
+ "foo.bar.baz.A.ITestInterface.prototype.test = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.ITestInterface.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'ITestInterface', qName: 'foo.bar.baz.A.ITestInterface'}] };\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.ITestInterface.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'test': { type: 'void', declaredBy: 'foo.bar.baz.A.ITestInterface'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " * @implements {foo.bar.baz.A.ITestInterface}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * @export\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.test = function() {\n" +
+ "};\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'InternalClass', qName: 'foo.bar.baz.A.InternalClass'}], interfaces: [foo.bar.baz.A.ITestInterface] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('foo.bar.baz.A.InternalClass', foo.bar.baz.A.InternalClass);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "foo.bar.baz.A.InternalClass.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ " return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " 'InternalClass': { type: '', declaredBy: 'foo.bar.baz.A.InternalClass'},\n" +
+ " 'test': { type: 'void', declaredBy: 'foo.bar.baz.A.InternalClass'}\n" +
+ " };\n" +
+ " }\n" +
+ " };\n" +
+ "};\n"
+ );
+ }
+
+ @Test
+ public void testPackageSimple_Function()
+ {
+ IFileNode node = compileAS("package {public function A(){}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n * A\n *\n * @fileoverview\n *\n * @suppress {checkTypes|accessControls}\n */\n\ngoog.provide('A');\n\n\n\n/**\n * @export\n */\nA = function() {\n}");
+ }
+
+ @Test
+ public void testPackageQualified_Function()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {public function A(){}}");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes|accessControls}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @export\n */\nfoo.bar.baz.A = function() {\n}");
+ }
+
+ @Test
+ public void testPackageSimple_Variable()
+ {
+ IFileNode node = compileAS("package {public var A:String = \"Hello\";");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n * A\n *\n * @fileoverview\n *\n * @suppress {checkTypes|accessControls}\n */\n\ngoog.provide('A');\n\n\n\n/**\n * @export\n * @type {string}\n */\nA = \"Hello\"");
+ }
+
+ @Test
+ public void testPackageQualified_Variable()
+ {
+ IFileNode node = compileAS("package foo.bar.baz {public var A:String = \"Hello\";");
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes|accessControls}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @export\n * @type {string}\n */\nfoo.bar.baz.A = \"Hello\"");
+ }
+
+ @Override
+ protected IBackend createBackend()
+ {
+ return new FlexJSBackend();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSProject.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSProject.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSProject.java
new file mode 100644
index 0000000..c057f92
--- /dev/null
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSProject.java
@@ -0,0 +1,339 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.codegen.js.flexjs;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import junit.framework.Assert;
+import org.apache.flex.compiler.driver.IBackend;
+import org.apache.flex.compiler.exceptions.ConfigurationException;
+import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogProject;
+import org.apache.flex.compiler.internal.config.TargetSettings;
+import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
+import org.apache.flex.compiler.internal.driver.js.goog.JSGoogConfiguration;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.utils.FilenameNormalization;
+import org.apache.flex.utils.ITestAdapter;
+import org.apache.flex.utils.TestAdapterFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * This class tests the production of valid 'flexjs' JS code from an external
+ * project.
+ *
+ * @author Erik de Bruin
+ */
+public class TestFlexJSProject extends TestGoogProject
+{
+ private static ITestAdapter testAdapter = TestAdapterFactory.getTestAdapter();
+
+ private static String projectDirPath = "flexjs/projects";
+ private String sourcePath;
+ private Collection<String> externs = new ArrayList<String>();
+
+ @Override
+ public void setUp()
+ {
+ project = new FlexJSProject(workspace);
+ ((FlexJSProject)project).config = new JSGoogConfiguration();
+ super.setUp();
+ }
+
+ @Ignore
+ @Test
+ public void test_imports()
+ {
+ // crude bypass to allow for successful inheritance
+ }
+
+ @Test
+ public void test_Test()
+ {
+ String testDirPath = projectDirPath + "/interfaces";
+
+ String fileName = "Test";
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/interfaces").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_Super()
+ {
+ String testDirPath = projectDirPath + "/super";
+
+ String fileName = "Base";
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/super").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_InternalAndSamePackageRequires()
+ {
+ String testDirPath = projectDirPath + "/internal";
+
+ String fileName = "MainClass";
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/internal").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_IsItCircular()
+ {
+ String testDirPath = projectDirPath + "/circular";
+
+ String fileName = "Base";
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/circular").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_XMLRequires()
+ {
+ String testDirPath = projectDirPath + "/xml_requires";
+
+ String fileName = "XMLRequire";
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/xml_requires").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_Overrides()
+ {
+ String testDirPath = projectDirPath + "/overrides";
+
+ String fileName = "Test";
+
+ try {
+ ((FlexJSProject)project).config.setCompilerAllowSubclassOverrides(null, true);
+ } catch (ConfigurationException e) {
+ Assert.fail(e.getMessage());
+ }
+ project.setTargetSettings(new TargetSettings(((FlexJSProject)project).config));
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/overrides").getPath();
+
+ StringBuilder sb = new StringBuilder();
+ List<String> compiledFileNames = compileProject(fileName, testDirPath, sb, false);
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_Bad_Overrides()
+ {
+ String testDirPath = projectDirPath + "/bad_overrides";
+
+ String fileName = "Test";
+
+ try {
+ ((FlexJSProject)project).config.setCompilerAllowSubclassOverrides(null, true);
+ } catch (ConfigurationException e) {
+ Assert.fail(e.getMessage());
+ }
+ project.setTargetSettings(new TargetSettings(((FlexJSProject)project).config));
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/bad_overrides").getPath();
+
+ StringBuilder sb = new StringBuilder();
+ compileProject(fileName, testDirPath, sb, false);
+
+ String out = sb.toString();
+ out = out.replace("\\", "/");
+
+ String expected = testAdapter.getUnitTestBaseDir().getPath() + "/flexjs/projects/bad_overrides/Test.as(31:29)\n" +
+ "interface method someFunction in interface IA is implemented with an incompatible signature in class Test\n" +
+ testAdapter.getUnitTestBaseDir().getPath() + "/flexjs/projects/bad_overrides/Test.as(36:26)\n" +
+ "interface method someOtherFunction in interface IA is implemented with an incompatible signature in class Test\n" +
+ testAdapter.getUnitTestBaseDir().getPath() + "/flexjs/projects/bad_overrides/Test.as(31:29)\n" +
+ "Incompatible override.\n" +
+ testAdapter.getUnitTestBaseDir().getPath() + "/flexjs/projects/bad_overrides/Test.as(36:26)\n" +
+ "Incompatible override.\n";
+ assertThat(out, is(expected));
+ }
+
+ @Test
+ public void test_PackageConflict_AmbiguousDefinition()
+ {
+ String testDirPath = projectDirPath + "/package_conflicts_ambiguous_definition";
+
+ String fileName = "AmbiguousDefinition";
+
+ externs.add("Event");
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/package_conflicts_ambiguous_definition").getPath();
+
+ StringBuilder sb = new StringBuilder();
+ compileProject(fileName, testDirPath, sb, false);
+
+ externs.clear();
+
+ String out = sb.toString();
+ out = out.replace("\\", "/");
+
+ assertThat(out, is(testAdapter.getUnitTestBaseDir().getPath() +
+ "/flexjs/projects/package_conflicts_ambiguous_definition/mypackage/TestClass.as(29:20)\nAmbiguous reference to Event\n" +
+ testAdapter.getUnitTestBaseDir().getPath() +
+ "/flexjs/projects/package_conflicts_ambiguous_definition/mypackage/TestClass.as(30:41)\nAmbiguous reference to Event\n"));
+ }
+
+ @Test
+ public void test_PackageConflict_SamePackageAsConflict()
+ {
+ String testDirPath = projectDirPath + "/package_conflicts_same_package_as_conflict";
+
+ String fileName = "SamePackageAsConflict";
+
+ externs.add("Event");
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/package_conflicts_same_package_as_conflict").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ externs.clear();
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_PackageConflict_DifferentPackageAsConflict()
+ {
+ String testDirPath = projectDirPath + "/package_conflicts_different_package_as_conflict";
+
+ String fileName = "DifferentPackageAsConflict";
+
+ externs.add("Event");
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/package_conflicts_different_package_as_conflict").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ externs.clear();
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_PackageConflict_UseWindow()
+ {
+ String testDirPath = projectDirPath + "/package_conflicts_use_window";
+
+ String fileName = "UseWindow";
+
+ externs.add("Event");
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/package_conflicts_use_window").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ externs.clear();
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_PackageConflict_NoConflictNoWindow()
+ {
+ String testDirPath = projectDirPath + "/package_conflicts_no_conflict_no_window";
+
+ String fileName = "NoConflictNoWindow";
+
+ externs.add("Event");
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/package_conflicts_no_conflict_no_window").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ externs.clear();
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Test
+ public void test_PackageConflict_NoConflictUseWindow()
+ {
+ String testDirPath = projectDirPath + "/package_conflicts_no_conflict_use_window";
+
+ String fileName = "NoConflictUseWindow";
+
+ externs.add("Event");
+
+ sourcePath = new File(TestAdapterFactory.getTestAdapter().getUnitTestBaseDir(),
+ projectDirPath + "/package_conflicts_no_conflict_use_window").getPath();
+
+ List<String> compiledFileNames = compileProject(fileName, testDirPath);
+
+ externs.clear();
+
+ assertProjectOut(compiledFileNames, testDirPath);
+ }
+
+ @Override
+ protected void addSourcePaths(List<File> sourcePaths)
+ {
+ sourcePaths.add(new File(FilenameNormalization.normalize(sourcePath)));
+ ((FlexJSProject)project).unitTestExterns = externs;
+ }
+
+ @Override
+ protected IBackend createBackend()
+ {
+ return new FlexJSBackend();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
new file mode 100644
index 0000000..f2022b3
--- /dev/null
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
@@ -0,0 +1,600 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.codegen.js.flexjs;
+
+import org.apache.flex.compiler.driver.IBackend;
+import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogStatements;
+import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
+import org.apache.flex.compiler.tree.as.IFileNode;
+import org.apache.flex.compiler.tree.as.IForLoopNode;
+import org.apache.flex.compiler.tree.as.IIfNode;
+import org.apache.flex.compiler.tree.as.ILiteralNode;
+import org.apache.flex.compiler.tree.as.ISwitchNode;
+import org.apache.flex.compiler.tree.as.ITryNode;
+import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.apache.flex.compiler.tree.as.IWhileLoopNode;
+import org.apache.flex.compiler.tree.as.IWithNode;
+import org.junit.Test;
+
+/**
+ * @author Erik de Bruin
+ */
+public class TestFlexJSStatements extends TestGoogStatements
+{
+ @Override
+ public void setUp()
+ {
+ project = new FlexJSProject(workspace);
+ super.setUp();
+ }
+
+ @Test
+ public void testObjectListeral_withPropertyNameMatchingConst()
+ {
+ ILiteralNode node = (ILiteralNode) getNode("static const myConst:int; function falconTest_a():Object { return { myConst : myConst } }",
+ ILiteralNode.class, WRAP_LEVEL_CLASS);
+ asBlockWalker.visitLiteral(node);
+ assertOut("{myConst:FalconTest_A.myConst}");
+ }
+
+ @Test
+ public void testVarDeclaration_withTypeAssignedStringWithNewLine()
+ {
+ IVariableNode node = (IVariableNode) getNode("var a:String = \"\\n\"",
+ IVariableNode.class);
+ asBlockWalker.visitVariable(node);
+ assertOut("var /** @type {string} */ a = \"\\n\"");
+ }
+
+ //----------------------------------
+ // const declaration
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testConstDeclaration()
+ {
+ IVariableNode node = (IVariableNode) getNode("const a = 42;",
+ IVariableNode.class);
+ asBlockWalker.visitVariable(node);
+ assertOut("\n/**\n * @const\n * @type {*}\n */\nvar a = 42");
+ }
+
+ @Override
+ @Test
+ public void testConstDeclaration_withType()
+ {
+ IVariableNode node = (IVariableNode) getNode("const a:int = 42;",
+ IVariableNode.class);
+ asBlockWalker.visitVariable(node);
+ assertOut("\n/**\n * @const\n * @type {number}\n */\nvar a = 42");
+ }
+
+ @Override
+ @Test
+ public void testConstDeclaration_withList()
+ {
+ IVariableNode node = (IVariableNode) getNode(
+ "const a:int = 4, b:int = 11, c:int = 42;", IVariableNode.class);
+ asBlockWalker.visitVariable(node);
+ assertOut("\n/**\n * @const\n * @type {number}\n */\nvar a = 4, \n/**\n * @const\n * @type {number}\n */\nb = 11, \n/**\n * @const\n * @type {number}\n */\nc = 42");
+ }
+
+ //----------------------------------
+ // for () { }
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitFor_1a()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int = 0; i < len; i++) { break; }",
+ IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i = 0; i < len; i++) {\n break;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitFor_1b()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int = 0; i < len; i++) break;", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i = 0; i < len; i++)\n break;");
+ }
+
+ @Override
+ @Test
+ public void testVisitForIn_1()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int in obj) { break; }", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i in obj) {\n break;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitForIn_1a()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int in obj) break; ", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i in obj)\n break;");
+ }
+
+ @Override
+ @Test
+ public void testVisitForEach_1()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for each(var i:int in obj) { break; }", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n break;\n}}\n");
+ }
+
+ @Override
+ @Test
+ public void testVisitForEach_1a()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for each(var i:int in obj) break; ", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n\n break;}\n");
+ }
+
+ @Test
+ public void testVisitForEach_2()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for each(var i:int in obj.foo()) { break; }", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("var foreachiter0_target = obj.foo();\nfor (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n break;\n}}\n");
+ }
+
+ @Test
+ public void testVisitForEach_HoistedVar()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "var i:int; for each(i in obj) break; ", IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("var foreachiter0_target = obj;\nfor (var foreachiter0 in foreachiter0_target) \n{\ni = foreachiter0_target[foreachiter0];\n\n break;}\n");
+ }
+
+ //----------------------------------
+ // try {} catch () {} finally {}
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitTry_Catch()
+ {
+ ITryNode node = (ITryNode) getNode("try { a; } catch (e:Error) { b; }",
+ ITryNode.class);
+ asBlockWalker.visitTry(node);
+ assertOut("try {\n a;\n} catch (e) {\n b;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitTry_Catch_Finally()
+ {
+ ITryNode node = (ITryNode) getNode(
+ "try { a; } catch (e:Error) { b; } finally { c; }",
+ ITryNode.class);
+ asBlockWalker.visitTry(node);
+ assertOut("try {\n a;\n} catch (e) {\n b;\n} finally {\n c;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitTry_Catch_Catch_Finally()
+ {
+ // TODO (erikdebruin) handle multiple 'catch' statements (FW in Wiki)
+ ITryNode node = (ITryNode) getNode(
+ "try { a; } catch (e:Error) { b; } catch (f:Error) { c; } finally { d; }",
+ ITryNode.class);
+ asBlockWalker.visitTry(node);
+ assertOut("try {\n a;\n} catch (e) {\n b;\n} catch (f) {\n c;\n} finally {\n d;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitTry_CatchEmpty_FinallyEmpty_()
+ {
+ ITryNode node = (ITryNode) getNode(
+ "try { a; } catch (e:Error) { } finally { }", ITryNode.class);
+ asBlockWalker.visitTry(node);
+ assertOut("try {\n a;\n} catch (e) {\n} finally {\n}");
+ }
+
+ //----------------------------------
+ // switch {}
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitSwitch_1()
+ {
+ ISwitchNode node = (ISwitchNode) getNode("switch(i){case 1: break;}",
+ ISwitchNode.class);
+ asBlockWalker.visitSwitch(node);
+ assertOut("switch (i) {\n case 1:\n break;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitSwitch_1a()
+ {
+ ISwitchNode node = (ISwitchNode) getNode(
+ "switch(i){case 1: { break; }}", ISwitchNode.class);
+ asBlockWalker.visitSwitch(node);
+ // (erikdebruin) the code is valid without the extra braces,
+ // i.e. we're good, we "don't care"
+ assertOut("switch (i) {\n case 1:\n break;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitSwitch_2()
+ {
+ ISwitchNode node = (ISwitchNode) getNode(
+ "switch(i){case 1: break; default: return;}", ISwitchNode.class);
+ asBlockWalker.visitSwitch(node);
+ assertOut("switch (i) {\n case 1:\n break;\n default:\n return;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitSwitch_3()
+ {
+ ISwitchNode node = (ISwitchNode) getNode(
+ "switch(i){case 1: { var x:int = 42; break; }; case 2: { var y:int = 66; break; }}", ISwitchNode.class);
+ asBlockWalker.visitSwitch(node);
+ assertOut("switch (i) {\n case 1:\n var /** @type {number} */ x = 42;\n break;\n case 2:\n var /** @type {number} */ y = 66;\n break;\n}");
+ }
+
+ //----------------------------------
+ // if ()
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitIf_1()
+ {
+ IIfNode node = (IIfNode) getNode("if (a) b++;", IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a)\n b++;");
+ }
+
+ @Override
+ @Test
+ public void testVisitIf_2()
+ {
+ IIfNode node = (IIfNode) getNode("if (a) b++; else c++;", IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a)\n b++;\nelse\n c++;");
+ }
+
+ @Override
+ @Test
+ public void testVisitIf_4()
+ {
+ IIfNode node = (IIfNode) getNode(
+ "if (a) b++; else if (c) d++; else if(e) --f;", IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a)\n b++;\nelse if (c)\n d++;\nelse if (e)\n --f;");
+ }
+
+ //----------------------------------
+ // if () { }
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitIf_1a()
+ {
+ IIfNode node = (IIfNode) getNode("if (a) { b++; }", IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a) {\n b++;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitIf_1b()
+ {
+ IIfNode node = (IIfNode) getNode("if (a) { b++; } else { c++; }",
+ IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a) {\n b++;\n} else {\n c++;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitIf_1c()
+ {
+ IIfNode node = (IIfNode) getNode(
+ "if (a) { b++; } else if (b) { c++; } else { d++; }",
+ IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a) {\n b++;\n} else if (b) {\n c++;\n} else {\n d++;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitIf_3()
+ {
+ IIfNode node = (IIfNode) getNode(
+ "if (a) b++; else if (c) d++; else --e;", IIfNode.class);
+ asBlockWalker.visitIf(node);
+ assertOut("if (a)\n b++;\nelse if (c)\n d++;\nelse\n --e;");
+ }
+
+ //----------------------------------
+ // label : for () {}
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitFor_2()
+ {
+ IForLoopNode node = (IForLoopNode) getNode("for (;;) { break; }",
+ IForLoopNode.class);
+ asBlockWalker.visitForLoop(node);
+ assertOut("for (;;) {\n break;\n}");
+ }
+
+ //----------------------------------
+ // while () { }
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitWhileLoop_1()
+ {
+ IWhileLoopNode node = (IWhileLoopNode) getNode(
+ "while(a > b){a++;--b;}", IWhileLoopNode.class);
+ asBlockWalker.visitWhileLoop(node);
+ assertOut("while (a > b) {\n a++;\n --b;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitWhileLoop_1a()
+ {
+ IWhileLoopNode node = (IWhileLoopNode) getNode("while(a > b) a++;",
+ IWhileLoopNode.class);
+ asBlockWalker.visitWhileLoop(node);
+ assertOut("while (a > b)\n a++;");
+ }
+
+ //----------------------------------
+ // do {} while ()
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitWhileLoop_Do_1()
+ {
+ IWhileLoopNode node = (IWhileLoopNode) getNode(
+ "do {a++;--b;} while(a > b);", IWhileLoopNode.class);
+ asBlockWalker.visitWhileLoop(node);
+ assertOut("do {\n a++;\n --b;\n} while (a > b);");
+ }
+
+ @Override
+ @Test
+ public void testVisitWhileLoop_Do_1a()
+ {
+ IWhileLoopNode node = (IWhileLoopNode) getNode("do a++; while(a > b);",
+ IWhileLoopNode.class);
+ asBlockWalker.visitWhileLoop(node);
+ assertOut("do\n a++;\nwhile (a > b);");
+ }
+
+ //----------------------------------
+ // label : for () {}
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitLabel_1()
+ {
+ LabeledStatementNode node = (LabeledStatementNode) getNode(
+ "foo: for each(var i:int in obj) { break foo; }",
+ LabeledStatementNode.class);
+ asBlockWalker.visitLabeledStatement(node);
+ assertOut("var foreachiter0_target = obj;\nfoo : for (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n{\n break foo;\n}}\n");
+ }
+
+ @Override
+ @Test
+ public void testVisitLabel_1a()
+ {
+ // TODO (mschmalle) LabelStatement messes up in finally{} block, something is wrong there
+ LabeledStatementNode node = (LabeledStatementNode) getNode(
+ "foo: for each(var i:int in obj) break foo;",
+ LabeledStatementNode.class);
+ asBlockWalker.visitLabeledStatement(node);
+ assertOut("var foreachiter0_target = obj;\nfoo : for (var foreachiter0 in foreachiter0_target) \n{\nvar i = foreachiter0_target[foreachiter0];\n\n break foo;}\n");
+ }
+
+ //----------------------------------
+ // with () {}
+ //----------------------------------
+
+ @Test
+ public void testVisitWith()
+ {
+ IWithNode node = (IWithNode) getNode("with (a) { b; }", IWithNode.class);
+ asBlockWalker.visitWith(node);
+ assertOut("with (a) {\n b;\n}");
+ }
+
+ @Test
+ public void testVisitWith_1a()
+ {
+ IWithNode node = (IWithNode) getNode("with (a) b;", IWithNode.class);
+ asBlockWalker.visitWith(node);
+ assertOut("with (a)\n b;");
+ }
+
+ @Override
+ @Test
+ public void testVisit()
+ {
+ IFileNode node = (IFileNode) getNode(
+ "try { a; } catch (e:Error) { if (a) { if (b) { if (c) b; else if (f) a; else e; }} } finally { }"
+ + "if (d) for (var i:int = 0; i < len; i++) break;"
+ + "if (a) { with (ab) { c(); } "
+ + "do {a++;do a++; while(a > b);} while(c > d); }"
+ + "if (b) { try { a; throw new Error('foo'); } catch (e:Error) { "
+ + " switch(i){case 1: break; default: return;}"
+ + " } finally { "
+ + " d; var a:Object = function(foo:int, bar:String = 'goo'):int{return -1;};"
+ + " eee.dd; eee.dd; eee.dd; eee.dd;} }"
+ + "foo: for each(var i:int in obj) break foo;",
+ IFileNode.class);
+ asBlockWalker.visitFile(node);
+ assertOutWithMetadata("/**\n" +
+ " * FalconTest_A\n" +
+ " *\n" +
+ " * @fileoverview\n" +
+ " *\n" +
+ " * @suppress {checkTypes|accessControls}\n" +
+ " */\n" +
+ "\n" +
+ "goog.provide('FalconTest_A');\n" +
+ "\n\n\n" +
+ "/**\n" +
+ " * @constructor\n" +
+ " */\n" +
+ "FalconTest_A = function() {\n" +
+ "};\n\n\n" +
+ "FalconTest_A.prototype.falconTest_a = function() {\n" +
+ " var self = this;\n" +
+ " var /** @type {Function} */ __localFn0__ = function(foo, bar) {\n" +
+ " bar = typeof bar !== 'undefined' ? bar : 'goo';\n" +
+ " return -1;\n" +
+ " }\n" +
+ " try {\n" +
+ " a;\n" +
+ " } catch (e) {\n" +
+ " if (a) {\n" +
+ " if (b) {\n" +
+ " if (c)\n" +
+ " b;\n" +
+ " else if (f)\n" +
+ " a;\n" +
+ " else\n" +
+ " e;\n" +
+ " }\n" +
+ " }\n" +
+ " } finally {\n" +
+ " }\n" +
+ " if (d)\n" +
+ " for (var /** @type {number} */ i = 0; i < len; i++)\n" +
+ " break;\n" +
+ " if (a) {\n" +
+ " with (ab) {\n" +
+ " c();\n" +
+ " }\n" +
+ " do {\n" +
+ " a++;\n" +
+ " do\n" +
+ " a++;\n" +
+ " while (a > b);\n" +
+ " } while (c > d);\n" +
+ " }\n" +
+ " if (b) {\n" +
+ " try {\n" +
+ " a;\n" +
+ " throw new Error('foo');\n" +
+ " } catch (e) {\n" +
+ " switch (i) {\n" +
+ " case 1:\n" +
+ " break;\n" +
+ " default:\n" +
+ " return;\n" +
+ " }\n" +
+ " } finally {\n" +
+ " d;\n" +
+ " var /** @type {Object} */ a = __localFn0__;\n" +
+ " eee.dd;\n" +
+ " eee.dd;\n" +
+ " eee.dd;\n" +
+ " eee.dd;\n" +
+ " }\n" +
+ " }\n" +
+ " var foreachiter0_target = obj;\n" +
+ " foo : for (var foreachiter0 in foreachiter0_target) \n" +
+ " {\n" +
+ " var i = foreachiter0_target[foreachiter0];\n" +
+ " \n" +
+ " break foo;}\n" +
+ " ;\n};\n\n\n" +
+ "/**\n * Metadata\n" +
+ " *\n" +
+ " * @type {Object.<string, Array.<Object>>}\n" +
+ " */\n" +
+ "FalconTest_A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'FalconTest_A', qName: 'FalconTest_A'}] };\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Prevent renaming of class. Needed for reflection.\n" +
+ " */\n" +
+ "goog.exportSymbol('FalconTest_A', FalconTest_A);\n" +
+ "\n" +
+ "\n" +
+ "\n" +
+ "/**\n" +
+ " * Reflection\n" +
+ " *\n" +
+ " * @return {Object.<string, Function>}\n" +
+ " */\n" +
+ "FalconTest_A.prototype.FLEXJS_REFLECTION_INFO = function () {\n" +
+ "return {\n" +
+ " variables: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " accessors: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " },\n" +
+ " methods: function () {\n" +
+ " return {\n" +
+ " };\n" +
+ " }\n" +
+ "};\n" +
+ "};\n");
+ }
+
+ @Override
+ protected IBackend createBackend()
+ {
+ return new FlexJSBackend();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
new file mode 100644
index 0000000..02965c0
--- /dev/null
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
@@ -0,0 +1,141 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.codegen.js.goog;
+
+import org.apache.flex.compiler.driver.IBackend;
+import org.apache.flex.compiler.internal.codegen.as.TestAccessorMembers;
+import org.apache.flex.compiler.internal.driver.js.goog.GoogBackend;
+import org.apache.flex.compiler.tree.as.IGetterNode;
+import org.apache.flex.compiler.tree.as.ISetterNode;
+import org.junit.Test;
+
+/**
+ * This class tests the production of valid 'goog' JS code for Class Accessor
+ * members.
+ *
+ * @author Michael Schmalle
+ * @author Erik de Bruin
+ */
+public class TestGoogAccessorMembers extends TestAccessorMembers
+{
+ @Override
+ @Test
+ public void testGetAccessor()
+ {
+ IGetterNode node = (IGetterNode) getAccessor("function get foo():int{}");
+ asBlockWalker.visitGetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', "
+ + "\n\t{get:function() {\n\t}, configurable:true}\n)");
+ }
+
+ @Test
+ public void testGetAccessor_withBody()
+ {
+ IGetterNode node = (IGetterNode) getAccessor("function get foo():int{return -1;}");
+ asBlockWalker.visitGetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', "
+ + "\n\t{get:function() {\n\t\tvar self = this;\n\t\treturn -1;\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testGetAccessor_withNamespace()
+ {
+ IGetterNode node = (IGetterNode) getAccessor("public function get foo():int{return -1;}");
+ asBlockWalker.visitGetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', "
+ + "\n\t{get:function() {\n\t\tvar self = this;\n\t\treturn -1;\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testGetAccessor_withNamespaceOverride()
+ {
+ // TODO (erikdebruin) need to figure out how to handle calls to
+ // 'super' since the JS getter is actually an
+ // anonymous function... goog.bind or goog.partial?
+ IGetterNode node = (IGetterNode) getAccessor("public override function get foo():int{super.foo(); return -1;}");
+ asBlockWalker.visitGetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', \n\t{get:function() {\n\t\tvar self = this;\n\t\tFalconTest_A.base(this, 'foo');\n\t\treturn -1;\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testGetAccessor_withStatic()
+ {
+ IGetterNode node = (IGetterNode) getAccessor("public static function get foo():int{return -1;}");
+ asBlockWalker.visitGetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A, \n\t'foo', \n\t{get:function() {\n\t\treturn -1;\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testSetAccessor()
+ {
+ ISetterNode node = (ISetterNode) getAccessor("function set foo(value:int):void{}");
+ asBlockWalker.visitSetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', \n\t{set:function(value)"
+ + " {\n\t}, configurable:true}\n)");
+ }
+
+ @Test
+ public void testSetAccessor_withBody()
+ {
+ ISetterNode node = (ISetterNode) getAccessor("function set foo(value:int):void{trace('haai');}");
+ asBlockWalker.visitSetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', "
+ + "\n\t{set:function(value) {\n\t\tvar self = this;\n\t\ttrace('haai');\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testSetAccessor_withNamespace()
+ {
+ ISetterNode node = (ISetterNode) getAccessor("public function set foo(value:int):void{}");
+ asBlockWalker.visitSetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', \n\t{set:function(value)"
+ + " {\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testSetAccessor_withNamespaceOverride()
+ {
+ // TODO (erikdebruin) see: testGetAccessor_withNamespaceOverride
+ ISetterNode node = (ISetterNode) getAccessor("public override function set foo(value:int):void{super.foo();}");
+ asBlockWalker.visitSetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A.prototype, \n\t'foo', \n\t{set:function(value) {\n\t\tvar self = this;\n\t\tFalconTest_A.base(this, 'foo');\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ @Test
+ public void testSetAccessor_withStatic()
+ {
+ ISetterNode node = (ISetterNode) getAccessor("public static function set foo(value:int):void{}");
+ asBlockWalker.visitSetter(node);
+ assertOut("Object.defineProperty(\n\tFalconTest_A, \n\t'foo', \n\t{set:function(value) {\n\t}, configurable:true}\n)");
+ }
+
+ @Override
+ protected IBackend createBackend()
+ {
+ return new GoogBackend();
+ }
+}