text: $(window).on('load', function() {
  
  //Initialize skrollr and save the instance.
  var s = skrollr.init({
  	edgeStrategy: 'set',
  	constants: {
  		myconst: 300,
  		my500: function() {
  			return 500;
  		}
  	},
  	easing: {
  		half1: function() {
  			return 0.5
  		}
  	}
  });
  
  //Counts how many assertions will be needed for the tests.
  var countAssertions = function(tests) {
  	var counter = 0;
  
  	for(var i = 0; i < tests.length; i++) {
  		var curTest = tests[i];
  
  		if(curTest.styles) {
  			$.each(curTest.styles, function() {
  				counter++;
  			});
  		}
  
  		if(curTest.attributes) {
  			$.each(curTest.attributes, function() {
  				counter++;
  			});
  		}
  
  		counter += !!curTest.selector;
  	}
  
  	return counter;
  };
  
  //A meta-test which runs common tests
  //which need synchronization of scrolling and rendering.
  var scrollTests = function(offset, tests) {
  	module('at scroll position ' + offset);
  
  	asyncTest('rendering', function() {
  		//We can't run them in parallel,
  		//because they would interfere with each others scroll top offset.
  		stop();
  
  		expect(countAssertions(tests));
  
  		//Scroll to offset, which will cause rendering (sooner or later)
  		s.setScrollTop(offset, true);
  
  		s.on('render', function(info) {
  			//Prevent another render event. Only need one for test.
  			s.off('render');
  
  			for(var i = 0; i < tests.length; i++) {
  				var curTest = tests[i];
  
  				if(curTest.styles) {
  					$.each(curTest.styles, function(k) {
  						QUnit.numericCSSPropertyEquals(curTest.element.css(k), curTest.styles[k], curTest.message || 'element\'s (#' + curTest.element[0].id + ') "' + k + '" CSS property is correct');
  					});
  				}
  
  				if(curTest.attributes) {
  					$.each(curTest.attributes, function(k, value) {
  						console.log(curTest.element.prop(k));
  						QUnit.numericCSSPropertyEquals(curTest.element.attr(k), curTest.attributes[k], curTest.message || 'element\'s (#' + curTest.element[0].id + ') "' + k + '" attribute is correct');
  					});
  				}
  
  				if(curTest.selector) {
  					ok(curTest.element.is(curTest.selector), 'element matches "' + curTest.selector + '"');
  				}
  			}
  
  			start(2);
  		});
  	});
  };
  
  //
  // Now the actual tests.
  //
  
  //Add one element dynamically
  var newElement = $('<div id="dynamic" data-0="bottom:0px;" data-250="bottom:100px;">TEST</div>').appendTo('body');
  s.refresh(newElement[0]);
  
  module('basic stuff');
  
  test('CSS classes present', function() {
  	strictEqual($('.skrollable').length, 23, 'All elements have the .skrollable class');
  
  	ok($('html').is('.skrollr'), 'HTML element has skrollr class');
  	ok($('html').is(':not(.no-skrollr)'), 'HTML element does not have no-skrollr class');
  });
  
  scrollTests(500, [
  	{
  		message: 'colons inside urls are preserved (#73)',
  		element: $('#colon-url'),
  		styles: {
  			backgroundImage: 'url(https://secure.travis-ci.org/Prinzhorn/skrollr.png)'
  		}
  	},
  	{
  		message: 'a single period is no number (#74)',
  		element: $('#period-number'),
  		styles: {
  			backgroundImage: 'url(https://secure.travis-ci.org/Prinzhorn/skrollr.png?1337)'
  		}
  	},
  	{
  		element: $('#simple-numeric'),
  		styles: {
  			left: '100px',
  			top: '50px'
  		}
  	},
  	{
  		element: $('#easing'),
  		styles: {
  			left: '25px'
  		}
  	},
  	{
  		element: $('#compound-numeric'),
  		styles: {
  			marginTop: '30px',
  			marginRight: '20px',
  			marginBottom: '10px',
  			marginLeft: '0px'
  		}
  	},
  	{
  		element: $('#rgb-color'),
  		styles: {
  			color: 'rgb(50, 100, 150)'
  		}
  	},
  	{
  		element: $('#rgba-color'),
  		styles: {
  			color: 'rgba(50, 100, 150, 0.5)'
  		}
  	},
  	{
  		element: $('#hsl-color'),
  		styles: {
  			color: 'rgb(191, 63, 63)'
  		}
  	},
  	{
  		element: $('#no-interpolation'),
  		styles: {
  			right: '100px'
  		}
  	},
  	{
  		element: $('#anchor-2'),
  		styles: {
  			right: '200px'
  		}
  	},
  	{
  		element: $('#foreign-anchor'),
  		styles: {
  			paddingTop: '100px',
  			paddingRight: '100px',
  			paddingBottom: '100px',
  			paddingLeft: '100px'
  		}
  	},
  	{
  		element: $('#float'),
  		styles: {
  			float: 'left'
  		}
  	},
  	{
  		message: 'z-index "auto" is no converted to a number (#351)',
  		element: $('#auto-z-index'),
  		styles: {
  			zIndex: 'auto'
  		}
  	},
  	{
  		message: 'attribute interpolation',
  		element: $('#attr'),
  		attributes: {
  			title: '0'
  		}
  	}
  ]);
  
  scrollTests(0, [
  	{
  		element: $('#simple-numeric'),
  		styles: {
  			left: '-100px',
  			top: '0px'
  		}
  	},
  	{
  		element: $('#easing'),
  		styles: {
  			left: '25px'
  		}
  	},
  	{
  		element: $('#compound-numeric'),
  		styles: {
  			marginTop: '0px',
  			marginRight: '10px',
  			marginBottom: '20px',
  			marginLeft: '30px'
  		}
  	},
  	{
  		element: $('#rgb-color'),
  		styles: {
  			color: 'rgb(0, 0, 0)'
  		}
  	},
  	{
  		element: $('#rgba-color'),
  		styles: {
  			color: 'rgba(0, 0, 0, 0.2)'
  		}
  	},
  	{
  		element: $('#hsl-color'),
  		styles: {
  			color: 'rgb(0, 0, 0)'
  		}
  	},
  	{
  		element: $('#no-interpolation'),
  		styles: {
  			right: '0px'
  		}
  	},
  	{
  		element: $('#end'),
  		styles: {
  			fontSize: '10px'
  		}
  	},
  	{
  		element: newElement,
  		styles: {
  			bottom: '0px'
  		}
  	},
  	{
  		element: $('#float'),
  		styles: {
  			float: 'none'
  		}
  	},
  	{
  		message: 'z-index "auto" is no converted to a number (#351)',
  		element: $('#auto-z-index'),
  		styles: {
  			zIndex: '1'
  		}
  	},
  	{
  		message: 'attribute interpolation',
  		element: $('#attr'),
  		attributes: {
  			title: '500',
  			'data-test': 'skrollr'
  		}
  	}
  ]);
  
  scrollTests(250, [
  	{
  		element: $('#simple-numeric'),
  		styles: {
  			left: '0px',
  			top: '25px'
  		}
  	},
  	{
  		element: $('#easing'),
  		styles: {
  			left: '25px'
  		}
  	},
  	{
  		element: $('#compound-numeric'),
  		styles: {
  			marginTop: '15px',
  			marginRight: '15px',
  			marginBottom: '15px',
  			marginLeft: '15px'
  		}
  	},
  	{
  		element: $('#rgb-color'),
  		styles: {
  			color: 'rgb(25, 50, 75)'
  		}
  	},
  	{
  		element: $('#rgba-color'),
  		styles: {
  			color: 'rgba(25, 50, 75, 0.35)'
  		}
  	},
  	{
  		element: $('#hsl-color'),
  		styles: {
  			color: 'rgb(79, 47, 47)'
  		}
  	},
  	{
  		element: $('#no-interpolation'),
  		styles: {
  			right: '0px'
  		}
  	},
  	{
  		element: $('#anchor-2'),
  		styles: {
  			right: '100px'
  		}
  	},
  	{
  		element: newElement,
  		styles: {
  			bottom: '100px'
  		}
  	},
  	{
  		element: $('#foreign-anchor'),
  		styles: {
  			paddingTop: '150px',
  			paddingRight: '150px',
  			paddingBottom: '150px',
  			paddingLeft: '150px'
  		}
  	},
  	{
  		element: $('#float'),
  		styles: {
  			float: 'none'
  		}
  	},
  	{
  		message: 'attribute interpolation',
  		element: $('#attr'),
  		attributes: {
  			title: '250',
  			'data-test': 'skrollr'
  		}
  	}
  ]);
  
  //bottom-top + 50%
  scrollTests(150, [
  	{
  		element: $('#relative-percentage-offset'),
  		styles: {
  			left: '250px'
  		}
  	}
  ]);
  
  //200%
  scrollTests(600, [
  	{
  		element: $('#percentage-offset'),
  		styles: {
  			left: '500px'
  		}
  	},
  	{
  		message: 'attribute interpolation',
  		element: $('#attr'),
  		attributes: {
  			'data-test': 'skrollr-test'
  		}
  	}
  ]);
  
  //100%
  scrollTests(300, [
  	{
  		element: $('#percentage-offset'),
  		styles: {
  			left: '250px'
  		}
  	}
  ]);
  
  //We scroll to a ridiculous large position so that the browser cuts it at the actual position.
  var maxScrollHeight = s.setScrollTop(1e5) && s.getScrollTop();
  
  scrollTests(maxScrollHeight, [
  	{
  		element: $('#anchor-1'),
  		styles: {
  			right: '100px'
  		}
  	},
  	{
  		element: $('#easing'),
  		styles: {
  			left: '50px'
  		}
  	},
  	{
  		element: $('#easing_with_easing_strategy'),
  		styles: {
  			left: '25px'
  		}
  	},
  	{
  		element: $('#reset-strategy'),
  		styles: {
  			left: '1337px'
  		}
  	}
  ]);
  
  
  });//DOM ready
  