blob: c045348adf546b066378fe7acc6e8b7e60aeafee [file] [log] [blame]
/*
*
* 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.royale.compiler.internal.codegen.js.royale;
import java.io.File;
import org.apache.royale.compiler.driver.IBackend;
import org.apache.royale.compiler.internal.codegen.js.goog.TestGoogGlobalClasses;
import org.apache.royale.compiler.internal.driver.js.royale.RoyaleBackend;
import org.apache.royale.compiler.internal.driver.js.goog.JSGoogConfiguration;
import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
import org.apache.royale.compiler.internal.tree.as.BinaryOperatorAssignmentNode;
import org.apache.royale.compiler.internal.tree.as.VariableNode;
import org.apache.royale.compiler.tree.as.IASNode;
import org.apache.royale.compiler.tree.as.IBinaryOperatorNode;
import org.apache.royale.compiler.tree.as.IForLoopNode;
import org.apache.royale.compiler.tree.as.IFunctionCallNode;
import org.apache.royale.compiler.tree.as.IFunctionNode;
import org.apache.royale.compiler.tree.as.IUnaryOperatorNode;
import org.apache.royale.compiler.tree.as.IVariableNode;
import org.junit.Test;
import org.junit.Ignore;
/**
* @author Erik de Bruin
*/
public class TestRoyaleGlobalClasses extends TestGoogGlobalClasses
{
@Override
public void setUp()
{
backend = createBackend();
project = new RoyaleJSProject(workspace, backend);
project.config = new JSGoogConfiguration();
project.setProxyBaseClass("custom.TestProxy");
super.setUp();
}
@Override
protected IBackend createBackend()
{
return new RoyaleBackend();
}
@Override
@Test
public void testArguments()
{
IFunctionNode node = getMethod("function a():void { trace(arguments);}");
asBlockWalker.visitFunction(node);
assertOut("RoyaleTest_A.prototype.a = function() {\n org.apache.royale.utils.Language.trace(arguments);\n}");
}
@Test
public void testArrayNoArgs()
{
IVariableNode node = getVariable("var a:Array = new Array();");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = new Array()");
}
@Test
public void testArrayStringArgs()
{
IVariableNode node = getVariable("var a:Array = new Array('Hello', 'World');");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = new Array('Hello', 'World')");
}
@Test
public void testArraySizeArg()
{
IVariableNode node = getVariable("var a:Array = new Array(30);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = new Array(30)");
}
@Test
public void testArrayNumberArgs()
{
IVariableNode node = getVariable("var a:Array = new Array(30, 40);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = new Array(30, 40)");
}
@Test
public void testArrayArrayArg()
{
IVariableNode node = getVariable("var a:Array = new Array(['Hello', 'World']);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = new Array(['Hello', 'World'])");
}
@Test
public void testArrayConstCaseInsensitive()
{
IVariableNode node = getVariable("var a:Number = Array.CASEINSENSITIVE");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = 1");
}
@Test
public void testArrayConstNumeric()
{
IVariableNode node = getVariable("var a:Number = Array.NUMERIC");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = 16");
}
@Test
public void testArrayRemoveAt()
{
File pg = testAdapter.getPlayerglobal();
if (arrayHasInsertAtRemoveAt(pg))
{
// requires FP19 or newer
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array(); a.removeAt(2)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.splice(2, 1)");
}
}
@Test
public void testArrayInsertAt()
{
File pg = testAdapter.getPlayerglobal();
if (arrayHasInsertAtRemoveAt(pg))
{
// requires FP19 or newer
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array(); a.insertAt(2, 'foo')");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.splice(2, 0, 'foo')");
}
}
private boolean arrayHasInsertAtRemoveAt(File pg) {
if (pg == null) return true;
String path = pg.getAbsolutePath();
String[] parts = path.split("/");
if (path.contains("\\"))
parts = path.split("\\\\");
for (String part : parts)
{
if (part.contains("."))
{
// see if it is the playerglobal version string
String[] versionParts = part.split("\\.");
if (versionParts.length != 2) return false;
try {
int major = Integer.parseInt(versionParts[0]);
if (major >= 19) return true;
} catch (NumberFormatException e)
{
}
}
}
return false;
}
@Test
public void testArraySortNoArgs()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();a.sort()");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.sort()");
}
@Test
public void testArraySortOptArgOnly()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();a.sort(Array.NUMERIC)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sort(a, 16)");
}
@Test
public void testArraySortCompareFunctionArgOnly()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();var f:Function = function():void {};a.sort(f)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.sort(f)");
}
@Test
public void testArraySortCompareFunctionWithOptArg()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();var f:Function = function():void {};a.sort(f, Array.UNIQUESORT)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sort(a, f, 4)");
}
@Test
public void testArraySortCompareFunctionWithOptNumberArg()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();var f:Function = function():void {};a.sort(Array.UNIQUESORT)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sort(a, 4)");
}
@Test
public void testArraySortCompareFunctionWithOptFunctionArg()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array();var f:Function = function():void {};a.sort(f)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.sort(f)");
}
@Test
public void testArraySortOn()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array(); a.sortOn('foo')");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sortOn(a, 'foo')");
}
@Test
public void testArraySortOnTwoArgs()
{
IBinaryOperatorNode node = getBinaryNode("var a:Array = new Array(); a.sortOn('foo', 10)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sortOn(a, 'foo', 10)");
}
@Test
public void testInt()
{
IVariableNode node = getVariable("var a:int = new int(\"123\");");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = org.apache.royale.utils.Language._int(\"123\")");
}
@Override
@Test
public void testUint()
{
IVariableNode node = getVariable("var a:uint = new uint(-100);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = org.apache.royale.utils.Language.uint(-100)");
}
@Test
public void testIntConstMaxValue()
{
IVariableNode node = getVariable("var a:Number = int.MAX_VALUE");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = 2147483647");
}
@Test
public void testIntConstMinValue()
{
IVariableNode node = getVariable("var a:Number = int.MIN_VALUE");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = -2147483648");
}
@Test
public void testUintConstMaxValue()
{
IVariableNode node = getVariable("var a:Number = uint.MAX_VALUE");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = 4294967295");
}
@Test
public void testUintConstMinValue()
{
IVariableNode node = getVariable("var a:Number = uint.MIN_VALUE");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = 0");
}
@Override
@Test
public void testMath()
{
IVariableNode node = getVariable("var a:Number = Math.PI;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = Math.PI");
}
@Override
@Test
public void testClass()
{
IVariableNode node = getVariable("var a:Class = String; var b:* = new a('test')");
node = (IVariableNode)(node.getParent().getChild(1));
asBlockWalker.visitVariable(node);
assertOut("var /** @type {*} */ b = org.apache.royale.utils.Language.resolveUncertain(new a('test'))");
}
@Test
public void testDateSetSeconds()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.seconds = 10");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setSeconds(10)");
}
@Test
public void testDateSetDate()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.date = 10");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setDate(10)");
}
@Test
public void testDateGetTimeInMilliseconds()
{
IVariableNode node = getVariable("var a:Date = new Date(); var b:Number = a.time");
node = (IVariableNode)(node.getParent().getChild(1));
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ b = a.getTime()");
}
@Test
public void testDateSetTimeInMilliseconds()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.time = 10");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setTime(10)");
}
@Test
public void testDateIncreaseTimeInMilliseconds()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.time += 10");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setTime(a.getTime() + 10)");
}
@Test
public void testDateGetMinutes()
{
IVariableNode node = getVariable("var a:Date = new Date(); var b:Number = a.minutes");
node = (IVariableNode)(node.getParent().getChild(1));
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ b = a.getMinutes()");
}
@Test
public void testDateSetMinutes()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.minutes = 10");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setMinutes(10)");
}
@Test
public void testDateIncreaseMinutes()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.minutes += 10");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setMinutes(a.getMinutes() + 10)");
}
@Test
public void testDateGetMinutesMethod()
{
IVariableNode node = getVariable("var a:Date = new Date(); var b:Number = a.getMinutes()");
node = (IVariableNode)(node.getParent().getChild(1));
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ b = a.getMinutes()");
}
@Test
public void testDateSetMinutesMethod()
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.setMinutes(10, 0, 0)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.setMinutes(10, 0, 0)");
}
@Override
@Test
public void testVector()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))(['Hello', 'World'])");
}
@Test
public void testVectorLiteral_1()
{
IVariableNode node = getVariable("var a:Vector.<String> = new <String>[];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array.<string>} */ a = org.apache.royale.utils.Language.synthVector('String')['coerce']([])");
}
@Test
public void testVectorLiteral_2()
{
IVariableNode node = getVariable("var a:Vector.<int> = new <int>[0, 1, 2, 3];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array.<number>} */ a = org.apache.royale.utils.Language.synthVector('int')['coerce']([0, 1, 2, 3])");
}
@Test
public void testVectorLiteral_3()
{
IVariableNode node = getVariable("var a:Vector.<String> = new <String>[\"one\", \"two\", \"three\";");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array.<string>} */ a = org.apache.royale.utils.Language.synthVector('String')['coerce']([\"one\", \"two\", \"three\"])");
}
@Test
public void testVectorNoArgs()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>();");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))()");
}
@Test
public void testVectorStringArgs()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>('Hello', 'World');");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))('Hello', 'World')");
}
@Test
public void testVectorStringArgs3()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>('Hello', 'World', 'Three');");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))('Hello', 'World', 'Three')");
}
@Test
public void testVectorSizeArg()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))(30)");
}
@Test
public void testVectorNumberArgs()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30, 40);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))(30, 40)");
}
@Test
public void testVectorArrayArg()
{
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array.<string>} */ a = new (org.apache.royale.utils.Language.synthVector('String'))(['Hello', 'World'])");
}
@Test
public void testVectorSetLength()
{
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.length = 20)");
asBlockWalker.visitBinaryOperator(node);
assertOut("a[org.apache.royale.utils.Language.SYNTH_TAG_FIELD].length = 20");
}
@Test
public void testCustomVectorSetLength()
{
project.config.setJsVectorEmulationClass(null, "Anything");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.length = 20)");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.length = 20");
}
@Test
public void testVectorRemoveAt()
{
File pg = testAdapter.getPlayerglobal();
if (arrayHasInsertAtRemoveAt(pg))
{
// requires FP19 or newer
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.removeAt(2)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a['removeAt'](2)");
}
}
@Test
public void testCustomVectorRemoveAt()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.removeAt(2)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.removeAt(2)");
}
@Test
public void testCustomVectorAsArrayRemoveAt()
{
project.config.setJsVectorEmulationClass(null, "Array");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.removeAt(2)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.splice(2, 1)[0]");
}
@Test
public void testVectorInsertAt()
{
File pg = testAdapter.getPlayerglobal();
if (arrayHasInsertAtRemoveAt(pg))
{
// requires FP19 or newer
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.insertAt(2, 'foo')");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a['insertAt'](2, 'foo')");
}
}
@Test
public void testCustomVectorInsertAt()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.insertAt(2, 'foo')");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.insertAt(2, 'foo')");
}
@Test
public void testCustomVectorAsArrayInsertAt()
{
project.config.setJsVectorEmulationClass(null, "Array");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<String> = new Vector.<String>(); a.insertAt(2, 'foo')");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.splice(2, 0, 'foo')");
}
@Test
public void testCustomVector()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {CustomVector} */ a = new CustomVector(['Hello', 'World'], 'String')");
}
@Test
public void testCustomVectorLiteral_1()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new <String>[];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {CustomVector} */ a = new CustomVector([], 'String')");
}
@Test
public void testCustomVectorLiteral_1a()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new <String>[];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = []");
}
@Test
public void testCustomVectorLiteral_2()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<int> = new <int>[0, 1, 2, 3];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {CustomVector} */ a = new CustomVector([0, 1, 2, 3], 'int')");
}
@Test
public void testCustomVectorLiteral_2a()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<int> = new <int>[0, 1, 2, 3];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = [0, 1, 2, 3]");
}
@Test
public void testCustomVectorLiteral_3()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new <String>[\"one\", \"two\", \"three\"];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {CustomVector} */ a = new CustomVector([\"one\", \"two\", \"three\"], 'String')");
}
@Test
public void testCustomVectorLiteral_3a()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new <String>[\"one\", \"two\", \"three\"];");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = [\"one\", \"two\", \"three\"]");
}
@Test
public void testCustomVectorNoArgs()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>();");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {CustomVector} */ a = new CustomVector([], 'String')");
}
@Test
public void testCustomVectorNoArgs2()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>();");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = []");
}
@Test
public void testCustomVectorStringArgs()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>('Hello', 'World');");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {CustomVector} */ a = new CustomVector('Hello', 'String')");
}
@Test
public void testCustomVectorStringArgs3()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>('Hello', 'World', 'Three');");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {CustomVector} */ a = new CustomVector('Hello', 'String')");
}
@Test
public void testCustomVectorSizeArg()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {CustomVector} */ a = new CustomVector(30, 'String')");
}
@Test
public void testCustomVectorSizeArg2()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = org.apache.royale.utils.Language.arrayAsVector(30, 'String')");
}
@Test
public void testCustomVectorSizeAndFixedArgs()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30, true);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {CustomVector} */ a = new CustomVector(30, 'String', true)");
}
@Test
public void testCustomVectorSizeAndFixedArgs2()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30, true);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Array} */ a = org.apache.royale.utils.Language.arrayAsVector(30, 'String')");
}
@Test
public void testCustomVectorNumberArgs()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30, 40);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {CustomVector} */ a = new CustomVector(30, 'String')");
}
@Test
public void testCustomVectorNumberArgs2()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(30, 40);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array} */ a = org.apache.royale.utils.Language.arrayAsVector(30, 'String')");
}
@Test
public void testCustomVectorArrayArg()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {CustomVector} */ a = new CustomVector(['Hello', 'World'], 'String')");
}
@Test
public void testCustomVectorArrayArg2()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Array} */ a = org.apache.royale.utils.Language.arrayAsVector(['Hello', 'World'], 'String')");
}
@Test
public void testDefaultVectorClassRepresentation()
{
IVariableNode node = getVariable("var a:Class = Vector.<String>;");
asBlockWalker.visitVariable(node);
//MXMLC does not report an error. Should we?
assertOut("var /** @type {Object} */ a = org.apache.royale.utils.Language.synthVector('String')");
}
@Test
public void testCustomVectorClassRepresentation()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IVariableNode node = getVariable("var a:Class = Vector.<String>;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Object} */ a = CustomVector");
}
@Test
public void testCustomVectorClassRepresentation2()
{
project.config.setJsVectorEmulationClass(null, "Array");
IVariableNode node = getVariable("var a:Class = Vector.<String>;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Object} */ a = Array");
}
@Test
public void testDefaultVectorSortNumericArg()
{
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<Number> = new Vector.<Number>();a.sort(Array.NUMERIC)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sort(a, 16)");
}
@Test
public void testCustomVectorRepresentationSortNumericArg()
{
project.config.setJsVectorEmulationClass(null, "CustomVector");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<Number> = new Vector.<Number>();a.sort(Array.NUMERIC)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("a.sort(16)");
}
@Test
public void testCustomVectorAsArrayRepresentationSortNumericArg()
{
project.config.setJsVectorEmulationClass(null, "Array");
IBinaryOperatorNode node = getBinaryNode("var a:Vector.<Number> = new Vector.<Number>();a.sort(Array.NUMERIC)");
IFunctionCallNode parentNode = (IFunctionCallNode)(node.getParent());
asBlockWalker.visitFunctionCall(parentNode);
assertOut("org.apache.royale.utils.Language.sort(a, 16)");
}
@Override
@Test
public void testBoolean()
{
IVariableNode node = getVariable("var a:Boolean = new Boolean(1);");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {boolean} */ a = Boolean(1)");
}
@Override
@Test
public void testNumber()
{
IVariableNode node = getVariable("var a:Number = new Number(\"1\");");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ a = Number(\"1\")");
}
@Override
@Test
public void testString()
{
IVariableNode node = getVariable("var a:String = new String(\"100\");");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {string} */ a = String(\"100\")");
}
@Test
public void testXML()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\")");
}
@Test
public void testXMLLiteral()
{
IVariableNode node = getVariable("var a:XML = <top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( \"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\")");
}
@Test
public void testXMLLiteralWithQuote()
{
IVariableNode node = getVariable("var a:XML = <root title=\"That's Entertainment\"/>");
asBlockWalker.visitVariable(node);
String s = "var /** @type {XML} */ a = new XML( \"<root title=\\\"That's Entertainment\\\"/>\")";
assertOut(s);
}
@Test
public void testXMLLiteralMultiline()
{
IVariableNode node = getVariable("var a:XML = <top attr1='cat'>\n<child attr2='dog'>\n<grandchild attr3='fish'>text</grandchild>\n</child>\n</top>");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( \"<top attr1='cat'>\\n<child attr2='dog'>\\n<grandchild attr3='fish'>text</grandchild>\\n</child>\\n</top>\")");
}
@Test
public void testXMLLiteralMultilineNoSemicolon()
{
IVariableNode node = getVariable("var a:XML = <top />\nvar foo;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( '<top />')");
}
@Test
public void testXMLLiteralMultilineNoSemicolonWithAttribute()
{
IVariableNode node = getVariable("var a:XML = <top attr1='cat'/>\nvar foo;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( \"<top attr1='cat'/>\")");
}
@Test
public void testXMLLiteralWithTemplate()
{
VariableNode node = (VariableNode)getNode("private function get tagname():String { return 'name'; };\n" +
"private function get attributename():String { return 'id'; };\n" +
"private function get attributevalue():Number { return 5; };\n" +
"private function get content():String { return 'Fred'; };\n" +
"private function test() { var a:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>;}",
VariableNode.class, WRAP_LEVEL_CLASS);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( '<' + this.tagname + ' ' + this.attributename + '=' + '\"' + this.attributevalue + '\"' + '>' + this.content + '</' + this.tagname + '>')");
}
@Test
public void testXMLLiteralWithTemplateAndParams()
{
VariableNode node = (VariableNode)getNode("private function test(attributevalue:String) { var a:XML = <name attributeName={attributevalue} />;}",
VariableNode.class, WRAP_LEVEL_CLASS);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( '<name attributeName=' + '\"' + attributevalue + '\"' + ' />')");
}
@Test
public void testXMLLiteralWithTemplateExpression()
{
VariableNode node = (VariableNode)getNode("private function get tagname():String { return 'name'; };\n" +
"private function get attributename():String { return 'id'; };\n" +
"private function get attributevalue():Number { return 5; };\n" +
"private function get content():String { return 'Fred'; };\n" +
"private function test() { var a:XML = <{tagname} {attributename}={attributevalue + \" \" + attributevalue}>{content}</{tagname}>;}",
VariableNode.class, WRAP_LEVEL_CLASS);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( '<' + this.tagname + ' ' + this.attributename + '=' + '\"' + this.attributevalue + \" \" + this.attributevalue + '\"' + '>' + this.content + '</' + this.tagname + '>')");
}
@Test
public void testXMLLiteralWithTemplateAndStaticVar()
{
VariableNode node = (VariableNode)getNode("private static function get txtStr():String { return 'foo'; }; private function test() { var a:XML = <text><content>{txtStr}</content></text>;}",
VariableNode.class, WRAP_LEVEL_CLASS);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = new XML( '<text><content>' + RoyaleTest_A.txtStr + '</content></text>')");
}
@Test
public void testXMLLiteralAsParam()
{
IFunctionCallNode node = (IFunctionCallNode)getNode("var a:XML; a.appendChild(<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>)",
IFunctionCallNode.class);
asBlockWalker.visitFunctionCall(node);
assertOut("a.appendChild(new XML( \"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\"))");
}
@Test
public void testXMLLiteralInReassign()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = <foo />; a = <top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>)");
asBlockWalker.visitBinaryOperator(node);
assertOut("a = new XML( \"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\")");
}
@Test
public void testXMLSingleDot()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a.child;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.child('child')");
}
@Test
public void testXMLSingleDotBracket()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a[\"child\"];");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.child(\"child\")");
}
@Test
public void testXMLSingleDotBracketQName()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var q:QName; var b:XMLList = a[q];");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(2);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.child(q)");
}
@Test
public void testXMLSingleDotChain()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a.child.grandchild;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.child('child').child('grandchild')");
}
@Test
public void testXMLDelete()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child;");
asBlockWalker.visitUnaryOperator(node);
assertOut("a.removeChild('child')");
}
@Test
public void testXMLDeleteAttribute()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.@attr1;");
asBlockWalker.visitUnaryOperator(node);
assertOut("a.removeChild(a.attribute('attr1'))");
}
@Test
public void testXMLDeleteChain()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child.grandchild;");
asBlockWalker.visitUnaryOperator(node);
assertOut("a.child('child').removeChild('grandchild')");
}
@Test
public void testXMLDeleteObjChain()
{
IUnaryOperatorNode node = getUnaryNode("public var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");private function foo() { delete this.a.child.grandchild;}",
WRAP_LEVEL_CLASS);
asBlockWalker.visitUnaryOperator(node);
assertOut("this.a.child('child').removeChild('grandchild')");
}
@Test
public void testXMLDeleteCastChain()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete XML(b.xml).child.grandchild;");
asBlockWalker.visitUnaryOperator(node);
assertOut("XML.conversion(b.xml).child('child').removeChild('grandchild')");
}
@Test
public void testXMLDeleteCastAsChain()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete (b.xml as XML).child.grandchild;");
asBlockWalker.visitUnaryOperator(node);
assertOut("org.apache.royale.utils.Language.as(b.xml, XML).child('child').removeChild('grandchild')");
}
@Test
public void testXMLListDelete()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child[0];");
asBlockWalker.visitUnaryOperator(node);
assertOut("a.child('child').removeChildAt(0)");
}
@Test
public void testXMLListChain()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");delete a.child.grandchild[0];");
asBlockWalker.visitUnaryOperator(node);
assertOut("a.child('child').child('grandchild').removeChildAt(0)");
}
@Test
public void testXMLListObjChain()
{
IUnaryOperatorNode node = getUnaryNode("public var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");private function foo() { delete this.a.child.grandchild[0];}",
WRAP_LEVEL_CLASS);
asBlockWalker.visitUnaryOperator(node);
assertOut("this.a.child('child').child('grandchild').removeChildAt(0)");
}
@Test
public void testXMLListCastChain()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete XML(b.xml).child.grandchild[0];");
asBlockWalker.visitUnaryOperator(node);
assertOut("XML.conversion(b.xml).child('child').child('grandchild').removeChildAt(0)");
}
@Test
public void testXMLListAsCastChain()
{
IUnaryOperatorNode node = getUnaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Object = { xml: a};delete (b.xml as XML).child.grandchild[0];");
asBlockWalker.visitUnaryOperator(node);
assertOut("org.apache.royale.utils.Language.as(b.xml, XML).child('child').child('grandchild').removeChildAt(0)");
}
@Test
public void testXMLListAccess()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var child:XML = a.child[0]");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ child = a.child('child')[0]");
}
@Test
public void testXMLListAccessComplex()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var child:XML = a.child[a.child.length()-1]");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ child = a.child('child')[a.child('child').length() - 1]");
}
@Test
public void testXMLListAssignment()
{
IBinaryOperatorNode node = (IBinaryOperatorNode)getNode("var a:XMLList = new XMLList();a[a.length()] = <foo/>;a[a.length()] = <baz/>;", IBinaryOperatorNode.class);
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setChild(a.length(), new XML( '<foo/>'))");
}
@Test
public void testXMLNameFunction()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:String = a.name();");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {string} */ b = org.apache.royale.utils.Language.string(a.name())");
}
@Test
public void testXMLListLengthFunction()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:int = a.child.length();");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ b = (a.child('child').length()) >> 0");
}
@Test
public void testXMLDoubleDot()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a..child;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.descendants('child')");
}
@Test
public void testXMLDoubleDotTwice()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a..child..grandchild;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.descendants('child').descendants('grandchild')");
}
@Ignore
public void testXMLDoubleDotLiteral()
{
IVariableNode node = getVariable("var xml:XML; var a:XML = xml..('http://ns.adobe.com/mxml/2009')::catalog_item[0];");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XML} */ a = xml.descendants('http://ns.adobe.com/mxml/2009::catalog_item')[0];");
}
@Test
public void testXMLAttribute()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a.@attr1;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.attribute('attr1')");
}
@Test
public void testXMLAttributeBracket()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a.@[\"attr1\"];");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.attribute(\"attr1\")");
}
@Test
public void testXMLAttributeBracket2()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a[\"@attr1\"];");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.attribute(\"attr1\")");
}
@Test
public void testXMLAttributeToString()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:String = a.@attr1;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {string} */ b = org.apache.royale.utils.Language.string(a.attribute('attr1'))");
}
@Test
public void testXMLAttributeToStringAsExpression()
{
IBinaryOperatorNode node = (IBinaryOperatorNode)getNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:String; b = a.@attr1;", IBinaryOperatorNode.class);
asBlockWalker.visitBinaryOperator(node);
assertOut("b = org.apache.royale.utils.Language.string(a.attribute('attr1'))");
}
@Test
public void testXMLAttributeToNumber()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Number = a.@attr1;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {number} */ b = Number(a.attribute('attr1'))");
}
@Test
public void testXMLAttributeToNumberAsExpression()
{
IBinaryOperatorNode node = (IBinaryOperatorNode)getNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:Number; b = a.@attr1;", IBinaryOperatorNode.class);
asBlockWalker.visitBinaryOperator(node);
assertOut("b = Number(a.attribute('attr1'))");
}
@Test
public void testStringSetToNull()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:String = null;");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {string} */ b = null");
}
@Test
public void testXMLFilter()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a..grandchild.(@attr2 == 'fish');");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.descendants('grandchild').filter(function(/** @type {XML} */ node){return (node.attribute('attr2') == 'fish')})");
}
@Test
public void testXMLFilterForChild()
{
IVariableNode node = getVariable("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");var b:XMLList = a..grandchild.(year == '2016');");
IASNode parentNode = node.getParent();
node = (IVariableNode) parentNode.getChild(1);
asBlockWalker.visitVariable(node);
assertOut("var /** @type {XMLList} */ b = a.descendants('grandchild').filter(function(/** @type {XML} */ node){return (node.child('year') == '2016')})");
}
@Test
public void testXMLFilterWithAttribute()
{
IBinaryOperatorNode node = (IBinaryOperatorNode)getNode("private var attribute:Function; private function test() {var a:XMLList; a = a.(attribute('name').length())};", IBinaryOperatorNode.class, WRAP_LEVEL_CLASS);
asBlockWalker.visitBinaryOperator(node);
assertOut("a = a.filter(function(/** @type {XML} */ node){return (node.attribute('name').length())})");
}
@Test
public void testXMLSetAttribute()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.@bar = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setAttribute('bar', 'foo')");
}
@Test
public void testXMLSetAttributeBracket()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.@[\"bar\"] = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setAttribute(\"bar\", 'foo')");
}
@Test
public void testXMLSetAttributeBracketProp()
{
IBinaryOperatorNode node = getBinaryNode("var z:String = 'prop';var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.@[z] = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setAttribute(z, 'foo')");
}
@Test
public void testXMLSetAttributeBracketPropObject()
{
IBinaryOperatorNode node = getBinaryNode("var z:Object = 'prop';var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.@[z] = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setAttribute(z, 'foo')");
}
@Test
public void testXMLSetAttributeBracketPropStar()
{
IBinaryOperatorNode node = getBinaryNode("var z:* = 'prop';var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.@[z] = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setAttribute(z, 'foo')");
}
@Test
public void testXMLSetChildAttributeBracketProp()
{
IBinaryOperatorNode node = getBinaryNode("var z:String = 'prop';var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.child.@['attr3'] = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.child('child').setAttribute('attr3', 'foo')");
}
@Test
public void testXMLListSetAttribute()
{
IBinaryOperatorNode node = getBinaryNode("var a:XMLList;a[1].@bar = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a[1].setAttribute('bar', 'foo')");
}
@Test
public void testXMLListSetAttributeIndex()
{
IBinaryOperatorNode node = getBinaryNode("var n:int = 1;var a:XMLList;a[n].@bar = 'foo'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a[n].setAttribute('bar', 'foo')");
}
@Test
public void testXMLListSetAttributeComplex()
{
IBinaryOperatorNode node = getBinaryNode("var a:XMLList;a.(@id==3).@height = '100px'");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.filter(function(/** @type {XML} */ node){return (node.attribute('id') == 3)}).setAttribute('height', '100px')");
}
@Test
public void testXMLSetChild()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.foo = a.child");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setChild('foo', a.child('child'))");
}
@Test
public void testXMLSetChildBracket()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a[\"foo\"] = a.child");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setChild('foo', a.child('child'))");
}
@Test
public void testXMLSetChildToObjectMember()
{
BinaryOperatorAssignmentNode node = (BinaryOperatorAssignmentNode) getNode(
"public class B {public var someProp:XML; public function B() { var a:XML; var b:B; b.someProp = a.child; }}",
BinaryOperatorAssignmentNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitBinaryOperator(node);
assertOut("b.someProp = a.child('child')");
}
@Test
public void testXMLListConcat()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.foo += a.child");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setChild('foo', a.child('foo').plus(a.child('child')))");
}
@Test
public void testXMLListConcat2()
{
IBinaryOperatorNode node = getBinaryNode("var a:XMLList; var b:XMLList; a += b");
asBlockWalker.visitBinaryOperator(node);
assertOut("a = a.plus(b)");
}
@Test
public void testXMLListAddAndAssign()
{
IBinaryOperatorNode node = getBinaryNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");a.foo = a.child + a..grandchild");
asBlockWalker.visitBinaryOperator(node);
assertOut("a.setChild('foo', a.child('child').plus(a.descendants('grandchild')))");
}
@Test
public void testXMLForLoop()
{
IForLoopNode node = getForLoopNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");for (var p:* in a) delete a[p];");
asBlockWalker.visitForLoop(node);
assertOut("for (var /** @type {*} */ p in a.elementNames())\n a.removeChild(p);");
}
@Test
public void testXMLForEachLoop()
{
IForLoopNode node = getForLoopNode("var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild attr3='fish'>text</grandchild></child></top>\");for each (var p:XMLList in a) var i:int = p.length();");
asBlockWalker.visitForLoop(node);
assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = (p.length()) >> 0;}\n");
}
@Test
public void testXMLForEachLoopAs()
{
IForLoopNode node = getForLoopNode("var a:*;for each (var p:XML in (a as XMLList)) var i:int = p.length();");
asBlockWalker.visitForLoop(node);
assertOut("var foreachiter0_target = org.apache.royale.utils.Language.as(a, XMLList);\nfor (var foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = (p.length()) >> 0;}\n");
}
@Test
public void testXMLForEachLoopCast()
{
IForLoopNode node = getForLoopNode("var a:*;for each (var p:XML in XMLList(a)) var i:int = p.length();");
asBlockWalker.visitForLoop(node);
assertOut("var foreachiter0_target = XMLList.conversion(a);\nfor (var foreachiter0 in foreachiter0_target.elementNames()) \n{\nvar p = foreachiter0_target[foreachiter0];\n\n var /** @type {number} */ i = (p.length()) >> 0;}\n");
}
@Test
public void testNamespaceNoArg()
{
IVariableNode node = getVariable("var a:Namespace = new Namespace();");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Namespace} */ a = new Namespace()");
}
@Test
public void testNamespaceOneArg()
{
IVariableNode node = getVariable("var a:Namespace = new Namespace('foo');");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Namespace} */ a = new Namespace('foo')");
}
@Test
public void testNamespaceTwoArg()
{
IVariableNode node = getVariable("var a:Namespace = new Namespace('foo', 'bar');");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {Namespace} */ a = new Namespace('foo', 'bar')");
}
@Test
public void testQNameNoArg()
{
IVariableNode node = getVariable("var a:QName = new QName();");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {QName} */ a = new QName()");
}
@Test
public void testQNameTwoArg()
{
IVariableNode node = getVariable("var a:QName = new QName(new Namespace('foo'), 'bar');");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {QName} */ a = new QName(new Namespace('foo'), 'bar')");
}
@Test
public void testQNameOneArg()
{
IVariableNode node = getVariable("var a:QName = new QName(new QName(new Namespace('foo'), 'bar'));");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {QName} */ a = new QName(new QName(new Namespace('foo'), 'bar'))");
}
@Test
public void testProxy()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();a.foo = 'bar'; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n a.setProperty('foo', 'bar');\n}");
}
@Test
public void testProxySetBrackets()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();a['foo'] = 'bar'; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n a.setProperty('foo', 'bar');\n}");
}
@Test
public void testProxySetBracketsStringVar()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();var foo:String;a[foo] = 'bar'; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {string} */ foo = null;\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n //var /** @type {string} */ foo = null;\n a.setProperty(foo, 'bar');\n}");
}
@Test
public void testProxySetBracketsUintVar()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();var foo:uint = 0;a[foo] = 'bar'; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n var /** @type {number} */ foo = 0;\n a.setProperty(foo, 'bar');\n}");
}
@Test
public void testProxyGet()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();var bar:* = a.foo; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n var /** @type {*} */ bar = a.getProperty('foo');\n}");
}
@Test
public void testProxyGetArrayIndexAndCompare()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy(); if (a[0] != null) return; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n if (a.getProperty(0) != null)\n return;\n}");
}
@Test
public void testProxyFunctionCall()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();var bar:* = a.foo(10,\"ten\"); }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n var /** @type {*} */ bar = a.callProperty('foo', 10, \"ten\");\n}");
}
@Test
public void testProxyConcat()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();var baz:String = a.foo + 'bar'; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n var /** @type {string} */ baz = a.getProperty('foo') + 'bar';\n}");
}
@Test
public void testProxyAddAndAssign()
{
IFunctionNode node = (IFunctionNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();a.foo += 'bar'; }}",
IFunctionNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitFunction(node);
assertOut("/**\n */\nfoo.bar.B.prototype.b = function() {\n var /** @type {custom.TestProxy} */ a = new custom.TestProxy();\n a.setProperty('foo', a.getProperty('foo') + 'bar');\n}");
}
@Test
public void testProxyForLoop()
{
IForLoopNode node = (IForLoopNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();for (var p:* in a) delete a[p];; }}",
IForLoopNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitForLoop(node);
assertOut("for (var /** @type {*} */ p in a.propertyNames())\n a.deleteProperty(p);");
}
@Test
public void testProxyForEachLoop()
{
IForLoopNode node = (IForLoopNode) getNode(
"import custom.TestProxy; public class B {public function b() { var a:TestProxy = new TestProxy();for each (var p:String in a) var i:int = p.length; }}",
IForLoopNode.class, WRAP_LEVEL_PACKAGE, true);
asBlockWalker.visitForLoop(node);
assertOut("var foreachiter0_target = a;\nfor (var foreachiter0 in foreachiter0_target.propertyNames()) \n{\nvar p = foreachiter0_target.getProperty(foreachiter0);\n\n var /** @type {number} */ i = (p.length) >> 0;}\n");
}
@Test
public void testRegExp_LiteralUnicode()
{
IVariableNode node = getVariable("var a:RegExp = /[\\u0065\\u0066\\u0067]/g;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /[efg]/g");
}
@Test
public void testRegExp_LiteralComplex1()
{
IVariableNode node = getVariable("var a:RegExp = /[\\u0009\\u000a\\u000d]/g;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /[\\u0009\\u000a\\u000d]/g");
}
@Test
public void testRegExp_LiteralComplex2()
{
IVariableNode node = getVariable("var a:RegExp = /\\u2028/;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /\\u2028/");
}
@Test
public void testRegExp_LiteralComplex3()
{
IVariableNode node = getVariable("var a:RegExp = /\\u000A|\\u000D\\u000A?/g;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /\\u000a|\\u000d\\u000a?/g");
}
@Test
public void testRegExp_LiteralComplex4()
{
IVariableNode node = getVariable("var a:RegExp = /[^\\u0009\\u000a\\u000d\\u0020]/g;");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /[^\\u0009\\u000a\\u000d\\u0020]/g");
}
@Test
public void testRegExp_LiteralComplex5()
{
IVariableNode node = getVariable("var a:RegExp = /[^\\s+(\\w+)(?:\\s*=\\s*(\".*?\"|'.*?'|[\\w\\.]+))?/sg");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /[^\\s+(\\w+)(?:\\s*=\\s*(\".*?\"|'.*?'|[\\w\\.]+))?/sg");
}
@Test
public void testRegExp_LiteralComplex6()
{
IVariableNode node = getVariable("var a:RegExp = /\\/$/g");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /\\/$/g");
}
@Test
public void testRegExp_LiteralComplex7()
{
IVariableNode node = getVariable("var a:RegExp = /.+\\//g");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /.+\\//g");
}
@Test
public void testRegExp_LiteralComplex8()
{
IVariableNode node = getVariable("var a:RegExp = /.+\\\\/g");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /.+\\\\/g");
}
@Test
public void testRegExp_LiteralComplex9()
{
IVariableNode node = getVariable("var a:RegExp = /^\\s*counter\\s*\\(\\s*ordered\\s*,\\s*/g");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /^\\s*counter\\s*\\(\\s*ordered\\s*,\\s*/g");
}
@Test
public void testRegExp_LiteralComplex10()
{
IVariableNode node = getVariable("var a:RegExp = /^(?:(?:https?|ftp):\\/\\/)?(?:[-\\w]+\\.)(?:[a-zA-Z\\.]{2,6})(?:[?\\/\\w\\.&=-]*)\\/?$/i");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /^(?:(?:https?|ftp):\\/\\/)?(?:[-\\w]+\\.)(?:[a-zA-Z\\.]{2,6})(?:[?\\/\\w\\.&=-]*)\\/?$/i");
}
@Test
public void testRegExp_LiteralComplex11()
{
IVariableNode node = getVariable("var a:RegExp = /\\\\/g");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /\\\\/g");
}
@Test
public void testRegExp_LiteralComplex12()
{
IVariableNode node = getVariable("var a:RegExp = /\\\\\\\\/g");
asBlockWalker.visitVariable(node);
assertOut("var /** @type {RegExp} */ a = /\\\\\\\\/g");
}
}