| Index: packages/charted/test.disabled/charts/renderers/pie_chart_renderer_test.dart
|
| diff --git a/packages/charted/test.disabled/charts/renderers/pie_chart_renderer_test.dart b/packages/charted/test.disabled/charts/renderers/pie_chart_renderer_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..163dd64157e5a40ba6b8c9a174aa58805e38d368
|
| --- /dev/null
|
| +++ b/packages/charted/test.disabled/charts/renderers/pie_chart_renderer_test.dart
|
| @@ -0,0 +1,137 @@
|
| +library charted.test.piechartrenderer;
|
| +
|
| +import 'dart:async';
|
| +import 'dart:html';
|
| +
|
| +import 'package:charted/charts/charts.dart';
|
| +import 'package:charted/core/core.dart';
|
| +import 'package:charted/layout/layout.dart';
|
| +import 'package:charted/svg/svg.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +main() {
|
| + const CHART_WIDTH = 1000;
|
| + const CHART_HEIGHT = 400;
|
| +
|
| + List COLUMNS = [
|
| + new ChartColumnSpec(label:'Country', type:ChartColumnSpec.TYPE_STRING),
|
| + new ChartColumnSpec(label:'statsList1'),
|
| + new ChartColumnSpec(label:'statsList2'),
|
| + new ChartColumnSpec(label:'statsList3')
|
| + ];
|
| +
|
| + const List ROWS = const [
|
| + const['USA', 950, 500, 200],
|
| + const['Japan',150, 990, 200],
|
| + ];
|
| +
|
| + ChartData data = new ChartData(COLUMNS, ROWS);
|
| + ChartConfig config;
|
| + ChartArea area;
|
| + Element host = new DivElement()..classes.add('host');
|
| +
|
| + // Helper for constructing the SvgArcData of each slice of the pie.
|
| + List<SvgArcData> produceArcData(List rows) {
|
| + var arcDataList = [];
|
| + var layout = new PieLayout();
|
| + var innerRadius = 0;
|
| + // height is shorter than width.
|
| + var pieRadius = area.layout.renderArea.height / 2;
|
| + var outerRadius = pieRadius - 10;
|
| + var sliceRadius = (pieRadius - 10 - innerRadius) / rows.length;
|
| +
|
| + for (var i = 0; i < rows.length; i++) {
|
| + var arcData = layout.layout(rows[i]);
|
| + arcData.forEach((e) {
|
| + e.innerRadius = outerRadius - sliceRadius * (i + 1) + 0.5;
|
| + e.outerRadius = outerRadius - sliceRadius * i;
|
| + });
|
| +
|
| + arcDataList.addAll(arcData);
|
| + }
|
| +
|
| + return arcDataList;
|
| + }
|
| +
|
| + // Extracts the data used to compute each pie in the input.
|
| + List extractPieData() {
|
| + return new List()..addAll(area.data.rows.map((e) {
|
| + var row = [];
|
| + for (var measure in config.series.elementAt(0).measures) {
|
| + row.add(e[measure]);
|
| + }
|
| + return row;
|
| + }));
|
| + }
|
| +
|
| + void checkRenderResult() {
|
| + // Check dimension of the chart element.
|
| + var chartElement = host.querySelector('.charted-chart');
|
| + expect(chartElement.attributes['width'], CHART_WIDTH.toString());
|
| + expect(chartElement.attributes['height'], CHART_HEIGHT.toString());
|
| +
|
| + // Should have as much slicesList and statsList text as there are measures.
|
| + var rowGroups = host.querySelectorAll('.row-group');
|
| + var slicesList = [];
|
| + var statsList = [];
|
| + for (var rowGroup in rowGroups) {
|
| + slicesList.add(rowGroup.children.where((e) =>
|
| + e.classes.contains('pie-path')));
|
| + statsList.add(rowGroup.children.where((e) =>
|
| + e.classes.contains('statistic')));
|
| + expect(slicesList.last.length,
|
| + area.config.series.elementAt(0).measures.length);
|
| + expect(statsList.last.length,
|
| + area.config.series.elementAt(0).measures.length);
|
| + }
|
| +
|
| + // Check offset for the actual render area.
|
| + var xOffset = area.layout.renderArea.width / 2;
|
| + var yOffset = area.layout.renderArea.height / 2;
|
| + expect(rowGroups.elementAt(0).attributes['transform'],
|
| + 'translate(${xOffset}, ${yOffset})');
|
| +
|
| + // Tests all the text elements that show the percentage stats of each slice.
|
| + var pieRows = extractPieData();
|
| + for (var i = 0; i < statsList.length; i++) {
|
| + var pieData = pieRows.elementAt(i);
|
| + var sum = pieData.reduce((a, b) => a + b);
|
| + var textElements = statsList[i];
|
| + for (var j = 0; j < textElements.length; j++) {
|
| + var stat = textElements.elementAt(j);
|
| + num percentage = pieData.elementAt(j) / sum;
|
| + percentage.round();
|
| + expect((percentage * 100).round().toString() + '%', stat.text);
|
| + }
|
| + }
|
| +
|
| + // Tests the path of each slices in each pie. Utilizing the PieLayout and
|
| + // SvgArc which is individually tested.
|
| + var arc = new SvgArc();
|
| + var arcDataList = produceArcData(pieRows);
|
| + for (var i = 0; i < slicesList.length; i++) {
|
| + var slices = slicesList[i]; // Slices of one pie.
|
| + for (var j = 0; j < slices.length; j++) {
|
| + expect(slices.elementAt(j).attributes['d'],
|
| + arc.path(arcDataList[i * slices.length + j], 0, host));
|
| + }
|
| + }
|
| + }
|
| +
|
| + test('pie chart renderer test', () {
|
| + var chartAreaHost = new DivElement()..classes.add('chart-host'),
|
| + series = new ChartSeries('pie', [1, 2, 3], new PieChartRenderer());
|
| + host.children.add(chartAreaHost);
|
| + config = new ChartConfig([series], [0]);
|
| + config.minimumSize = new Rect.size(CHART_WIDTH, CHART_HEIGHT);
|
| + area = new ChartArea(chartAreaHost, data, config, dimensionAxesCount: 0);
|
| + area.draw();
|
| +
|
| + // The series group is not painted until the axis is painted. However
|
| + // The ChartArea.draw current doesn't return a Future upon paint completion
|
| + // Also there is currently a default transition that we can not remove (will
|
| + // change in the near future). Set enough delay to ensure all the elements
|
| + // in the chart has finished their initial animation.
|
| + new Timer(new Duration(milliseconds:1000), expectAsync(checkRenderResult));
|
| + });
|
| +}
|
|
|