/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * Use of this source code is governed by a BSD-style
 * license that can be found in the LICENSE file or at
 * https://developers.google.com/open-source/licenses/bsd
 */

part of charted.test.svg;

testSvgArc() {

  List mockSvgData = [
    new SvgArcData(null, 0, 0,      0,      0,  100),  // Init sector
    new SvgArcData(null, 0, 0,      0,      50, 100),  // Init donut
    new SvgArcData(null, 0, 0,      2 * pi, 0,  100),  // Whole sector
    new SvgArcData(null, 0, 0,      2 * pi, 50, 100),  // Whole donut
    new SvgArcData(null, 0, 0,      pi / 3, 0,  100),  // Sector start angle 0
    new SvgArcData(null, 0, 0,      pi / 3, 50, 100),  // Slice start angle 0
    new SvgArcData(null, 0, pi / 3, pi,     0,  100),  // Sector start angle > 0
    new SvgArcData(null, 0, pi / 3, pi,     50, 100),  // Slice start angle > 0
  ];

  test('interpolateSvgArcData() returns an InterpolateFn that '
      'correctly interpolates two SvgArcData', () {
    InterpolateFn arcInterpolator =
        interpolateSvgArcData(mockSvgData[5], mockSvgData[6]);
    for (var i = 0.0; i <= 1.0; i += 0.2) {
      SvgArcData arcData = arcInterpolator(i);
      expect(arcData.startAngle, closeTo(mockSvgData[5].startAngle * (1 - i) +
          mockSvgData[6].startAngle * i, EPSILON));
      expect(arcData.endAngle, closeTo(mockSvgData[5].endAngle * (1 - i) +
          mockSvgData[6].endAngle * i, EPSILON));
      expect(arcData.innerRadius, closeTo(mockSvgData[5].innerRadius * (1 - i) +
          mockSvgData[6].innerRadius * i, EPSILON));
      expect(arcData.outerRadius, closeTo(mockSvgData[5].outerRadius * (1 - i) +
          mockSvgData[6].outerRadius * i, EPSILON));
    }
  });

  group('SvgArc.innerRadiusCallback', () {
    test('is assigned defaultInnerRadiusCallback by default', () {
      SvgArc svgArc = new SvgArc();
      SelectionCallback<num> callBack = svgArc.innerRadiusCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(e.innerRadius)));
      expect(callBack(null, 0, null), equals(0));
      expect(callBack(new SvgArcData(0, 0, 0, 0, null, 0), 0, null), equals(0));
    });
    test('is assigned to (value) => value when set by value', () {
      SvgArc svgArc = new SvgArc();
      svgArc.innerRadius = 30;
      SelectionCallback<num> callBack = svgArc.innerRadiusCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(30)));
    });
  });

  group('SvgArc.outerRadiusCallback', () {
    test('is assigned defaultOuterRadiusCallback by default', () {
      SvgArc svgArc = new SvgArc();
      SelectionCallback<num> callBack = svgArc.outerRadiusCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(e.outerRadius)));
      expect(callBack(null, 0, null), equals(0));
      expect(callBack(new SvgArcData(0, 0, 0, 0, 0, null), 0, null), equals(0));
    });
    test('is assigned to (value) => value when set by value', () {
      SvgArc svgArc = new SvgArc();
      svgArc.outerRadius = 30;
      SelectionCallback<num> callBack = svgArc.outerRadiusCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(30)));
    });
  });

  group('SvgArc.startAngleCallback', () {
    test('is assigned defaultStartAngleCallback by default', () {
      SvgArc svgArc = new SvgArc();
      SelectionCallback<num> callBack = svgArc.startAngleCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(e.startAngle)));
      expect(callBack(null, 0, null), equals(0));
      expect(callBack(new SvgArcData(0, 0, null, 0, 0, 0), 0, null), equals(0));
    });
    test('is assigned to (value) => value when set by value', () {
      SvgArc svgArc = new SvgArc();
      svgArc.startAngle = 30;
      SelectionCallback<num> callBack = svgArc.startAngleCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(30)));
    });
  });

  group('SvgArc.endAngleCallback', () {
    test('is assigned defaultEndAngleCallback by default', () {
      SvgArc svgArc = new SvgArc();
      SelectionCallback<num> callBack = svgArc.endAngleCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(e.endAngle)));
      expect(callBack(null, 0, null), equals(0));
      expect(callBack(new SvgArcData(0, 0, 0, null, 0, 0), 0, null), equals(0));
    });
    test('is assigned to (value) => value when set by value', () {
      SvgArc svgArc = new SvgArc();
      svgArc.endAngle = 30;
      SelectionCallback<num> callBack = svgArc.endAngleCallback;
      mockSvgData.forEach((e) =>
          expect(callBack(e, 0, null), equals(30)));
    });
  });

  test('SvgArc.centroid calculates the centroid of arc slice', () {
    SvgArc svgArc = new SvgArc();
    List centroid = svgArc.centroid(mockSvgData[0], 0, null);
    expect(centroid[0], closeTo(0, EPSILON));
    expect(centroid[1], closeTo(-50, EPSILON));
    centroid = svgArc.centroid(mockSvgData[2], 0, null);
    expect(centroid[0], closeTo(0, EPSILON));
    expect(centroid[1], closeTo(50, EPSILON));
    centroid = svgArc.centroid(mockSvgData[7], 0, null);
    expect(centroid[0], closeTo(64.9519052838329, EPSILON));
    expect(centroid[1], closeTo(37.5, EPSILON));
  });

  group('SvgArc.path', () {
    test('generates concentric pie sector', () {
      SvgArc svgArc = new SvgArc();
      expect(svgArc.path(mockSvgData[2], 0, null),
          equals('M0,100A100,100 0 1,1 0,-100A100,100 0 1,1 0,100Z'));
    });
    test('generates concentric donut circle', () {
      SvgArc svgArc = new SvgArc();
      expect(svgArc.path(mockSvgData[3], 0, null),
          equals('M0,100A100,100 0 1,1 0,-100A100,100 0 1,1 0,100M0,'
                 '50A50,50 0 1,0 0,-50A50,50 0 1,0 0,50Z'));
    });
    test('correctly generates pie sector', () {
      SvgArc svgArc = new SvgArc();
      expect(svgArc.path(mockSvgData[5], 0, null),
          equals('M6.123233995736766e-15,-100.0A100,100 0 0,1 '
                 '86.60254037844386,-50.0L43.30127018922193,'
                 '-25.0A50,50 0 0,0 3.061616997868383e-15,-50.0Z'));
      expect(svgArc.path(mockSvgData[7], 0, null),
          equals('M86.60254037844386,-50.0A100,100 0 0,1 '
                 '6.123233995736766e-15,100.0L3.061616997868383e-15,'
                 '50.0A50,50 0 0,0 43.30127018922193,-25.0Z'));
    });
    test('correctly generates donut slice', () {
      SvgArc svgArc = new SvgArc();
      expect(svgArc.path(mockSvgData[4], 0, null),
          equals('M6.123233995736766e-15,-100.0A100,100 '
                 '0 0,1 86.60254037844386,-50.0L0,0Z'));
      expect(svgArc.path(mockSvgData[6], 0, null),
          equals('M86.60254037844386,-50.0A100,100 0 0,1 '
                 '6.123233995736766e-15,100.0L0,0Z'));
    });
  });

}