// 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 "package:expect/expect.dart";
//import 'dart:_foreign_helper' show JS;
//import 'dart:_js_helper' show Creates, setNativeSubclassDispatchRecord;

// Test for dartNativeDispatchHooksTransformer, getTag hook.
// Same as browser_compat_1_prepatched_test but with prepatching disabled.

class T1A native "T1A" {
}

class T1B native "T1B" {
}

class T1C native "T1C" {
}

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

int getTagCallCount() native;

void setup() native r'''
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;

makeT1A = function(){return new T1A;};
makeT1B = function(){return new T1CrazyB;};
makeT1C = function(){return new 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;
  // Disable prepatching.
  hooks.prototypeForTag = function() { return null; }
}

dartNativeDispatchHooksTransformer = [transformer1];
''';

var inscrutable;

main() {
  setup();
  inscrutable = (x) => x;

  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(3, getTagCallCount());

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

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