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

import 'dart:developer';
import 'package:expect/expect.dart';

// Test that the default tag is set.
testDefault() {
  Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
}

// Test that the label property matches the constructor.
void testLabel() {
  var label = 'Hello World';
  var tag = new UserTag(label);
  Expect.equals(label, tag.label);
}

// Test that we canonicalize UserTag by name.
void testCanonicalize(tag1) {
  var label = 'Global Tag';
  var tag = new UserTag(label);
  Expect.isTrue(identical(tag, tag1));
  var defaultLabel = 'Default';
  var defaultTag = new UserTag(defaultLabel);
  Expect.isTrue(identical(UserTag.defaultTag, defaultTag));
}

// Test that we made the tag current.
void testMakeCurrent(tag) {
  tag.makeCurrent();
  Expect.isTrue(identical(tag, getCurrentTag()));
}

// Test that we reach a limit of tags an exception is thrown.
void testExhaust() {
  var i = 0;
  while (true) {
    var label = i.toString();
    var tag = new UserTag(label);
    i++;
  }
}

var callerTag = new UserTag('caller');
var calleeTag = new UserTag('callee');

void callee() {
  var old = calleeTag.makeCurrent();
  Expect.isTrue(identical(calleeTag, getCurrentTag()));
  old.makeCurrent();
}

void testCallerPattern() {
  Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
  var old = callerTag.makeCurrent();
  Expect.isTrue(identical(callerTag, getCurrentTag()));
  callee();
  Expect.isTrue(identical(callerTag, getCurrentTag()));
  old.makeCurrent();
  Expect.isTrue(identical(UserTag.defaultTag, getCurrentTag()));
}

main() {
  testDefault();
  testCallerPattern();
  var label = 'Global Tag';
  var tag = new UserTag(label);
  testLabel();
  testCanonicalize(tag);
  for (var i = 0; i < 2000; i++) {
    testMakeCurrent(tag);
  }
  Expect.throws(testExhaust);
}
