// 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.

library Prefix15Test.dart;
import "library12.dart" as lib12;

typedef T myFunc<T>(T param);

class myInterface<T> implements lib12.Library12Interface {
  myInterface(T this.myfld);
  T addObjects(T value1, 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 = 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);
}
