// 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';

testGauge1() {
  var gauge = new Gauge('test', 'alpha bravo', 0.0, 100.0);
  Expect.equals(0.0, gauge.min);
  Expect.equals(0.0, gauge.value);
  Expect.equals(100.0, gauge.max);
  Expect.equals('test', gauge.name);
  Expect.equals('alpha bravo', gauge.description);
  gauge.value = 44.0;
  Expect.equals(44.0, gauge.value);
  // Test setting below min.
  gauge.value = -1.0;
  Expect.equals(0.0, gauge.value);
  // Test setting above max.
  gauge.value = 101.0;
  Expect.equals(100.0, gauge.value);
}

testGauge2() {
  var gauge = new Gauge('test', 'alpha bravo', 1.0, 2.0);
  Expect.equals(1.0, gauge.min);
  Expect.equals(2.0, gauge.max);
  Expect.equals(gauge.min, gauge.value);
  Expect.equals('test', gauge.name);
  Expect.equals('alpha bravo', gauge.description);

  Expect.throws(() {
    // min argument > max argument .
    gauge = new Gauge('test', 'alpha bravo', 2.0, 1.0);
  });

  Expect.throws(() {
    // min argument  == max argument .
    gauge = new Gauge('test', 'alpha bravo', 1.0, 1.0);
  });

  Expect.throws(() {
    // min argument is null
    gauge = new Gauge('test', 'alpha bravo', null, 1.0);
  });

  Expect.throws(() {
    // min argument is not a double
    gauge = new Gauge('test', 'alpha bravo', 'string' as dynamic, 1.0);
  });

  Expect.throws(() {
    // max argument is null
    gauge = new Gauge('test', 'alpha bravo', 1.0, null);
  });
}

testCounter() {
  var counter = new Counter('test', 'alpha bravo');
  Expect.equals(0.0, counter.value);
  Expect.equals('test', counter.name);
  Expect.equals('alpha bravo', counter.description);
  counter.value = 1.0;
  Expect.equals(1.0, counter.value);
}

class CustomCounter extends Counter {
  CustomCounter(name, description) : super(name, description);
  // User provided getter.
  double get value => 77.0;
}

testCustomCounter() {
  var counter = new CustomCounter('test', 'alpha bravo');
  Expect.equals(77.0, counter.value);
  Expect.equals('test', counter.name);
  Expect.equals('alpha bravo', counter.description);
  // Should have no effect.
  counter.value = 1.0;
  Expect.equals(77.0, counter.value);
}

testMetricNameCollision() {
  var counter = new Counter('a.b.c', 'alpha bravo charlie');
  var counter2 = new Counter('a.b.c', 'alpha bravo charlie collider');
  Metrics.register(counter);
  Expect.throws(() {
    Metrics.register(counter2);
  });
  Metrics.deregister(counter);
  Metrics.register(counter);
  var counter3 = new Counter('a.b.c.d', '');
  Metrics.register(counter3);
}

testBadName() {
  Expect.throws(() {
    var counter = new Counter('a.b/c', 'description');
  });
  Expect.throws(() {
    var counter = new Counter('vm', 'description');
  });
}

main() {
  testGauge1();
  testGauge2();
  testCounter();
  testCustomCounter();
  testMetricNameCollision();
  testBadName();
}
