anchor.diff:      _checkLattice(top, left, right, bottom);
     }
   
  -  void test_isSubtypeOf_simple_function() {
  -    FunctionType top =
  -        TypeBuilder.functionType(<DartType>[intType], objectType);
  -    FunctionType left = TypeBuilder.functionType(<DartType>[intType], intType);
  -    FunctionType right =
  -        TypeBuilder.functionType(<DartType>[objectType], objectType);
  -    FunctionType bottom =
  -        TypeBuilder.functionType(<DartType>[objectType], intType);
  -
  -    _checkLattice(top, left, right, bottom);
  -  }
  -
  -  void test_isSubtypeOf_call_method() {
  -    ClassElementImpl classBottom = ElementFactory.classElement2("Bottom");
  -    MethodElement methodBottom =
  -        ElementFactory.methodElement("call", objectType, <DartType>[intType]);
  -    classBottom.methods = <MethodElement>[methodBottom];
  -
  -    DartType top = TypeBuilder.functionType(<DartType>[intType], objectType);
  -    InterfaceType bottom = classBottom.type;
  -
  -    _checkIsStrictSubtypeOf(bottom, top);
  +  void test_isSubtypeOf_double() {
  +    List<DartType> equivalents = <DartType>[doubleType];
  +    List<DartType> supertypes = <DartType>[numType];
  +    List<DartType> unrelated = <DartType>[intType];
  +    _checkGroups(doubleType,
  +        equivalents: equivalents, supertypes: supertypes, unrelated: unrelated);
  +  }
  +
  +  void test_isSubtypeOf_dynamic_isTop() {
  +    DartType interfaceType = ElementFactory.classElement2('A', []).type;
  +    List<DartType> equivalents = <DartType>[dynamicType, objectType];
  +    List<DartType> subtypes = <DartType>[
  +      intType,
  +      doubleType,
  +      numType,
  +      stringType,
  +      functionType,
  +      interfaceType,
  +      bottomType
  +    ];
  +    _checkGroups(dynamicType, equivalents: equivalents, subtypes: subtypes);
     }
   
     void test_isSubtypeOf_fuzzy_arrows() {
  
positive.code:     }
    }
  
    void _checkUnrelated(DartType type1, DartType type2) {
      _checkIsNotSubtypeOf(type1, type2);
      _checkIsNotSubtypeOf(type2, type1);
    }
  
    void _checkEquivalent(DartType type1, DartType type2) {
      _checkIsSubtypeOf(type1, type2);
      _checkIsSubtypeOf(type2, type1);
    }
  
    void _checkIsStrictSubtypeOf(DartType type1, DartType type2) {
      _checkIsSubtypeOf(type1, type2);
      _checkIsNotSubtypeOf(type2, type1);
    }
  
    void _checkIsSubtypeOf(DartType type1, DartType type2) {
      expect(typeSystem.isSubtypeOf(type1, type2), true);
    }
  
    void _checkIsNotSubtypeOf(DartType type1, DartType type2) {
      expect(typeSystem.isSubtypeOf(type1, type2), false);
    }
  }
  
  @reflectiveTest
  class StrongAssignabilityTest {
    TypeProvider typeProvider;
    TypeSystem typeSystem;
  
    DartType get bottomType => typeProvider.bottomType;
    InterfaceType get doubleType => typeProvider.doubleType;
  
negative.code:     _checkGroups(bottomType, equivalents: equivalents, supertypes: supertypes);
    }
  
    void test_isSubtypeOf_call_method() {
      ClassElementImpl classBottom = ElementFactory.classElement2("Bottom");
      MethodElement methodBottom =
          ElementFactory.methodElement("call", objectType, <DartType>[intType]);
      classBottom.methods = <MethodElement>[methodBottom];
  
      DartType top = TypeBuilder.functionType(<DartType>[intType], objectType);
      InterfaceType bottom = classBottom.type;
  
      _checkIsStrictSubtypeOf(bottom, top);
    }
  
    void test_isSubtypeOf_classes() {
  