'use strict';

var fixture = require('./fixture');
var Context = require('./context');
var matchers = require('./matchers');
var utils = require('./utils');

(function() {

	// Keep track of all acquired charts to automatically release them after each specs
	var charts = {};

	function acquireChart() {
		var chart = utils.acquireChart.apply(utils, arguments);
		charts[chart.id] = chart;
		return chart;
	}

	function releaseChart(chart) {
		utils.releaseChart.apply(utils, arguments);
		delete charts[chart.id];
	}

	function createMockContext() {
		return new Context();
	}

	// force ratio=1 for tests on high-res/retina devices
	// fixes https://github.com/chartjs/Chart.js/issues/4515
	window.devicePixelRatio = 1;

	window.acquireChart = acquireChart;
	window.releaseChart = releaseChart;
	window.waitForResize = utils.waitForResize;
	window.createMockContext = createMockContext;

	// some style initialization to limit differences between browsers across different platforms.
	utils.injectCSS(
		'.chartjs-wrapper, .chartjs-wrapper canvas {' +
			'border: 0;' +
			'margin: 0;' +
			'padding: 0;' +
		'}' +
		'.chartjs-wrapper {' +
			'position: absolute' +
		'}');

	jasmine.fixture = fixture;
	jasmine.triggerMouseEvent = utils.triggerMouseEvent;

	beforeEach(function() {
		jasmine.addMatchers(matchers);
	});

	afterEach(function() {
		// Auto releasing acquired charts
		Object.keys(charts).forEach(function(id) {
			var chart = charts[id];
			if (!(chart.$test || {}).persistent) {
				releaseChart(chart);
			}
		});
	});
}());
