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

// @dart = 2.7

// Accessing static native methods names:
//   plain declaration ->  use @Native tag as 'scope' for declared name.
//   identifier @JSName -> use @Native tag as 'scope' for @JSName.
//   other @JSName -> use @JSName as an expression.

import 'native_testing.dart';
import 'dart:_js_helper' show convertDartClosureToJS;

typedef int Callback(String s);

@Native("CC") // Tag can be different to class name.
class AA {
  // This name is not an identifier, so completely defines how to access method.
  @JSName('CC.foo')
  static int foo(String s) native;

  // This name is not an identifier, so completely defines how to access method.
  @JSName('CC.bar')
  static int bar(Callback c) native;
  static int baz(Callback c) {
    return bar(c);
  }

  // Compiler should automatically use the tag and the declared name, i.e. call
  // `CC.lepton`.
  static int lepton(Callback c) native;
  static int electron(c) => lepton(c);

  // Compiler should automatically use the tag and JSName, i.e. call
  // `CC.baryon`.
  @JSName('baryon')
  static int _baryon(Callback c) native;
  static int proton(c) => _baryon(c);
}

void setup() {
  JS('', r"""
(function(){
  // This code is inside 'setup' and so not accessible from the global scope.

  function CC(){}

  CC.foo = function(s) { return s.length; };
  CC.bar = function(f) { return f("Bye"); };
  CC.lepton = function(f) { return f("Lepton"); };
  CC.baryon = function(f) { return f("three quarks"); };

  self.CC = CC;
})()""");
}

main() {
  nativeTesting();
  setup();

  Expect.equals(5, AA.foo("Hello"));

  Expect.equals(3, AA.bar((String s) => s.length));
  Expect.equals(3, AA.baz((String s) => s.length));

  Expect.equals(6, AA.lepton((String s) => s.length));
  Expect.equals(6, AA.electron((String s) => s.length));

  Expect.equals(12, AA._baryon((String s) => s.length));
  Expect.equals(12, AA.proton((String s) => s.length));
}
