it("should handle bound function expressions", function(done) {
	require.ensure(
		[],
		function(require) {
			expect(this).toEqual({ test: true });
			require("./empty?test");
			expect(process.nextTick).toBeTypeOf("function"); // check if injection still works
			require.ensure(
				[],
				function(require) {
					expect(this).toEqual({ test: true });
					done();
				}.bind(this)
			);
		}.bind({ test: true })
	);
});

it("should handle require.ensure without function expression", function(done) {
	function f() {
		done();
	}
	require.ensure([], f);
});

it("should parse expression in require.ensure, which isn't a function expression", function(done) {
	require.ensure(
		[],
		(function() {
			expect(require("./empty?require.ensure:test")).toEqual({});
			return function f() {
				done();
			};
		})()
	);
});

it("should accept an already included module", function(done) {
	if (Math.random() < 0) require("./require.include");
	var value = null;
	require.ensure([], function(require) {
		value = require("./require.include");
	});
	setImmediate(function() {
		expect(value).toBe("require.include");
		expect(value).toBe("require.include");
		done();
	});
});
