| // 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>'); |
| } |