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

import "native_testing.dart";

// Test for dartNativeDispatchHooksTransformer, getTag hook.

@Native("T1A")
class T1A {}

@Native("T1B")
class T1B {}

@Native("T1C")
class T1C {}

makeT1A() native;
makeT1B() native;
makeT1C() native;

int getTagCallCount() native;

void setup() {
  JS('', r'''
(function(){
  function T1A() { } //       Normal native class.
  function T1CrazyB() { } //  Native class with different constructor name.

  var T1fakeA = (function(){
    function T1A() {} //      Native class with adversarial constructor name.
    return T1A;
  })();

  // Make constructors visible on 'window' for prepatching.
  if (typeof window == "undefined") window = {};
  window.T1A = T1A;
  window.T1CrazyB = T1CrazyB;

  self.makeT1A = function(){return new T1A()};
  self.makeT1B = function(){return new T1CrazyB()};
  self.makeT1C = function(){return new T1fakeA()};

  self.nativeConstructor(T1A);
  self.nativeConstructor(T1CrazyB);
  self.nativeConstructor(T1fakeA);

  var getTagCount = 0;
  getTagCallCount = function() { return getTagCount; };

  function transformer1(hooks) {
    var getTag = hooks.getTag;

    function getTagNew(obj) {
      ++getTagCount;

      // If something looks like a different native type we can check in advance
      // of the default algorithm.
      if (obj instanceof T1fakeA) return "T1C";

      var tag = getTag(obj);

      // New constructor names can be mapped here.
      if (tag == "T1CrazyB") return "T1B";

      return tag;
    }

    hooks.getTag = getTagNew;
  }

  dartNativeDispatchHooksTransformer = [transformer1];
})()''');
  applyTestExtensions(['T1A', 'T1CrazyB', 'T1fakeA']);
}

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

  var t1a = makeT1A();
  var t1b = makeT1B();
  var t1c = makeT1C();

  Expect.equals(true, t1a is T1A, '$t1a is T1A');
  Expect.equals(true, t1b is T1B, '$t1b is T1B');
  Expect.equals(true, t1c is T1C, '$t1c is T1C');

  Expect.equals(2, getTagCallCount());

  Expect.equals(true, confuse(t1a) is T1A, '$t1a is T1A');
  Expect.equals(true, confuse(t1b) is T1B, '$t1b is T1B');
  Expect.equals(true, confuse(t1c) is T1C, '$t1c is T1C');

  Expect.equals(2, getTagCallCount());
}
