// Copyright (c) 2012, 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.

// Test to check if we are able to import multiple libraries using the
// same prefix.

#library("Prefix101Test.dart");

#import("library10.dart", prefix : "lib101");
#import("library11.dart", prefix : "lib101");

class Prefix101Test {
  static Test1() {
    var result = 0;
    var obj = new lib101.Library10(1);
    result = obj.fld;
    Expect.equals(1, result);
    result += obj.func();
    Expect.equals(3, result);
    result += lib101.Library10.static_func();
    Expect.equals(6, result);
    result += lib101.Library10.static_fld;
    Expect.equals(10, result);
  }
  static Test2() {
    var result = 0;
    var obj = new lib101.Library11(4);
    result = obj.fld;
    Expect.equals(4, result);
    result += obj.func();
    Expect.equals(7, result);
    result += lib101.Library11.static_func();
    Expect.equals(9, result);
    result += lib101.Library11.static_fld;
    Expect.equals(10, result);
  }
  static Test3() {
    Expect.equals(10, lib101.top_level10);
    Expect.equals(20, lib101.top_level_func10());
  }
  static Test4() {
    Expect.equals(100, lib101.top_level11);
    Expect.equals(200, lib101.top_level_func11());
  }
}

main() {
  Prefix101Test.Test1();
  Prefix101Test.Test2();
  Prefix101Test.Test3();
  Prefix101Test.Test4();
}
