// Copyright (c) 2021, 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 that factory methods with bodies are stubbed correctly in static interop
// type erasure.

@JS()
library factory_stub_test;

import 'dart:_interceptors' show JavaScriptObject;

import 'package:js/js.dart';

import '../native_testing.dart';
import '../native_testing.dart' as native_testing;

NativeClass makeNativeClass() native;

@Native('NativeClass')
class NativeClass extends JavaScriptObject {
  factory NativeClass() => makeNativeClass();
}

@JS('NativeClass')
@staticInterop
class StaticNativeClass {
  external StaticNativeClass();
  factory StaticNativeClass.redirectingFactory() = StaticNativeClass;
  factory StaticNativeClass.simpleFactory() => StaticNativeClass();
  factory StaticNativeClass.factoryWithParam(
          StaticNativeClass staticNativeClass) =>
      staticNativeClass;
  // This and `StaticNativeClassCopy.nestedFactory` exist to ensure that we
  // cover the case where invocations on factories are visible before their
  // declarations in the AST. This will test whether we correctly create the
  // stub even if we haven't visited the declaration yet.
  factory StaticNativeClass.nestedFactory() {
    StaticNativeClassCopy.nestedFactory();
    return StaticNativeClass();
  }
}

@JS('NativeClass')
@staticInterop
class StaticNativeClassCopy {
  external StaticNativeClassCopy();
  factory StaticNativeClassCopy.nestedFactory() {
    StaticNativeClass.simpleFactory();
    return StaticNativeClassCopy();
  }
}

void main() {
  nativeTesting();
  native_testing.JS('', r'''
    (function(){
      function NativeClass() {}
      self.NativeClass = NativeClass;
      self.makeNativeClass = function(){return new NativeClass()};
      self.nativeConstructor(NativeClass);
    })()
  ''');
  applyTestExtensions(['NativeClass']);

  // Make the Native class live.
  NativeClass();
  // Invoke factories and ensure they're typed correctly through assignment.
  StaticNativeClass staticNativeClass = StaticNativeClass.redirectingFactory();
  staticNativeClass = StaticNativeClass.simpleFactory();
  staticNativeClass = StaticNativeClass.factoryWithParam(staticNativeClass);
  staticNativeClass = StaticNativeClass.nestedFactory();
}
