5f0de26d48
Change-Id: If099be4f71ba551df0dc3d69815ae6a9f55d1eba Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97781 Commit-Queue: Brian Wilkerson <brianwilkerson@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
511 lines
13 KiB
Dart
511 lines
13 KiB
Dart
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
@deprecated
|
|
library analyzer.test.constant_test;
|
|
|
|
import 'package:analyzer/dart/element/type.dart';
|
|
import 'package:analyzer/src/generated/constant.dart';
|
|
import 'package:test/test.dart';
|
|
import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
|
import '../src/dart/resolution/driver_resolution.dart';
|
|
|
|
main() {
|
|
defineReflectiveSuite(() {
|
|
defineReflectiveTests(ConstantEvaluatorTest);
|
|
});
|
|
}
|
|
|
|
@reflectiveTest
|
|
class ConstantEvaluatorTest extends DriverResolutionTest {
|
|
test_bitAnd_int_int() async {
|
|
await _assertValueInt(74 & 42, "74 & 42");
|
|
}
|
|
|
|
test_bitNot() async {
|
|
await _assertValueInt(~42, "~42");
|
|
}
|
|
|
|
test_bitOr_int_int() async {
|
|
await _assertValueInt(74 | 42, "74 | 42");
|
|
}
|
|
|
|
test_bitXor_int_int() async {
|
|
await _assertValueInt(74 ^ 42, "74 ^ 42");
|
|
}
|
|
|
|
test_constructorInvocation_assert_false() async {
|
|
var result = await _getExpressionValue("const C(0)", context: '''
|
|
class C {
|
|
const C(int x) : assert(x > 0);
|
|
}
|
|
''');
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_constructorInvocation_assert_inherited() async {
|
|
var result = await _getExpressionValue(
|
|
"const Center(name: 'v')",
|
|
context: '''
|
|
class Align {
|
|
final double widthFactor;
|
|
const Align({String name, this.widthFactor})
|
|
assert(widthFactor == null || widthFactor >= 0.0);
|
|
}
|
|
class Center extends Align {
|
|
const Center({String name})
|
|
: super(name: name);
|
|
}
|
|
''',
|
|
);
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, isNotNull);
|
|
expect(value.type.name, 'Center');
|
|
DartObject superclassFields = value.getField(GenericState.SUPERCLASS_FIELD);
|
|
DartObject widthFactor = superclassFields.getField('widthFactor');
|
|
expect(widthFactor, isNotNull);
|
|
expect(widthFactor.isNull, isTrue);
|
|
}
|
|
|
|
test_constructorInvocation_assert_true() async {
|
|
var result = await _getExpressionValue("const C(3)", context: '''
|
|
class C {
|
|
const C(int x) : assert(x > 0);
|
|
}
|
|
''');
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, isNotNull);
|
|
expect(value.type.name, 'C');
|
|
}
|
|
|
|
test_constructorInvocation_fieldInitializer() async {
|
|
var result = await _getExpressionValue("const C(2)", context: '''
|
|
class C {
|
|
final int x;
|
|
const C(this.x);
|
|
}
|
|
''');
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, isNotNull);
|
|
expect(value.type.name, 'C');
|
|
DartObject x = value.getField('x');
|
|
expect(x, isNotNull);
|
|
expect(x.type.name, 'int');
|
|
expect(x.toIntValue(), 2);
|
|
}
|
|
|
|
test_constructorInvocation_noArgs() async {
|
|
var result = await _getExpressionValue(
|
|
"const C()",
|
|
context: 'class C {const C();}',
|
|
);
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, isNotNull);
|
|
expect(value.type.name, 'C');
|
|
}
|
|
|
|
test_constructorInvocation_noConstConstructor() async {
|
|
var result = await _getExpressionValue(
|
|
"const C()",
|
|
context: 'class C {}',
|
|
);
|
|
expect(result.isValid, isFalse);
|
|
DartObject value = result.value;
|
|
expect(value, isNull);
|
|
}
|
|
|
|
test_constructorInvocation_simpleArgs() async {
|
|
var result = await _getExpressionValue("const C(1)", context: '''
|
|
class C {
|
|
const C(int x);
|
|
}
|
|
''');
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, isNotNull);
|
|
expect(value.type.name, 'C');
|
|
}
|
|
|
|
test_divide_double_double() async {
|
|
await _assertValueDouble(3.2 / 2.3, "3.2 / 2.3");
|
|
}
|
|
|
|
test_divide_double_double_byZero() async {
|
|
var result = await _getExpressionValue("3.2 / 0.0");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value.type.name, "double");
|
|
expect(value.toDoubleValue().isInfinite, isTrue);
|
|
}
|
|
|
|
test_divide_int_int() async {
|
|
await _assertValueDouble(1.5, "3 / 2");
|
|
}
|
|
|
|
test_divide_int_int_byZero() async {
|
|
var result = await _getExpressionValue("3 / 0");
|
|
expect(result.isValid, isTrue);
|
|
}
|
|
|
|
test_equal_boolean_boolean() async {
|
|
await _assertValueBool(false, "true == false");
|
|
}
|
|
|
|
test_equal_int_int() async {
|
|
await _assertValueBool(false, "2 == 3");
|
|
}
|
|
|
|
test_equal_invalidLeft() async {
|
|
var result = await _getExpressionValue("a == 3");
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_equal_invalidRight() async {
|
|
var result = await _getExpressionValue("2 == a");
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_equal_string_string() async {
|
|
await _assertValueBool(false, "'a' == 'b'");
|
|
}
|
|
|
|
test_greaterThan_int_int() async {
|
|
await _assertValueBool(false, "2 > 3");
|
|
}
|
|
|
|
test_greaterThanOrEqual_int_int() async {
|
|
await _assertValueBool(false, "2 >= 3");
|
|
}
|
|
|
|
@failingTest
|
|
test_identifier_class() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_identifier_function() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_identifier_static() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_identifier_staticMethod() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_identifier_topLevel() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_identifier_typeParameter() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
test_leftShift_int_int() async {
|
|
await _assertValueInt(64, "16 << 2");
|
|
}
|
|
|
|
test_lessThan_int_int() async {
|
|
await _assertValueBool(true, "2 < 3");
|
|
}
|
|
|
|
test_lessThanOrEqual_int_int() async {
|
|
await _assertValueBool(true, "2 <= 3");
|
|
}
|
|
|
|
test_literal_boolean_false() async {
|
|
await _assertValueBool(false, "false");
|
|
}
|
|
|
|
test_literal_boolean_true() async {
|
|
await _assertValueBool(true, "true");
|
|
}
|
|
|
|
test_literal_list() async {
|
|
var result = await _getExpressionValue("const ['a', 'b', 'c']");
|
|
expect(result.isValid, isTrue);
|
|
}
|
|
|
|
test_literal_map() async {
|
|
var result = await _getExpressionValue(
|
|
"const {'a' : 'm', 'b' : 'n', 'c' : 'o'}",
|
|
);
|
|
expect(result.isValid, isTrue);
|
|
Map<DartObject, DartObject> map = result.value.toMapValue();
|
|
expect(map.keys.map((k) => k.toStringValue()), ['a', 'b', 'c']);
|
|
}
|
|
|
|
test_literal_null() async {
|
|
var result = await _getExpressionValue("null");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value.isNull, isTrue);
|
|
}
|
|
|
|
test_literal_number_double() async {
|
|
await _assertValueDouble(3.45, "3.45");
|
|
}
|
|
|
|
test_literal_number_integer() async {
|
|
await _assertValueInt(42, "42");
|
|
}
|
|
|
|
test_literal_string_adjacent() async {
|
|
await _assertValueString("abcdef", "'abc' 'def'");
|
|
}
|
|
|
|
test_literal_string_interpolation_invalid() async {
|
|
var result = await _getExpressionValue("'a\${f()}c'");
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_literal_string_interpolation_valid() async {
|
|
await _assertValueString("a3c", "'a\${3}c'");
|
|
}
|
|
|
|
test_literal_string_simple() async {
|
|
await _assertValueString("abc", "'abc'");
|
|
}
|
|
|
|
test_logicalAnd() async {
|
|
await _assertValueBool(false, "true && false");
|
|
}
|
|
|
|
test_logicalNot() async {
|
|
await _assertValueBool(false, "!true");
|
|
}
|
|
|
|
test_logicalOr() async {
|
|
await _assertValueBool(true, "true || false");
|
|
}
|
|
|
|
test_minus_double_double() async {
|
|
await _assertValueDouble(3.2 - 2.3, "3.2 - 2.3");
|
|
}
|
|
|
|
test_minus_int_int() async {
|
|
await _assertValueInt(1, "3 - 2");
|
|
}
|
|
|
|
test_negated_boolean() async {
|
|
var result = await _getExpressionValue("-true");
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_negated_double() async {
|
|
await _assertValueDouble(-42.3, "-42.3");
|
|
}
|
|
|
|
test_negated_integer() async {
|
|
await _assertValueInt(-42, "-42");
|
|
}
|
|
|
|
test_notEqual_boolean_boolean() async {
|
|
await _assertValueBool(true, "true != false");
|
|
}
|
|
|
|
test_notEqual_int_int() async {
|
|
await _assertValueBool(true, "2 != 3");
|
|
}
|
|
|
|
test_notEqual_invalidLeft() async {
|
|
var result = await _getExpressionValue("a != 3");
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_notEqual_invalidRight() async {
|
|
var result = await _getExpressionValue("2 != a");
|
|
expect(result.isValid, isFalse);
|
|
}
|
|
|
|
test_notEqual_string_string() async {
|
|
await _assertValueBool(true, "'a' != 'b'");
|
|
}
|
|
|
|
test_parenthesizedExpression() async {
|
|
await _assertValueString("a", "('a')");
|
|
}
|
|
|
|
test_plus_double_double() async {
|
|
await _assertValueDouble(2.3 + 3.2, "2.3 + 3.2");
|
|
}
|
|
|
|
test_plus_int_int() async {
|
|
await _assertValueInt(5, "2 + 3");
|
|
}
|
|
|
|
test_plus_string_string() async {
|
|
await _assertValueString("ab", "'a' + 'b'");
|
|
}
|
|
|
|
@failingTest
|
|
test_prefixedIdentifier_invalid() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_prefixedIdentifier_valid() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_propertyAccess_invalid() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_propertyAccess_valid() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
test_remainder_double_double() async {
|
|
await _assertValueDouble(3.2 % 2.3, "3.2 % 2.3");
|
|
}
|
|
|
|
test_remainder_int_int() async {
|
|
await _assertValueInt(2, "8 % 3");
|
|
}
|
|
|
|
test_rightShift() async {
|
|
await _assertValueInt(16, "64 >> 2");
|
|
}
|
|
|
|
@failingTest
|
|
test_simpleIdentifier_invalid() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
@failingTest
|
|
test_simpleIdentifier_valid() async {
|
|
var result = await _getExpressionValue("?");
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value, null);
|
|
}
|
|
|
|
test_stringLength_complex() async {
|
|
await _assertValueInt(6, "('qwe' + 'rty').length");
|
|
}
|
|
|
|
test_stringLength_simple() async {
|
|
await _assertValueInt(6, "'Dvorak'.length");
|
|
}
|
|
|
|
test_times_double_double() async {
|
|
await _assertValueDouble(2.3 * 3.2, "2.3 * 3.2");
|
|
}
|
|
|
|
test_times_int_int() async {
|
|
await _assertValueInt(6, "2 * 3");
|
|
}
|
|
|
|
test_truncatingDivide_double_double() async {
|
|
await _assertValueInt(1, "3.2 ~/ 2.3");
|
|
}
|
|
|
|
test_truncatingDivide_int_int() async {
|
|
await _assertValueInt(3, "10 ~/ 3");
|
|
}
|
|
|
|
Future<void> _assertValueBool(bool expectedValue, String contents) async {
|
|
var result = await _getExpressionValue(contents);
|
|
DartObject value = result.value;
|
|
expect(value.type.name, "bool");
|
|
expect(value.toBoolValue(), expectedValue);
|
|
}
|
|
|
|
Future<void> _assertValueDouble(double expectedValue, String contents) async {
|
|
var result = await _getExpressionValue(contents);
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value.type.name, "double");
|
|
expect(value.toDoubleValue(), expectedValue);
|
|
}
|
|
|
|
Future<void> _assertValueInt(int expectedValue, String contents) async {
|
|
var result = await _getExpressionValue(contents);
|
|
expect(result.isValid, isTrue);
|
|
DartObject value = result.value;
|
|
expect(value.type.name, "int");
|
|
expect(value.toIntValue(), expectedValue);
|
|
}
|
|
|
|
Future<void> _assertValueString(String expectedValue, String contents) async {
|
|
var result = await _getExpressionValue(contents);
|
|
DartObject value = result.value;
|
|
expect(value, isNotNull);
|
|
ParameterizedType type = value.type;
|
|
expect(type, isNotNull);
|
|
expect(type.name, "String");
|
|
expect(value.toStringValue(), expectedValue);
|
|
}
|
|
|
|
Future<EvaluationResult> _getExpressionValue(String expressionCode,
|
|
{String context: ''}) async {
|
|
var path = convertPath('/test/lib/test.dart');
|
|
|
|
var file = newFile(path, content: '''
|
|
var x = $expressionCode;
|
|
|
|
$context
|
|
''');
|
|
|
|
await resolveTestFile();
|
|
|
|
var expression = findNode.variableDeclaration('x =').initializer;
|
|
|
|
var evaluator = ConstantEvaluator(
|
|
file.createSource(result.uri),
|
|
result.typeProvider,
|
|
typeSystem: result.typeSystem,
|
|
);
|
|
|
|
return evaluator.evaluate(expression);
|
|
}
|
|
}
|