// Copyright (c) 2011, 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.
//
// Use qualified symbols with generics at various places.

// @dart = 2.9

library Prefix15Test.dart;

import "package:expect/expect.dart";
import "../library12.dart" as lib12;

typedef T myFunc<T>(T param);

class myInterface<T extends lib12.Library12>
    implements lib12.Library12Interface {
  myInterface(T this.myfld);
  T addObjects(covariant T value1, covariant T value2) {
    myfld.fld = (value1.fld + value2.fld + myfld.fld);
    return myfld;
  }

  T myfld;
}

class myClass2<T> {
  myClass2(T this.fld2);
  T func(T val) => val;
  T fld2;
}

main() {
  var o;
  o = new myClass2<lib12.Library12>(new lib12.Library12(100));
  myFunc<lib12.Library12> func = o.func;
  Expect.equals(2, func(new lib12.Library12(10)).func());
  Expect.equals(10, func(new lib12.Library12(10)).fld);

  o = new myClass2<lib12.Library12>(new lib12.Library12(200));
  Expect.equals(2, o.fld2.func());
  Expect.equals(200, o.fld2.fld);

  o = new myInterface<lib12.Library12>(new lib12.Library12(100));
  Expect.equals(2, o.myfld.func());
  Expect.equals(100, o.myfld.fld);
  o = o.addObjects(new lib12.Library12(200), new lib12.Library12(300));
  Expect.equals(2, o.func());
  Expect.equals(600, o.fld);
}
