| /* |
| * |
| * 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 as; |
| |
| import java.io.File; |
| |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class ASNullConditionalOperatorDynamicTests extends ASFeatureTestsBase |
| { |
| |
| // null is considered nullish |
| @Test |
| public void testNullToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| // undefined is considered nullish |
| @Test |
| public void testUndefinedToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| // false is considered falsy, but not nullish |
| @Test |
| public void testFalseToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var b:Boolean = false;", |
| "var result:* = b?.['toString']();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| // NaN is considered falsy, but not nullish |
| @Test |
| public void testNaNToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = NaN;", |
| "var result:* = n?.['toString']();", |
| "assertEqual('dynamic null conditional', result, 'NaN');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| // 0 is considered falsy, but not nullish |
| @Test |
| public void testZeroToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 0;", |
| "var result:* = n?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '0');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| // empty string is considered falsy, but not nullish |
| @Test |
| public void testEmptyStringToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var s:String = '';", |
| "var result:* = s?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {};", |
| "var result:* = o?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '[object Object]');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedNullToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: null};", |
| "var result:* = o?.['a']?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedImplicitUndefinedToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {};", |
| "var result:* = o?.['a']?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedExplicitUndefinedToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: undefined};", |
| "var result:* = o?.['a']?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedFalseToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: false};", |
| "var result:* = o?.['a']?.['toString']();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedZeroToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: 0};", |
| "var result:* = o?.['a']?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '0');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedObjectToString() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}};", |
| "var result:* = o?.['a']?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '[object Object]');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: null};", |
| "var result:* = o?.['a'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testImplicitUndefinedFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {};", |
| "var result:* = o?.['a'];", |
| "assertEqual('dynamic null conditional', result, undefined);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testExplicitUndefinedFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: undefined};", |
| "var result:* = o?.['a'];", |
| "assertEqual('dynamic null conditional', result, undefined);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: false};", |
| "var result:* = o?.['a'];", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: 0};", |
| "var result:* = o?.['a'];", |
| "assertEqual('dynamic null conditional', result, 0);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var expected:Object = {};", |
| "var o:Object = {a: expected};", |
| "var result:* = o?.['a'];", |
| "assertEqual('dynamic null conditional', result, expected);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedNullFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: null}};", |
| "var result:* = o?.['a']?.['b'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedImplicitUndefinedFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}};", |
| "var result:* = o?.['a']?.['b'];", |
| "assertEqual('dynamic null conditional', result, undefined);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedExplicitUndefinedFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: undefined}};", |
| "var result:* = o?.['a']?.['b'];", |
| "assertEqual('dynamic null conditional', result, undefined);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedFalseFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: false}};", |
| "var result:* = o?.['a']?.['b'];", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedZeroFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: 0}};", |
| "var result:* = o?.['a']?.['b'];", |
| "assertEqual('dynamic null conditional', result, 0);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedObjectFieldAsValue() |
| { |
| String[] testCode = new String[] |
| { |
| "var expected:Object = {};", |
| "var o:Object = {a: {b: expected}};", |
| "var result:* = o?.['a']?.['b'];", |
| "assertEqual('dynamic null conditional', result, expected);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullMethodCallWithArgument() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['hasOwnProperty']('a');", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedMethodCallWithArgument() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['hasOwnProperty']('a');", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseMethodCallWithArgument() |
| { |
| String[] testCode = new String[] |
| { |
| "var b:Boolean = false;", |
| "var result:* = b?.['hasOwnProperty']('xyz');", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroMethodCallWithArgument() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 0;", |
| "var result:* = n?.['hasOwnProperty']('xyz');", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectMethodCallWithArgument() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: 123};", |
| "var result:* = o?.['hasOwnProperty']('a');", |
| "assertEqual('dynamic null conditional', result, true);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullWithDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a']['b'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedWithDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a']['b'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectWithDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}};", |
| "var result:* = o?.['a']['b'];", |
| "assertEqual('dynamic null conditional', result, undefined);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedObjectWithDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: 2}};", |
| "var result:* = o?.['a']['b'];", |
| "assertEqual('dynamic null conditional', result, 2);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullWithMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a'].b;", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedWithMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a'].b;", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectWithMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}};", |
| "var result:* = o?.['a'].b;", |
| "assertEqual('dynamic null conditional', result, undefined);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedObjectWithMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: 2}};", |
| "var result:* = o?.['a'].b;", |
| "assertEqual('dynamic null conditional', result, 2);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testDeepNesting() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = {a: {b: {c: {d1: undefined, d2: null, d3: 0, d4: false}}}};", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], undefined);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], 0);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], false);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), '0');", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), 'false');", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| "o = {a: {b: {c: {}}}};", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], undefined);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], undefined);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], undefined);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], undefined);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| "o = {a: {b: {}}};", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| "o = {a: {}};", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| "o = {};", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| "o = null;", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| "o = undefined;", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d3']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d4']?.toString(), null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d1']?.['e'], null);", |
| "assertEqual('dynamic null conditional', o?.['a']?.['b']?.['c']?.['d2']?.['e'], null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullToStringInsideIf() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:Boolean = false;", |
| "if (o?.toString() === null) {", |
| " result = true;", |
| "}", |
| "assertEqual('dynamic null conditional', result, true);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedToStringInsideIf() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:Boolean = false;", |
| "if (o?.['toString']() === null) {", |
| " result = true;", |
| "}", |
| "assertEqual('dynamic null conditional', result, true);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseToStringInsideIf() |
| { |
| String[] testCode = new String[] |
| { |
| "var b:Boolean = false;", |
| "var result:Boolean = false;", |
| "if (b?.['toString']() === null) {", |
| " result = true;", |
| "}", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroToStringInsideIf() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 0;", |
| "var result:Boolean = false;", |
| "if (n?.['toString']() === null) {", |
| " result = true;", |
| "}", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectToStringInsideIf() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {};", |
| "var result:Boolean = false;", |
| "if (o?.['toString']() === null) {", |
| " result = true;", |
| "}", |
| "assertEqual('dynamic null conditional', result, false);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullNestedMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['hasOwnProperty']('a')?.toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedNestedMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['hasOwnProperty']('a')?.toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseNestedMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var b:Boolean = false;", |
| "var result:* = b?.['hasOwnProperty']('a')?.toString();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroNestedMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 0;", |
| "var result:* = n?.['hasOwnProperty']('a')?.toString();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectNestedMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: 123};", |
| "var result:* = o?.['hasOwnProperty']('a')?.toString();", |
| "assertEqual('dynamic null conditional', result, 'true');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullWithDoubleNormalMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a'].b.c;", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedWithDoubleNormalMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a'].b.c;", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectWithDoubleNormalMemberAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: {c: 123}}};", |
| "var result:* = o?.['a'].b.c;", |
| "assertEqual('dynamic null conditional', result, 123);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullThenNormalMemberAccessThenMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a'].toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedThenNormalMemberAccessThenMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a'].toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectThenNormalMemberAccessThenMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}};", |
| "var result:* = o?.['a'].toString();", |
| "assertEqual('dynamic null conditional', result, '[object Object]');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullThenNormalMemberAccessThenDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a'].b['c'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedThenNormalMemberAccessThenDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a'].b['c'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectThenNormalMemberAccessThenDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: {c: 123}}};", |
| "var result:* = o?.['a'].b['c'];", |
| "assertEqual('dynamic null conditional', result, 123);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullFieldToStringWithNormalMemberAccessBefore() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: null};", |
| "var result:* = o.a?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testImplicitUndefinedFieldToStringWithNormalMemberAccessBefore() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {};", |
| "var result:* = o.a?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testExplicitUndefinedFieldToStringWithNormalMemberAccessBefore() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: undefined};", |
| "var result:* = o.a?.['toString']();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseFieldToStringWithNormalMemberAccessBefore() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: false};", |
| "var result:* = o.a?.['toString']();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroFieldToStringWithNormalMemberAccessBefore() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: 0};", |
| "var result:* = o.a?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '0');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectFieldToStringWithNormalMemberAccessBefore() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}};", |
| "var result:* = o.a?.['toString']();", |
| "assertEqual('dynamic null conditional', result, '[object Object]');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullWithDoubleDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a']['b']['c'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedWithDoubleDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a']['b']['c'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectWithDoubleDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: {c: 123}}};", |
| "var result:* = o?.['a']['b']['c'];", |
| "assertEqual('dynamic null conditional', result, 123);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullDoubleMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['hasOwnProperty']('a').toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedDoubleMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['hasOwnProperty']('a').toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseDoubleMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var b:Boolean = false;", |
| "var result:* = b?.['hasOwnProperty']('a').toString();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroDoubleMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 0;", |
| "var result:* = n?.['hasOwnProperty']('a').toString();", |
| "assertEqual('dynamic null conditional', result, 'false');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectDoubleMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: 123};", |
| "var result:* = o?.['hasOwnProperty']('a').toString();", |
| "assertEqual('dynamic null conditional', result, 'true');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullWithDynamicAccessAndMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['a']['b'].toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedWithDynamicAccessAndMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['a']['b'].toString();", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectWithDynamicAccessAndMethodCall() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {b: 123}};", |
| "var result:* = o?.['a']['b'].toString();", |
| "assertEqual('dynamic null conditional', result, '123');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNullWithMethodCallAndDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = null;", |
| "var result:* = o?.['toString']()['length'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testUndefinedWithMethodCallAndDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:* = undefined;", |
| "var result:* = o?.['toString']()['length'];", |
| "assertEqual('dynamic null conditional', result, null);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testFalseWithMethodCallAndDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var b:Boolean = false;", |
| "var result:* = b?.['toString']()['length'];", |
| "assertEqual('dynamic null conditional', result, 5);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testZeroWithMethodCallAndDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 0;", |
| "var result:* = n?.['toString']()['length'];", |
| "assertEqual('dynamic null conditional', result, 1);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testObjectWithMethodCallAndDynamicAccess() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {};", |
| "var result:* = o?.['toString']()['length'];", |
| "assertEqual('dynamic null conditional', result, '[object Object]'.length);", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testStringFieldNameWithConcatenation() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 123.4;", |
| "var result:* = n?.['to' + 'String']();", |
| "assertEqual('dynamic null conditional', result, '123.4');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testNestedStringFieldNameWithConcatenation() |
| { |
| String[] testCode = new String[] |
| { |
| "var o:Object = {a: {}}", |
| "var result:* = o?.['a']?.['to' + 'String']();", |
| "assertEqual('dynamic null conditional', result, '[object Object]');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testVariableFieldName() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 123.4;", |
| "var fieldName:String = 'toString';", |
| "var result:* = n?.[fieldName]();", |
| "assertEqual('dynamic null conditional', result, '123.4');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| @Test |
| public void testVariableFieldNameWithConcatenation() |
| { |
| String[] testCode = new String[] |
| { |
| "var n:Number = 123.4;", |
| "var f1:String = 'to';", |
| "var f2:String = 'String';", |
| "var result:* = n?.[f1 + f2]();", |
| "assertEqual('dynamic null conditional', result, '123.4');", |
| }; |
| String source = getAS(new String[0], new String[0], testCode, new String[0]); |
| |
| compileAndRun(source); |
| } |
| |
| } |