blob: e0d3258c29f1b5dffcd2fb4a44e66015a7bfa81a [file] [log] [blame]
// Copyright (c) 2019, 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.
// @dart = 2.7
// SharedOptions=--enable-experiment=variance
import 'dart:_foreign_helper' show JS;
import 'dart:_rti' as rti;
import 'subtype_utils.dart';
const typeRulesJson = r'''
{
"int": {"num": []}
}
''';
final typeRules = JS('=Object', 'JSON.parse(#)', typeRulesJson);
const typeParameterVariancesJson = '''
{
"Covariant": [${rti.Variance.covariant}],
"Contravariant": [${rti.Variance.contravariant}],
"Invariant": [${rti.Variance.invariant}],
"MultiVariant":[${rti.Variance.legacyCovariant}, ${rti.Variance.invariant},
${rti.Variance.contravariant}, ${rti.Variance.covariant}]
}
''';
final typeParameterVariances =
JS('=Object', 'JSON.parse(#)', typeParameterVariancesJson);
main() {
rti.testingAddRules(universe, typeRules);
rti.testingAddTypeParameterVariances(universe, typeParameterVariances);
testInterfacesWithVariance();
testInterfacesWithVariance(); // Ensure caching didn't change anything.
}
void testInterfacesWithVariance() {
strictSubtype('LegacyCovariant<int>', 'LegacyCovariant<num>');
strictSubtype('Covariant<int>', 'Covariant<num>');
strictSubtype('Contravariant<num>', 'Contravariant<int>');
equivalent('Invariant<num>', 'Invariant<num>');
unrelated('Invariant<int>', 'Invariant<num>');
unrelated('Invariant<num>', 'Invariant<int>');
strictSubtype(
'MultiVariant<int,num,num,int>', 'MultiVariant<num,num,int,num>');
}