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

// Define a JS class in a different library to test that name resolution works
// for non-external factories and static methods. Also uses class type
// parameters to make sure we generate a generic class.

@JS()
library js_interop_non_external_lib;

import 'package:expect/expect.dart';
import 'package:js/js.dart';

late List topLevelList;

void topLevelListAppend(item) {
  topLevelList.add(item);
}

@JS('JSClass')
class OtherJSClass<T extends num> {
  external OtherJSClass.cons(T t);
  factory OtherJSClass(T t) {
    // Do a simple test using T.
    Expect.type<T>(t);
    Expect.notType<T>('');
    field = 'unnamed';
    topLevelList = <T>[t];
    return OtherJSClass.cons(t);
  }

  factory OtherJSClass.named(T t) {
    // Do a simple test using T.
    Expect.type<T>(t);
    Expect.notType<T>('');
    field = 'named';
    topLevelList = <T>[t];
    return OtherJSClass.cons(t);
  }

  factory OtherJSClass.redirecting(T t) = OtherJSClass;

  static String field = '';
  static String get getSet {
    return field;
  }

  static set getSet(String val) {
    field = val;
  }

  static String method() => field;

  static T genericMethod<T extends num>(T t) {
    // Do a simple test using T.
    Expect.type<T>(t);
    Expect.notType<T>('');
    return t;
  }
}
