test/com/google/javascript/jscomp/TypeCheckTest.java
/**
   * test structural interface matching for a combination of ordinary function types and record
   * types here C7 does not structurally match I7
   */
test structural interface matching for a combination of ordinary function types and record
types here C7 does not structurally match I7
test structural interface matching for a combination of ordinary function types and record types here C7 does not structurally match I7
@Test
  public void testStructuralInterfaceMatching37() {
    testTypesWithExtraExterns(
        lines(
            EXTERNS_FOR_LONG_NONMATCHING_CHAIN,
            "/** @record */",
            "function I7() {}",
            "/** @type{function(this:C5, C5, C5, I5=): I5} */",
            "I7.prototype.getElement = function(){};",
            "",
            "/** @constructor */",
            "function C7() {}",
            "/** @type{function(this:I5, I5, C5=, I5=): C5} */",
            "C7.prototype.getElement = function(){};"),
        lines(
            "/** @type {{fun: function(C7):I7, prop: {prop: I7}}} */",
            "var com1;",
            "/** @type {{fun: function(I7):C7, prop: {prop: C7}}} */",
            "var com2;",
            "",
            "com1 = com2;"),
        lines(
            "assignment",
            "found   : {fun: function((I7|null)): (C7|null), prop: {prop: (C7|null)}}",
            "required: {fun: function((C7|null)): (I7|null), prop: {prop: (I7|null)}}",
            "missing : []",
        "mismatch: [fun,prop]"));
  }
@ Test public void testStructuralInterfaceMatching37 ( ) { testTypesWithExtraExterns ( lines ( EXTERNS_FOR_LONG_NONMATCHING_CHAIN , "/** @record */" , "function I7() {}" , "/** @type{function(this:C5, C5, C5, I5=): I5} */" , "I7.prototype.getElement = function(){};" , "" , "/** @constructor */" , "function C7() {}" , "/** @type{function(this:I5, I5, C5=, I5=): C5} */" , "C7.prototype.getElement = function(){};" ) , lines ( "/** @type {{fun: function(C7):I7, prop: {prop: I7}}} */" , "var com1;" , "/** @type {{fun: function(I7):C7, prop: {prop: C7}}} */" , "var com2;" , "" , "com1 = com2;" ) , lines ( "assignment" , "found   : {fun: function((I7|null)): (C7|null), prop: {prop: (C7|null)}}" , "required: {fun: function((C7|null)): (I7|null), prop: {prop: (I7|null)}}" , "missing : []" , "mismatch: [fun,prop]" ) ) ; }
test structural interface matching for a combination of ordinary function types and record
 types here C7 does not structurally match I7
test structural interface matching for a combination of ordinary function types and record types here C7 does not structurally match I7
// the type structure of I5 and C5 are different