// 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.

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, undefined, true);
  self.nativeConstructor(T1CrazyB, undefined, true);
  self.nativeConstructor(T1fakeA, undefined, true);

  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());
}
